Tuesday, March 22, 2022

Detecting Seasonal Decomposize Python

 Аддитивные и мультипликативные временные ряды

В зависимости от характера тренда и сезонности временной ряд может быть смоделирован как аддитивный или мультипликативный, при этом каждое наблюдение в ряду может быть выражено либо как сумма, либо как произведение компонентов: Аддитивный временной ряд: Значение = База Уровень + Тренд + Сезонность + Ошибка Мультипликативный временной ряд: Значение = Базовый уровень 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