Какие методы вы использовали для работы с временными рядами?

«Какие методы вы использовали для работы с временными рядами?» — вопрос из категории Временные ряды, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В своих проектах я применял следующий стек методов для прогнозирования временных рядов:

1. Классические статистические модели (Statsmodels):

  • ARIMA/SARIMA: Для учета авторегрессии, скользящего среднего, нестационарности (через дифференцирование) и сезонности. Использовал auto_arima для автоматического подбора параметров (p,d,q).
  • ETS (Error, Trend, Seasonal): Экспоненциальное сглаживание, хорошо работающее на рядах с выраженным трендом и сезонностью.

2. Машинное обучение на сконструированных признаках (Feature Engineering):

  • Создавал лаги (lag_1, lag_7, lag_30), скользящие статистики (среднее, стандартное отклонение за окно), календарные признаки (день недели, месяц, праздник).
  • Обучал на этих признаках модели XGBoost или LightGBM, которые часто превосходят классические методы на сложных рядах.

3. Глубокое обучение (PyTorch/TensorFlow):

  • LSTM/GRU: Рекуррентные сети для учета долгосрочных зависимостей. Использовал архитектуры с несколькими слоями и dropout для регуляризации.
  • Transformer-based модели (например, TFT - Temporal Fusion Transformer): Для учета как временных зависимостей, так и статических/известных будущих признаков (например, календарь).

Пример подготовки данных для ML-подхода:

import pandas as pd

# Допустим, df имеет колонку 'value' и индекс datetime
df['lag_1'] = df['value'].shift(1)
df['rolling_mean_7'] = df['value'].shift(1).rolling(7).mean()
df['day_of_week'] = df.index.dayofweek
df = df.dropna()  # Удаляем строки с NaN после создания лагов

# Теперь X = [lag_1, rolling_mean_7, day_of_week], y = value
# Данные готовы для обучения XGBoostRegressor

Выбор метода зависит от объема данных, наличия сезонности, тренда и требуемой точности прогноза.