2015-01-12 65 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