微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

熊猫回归按两列分组

如何解决熊猫回归按两列分组

要做什么

我想按库存项目得出平均股价,流通量的回归系数和股价的R平方。 Apple,Amazon等,以及某些日期期限,例如2月15日至3月14日。作为涵盖30年的定量投资模拟的一部分。问题在于它太慢了。起初,我使用Postgresql编写了整个代码,但速度太慢-2小时后未完成。在问了管理信息系统的一位教授朋友之后,我第一次尝试了熊猫。


到目前为止实现的数据结构如下:

  1. 原始数据(数据框名为dfStock)
    ────────────────────── 代码日期日期组|价格|
    ────────────────────── AAPL | 20200205 | 20200205 | ###。## |
    AAPL | 20200206 | 20200305 | ###。## |
    ...
    AAPL | 20200305 | 20200305 | ###。## |
    AAPL | 20200306 | 20200405 | ###。## |
    ...
    ──────────────────────

  2. 结果(名为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)Xtycov(X,y)/sqrt(var(X)var(y))来计算它们可能会更有效。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。