在 pandas groupby 中使用 statsmodels OLS 时如何正确使用索引?
How does one use indexing properly when using statsmodels OLS in a pandas groupby?
像我之前的其他人一样(例如 之类的问题),我正在尝试在 pandas groupby 中使用 statsmodels OLS。但是,在尝试将结果的残差发送到现存数据帧中的列时,我 运行 反对索引 ValueErrors(如果我使用应用)或 KeyErrors(如果我使用转换)。
我当前的代码是:
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: Wrong number of items passed 4, placement implies 1" 的结果,而更改应用于转换的结果会产生 "KeyError: ('x_var', 'occurred at index 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 没有任何作用。
我应该做什么更合适?
感谢大家的帮助。
编辑:
大家好,我显然无法 post 回答我自己的问题,但我想我已经找到了解决方案。使用:
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
像我之前的其他人一样(例如
我当前的代码是:
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: Wrong number of items passed 4, placement implies 1" 的结果,而更改应用于转换的结果会产生 "KeyError: ('x_var', 'occurred at index 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 没有任何作用。
我应该做什么更合适?
感谢大家的帮助。
编辑: 大家好,我显然无法 post 回答我自己的问题,但我想我已经找到了解决方案。使用:
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