2014-02-22 31 views
3

我想使用pandas.rolling_sum函數DataFrame使用任何數據可用於每個窗口(所以當窗口超出可用數據時不返回NaN)總結窗口。下面是一些樣本數據:熊貓rolling_sum與中心和min_periods

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選項時,在最後的觀察失敗?什麼是修復?

回答

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 S按-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]