#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. Итак, в принципе, я хотел бы выполнить вашу группировку, а затем удалить первую строку данных и повторить весь процесс (начиная со второго месяца в качестве отправной точки, потому что я удалил первый месяц).). Легче ли это понять?