python - 时间序列 Pandas 的线性回归

标签 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: cannot astype a datetimelike from [datetime64[ns]] to [float64]

最佳答案

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

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

但是,这会使您的 r 平方为 1,因为您的模型因包含截距而过度指定(并且 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)

关于python - 时间序列 Pandas 的线性回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30425490/

相关文章:

python - 如何按特定顺序重新排列 Numpy 数组?

python - 给定一定的比例,我如何调整图像的大小?

python - 如何创建前 n 个项目的 2 级 groupby

python - 为什么 statsmodels 的 OLS 中的四次线性回归与 LibreOffice Calc 不匹配?

python-3.x - 是否可以使用 pandas 和/或 pyreadstat 分块读取大型 SPSS 文件,或者是否存在替代方案?

python - 将curl转换为python : usernames and passwords

python - 使用 PyQt5 显示 OpenCV 图像

python - 为什么文本编辑器将某些字符显示为 unicode 代码点?

python - 根据列名称进行计算并获取名称作为计算的一部分

python - NumPy 数组中相同行的索引