Сгруппированы 3 ежемесячных периода агрегации и сдвига в pandas python

#python #pandas

#python #pandas

Вопрос:

Проблема

У меня есть фрейм данных со многими регионами и их соответствующими проданными единицами, выполненными посещениями и средним временем посещения на ежемесячной основе. Не все регионы имеют одинаковую дату начала.

Итак, моя таблица выглядит примерно так:

 Region    Month       Visits  Average_minutes  Units_sold
Region_1  2018.01.01  12      2.22             120
Region_1  2018.02.01  10      2.02             108
Region_2  2017.04.01  4       1.8              60
Region_2  2017.05.01  4       1.6              56
Region_2  2017.06.01  3       1.5              58
Region_1  2018.03.01  11      2.1              103
Region_3  2018.04.01  3       2.22             20
Region_3  2018.05.01  2       2                22
Region_2  2017.07.01  6       1.7              61
Region_1  2018.04.01  14      2.1              125
Region_3  2018.06.01  3       2.3              21
Region_3  2018.07.01  3       2.4              19
Region_1  2018.05.01  10      2.12             116
Region_2  2017.08.01  3       2.1              55
  

Что я хотел бы иметь, так это агрегировать ежемесячные данные для разных регионов с периодичностью в 3 месяца, сдвигая на один месяц вперед.

Итак, если мы возьмем, к примеру, Region_1, конечный результат, который я хотел бы получить, будет примерно таким:

 Region    Date        Visits  Average_minutes  Units_sold  3M_shift
Region_1  2018.01.01  33      2.11             331         0
Region_1  2018.04.01  24      2.11             241         0
Region_1  2018.02.01  35      2.07             336         1
Region_1  2018.05.01  10      2.12             116         1
Region_1  2018.02.01  35      2.07             336         2
Region_1  2018.05.01  10      2.12             116         2
  

Как вы можете видеть, дата теперь содержит начальную дату трехмесячной периодичности, а в столбце 3M_shift я вижу изменения, сделанные по сравнению с первым доступным месяцем.

Конечно, в таблице выше вы можете видеть только Region_1, но я хотел бы получить этот результат для всех групп.

Дополнительная информация

Итак, я хотел бы, чтобы данные по группам агрегировались не только по кварталам рабочего года, но и с периодичностью в 3 месяца, сдвигаясь на один месяц вперед для каждой итерации, пока я не доберусь до последнего месяца.

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

 grp = joined.groupby(['Region', pd.Grouper(key="Date", freq='3M')]).agg({"Visits":"sum", "Average_minutes":"mean", "Units_sold":"sum"})
  

Итак, для Region_1, например, я получаю этот результат:

 Region  Date          Visits  Average_minutes  Units_sold
Region_1  2018.01.01  33      2.11             331
Region_1  2018.04.01  24      2.11             241
  

Редактировать:
Добавлена лучшая визуализация того, что я хотел бы получить.

На картинке ниже вы можете видеть, что я имею в виду. Зеленая часть — это то, что у меня есть на данный момент. Я хотел бы создать цикл для розовой части, но я не знаю, как это сделать.

введите описание изображения здесь

Не могли бы вы, пожалуйста, помочь мне получить желаемый результат?

Заранее большое вам спасибо!

Ответ №1:

Я не уверен на 100%, что вы ищете, но, как я интерпретирую, может быть, это поможет?

Сначала отсортируйте регион и месяц.

 df = df.sort_values(['Region', 'Month'])
  

Установлен мультииндекс.

 df = df.set_index(['Region', 'Month'])
  

Затем сгруппируйте по региону и примените скользящее окно для агрегирования и сдвиньте его на два периода назад.

 df = df.groupby(level='Region').apply(lambda x: x.rolling(window=3).agg({"Visits":"sum", "Average_minutes":"mean", "Units_sold":"sum"}).shift(-2))
  

Результатом является:

                      Visits  Average_minutes  Units_sold
Region   Month                                          
Region_1 2018.01.01    33.0         2.113333       331.0
         2018.02.01    35.0         2.073333       336.0
         2018.03.01    35.0         2.106667       344.0
         2018.04.01     NaN              NaN         NaN
         2018.05.01     NaN              NaN         NaN
Region_2 2017.04.01    11.0         1.633333       174.0
         2017.05.01    13.0         1.600000       175.0
         2017.06.01    12.0         1.766667       174.0
         2017.07.01     NaN              NaN         NaN
         2017.08.01     NaN              NaN         NaN
Region_3 2018.04.01     8.0         2.173333        63.0
         2018.05.01     8.0         2.233333        62.0
         2018.06.01     NaN              NaN         NaN
         2018.07.01     NaN              NaN         NaN
  

Комментарии:

1. Привет, исчерпание. Большое вам спасибо за ваш комментарий. К сожалению, ваше решение не то, что я ищу. Моя ошибка в том, что я не смог четко объяснить, что я хотел бы получить. Для большей наглядности я добавил картинку внизу моего исходного поста, чтобы обеспечить лучшее понимание того, чего я хотел бы достичь. Надеюсь, это будет более понятно! Спасибо!

2. Может ли кто-нибудь помочь мне с этой проблемой, пожалуйста?

3. Я хотел бы помочь купить, я все еще не совсем понимаю, что вы ищете. Не могли бы вы предоставить четкий образец таблицы результатов / фрейма данных, чтобы я знал, чего вы пытаетесь достичь? Например, мне кажется, что сдвиг на 3 месяца в вашей таблице совпадает с зеленым столбцом. Я не понимаю. Также таблица результатов для первого региона повторяет одни и те же данные из строк 3: 4 в строках 5: 6, что также сбивает с толку. Если бы вы могли четко указать предполагаемые результаты, мы могли бы взглянуть на это еще раз.

4. Еще раз спасибо run-out за ваше намерение. Итак, ваше решение хорошо в качестве первого шага к тому, чего я хочу достичь. В основном ваше решение агрегирует данные на основе 3-месячного окна, а затем сдвигает его назад на два месяца. Это было бы первым шагом для меня. Следующим шагом для меня было бы удалить месяц 2018.01.01 для Region_1 (как если бы он не существовал), а затем снова выполнить тот же процесс (3 окна, -2 смены). Затем снова удалите данные 2018.02.01 и повторите процесс (3 окна, -2 смены) снова. То же самое для Region_2, только в случае Region_2 дата начала — 2017.04.01.

5. Итак, в принципе, я хотел бы выполнить вашу группировку, а затем удалить первую строку данных и повторить весь процесс (начиная со второго месяца в качестве отправной точки, потому что я удалил первый месяц).). Легче ли это понять?