Как и другие до меня (например, такие вопросы, как this ), я пытаюсь использовать OLS statsmodels внутри группы панд.Однако, пытаясь отправить остатки результатов в столбец в существующем фрейме данных, я сталкиваюсь либо с индексацией 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')".Из результатов отладки кажется, что создание остатков кажется правильным, но ему трудно поместить серию остатков обратно в группу с правильной индексацией.Однако неясно, что бы правильно это сделать.
Если я попытаюсь использовать итерацию цикла for через DataFrameGroupBy, как в вопросе, который я цитировал, исходный кадр останется неизменным.В результате такие вещи, как
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
, кажется, решает проблему.