web-dev-qa-db-ja.com

Pythonの時系列分解関数

時系列分解は、時系列データセットを3つ(またはそれ以上)のコンポーネントに分離する方法です。例えば:

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

Rでは、関数 decompose および stl を実行します。 Pythonでこれをどのように行いますか?

43
user3084006

私は同様の問題を抱えており、最善の道を見つけようとしています。データを Pandas DataFrameに移動してから、 StatsModelstsa.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

これがお役に立てば幸いです!

60
AN6U5

私はすでにこの質問に答えました here ですが、以下は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

上記の関数は、シリーズに日時インデックスがあることを前提としています。個々のコンポーネントを含むデータフレームが返され、お気に入りのグラフ作成ライブラリでグラフ化できます。

Stl seen here のパラメーターを渡すことができますが、ピリオドをアンダースコアに変更します。たとえば、上記の関数の位置引数はs_windowですが、上記のリンクではs.windowです。また、 this repository で上記のコードのいくつかを見つけました。

サンプルデータ

うまくいけば、以下がうまくいくことを願っています。正直に言って、これは私が質問に答えてからずっと後のリクエストなので、試していないということです。

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')
8
Jeff Tilton

R関数を呼び出すには、python rpy2 を使用してpipを使用してrpy2をインストールします。pip install rpy2次に、このラッパーを使用します: https://Gist.github .com/andreas-h/7808564 Rが提供するSTL機能を呼び出す

5
cast42

scipy についてまだ紹介されていますか?いくつかのPDF /サイトで見たものから

ここ および ここ

それは実行可能です。しかし、特定の例を見ることなく、誰かがコード例を示すのは難しいでしょう。 Scipyはすごいです。研究で使っていますが、それでもがっかりしていません。

0
Matt