您传递给的函数apply
必须以apandas.DataFrame
作为第一个参数。您可以将其他关键字或位置参数apply
传递给该参数或传递给应用函数。因此,您的示例将进行少量修改即可工作。更改ols_res
为
def ols_res(df, xcols, ycol):
return sm.OLS(df[ycol], df[xcols]).fit().predict()
然后,你可以使用groupby
和apply
喜欢这个
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})
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
在索引中没有组标签。