时间序列熊猫的线性回归

时间:2015-05-24 15:59:20

标签: python pandas

我希望得到一个时间序列作为预测变量的回归,我试图按照这个SO答案给出答案(OLS with pandas: datetime index as predictor)但它似乎不再适用于我的最佳状态知识。

我错过了什么或有新的方法吗?

import pandas as pd

rng = pd.date_range('1/1/2011', periods=4, freq='H')       
s = pd.Series(range(4), index = rng)                                                                      
z = s.reset_index()

pd.ols(x=z["index"], y=z[0]) 

我收到了这个错误。错误是解释性的,但我想知道在重新实现以前有效的解决方案时我缺少什么。

  

TypeError:无法在[datetime64 [ns]]到[float64]

之类的日期时间

1 个答案:

答案 0 :(得分:3)

我不确定为什么pd.ols在那里如此挑剔(在我看来你确实正确地遵循了这个例子)。我怀疑这是由于pandas如何处理或存储日期时间索引的变化,但我懒得探索这个。无论如何,由于您的日期时间变量仅在小时内有所不同,您可以使用dt访问者提取小时:

pd.ols(x=pd.to_datetime(z["index"]).dt.hour, y=z[0])

但是,这会给你一个1的r平方,因为你的模型被过度指定,包含一个截距(y是x的线性函数)。您可以将range更改为np.random.randn,然后您就可以获得看起来像正常回归结果的内容。

In [6]: z = pd.Series(np.random.randn(4), index = rng).reset_index()                                                               
        pd.ols(x=pd.to_datetime(z["index"]).dt.hour, y=z[0])
Out[6]: 

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

Formula: Y ~ <x> + <intercept>

Number of Observations:         4
Number of Degrees of Freedom:   2

R-squared:         0.7743
Adj R-squared:     0.6615

Rmse:              0.5156

F-stat (1, 2):     6.8626, p-value:     0.1200

Degrees of Freedom: model 1, resid 2

-----------------------Summary of Estimated Coefficients------------------------
      Variable       Coef    Std Err     t-stat    p-value    CI 2.5%   CI 97.5%
--------------------------------------------------------------------------------
             x    -0.6040     0.2306      -2.62     0.1200    -1.0560    -0.1521
     intercept     0.2915     0.4314       0.68     0.5689    -0.5540     1.1370
---------------------------------End of Summary---------------------------------

或者,您可以将索引转换为整数,但我发现这并没有很好地工作(我假设因为整数代表自纪元以来的纳秒或类似的东西,因此非常大而导致精度问题),但转换为整数并除以一万亿左右确实起作用,并且给出与使用dt.hour基本相同的结果(即相同的r平方):

pd.ols(x=pd.to_datetime(z["index"]).astype(int)/1e12, y=z[0])

错误消息的来源

FWIW,看起来错误信息来自以下内容:

pd.to_datetime(z["index"]).astype(float)

虽然有一个相当明显的解决方法:

pd.to_datetime(z["index"]).astype(int).astype(float)