Применение функции скользящего среднего к фреймам данных с дублированными индексами в пандах

Мне сложно использовать функцию pd.rolling_mean для следующего фрейма данных, содержащего дублированные индексы:

               amount
    20140101    3
    20140102    4
    20140103    3
    20140103    5
    20140103    1
    20140104    5
    20140105    6
    20140106    2
    …

Мне нужно рассчитать среднее значение за 3 дня, например, среднее значение из 20140101 в 20140103 должно быть (3+4+3+5+1)/5=3.2средняя сумма с 20140104 по 20140106 должна быть (5+6+2)/3=4.3

кто нибудь знает как это сделать? Заранее спасибо!

2 ответа

Решение

Ты можешь сделать:

>>> df
          amount
20140101       3
20140102       4
20140103       3
20140103       5
20140103       1
20140104       5
20140105       6
20140106       2
>>> xf = df.groupby(level=0)['amount'].agg(['sum', 'count'])
>>> xf
          sum  count
20140101    3      1
20140102    4      1
20140103    9      3
20140104    5      1
20140105    6      1
20140106    2      1
>>> pd.rolling_sum(xf['sum'], 3, 0) / pd.rolling_sum(xf['count'], 3, 0)
20140101    3.000
20140102    3.500
20140103    3.200
20140104    3.600
20140105    4.000
20140106    4.333
dtype: float64

и вы получите 3.2 а также 4.3 за 20140103 а также 20140106 соответственно.

Если ваш столбец даты уже является датой-временем и является индексом, вы можете просто позвонить rolling_mean:

In [15]:

pd.rolling_mean(df['amount'], window=1,  freq='3d')
Out[15]:
date
2014-01-01    3.200000
2014-01-04    4.333333
Freq: 3D, dtype: float64

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

df.index = pd.to_datetime(df.index.astype(str), '%Y%m%d')

Это в случае, если индекс на самом деле dtype int64, если это уже строка, то вы можете игнорировать astype немного

Другие вопросы по тегам