欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python之填充数据槽

程序员文章站 2022-04-11 18:16:02
...

填充数据槽

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

Python之填充数据槽

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

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

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

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

Python之填充数据槽

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

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

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

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

Python之填充数据槽

方法

从使用频率来看,数据恢复方法中无可争议的领先者是多重归因法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()

 

Python之填充数据槽

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)

Python之填充数据槽

可视化

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} );

Python之填充数据槽

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

相关标签: Python