Как работать с временными рядами в pandas — ресемплинг, скользящие окна, сдвиги?
- Что делает resample в pandas?
- Как посчитать скользящее среднее в pandas?
Индекс — DatetimeIndex (pd.to_datetime и set_index). resample("D") меняет частоту с агрегатом (события → сумма по дням, дни → недели). rolling(7) — скользящее окно (среднее за 7 последних точек; с индексом времени — rolling("7D")). shift(n) — сдвиг на n периодов, основа лаговых признаков. diff и pct_change — изменения. Часовые пояса — tz_localize / tz_convert.
- Пропущенные дни после resample — NaN; заполнять осознанно (0 для продаж, ffill для цен)
- Признак без утечки: rolling по сдвинутому ряду — shift(1).rolling(7)
- groupby("store").resample(...) — ресемплинг по каждому ряду
А ещё Ряд должен быть отсортирован по времени, иначе окна считаются неверно
Подробно
Пример: дневные продажи и признаки для прогноза.
df["ts"] = pd.to_datetime(df["ts"])
daily = (df.set_index("ts")
.groupby("store")["amount"]
.resample("D").sum()
.reset_index())
g = daily.groupby("store")["amount"]
daily["lag_7"] = g.shift(7)
daily["mean_7"] = g.transform(lambda s: s.shift(1).rolling(7).mean())
daily["dow"] = daily["ts"].dt.dayofweek
Утечка горизонта. Если прогноз делается на 7 дней вперёд, все признаки должны использовать данные не позже дня прогноза: лаг меньше горизонта для дальних дней уже недоступен.
Что хотят услышать
- DatetimeIndex, resample, rolling, shift.
- Заполнение пропусков после ресемплинга.
- Лаговые признаки без утечки.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗rolling(7).mean() без сдвига — безопасный признак: окно ведь состоит из прошлых значений
- ✓resample меняет частоту, rolling — скользящее окно, shift — лаги; признаки строят по сдвинутому ряду
- ✗resample работает с любым индексом, DatetimeIndex не нужен
- ✗Пропуски после resample всегда нужно заполнять нулями
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.