Engee 文档
Notebook

Julia中的缺失数据

导言

处理缺失数据是数据预处理中常见的任务。 虽然有时缺失值表示数据中的重大事件,但它们通常表示不可靠或不可用的数据点。 在任何情况下,Julia具有许多用于处理缺失数据的功能。

创建缺失数据

Julia中的缺失数据可以以多种形式呈现。 例如,值 NaN (NaN64)([不是数字](https://engee.com/helpcenter/stable/ru/julia/base/numbers.html#Base ...南))

In [ ]:
x_64 = [NaN, 8, 15, 16, 23, 42]
println("Type of $(x_64[1]): ", typeof(x_64[1]))

x_64 = [NaN64, 8, 15, 16, 23, 42]
print("Type of $(x_64[1]): ", typeof(x_64[1]))
Type of NaN: Float64
Type of NaN: Float64

意义 NaN 如果需要,可以将其设置为具有较低位深度的浮点数。:

In [ ]:
x_32 = [NaN32, 8, 15, 16, 23, 42]
Out[0]:
6-element Vector{Float32}:
 NaN
   8.0
  15.0
  16.0
  23.0
  42.0
In [ ]:
x_16 = [NaN16, 8, 15, 16, 23, 42]
Out[0]:
6-element Vector{Float16}:
 NaN
   8.0
  15.0
  16.0
  23.0
  42.0

谈到这种缺失数据表示形式的本质,我们可以得出结论,这些是浮点数据类型的特定值,可以分布在计算中。 这些值通常是未定义操作的结果。:

In [ ]:
x_nan = Inf*0
Out[0]:
NaN

通常,在Julia中,值是 NaN 它们用于在计算中传播计算数值的不确定性。 要专门处理[缺失数据](https://engee.com/helpcenter/stable/ru/julia/manual/missing.html )使用特殊对象会更正确 missing,这也分布在计算中。 这种表示形式是该类型的唯一实例 Missing:

In [ ]:
typeof(missing)
Out[0]:
Missing

这特别意味着,包含 missing 在其他值中,它们在类型上是异质的:

In [ ]:
x_missing = [missing, 8, 15, 16, 23, 42]
Out[0]:
6-element Vector{Union{Missing, Int64}}:
   missing
  8
 15
 16
 23
 42

与之合作 missing 图书馆**[错过。jl]可能是有用的(https://engee.com/helpcenter/stable/ru/julia/DataFrames/man/missing.html )**。 因此,您可以使用它来创建具有此类对象的数组:

In [ ]:
import Pkg; Pkg.add("Missings") # загрузка библиотеки
In [ ]:
using Missings # подключение библиотеки

# создание массивов с отсутствующими значениями:
# массивы типа Missing
@show missings(1)
@show missings(3)
@show missings(3,1)

# массив объединения типов
@show missings(Int,3,3); 
missings(1) = [missing]
missings(3) = [missing, missing, missing]
missings(3, 1) = [missing; missing; missing;;]
missings(Int, 3, 3) = Union{Missing, Int64}[missing missing missing; missing missing missing; missing missing missing]

缺失数据的系统化

在对缺少数据的数组进行排序时,请记住对象 missing 它被认为比与之比较的任何物体都大。:

In [ ]:
isless(Inf, missing)
Out[0]:
true

因此,在排序时,缺失的值将被自动分离,并将在升序排序的末尾。 如果您需要更改排序期间包含缺失值的顺序,则只需应用该属性 lt = missingsmallest:

In [ ]:
sort(x_missing, rev=true, lt = missingsmallest)
Out[0]:
6-element Vector{Union{Missing, Int64}}:
 42
 23
 16
 15
  8
   missing

缺失数据的规范化

要考虑使用表格数据中的间隙的示例,我们将连接库[DataFrames.jl](https://engee.com/helpcenter/stable/ru/julia/DataFrames/index.html )和统计。jl

In [ ]:
Pkg.add(["DataFrames", "Statistics"])
using DataFrames, Statistics

创建用于处理的测试数据表:

In [ ]:
df_missing = DataFrame(
    имя     = ["NULL", "Коля", "Юра", "Миша"],
    возраст = [16, NaN, missing, 15],
    рост    = [171, 162, 999, 165],
)
Out[0]:
4×3 DataFrame
Rowимявозрастрост
StringFloat64?Int64
1NULL16.0171
2КоляNaN162
3Юраmissing999
4Миша15.0165

当使用不同格式的数据合并到一个表中时,可能会出现缺失数据具有不同值的情况。 为了标准化缺失数据的值,使用函数[declaremissings()](https://engee.com/helpcenter/stable/ru/julia/Impute/api/declaremissings.html )从库[Impact.jl](https://engee.com/helpcenter/stable/ru/julia/Impute.html ):

In [ ]:
Pkg.add("Impute")
In [ ]:
using Impute

df_missing = Impute.declaremissings(df_missing; values=(NaN, 999, "NULL"))
Out[0]:
4×3 DataFrame
Rowимявозрастрост
String?Float64?Int64?
1missing16.0171
2Коляmissing162
3Юраmissingmissing
4Миша15.0165

现在,正如我们所看到的,丢失的数据减少到一种类型-a对象。 missing.

搜索缺失数据

来判断该值是否为 NaN,它是方便使用的功能[isnan()](https://engee.com/helpcenter/stable/ru/julia/base/numbers.html#Base.isnan)

In [ ]:
isnan.(x_64)
Out[0]:
6-element BitVector:
 1
 0
 0
 0
 0
 0

还有一个[类似的功能](https://engee.com/helpcenter/stable/ru/julia/base/base.html#Base.ismissing )来识别对象 missing.

In [ ]:
ismissing.(x_missing)
Out[0]:
6-element BitVector:
 1
 0
 0
 0
 0
 0

让我们确定表中缺失值的位置:

In [ ]:
df_mask = ismissing.(df_missing)
Out[0]:
4×3 DataFrame
Rowимявозрастрост
BoolBoolBool
1truefalsefalse
2falsetruefalse
3falsetruetrue
4falsefalsefalse

经常对象 missing 它们在处理数据时可能会造成问题。 为此,您可以跳过、排除或替换它们。

跳过丢失的数据

In [ ]:
filter(!isnan, x_64)
Out[0]:
5-element Vector{Float64}:
  8.0
 15.0
 16.0
 23.0
 42.0

在用对象过滤数组的情况下 missing 结果数组的类型不会更改。 要将数组类型转换为过滤值的类型,可以使用函数[disallowmissing()](https://engee.com/helpcenter/stable/ru/julia/DataFrames/lib/functions.html#Missings.disallowmissing )图书馆遗漏。jl

In [ ]:
@show x = filter(!ismissing, x_missing)
disallowmissing(x)
x = filter(!ismissing, x_missing) = Union{Missing, Int64}[8, 15, 16, 23, 42]
Out[0]:
5-element Vector{Int64}:
  8
 15
 16
 23
 42

下面的代码行显示了如何过滤 missing 从使用函数的表格数据 filter().

In [ ]:
filter(:имя => !ismissing, df_missing)
Out[0]:
3×3 DataFrame
Rowимявозрастрост
String?Float64?Int64?
1Коляmissing162
2Юраmissingmissing
3Миша15.0165
In [ ]:
collect(skipmissing(x_missing))
Out[0]:
5-element Vector{Int64}:
  8
 15
 16
 23
 42

跳绳用 missing 在表格数据库DataFrames中。jl有一个更方便的功能-[dropmissing()](https://engee.com/helpcenter/stable/ru/julia/DataFrames/lib/functions.html#DataFrames.dropmissing):

In [ ]:
dropmissing(df_missing)
Out[0]:
1×3 DataFrame
Rowимявозрастрост
StringFloat64Int64
1Миша15.0165

为了用它来过滤掉行 missing 包含在特定列中,此函数的第二个参数必须传递此列的名称。:

In [ ]:
dropmissing(df_missing, :имя)
Out[0]:
3×3 DataFrame
Rowимявозрастрост
StringFloat64?Int64?
1Коляmissing162
2Юраmissingmissing
3Миша15.0165

在这种情况下,功能 dropmissing() 返回一个新表。 如果您不需要为正在解决的任务保存原始表,则可以使用dropmissing!().

替换丢失的数据

如果需要替换数组中丢失的数据,使用该函数很方便 Missings.replace():

In [ ]:
рост = collect(Missings.replace(df_missing.рост, 170))
Out[0]:
4-element Vector{Int64}:
 171
 162
 170
 165

要替换表中缺失的数据,可以使用以下函数 replace!():

In [ ]:
replace!(df_missing.возраст, missing => 15)
Out[0]:
4-element Vector{Union{Missing, Float64}}:
 16.0
 15.0
 15.0
 15.0

需要注意的是,结果列的数据格式不会改变。 另一种方法是使用函数 coalesce():

In [ ]:
df_missing.имя = coalesce.(df_missing.имя, "Ваня")
df_missing.рост = coalesce.(df_missing.рост, mean(skipmissing(df_missing.рост)))
df_missing
Out[0]:
4×3 DataFrame
Rowимявозрастрост
StringFloat64?Real
1Ваня16.0171
2Коля15.0162
3Юра15.0166.0
4Миша15.0165

结论

在这个例子中,我们讨论了在Julia中创建、组织、规范化、搜索、跳过和替换缺失数据的方法。