Метод сезонного тренда-лесса для временных рядов в Python

Кто-нибудь знает, существует ли процедура на основе Python для разложения временных рядов с использованием метода STL (Seasonal-Trend-Loess)?

Я видел ссылки на программу-оболочку для вызова функции stl в R, но я обнаружил, что это нестабильно и громоздко с точки зрения настройки среды (Python и R вместе). Также ссылке было 4 года.

Может ли кто-нибудь указать на что-то более свежее (например, sklearn, spicy и т. Д.)?


person Toly    schedule 26.06.2018    source источник


Ответы (4)


Я не пробовал STLDecompose, но я взглянул на него и считаю, что в нем используется лессовый сглаживатель общего назначения. Это сложно сделать правильно, и, как правило, это неэффективно. См. Несуществующее репозиторий STL-Java.

pyloess package предоставляет оболочку python для того же базового Fortran, который используется в исходной версии R. Вам определенно не нужно переходить через мост к R, чтобы получить ту же функциональность! Этот пакет активно не поддерживается, и у меня иногда возникали проблемы с его сборкой на некоторых платформах (например, вилка здесь). Но однажды построенный, он действительно работает и является самым быстрым из возможных. У меня возникло искушение изменить его, чтобы включить некоторые новые функции, но я просто не могу заставить себя изменить Fortran (который является предварительно обработанным RATFOR - очень ассемблерным языком, таким как Fortran, и я нигде не могу найти препроцессор RATFOR ).

Я написал собственную реализацию Java, stl-decomp-4j, которую можно вызывать из Python с помощью _ 4_ пакет. Это началось как прямой перенос оригинального Фортрана, преобразованного в более современный стиль программирования. Затем я расширил его, чтобы разрешить квадратичную интерполяцию лёсса и поддерживать пост-декомпозиционное сглаживание сезонной составляющей, функции, которые описаны в исходной статье, но не были включены в реализацию Fortran / R. (Очевидно, они находятся в реализации S-plus, но немногие из нас имеют к ней доступ.) Ключ к тому, чтобы сделать это эффективным, состоит в том, что сглаживание лёсса упрощается, когда точки находятся на одинаковом расстоянии, а сглаживание по точкам выполняется простым изменением веса, которые используются для интерполяции.

stl-decomp-4j Примеры включают одну записную книжку Jupyter, демонстрирующую, как вызвать этот пакет из python. Мне, вероятно, следовало бы оформить это как пакет Python, но у меня не было времени. Очень охотно принимает запросы на вытягивание. ;-)

Мне бы хотелось увидеть прямой перенос этого подхода на python / numpy. Еще одна вещь в моем списке «если бы у меня было свободное время».

person sfjac    schedule 01.08.2018
comment
Спасибо! Я понял, что STLDecompose (Python) относительно упрощен. Например, ему не нравятся неуклюжие наборы данных (отсутствующие точки данных). Это характеристика STL в целом или просто не очень полное техническое решение для хорошего (STL) метода? - person Toly; 03.08.2018
comment
@Toly - стандартные реализации STL предполагают регулярные интервалы между данными и отсутствие пропущенных точек данных. Пакет Hafen stlplus для R имеет возможность обрабатывать недостающие данные при условии, что доступно достаточное количество периодов. Я бы хотел продлить stl-decomp-4j на это, но у меня не было времени. Я считаю, что этот подход просто основан на том факте, что изначально можно присвоить точке данных вес 0, но я не вдавался в подробности. - person sfjac; 06.08.2018

Действительно есть:

https://github.com/jrmontag/STLDecompose

В репо вы найдете блокнот jupyter для использования пакета.

person Alex G    schedule 26.06.2018

RSTL - это порт Python для STL R: https://github.com/ericist/rstl. Он работает довольно хорошо, за исключением того, что, по словам автора, он в 3-5 раз медленнее, чем STL из R.

Если вы просто хотите получить линию тренда низкого уровня, вы можете просто использовать функцию lowess от Statsmodels https://www.statsmodels.org/dev/generated/statsmodels.nonparametric.smoothers_lowess.lowess.html.

person Tai Huang    schedule 13.12.2018

Здесь вы можете найти пример разложения по сезонным трендам с использованием LOESS (STL), начиная с statsmodels.

В основном это работает так:

from statsmodels.tsa.seasonal import STL
stl = STL(TimeSeries, seasonal=13)
res = stl.fit()
fig = res.plot()

STLDecomposition

person vpz    schedule 11.11.2020