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

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

```python
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")

```

```python
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 для моделирования более мягкого перехода.

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

```python
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=` мы указываем, к какому условию будет приспособлена добавленная сезонность.

```python
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.

```python
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)
```

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

```python
m.plot_parameters(components="seasonality")
```

<figure><img src="https://neuralprophet.com/_images/how-to-guides_feature-guides_conditional_seasonality_peyton_11_0.svg" alt=""><figcaption></figcaption></figure>

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

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

```python
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()
```

<table data-full-width="false"><thead><tr><th width="55"></th><th>ds</th><th>y</th><th>summer</th><th>winter</th><th>spring</th><th>fall</th></tr></thead><tbody><tr><td>0</td><td>2007-12-10</td><td>9.5908</td><td>0</td><td>1</td><td>0</td><td>0</td></tr><tr><td>1</td><td>2007-12-11</td><td>8.5196</td><td>0</td><td>1</td><td>0</td><td>0</td></tr><tr><td>2</td><td>2007-12-12</td><td>8.1837</td><td>0</td><td>1</td><td>0</td><td>0</td></tr><tr><td>3</td><td>2007-12-13</td><td>8.0725</td><td>0</td><td>1</td><td>0</td><td>0</td></tr><tr><td>4</td><td>2007-12-14</td><td>7.8936</td><td>0</td><td>1</td><td>0</td><td>0</td></tr></tbody></table>

```python
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")
```

```python
future = m.make_future_dataframe(df, n_historic_predictions=365, periods=365)
future = df_utils.add_quarter_condition(future)
forecast = m.predict(df=future)
```

```python
m.plot_parameters(components="seasonality")
```

<figure><img src="https://neuralprophet.com/_images/how-to-guides_feature-guides_conditional_seasonality_peyton_16_0.svg" alt=""><figcaption></figcaption></figure>
