簡體   English   中英

按兩列分組的 Pandas 回歸

[英]Pandas Regression by group of two columns

我要做什么

我想按股票項目(例如Apple,Amazon 等)和特定日期時間段(例如2 月15 日~3 月14 日)獲取浮動股票價格的平均股價、回歸系數和R 平方。 作為涵蓋 30 年的量化投資模擬的一部分。 問題是它太慢了。 起初,我用 PostgreSQL 編寫了整個代碼,但速度太慢了 - 2 小時后沒有完成。 問了管理信息系統的一位教授朋友后,我第一次嘗試pandas。


到目前為止實現的數據結構如下所示:

  1. 原始數據(名為 dfStock 的數據框)
    ────────────────────────────────────────────
    代碼 | 日期 | 日期組 | 價格 |
    ────────────────────────────────────────────
    蘋果| 20200205 | 20200205 | ###.## |
    蘋果| 20200206 | 20200305 | ###.## |
    ...
    蘋果| 20200305 | 20200305 | ###.## |
    蘋果| 20200306 | 20200405 | ###.## |
    ...
    ────────────────────────────────────────────

  2. 結果(名為 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)Xtycov(X,y)/sqrt(var(X)var(y))分別計算它們可能更有效cov(X,y)/sqrt(var(X)var(y))分別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM