Прогнозирование временных рядов с помощью Prophet в Python 3

Published by Leave your thoughts

В предыдущих руководствах мы писали об управлении временными рядами и прогнозировании с помощью ARIMA.

Однако подбор правильных параметров ARIMA в Python – довольно сложный и трудоёмкий процесс. Другие статистические языки программирования (такие как R) предоставляют автоматизированные способы решения этой проблемы, но пока что они не были официально перенесены в Python. К счастью, команда Core Data Science из Facebook недавно предложила новый метод Prophet, который позволяет аналитикам и разработчикам выполнять прогнозирование в Python 3.

Требования

  • Локальный или удалённый компьютер.
  • 2 Гб памяти (для работы с большими объёмами данных необходимо иметь много оперативной памяти).
  • Jupyter Notebook (инструкции по установке можно найти здесь).

1: Загрузка данных и установка пакетов

Разверните среду разработки:

cd environments
. my_env/bin/activate

Читайте также:

Создайте каталог для проекта и откройте его (в руководстве он называется timeseries, но вы можете выбрать другое название).

mkdir timeseries
cd timeseries

Для работы можно использовать этот набор данных о пассажирах авиакомпании, который содержит временные ряды о ежемесячном количестве пассажиров авиакомпании в период с 1949 по 1960 год. Вы можете сохранить данные с помощью curl и флага –O (он поместит вывод в файл и загрузит CSV):

curl -O https://assets.digitalocean.com/articles/eng_python/prophet/AirPassengers.csv

Для работы понадобятся библиотеки pandas, matplotlib, numpy, cython и fbprophet. Как и большинство других пакетов Python, pandas, numpy, cython и matplotlib можно установить с помощью пакетного менеджера pip.

pip install pandas matplotlib numpy cython

Библиотека fbprophet зависит от языка программирования STAN, потому сначала нужно установить pystan (оболочку Python для STAN).

pip install pystan

После этого можно установить Prophet с помощью pip:

pip install fbprophet

2: Импорт пакетов и данных

Запустите Jupyter Notebook, чтобы начать работу с данными:

jupyter notebook

Чтобы создать документ, выберите в выпадающем меню New → Python 3.

Создав документ, вы можете импортировать в него загруженные библиотеки.

Укажите список используемых библиотек в начале документа (вместо полных имен можно указать сокращённые):

%matplotlib inline
import pandas as pd
from fbprophet import Prophet
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')

Кроме того, нужно определить стиль matplotlib (в данном случае используется fivethirtyeight).

Примечание: После каждого блока кода в данном руководстве нужно нажимать ALT + ENTER, чтобы запустить код и перейти к следующему блоку.

После этого нужно загрузить временные ряды. Загрузите файл CSV и отобразите его первые 5 строк:

df = pd.read_csv('AirPassengers.csv')
df.head(5)

Теперь DataFrame содержит столбцы Month и AirPassengers.

Читайте также: Использование пакета pandas в Python 3

Согласно требованиям библиотеки Prophet, поступающий в качестве ввода DataFrame должен содержать столбец с информацией о времени и столбец, содержащий метрику, которую нужно спрогнозировать. Важно отметить, что столбец времени должен содержать данные типа datetime. Проверьте тип столбцов:

df.dtypes
Month            object
AirPassengers     int64
dtype: object

Столбец Month содержит данные другого типа, не datetime, поэтому его нужно конвертировать:

df['Month'] = pd.DatetimeIndex(df['Month'])
df.dtypes
Month            datetime64[ns]
AirPassengers             int64
dtype: object

Теперь столбец содержит правильный тип данных.

Также Prophet требует, чтобы столбцы входных данных назывались ds (столбец времени) и y (столбец метрики). Переименуйте столбцы в DataFrame:

df = df.rename(columns={'Month': 'ds',
'AirPassengers': 'y'})
df.head(5)

Попробуйте визуализировать данные, с которыми вы собираетесь работать.

ax = df.set_index('ds').plot(figsize=(12, 8))
ax.set_ylabel('Monthly Number of Airline Passengers')
ax.set_xlabel('Date')
plt.show()

Теперь библиотека Prophet может работать с временными рядами.

3: Прогнозирование временных рядов с помощью Prophet

В этом разделе вы узнаете, как использовать библиотеку Prophet для прогнозирования значений временных рядов. Авторы библиотеки Prophet сумели значительно упростить процесс прогнозирования временных рядов и сделали его интуитивно понятным.

Для начала нужно создать объект Prophet. При этом Prophet позволяет указать несколько аргументов. Например, можно указать диапазон интервала неопределенности с помощью параметра interval_width.

# set the uncertainty interval to 95% (the Prophet default is 80%)
my_model = Prophet(interval_width=0.95)

Затем нужно вызвать метод fit созданного объекта. Это займёт пару секунд:

my_model.fit(df)

Вы получите примерно такой вывод:

<fbprophet.forecaster.Prophet at 0x110204080>

Чтобы получить прогноз временного ряда, предоставьте библиотеке Prophet новый DataFrame, содержащий столбец ds. Этот DataFrame не нужно создавать вручную, поскольку Prophet предоставляет функцию make_future_dataframehelper:

future_dates = my_model.make_future_dataframe(periods=36, freq='MS')
future_dates.tail()

Теперь Prophet сгенерирует 36 меток времени.

При работе с Prophet важно указать частоту временных рядов, freq. Поскольку мы работаем с данными за месяц, в коде указано значение MS (начало месяца). Поэтому функция make_future_dataframe сгенерировала 36 ежемесячных временных отметок. Другими словами, это спрогнозирует значения временных рядов на три года вперед.

После этого DataFrame с предсказанными значениями используется как входные данные метода predict:

forecast = my_model.predict(future_dates)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()

Prophet вернёт объёмный DataFrame с большим количеством столбцов. Основные столбцы:

  • ds: временная метка прогнозируемого значения.
  • yhat: прогнозируемое значение метрики (в статистике обозначение yhat традиционно используется для представления прогнозируемых значений y).
  • yhat_lower: нижняя граница прогнозов.
  • yhat_upper: высшая граница прогнозов.

Ожидается отклонение в значениях от представленного выше результата, поскольку Prophet использует методы MCMC для получения своих прогнозов. MCMC – это стохастический процесс, поэтому значения будут всегда несколько отличаться.

Также Prophet предоставляет удобную функцию для визуализации прогнозируемых данных:

my_model.plot(forecast,
uncertainty=True)

Prophet показывает значения временных рядов (черные точки), прогнозируемые значения (синяя линия) и интервалы неопределенности прогнозов (синие заштрихованные области).

Еще одна особенная функция Prophet – способность возвращать компоненты прогнозов. Это помогает понять, как ежедневные, недельные и годовые модели временных рядов относятся к общим прогнозируемым значениям:

my_model.plot_components(forecast)

Полученные графики предоставляет много полезной информации. Первый график показывает, что ежемесячный объем пассажирских перевозок линейно увеличивается с течением времени. Второй график отображает тот факт, к концу недели количество пассажиров увеличивается; третий график показывает, что наибольшее количество перемещений приходится на каникулы в июле и августе.

Заключение

Теперь вы умеете управлять временными рядами и визуализировать их с помощью Prophet. Чтобы потренироваться, попробуйте:

  • Использовать полученные данные о летних и зимних каникулах и отследить их влияние на дальнейшее развитие временного ряда.
  • Изменить интервал неопределенности.

Загрузить другой набор данных временных рядов и создать собственные прогнозы.

Tags: , ,

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>