Почему время меняет саму природу задачи
Во многих табличных задачах строки можно условно переставить местами, и смысл почти не изменится. Во временных рядах это невозможно. Порядок наблюдений становится частью самой информации. Вчера, сегодня и завтра — это не просто три строки, а три разных состояния процесса. Из-за этого временной ряд требует другого мышления: важно не только, какие значения мы видим, но и как они меняются во времени.
Именно поэтому time series нельзя воспринимать как обычный ML с дополнительной колонкой `date`. Время здесь — не метка, а структура зависимости.
Что именно мы пытаемся предсказать
$$ y_t = f(y_{t-1}, y_{t-2}, \ldots, x_t) $$Во временных рядах текущее значение часто зависит от предыдущих состояний процесса и от внешних факторов в текущий момент. То есть прошлое становится частью входа для прогноза будущего.
y_t— значение ряда в текущий момент времениy_{t-1}, y_{t-2}— предыдущие состояния ряда, от которых зависит прогнозx_t— внешние признаки или факторы в текущий моментf— правило или модель, связывающая прошлое и настоящее
Эта запись полезна тем, что сразу показывает ключевую разницу: в обычном ML объект часто рассматривается как независимый, а во временных рядах зависимость между соседними моментами времени почти всегда существенна.
Почему обычная валидация здесь опасна
Если случайно перемешать временной ряд и сделать обычный train/test split, модель может увидеть будущее в обучении и прошлое в тесте. Это ломает честность оценки. Во временных рядах train всегда должен быть раньше validation. Иначе мы проверяем не умение предсказывать будущее, а способность подглядывать в него через неправильное разбиение.
Из этой же логики растут лаги, rolling features, скользящие средние и time-based validation. Все они не просто инженерные приемы, а попытка сохранить причинный порядок данных.
Как выглядит минимальный пример
import pandas as pd # создаем простой временной ряд с дневными продажами
series = pd.Series([100, 105, 98, 110, 120, 125, 123], index=pd.date_range('2026-01-01', periods=7)) # задаем наблюдения по дням
frame = pd.DataFrame({'sales': series}) # превращаем ряд в таблицу для feature engineering
frame['lag_1'] = frame['sales'].shift(1) # добавляем значение предыдущего дня как признак
frame['rolling_mean_3'] = frame['sales'].rolling(3).mean() # считаем скользящее среднее за три дня
print(frame) # смотрим, как время превращается в признаки, а не просто в индексКак только появляется такая таблица, становится видно, почему time series — это отдельный способ думать. Мы не просто берем значения. Мы учимся извлекать из прошлого те сигналы, которые помогут предсказать следующий шаг процесса.