2013-01-16 4 views
7

Vorrei utilizzare la funzione OLS dei panda per adattare una linea di tendenza alla mia serie di dati. Qualcuno sa come utilizzare l'indice datetime dalla serie pandas come predittore nell'OLS?OLS con panda: indice datetime come predittore

Per esempio, diciamo che ho una semplice serie storica:

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

Vorrei fare un OLS su di esso utilizzando l'indice come predittore:

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

Ma come x è una lista di indice datetime, la funzione restituisce un errore. Qualcuno ha un'idea?

Potrei usare il linfonario da scipy.stats ma mi chiedo se è possibile con Pandas.

Grazie, Greg

risposta

5

Il problema è che non si può passare un Index-ols.
cambiarlo in un 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

Molte grazie per il vostro aiuto! – leroygr

+2

Sembra che questa soluzione non funzioni più (2 anni dopo). Vedi qui: http://stackoverflow.com/questions/30425490/linear-regression-from-time-series-pandas/30431930#30431930 Forse a causa dei cambiamenti che i panda hanno fatto sull'indice datetime? – JohnE