在pandas groupby中使用statsmodels OLS时如何正确使用索引?

时间:2018-06-11 03:53:31

标签: python pandas statsmodels

与我之前的其他人一样(例如this之类的问题),我试图在pandas groupby中使用statsmodels OLS。但是,在尝试发送结果时#39;现有数据框中的列的残差,我反对索引ValueErrors(如果我使用apply)或KeyErrors(如果我使用transform)。

我目前的代码是:

def regression_residuals(df, **kwargs):
    X = df[kwargs['x_column']]
    y = df[kwargs['y_column']]
    regr_ols = sm.OLS(y,X).fit()
    resid = regr_ols.resid.reset_index(drop=True)
    return resid

df['residuals'] = df.groupby(['year_and_month']).apply(
regression_residuals, x_column = 'x_var', y_column = 'y_var')

原样,代码产生" ValueError的结果:传递的项目数量错误4,位置意味着1",而更改应用于转换结果" KeyError:(' x_var','发生在索引item_label')"。从调试输出看来残差的创建看起来是正确的,但它很难将残差序列放回到具有正确索引的groupby中。然而,它并不明显是什么才能正确地做到这一点。

如果我尝试在我引用的问题中使用DataFrameGroupBy中的for循环迭代,则原始框架保持不变。结果,像

grps = df.groupby(['year_and_month'])
for year_month, grp in grps:
    grp['residuals'] = apply_reg_resid(grp, x_column = 'x_var', y_column = 'y_var')

在这里没用,因为它对原始df没有任何作用。

我应该做些什么呢?

感谢大家的帮助。

编辑: 大家好,我显然无法回答我自己的问题,但我想我已经找到了解决方案。使用:

def regression_residuals(df, **kwargs):
    X = df[kwargs.pop('x_column')].values
    y = df[kwargs.pop('y_column')].values
    X = sm.add_constant(X, prepend=False)
    regr_ols = sm.OLS(y,X).fit()
    resid = regr_ols.resid
    df_resid = pd.DataFrame(resid, index=df.index)
    return resid

似乎解决了这个问题。

1 个答案:

答案 0 :(得分:0)

我能够回答我的问题。它是:

def regression_residuals(df, **kwargs):
    X = df[kwargs.pop('x_column')]
    y = df[kwargs.pop('y_column')]
    X = sm.add_constant(X, prepend=False)
    regr_ols = sm.OLS(y,X).fit()
    resid = regr_ols.resid
    df_resid = pd.DataFrame(resid, index=df.index)
    return resid