Документация Engee

Загрузка данных и обработка пропусков

В данном примере будет продемонстрирован процесс загрузки данных из формата XLSX и заполнение пропусков в них с помощью библиотек Impute и DataInterpolations.

Данные представляют собой архив наблюдений погодных явлений на одной метеостанции за последние 5 лет. В примере будут использоваться только ежедневные измерения температуры.

Установка библиотек, необходимых для загрузки и обработки данных:

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`

Вызов библиотек, необходимых для загрузки и обработки данных:

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

Чтение данных из файла в переменную:

xf_missing = XLSX.readxlsx("$(@__DIR__)/data_for_analysis_missing.xlsx");

Просмотр имён листов в загруженных данных:

XLSX.sheetnames(xf_missing)
1-element Vector{String}:
 "data"

Определение данных из файла как датафрейм:

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

Подключение бэкэнда - метода отображения графики:

gr()
Plots.GRBackend()

Определение переменных, характеризующих данные - время и температуру:

x = df_missing.Time;
y = df_missing.T;

Построение графика зависимости температуры от времени по исходным данным:

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

interactive-scripts/images/data_analysis_data_processing/d22f59e9b1a3909cd59ccb25200a7700d900fc75

По графику видно, что в данных есть пропуски, их можно заполнить используя библиотеки Impute и DataInterpolations.

Использование библиотеки Impute

Определение вектора и матрицы с данными:

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

Конвертация вектора и матрицы в формат, приемлемый для функций библиотеки Impute:

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

Заполнение пропусков с помощью интерполяции, фильтрации и среднего значения:

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

Построение графиков с исправленными данными:

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)

interactive-scripts/images/data_analysis_data_processing/910d0e5122a0a48cddcaeee246e892a92c0b3058

Использование библиотеки DataInterpolations

Подготовка данных для применения методов интерполяции:

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); #конвертация данных в нужный, для используемых методов, формат

Заполнение пропусков с помощью линейной интерполяции и построение графика с исправленными данными:

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

interactive-scripts/images/data_analysis_data_processing/9be80eba0e61c584e8005ea28560cc5638596524

Заполнение пропусков с помощью квадратичной интерполяции и построение графика с исправленными данными:

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

interactive-scripts/images/data_analysis_data_processing/4aae532436b0bfcce13dabea8507dab4abb733fd

Заполнение пропусков с помощью интерполяции последними постоянными значениями и построение графика с исправленными данными:

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

interactive-scripts/images/data_analysis_data_processing/7f0e3abcb262352860d29ff5d674e0877049ad30

Вывод

В этом примере были загружены и предобработаны данные измерений температуры. Были применены методы интерполяции и фильтрации.

По полученным графикам видно, что некоторые методы имеют ограничения по применению к данным разного вида.

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

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