在考虑日期时间的同时计算滚动组的乘积

时间:2019-01-31 18:51:31

标签: python pandas

我有以下数据框,其中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

1 个答案:

答案 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)