Сезонная декомпозиция временных рядов лессом с Python

Я пытаюсь сделать с Python то, что я функция STL на R.

команды R являются

fit <- stl(elecequip, s.window=5)
plot(fit)

Как это сделать в Python? Я исследовал, что statmodels.tsa имеет некоторые функции анализа временных рядов, но я мог бы специально найти "сезонную декомпозицию временных рядов лессом" в документации. Аналогично Python.org существует библиотека timeseries 0.5.0, но у нее нет документации, и домашний сайт смотрит вниз. Я знаю, что есть опция с rpy2 с использованием обертки, но я не знаю, как использовать обертку.

спасибо.

3 ответов


у меня была похожая проблема и я пытаюсь найти лучший путь вперед.

вот РЕПО GitHub для декомпозиции STL на основе процедуры Лесса. Он основан на оригинальном коде fortran, который был доступен с этой статье. Это действительно просто оболочка python вокруг исходного кода Fortran, поэтому вы знаете, что он, вероятно, работает хорошо и не глючит.

Если вы хотите что-то более ориентированное на Python и готовы пойти немного проще обычной разложения, StatsModels один:

попробуйте переместить данные в панды DataFrame, а затем вызов StatsModels tsa.seasonal_decompose. Вижу пример:

import statsmodels.api as sm

dta = sm.datasets.co2.load_pandas().data
# deal with missing values. see issue
dta.co2.interpolate(inplace=True)

res = sm.tsa.seasonal_decompose(dta.co2)
resplot = res.plot()

Three plots produced from above input

затем вы можете восстановить отдельные компоненты декомпозиции из:

res.resid
res.seasonal
res.trend

надеюсь, это поможет!


другой вариант python - (PyPI, github). Он похож на StatsModels seasonal_decompose и также будет оценивать периодичность ваших данных.


вы также можете вызвать R из python, используя rpy2

from rpy2.robjects import r
def decompose(series, frequency, s_window, **kwargs):
    df = pd.DataFrame()
    df['date'] = series.index
    s = [x for x in series.values]
    length = len(series)
    s = r.ts(s, frequency=frequency)
    decomposed = [x for x in r.stl(s, s_window, **kwargs).rx2('time.series')]
    df['observed'] = series.values
    df['trend'] = decomposed[length:2*length]
    df['seasonal'] = decomposed[0:length]
    df['residual'] = decomposed[2*length:3*length]
    return df

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

вы можете передать параметры для STL seen здесь, но измените любой период, чтобы подчеркнуть, например, позиционный аргумент в приведенной выше функции s_window, но в приведенной выше ссылке Это s.окно. Кроме Того, Я нашел некоторые из вышеперечисленных кодов на этой репозитория.