2014-07-03 22 views
6

Giả sử tôi có một DataFrame với một cột là y biến và nhiều cột của các biến số x. Tôi muốn có thể chạy nhiều lần hồi quy đơn biến của y so với x1, yx2, ..., v.v. và lưu trữ dự đoán trở lại vào DataFrame. Ngoài ra tôi cần phải làm điều này bởi một biến nhóm.pandas Python: cách chạy nhiều hồi quy đơn biến theo nhóm

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 

Đoạn mã trên rõ ràng không hoạt động. Nó không phải là rõ ràng với tôi làm thế nào để chính xác vượt qua cố định y với chức năng trong khi có apply lặp qua các cột x (x1, x2, ...). Tôi nghi ngờ có thể có một giải pháp một dòng rất thông minh để làm điều này. Bất kỳ ý tưởng?

Trả lời

5

Hàm bạn chuyển đến apply phải có một đối số đầu tiên là pandas.DataFrame. Bạn có thể chuyển các đối số từ khóa hoặc vị trí bổ sung cho apply được chuyển tới hàm được áp dụng. Vì vậy, ví dụ của bạn sẽ làm việc với một sửa đổi nhỏ. Thay đổi ols_res để

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

Sau đó, bạn có thể sử dụng groupbyapply như

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

Hoặc

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

EDIT này

Đoạn mã trên không không chạy nhiều biến đổi hồi quy. Thay vào đó, nó chạy một hồi quy đa biến mỗi nhóm. Tuy nhiên, với một sửa đổi nhỏ khác, nó sẽ thay đổi.

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

EDIT 2

Mặc dù, các giải pháp trên làm việc, tôi nghĩ rằng đây là nhiều hơn một chút gấu trúc-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'])) 

Đối với một số lý do, nếu tôi xác định ols_res() vì nó ban đầu, kết quả DataFrame không có nhãn nhóm trong chỉ mục.

+0

Thực ra tôi tin rằng điều này chạy một hồi quy đa biến thay vì lặp qua các cột và chạy nhiều hồi quy đơn biến. – ezbentley

+0

Xin lỗi về điều đó, tôi nên đọc câu hỏi kỹ hơn. Vui lòng xem chỉnh sửa của tôi. – JaminSore

Các vấn đề liên quan