У меня есть DataFrame, который выглядит как:
f_period f_year f_month subject month year value
20140102 2014 1 a 1 2018 10
20140109 2014 1 a 1 2018 12
20140116 2014 1 a 1 2018 8
20140202 2014 2 a 1 2018 20
20140209 2014 2 a 1 2018 15
20140102 2014 1 b 1 2018 10
20140109 2014 1 b 1 2018 12
20140116 2014 1 b 1 2018 8
20140202 2014 2 b 1 2018 20
20140209 2014 2 b 1 2018 15
f_period
- это дата, когда был сделан прогноз для SKU (столбец subject
). Столбцы month
и year
- это период, на который был сделан прогноз. Например, в первой строке указано, что на 01/02/2018
модель прогнозировала установку 10
единиц продукта a
в месяце 1
года 2018
.
Я пытаюсь создать прогноз скользящего среднего на subject
, на month
для 2 f_months
. DataFrame должен выглядеть следующим образом:
f_period f_year f_month subject month year value mnthly_avg rolling_2_avg
20140102 2014 1 a 1 2018 10 10 13
20140109 2014 1 a 1 2018 12 10 13
20140116 2014 1 a 1 2018 8 10 13
20140202 2014 2 a 1 2018 20 17.5 null
20140209 2014 2 a 1 2018 15 17.5 null
20140102 2014 1 b 1 2018 10 10 13
20140109 2014 1 b 1 2018 12 10 13
20140116 2014 1 b 1 2018 8 10 13
20140202 2014 2 b 1 2018 20 17.5 null
20140209 2014 2 b 1 2018 15 17.5 null
Вещи, которые я пробовал:
Мне удалось получить mnthly_avg
по:
data_df['monthly_avg'] = data_df.groupby(['f_month', 'f_year', 'year', 'month', 'period', 'subject']).\
value.transform('mean')
Я пытался получить rolling_2_avg
:
rolling_monthly_df = data_df[['f_year', 'f_month', 'subject', 'month', 'year', 'value', 'f_period']].\
groupby(['f_year', 'f_month', 'subject', 'month', 'year']).value.mean().reset_index()
rolling_monthly_df['rolling_2_avg'] = rolling_monthly_df.groupby(['subject', 'month']).\
value.rolling(2).mean().reset_index(drop=True)
Это дало мне неожиданный вывод. Я не понимаю, как он рассчитал значения для rolling_2_avg
Как мне сгруппировать по subject
и month
, а затем отсортировать по f_month
, а затем взять среднее из следующих двухмесячных средних?