2014-07-03 61 views
6

假設我有一個DataFrame,其中一列爲y變量,許多列爲x變量。我希望能夠運行y vs x1y vs x2,...等的多個單變量回歸,並將預測存儲回DataFrame。另外我需要通過組變量來做到這一點。Python熊貓:如何按組運行多個單變量回歸

import statsmodels.api as sm 
import pandas as pd 

df = pd.DataFrame({ 
    'y': np.random.randn(20), 
    'x1': np.random.randn(20), 
    'x2': np.random.randn(20), 
    'grp': ['a', 'b'] * 10}) 

def ols_res(x, y): 
    return sm.OLS(y, x).fit().predict() 

df.groupby('grp').apply(ols_res) # This does not work 

上面的代碼顯然不起作用。我不清楚如何正確地將固定的y傳遞給函數,而apply迭代通過x列(x1,x2,...)。我懷疑可能有一個非常聰明的單線解決方案來做到這一點。任何想法?

回答

5

您傳遞給apply的函數必須以pandas.DataFrame作爲第一個參數。您可以將其他關鍵字或位置參數傳遞給傳遞給應用函數的apply。所以你的例子可以用一個小的修改。變更ols_res

def ols_res(df, xcols, ycol): 
    return sm.OLS(df[ycol], df[xcols]).fit().predict() 

然後,您可以使用groupbyapply這樣

df.groupby('grp').apply(ols_res, xcols=['x1', 'x2'], ycol='y') 

或者

df.groupby('grp').apply(ols_res, ['x1', 'x2'], 'y') 

編輯

上面的代碼確實不是運行多個單變量迴歸。相反,它會爲每個組運行一個多元變量迴歸。然而,(另一個)略微修改它會。

def ols_res(df, xcols, ycol): 
    return pd.DataFrame({xcol : sm.OLS(df[ycol], df[xcol]).fit().predict() for xcol in xcols}) 

EDIT 2

雖然,上述解決方案的工作,我認爲以下是多一點大熊貓-Y

import statsmodels.api as sm 
import pandas as pd 
import numpy as np 

df = pd.DataFrame({ 
    'y': np.random.randn(20), 
    'x1': np.random.randn(20), 
    'x2': np.random.randn(20), 
    'grp': ['a', 'b'] * 10}) 

def ols_res(x, y): 
    return pd.Series(sm.OLS(y, x).fit().predict()) 

df.groupby('grp').apply(lambda x : x[['x1', 'x2']].apply(ols_res, y=x['y'])) 

出於某種原因,如果我定義ols_res(),因爲它最初,結果DataFrame在索引中沒有組標籤。

+0

其實我相信這是運行一個多元迴歸,而不是循環遍歷列並運行多個單變量回歸。 – ezbentley

+0

對不起,我應該更仔細地閱讀這個問題。請參閱我的編輯。 – JaminSore