2015-04-20 10 views
7

Sto provando a fare una semplice regressione lineare su un frame di dati panda usando il regressore lineare di apprendimento di scikit. I miei dati è una serie di tempo, e il frame di dati panda ha un indice datetime:Usa Scikit Impara a fare regressione lineare su una serie temporale di dati panda

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

Praticando semplice come

from sklearn import linear_model 

lr = linear_model.LinearRegression() 

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

non ha funzionato:

float() argument must be a string or a number 

così ho provato per creare una nuova colonna con le date per provare a trasformarla:

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

ma ora ottengo:

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

Così il regressore non può gestire datetime. Ho visto un sacco di modi per convertire i dati interi in datetime, ma non sono riuscito a trovare un modo per convertire da datetime in intero, ad esempio.

Qual è il modo corretto per farlo?

PS: Sono interessato all'utilizzo di scikit perché ho intenzione di fare più cose con esso in seguito, quindi per ora nessun modello di statistiche.

+0

Converti le date in tempo dall'epoca: http://stackoverflow.com/questions/15203623/convert-pandas-datetimeindex-to-unix-time – mbatchkarov

+0

Grazie. La soluzione qui sotto è più "pandonica". – Ivan

+0

Lo stesso desiderio qui. Sono triste che sklearn non possa gestire un datetimeindex ... Vorrei che lo stack scientifico suonasse meglio insieme. –

risposta

10

Probabilmente vorrai qualcosa come il numero di giorni dall'inizio per essere il tuo predittore qui. Supponendo che tutto è ordinato:

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) 

Le unità esatte che si utilizzano per il predittore in realtà non importa, potrebbe essere giorni o mesi. I coefficienti e l'interpretazione cambieranno in modo che tutto funzioni allo stesso risultato. Inoltre, notiamo che era necessario un reshape(-1, 1) in modo che lo X fosse nel formato previsto.

+1

Hai familiarità con https://github.com/paulgb/sklearn-pandas? – Ivan

+1

C'è un altro modo per farlo, che è indipendente dalla frequenza dei dati: 'df.index.factorize() [0] .reshape (-1,1)' – Ivan

+0

index.reshape non è disponibile ora. Eventuali suggerimenti –

Problemi correlati