问题描述
我有西伯利亚东部几个站点的每月温度数据。但是,我的工作所必需的一个站点缺少很多数据,而附近的其他站点具有很好的覆盖范围。有没有一种方法可以根据另一个数据集的行为来插补缺失的数据?无法提供任何代码,因为我不知道从哪里开始并且数据集看起来像这样:
红点是来自缺少值的站点的数据,而绿色图形是来自覆盖范围好的站点的数据
如果有人能指出我正确的方向,我将不胜感激
解决方法
有一些方法可以执行此操作,例如,在覆盖率较高的数据集上应用FFT,并查看它在覆盖高频项的同时对覆盖率较差的数据集的适应程度。
但是,我非常怀疑这会有用吗:高覆盖率的数据集几乎可以完全覆盖覆盖率较差的数据集。无论您要采用哪种方法,与高覆盖率数据集相似而对低覆盖率数据集进行拟合的最佳功能是高覆盖率数据集本身。
,让我们创建一个试验数据集来解决您的问题:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
t = np.linspace(0,30*2*np.pi,30*24*2)
td = pd.date_range("2020-01-01",freq='30T',periods=t.size)
T0 = np.sin(t)*8 - 15 + np.random.randn(t.size)*0.2
T1 = np.sin(t)*7 - 13 + np.random.randn(t.size)*0.1
T2 = np.sin(t)*9 - 10 + np.random.randn(t.size)*0.3
T3 = np.sin(t)*8.5 - 11 + np.random.randn(t.size)*0.5
T = np.vstack([T0,T1,T2,T3]).T
features = pd.DataFrame(T,columns=["s1","s2","s3","s4"],index=td)
它看起来像:
axe = features[:"2020-01-04"].plot()
axe.legend()
axe.grid()
然后,如果时间序列线性相关良好,则可以通过普通最小二乘回归的平均值来简单地预测缺失值。 SciKit-Learn提供了一个方便的界面来执行这种计算:
from sklearn import linear_model
from sklearn.model_selection import train_test_split
# Remove target site from features:
target = features.pop("s4")
# Split dataset into train (actual data) and test (missing temperatures):
x_train,x_test,y_train,y_test = train_test_split(features,target,train_size=0.25,random_state=123)
# Create a Linear Regressor and train it:
reg = linear_model.LinearRegression()
reg.fit(x_train,y_train)
# Assess regression score with test data:
reg.score(x_test,y_test) # 0.9926150729585087
# Predict missing values:
ypred = reg.predict(x_test)
ypred = pd.DataFrame(ypred,index=x_test.index,columns=["s4p"])
结果如下:
axe = features[:"2020-01-04"].plot()
target[:"2020-01-04"].plot(ax=axe)
ypred[:"2020-01-04"].plot(ax=axe,linestyle='None',marker='.')
axe.legend()
axe.grid()
error = (y_test - ypred.squeeze())
axe = error.plot()
axe.legend(["Prediction Error"])
axe.grid()