2013-01-16 10 views
7

Ich möchte Pandas OLS-Funktion verwenden, um eine Trendlinie zu meiner Datenreihe passen. Kann jemand den Datetime-Index aus der Pandas-Serie als Prädiktor im OLS verwenden?OLS mit Pandas: Datetime Index als Prädiktor

Zum Beispiel, sagen, dass ich eine einfache Zeitreihe haben:

>>> ts 
2001-12-31 19.828763 
2002-12-31 20.112191 
2003-12-31 19.509116 
2004-12-31 19.913656 
2005-12-31 19.701649 
2006-12-31 20.022819 
2007-12-31 20.103024 
2008-12-31 20.132712 
2009-12-31 19.850609 
2010-12-31 19.290640 
2011-12-31 19.936210 
2012-12-31 19.664813 
Freq: A-DEC 

Ich möchte ein OLS auf, es zu tun, den Index als Prädiktor mit:

model = pd.ols(y=ts,x=ts.index,intercept=True) 

Aber wie x eine Liste von Datetime-Index, die Funktion gibt einen Fehler zurück. Jeder hat eine Idee?

Ich könnte linregress von scipy.stats verwenden, aber ich frage mich, ob es mit Pandas möglich ist.

Danke, Greg

Antwort

5

Das Problem ist, dass Sie nicht ein Index-ols passieren kann.
Ändern es zu einem Series:

In [153]: ts 
Out[153]: 
2011-01-01 00:00:00 19.828763 
2011-01-01 01:00:00 20.112191 
2011-01-01 02:00:00 19.509116 
Freq: H, Name: 1 

In [158]: type(ts.index) 
Out[158]: pandas.tseries.index.DatetimeIndex 


In [154]: df = ts.reset_index() 

In [155]: df 
Out[155]: 
       index   1 
0 2011-01-01 00:00:00 19.828763 
1 2011-01-01 01:00:00 20.112191 
2 2011-01-01 02:00:00 19.509116 

In [160]: type(df['index']) 
Out[160]: pandas.core.series.Series 


In [156]: model = pd.ols(y=df[1], x=df['index'], intercept=True) 

In [163]: model 
Out[163]: 

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

Formula: Y ~ <x> + <intercept> 

Number of Observations:   3 
Number of Degrees of Freedom: 1 

R-squared:  -0.0002 
Adj R-squared: -0.0002 

Rmse:    0.3017 

F-stat (1, 2):  -inf, p-value:  1.0000 

Degrees of Freedom: model 0, resid 2 

-----------------------Summary of Estimated Coefficients------------------------ 
     Variable  Coef Std Err  t-stat p-value CI 2.5% CI 97.5% 
-------------------------------------------------------------------------------- 
      x  0.0000  0.0000  0.00  0.9998 -0.0000  0.0000 
    intercept  0.0000 76683.4934  0.00  1.0000 -150299.6471 150299.6471 
---------------------------------End of Summary--------------------------------- 
+0

Vielen Dank für Ihre Hilfe! – leroygr

+2

Es scheint, dass diese Lösung möglicherweise nicht mehr funktioniert (2 Jahre später). Siehe hier: http://StackOverflow.com/Questions/30425490/Linear-Regression-from-Time-Series-Pandas/30431930#30431930 Möglicherweise aufgrund von Änderungen, die Pandas zum Datetime-Index gemacht hat? – JohnE