我想找到收益的累积积。我尝试了以下代码:
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
答案 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