Machine Learning в Бизнесе - как просто сделать Прогноз Временных Рядов при помощи Prophet
Сначала разберём, что такое временной ряд — это важно для понимания. Временной ряд (time series) — это последовательность данных, которые собираются через равные интервалы времени. Например, ежедневные продажи в магазине, ежемесячный трафик на сайте или ежечасные метрики revenue. Такие данные имеют паттерны: тренд (общий рост или спад со временем), сезонность (повторяющиеся циклы, как пики продаж по выходным) и случайные шумы (непредсказуемые колебания).
Давайте представим, что у вас есть задача спрогнозировать, сколько можно ожидать выручки (GMV) в следующем квартале — типичный запрос от бизнеса. С этим отлично справится инструмент Prophet.
1️⃣ Устанавливаем нужные библиотеки:pip install pandas prophet holidays
2️⃣ Создаём и подготавливаем данные:import pandas as pd # Импортируем pandas — это библиотека для работы с таблицами данных (DataFrames)
import holidays # Импортируем holidays — библиотека для получения дат праздников в разных странах
# Создаём простой DataFrame с вымышленными данными: даты и значения KPI (y)
data = { # Это словарь — простой способ задать данные
'ds': ['2025-01-01', '2025-01-02', '2025-01-03', '2025-01-04', '2025-01-05'], # Колонка ds: даты в формате строки (потом преобразуем в настоящие даты)
'y': [100, 120, 110, 130, 105] # Колонка y: значения KPI, например, ежедневная сумма ставок
}
df_pred = pd.DataFrame(data) # Создаём DataFrame из словаря — теперь df_pred это таблица с колонками ds и y
df_pred['ds'] = pd.to_datetime(df_pred['ds']) # Преобразуем колонку ds в настоящий тип даты (datetime), чтобы Prophet мог с ней работать
3️⃣ Добавляем праздники (для России):
Prophet может учитывать праздники, чтобы прогноз был точнее. Мы выгружаем их автоматически и создаём таблицу.# Определяем диапазон лет на основе наших данных (от минимального года до максимального +1)
years = range(df_pred['ds'].min().year, df_pred['ds'].max().year + 1) # Здесь min() и max() находят самые раннюю и позднюю даты в ds
ru_holidays = holidays.RU(years=years) # Получаем словарь праздниками за эти годы (например, 1 января — 'New Year's Day')
# Преобразуем словарь в DataFrame для Prophet: колонки ds (дата) и holiday (название праздника)
df_holidays = pd.DataFrame(list(ru_holidays.items()), columns=['ds', 'holiday']) # list(ru_holidays.items()) превращает словарь в список пар (дата, название)
df_holidays['ds'] = pd.to_datetime(df_holidays['ds']) # Преобразуем ds в тип даты, как и в основных данных
4️⃣ Создаём и обучаем модель Prophet:
Важный момент: Prophet ожидает данные в конкретном формате — DataFrame обязательно должен иметь колонку 'ds' (с датами в формате datetime) и колонку 'y' (с числовыми значениями, которые вы прогнозируете). Если в ваших данных колонки названы иначе (например, 'date' и 'value'), переименуйте их перед обучением: df_pred = df_pred.rename(columns={'date': 'ds', 'value': 'y'}).
Теперь главная часть — модель. Мы укажем сезонность (еженедельную и годовую) и передадим праздники. Если праздники не нужны, просто напишите Prophet(..., holidays=None) — модель заработает без них, но может быть менее точной для данных с праздничными спадами.
5️⃣ Делаем прогноз на будущее:prediction_days = 200 # Задаём, сколько дней вперёд прогнозировать (здесь 200 — можно изменить)
future = model.make_future_dataframe(periods=prediction_days) # Создаём таблицу будущих дат: make_future_dataframe() берёт даты из df_pred и добавляет prediction_days новых
forecast = model.predict(future) # Делаем прогноз: predict() применяет модель к future и возвращает таблицу с предсказаниями (yhat — основное значение, плюс интервалы и компоненты)
6️⃣ Анализируем результаты: Агрегация по кварталам и расчёт отклонения:
Чтобы бизнесу было удобно смотреть (они любят квартальные отчёты), суммируем данные по кварталам и считаем процент отклонения (warn) от истинного значения — полезно, чтобы увидеть, насколько прогноз верно предсказывает. По хорошему, нужно из базового DataFrame взять рандомно 70% выборки и на ней обучить модель, а на остальных 30% проверить прогнозную модель и посчитать метрики отклонения, но это уже тема отдельного поста, можете почитать про это самостоятельно, сейчас обойдемся без этого.
# Добавляем колонку с кварталом (например, 2025Q1) для группировки
df_pred['quarter'] = df_pred['ds'].dt.to_period('Q') # dt.to_period('Q') превращает дату в квартал (Q значит quarter)
forecast['quarter'] = forecast['ds'].dt.to_period('Q') # То же самое для прогноза
# Суммируем реальные данные по кварталам
real_quarters = df_pred.groupby('quarter')['y'].sum().reset_index() # groupby() группирует по quarter, sum() суммирует y, reset_index() делает из этого новую таблицу
# Суммируем прогноз по кварталам
forecast_quarters = forecast.groupby('quarter')['yhat'].sum().reset_index() # Аналогично, но для yhat (предсказанное значение)
# Объединяем таблицы по кварталам (outer — чтобы включить все, даже если в одной нет данных)
all_quarters = pd.merge(real_quarters, forecast_quarters, how='outer', on='quarter', suffixes=('_actual', '_forecast')) # merge() соединяет, suffixes добавляют _actual и _forecast к колонкам
# Считаем отклонение в %: насколько прогноз (yhat) отличается от реала (y)
all_quarters['warn'] = ((all_quarters['yhat'] / all_quarters['y']) - 1) * 100 # Формула: (прогноз / реал - 1) * 100 = процент изменения
Это базовый пример — в реальности добавьте больше данных для точности. Тестируйте модель на исторических данных: разделите df_pred на "обучение" и "тест", чтобы проверить, насколько прогноз совпадает с реальностью.