Время прочтения: 3 мин.
Prophet — это библиотека с открытым исходным кодом от компании Facebook*. Она предназначена для прогнозирования временных рядов. По словам разработчиков (команды Core Data Science team) данный инструмент хорошо работает с рядами, которые имеют ярко выраженные сезонные эффекты, а также имеют несколько таких периодов. Prophet устойчив к отсутствию данных и достаточно хорошо справляется с выбросами. Библиотека во многом наследует «стиль» sklearn со своими fit и predict. Для примера рассмотрим стандартный для таких задач датасет с продажей австралийского вина с 1980 г. по 1995 г. Для начала установим библиотеку:
pip install fbprophet
Импортируем нужные библиотеки:
import pandas as pd
import fbprophet
import matplotlib.pyplot as plt
Загружаем датасет (данные с периодом в один месяц) и посмотрим информацию о нем, так как данные обычно загружаются в формате строки:
df = pd.read_csv('monthly-australian-wine-sales.csv')
df.info()
Установим формат даты:
df['month'] = pd.to_datetime(df['month'])
Отрисуем данные:
plt.plot(df['month'], df['sales']);
Важно отметить, что библиотека от нас ожидает два столбца с названиями ds (даты) и y (целевые значения), в противном случае может получиться ошибка, поэтому переименуем:
df.rename(columns = {'month':'ds', 'sales':'y'}, inplace = True)
Создаем модель, в наших данных есть явная годовая сезонность и нет дневной, так как данные предоставлены за каждый месяц, обучаем:
model = fbprophet.Prophet(yearly_seasonality = True, daily_seasonality = False, seasonality_mode = 'multiplicative')
model.fit(df);
Для предсказания возьмем 12 периодов (месяцев):
future = model.make_future_dataframe(periods = 12, freq = 'm')
forecast = model.predict(future);
Также можем посмотреть на трендовую и годовую компоненты в отдельности:
model.plot_components(forecast);
Посмотрим на полученный результат:
model.plot(forecast);
График достаточно точно описывает тенденцию продаж. Объединим весь код выше в один и построим предсказание на 3 и 5 лет вперед соответственно:
for period in [36, 60]:
m = fbprophet.Prophet(yearly_seasonality = True,
daily_seasonality = False,
seasonality_mode = 'multiplicative')
m.fit(df)
future = m.make_future_dataframe(periods = period, freq = 'm')
forecast = m.predict(future)
m.plot(forecast);
Для своеобразного решения «из коробки» вполне приличные результаты. Данная библиотеке имеет возможность строить интерактивные графики с помощью plotly для более подробного анализа временного ряда (особенно полезно для анализа больших временных рядов). У графиков можно менять масштаб, сохранять отдельные участки графика, при наведении на точку можем видеть дополнительную информацию.
from fbprophet.plot import plot_plotly
plot_plotly(m, forecast)
В конце стоит отметить, что для рядов с явной годовой сезонностью библиотека показывает хорошие результаты, а в связке с plotly представляет отличный инструмент для анализа временных рядов.
* — Признана экстремистской организацией и запрещена на территории Российской Федерации