如何解决熊猫回归按两列分组
我要做什么
我想按库存项目得出平均股价,流通量的回归系数和股价的R平方。 Apple,Amazon等,以及某些日期期限,例如2月15日至3月14日。作为涵盖30年的定量投资模拟的一部分。问题在于它太慢了。起初,我使用Postgresql编写了整个代码,但速度太慢-2小时后未完成。在问了管理信息系统的一位教授朋友之后,我第一次尝试了熊猫。
到目前为止实现的数据结构如下:
-
原始数据(数据框名为dfStock)
────────────────────── 代码日期日期组|价格|
────────────────────── AAPL | 20200205 | 20200205 | ###。## |
AAPL | 20200206 | 20200305 | ###。## |
...
AAPL | 20200305 | 20200305 | ###。## |
AAPL | 20200306 | 20200405 | ###。## |
...
────────────────────── -
结果(名为dfSumS的数据框)
────────────────────── 代码日期组|平均价格坡度R平方
────────────────────── AAPL | 20200205 | ###。## | #。## | #。##
AMZN | 20200205 | ###。## | #。## | #。##
...
AAPL | 20200305 | ###。## | #。## | #。##
AMZN | 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'])]
我之前尝试过的
根据此link中的建议,我尝试了矢量化,但收到消息“只能比较标记相同的Series对象”。无法解决此问题,我在上面提到了两个功能,它们的速度不够快。两者都使用了较少的代码集(例如2020年),但是一旦数据周期长达2到3个十年,就需要花费数小时。
我考虑过应用,迭代等问题,但是没有这样做,因为首先,链接说它比我做的要慢,其次,每一个似乎只适用于一列,而我必须得到两个结果-系数和R-square在同一时期内,因此两次调用它们肯定会更慢。
现在我正在尝试一些帖子中提到的泳池游戏
解决方法
恐怕如果您要运行成千上万的大型线性回归,那么您将不得不付出花费在运行上的时间的代价。如果仅对beta系数或r2值感兴趣,则分别使用numpy
分别为(XtX)^(-1)Xty
和cov(X,y)/sqrt(var(X)var(y))
来计算它们可能会更有效。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。