我有以下数据框,并且希望得到滚动累积回报超过最后一个让我们说这个例子按标识符分组的2个时期。对于我的实际情况,我需要更长的时间,但我的问题更多的是groupby:
id return
2012 1 0.5
2012 2 0.2
2013 1 0.1
2013 2 0.3
结果应如下所示:
id return cumreturn
2012 1 0.5 0.5
2012 2 0.2 0.2
2013 1 0.1 0.65
2013 2 0.3 0.56
期间滚动是重要的。到目前为止,我有以下公式:
df["cumreturn"] = df.groupby("id")["return"].fillna(0).pd.rolling_apply(df,5,lambda x: np.prod(1+x)-1)
但是,我收到以下错误:AttributeError:'Series'对象没有属性'pd'。我知道如何获得滚动的累积回报。但是,我只是想弄清楚如何将它与groupby结合起来。
答案 0 :(得分:2)
让我们试试这个:
df_out = (df.set_index('id', append=True)
.assign(cumreturn=df.groupby('id')['return'].rolling(2,min_periods=1)
.apply(lambda x: np.prod(1+x)-1)
.swaplevel(0,1)).reset_index(1))
输出:
id return cumreturn
2012 1 0.5 0.50
2012 2 0.2 0.20
2013 1 0.1 0.65
2013 2 0.3 0.56