【发布时间】:2016-12-20 14:07:29
【问题描述】:
我有一个 DataFrame df1:
import pandas as pd
import numpy as np
import statsmodels.formula.api as sm
df1 = pd.DataFrame( np.random.randn(3000,1), index= pd.date_range('1/1/1990', periods=3000), columns = {"M"})
我想将元素分组为大小 = 10 的框,使用 OLS 拟合它们并计算 Y_t,其中 Y_t代表一系列直线拟合。
换句话说,我想取前 10 个值,使用 OLS ( Y_t = b*X_t+a_0) 拟合它们并获得这 10 个值的值 Y_t。再次对接下来的 10 个值执行相同操作(不是滚动窗口!),依此类推。
我的方法
我遇到的第一个问题是我无法使用 DateTime 值作为预测变量来拟合元素,因此我定义了一个新的 DataFrame df_fit,其中包含两列 A 和 B。列A包含从0到9的整数,列B以10个元素为一组的df1的值:
def compute_yt(df,i,bs):
df_fit = pd.DataFrame({"B": np.arange(1,bs+1),\
"A": df.reset_index().loc[i*bs:((i+1)*bs-1), "M"]})
fit = sm.ols(formula = "A ~ B", data = df_fit).fit()
yt = fit.params.B*df_fit["B"] + fit.params.Intercept
return yt
其中bs 是框大小(本例中为10),i 是允许扫描所有值的索引。
最后,
result = [compute_yt(df1,n,l) for n in np.arange(0,round(len(df1)/l)-1)]
result =
Name: B, dtype: float64, 840 -0.249590
841 -0.249935
842 -0.250280
843 -0.250625
844 -0.250970
845 -0.251315
846 -0.251660
847 -0.252005
848 -0.252350
849 -0.252695
Name: B, dtype: float64, 850 -0.252631
851 -0.252408
... ...
result 是一个列表,应该包含直线拟合的值。
所以,我的问题如下:
有没有办法使用 DateTime 值作为预测变量来运行 OLS?
我想使用列表推导来构建一个包含
y_t值的DataFrame(与df1具有相同的形状)。这与问题(1)有关,因为我想获得这些值的时间序列。有没有更“pythonic”的方式来编写这段代码?我对数据框进行切片的方式似乎不太合适。
【问题讨论】:
-
在日期方面,显而易见的选择就是转换为整数
astype(np.int64)或使用 dt 访问器(例如dt.year)或 dt 访问器的组合。 -
我不知道它是否比你所做的更 Pythonic,但你可以使用
pd.cut或pd.qcut进行分箱。
标签: python pandas curve-fitting statsmodels binning