熊猫回归(按两列分组)

时间:2020-10-04 11:42:21

标签: python pandas optimization regression

我要做什么

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


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

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

  2. 结果(名为dfSumS的数据框)
    ──────────────────────<< br /> 代码日期组|平均价格坡度R平方
    ──────────────────────<< br /> 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在同一时期内,因此两次调用它们肯定会更慢。

现在我正在尝试一些帖子中提到的泳池游戏

1 个答案:

答案 0 :(得分:0)

恐怕如果您要运行成千上万的大型线性回归,那么您将不得不付出花费在运行上的时间的代价。如果仅对beta系数或r2值感兴趣,则分别使用numpy分别为(XtX)^(-1)Xtycov(X,y)/sqrt(var(X)var(y))来计算它们可能会更有效。