Прогнозирайте светкавично бързи едномерни времеви редове с пакета StatsForecast на Nixtla

StatsForecast е пакет, който идва с колекция от статистически и иконометрични модели за прогнозиране на едномерни времеви редове. Работи идеално с големи времеви сериии не само твърди, че е 20x по-бърз от известния пакет pmdarima, но и 500x по-бърз от fb пророк.

Тази статия ви предоставя първи преглед на пакета StatsForecast и как да го използвате. За да демонстрираме неговата супер бърза производителност, но също и използването му с единични и множество времеви серии, ще работим с два набора от данни.

Ще използваме набора от данни „Общи продажби на вино в Австралия“ за единичния времеви ред. Наборът от данни ще се използва за сравняване на функцията auto_arima на StatsForecast с тази от добре познатия пакет pmdarima. Вторият е извадка от набора от данни M4, който съдържа 1476 времеви серии. Идеята зад втория пример е да ви покаже как да подготвите данните си за прогнозиране на множество времеви серии с пакета.

Защо е толкова бързо?

Преди да започнем, може да сте скептични и да се чудите каква е тайната му, че е толкова бърз. Има две основни причини за това.

Първо, StatsForecast използва Numba. Numba е Just-In-Time (JIT) компилатор за Python, който работи доста добре с код NumPy и превежда части като масиви, алгебрични функции и т.н., в бърз машинен код.

Второ, той също използва паралелни изчисления, което показва предимствата му при работа с множество времеви серии.

Първи стъпки и предпоставки

За да инсталирате StatsForecast, просто изпълнете следната команда, ако искате да инсталирате пакета с pip:

pip install statsforecast

За да го инсталирате с conda стартирайте:

conda install -c nixtla statsforecast

Структура на данни

StatsForecast трябва да има данните от времевия ред в специална структура:

+-----------+----------+-------+
| unique_id |    ds    |   y   |
+-----------+------------------+
|     0     | Jan 2021 |  100  |
|     0     | Feb 2021 |  200  |
|     0     | Mar 2021 |  150  |
+-----------+------------------+
  • Индексна колона, наречена unique_id
  • Колона ds, която съдържа дата или числова стойност
  • Колоната y, която е целевата променлива на нашия едномерен времеви ред

Индексната колона представлява индекса на съответния динамичен ред. В случай, че работите само с една единична времева серия, индексът е винаги 0 или постоянен. Ако имате няколко времеви серии в един кадър от данни, индексът се използва за диференциране между тях и позволява паралелно изчисление. Например първият времеви ред получава индекс 0, вторият индекс 1 и т.н.

Прогнозиране със StatsForecast

Сега, след като сме запознати с необходимата структура на данните, нека започнем с моделирането и прогнозирането.

Общи продажби на вино в Австралия (един времеви ред)

На първо място, трябва да приведем данните в правилната форма. Данните за продажбите идват като серия с дата (месец година) като индекс (ред 8).

Тъй като това е единичен времеви ред, задаваме индекс за всички данни на 0, създаваме ds колона за датата и колона y за стойностите на продажбите (редове 11–17).

След тази стъпка преобразуваме колоната ds в datetime (ред 18). Общите данни за виното са на месечно ниво. Когато го конвертираме с datetime,получаваме формат година-месец-ден, който винаги започва с първия ден от месеца. Това може по-късно да доведе до проблем при използване на метода за прогнозиране (датата на резултата винаги ще бъде края на месеца). Ето защо добавяме тук MonthEnd(1).

Не на последно място, ние разделяме нашите данни на обучаващ и тестов набор. Крайният резултат от нашите данни изглежда така:

След като приведем данните си в правилната форма, можем да започнем да инициализираме StatsForecast:

StatsForecast се нуждае от следните параметри:

  • Рамката с данни (обучение).
  • Моделите, които искате да използвате като кортежи с името на модела и съответните параметри (auto_arima, 12)
  • Честотата („M“ за месеци, „Y“ за години и т.н.)
  • По избор е n_jobs, който може да се използва за активиране на паралелни изчисления, когато се работи с множество времеви серии.

Както споменахме в началото, StatsForecast идва с куп други статистически и иконометрични модели. Можете да предоставите параметъра на моделите (ред 7) няколко параметъра като кортежи с техните конкретни параметри. Пълен списък на всички предоставени модели можете да намерите тук.

