Коллекция предсказаний

Сначала давайте подгоним базовую модель:

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)
ds
y

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)
ds
y
yhat1

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)
ds
y
yhat6
yhat5
yhat4
yhat3
yhat2
yhat1

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)
ds
y
yhat1

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)
ds
y
yhat1
residual1
yhat2
residual2
yhat3
residual3
ar1
ar2
ar3
trend
season_yearly

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)
ds
step0
step1
step2

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)
ds
step0
step1
step2
trend0
trend1
trend2
season_yearly0
season_yearly1
season_yearly2
ar0
ar1
ar2

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

Теперь датафрейм с прогнозами содержит только предсказания о еще не наблюдаемом будущем.

ds
y

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)
ds
y
yhat1
residual1
yhat2
residual2
yhat3
residual3
ar1
ar2
ar3
trend
season_yearly

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
ds
step0
step1
step2

0

1961-01-01

453.751007

463.336273

522.325989

Last updated