Коллекция предсказаний
Сначала давайте подгоним базовую модель:
if "google.colab" in str(get_ipython()):
# удаление предустановленных пакетов из Colab, чтобы избежать конфликтов
!pip uninstall -y torch notebook notebook_shim tensorflow tensorflow-datasets prophet torchaudio torchdata torchtext torchvision
!pip install git+https://github.com/ourownstory/neural_prophet.git # может занять некоторое время
#!pip install neuralprophet # намного быстрее, но может не иметь последних обновлений/исправлений ошибок
import pandas as pd
from neuralprophet import NeuralProphet, set_log_level
set_log_level("ERROR")
data_location = "https://raw.githubusercontent.com/ourownstory/neuralprophet-data/main/datasets/"
df = pd.read_csv(data_location + "air_passengers.csv")
df.tail(3)
141
1960-10-01
461
142
1960-11-01
390
143
1960-12-01
432
m = NeuralProphet(n_lags=5, n_forecasts=3)
metrics_train = m.fit(df=df, freq="MS")
Получение последнего прогноза df
Мы можем получить датафрейм с последним прогнозом для анализа данных.
df_fc = m.get_latest_forecast(forecast)
df_fc.head(3)
0
1960-10-01
461.0
463.035004
1
1960-11-01
390.0
410.434906
2
1960-12-01
432.0
439.753998
Количество шагов перед включением последнего прогноза. Здесь мы включаем 5 шагов перед последним прогнозом.
df_fc = m.get_latest_forecast(forecast, include_previous_forecasts=5)
df_fc.head(3)
0
1960-05-01
472.0
476.862457
None
None
None
None
None
1
1960-06-01
535.0
531.84314
527.112732
None
None
None
None
2
1960-07-01
622.0
579.601501
576.99292
590.679077
None
None
None
Исторические данные могут быть включены, однако учтите, что размер df может быть большим.
df_fc = m.get_latest_forecast(forecast, include_history_data=True)
df_fc.head(3)
0
1949-01-01
112.0
None
1
1949-02-01
118.0
None
2
1949-03-01
132.0
None
Собирайте прогнозы в выборке
Прогнозы отсортированы по цели прогноза
При вызове метода predict
мы получаем df_forecast
, где каждый 'yhat<i>'
относится к предсказанию на <i>
шагов вперед для даты и времени этой строки в качестве цели. Здесь <i>
обозначает "возраст" предсказания.
например, yhat3
- это прогноз для этой даты и времени, сделанный 3 шага назад, он "устарел на 3 шага".
Обратите внимание на то, что в последней строке 1961-3-01
присутствует только прогноз yhat3
, который был сделан на последнем месте с данными 1960-12-01
. Поскольку у нас отсутствуют входные данные после этой точки, у нас нет более свежих прогнозов yhat1
от 1961-2-01
или yhat2
от 1961-1-01
.
Мы также получаем отдельные компоненты прогноза, которые также относятся к их соответствующему вкладу в yhat<i>
, прогнозируемому <i>
шагов назад.
Компоненты без добавленного числа зависят только от времени или от будущих регрессоров, не имеют запаздывания, и поэтому представляют собой единичное значение.
df = pd.read_csv(data_location + "air_passengers.csv")
forecast = m.predict(df)
forecast.tail(3)
141
1960-10-01
461.0
464.689362
3.689362
467.748444
6.748444
474.838562
13.838562
-217.455673
-214.396606
-207.306473
702.886719
-20.741653
142
1960-11-01
390.0
409.214203
19.214203
408.547119
18.547119
417.346649
27.346649
-265.351379
-266.018463
-257.218933
709.864075
-35.298515
143
1960-12-01
432.0
424.255768
-7.744232
441.038513
9.038513
440.375763
8.375763
-306.486664
-289.703949
-290.366669
716.616394
14.12606
Прогнозы на основе начала прогноза
При вызове predict_raw
мы получаем df
, где каждый 'step<i>'
относится к прогнозу на <i>
шагов вперёд, начиная с даты и времени этой строки. Здесь <i>
обозначает, на сколько шагов вперёд направлен прогноз.
Например, step0
- это прогноз на эту дату и время. step1
- это прогноз на следующие дату и время.
Все прогнозы для определенной строки были сделаны за один шаг до даты строки.
df = pd.read_csv(data_location + "air_passengers.csv")
forecast = m.predict(df, decompose=False, raw=True)
forecast.tail(3)
136
1960-10-01
464.689362
408.547119
440.375763
137
1960-11-01
409.214203
441.038513
459.443207
138
1960-12-01
424.255768
446.244385
455.264343
Обратите внимание, что последняя строка содержит последний возможный прогноз. Прогнозируется 1961-1-01
, 1961-2-01
и 1961-3-01
на основе данных, доступных на 1960-12-01
.
Установка параметра decompose=True
позволит включить отдельные компоненты прогноза, которые также относятся к их соответствующему вкладу в прогнозирование на step<i>
шагов вперед.
df = pd.read_csv(data_location + "air_passengers.csv")
forecast = m.predict(df, decompose=True, raw=True)
forecast.tail(3)
136
1960-10-01
464.689362
408.547119
440.375763
702.886719
709.864075
716.616394
-20.741653
-35.298515
14.126060
-217.455673
-266.018463
-290.366669
137
1960-11-01
409.214203
441.038513
459.443207
709.864075
716.616394
723.593689
-35.298515
14.126060
5.574303
-265.351379
-289.703949
-269.724792
138
1960-12-01
424.255768
446.244385
455.264343
716.616394
723.593689
730.571045
14.126060
5.574303
-30.433420
-306.486664
-282.923584
-244.873322
Собирайте прогнозы вне выборки
Вот как вы можете прогнозировать будущее, которое неизвестно:
df = pd.read_csv(data_location + "air_passengers.csv")
future = m.make_future_dataframe(df, periods=3) # periods=m.n_forecasts, n_historic_predictions=False
Теперь датафрейм с прогнозами содержит только предсказания о еще не наблюдаемом будущем.
3
1960-11-01
390
4
1960-12-01
432
5
1961-01-01
None
6
1961-02-01
None
7
1961-03-01
None
Прогнозы на основе прогнозируемой цели
forecast = m.predict(future)
forecast.tail(3)
5
1961-01-01
NaN
453.751007
NaN
None
NaN
None
NaN
-275.416962
None
None
723.593689
5.574303
6
1961-02-01
NaN
None
NaN
463.336273
NaN
None
NaN
None
-236.801361
None
730.571045
-30.43342
7
1961-03-01
NaN
None
NaN
None
NaN
522.325989
NaN
None
None
-191.955765
736.87323
-22.591486
Прогнозы на основе начала прогноза
Мы также можем получить прогнозы на основе начала прогноза. Здесь каждый stepX
относится к X шагам от даты
forecast = m.predict(future, raw=True, decompose=False)
forecast
0
1961-01-01
453.751007
463.336273
522.325989
Last updated