Как использовать экспоненциальное сглаживание для сглаживания временных рядов в python? - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь использовать экспоненциальное сглаживание для сглаживания временных рядов.

Предположим, мои временные ряды выглядят так:

import pandas as pd

data = [446.6565,  454.4733,  455.663 ,  423.6322,  456.2713,  440.5881, 425.3325,  485.1494,  506.0482,  526.792 ,  514.2689,  494.211 ]
index= pd.date_range(start='1996', end='2008', freq='A')
oildata = pd.Series(data, index)

Я хочу получить сглаженную версию этого временного ряда.

Если я сделал что-то вроде этого;

from statsmodels.tsa.api import ExponentialSmoothing    
fit1 = SimpleExpSmoothing(oildata).fit(smoothing_level=0.2,optimized=False)
fcast1 = fit1.forecast(3).rename(r'$\alpha=0.2$')

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

Я с удовольствием предоставлю более подробную информацию, если это необходимо.

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Вы можете получить сглаженные значения в атрибуте fittedvalues модели, по-видимому.

import pandas as pd

data = [446.6565,  454.4733,  455.663 ,  423.6322,  456.2713,  440.5881, 425.3325,  485.1494,  506.0482,  526.792 ,  514.2689,  494.211 ]
index= pd.date_range(start='1996', end='2008', freq='A')
oildata = pd.Series(data, index)

from statsmodels.tsa.api import SimpleExpSmoothing
fit1 = SimpleExpSmoothing(oildata).fit(smoothing_level=0.2,optimized=False)
# fcast1 = fit1.forecast(3).rename(r'$\alpha=0.2$')

import matplotlib.pyplot as plt
plt.plot(oildata)
plt.plot(fit1.fittedvalues)
plt.show()

Это дает:

enter image description here

Документация гласит:

встроенные значения: ndarray

Массив установленных значений. Подходит для модели экспоненциального сглаживания.

Обратите внимание, что вы также можете использовать атрибут fittedfcast, который содержит все значения + первый прогноз, или атрибут fcastvalues, который содержит только прогноз.

1 голос
/ 01 апреля 2020

ExponentialSmoothing - это не инструмент для сглаживания данных временных рядов, это метод прогнозирования временных рядов .

Fit () Функция вернет экземпляр класса HoltWintersResults, который содержит изученные коэффициенты. Функция прогнозирования () или прогнозирования () на результирующем объекте может быть вызвана для создания прогноза.

Таким образом, вызывая predict, класс будет делать прогноз, используя изученный коэффициенты.

Однако, чтобы сгладить временной ряд, вы можете использовать атрибут fittedvalues, так как @ smar ie указывает на


Однако я бы go с более подходящим инструментом, таким как savgol_filter:

from scipy.signal import savgol_filter
savgol_filter(oildata, 5, 3)

array([444.87816   , 461.58666   , 444.99296   , 441.70785143,
       442.40769143, 438.36852857, 441.50125714, 472.05622571,
       512.20891429, 521.74822857, 517.63141429, 493.37037143])

Как упоминалось в комментариях, фильтр savgol выполняет локальное приближение Тейлора к заданному polyorder для данного размера окна (window_length) и приводит к сглаживанию временного ряда.

Вот как это выглядело бы с вышеприведенной настройкой:

plt.plot(oildata)
plt.plot(pd.Series(savgol_filter(oildata, 5, 3), index=oildata.index))
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...