【问题标题】:How to ignore NaN in rolling average calculation in Python如何在 Python 的滚动平均值计算中忽略 NaN
【发布时间】: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() 吗?

标签: python pandas time-series nan


【解决方案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 值是可以接受的做法。
猜你喜欢
  • 2022-01-07
  • 2014-09-03
  • 2019-05-15
  • 1970-01-01
  • 2012-09-03
  • 2017-12-28
  • 1970-01-01
  • 2013-05-07
相关资源
最近更新 更多