Нахождение среднего значения за последние n дней, сгруппированных по дате и продукту - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть набор данных, который выглядит следующим образом:

   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 голосов
/ 19 декабря 2018
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?

0 голосов
/ 19 декабря 2018

Вы можете сгруппировать по 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
...