熊猫滚动给出 NaN

新手上路,请多包涵

我正在查看有关窗口函数的教程,但我不太明白为什么以下代码会产生 NaN。

如果我理解正确,代码创建了一个大小为 2 的滚动窗口。为什么第一、第四和第五行有 NaN?起初,我认为这是因为将 NaN 与另一个数字相加会产生 NaN,但后来我不确定为什么第二行不会是 NaN。

 dft = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]},
                   index=pd.date_range('20130101 09:00:00', periods=5, freq='s'))

In [58]: dft.rolling(2).sum()
Out[58]:
                       B
2013-01-01 09:00:00  NaN
2013-01-01 09:00:01  1.0
2013-01-01 09:00:02  3.0
2013-01-01 09:00:03  NaN
2013-01-01 09:00:04  NaN

原文由 Huey 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 604
2 个回答

首先要注意的是,默认情况下 rolling 查找要聚合的前 n-1 行数据,其中 n 是窗口大小。如果不满足该条件,它将为窗口返回 NaN。这就是第一行发生的事情。在第四行和第五行中,这是因为总和中的一个值是 NaN。

如果您想避免返回 NaN,您可以将 min_periods=1 传递给将窗口中有效观察的最小所需数量减少到 1 而不是 2 的方法:

 >>> dft.rolling(2, min_periods=1).sum()
                       B
2013-01-01 09:00:00  0.0
2013-01-01 09:00:01  1.0
2013-01-01 09:00:02  3.0
2013-01-01 09:00:03  2.0
2013-01-01 09:00:04  4.0

原文由 Brian Huey 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 min_periods=1 会导致滚动窗口中的值出现高方差。另一种删除 NaN 值的方法是在滚动窗口上使用 fillna

 >>> dft.rolling(2).sum().fillna(method='bfill').fillna(method='ffill')
                       B
2013-01-01 09:00:00  1.0
2013-01-01 09:00:01  1.0
2013-01-01 09:00:02  3.0
2013-01-01 09:00:03  3.0
2013-01-01 09:00:04  3.0

滚动窗口大小为 6 的示例说明了这个问题:

 >>> dft = pd.DataFrame({'B': [10, 1, 10, 1, 10, 1, 10, 1, 10, 1]}, index=pd.date_range('20130101 09:00:00', periods=10, freq='s'))

>>> dft.rolling(6, min_periods=1).sum()
                        B
2013-01-01 09:00:00  10.0
2013-01-01 09:00:01  11.0
2013-01-01 09:00:02  21.0
2013-01-01 09:00:03  22.0
2013-01-01 09:00:04  32.0
2013-01-01 09:00:05  33.0
2013-01-01 09:00:06  33.0
2013-01-01 09:00:07  33.0
2013-01-01 09:00:08  33.0
2013-01-01 09:00:09  33.0

>>> dft.rolling(6).sum().fillna(method='bfill')
                        B
2013-01-01 09:00:00  33.0
2013-01-01 09:00:01  33.0
2013-01-01 09:00:02  33.0
2013-01-01 09:00:03  33.0
2013-01-01 09:00:04  33.0
2013-01-01 09:00:05  33.0
2013-01-01 09:00:06  33.0
2013-01-01 09:00:07  33.0
2013-01-01 09:00:08  33.0
2013-01-01 09:00:09  33.0

而使用 min_periods=1 导致前 5 个值低于 33.0,而使用 fillna 在整个窗口中产生预期的 33.0。根据您的用例,您可能想要使用 fillna

原文由 maechler 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题