2015-04-20 3 views
7

Ich versuche, eine einfache lineare Regression auf einem Pandas Datenrahmen zu tun mit scikit linearen Regressor lernen. Meine Daten ist eine Zeitreihe und die Pandas Datenrahmen hat einen Datetime-Index:Verwenden Scikit Lernen lineare Regression auf einer Zeitreihe Pandas Datenrahmen zu tun

   value 
2007-01-01 0.771305 
2007-02-01 0.256628 
2008-01-01 0.670920 
2008-02-01 0.098047 

Etwas zu tun, einfach wie

from sklearn import linear_model 

lr = linear_model.LinearRegression() 

lr(data.index, data['value']) 

hat nicht funktioniert:

float() argument must be a string or a number 

So habe ich versucht, eine neue Spalte mit den Daten zu erstellen, um zu versuchen, es zu verwandeln:

data['date'] = data.index 
data['date'] = pd.to_datetime(data['date']) 
lr(data['date'], data['value']) 

aber jetzt erhalte ich:

ValueError: Input contains NaN, infinity or a value too large for dtype('float64'). 

So ist die Regressor- nicht Datumzeit verarbeiten kann. Ich sah eine Reihe von Möglichkeiten, um ganzzahlige Daten in datetime zu konvertieren, konnte aber keine Möglichkeit finden, beispielsweise von datetime in integer zu konvertieren.

Was ist der richtige Weg, dies zu tun?

PS: Ich habe Interesse an mit scikit, weil ich jetzt später damit mehr Material auf dem Tun, so dass kein statsmodels bin die Planung.

+0

Konvertieren Sie Ihre Daten in die Zeit seit der Zeit: http://StackOverflow.com/Questions/15203623/Convert-Pandas-DateTimeIndex-To-Unix-Time – mbatchkarov

+0

Danke. Die folgende Lösung ist "pandonischer". – Ivan

+0

Gleiches Verlangen hier. Ich bin traurig, dass Sklearn nicht mit einem Datetimeindex umgehen kann ... Ich wünschte, der Science Stack würde besser zusammenspielen. –

Antwort

10

Sie möchten wahrscheinlich so etwas wie die Anzahl der Tage seit dem Start, um hier Ihre Vorhersage zu sein. Unter der Annahme, alles wird sortiert:

In [36]: X = (df.index - df.index[0]).days.reshape(-1, 1) 

In [37]: y = df['value'].values 

In [38]: linear_model.LinearRegression().fit(X, y) 
Out[38]: LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False) 

Die genauen Einheiten, die Sie für den Prädiktor verwenden keine Rolle wirklich, es könnte Tage oder Monate. Die Koeffizienten und die Interpretation ändern sich, so dass alles zum selben Ergebnis führt. Beachten Sie auch, dass wir eine reshape(-1, 1) benötigen, so dass die X im erwarteten Format ist.

+1

Kennen Sie https://github.com/paulgb/sklearn-pandas? – Ivan

+1

Es gibt einen anderen Weg, dies zu tun, der unabhängig von der Häufigkeit der Daten ist: 'df.index.factorize() [0] .reshape (-1,1)' – Ivan

+0

index.reshape ist jetzt nicht verfügbar. Irgendwelche Vorschläge –

Verwandte Themen