時系列分解は、時系列データセットを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
私は同様の問題を抱えており、最善の道を見つけようとしています。データを 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()
その後、分解の個々のコンポーネントを以下から回復できます。
res.resid
res.seasonal
res.trend
これがお役に立てば幸いです!
私はすでにこの質問に答えました 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')
R関数を呼び出すには、python rpy2 を使用してpipを使用してrpy2をインストールします。pip install rpy2次に、このラッパーを使用します: https://Gist.github .com/andreas-h/7808564 Rが提供するSTL機能を呼び出す