Как правильно использовать индексирование при использовании statsmodels OLS в группе панд?
Как и другие до меня (например, подобные вопросы), я пытаюсь использовать statsmodels OLS в группе панд. Однако, пытаясь отправить остатки результатов в столбец в существующем фрейме данных, я сталкиваюсь либо с индексацией 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
кажется, чтобы решить проблему.
1 ответ
Я могу ответить на мой вопрос. Это:
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