pandas rolling_sum与center和min_periods

时间:2014-02-22 20:57:01

标签: python pandas

我想在pandas.rolling_sum上使用DataFrame函数来使用每个窗口可用的任何数据对窗口进行求和(因此当窗口扩展时不要返回NaN超出可用数据)。以下是一些示例数据:

import pandas as pd  # version 0.12.0  (Python 2.7)
df = pd.DataFrame([1]*4+[2]*4,
                  index=pd.date_range('2014-1-1', periods=8, freq='D'),
                  columns=['num'])
df.head()
#             num
# 2014-01-01    1
# 2014-01-02    1
# 2014-01-03    1
# 2014-01-04    1
# 2014-01-05    2

这是基本的,集中的滚动总和......

pd.rolling_sum(df, 7, center=True)
#             num
# 2014-01-01  NaN
# 2014-01-02  NaN
# 2014-01-03  NaN
# 2014-01-04   10
# 2014-01-05   11
# 2014-01-06  NaN
# 2014-01-07  NaN
# 2014-01-08  NaN

我想消除NaN值并使用每个窗口中可用的任何数据。我的预感是min_periods选项可以解决这个问题......

pd.rolling_sum(df, 7, center=True, min_periods=0)
#             num
# 2014-01-01    4
# 2014-01-02    6
# 2014-01-03    8
# 2014-01-04   10
# 2014-01-05   11
# 2014-01-06  NaN
# 2014-01-07  NaN
# 2014-01-08  NaN

当窗口没有使用center=True居中时,这是有效的,但我很困惑为什么缺少最后三个值。我期待最后三个值是......

# 2014-01-06  10
# 2014-01-07   9
# 2014-01-08   8

有人可以解释为什么min_periods正在处理第一次观察,但在使用center=True选项时最后一次观察失败了吗?有什么问题?

1 个答案:

答案 0 :(得分:2)

pandas似乎首先计算:

>>> pd.rolling_sum(df, 7, center=False, min_periods=0)
            num
2014-01-01    1
2014-01-02    2
2014-01-03    3
2014-01-04    4
2014-01-05    6
2014-01-06    8
2014-01-07   10
2014-01-08   11

[8 rows x 1 columns]

然后shift结果为-offset,其中

offset = int((window - 1) / 2.)

这导致最后一个条目的NaN值,即使min_periods=0;我的工作如下:

>>> rs = pd.rolling_sum(df, 7, center=True, min_periods=0)
>>> rs.update( pd.rolling_sum(df.iloc[:-7:-1], 7, center=True, min_periods=0) )
>>> rs
            num
2014-01-01    4
2014-01-02    6
2014-01-03    8
2014-01-04   10
2014-01-05   11
2014-01-06   10
2014-01-07    9
2014-01-08    8

[8 rows x 1 columns]