Engee 文档
Notebook

数据加载和徽章处理

本示例将演示从 XLSX 格式加载数据并使用 Impute 和 DataInterpolations 库填补数据空白的过程。

数据是一个气象站过去 5 年的气象事件观测数据档案。 示例中将仅使用每日温度测量值。

安装数据加载和处理所需的库:

In [ ]:
Pkg.add(["Statistics", "XLSX", "Impute", "CSV", "DataInterpolations"])
In [ ]:
Pkg.add( "Impute" ); #загрузка библиотеки обработки данных
Pkg.add( "DataInterpolations" );
   Resolving package versions...
  No Changes to `/user/.project/Project.toml`
  No Changes to `/user/.project/Manifest.toml`
   Resolving package versions...
  No Changes to `/user/.project/Project.toml`
  No Changes to `/user/.project/Manifest.toml`

调用数据加载和处理所需的库:

In [ ]:
using DataFrames, CSV, XLSX, Plots, Impute, DataInterpolations, Statistics
using Impute: Substitute, impute

将数据从文件读入变量

In [ ]:
xf_missing = XLSX.readxlsx("$(@__DIR__)/data_for_analysis_missing.xlsx");

在加载的数据中查看工作表名称

In [ ]:
XLSX.sheetnames(xf_missing)
Out[0]:
1-element Vector{String}:
 "data"

将文件中的数据定义为数据帧

In [ ]:
df_missing = DataFrame(XLSX.readtable("$(@__DIR__)/data_for_analysis_missing.xlsx", "data"));

连接后台--显示图表的方法:

In [ ]:
gr()
Out[0]:
Plots.GRBackend()

定义表征数据的变量--时间和温度:

In [ ]:
x = df_missing.Time;
y = df_missing.T;

使用原始数据绘制温度与时间的关系图:

In [ ]:
plot(x, y, labels="Температура", title="График зависимости температуры от времени")
Out[0]:

从图中可以看出,数据中存在缺口,可以使用 Impute 和 DataInterpolations 库进行填补。

使用 Impute 库:

使用数据定义向量和矩阵

In [ ]:
vectorT = df_missing[:,2]
matrixT = df_missing[:,1:2]
typeof(vectorT)
Out[0]:
Vector{Any} (alias for Array{Any, 1})

将向量和矩阵转换为 Impute 库函数可接受的格式:

In [ ]:
vectorT = convert(Vector{Union{Missing,Float64}}, vectorT);
matrixT[:,2] = convert(Vector{Union{Missing,Float64}}, matrixT[:,2]);

使用插值、过滤和平均值填补空白:

In [ ]:
lin_inter_vectorT = Impute.interp(vectorT); #заполнение пропущенных значений интерполированными (для сигналов)
filter_matrixT = Impute.filter(matrixT; dims=:rows); #удаление объектов/наблюдений с пропущенными данными
mean_matrixT = impute(matrixT[:,2], Substitute(; statistic=mean)); #заполнение пропущенных значений средними значениями (подходит для статистических данных)

用修正后的数据绘制图表

In [ ]:
p2 = plot(df_missing[:,1], lin_inter_vectorT, xlabel="Дата", ylabel="Температура", title="Заполнение пропусков линейной интерполяцией", titlefont=font(10));
p3 = plot(df_missing[:,1], mean_matrixT, xlabel="Дата", ylabel="Температура", title="Заполнение пропусков средним значением", titlefont=font(10), guidefont=font(8));
p1 = scatter(df_missing[:,1], df_missing[:,2], markersize=2, xlabel="Дата", ylabel="Температура", title="Исходные данные", titlefont=font(10), guidefont=font(8))
plot(p1, p2, p3,  layout=(3, 1), legend=false)
Out[0]:

使用 DataInterpolations 库

为插值方法准备数据

In [ ]:
days = [x for x in 1:length(df_missing[:,2])] #определение вектора от 1 до значения длины массива с данными
t = days
u = reverse(df_missing[:,2]) #сортировка измерений температуры в обратном порядке, от раннего к позднему
u = convert(Vector{Union{Missing,Float64}}, u); #конвертация данных в нужный, для используемых методов, формат

使用线性插值法填补空白,并用修正后的数据绘制图表:

In [ ]:
A = LinearInterpolation(u,t)
scatter(t, u, markersize=2, label="Исходные данные") #вывод точечного графика
plot!(A, label="Линейная интерполяция", xlabel="Время", ylabel="Температура") #вывод зависимости температуры от времени
Out[0]:

使用二次插值法填补空白,并用修正后的数据绘制图表:

In [ ]:
B = QuadraticInterpolation(u,t)
scatter(t, u, markersize=2, label="Исходные данные")#вывод точечного графика
plot!(B, label="Квадратичная интерполяция", xlabel="Время", ylabel="Температура")#вывод зависимости температуры от времени
Out[0]:

用最后一个常数值进行插值来填补空白,并用修正后的数据绘制图表:

In [ ]:
C = ConstantInterpolation(u,t)
scatter(t, u, markersize=2, label="Исходные данные")#вывод точечного графика
plot!(C, label="Последние значения", xlabel="Время", ylabel="Температура")#вывод зависимости температуры от времени
Out[0]:

结论

在本例中,温度测量数据已下载并进行了预处理。应用了插值和过滤技术。

图表显示,某些方法在应用于不同类型的数据时存在局限性。

例如,用平均值替换跳变值更适合统计分析,因为数据的特征不会有太大变化。

就二次插值而言,在相对较大的缺失范围内,信号幅度会发生很大变化,因此它更适用于较小的间隙。