2015-05-24 19 views
5

Ich möchte eine Regression mit einer Zeitreihe als Prädiktor erhalten und ich versuche, die Antwort zu geben, geben Sie auf diese SO-Antwort (OLS with pandas: datetime index as predictor), aber es scheint nicht mehr zu funktionieren meines Wissens.Lineare Regression von Zeitreihen Pandas

Fehle ich etwas oder gibt es eine neue Möglichkeit, dies zu tun?

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]) 

Ich bekomme diesen Fehler. Der Fehler ist erklärend, aber ich frage mich, was ich vermisse, wenn ich eine Lösung, die vorher funktioniert hat, wieder implementiere.

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

+0

Idealerweise brauchen Sie nicht zu 'rest_index () ', funktioniert' pd.ols (y = s, x = s) 'nicht für dich? – Zero

+1

Ja, das tut es! Vielen Dank. Weißt du zufällig, wie es funktioniert oder warum die Konvertierung von Datetime zu I davon ausgeht, dass Float fehlerfrei funktioniert? – canyon289

+0

Nein, das scheint zu scheitern. Es macht nur eine Regression gegen die gleiche Serie – canyon289

Antwort

3

Ich bin nicht sicher, warum pd.ols es so pingelig ist (es mir scheint, dass Sie das Beispiel korrekt befolgt). Ich vermute, dass dies auf Änderungen in der Verarbeitung von Datums- und Datumsindizes durch Pandas zurückzuführen ist, aber zu faul ist, dies weiter zu untersuchen. Wie auch immer, da Ihr Datetime-Variable nur in der Stunde unterscheidet, können Sie extrahieren nur die Stunde mit einem dt Accessor:

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

jedoch, dass Sie gibt ein r-Quadrat von 1, da das Modell mit der Aufnahme überdimensioniert ist eines Schnittpunktes (und y ist eine lineare Funktion von x). Du könntest die range zu np.random.randn ändern und dann bekommst du etwas, das wie normale Regressionsergebnisse aussieht.

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--------------------------------- 

Alternativ können Sie den Index in eine ganze Zahl konvertieren, obwohl ich fand das nicht sehr gut funktioniert (ich davon aus bin, weil die ganzen Zahlen ns seit Beginn der Epoche oder ähnliches darstellen, und sind daher sehr groß und verursachen Präzisionsprobleme), sondern durch eine Billion Ganzzahl- und Dividieren Umwandlung oder tat dies Arbeit und gab im wesentlichen die gleichen Ergebnisse wie unter Verwendung dt.hour (dh gleiche R-Quadrat):

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

Quelle der Fehlermeldung

FWIW, sieht es so aus, dass Fehlermeldung von so etwas wie dieses kommt:

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

eine ziemlich offensichtliche Abhilfe Obwohl dies:

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

Beide Lösungen sind hilfreich, die zweite besonders. – canyon289

Verwandte Themen