Missing Values
Julia, istatistiksel anlamda eksik değerleri temsil etme desteği sağlar. Bu, bir gözlemde bir değişken için hiçbir değerin mevcut olmadığı, ancak teorik olarak geçerli bir değerin var olduğu durumlar içindir. Eksik değerler, missing nesnesi aracılığıyla temsil edilir; bu, Missing türünün tekil örneğidir. missing, NULL in SQL ve NA in R ile eşdeğerdir ve çoğu durumda onlarla aynı şekilde davranır.
Propagation of Missing Values
eksik değerler otomatik olarak standart matematiksel operatörler ve fonksiyonlara geçirildiğinde yayılır. Bu fonksiyonlar için, operandlardan birinin değeri hakkında belirsizlik, sonucun belirsizliğini doğurur. Pratikte, bir eksik değer içeren bir matematik işlemi genellikle eksik döner:
julia> missing + 1
missing
julia> "a" * missing
missing
julia> abs(missing)
missingmissing normal bir Julia nesnesi olduğu için, bu yayılma kuralı yalnızca bu davranışı uygulamayı seçen fonksiyonlar için geçerlidir. Bu, aşağıdaki şekilde gerçekleştirilebilir:
Missingtüründeki argümanlar için tanımlanmış özel bir yöntem ekleniyor,- bu tür argümanları kabul etmek ve bunları (standart matematik operatörleri gibi) yayan fonksiyonlara iletmek.
Paketler, yeni fonksiyonlar tanımlarken eksik değerlerin yayılmasının mantıklı olup olmadığını dikkate almalı ve bu durum söz konusuysa yöntemleri uygun şekilde tanımlamalıdır. Bir missing değerini, Missing türünde argümanları kabul eden bir yöntemi olmayan bir fonksiyona geçirmek, diğer türler için olduğu gibi MethodError hatasını fırlatır.
missing değerlerini yaymayan fonksiyonlar, Missings.jl paketinde sağlanan passmissing fonksiyonu ile sarılarak bu şekilde çalıştırılabilir. Örneğin, f(x) ifadesi passmissing(f)(x) haline gelir.
Equality and Comparison Operators
Standart eşitlik ve karşılaştırma operatörleri yukarıda sunulan yayılma kuralını takip eder: eğer operandlardan herhangi biri eksik ise, sonuç eksik olur. İşte birkaç örnek:
julia> missing == 1
missing
julia> missing == missing
missing
julia> missing < 1
missing
julia> 2 >= missing
missingÖzellikle, missing == missing ifadesinin missing döndürdüğünü unutmayın, bu nedenle == operatörü bir değerin eksik olup olmadığını test etmek için kullanılamaz. x'in missing olup olmadığını test etmek için ismissing(x) kullanın.
Özel karşılaştırma operatörleri isequal ve === yayılma kuralının istisnalarıdır. Her zaman bir Bool değeri döndüreceklerdir, missing değerlerinin varlığında bile, missing değerini missing ile eşit ve diğer herhangi bir değerden farklı olarak kabul ederek. Bu nedenle, bir değerin missing olup olmadığını test etmek için kullanılabilirler:
julia> missing === 1
false
julia> isequal(missing, 1)
false
julia> missing === missing
true
julia> isequal(missing, missing)
trueisless operatörü başka bir istisnadır: missing, diğer tüm değerlerden daha büyük olarak kabul edilir. Bu operatör, sort! tarafından kullanılır; bu nedenle missing değerleri diğer tüm değerlerin ardından yer alır:
julia> isless(1, missing)
true
julia> isless(missing, Inf)
false
julia> isless(missing, missing)
falseLogical operators
Mantıksal (veya boolean) operatörler |, & ve xor başka bir özel durumdur çünkü yalnızca mantıksal olarak gerekli olduğunda eksik değerleri yayarlar. Bu operatörler için, sonucun belirsiz olup olmaması, belirli bir işleme bağlıdır. Bu, three-valued logic tarafından uygulanan iyi bilinen kuralları takip eder; örneğin SQL'deki NULL ve R'deki NA. Bu soyut tanım, somut örneklerle en iyi şekilde açıklanan nispeten doğal bir davranışa karşılık gelir.
Bu prensibi mantıksal "veya" operatörü | ile gösterelim. Boolean mantığı kurallarına göre, eğer operandlardan biri doğru ise, diğer operandın değeri sonuca etki etmez, sonuç her zaman doğru olacaktır:
julia> true | true
true
julia> true | false
true
julia> false | true
trueBu gözlemden yola çıkarak, eğer operandlardan biri doğru ve diğeri eksik ise, bir operandın gerçek değeri hakkında belirsizlik olmasına rağmen sonucun doğru olduğunu biliyoruz. Eğer ikinci operandın gerçek değerini gözlemleyebilseydik, bu yalnızca doğru veya yanlış olabilir ve her iki durumda da sonuç doğru olurdu. Bu nedenle, bu özel durumda, eksiklik yayılmaz:
julia> true | missing
true
julia> missing | true
trueTam tersine, eğer operandlardan biri false ise, sonuç diğer operandın değerine bağlı olarak ya true ya da false olabilir. Bu nedenle, eğer o operand missing ise, sonuç da missing olmalıdır:
julia> false | true
true
julia> true | false
true
julia> false | false
false
julia> false | missing
missing
julia> missing | false
missingMantıksal "ve" operatörünün & davranışı, | operatörünün davranışına benzer; ancak, bir operand false olduğunda eksikliklerin yayılmadığı bir fark vardır. Örneğin, bu durum ilk operand için geçerli olduğunda:
julia> false & false
false
julia> false & true
false
julia> false & missing
falseDiğer yandan, eksiklik, operandlardan biri true olduğunda yayılır, örneğin ilki:
julia> true & true
true
julia> true & false
false
julia> true & missing
missingSonunda, "özel veya" mantıksal operatör xor her zaman eksik değerleri yayar, çünkü her iki operand da sonucun üzerinde her zaman etkiye sahiptir. Ayrıca, ! olumsuzlama operatörünün operandı eksik olduğunda eksik döndürdüğünü, diğer tekil operatörler gibi unutmayın.
Control Flow and Short-Circuiting Operators
Kontrol akış operatörleri if, while ve ternary operator x ? y : z eksik değerleri kabul etmez. Bunun nedeni, gözlemleyebilseydik gerçek değerin true veya false olup olmayacağı konusunda belirsizlik olmasıdır. Bu, programın nasıl davranması gerektiğini bilmediğimiz anlamına gelir. Bu durumda, bu bağlamda bir missing değeriyle karşılaşıldığında hemen bir TypeError fırlatılır:
julia> if missing
println("here")
end
ERROR: TypeError: non-boolean (Missing) used in boolean contextAynı nedenle, yukarıda sunulan mantıksal operatörlerin aksine, kısa devre boolean operatörleri && ve ||, operandın değeri bir sonraki operandın değerlendirilip değerlendirilmeyeceğini belirlediği durumlarda eksik değerlere izin vermez. Örneğin:
julia> missing || false
ERROR: TypeError: non-boolean (Missing) used in boolean context
julia> missing && false
ERROR: TypeError: non-boolean (Missing) used in boolean context
julia> true && missing && false
ERROR: TypeError: non-boolean (Missing) used in boolean contextBuna karşılık, eksik değerler olmadan sonucun belirlenebildiği durumlarda hata fırlatılmaz. Bu, kodun eksik operatörünü değerlendirmeden önce kısa devre yaptığı ve eksik operatörünün sonuncu olduğu durumlarda geçerlidir:
julia> true && missing
missing
julia> false && missing
falseArrays With Missing Values
Eksik değerler içeren diziler, diğer diziler gibi oluşturulabilir:
julia> [1, missing]
2-element Vector{Union{Missing, Int64}}:
1
missingBu örneğin gösterdiği gibi, bu tür dizilerin eleman tipi Union{Missing, T}'dir; burada T, eksik olmayan değerlerin tipidir. Bu, dizi girişlerinin ya T tipinde (burada Int64) ya da Missing tipinde olabileceğini yansıtır. Bu tür bir dizi, gerçek değerleri tutan bir Array{T} ile girişin tipini (yani, Missing mi yoksa T mi olduğunu) belirten bir Array{UInt8}'in birleşimi ile eşdeğer verimli bir bellek depolama kullanır.
Eksik değerleri içeren diziler standart sözdizimi ile oluşturulabilir. Eksik değerlerle doldurulmuş diziler oluşturmak için Array{Union{Missing, T}}(missing, dims) kullanın:
julia> Array{Union{Missing, String}}(missing, 2, 3)
2×3 Matrix{Union{Missing, String}}:
missing missing missing
missing missing missingundef veya benzer kullanmak şu anda missing ile doldurulmuş bir dizi verebilir, ancak bu tür bir diziyi elde etmenin doğru yolu değildir. Bunun yerine yukarıda gösterildiği gibi bir missing yapıcı kullanın.
Bir missing girişlerine izin veren bir dizi türü (örneğin, Vector{Union{Missing, T}}) missing girişleri içermiyorsa, missing girişlerine izin vermeyen bir dizi türüne (örneğin, Vector{T}) convert kullanılarak dönüştürülebilir. Dizi missing değerleri içeriyorsa, dönüştürme sırasında bir MethodError hatası fırlatılır:
julia> x = Union{Missing, String}["a", "b"]
2-element Vector{Union{Missing, String}}:
"a"
"b"
julia> convert(Array{String}, x)
2-element Vector{String}:
"a"
"b"
julia> y = Union{Missing, String}[missing, "b"]
2-element Vector{Union{Missing, String}}:
missing
"b"
julia> convert(Array{String}, y)
ERROR: MethodError: Cannot `convert` an object of type Missing to an object of type StringSkipping Missing Values
missing değerleri standart matematiksel operatörlerle yayıldığı için, eksik değerler içeren diziler üzerinde çağrıldığında azaltma fonksiyonları missing döner:
julia> sum([1, missing])
missingBu durumda, eksik değerleri atlamak için skipmissing fonksiyonunu kullanın:
julia> sum(skipmissing([1, missing]))
1Bu kullanım kolaylığı sağlayan fonksiyon, eksik değerleri verimli bir şekilde filtreleyen bir yineleyici döndürür. Bu nedenle, yineleyicileri destekleyen herhangi bir fonksiyonla kullanılabilir:
julia> x = skipmissing([3, missing, 2, 1])
skipmissing(Union{Missing, Int64}[3, missing, 2, 1])
julia> maximum(x)
3
julia> sum(x)
6
julia> mapreduce(sqrt, +, x)
4.146264369941973skipmissing ile bir dizi üzerinde çağrılarak oluşturulan nesneler, ana diziden alınan indeksler kullanılarak indekslenebilir. Eksik değerlere karşılık gelen indeksler bu nesneler için geçerli değildir ve bunları kullanmaya çalıştığınızda bir hata fırlatılır (aynı zamanda keys ve eachindex tarafından da atlanır):
julia> x[1]
3
julia> x[2]
ERROR: MissingException: the value at index (2,) is missing
[...]Bu, indeksler üzerinde çalışan işlevlerin skipmissing ile bir arada çalışmasına olanak tanır. Bu, özellikle arama ve bulma işlevleri için geçerlidir. Bu işlevler, skipmissing tarafından döndürülen nesne için geçerli olan indeksleri döndürür ve ayrıca eşleşen girişlerin ana dizideki indeksleridir:
julia> findall(==(1), x)
1-element Vector{Int64}:
4
julia> findfirst(!iszero, x)
1
julia> argmax(x)
1collect değerlerini kullanarak missing olmayan değerleri çıkarın ve bir diziye kaydedin:
julia> collect(x)
3-element Vector{Int64}:
3
2
1Logical Operations on Arrays
Yukarıda açıklanan üç değerli mantık, dizilere uygulanan mantıksal fonksiyonlar tarafından da kullanılmaktadır. Bu nedenle, == operatörünü kullanan dizi eşitlik testleri, missing girişinin gerçek değerini bilmeden belirlenemeyen bir sonuç olduğunda missing döndürür. Pratikte, bu, karşılaştırılan dizilerin tüm eksik olmayan değerleri eşitse, ancak bir veya her iki dizinin eksik değerler içermesi durumunda (muhtemelen farklı konumlarda) missing döndürüldüğü anlamına gelir:
julia> [1, missing] == [2, missing]
false
julia> [1, missing] == [1, missing]
missing
julia> [1, 2, missing] == [1, missing, 2]
missingTekil değerler için, isequal kullanarak missing değerlerini diğer missing değerlerle eşit, ancak eksik olmayan değerlerden farklı olarak ele alın.
julia> isequal([1, missing], [1, missing])
true
julia> isequal([1, 2, missing], [1, missing, 2])
falseFonksiyonlar any ve all aynı zamanda üç değerli mantık kurallarını takip eder. Bu nedenle, sonuç belirlenemediğinde missing döner:
julia> all([true, missing])
missing
julia> all([false, missing])
false
julia> any([true, missing])
true
julia> any([false, missing])
missing