Python 在考虑日期时间的情况下计算滚动groupby的乘积
我有以下数据框,ID是唯一标识符,日期是每月观察值,1+返回值是给定日期月份的返回值Python 在考虑日期时间的情况下计算滚动groupby的乘积,python,pandas,Python,Pandas,我有以下数据框,ID是唯一标识符,日期是每月观察值,1+返回值是给定日期月份的返回值 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, 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
我想在dataframe中创建一列,其中包含每个ID的累积回报。累积回报必须满足以下条件:
1) 它应该只在有3个观测值可用的情况下进行计算,否则返回nan
2) 它应该只计算3个观测值,然后向前滚动
3) 它应该只计算相同ID的返回
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
尝试将数据重新采样到每月频率,然后运行相同的命令
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)
我无法让它在更复杂的数据帧上工作。这似乎是一个快速解决方案,而不是实际解决方案?