我希望得到一个时间序列作为预测变量的回归,我试图按照这个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]
之类的日期时间
答案 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)