В този пример използваме само модела auto_arima и задаваме параметъра за дължина на сезона на 12. Параметърът n_job е зададен по подразбиране на 1. Има смисъл да го увеличаваме само ако имаме множество времеви серии в нашия набор от данни.

Сега, след като конфигурирахме нашия прогнозатор, можем да предвидим предстоящите 26 месеца.

Времето за изчисление току-що отне 2,78 s

Прогнозите на StatsForecast се връщат като рамка с данни (фигура 2). Всяка колона (с изключение на ds за времето) показва прогнозите, произведени от дефинирания модел(и).

Сега, след като имаме нашите резултати, нека изчислим средната абсолютна грешка (MAE). Пълен преглед на различни показатели за грешки във времеви редове може да бъде намерен тук.

Получаваме MAE от 1592.865459735577

Сравнение с пакета pmdarima

Нека сега сравним производителността и точността с функцията auto_arima на пакета pmdarima.

С подхода StatsForecast auto_arima имаме време за изчисление от 86 секунди и MAE от 1951.2410193026085

Сравнявайки ефективността на двата пакета и нанасяйки резултатите от прогнозата в графика (фигура 3), можем да видим, че auto_arimaна StatsForecast работи 30 пъти по-бързо и е по-точен от този на pmdarima .

M4 данни (множество времеви серии)

Тъй като вече сме запознати с прогнозирането на единичен времеви ред, сега се фокусираме върху по-напреднал пример. Данните за M4 можете да намерите тук. За за простота и демонстрация ние се съсредоточаваме само върху дневни данни за микроикономически времеви редове (1476 различни времеви реда). Както бе споменато по-горе, мотивацията на този раздел е да ви покаже как да приведете множество времеви редове в правилната форма за StatsForecast.

Започваме със зареждане на части от набора от данни M4 и преобразуване на колони в редове:

Суровите данни (фигура 4) ще бъдат преобразувани в следната форма (фигура 5).

След тази стъпка добавяме информация за набора от данни (главно неговата категория) към нашите тестови и обучаващи рамки с данни (редове 2–3). Също така създаваме индекс unique_id, който съдържа категорията и идентификатора на всеки времеви ред (редове 5–6).

Резултатът след тези стъпки за спор изглежда така:

За разлика от първия ни пример, нашият индекс вече има множество стойности. Всяка стойност представлява времева серия. Това по-късно помага на пакета да изпълнявапаралелни изчисления или прогнозиране.

Липсва само една последна стъпка за спорове: трябва да добавим или създадем колона ds. Правим това, като изпълним следния код:

Кодът добавя към всеки времеви ред поредица от числа (започващи от 1), които представляват съответните дни. Запомнете: Колоната ds може да съдържа числови стойности или дати. Резултатът изглежда така:

Сега, когато разполагаме с всички необходими данни, можем да преминем към нашата последна стъпка на моделиране.

Зададохме продължителността на сезона на 7 и честотата на „D“, защото имаме ежедневни данни. За разлика от първия ни пример, задаваме n_jobs не на 1, а на броя различни времеви серии, които искаме да прогнозираме. n_jobs се определя от броя на наличните ядра и различни времеви серии. Ако има повече времеви серии от наличните ядра, функцията min ще върне броя на наличните ядра.

Изпълнението на прогнозата отне 3 минути 11 секунди с MAE от 3541.514063940959

Заключение

Представянето на StatsForecast е наистина впечатляващо. Екипът работи усилено върху коригирането на грешки и внедряването на нови функции, както можете да видите на тяхната страница в github.
Дори текущата им документация да е ограничена, но в процес на създаване, можете да намерите много примери в техните страница в github и добре написана подробна статия за towardsdatascience.

Ако мога да направя три желания, тогава бих се радвал да имам увереност и интервали за прогнозиране, функции за обобщение на модела (предоставящи повече статистическа информация за модела(ите)) и интегрирането на StatsForecast в други пакети.

Допълнителни връзки

👉 Страница в github на StatsForecast

👉 Статия за TDS от съоснователя Федерико Гарза Рамирес

👉 Страницата в github на Pmdarima

👉 Общ преглед на показателите за грешки във времеви редове