Julia 中的缺失数据¶
简介¶
处理缺失数据是数据预处理中的一项常见任务。虽然有时缺失值表示数据中发生了有意义的事件,但它们往往代表了不可靠或不可用的数据点。在任何情况下,朱莉娅都有许多处理缺失数据的选项。
创建缺失数据¶
在朱莉娅中,缺失数据可以用多种形式表示。例如,值NaN
(NaN64
) ( 非数字)
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]))
如有必要,可将NaN
指定为较小的浮点数:
x_32 = [NaN32, 8, 15, 16, 23, 42]
x_16 = [NaN16, 8, 15, 16, 23, 42]
谈到这种缺失数据表示形式的本质,我们可以得出这样的结论:这是浮点数据类型的具体值,在计算中具有传播能力。这些值通常是由于未定义的操作而出现的:
x_nan = Inf*0
通常,在 Julia 中,数值NaN
用于在计算中传播数值计算的不确定性。要具体处理缺失数据,更正确的做法是使用一个特殊对象missing
,它也在计算中传播。这种表示形式是Missing
类型的唯一实例:
typeof(missing)
这尤其意味着,包含missing
和其他值的数组在类型上是异构的:
x_missing = [missing, 8, 15, 16, 23, 42]
要处理missing
,Missings.jl 库可能会有用。因此,使用它可以创建包含此类对象的数组:
import Pkg; Pkg.add("Missings") # загрузка библиотеки
using Missings # подключение библиотеки
# создание массивов с отсутствующими значениями:
# массивы типа Missing
@show missings(1)
@show missings(3)
@show missings(3,1)
# массив объединения типов
@show missings(Int,3,3);
缺失数据的系统化¶
在对有缺失数据的数组进行排序时,请记住missing
的对象要比与之比较的任何对象都大:
isless(Inf, missing)
因此,缺失值将在排序时自动分离,并位于升序排序的末尾。如果您想在排序时更改缺失值的包含顺序,只需应用属性lt = missingsmallest
即可:
sort(x_missing, rev=true, lt = missingsmallest)
缺失数据归一化¶
让我们连接DataFrames.jl和Statistics.jl库,查看处理表格数据中缺失数据的示例。
Pkg.add(["DataFrames", "Statistics"])
using DataFrames, Statistics
让我们创建一个测试数据表进行处理:
df_missing = DataFrame(
имя = ["NULL", "Коля", "Юра", "Миша"],
возраст = [16, NaN, missing, 15],
рост = [171, 162, 999, 165],
)
在处理合并到一个表中的不同格式的数据时,可能会出现缺失数据取值不同的情况。要使缺失数据的值标准化,可以使用Impute.jl库中的declaremissings()
函数:
Pkg.add("Impute")
using Impute
df_missing = Impute.declaremissings(df_missing; values=(NaN, 999, "NULL"))
现在,我们可以看到,缺失数据被简化为一种形式--对象missing
。
搜索缺失数据¶
要确定数值NaN
,可以方便地使用函数 isnan()
isnan.(x_64)
还有一个类似函数 可以确定对象missing
。
ismissing.(x_missing)
让我们来确定表格中缺失值的位置:
df_mask = ismissing.(df_missing)
通常情况下,missing
会给数据处理带来问题。为此,可以省略、排除或替换这些对象。
跳过缺失数据¶
要过滤NaN
值的向量,只需使用 Julia 基础库中的 filter()
函数。
filter(!isnan, x_64)
如果使用对象missing
过滤数组,结果数组的类型不会改变。您可以使用 Missings.jl 库的 disallowmissing()
函数将数组类型转换为过滤值的类型。
@show x = filter(!ismissing, x_missing)
disallowmissing(x)
以下代码显示了如何使用函数filter()
从表格数据中筛选missing
。
filter(:имя => !ismissing, df_missing)
应用基础库中的 skipmissing()
函数也能得到同样的结果:
collect(skipmissing(x_missing))
要跳过表格数据中的missing
,DataFrames.jl 库有一个更方便的函数 - dropmissing()
:
dropmissing(df_missing)
为了过滤掉missing
包含在特定列中的行,该函数的第二个参数是该列的名称:
dropmissing(df_missing, :имя)
在这种情况下,函数dropmissing()
将返回一个新表。如果不需要为要解决的任务保存原始表,可以使用 dropmissing!()
删除数据缺失的行。
替换缺失数据¶
如果需要替换数组中的缺失数据,使用函数Missings.replace()
会很方便:
рост = collect(Missings.replace(df_missing.рост, 170))
要替换表格中的缺失数据,可以使用函数replace!()
:
replace!(df_missing.возраст, missing => 15)
请注意,结果列的数据格式不会改变。另一种方法是使用函数coalesce()
:
df_missing.имя = coalesce.(df_missing.имя, "Ваня")
df_missing.рост = coalesce.(df_missing.рост, mean(skipmissing(df_missing.рост)))
df_missing
结论¶
本案例研究探讨了如何在 Julia 中创建、组织、规范化、搜索、查找、跳过和替换缺失数据。