Введение
Временные ряды — это, по сути, любые данные, которые меняются во времени: трафик на сайт, продажи, погода, количество багов в Jira, твои деплойменты в пятницу вечером (шутка, не деплой в пятницу). Умение прогнозировать такие штуки — не просто прикольный скилл, а реальная необходимость для бизнеса, аналитиков и даже DevOps-ов. Одна из самых популярных моделей для этого — ARIMA. Она не новая, зато проверенная и работает даже там, где fancy нейросети бессильны или избыточны.
Возможности
- Прогнозирование будущих значений временного ряда (например, сколько пользователей будет завтра).
- Анализ сезонности и трендов.
- Работает на классических данных без GPU и большой инфраструктуры.
- Можно использовать для аномалий, capacity planning и прочих devops-радостей.
Что требуется
- ОС: Linux, macOS, Windows — всё, где крутится Python.
- Железо: Любой современный ноут/сервер, оперативки хватит 2 ГБ (реально, ARIMA не прожорлива).
- Python: 3.7+
- Библиотеки:
statsmodels
,pandas
,matplotlib
(для графиков, если хочется красиво).
Установка — пошаговая инструкция
- Создай виртуальное окружение (по желанию, но лучше так):
python3 -m venv arima-env source arima-env/bin/activate # Linux/macOS arima-env\Scripts\activate # Windows
- Поставь необходимые библиотеки:
pip install pandas matplotlib statsmodels
Если у тебя проблемы с pip — обнови его:
python -m pip install --upgrade pip
- Проверь, что всё ок:
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. Удачи в прогнозах, и не забывай: лучший способ узнать будущее — его построить (или хотя бы спрогнозировать)!
Ваш отзыв