缺失值是数据分析中一个常见的问题,因为在许多情况下,我们的数据集中会存在缺失数据。这些缺失值可能会导致分析结果偏差或错误,因此需要进行缺失值处理。下面介绍四种常见的缺失值处理方法:前向填充、移动平均、指数平滑、线性插值

1、前向填充(Forward Filling):使用前面最近的一个已知值来填充缺失值。当有多个连续的缺失值时,该方法将使用上一个已知值来填充所有缺失值,直到遇到下一个已知值。

# 构建一列随机缺失值列unemploy['missing'] = unemploy['rate']# unemploy.head()# 随机选择10%行手动填充缺失值mis_index = unemploy.sample(frac=0.1,random_state=999).index # 获取缺失值所在的行标签# mis_index 将存在缺失值的单元格转换为Noneunemploy.loc[mis_index,'missing']=Noneunemploy['f_fill'] = unemploy['missing']unemploy['f_fill'].ffill(inplace=True) # 默认实现前向填充# 然后绘制散点--折线图实现观察# 首先绘制关于date——rate散点图plt.scatter(unemploy.year,unemploy.rate,s=10)plt.plot(unemploy.year,unemploy.rate,label='real')# 将非缺失点用“红点”绘制出来;缺失点用“倒三角”绘制出来plt.scatter(unemploy[~unemploy.index.isin(mis_index)].year,unemploy[~unemploy.index.isin(mis_index)].f_fill,s=10,c='r')# 绘制散点图:行是df中不属于mis_index的索引值;列是索引对应的f_fill列的值。plt.scatter(unemploy.loc[mis_index].year,unemploy.loc[mis_index].f_fill,s=50,c='r',marker='v')plt.plot(unemploy.year,unemploy.f_fill,label='forward fill')plt.legend()

2、移动平均(Moving Average):根据实际情况选择适合的移动窗口大小,一般来说。窗口大小越大,估计的结果越平滑,但是也会更滞后。例如,如果缺失的值位于时间序列中的某个位置,则可以使用该位置前后的一些数据的平均值来填充该缺失值。

# 首先使用np.where()判断是否为缺失值,是的话返回第二个参数,否则返回第三个参数;# shift(1)表示当前单元格向上移动一个;窗口大小为3;min_periods=1表示最初位置可以使用第一个非缺失值unemploy['moveavg']=np.where(unemploy['missing'].isnull(), unemploy['missing'].shift(1).rolling(3,min_periods=1).mean(), unemploy['missing'])# 观察填充效果plt.scatter(unemploy.year,unemploy.rate,s=10)plt.plot(unemploy.year,unemploy.rate,label='real')plt.scatter(unemploy[~unemploy.index.isin(mis_index)].year,unemploy[~unemploy.index.isin(mis_index)].f_fill,s=10,c='r')plt.scatter(unemploy.loc[mis_index].year,unemploy.loc[mis_index].f_fill,s=50,c='r',marker='v')plt.plot(unemploy.year,unemploy.f_fill,label='forward fill',c='r',linestyle = '--')plt.scatter(unemploy[~unemploy.index.isin(mis_index)].year,unemploy[~unemploy.index.isin(mis_index)].moveavg,s=10,c='r')plt.scatter(unemploy.loc[mis_index].year,unemploy.loc[mis_index].moveavg,s=50,c='g',marker='^')plt.plot(unemploy.year,unemploy.moveavg,label='moving average',c='g',linestyle = '--')plt.legend()

3、指数平滑(Exponential Smoothing):使用加权平均值来填充缺失值,其中最近的数据点被赋予更高的权重。指数平滑可以更好地反映数据的趋势和季节性,并且在填充连续的缺失值时也非常有效。

# 设置两种平滑系数air['smooth_0.5']= air.Passengers.ewm(alpha =0.5).mean()air['smooth_0.9']= air.Passengers.ewm(alpha =0.9).mean()air# 先后绘制date与air、air['smooth_0.5']、air['smooth_0.9']的散点图plt.plot(air.Date,air.Passengers,label='actual')plt.plot(air.Date,air['smooth_0.5'],label='alpha=0.5')plt.plot(air.Date,air['smooth_0.9'],label='alpha=0.9')plt.xticks(rotation=45)# 设置倾斜角度plt.legend()

4、线性插值(Linear Interpolation):使用数据中已知的两个邻近数据点之间的线性关系来填充缺失值。这种方法通常用于连续的时间序列数据,可以更好地估计缺失值的可能范围。

unemploy['inter_lin']=unemploy['missing'].interpolate(method='linear')unemploy['inter_poly']=unemploy['missing'].interpolate(method='polynomial', order=3)# 观察填充效果plt.plot(unemploy.year,unemploy.rate,label='real')plt.plot(unemploy.year,unemploy.inter_lin,label='linear interpolation',c='r',linestyle = '--')plt.plot(unemploy.year,unemploy.inter_poly,label='polynomial interpolation',c='g',linestyle = '--')plt.legend()