Панды Скользящее среднее с GroupBy и Sort - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть 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, а затем взять среднее из следующих двухмесячных средних?

1 Ответ

0 голосов
/ 01 ноября 2018

Если я не понимаю, это кажется проще, чем то, что вы сделали. Как насчет этого?

grp = pd.DataFrame(df.groupby(['subject', 'month', 'f_month'])['value'].sum())
grp['rolling'] = grp.rolling(window=2).mean()
grp

Выход:

                          value rolling
subject     month   f_month         
a              1    1       30  NaN
               2            35  32.5
b              1    1       30  32.5
               2            35  32.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...