Python 在考虑日期时间的情况下计算滚动groupby的乘积

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是唯一标识符,日期是每月观察值,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
我想在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)

我无法让它在更复杂的数据帧上工作。这似乎是一个快速解决方案,而不是实际解决方案?