Окна во временных рядах: ловушки
Вопрос
Какие ошибки чаще всего делают с shift и rolling на временных рядах и как их избежать?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Не отсортированы данные по времени
Сдвиг через границы групп: нужен `groupby().shift`
Пропуски дат: окно по строкам вместо `"7D"` или `asfreq`
Утечка будущего: `center=True`, `shift(-1)`, окно, включающее текущий день
`min_periods` и NaN в начале ряда
MultiIndex после `groupby().rolling()`
Что могут спросить следом
- Как построить признак «среднее за прошлую неделю» без утечки?
- Как обработать дни без продаж: 0 или пропуск?
Разбор
Первое: данные должны быть отсортированы по времени, иначе shift и cumsum считают ерунду. Второе: если рядов несколько, все окна делаю через groupby, иначе значения перетекают между клиентами. Третье: пропуски дат. rolling(7) это семь строк, а не семь дней, поэтому либо достраиваю календарь через asfreq("D") или reindex с явным решением, ноль это или пропуск, либо беру окно "7D". Четвёртое, самое опасное для моделей: утечка будущего. center=True, shift(-1) и окно, включающее день прогноза, дают отличную валидацию и плохой прод, поэтому признаки строю как shift(1).rolling(7). И мелочи: NaN в начале ряда из-за min_periods и MultiIndex после groupby().rolling(), который надо сбросить перед присвоением.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.