Представление и обработка пропущенных значений в Джулии

анализ данных Julia сбор данных

Языку Julia еще нужно сделать много вещей, чтобы получить долю в поле анализа данных, одна из которых — справиться с пропущенными значениями. При анализе данных очень часто в выборках наблюдений отсутствуют значения.Если инструменту анализа не хватает механизма преодоления, инструмент спотыкается.

Обработка пропущенных значений в языке R

Язык R появился в 1990-х годах и имеет долгую историю развития, поэтому механизм обработки пропущенных значений относительно завершен.

> a <- c(1,NA,2,3,NA)
> a
[1]  1 NA  2  3 NA
> a+1
[1]  2 NA  3  4 NA
> mean(a)
[1] NA
> mean(a,na.rm = T)
[1] 2

Распространенной структурой данных является dataframe, так как же быть с пропущенными значениями в этом типе данных?

Обработка R по-прежнему очень удобна, конкретный код выглядит следующим образом.

> df <- data.frame(a,b=LETTERS[1:5])
> df
   a b
1  1 A
2 NA B
3  2 C
4  3 D
5 NA E
> mean(df[,"a"])
[1] NA
> mean(df[,"a"],na.rm = T)
[1] 2

родная Юлия

Родное представление Джулии и обработка пропущенных значений несовершенны. Конкретные примеры следующие.

julia> a=[1 Nullable() 2 3 Nullable()]
1×5 Array{Nullable{Int64},2}:
 1  #NULL  2  3  #NULL

julia> a+1
WARNING: a::AbstractArray + b::Number is deprecated, use broadcast(+, a, b) instead.

julia> broadcast(+, a, 1)
ERROR: MethodError: no method matching +(::Nullable{Int64}, ::Int64)
Closest candidates are:
  +(::Any, ::Any, ::Any, ::Any...) at operators.jl:468
  +(::Complex{Bool}, ::Real) at complex.jl:275
  +(::Char, ::Integer) at char.jl:40
  ...

Обработка пустых пакетов

Теперь сторонний пакетNulls.jlдля представления и обработки пропущенных значений.

julia> using Nulls
julia> a=[1 null 2 3 null]
1×5 Array{Union{Nulls.Null, Int64},2}:
 1  null  2  3  null

julia> a+1
1×5 Array{Any,2}:
 2  null  3  4  null

julia> mean(a)
null

Таким образом, Джулия делает большой шаг вперед в представлении и обработке пропущенных значений. Однако в языке R NULL означает пустое значение, а NA означает отсутствующее значение.

Приведенное выше усредняет вектор с пропущенными значениями, и результат пуст. В настоящее время функция среднего значения не работает с типом Null.

help?> mean
search: mean mean! median median! RemoteChannel SegmentationFault macroexpand @macroexpand @macroexpand1 module_parent

  mean(f::Function, v)

  Apply the function f to each element of v and take the mean.

  julia> mean(√, [1, 2, 3])
  1.3820881233139908

  julia> mean([√1, √2, √3])
  1.3820881233139908

  mean(v[, region])

  Compute the mean of whole array v, or optionally along the dimensions in region.

  | Note
  |
  |  Julia does not ignore NaN values in the computation. For applications requiring the handling of missing
  |  data, the DataArrays.jl package is recommended.

Так что просто сделайте следующее. Функция Nulls.skip предоставляется пакетом Nulls.

julia>  mean(Nulls.skip(a))
2.0

последнее сейчасDataFramesТакже обратились к методам пакета Nulls для представления и обработки отсутствующих значений.

julia> using DataFrames
julia> df = DataFrame(A = [1, null, 2, 3, null], B = ["a", "b", "c", "d", "e"])
5×2 DataFrames.DataFrame
│ Row │ A    │ B │
├─────┼──────┼───┤
│ 1   │ 1    │ a │
│ 2   │ null │ b │
│ 3   │ 2    │ c │
│ 4   │ 3    │ d │
│ 5   │ null │ e │

julia> df[:A]
5-element Array{Union{Nulls.Null, Int64},1}:
 1
  null
 2
 3
  null

julia> mean(df[:A])
null

julia> mean(Nulls.skip(df[:A]))
2.0

Мое личное предположение заключается в том, что после того, как собственные или сторонние методы представления отсутствующих значений станут зрелыми и стабильными, некоторые функции, связанные с работой с объектами, которые могут иметь отсутствующие значения, должны добавить методы (см. главу «Методы» руководства Julia ), чтобы обрабатывать их более кратким образом. В настоящее время принятие метода Nulls.skip не должно быть долгосрочным решением.

дальнейшее чтение

  1. Replace Nullable{T} with Union{Some{T}, Void}
  2. The fate of Nullable

Информация о версии

R version 3.4.2 (2017-09-28) -- "Short Summer"

Julia
Version 0.7.0-DEV.2098 (2017-10-10 11:37 UTC)
Commit 546a801260* (16 days old master)
- DataFrames                    0.10.1+            master
- Nulls                         0.1.2+             master

Среди них сторонний пакет Джулии, предназначенный для прямого клонирования последнего кода вручную.

=========

Пополнить:

Начиная с версии 0.7.0-DEV.3095 (19 декабря 2017 г., 01:41 UTC) отсутствующий тип стал встроенным в Julia. Оригинальный пакет Nulls также был переименован в Missings.

Таким образом, Julia больше подходит для сценариев статистики и анализа данных.

# Version 0.7.0-DEV.3095 (2017-12-19 01:41 UTC)
julia> missing
missing

julia> missing + 1
missing

julia> true | missing
true

julia> false | missing
missing

julia> false & missing
false

julia> true & missing
missing

julia> sum([1,2,3,missing])
missing

julia> sum(skipmissing([1,2,3,missing]))
6