Julia中的缺失数据
导言
处理缺失数据是数据预处理中常见的任务。 虽然有时缺失值表示数据中的重大事件,但它们通常表示不可靠或不可用的数据点。 在任何情况下,Julia具有许多用于处理缺失数据的功能。
创建缺失数据
Julia中的缺失数据可以以多种形式呈现。 例如,值 NaN (NaN64)([不是数字](https://engee.com/helpcenter/stable/ru/julia/base/numbers.html#Base ...南))
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 它们用于在计算中传播计算数值的不确定性。 要专门处理[缺失数据](https://engee.com/helpcenter/stable/ru/julia/manual/missing.html )使用特殊对象会更正确 missing,这也分布在计算中。 这种表示形式是该类型的唯一实例 Missing:
typeof(missing)
这特别意味着,包含 missing 在其他值中,它们在类型上是异质的:
x_missing = [missing, 8, 15, 16, 23, 42]
与之合作 missing 图书馆**[错过。jl]可能是有用的(https://engee.com/helpcenter/stable/ru/julia/DataFrames/man/missing.html )**。 因此,您可以使用它来创建具有此类对象的数组:
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](https://engee.com/helpcenter/stable/ru/julia/DataFrames/index.html )和统计。jl。
Pkg.add(["DataFrames", "Statistics"])
using DataFrames, Statistics
创建用于处理的测试数据表:
df_missing = DataFrame(
имя = ["NULL", "Коля", "Юра", "Миша"],
возраст = [16, NaN, missing, 15],
рост = [171, 162, 999, 165],
)
当使用不同格式的数据合并到一个表中时,可能会出现缺失数据具有不同值的情况。 为了标准化缺失数据的值,使用函数[declaremissings()](https://engee.com/helpcenter/stable/ru/julia/Impute/api/declaremissings.html )从库[Impact.jl](https://engee.com/helpcenter/stable/ru/julia/Impute.html ):
Pkg.add("Impute")
using Impute
df_missing = Impute.declaremissings(df_missing; values=(NaN, 999, "NULL"))
现在,正如我们所看到的,丢失的数据减少到一种类型-a对象。 missing.
搜索缺失数据
来判断该值是否为 NaN,它是方便使用的功能[isnan()](https://engee.com/helpcenter/stable/ru/julia/base/numbers.html#Base.isnan)
isnan.(x_64)
还有一个[类似的功能](https://engee.com/helpcenter/stable/ru/julia/base/base.html#Base.ismissing )来识别对象 missing.
ismissing.(x_missing)
让我们确定表中缺失值的位置:
df_mask = ismissing.(df_missing)
经常对象 missing 它们在处理数据时可能会造成问题。 为此,您可以跳过、排除或替换它们。
跳过丢失的数据
从值中筛选向量 NaN 用函数就足够了[filter()](https://engee.com/helpcenter/stable/ru/julia/DataFrames/lib/functions.html#Base.filter)的Julia基础库。
filter(!isnan, x_64)
在用对象过滤数组的情况下 missing 结果数组的类型不会更改。 要将数组类型转换为过滤值的类型,可以使用函数[disallowmissing()](https://engee.com/helpcenter/stable/ru/julia/DataFrames/lib/functions.html#Missings.disallowmissing )图书馆遗漏。jl。
@show x = filter(!ismissing, x_missing)
disallowmissing(x)
下面的代码行显示了如何过滤 missing 从使用函数的表格数据 filter().
filter(:имя => !ismissing, df_missing)
函数的应用给出了类似的结果[skipmissing()](https://engee.com/helpcenter/stable/ru/julia/manual/missing.html#пропуск-отсутствующих-значений )基础库:
collect(skipmissing(x_missing))
跳绳用 missing 在表格数据库DataFrames中。jl有一个更方便的功能-[dropmissing()](https://engee.com/helpcenter/stable/ru/julia/DataFrames/lib/functions.html#DataFrames.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中创建、组织、规范化、搜索、跳过和替换缺失数据的方法。