Python之填充数据槽

填充数据槽

对数据遗漏的处理(填充)与时间序列特别相关,并与读/写数据时的问题相关。

输入数据的质量决定了建立在其基础上的模型的质量。因此,数据的遗漏会威胁到效率的损失和研究结果的扭曲,以及根据数据分析做出的管理决策。

并非所有的算法和方法都能对有遗漏值的数据起作用。

最简单的解决方法是删除遗漏值。显然,它扭曲了数据的统计属性。

其他变体的解决方法是应用恢复遗漏值的方法,以及应用机器学习方法,即所谓的多任务学习方法,在解决的过程中,利用这些方法对有遗漏值的数据进行处理,例如,分类或预测任务。

为了正确处理数据与通证,了解通证的形成机制是非常重要的。

MCAR:分配数据中完全随机的遗漏,对于这些遗漏的数据,所有恢复遗漏值的算法都适用。它甚至可以删除单个跳过,因为可用值包含所有必要的研究信息。

MAR:在系统性数据遗漏的情况下,从数组中删除这些数据会导致重要的依赖性丢失,所以在这种情况下,最有效的是填补缺失值。

MNAR:在处理具有非随机跳转的数据时,有必要对主题领域进行额外的分析,因为形成跳转的机制取决于未观察到的变量。在这种情况下,可以建立一个缺失数据的模型,然后将其包含在一个更复杂的模型中以估计缺失值。

方法

从使用频率来看,数据恢复方法中无可争议的领先者是多重归因法multiple imputation。它们是统计学上最可取的方法,因为多重归因确保了统计结果的有效性,并反映了与估计缺失数据有关的不确定性。

现在,在所有部门积极应用机器学习方法的同时,还积极应用多任务学习multi-task learning,,允许解决与主要任务(例如,分类或预测)同时进行的填表问题。

示例

import matplotlib.pyplot as plt
%matplotlib inline

import numpy as np
import pandas as pd

from sklearn.metrics import r2_score

df = pd.read_csv('data\gap_data.csv', header=0, encoding= 'unicode_escape', sep=';')
df.Date = pd.to_datetime(df.Date, format='%d.%m.%Y')
df = df.set_index('Date')
df.head()

 

df = df.assign(missing=np.nan)
df.missing[df.target.isna()] = df.reference
df.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 96 entries, 2010-01-01 to 2017-12-01
Data columns (total 3 columns):
reference    96 non-null float64
target       75 non-null float64
missing      21 non-null float64
dtypes: float64(3)
memory usage: 3.0 KB
df.plot(style=['k--', 'bo-', 'r*'], figsize=(20, 10));
 

填充物为中位数/中间值 

# Filling using mean or median
# Creating a column in the dataframe
# instead of : df['NewCol']=0, we use
# df = df.assign(NewCol=default_value)
# to avoid pandas warning.
df = df.assign(FillMean=df.target.fillna(df.target.mean()))
df = df.assign(FillMedian=df.target.fillna(df.target.median()))

填充移动平均数/中位数

# imputing using the rolling average
df = df.assign(RollingMean=df.target.fillna(df.target.rolling(24,min_periods=1,).mean()))
# imputing using the rolling median
df = df.assign(RollingMedian=df.target.fillna(df.target.rolling(24,min_periods=1,).median()))# imputing using the median

使用内插法的填充通道

阅读更多关于插值方法的内容 interpolation

df = df.assign(InterpolateLinear=df.target.interpolate(method='linear'))
df = df.assign(InterpolateTime=df.target.interpolate(method='time'))
df = df.assign(InterpolateQuadratic=df.target.interpolate(method='quadratic'))
df = df.assign(InterpolateCubic=df.target.interpolate(method='cubic'))
df = df.assign(InterpolateSLinear=df.target.interpolate(method='slinear'))
df = df.assign(InterpolateAkima=df.target.interpolate(method='akima'))
df = df.assign(InterpolatePoly5=df.target.interpolate(method='polynomial', order=5)) 
df = df.assign(InterpolatePoly7=df.target.interpolate(method='polynomial', order=7))
df = df.assign(InterpolateSpline3=df.target.interpolate(method='spline', order=3))
df = df.assign(InterpolateSpline4=df.target.interpolate(method='spline', order=4))
df = df.assign(InterpolateSpline5=df.target.interpolate(method='spline', order=5))

结果 

results = [(method, r2_score(df.reference, df[method])) for method in list(df)[3:]]
results_df = pd.DataFrame(np.array(results), columns=['Method', 'R_squared'])
results_df.sort_values(by='R_squared', ascending=False)

可视化

final_df= df[['reference', 'target', 'missing', 'InterpolateAkima' ]]
final_df.plot(style=['b-.', 'ko', 'r.', 'gx-'], figsize=(20,10));
plt.ylabel('Temperature');
plt.legend(loc='upper center', bbox_to_anchor=(0.5, 1.05),
          fancybox=True, shadow=True, ncol=5, prop={'size': 14} );

一些限制。要使用时间插值,数据帧索引必须是日期时间格式,间隔至少为1天。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值