查找按日期和产品分组的最近n天的平均值

时间:2018-12-19 13:51:31

标签: python pandas group-by moving-average

我有一个看起来像这样的数据集:

   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

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您可以按id分组并使用pd.shift将所有值平移一个位置,因此当您再次按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 个元素考虑在内:

IEnumerator<Vector3> Positions()
{
    for (int i = 0; i < _positions.Length / 3; ++i)
    {
        yield return new Vector3(_positions[3*i],
                                 _positions[3*i+1],
                                 _positions[3*i+2]);
    }
}

答案 1 :(得分:1)

df.groupby('id').apply(lambda grp:
                         grp.rolling('5d', on = 'date', closed = 'left').agg('mean'))

>>>> df

    date    id  score
0   2016-04-01  A   NaN
1   2016-04-01  B   NaN
2   2016-04-02  C   NaN 
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

您确定您的第一个“ C”应该为0吗?