#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
aftergroupby 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"]))