2015-05-24 20 views
5

Vorrei ottenere una regressione con una serie temporale come predittore e sto cercando di seguire la risposta fornita da questa risposta SO (OLS with pandas: datetime index as predictor) ma non sembra funzionare al meglio della mia conoscenza.Regressione lineare da Time Series Pandas

Mi manca qualcosa o c'è un nuovo modo per farlo?

import pandas as pd 

rng = pd.date_range('1/1/2011', periods=4, freq='H')  
s = pd.Series(range(4), index = rng)                  
z = s.reset_index() 

pd.ols(x=z["index"], y=z[0]) 

Ho ricevuto questo errore. L'errore è esplicativo, ma mi chiedo cosa mi manca nel reimplementare una soluzione che ha funzionato prima.

TypeError: cannot astype a datetimelike from [datetime64[ns]] to [float64]

+0

Idealmente, non c'è bisogno di 'rest_index () ', non' pd.ols (y = s, x = s) 'funziona per te? – Zero

+1

Sì, lo fa! Grazie. Per caso sai come funziona o perché la conversione da datetime a I assume float funziona senza errori? – canyon289

+0

Non importa, questo sembra fallire. Fa solo una regressione contro la stessa serie – canyon289

risposta

3

io non sono sicuro perché pd.ols è così pignolo lì (in quanto sembra a me che avete seguito correttamente l'esempio). Sospetto che ciò sia dovuto a cambiamenti nel modo in cui Panda gestisce o memorizza gli indici datetime, ma sono troppo pigro per esplorarlo ulteriormente. In ogni caso, dal momento che la variabile datetime differisce solo per l'ora, si può solo estrarre l'ora con un dt di accesso:

pd.ols(x=pd.to_datetime(z["index"]).dt.hour, y=z[0]) 

tuttavia, che ti dà un R-quadro di 1, dal momento che il modello è overspecified con l'inclusione di un'intercetta (e y è una funzione lineare di x). È possibile modificare range in np.random.randn e quindi si otterrà qualcosa che assomiglia ai normali risultati di regressione.

In [6]: z = pd.Series(np.random.randn(4), index = rng).reset_index()                
     pd.ols(x=pd.to_datetime(z["index"]).dt.hour, y=z[0]) 
Out[6]: 

-------------------------Summary of Regression Analysis------------------------- 

Formula: Y ~ <x> + <intercept> 

Number of Observations:   4 
Number of Degrees of Freedom: 2 

R-squared:   0.7743 
Adj R-squared:  0.6615 

Rmse:    0.5156 

F-stat (1, 2):  6.8626, p-value:  0.1200 

Degrees of Freedom: model 1, resid 2 

-----------------------Summary of Estimated Coefficients------------------------ 
     Variable  Coef Std Err  t-stat p-value CI 2.5% CI 97.5% 
-------------------------------------------------------------------------------- 
      x -0.6040  0.2306  -2.62  0.1200 -1.0560 -0.1521 
    intercept  0.2915  0.4314  0.68  0.5689 -0.5540  1.1370 
---------------------------------End of Summary--------------------------------- 

alternativa, è possibile convertire l'indice per un intero, anche se ho trovato questo non ha funzionato molto bene (sto assumendo in quanto i numeri interi rappresentano nanosecondi dal l'epoca o qualcosa del genere, e quindi sono molto grandi e causare problemi di precisione), ma la conversione a intero e dividendo per un trilioni di e così ha fatto il lavoro e ha dato essenzialmente gli stessi risultati utilizzando dt.hour (vale a dire lo stesso R-squared):

pd.ols(x=pd.to_datetime(z["index"]).astype(int)/1e12, y=z[0]) 

Fonte del messaggio di errore

FWIW, sembra che il messaggio di errore proviene da qualcosa di simile a questo:

pd.to_datetime(z["index"]).astype(float) 

Anche se una soluzione abbastanza ovvia è questa:

pd.to_datetime(z["index"]).astype(int).astype(float) 
+0

Entrambe le soluzioni sono utili, specialmente la seconda. – canyon289

Problemi correlati