Применение функции скользящего среднего к фреймам данных с дублированными индексами в пандах
Мне сложно использовать функцию 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
немного