Короткий ответ
resample('W') или resample('M') на DataFrame с datetime-индексом группирует данные по календарным периодам и применяет агрегатную функцию, но интерпретировать итог нужно с учётом неравной длины периодов и присутствия праздников/выходных, которые систематически меняют уровень метрики.
Как это работает подробнее
resample требует, чтобы индекс DataFrame был datetime, и разбивает временной ряд на бины фиксированной длительности (неделя, месяц), а затем применяет sum/mean/count и так далее к каждому бину; в отличие от groupby по произвольному столбцу, resample учитывает календарную природу дат, включая дни без единой записи (может потребоваться fillna(0) для таких дней).
Пример кода
question-136.py
import pandas as pd
df = pd.DataFrame({
'date': pd.date_range('2024-01-01', periods=10, freq='D'),
'sales': [100, 110, 90, 95, 105, 300, 310, 295, 100, 110]
})
weekly = df.set_index('date').resample('W').sum()
print(weekly)Что использовать на практике
- Практика. при сравнении, например, выручки по месяцам нужно учитывать разное число дней и разное число рабочих/праздничных дней в месяце; для недельной агрегации важно явно выбрать день начала недели, иначе сравнение "такая же неделя прошлого года" может быть не вполне корректным при расхождении границ недели.
- Проверка. стоит проверить, не совпадает ли резкий рост во второй неделе с праздничным периодом в календаре — без такой проверки легко сделать неверный вывод о "естественном росте продаж".
Подводные камни
- Частая ошибка. сравнивают абсолютные суммы по месяцам без нормализации на число дней, делая неверный вывод о "росте", который на самом деле объясняется просто более длинным месяцем; не учитывают локальные праздники при интерпретации недельных провалов/всплесков, принимая сезонный эффект за реальный сдвиг в поведении пользователей.