Как правильно использовать индексирование при использовании 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
Другие вопросы по тегам