Pandas groupby-агрегация не работает после операции shift()

#python #pandas #dataframe #aggregation #shift

Вопрос:

Я анализировал проект Kaggle и обнаружил ниже несоответствие:

У нас есть данные о продажах для магазина (1, 2, 3) и товаров (1, 2, 3, 4, 5). Первоначальный автор хотел рассчитать сумму и среднее значение для каждой комбинации магазина, товара и периода (месяц/год). и поскольку он/она считал, что при прогнозировании продаж за текущий месяц мы должны видеть только предыдущие месяцы, он/она решил сместить векторы продаж на 1. Но это вызывает проблему, из-за которой продажи в прошлом месяце для продукта 1 магазина 1 1 становятся частью продукта 2 магазина 1.

 data.groupby(["store", "item", "period"]).sales.agg(["sum", "mean"]).shift(1)
 

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

 data.groupby(["store", "item", "period"]).sales.shift(1).agg(["sum", "mean"])
 

Просмотр результатов из второй строки кода очень удивляет меня. похоже, что агрегация не учитывала индексацию groupby после выполнения shift.

Скриншот, показывающий код и вывод:

Кто-нибудь испытывал что-нибудь подобное? действительно ли сдвиг удаляет индексацию из операции groupby?

Редактировать:

добавление ссылки на оригинальную книгу kaggle: https://www.kaggle.com/ekrembayar/store-item-demand-forecasting-with-lgbm

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

1. Вы не могли бы опубликовать код или поделиться ссылкой на записную книжку?

2. Результатом groupby agg является (как правило) фрейм данных, поэтому использование shift after groupby agg DataFrame.shift не Groupby.shift является (именно поэтому весь фрейм смещается не только внутри групп). То же самое верно и в другом случае Groupby.shift , после DataFrame.agg чего вы получите сумму и среднее значение для всего кадра данных. Вам нужно будет использовать несколько групп для выполнения обеих операций в группе.

3. @Luke добавил ссылку, спасибо!

4. @HenryEcker твое объяснение в точку! может быть, еще одна мысль, которую вы можете помочь, вы знаете, что shift отлично работает с функцией rolling (), поэтому, если вы перемещаете группу и выполняете прокатку после этого, вы не перекрываете группы, определенные в группе; поэтому объект dataframe.shift все еще сохраняет информацию об индексе groupby? df.groupby([«магазин», «товар»]).sales.shift(1).прокатка(i).среднее значение().значения

Ответ №1:

Вы можете попробовать использовать 2 groupby() последовательно, следующим образом:

 (data.groupby(["store", "item", "period"]).sales.shift(1)
     .groupby([df["store"], df["item"], df["period"]]).agg(["sum", "mean"])
)
 

Таким образом, нам не нужно изменять исходные значения sales , и все же мы можем получить желаемый результат.

Ответ №2:

Попробуйте что-нибудь вроде:

 data['sales'] = data.groupby(["store", "item", "period"]).sales.transform('shift')
print(data.groupby(["store", "item", "period"]).sales.agg(["sum", "mean"]))