我有以下数据框,其中ID是唯一标识符,日期是每月的观测值,而1 + return是给定日期月份的回报。
ID, date, 1+return
1 31-01-2007 1.1
1 31-02-2007 1.1
1 31-03-2007 1.1
2 31-01-2007 1.2
2 31-02-2007 1.2
2 31-07-2007 1.2
我想在数据框中创建一个列,其中包含每个ID的累积收益。累计收益必须满足以下条件:
1)仅应在有3个观测值可用的情况下进行计算,否则返回nan。
2)它应该仅对3个观测值进行计算,然后向前滚动
3)它仅应计算相同ID的收益。因此,Groupby
4)仅应在3个观察值分散3个月后计算收益。请注意,对于ID(2),最后一个日期输入将跳过几个月。
我写了以下代码:
df['cumret'] = df.sort_values(by='date').groupby('id')
['1+return'].rolling(3,min_periods=3).apply(lambda x:
x.prod()).reset_index(0,drop=True)
这将提供以下输出:
ID, date, 1+return cumret
1 31-01-2007 1.1 NA
1 31-02-2007 1.1 NA
1 31-03-2007 1.1 1.331
2 31-01-2007 1.2 NA
2 31-02-2007 1.2 NA
2 31-07-2007 1.2 1.728
我想要此输出:
ID, date, 1+return cumret
1 31-01-2007 1.1 NA
1 31-02-2007 1.1 NA
1 31-03-2007 1.1 1.331
2 31-01-2007 1.2 NA
2 31-02-2007 1.2 NA
2 31-07-2007 1.2 NA
答案 0 :(得分:0)
尝试将数据重新采样到每月一次,然后运行相同的命令。
df['cumret'] = df.resample('M').asfreq().groupby('id')
['1+return'].rolling(3,min_periods=3).apply(lambda x:
x.prod()).reset_index(0,drop=True)