2015-01-12 66 views
2

我會嘗試解釋我目前在Python中對DataFrames的累積總和問題,並希望你能掌握它!熊貓軋製總和,變化長度

給定一個數據幀大熊貓df與列returns這樣:

   returns 
Date               
2014-12-10 0.0000 
2014-12-11 0.0200 
2014-12-12 0.0500 
2014-12-15 -0.0200 
2014-12-16 0.0000 

在此數據幀應用一個累加和很容易,只要使用例如df.cumsum()。但是,是否可以每X天(或數據點)申請一個累計總和,只產生最後Y天(數據點)的累計總和。

澄清:如果以上述日常數據爲準,我如何獲得最近Y天的累計總和,每X天重新評估(從零開始)?

希望它足夠清晰,

感謝, ñ

回答

0

感謝@ DSM,我設法想出了他的解決方案的一個變體,它實際上確實做了我正在尋找的東西:

import numpy as np 
import pandas as pd 

df.resample("1w"), how={'A': np.sum}) 

息率我想爲下面的例子:

rng = range(1,29) 
dates = pd.date_range('1/1/2000', periods=len(rng)) 
r = pd.DataFrame(rng, index=dates, columns=['A']) 
r2 = r.resample("1w", how={'A': np.sum}) 

輸出:

>> print r 
      A 
2000-01-01 1 
2000-01-02 2 
2000-01-03 3 
2000-01-04 4 
2000-01-05 5 
2000-01-06 6 
2000-01-07 7 
2000-01-08 8 
2000-01-09 9 
2000-01-10 10 
2000-01-11 11 
... 
2000-01-25 25 
2000-01-26 26 
2000-01-27 27 
2000-01-28 28 

>> print r2 
       A 
2000-01-02 3 
2000-01-09 42 
2000-01-16 91 
2000-01-23 140 
2000-01-30 130 

即使它沒有啓動「一週」,在這種情況下,(導致的3總和第一種情況),它始終得到正確的滾動總和,從前一天開始,初始值爲零。

0

我不知道是否有一個內置的方法,但它似乎並不十分難寫一個。例如, ,這裏是一個熊貓系列。

def cum(df, interval): 
    all = [] 
    quotient = len(df)//interval 
    intervals = range(quotient) 
    for i in intervals: 
     all.append(df[0:(i+1)*interval].sum()) 
    return pd.Series(all) 
>>>s1 = pd.Series(range(20)) 
>>>print(cum(s1, 4)) 
0  6 
1 28 
2 66 
3 120 
4 190 
dtype: int64 
+0

我想你誤會了這個問題 – ari

+0

對不起,我重新閱讀了這個問題,我仍然感到困惑。 – user2707389

+0

現在我擔心我沒有正確理解它。我的理解方式是,用你的數字,'y'爲2,cumsum應該是[0,0,2,5,0,0,6,13,0,0,10,21 .. 。],一個cumsum重置每個'x'數據點,但也沒有考慮到第一個'xy'數據點。 – ari

0

我會這樣做的方式是與幫助列。這是一個有點kludgy,但它應該工作:

numgroups = int(len(df)/(x-1)) 
df['groupby'] = sorted(list(range(numgroups))*x)[:len(df)] 
df['mask'] = (([0]*(x-y)+[1]*(y))*numgroups)[:len(df)] 
df['masked'] = df.returns*df['mask'] 
df.groupby('groupby').masked.cumsum() 
2

「每X日」和「每X個數據點」是非常不同的;以下假設你確實是第一個,因爲你更頻繁地提到它。

如果該索引是DatetimeIndex,你可以resample至每日頻率,採取rolling_sum,然後選擇只有原來的日期:

>>> pd.rolling_sum(df.resample("1d"), 2, min_periods=1).loc[df.index] 
      returns 
Date    
2014-12-10  0.00 
2014-12-11  0.02 
2014-12-12  0.07 
2014-12-15 -0.02 
2014-12-16 -0.02 

,或者一步一步:

>>> df.resample("1d") 
      returns 
Date    
2014-12-10  0.00 
2014-12-11  0.02 
2014-12-12  0.05 
2014-12-13  NaN 
2014-12-14  NaN 
2014-12-15 -0.02 
2014-12-16  0.00 
>>> pd.rolling_sum(df.resample("1d"), 2, min_periods=1) 
      returns 
Date    
2014-12-10  0.00 
2014-12-11  0.02 
2014-12-12  0.07 
2014-12-13  0.05 
2014-12-14  NaN 
2014-12-15 -0.02 
2014-12-16 -0.02