2014-10-20 26 views
6

che sto cercando di fare con Python quello che la funzione STL su R.Decomposizione stagionale delle serie cronologiche da Loess con Python

I comandi R sono

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

Come faccio a fare questo in Python ? Ho studiato che statmodels.tsa ha alcune funzioni di analisi delle serie temporali, ma nella documentazione ho potuto trovare "Decomposizione stagionale delle serie temporali per loess". Analogamente su Python.org c'è una libreria chiamata timeseries 0.5.0, ma questa non ha documentazione e il suo sito di casa guarda in basso. So che c'è un'opzione con rpy2 usando un wrapper, ma non so come usare il wrapper.

Grazie.

risposta

10

Ho riscontrato un problema simile e sto cercando di trovare il miglior percorso da seguire.

Here is a github repo for an STL decomposition based on the Loess procedure. È basato sul codice originale di Fortran disponibile con this paper. In realtà è solo un wrapper python attorno al codice Fortran originale, quindi sai che probabilmente funziona bene e non è bacato.

Se volete qualcosa di più Python centric e sono disposti ad andare con una routine di decomposizione leggermente più semplice, ha uno StatsModels:

prova a spostare i dati in un Pandas dataframe e quindi chiamare StatsModelstsa.seasonal_decompose. Vedere la 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

È quindi possibile recuperare i singoli componenti della decomposizione da:

res.resid 
res.seasonal 
res.trend 

Spero che questo aiuta!

+2

Note di rilascio di StatsModels 0.6.0: "Abbiamo aggiunto uno strumento di decomposizione stagionale ingenuo nella stessa vena di R's decompose." Quindi considera che questo potrebbe non essere pronto per la produzione. –

+0

Non penso che la decomposizione sia potente come gli approcci basati su modelli o come la procedura Loess, ma sembra pronta per la produzione, ad es. non ci sono bug segnalati e sembra che funzioni sui test che ho eseguito. Cos'altro vedi che ti fa dire che non è pronta la produzione? – AN6U5

+0

"ingenua decomposizione stagionale" proprio questo, e, beh, questo significa poco (ingenuo bayes, è ingenuo, ma funziona alla grande se i dati si adattano all'ipotesi). Anche citando i commenti nel codice "Si tratta di una scomposizione ingenua: i metodi più sofisticati dovrebbero essere preferiti". Quindi, se funziona bene per te, ottimo, ma tieni a mente che cosa stai usando. –

0

Un'altra opzione python è il pacchetto seasonal (PyPI, github). È simile a StatsModels seasonal_decompose e valuterà anche la periodicità dei tuoi dati.

0

Si può anche chiamare R da Python usando 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 

La funzione di cui sopra presuppone che il serie ha un indice di datetime. Restituisce un dataframe con i singoli componenti che puoi quindi rappresentare graficamente con la tua libreria grafica preferita.

È possibile passare i parametri per stl visto here, ma modificare qualsiasi punto per sottolineare, ad esempio l'argomento posizionale nella funzione precedente è s_window, ma nel collegamento sopra è s.finestra. Inoltre, ho trovato alcuni dei codici sopra nel repository this.

Problemi correlati