[英]Pandas Regression by group of two columns
我要做什么
我想按股票项目(例如Apple,Amazon 等)和特定日期时间段(例如2 月15 日~3 月14 日)获取浮动股票价格的平均股价、回归系数和R 平方。 作为涵盖 30 年的量化投资模拟的一部分。 问题是它太慢了。 起初,我用 PostgreSQL 编写了整个代码,但速度太慢了 - 2 小时后没有完成。 问了管理信息系统的一位教授朋友后,我第一次尝试pandas。
到目前为止实现的数据结构如下所示:
原始数据(名为 dfStock 的数据框)
────────────────────────────────────────────
代码 | 日期 | 日期组 | 价格 |
────────────────────────────────────────────
苹果| 20200205 | 20200205 | ###.## |
苹果| 20200206 | 20200305 | ###.## |
...
苹果| 20200305 | 20200305 | ###.## |
苹果| 20200306 | 20200405 | ###.## |
...
────────────────────────────────────────────
结果(名为 dfSumS 的数据框)
────────────────────────────────────────────
代码 | 日期组 | 平均价格 | 坡度 | R平方
────────────────────────────────────────────
苹果| 20200205 | ###.## | #.## | #.##
亚马逊 | 20200205 | ###.## | #.## | #.##
...
苹果| 20200305 | ###.## | #.## | #.##
亚马逊 | 20200305 | ###.## | #.## | #.##
...
────────────────────────────────────────────
代码截至现在
'prevdt'对应上面的'Date Group','compcd'表示公司代码
from sklearn.linear_model import LinearRegression
# Method Tried 1
model = LinearRegression()
def getRegrS(arg_cd, arg_prevdt):
x = dfStock[(dfStock['compcd']==arg_cd) & (dfStock['prevdt']==arg_prevdt)]['rnk'].to_numpy().reshape((-1,1))
y = dfStock[(dfStock['compcd']==arg_cd) & (dfStock['prevdt']==arg_prevdt)]['adjenp'].to_numpy()
model.fit(x, y)
return model.coef_[0], model.score(x,y)
# Method Tried 2
def getRegrS(arg_cd, arg_prevdt):
x = dfStock[(dfStock['compcd']==arg_cd) & (dfStock['prevdt']==arg_prevdt)]['rnk'].to_numpy()
y = dfStock[(dfStock['compcd']==arg_cd) & (dfStock['prevdt']==arg_prevdt)]['adjenp'].to_numpy()
rv = stats.linregress(x,y)
return rv[0], rv[2]
dfSumS['rnk'] = dfStock.groupby(['compcd','prevdt']).cumcount()+1
dfSumS[['slope','rsq']]= [getRegrS(cd, prevdt) for cd, prevdt in zip(dfSumS['compcd'], dfSumS['prevdt'])]
我以前尝试过的
根据此链接中的建议,我尝试了矢量化,但收到消息“只能比较标记相同的系列对象”。 没办法解决这个问题,就来了上面的两个函数,速度都不够快。 两者都使用较小的一组代码,例如 2020 年,但是一旦数据周期变得大到 2 到 3 个十年,就需要几个小时。
我想到了申请、iterrows 等,但没有,因为首先链接说它比我做的慢,其次,这些似乎只适用于一列,而我必须得到两个结果 - 系数和 R 方在同一时期内调用它们两次肯定会更慢。
现在我正在尝试一些帖子中提到的游泳池
恐怕如果您试图运行数千个大型线性回归,那么您将不得不为运行所花费的时间付出代价。 如果您只对 beta 系数或 r2 值感兴趣,那么使用numpy
作为(XtX)^(-1)Xty
和cov(X,y)/sqrt(var(X)var(y))
分别计算它们可能更有效cov(X,y)/sqrt(var(X)var(y))
分别。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.