如何在 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的主要内容,如果未能解决你的问题,请参考以下文章

计算移动窗口中非 na 值最少的滚动平均值

如何使用 python + NumPy / SciPy 计算滚动/移动平均值?

使用 R [关闭] 计算 data.frame 中存在的 NA 值的平均值

计算R中列中NA的前后值的平均值

Python Pandas:计算可变行数的滚动平均值(移动平均值)

如何计算按列名分组的数据框/矩阵中的平均值和标准差