首页 > 解决方案 > 查找按日期和产品分组的最近 n 天的平均值

问题描述

我有一个如下所示的数据集:

   date        id   score
0  2016-04-01  A    1.0
1  2016-04-01  B    2.0
2  2016-04-02  C    1.0
3  2016-04-02  A    3.0
4  2016-04-03  B    4.5
5  2016-04-04  C    1.0
6  2016-04-05  A    2.0
7  2016-04-06  B    3.0
8  2016-04-06  C    6.0

我想计算过去 N 天的平均值,不包括今天,按日期和产品分组,因此 n=4 的结果如下所示:

       date        id   mean_of_last_n_days
    0  2016-04-01  A    NaN
    1  2016-04-01  B    NaN
    2  2016-04-02  C    0
    3  2016-04-02  A    1.0
    4  2016-04-03  B    2.0
    5  2016-04-04  C    1.0
    6  2016-04-05  A    2.0
    7  2016-04-06  B    3.25
    8  2016-04-06  C    1.0

有什么建议吗?

标签: pythonpandasgroup-bymoving-average

解决方案


您可以按 分组id并使用pd.shift将所有值移动一个位置,因此当您id再次分组并采用特定窗口的滚动平均值时,它只考虑最后一个n元素:

n=4
df.score = df.groupby('id', sort=False).shift(1).score
df.groupby('id').rolling(f'{n} D', on = 'date').mean().reset_index()

  id       date  score
0  A 2016-04-01    NaN
1  A 2016-04-02   1.00
2  A 2016-04-05   2.00
3  B 2016-04-01    NaN
4  B 2016-04-03   2.00
5  B 2016-04-06   3.25
6  C 2016-04-02    NaN
7  C 2016-04-04   1.00
8  C 2016-04-06   1.00

推荐阅读