Python Pandas-数据帧中多列的滚动回归
我有一个大数据框,包含20年内10000列(股票)的每日价格时间序列(5000行x 10000列)。缺失的观测值由NAN表示Python Pandas-数据帧中多列的滚动回归,python,pandas,dataframe,apply,Python,Pandas,Dataframe,Apply,我有一个大数据框,包含20年内10000列(股票)的每日价格时间序列(5000行x 10000列)。缺失的观测值由NAN表示 0 1 2 3 4 5 6 7 8 \ 31.12.2009 30.75 66.99 NaN NaN NaN NaN 393.87 57.04 NaN 01.01.2010 30.75 66.99 NaN
0 1 2 3 4 5 6 7 8 \
31.12.2009 30.75 66.99 NaN NaN NaN NaN 393.87 57.04 NaN
01.01.2010 30.75 66.99 NaN NaN NaN NaN 393.87 57.04 NaN
04.01.2010 31.85 66.99 NaN NaN NaN NaN 404.93 57.04 NaN
05.01.2010 33.26 66.99 NaN NaN NaN NaN 400.00 58.75 NaN
06.01.2010 33.26 66.99 NaN NaN NaN NaN 400.00 58.75 NaN
现在,我想在整个采样周期内为每列运行一个250天窗口的滚动回归,并将系数保存在另一个数据框中
使用两个for循环迭代列和行不是很有效,所以我尝试了这个方法,但得到了以下错误消息
def regress(start, end):
y = df_returns.iloc[start:end].values
if np.isnan(y).any() == False:
X = np.arange(len(y))
X = sm.add_constant(X, has_constant="add")
model = sm.OLS(y,X).fit()
return model.params[1]
else:
return np.nan
regression_window = 250
for t in (regression_window, len(df_returns.index)):
df_coef[t] = df_returns.apply(regress(t-regression_window, t), axis=1)
这是我的版本,使用df.rolling()并在列上迭代。 我不完全确定这是你想要的不要犹豫发表评论
将statsmodels.regression.linear_模型导入为sm
将statsmodels.tools.tools作为sm2导入
df_returns=pd.DataFrame({'0':[30,30,31,32,32],'1':[60,60,60,60,60],'2':[np.NaN,np.NaN,np.NaN,np.NaN,np.NaN]})
def回归(X,Z):
如果np.isnan(X).any()==False:
model=sm.OLS(X,Z).fit()
返回模型参数[1]
其他:
返回np.NaN
回归窗口=3
Z=np.arange(回归窗口)
Z=sm2。添加常数(Z,has_constant=“添加”)
df_coef=pd.DataFrame()
对于df_returns.cols中的列:
df_coef[col]=df_返回[col]。滚动(窗口=回归窗口)。应用(lambda列:回归(col,Z))
德福系数
这非常好用-谢谢!有任何关于如何进一步提高速度的建议吗?如果这个问题符合您的需要,请毫不犹豫地验证/投票。为了加快计算速度,您可以删除print()语句并删除行Z=np.arange(len(X))
和Z=sm2.add_constant(Z,has_constant=“add”)
,并将Z作为回归函数的参数传递,因为X的大小不会改变。您的编辑有助于将计算速度提高26%-太棒了!是否投票赞成/验证您的答案,不确定是否会显示,因为我没有15的stackoverflow声誉(刚刚开始)很高兴我提供了帮助,是的,答案已验证
TypeError: ("'float' object is not callable", 'occurred at index 31.12.2009')