Руководство по прогнозированию временных рядов с Пророком в Python 3

Вступление

В предыдущих уроках мы показывалиhow to visualize and manipulate time series data иhow to leverage the ARIMA method to produce forecasts from time series data. Мы отметили, что правильная параметризация моделей ARIMA может быть сложным ручным процессом, который требует определенного времени.

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

Предпосылки

В этом руководстве будет рассказано, как выполнять анализ временных рядов на локальном компьютере или на удаленном сервере. Работа с большими наборами данных может потребовать много памяти, поэтому в любом случае компьютеру потребуется не менее2GB of memory для выполнения некоторых вычислений в этом руководстве.

В этом руководстве мы будем использоватьJupyter Notebook для работы с данными. Если у вас его еще нет, следуйте нашимtutorial to install and set up Jupyter Notebook for Python 3.

[[step-1 -—- pull-dataset-and-install-packages]] == Шаг 1. Получение набора данных и установка пакетов

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

cd environments
. my_env/bin/activate

Отсюда давайте создадим новый каталог для нашего проекта. Мы назовем егоtimeseries, а затем перейдем в каталог. Если вы называете проект другим именем, не забудьте заменитьtimeseries своим именем на протяжении всего руководства:

mkdir timeseries
cd timeseries

Мы будем работать с Box and Jenkins (1976)Airline Passengers dataset, который содержит временные ряды данных о ежемесячном количестве авиапассажиров в период с 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, названный в честь математикаStanislaw Ulam. Поэтому перед установкойfbprophet нам необходимо убедиться, что установлена ​​оболочка Pythonpystan дляSTAN:

pip install pystan

Как только это будет сделано, мы можем установить Prophet с помощью pip:

pip install fbprophet

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

[[step-2 -—- import-packages-and-load-data]] == Шаг 2. Импорт пакетов и загрузка данных

Чтобы начать работать с нашими данными, мы запустим Jupyter Notebook:

jupyter notebook

Чтобы создать новый файл записной книжки, выберитеNew>Python 3 в правом верхнем раскрывающемся меню:

Create a new Python 3 notebook

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

Лучше всего начать с импорта необходимых вам библиотек в верхней части записной книжки (обратите внимание на стандартные сокращения, используемые для ссылки наpandas,matplotlib иstatsmodels):

%matplotlib inline
import pandas as pd
from fbprophet import Prophet

import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')

Обратите внимание, как мы также определили пятьсот тридцать восемьmatplotlib style для наших графиков.

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

Давайте начнем с чтения данных нашего временного ряда. Мы можем загрузить файл CSV и распечатать первые 5 строк с помощью следующих команд:

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

df.head(5)

DataFrame

НашDataFrame явно содержит столбцыMonth иAirPassengers. Библиотека Prophet ожидает в качестве входных данных DataFrame с одним столбцом, содержащим информацию о времени, и другим столбцом, содержащим метрику, которую мы хотим прогнозировать. Важно отметить, что ожидается, что столбец времени будет иметь типdatetime, поэтому давайте проверим тип наших столбцов:

df.dtypes
OutputMonth            object
AirPassengers     int64
dtype: object

Поскольку столбецMonth не относится к типуdatetime, нам необходимо преобразовать его:

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

Теперь мы видим, что наш столбецMonth имеет правильный типdatetime.

Prophet также накладывает строгое условие, согласно которому входные столбцы должны называтьсяds (столбец времени) иy (столбец метрики), поэтому давайте переименуем столбцы в нашем DataFrame:

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

df.head(5)

DataFrame

Хорошей практикой является визуализация данных, с которыми мы будем работать, поэтому давайте составим график нашего временного ряда:

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

plt.show()

Time Series Plot

Теперь, когда наши данные подготовлены, мы готовы использовать библиотеку Пророка для составления прогнозов наших временных рядов.

[[шаг-3 -—- прогнозирование-временного-ряда-с-пророком]] == Шаг 3 - Прогнозирование временного ряда с помощью Пророка

В этом разделе мы опишем, как использовать библиотеку Пророка для предсказания будущих значений наших временных рядов. Авторы «Пророка» абстрагировались от многих внутренних сложностей прогнозирования временных рядов и сделали аналитиками и разработчиками более интуитивно понятным работу с данными временных рядов.

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

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

Теперь, когда наша модель Prophet инициализирована, мы можем вызвать ее методfit с нашим DataFrame в качестве входных данных. Подгонка модели должна занять не более нескольких секунд.

my_model.fit(df)

Вы должны получить вывод, похожий на этот:

Output

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

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

DataFrame

В приведенном выше фрагменте кода мы дали указание Пророку создать в будущем 36 меток даты.

При работе с Пророком важно учитывать частоту наших временных рядов. Поскольку мы работаем с ежемесячными данными, мы четко указали желаемую частоту временных меток (в данном случаеMS - это начало месяца). Таким образом,make_future_dataframe сгенерировал для нас 36 ежемесячных отметок времени. Другими словами, мы рассчитываем прогнозировать будущие значения нашего временного ряда на 3 года в будущем.

DataFrame будущих дат затем используется в качестве входных данных для методаpredict нашей подобранной модели.

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

Predict Model

Prophet возвращает большой DataFrame со многими интересными столбцами, но мы подразделяем наши выходные данные на столбцы, наиболее релевантные прогнозированию, а именно:

  • ds: отметка даты прогнозируемого значения

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

  • yhat_lower: нижняя граница наших прогнозов

  • yhat_upper: верхняя граница наших прогнозов

Можно ожидать отклонения значений от результатов, представленных выше, так как Пророк использует методы Марковской цепочки Монте-Карло (MCMC) для составления своих прогнозов. MCMC - это случайный процесс, поэтому значения будут немного отличаться каждый раз.

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

my_model.plot(forecast,
              uncertainty=True)

Forecast Plot

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

Еще одна особенно сильная особенность Пророка - его способность возвращать компоненты наших прогнозов. Это может помочь показать, как ежедневные, еженедельные и годовые модели временных рядов влияют на общие прогнозные значения:

my_model.plot_components(forecast)

Components of Forecasts Plots

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

Заключение

В этом руководстве мы описали, как использовать библиотеку Prophet для прогнозирования временных рядов в Python. Мы использовали нестандартные параметры, но Prophet позволяет нам указать гораздо больше аргументов. В частности, «Пророк» предоставляет функциональные возможности для представления ваших собственных знаний о временных рядах.

Вот несколько дополнительных вещей, которые вы можете попробовать:

  • Оцените влияние праздников, включив свои предыдущие знания в праздничные месяцы (например, мы знаем, что декабрь является праздничным месяцем). Официальная документация поmodeling holidays будет полезна.

  • Измените диапазон ваших интервалов неопределенности или сделайте прогноз на будущее.

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

Related