2015-04-20 22 views
7

scikit lineer regresörü kullanarak pandalar veri karesinde basit bir doğrusal regresyon yapmaya çalışıyorum. Benim veriler zaman serisi ve pandalar veri çerçevesi bir datetime indeksine sahiptir: basit bir şey yapıyorKullanım Scikit Bir zaman serisi pandaları veri karesinde doğrusal regresyon yapmayı öğrenin

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

olarak
from sklearn import linear_model 

lr = linear_model.LinearRegression() 

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

işe yaramadı:

float() argument must be a string or a number 

yüzden çalıştı dönüştürmek için tarihlerle yeni bir sütun oluşturmak için :

ama şimdi olsun:

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

Yani regresör datetime işleyemez. Tamsayı verisini datetime dönüştürmek için bir sürü yol gördüm, ancak örneğin datetime'dan tamsayıya dönüştürmenin bir yolunu bulamadım.

Bunu yapmanın doğru yolu nedir?

PS: Scikit kullanmak istiyorum çünkü daha sonra onunla daha fazla şey yapmayı planlıyorum, şu an için hiçbir istatistik modeli yok.

+0

Tarihinizi zaman aşımına dönüştürün: http://stackoverflow.com/questions/15203623/convert-pandas-datetimeindex-to-unix-time – mbatchkarov

+0

Teşekkürler. Aşağıdaki çözüm daha "pandonik" dir. – Ivan

+0

Aynı arzu burada. Ben sklearn'in bir datetimeindex ile başa çıkamayacağı konusunda üzgünüm ... Keşke bilim topluluğunun birlikte daha iyi oynamasını diliyorum. –

cevap

10

Muhtemelen yordayıcı olmanızın başlamasından bu yana geçen gün sayısı gibi bir şey isteyebilirsiniz. Varsayarsak her şey sıralanır:

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) 

gerçekten önemli değil, tahminci için kullanmak tam birimleri, bu günler veya aylar olabilir. Katsayılar ve yorumlar değişecek, böylece her şey aynı sonuca ulaşacak. Ayrıca, X'un beklenen biçimde olması için reshape(-1, 1)'a ihtiyacımız olduğuna dikkat edin.

+1

https://github.com/paulgb/sklearn-pandas aşina mısınız? – Ivan

+1

Bunu yapmanın başka bir yolu var, yani verilerin frekansından bağımsız: 'df.index.factorize() [0] .reshape (-1,1)' – Ivan

+0

index.reshape şu anda kullanılamıyor. Baska öneri –

İlgili konular