Аддитивные и мультипликативные временные ряды
В зависимости от характера тренда и сезонности временной ряд может быть смоделирован как аддитивный или мультипликативный, при этом каждое наблюдение в ряду может быть выражено либо как сумма, либо как произведение компонентов: Аддитивный временной ряд: Значение = База Уровень + Тренд + Сезонность + Ошибка Мультипликативный временной ряд: Значение = Базовый уровень x Тренд x Сезонность x Ошибка
Как разложить временной ряд на составляющие?
Вы можете выполнить классическую декомпозицию временного ряда, рассматривая ряд как аддитивную или мультипликативную комбинацию базового уровня, тренда, сезонного индекса и остатка. Season_decompose в statsmodels реализует это удобно.
Code 1
(.env) [boris@fedora34server VERIFY]$ cat detectDecomposition.py
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import seasonal_decompose
from dateutil.parser import parse
# Import Data
df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date'], index_col='date')
# Multiplicative Decomposition
result_mul = seasonal_decompose(df['value'], model='multiplicative', extrapolate_trend='freq')
# Additive Decomposition
result_add = seasonal_decompose(df['value'], model='additive', extrapolate_trend='freq')
# Plot
plt.rcParams.update({'figure.figsize': (10,10)})
result_mul.plot().suptitle('Multiplicative Decompose', fontsize=22)
result_add.plot().suptitle('Additive Decompose', fontsize=22)
plt.show()
Установка extrapolate_trend='freq' позаботится о любых отсутствующих значениях в тренде и остатках в начале ряда. Если вы внимательно посмотрите на остатки аддитивного разложения, то увидите, что в них остался какой-то паттерн. Однако мультипликативное разложение выглядит довольно случайным, и это хорошо. Поэтому в идеале для этой конкретной серии следует предпочесть мультипликативное разложение. Числовой вывод тренда, сезонных и остаточных компонентов хранится в самом выводе result_mul.
Давайте извлечем их и поместим в фрейм данных.
Code 2
(.env) [boris@fedora34server VERIFY]$ cat detectDecomposition.py
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import seasonal_decompose
from dateutil.parser import parse
# Import Data
df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date'], index_col='date')
# Multiplicative Decomposition
result_mul = seasonal_decompose(df['value'], model='multiplicative', extrapolate_trend='freq')
# Additive Decomposition
result_add = seasonal_decompose(df['value'], model='additive', extrapolate_trend='freq')
# Plot
plt.rcParams.update({'figure.figsize': (10,10)})
result_mul.plot().suptitle('Multiplicative Decompose', fontsize=22)
result_add.plot().suptitle('Additive Decompose', fontsize=22)
df_reconstructed = pd.concat([result_mul.seasonal, result_mul.trend, result_mul.resid, result_mul.observed], axis=1)
df_reconstructed.columns = ['seas', 'trend', 'resid', 'actual_values']
df_reconstructed.head()
print(df_reconstructed.head())
plt.show()
References
https://www.machinelearningplus.com/time-series/time-series-analysis-python/
No comments:
Post a Comment