Python, Программирование

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

Время прочтения: 3 мин.

Сегодня рассмотрим интересную библиотеку для прогнозирования временных рядов AtsPy (Automated Time Series Models in Python). Данная библиотека увидела свет совсем недавно и подробно описана в статье (ссылка: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3580631). Она представляет из себя набор 11 моделей для прогнозирования, включая самые популярные (классическая ARIMA, Prophet от Фейсбук). Рассмотрим и сравним некоторые из них. Для начала установим библиотеку и импортируем ее (я бы советовал делать это в Colab, так как библиотека достаточно тяжелая и ей нужны определенные версии библиотек, которые она использует).

pip install atspy
import atspy

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

import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/firmai/random-assets-two/master/ts/monthly-beer-australia.csv')
df['Month'] = pd.to_datetime(df['Month'])
df = df.set_index("Month")

Имптортируем AutomatedModel, создаем список моделей, которые хотим сравнить (возьмем 3), подробнее о них можно почитать здесь (ссылка), задаем количество предсказаний наших моделей, будем прогнозировать на 2 года вперед (24 месяца).

from atspy import AutomatedModel
model_list = [‘ARIMA’, ’Prophet’, ’HWAMS’"]
am = AutomatedModel(df = df, model_list = model_list, forecast_len = 24)

Делаем наше предсказание с помощью трех моделей. В документации предупреждают, что ARIMA работает медленно (так и есть, даже на Colab).

forecast_in, performance = am.forecast_insample()
forecast_out = am.forecast_outsample()

В performance можем найти  RMSE, MSE и среднее (не очень понятно зачем) для каждой модели. Для сравнения полученных результатов, нарисуем графики и посмотрим на наш прогноз.

import matplotlib.pyplot as plt

for i in forecast_out.columns:

    plt.figure(figsize = (15, 7))
    plt.plot(forecast_in[i], color = 'r', label = '{}'.format(i))
    plt.plot(forecast_out[i], color = 'r')
    plt.plot(forecast_in['Target'], color = 'b', label = 'Target')
    
    plt.ylabel("Производство, тыс. л.")
    plt.title('{}'.format(i))
    plt.legend()
    plt.show()

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

Советуем почитать