Прогнозирование временных рядов: ARIMA модель в Python

Введение

Временные ряды — это, по сути, любые данные, которые меняются во времени: трафик на сайт, продажи, погода, количество багов в Jira, твои деплойменты в пятницу вечером (шутка, не деплой в пятницу). Умение прогнозировать такие штуки — не просто прикольный скилл, а реальная необходимость для бизнеса, аналитиков и даже DevOps-ов. Одна из самых популярных моделей для этого — ARIMA. Она не новая, зато проверенная и работает даже там, где fancy нейросети бессильны или избыточны.

Возможности

  • Прогнозирование будущих значений временного ряда (например, сколько пользователей будет завтра).
  • Анализ сезонности и трендов.
  • Работает на классических данных без GPU и большой инфраструктуры.
  • Можно использовать для аномалий, capacity planning и прочих devops-радостей.

Что требуется

  • ОС: Linux, macOS, Windows — всё, где крутится Python.
  • Железо: Любой современный ноут/сервер, оперативки хватит 2 ГБ (реально, ARIMA не прожорлива).
  • Python: 3.7+
  • Библиотеки: statsmodels, pandas, matplotlib (для графиков, если хочется красиво).

Установка — пошаговая инструкция

  1. Создай виртуальное окружение (по желанию, но лучше так):
    python3 -m venv arima-env
    source arima-env/bin/activate  # Linux/macOS
    arima-env\Scripts\activate     # Windows
  2. Поставь необходимые библиотеки:
    pip install pandas matplotlib statsmodels

    Если у тебя проблемы с pip — обнови его:

    python -m pip install --upgrade pip
  3. Проверь, что всё ок:
    python -c "import statsmodels; import pandas; import matplotlib"

    Если ошибок нет — ты готов к магии.

Использование: полный список команд и вариантов

Давай на примере. Возьмём какой-нибудь временной ряд (например, встроенный в pandas датасет — авиапассажиры).

import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA

# Данные (можно свои CSV подгрузить)
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv"
df = pd.read_csv(url, parse_dates=['Month'], index_col='Month')

# Быстрый график
df.plot()
plt.title('Airline Passengers')
plt.show()

# ARIMA(p, d, q) — параметры:
# p = порядок авторегрессии (AR)
# d = порядок дифференцирования (I)
# q = порядок скользящего среднего (MA)
# Обычно подбирают через AIC/BIC, но для старта — (2,1,2)
model = ARIMA(df['Passengers'], order=(2,1,2))
model_fit = model.fit()

# Прогноз на 12 месяцев вперёд
forecast = model_fit.forecast(steps=12)
print(forecast)

# Визуализация прогноза
plt.figure(figsize=(10,5))
plt.plot(df.index, df['Passengers'], label='Исторические данные')
plt.plot(pd.date_range(df.index[-1], periods=13, freq='MS')[1:], forecast, label='Прогноз', color='red')
plt.legend()
plt.show()

Другие полезные команды:

  • model_fit.summary() — статистика модели
  • model_fit.resid — остатки (для анализа ошибок)
  • model_fit.predict(start, end) — прогноз на диапазон дат

Параметры order:

  • p: Количество лагов в AR (пробуй 0-5)
  • d: Сколько раз дифференцировать (0 — если ряд стационарен, 1 — если тренд есть)
  • q: Количество лагов в MA (0-5)

Автоматический подбор параметров: Можно юзать pmdarima (pip install pmdarima), но для старта руками — полезней для понимания.

Ошибки, как делать не надо

  • Не скармливай ARIMA сырые нестационарные данные — будет плохо. Смотри на график, делай дифференцирование (d>0), если есть тренд.
  • Не забывай про сезонность! ARIMA — не SARIMA. Если у тебя явная сезонка (например, продажи по месяцам), смотри в сторону SARIMA.
  • Не используй слишком большие p, d, q — модель может переобучиться и выдавать чушь.
  • Не пихай в модель пропуски и NaN — чисти данные перед этим.
  • Не забывай валидировать модель на тестовой выборке (train/test split).

Пример реального использования в окружении

Реальный кейс: capacity planning для серверов. Допустим, у тебя есть лог CPU usage по дням. Ты хочешь понять, когда пора апгрейдить железо. Собираешь метрику, строишь временной ряд, учишь ARIMA, прогнозируешь на 30 дней вперёд. Если видишь, что через 2 недели CPU будет стабильно выше 80% — пора писать начальству.

# Пример с использованием своих метрик
df = pd.read_csv("cpu_usage.csv", parse_dates=['date'], index_col='date')
df['cpu'].plot()
plt.show()

model = ARIMA(df['cpu'], order=(1,1,1))
model_fit = model.fit()
forecast = model_fit.forecast(steps=30)
plt.plot(df['cpu'])
plt.plot(pd.date_range(df.index[-1], periods=31, freq='D')[1:], forecast, color='red')
plt.show()

Работает быстро, не требует облаков и ML Ops, а результат — понятный и actionable.

Заключение

ARIMA — это олдскульно, но чертовски полезно. Для большинства задач прогнозирования временных рядов не нужно городить сложные пайплайны — хватает пары строк на Python. Если хочется автоматизации — смотри в сторону statsmodels и pmdarima. Для глубины — читай Forecasting: Principles and Practice (на английском, но must-have).

Если остались вопросы — гугли, спрашивай на Stack Overflow, или ищи похожие топики на Хабре и Reddit. Удачи в прогнозах, и не забывай: лучший способ узнать будущее — его построить (или хотя бы спрогнозировать)!

Хотите прочитать больше про Администрирование?
Отзывов нет.

Ваш отзыв

Пожалуйста, заполните поля снизу и добавьте отзыв!.
Имя *
E-mail *
Сайт
Сообщение *