Подтвердить что ты не робот

Функция разложения временной серии в Python

Разложение временных рядов - это метод, который разделяет набор временных рядов на три (или более) компонента. Например:

x(t) = s(t) + m(t) + e(t)

где

t is the time coordinate
x is the data
s is the seasonal component
e is the random error term
m is the trend

В РИ делали бы функции, decompose и stl. Как бы я сделал это в Python?

4b9b3361

Ответ 1

У меня была аналогичная проблема, и я пытаюсь найти лучший путь вперед. Попробуйте переместить свои данные в Pandas 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

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

Ответ 2

Я уже ответил на этот вопрос здесь, но ниже приведена краткая функция о том, как сделать это с помощью rpy2. Это позволяет вам использовать R надежную статистическую декомпозицию с лессом, но в Python!

    import pandas as pd

    from rpy2.robjects import r, pandas2ri
    import numpy as np
    from rpy2.robjects.packages import importr


def decompose(series, frequency, s_window = 'periodic', log = False,  **kwargs):
    '''
    Decompose a time series into seasonal, trend and irregular components using loess, 
    acronym STL.
    https://www.rdocumentation.org/packages/stats/versions/3.4.3/topics/stl

    params:
        series: a time series

        frequency: the number of observations per "cycle" 
                   (normally a year, but sometimes a week, a day or an hour)
                   https://robjhyndman.com/hyndsight/seasonal-periods/

        s_window: either the character string "periodic" or the span 
                 (in lags) of the loess window for seasonal extraction, 
                 which should be odd and at least 7, according to Cleveland 
                 et al.

        log:    boolean.  take log of series



        **kwargs:  See other params for stl at 
           https://www.rdocumentation.org/packages/stats/versions/3.4.3/topics/stl
    '''

    df = pd.DataFrame()
    df['date'] = series.index
    if log: series = series.pipe(np.log)
    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).rx2('time.series')]
    df['observed'] = series.values
    df['trend'] = decomposed[length:2*length]
    df['seasonal'] = decomposed[0:length]
    df['residuals'] = decomposed[2*length:3*length]
    return df

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

Вы можете передать параметры для stl, которые вы видите здесь, но измените любой период на подчеркивание, например, позиционный аргумент в вышеприведенной функции - это s_window, но в приведенной выше ссылке это s.window. Кроме того, я нашел некоторые из приведенного выше кода в этом хранилище.

Пример данных

Надеюсь, что ниже работает, честно говоря, не пробовал, так как это запрос задолго после того, как я ответил на вопрос.

import pandas as pd
import numpy as np
obs_per_cycle = 52
observations = obs_per_cycle * 3
data = [v+2*i for i,v in enumerate(np.random.normal(5, 1, observations))]
tidx = pd.date_range('2016-07-01', periods=observations, freq='w')
ts = pd.Series(data=data, index=tidx)
df = decompose(ts, frequency=obs_per_cycle, s_window = 'periodic')

Ответ 3

Вы можете вызывать функции R из python, используя rpy2 Установите rpy2 с помощью pip с помощью: pip install rpy2 Затем используйте эту оболочку: https://gist.github.com/andreas-h/7808564 для вызова функции STL, предоставляемой R

Ответ 4

Вы уже знакомы с scipy? Из того, что я видел в нескольких PDF файлах/сайтах

Здесь а также Здесь

это выполнимо. Но, не видя конкретного примера, кому-то будет сложно показать вам пример кода. Scipy Удивительно, что я использую его в своих исследованиях, но до сих пор его не подвело.