Python 在pandas groupby中使用StatSols模型时,如何正确使用索引?

Python 在pandas groupby中使用StatSols模型时,如何正确使用索引?,python,pandas,statsmodels,Python,Pandas,Statsmodels,与我之前的其他人一样(例如,类似的问题),我正在尝试在pandas groupby中使用statsmodels。然而,在尝试将结果的残差发送到现有数据帧中的列时,我遇到了索引ValueErrors(如果我使用apply)或keyrerrors(如果我使用transform) 我目前的代码是: def regression_residuals(df, **kwargs): X = df[kwargs['x_column']] y = df[kwargs['y_column']]

与我之前的其他人一样(例如,类似的问题),我正在尝试在pandas groupby中使用statsmodels。然而,在尝试将结果的残差发送到现有数据帧中的列时,我遇到了索引ValueErrors(如果我使用apply)或keyrerrors(如果我使用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,placement意味着1”,而更改apply以转换“KeyError:('x_var','发生在索引项_标签上')”的结果。从调试输出来看,残差的创建似乎是正确的,但很难将残差序列放回具有正确索引的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

似乎解决了问题。

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

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