Условная сезонность

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

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@examples_cond_seas # может занять некоторое время
    #!pip install neuralprophet # намного быстрее, но может не иметь последних обновлений/исправлений ошибок

import pandas as pd
from neuralprophet import NeuralProphet, set_log_level, df_utils

set_log_level("ERROR")
data_location = "https://raw.githubusercontent.com/ourownstory/neuralprophet-data/main/datasets/"
df = pd.read_csv(data_location + "wp_log_peyton_manning.csv")

Пользовательская условная сезонность

Например, мы можем определить две сезонные периодичности: одна для сезона футбола и одна для межсезонья. Сезон футбола начинается в сентябре и заканчивается после января. Мы учитываем это, добавляя в входной DataFrame два столбца с бинарными значениями (0 и 1), в зависимости от того, активировано ли условие в данный момент времени или нет. Заметьте, что также могут быть добавлены значения с плавающей точкой от 0 до 1 для моделирования более мягкого перехода.

При определении альтернативных недельных сезонностей мы отключаем стандартную сезонность модели.

df["ds"] = pd.to_datetime(df["ds"])
df["on_season"] = df["ds"].apply(lambda x: x.month in [9, 10, 11, 12, 1])
df["off_season"] = df["ds"].apply(lambda x: x.month not in [9, 10, 11, 12, 1])

period=7 означает добавление новой недельной сезонности. С помощью параметра condition_name= мы указываем, к какому условию будет приспособлена добавленная сезонность.

m = NeuralProphet(weekly_seasonality=False)
m.set_plotting_backend("plotly-static")
m.add_seasonality(name="on_season", period=7, fourier_order=3, condition_name="on_season")
m.add_seasonality(name="off_season", period=7, fourier_order=3, condition_name="off_season")
metrics = m.fit(df, freq="D")

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

future = m.make_future_dataframe(df, n_historic_predictions=365, periods=365)
future["on_season"] = future["ds"].apply(lambda x: x.month in [9, 10, 11, 12, 1])
future["off_season"] = future["ds"].apply(lambda x: x.month not in [9, 10, 11, 12, 1])
forecast = m.predict(df=future)

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

m.plot_parameters(components="seasonality")

Предопределенная условная сезонность

NeuralProphet также предоставляет предопределенные условия (четверти, будни/выходные), которые добавляются в входной DataFrame с помощью простого вызова функции. В данном случае мы хотели бы интегрировать изменяющуюся по кварталам недельную сезонность.

data_location = "https://raw.githubusercontent.com/ourownstory/neuralprophet-data/main/datasets/"
df = pd.read_csv(data_location + "wp_log_peyton_manning.csv")
df = df_utils.add_quarter_condition(df)
df.head()
dsysummerwinterspringfall

0

2007-12-10

9.5908

0

1

0

0

1

2007-12-11

8.5196

0

1

0

0

2

2007-12-12

8.1837

0

1

0

0

3

2007-12-13

8.0725

0

1

0

0

4

2007-12-14

7.8936

0

1

0

0

m = NeuralProphet(weekly_seasonality=False)
m.set_plotting_backend("plotly-static")
m.add_seasonality(name="weekly_summer", period=7, fourier_order=3, condition_name="summer")
m.add_seasonality(name="weekly_fall", period=7, fourier_order=3, condition_name="fall")
m.add_seasonality(name="weekly_winter", period=7, fourier_order=3, condition_name="winter")
m.add_seasonality(name="weekly_spring", period=7, fourier_order=3, condition_name="spring")
metrics = m.fit(df, freq="D")
future = m.make_future_dataframe(df, n_historic_predictions=365, periods=365)
future = df_utils.add_quarter_condition(future)
forecast = m.predict(df=future)
m.plot_parameters(components="seasonality")

Last updated