IIUC, вы хотите rolling().mean()
:
df['hist'] = (df.groupby('id', as_index=False)
.ROE.rolling(4).mean()
.reset_index(level=0, drop=True)
)
Вывод:
Date ROE id hist
0 30-06-2013 0.02 1 NaN
1 30-06-2013 0.01 2 NaN
2 30-09-2013 0.05 1 NaN
3 30-09-2013 0.06 2 NaN
4 30-09-2013 0.04 3 NaN
5 31-12-2013 0.10 1 NaN
6 31-12-2013 0.05 2 NaN
7 31-12-2013 0.03 3 NaN
8 31-03-2014 0.11 1 0.070
9 31-03-2014 0.06 2 0.045
10 31-03-2014 0.04 3 NaN
Обновление : По комментарию вы можете собиратьна date
и затем rolling
на результат.
df['Date'] = pd.to_datetime(df['Date'])
new_df = (df.groupby('Date').ROE.agg(['sum','count'])
.rolling(4).sum()
.assign(hist=lambda x: x['sum']/x['count'])
)
df['hist'] = df['Date'].map(new_df['hist'])
Вывод:
Date ROE id hist
0 2013-06-30 0.02 1 NaN
1 2013-06-30 0.01 2 NaN
2 2013-09-30 0.05 1 NaN
3 2013-09-30 0.06 2 NaN
4 2013-09-30 0.04 3 NaN
5 2013-12-31 0.10 1 NaN
6 2013-12-31 0.05 2 NaN
7 2013-12-31 0.03 3 NaN
8 2014-03-31 0.11 1 0.051818
9 2014-03-31 0.06 2 0.051818
10 2014-03-31 0.04 3 0.051818