累计收益

时间:2019-03-16 07:57:53

标签: python pandas

我想找到收益的累积积。我尝试了以下代码:

df['cumret'] = df.groupby(level=['date','id']).(1 + df.ret).cumprod() - 1

但是,它返回一条错误消息

SyntaxError:语法无效

任何帮助将不胜感激

import pandas as pd

data = {'date': ['2014-05-01', '2014-05-01', '2014-05-01', '2014-05-01',
             '2014-05-02', '2014-05-02', '2014-05-02', '2014-05-02' 
             '2014-05-03', '2014-05-03', '2014-05-03', '2014-05-03']
    'id': [a, b, c, d, a, b, c, d, a, b, c, d],
    'sd': [0.05, 0.01, 0.03 , 0.05, 0.10, 0.04, 0.01, 0.03, 0.06, 0.07, 
           0.10, 0.20]
    'ret':[0.01, 0.05, -0.06, -0.10, 0.20, 0.08, 0.09, 0.10, 0.20,0.03,
           0.30, -0.15}

df = pd.DataFrame(data).set_index(['date', 'id']).sort_index(level='date')

df

             id    sd   ret
date               
2014-05-01   a    0.05   0.01 
2014-05-01   b    0.01   0.05
2014-05-01   c    0.03  -0.06
2014-05-01   d    0.05  -0.10
2014-05-02   a    0.10   0.20
2014-05-02   b    0.04   0.08
2014-05-02   c    0.01   0.09
2014-05-02   d    0.03   0.10
2014-05-03   a    0.06   0.20
2014-05-03   b    0.07   0.03
2014-05-03   c    0.10   0.30
2014-05-03   d    0.20  -0.15

所需的输出

             id    sd   ret    cumret
date               
2014-05-01   a    0.05   0.01   1.01
2014-05-01   b    0.01   0.05   1.05
2014-05-01   c    0.03  -0.06   0.94
2014-05-01   d    0.05  -0.10   0.90
2014-05-02   a    0.10   0.20   1.21
2014-05-02   b    0.04   0.08   1.13
2014-05-02   c    0.01   0.09   1.03
2014-05-02   d    0.03   0.10   1.00
2014-05-03   a    0.06   0.20   1.41
2014-05-03   b    0.07   0.03   1.16
2014-05-03   c    0.10   0.30   1.33
2014-05-03   d    0.20  -0.15   0.85

1 个答案:

答案 0 :(得分:3)

我相信您需要在1列中添加ret并仅按id列分组:

df['cumret'] = (df['ret'] + 1).groupby(level=['id']).cumprod()

print(df)
                 sd   ret   cumret
date       id                     
2014-05-01 a   0.05  0.01  1.01000
           b   0.01  0.05  1.05000
           c   0.03 -0.06  0.94000
           d   0.05 -0.10  0.90000
2014-05-02 a   0.10  0.20  1.21200
           b   0.04  0.08  1.13400
           c   0.01  0.09  1.02460
           d   0.03  0.10  0.99000
2014-05-03 a   0.06  0.20  1.45440
           b   0.07  0.03  1.16802
           c   0.10  0.30  1.33198
           d   0.20 -0.15  0.84150

如果要按以下两种分组:

df['cumret'] = (df['ret'] + 1).groupby(level=['date', 'id']).cumprod()

print(df)
                 sd   ret  cumret
date       id                    
2014-05-01 a   0.05  0.01    1.01
           b   0.01  0.05    1.05
           c   0.03 -0.06    0.94
           d   0.05 -0.10    0.90
2014-05-02 a   0.10  0.20    1.20
           b   0.04  0.08    1.08
           c   0.01  0.09    1.09
           d   0.03  0.10    1.10
2014-05-03 a   0.06  0.20    1.20
           b   0.07  0.03    1.03
           c   0.10  0.30    1.30
           d   0.20 -0.15    0.85