Как правильно использовать индексирование при использовании statsmodels OLS в группе панд? - PullRequest
0 голосов
/ 11 июня 2018

Как и другие до меня (например, такие вопросы, как 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

, кажется, решает проблему.

1 Ответ

0 голосов
/ 14 июня 2018

Я могу ответить на мой вопрос.Это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...