我想在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
选项时最后一次观察失败了吗?有什么问题?
答案 0 :(得分:2)
>>> 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]