如何在 Python 的滚动平均值计算中忽略 NaN
Posted
技术标签:
【中文标题】如何在 Python 的滚动平均值计算中忽略 NaN【英文标题】:How to ignore NaN in rolling average calculation in Python 【发布时间】:2018-09-15 14:00:05 【问题描述】:对于时间序列销售预测任务,我想创建一个表示过去 3 天平均销售额的特征。当我想预测未来几天的销售额时,我遇到了问题,因为这些数据点没有销售数据(NaN 值)。 Pandas 提供 rolling_mean(),但当窗口中的任何数据点为 NaN 时,该函数会导致 NaN 输出。
我的数据:
Date Sales
02-01-2013 100.0
03-01-2013 200.0
04-01-2013 300.0
05-01-2013 200.0
06-01-2013 NaN
使用窗口为 2 的 pd.rolling_mean() 后的结果:
Date Rolling_Sales
02-01-2013 NaN
03-01-2013 150.0
04-01-2013 250.0
05-01-2013 250.0
06-01-2013 NaN
想要的结果:
Date Rolling_Sales
02-01-2013 NaN
03-01-2013 150.0
04-01-2013 250.0
05-01-2013 250.0
06-01-2013 200.0
因此,如果包含 NaN,我想忽略它并取窗口中所有其他数据点的平均值。
【问题讨论】:
您在寻找 df.ffill().Sales.rolling(2).mean() 吗? 【参考方案1】:这里正在添加min_periods
s=df.Sales.rolling(window=2,min_periods=1).mean()
s.iloc[0]=np.nan
s
Out[1293]:
0 NaN
1 150.0
2 250.0
3 250.0
4 200.0
Name: Sales, dtype: float64
【讨论】:
这并不能解决问题。您假设 NaNs 结果出现在窗口的开头,但是 pandas 中似乎存在一个错误……您也不能忽略/跳过该系列后面出现的 nan 值。 min_periods 无处不在,作为对此的答案。这不是答案。 @user5747140 那么答案是什么? 这可能不是最好的答案,但我对@user5747140 点所做的部分回应是在使用滚动之前给我们 df.fillna(method='ffill') 。这可能不适用于所有人,并且取决于您的数据,但出于我的目的,前向填充以删除 nan 值是可以接受的做法。以上是关于如何在 Python 的滚动平均值计算中忽略 NaN的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 python + NumPy / SciPy 计算滚动/移动平均值?
使用 R [关闭] 计算 data.frame 中存在的 NA 值的平均值