2014-10-20 420 views
6

我試圖與Python做什麼,我的STL功能上R.時間序列的季節性分解由黃土與Python

將R命令

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

如何在Python這樣做?我調查了statmodels.tsa有一些時間序列分析函數,但我可以在文檔中專門找到「黃土時間序列的季節分解」。同樣在Python.org上有一個名爲timeseries 0.5.0的庫,但是它沒有文檔,而且它的主頁看起來不太好。我知道有一個選項與rpy2使用包裝,但我不知道如何使用包裝。

謝謝。

回答

10

我一直有類似的問題,並試圖找到最好的路徑。

Here is a github repo for an STL decomposition based on the Loess procedure。它基於可用於this paper的原始Fortran代碼。它實際上只是一個圍繞原始Fortran代碼的python包裝,所以你知道它可能運行良好,而且不是bug。

如果你想要更多的東西的Python爲中心,並願意去一個稍微簡單分解程序,StatsModels有一個:

試試你的數據移動到一個Pandas數據幀,然後調用StatsModelstsa.seasonal_decompose。見following example

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

引用StatsModels 0.6.0發佈注意:「我們添加了一個天真的季節性分解工具,與R的分解相同。」所以認爲這可能不是生產就緒。 – 2015-02-09 16:08:01

+0

我不認爲分解和基於模型的方法或Loess程序一樣強大,但它確實看起來可以在生產中使用。沒有報告的錯誤,它似乎在我執行的測試中工作。你還看到了什麼讓你說它不是生產準備好的? – AN6U5 2015-02-10 20:22:05

+0

「天真的季節分解」就是這樣,而且,這意味着很少(幼稚貝葉斯,天真,但如果數據符合假設,則工作得很好)。 同時引用代碼中的註釋「這是一個天真的分解,更復雜的方法應該是首選。」所以,如果它適合你,那麼很好,但要記住你正在使用的是什麼。 – 2015-02-12 09:17:53

0

另一個python選項是seasonal包(PyPI,github)。它與StatsModels seasonal_decompose類似,並且還會估計您的數據的週期性。

0

您可以使用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 

上述功能假定您的系列有日期時間指數也叫R上。它返回一個數據框,其中包含您可以使用您最喜歡的圖形庫進行圖形化的單個組件。

你可以通過參數stl看到here,但改變任何週期爲下劃線,例如上述函數中的位置參數是s_window,但在上面的鏈接中是s.window。另外,我在this存儲庫中發現了上述一些代碼。