Блокнот ipython и категориальная переменная patsy (формула)

У меня была та же ошибка, что и в этом вопросе.

Что странно, так это то, что он работает (с предоставленным ответом) в оболочке ipython, но не в блокноте ipython. Но это связано с оператором C(), потому что без него работает (но не как оператор)

То же самое с этим примером:

import statsmodels.formula.api as smf
import numpy as np
import pandas


url = "http://vincentarelbundock.github.com/Rdatasets/csv/HistData/Guerry.csv"
df = pandas.read_csv(url)
df = df[['Lottery', 'Literacy', 'Wealth', 'Region']].dropna()
df.head()
mod = smf.ols(formula='Lottery ~ Literacy + Wealth + Region', data=df)
res = mod.fit()
print res.summary()

Это хорошо работает как в блокноте ipython, так и в оболочке, и patsy обрабатывает Region как категориальную переменную, поскольку она состоит из строк.

но если я попробую это (как в учебнике):

res = smf.ols(formula='Lottery ~ Literacy + Wealth + C(Region)', data=df).fit()

Я получил ошибку в блокноте ipython:

TypeError: 'Series' object is not callable

Обратите внимание, что и в блокноте, и в оболочке statsmodels и patsy стоят одинаковые версии (0.5.0 и 0.3.0 соответственно)

У вас такая же ошибка?


person jrjc    schedule 06.10.2014    source источник
comment
Я не получаю никаких ошибок ни с patsy 0.2.1, ни с patsy 0.3. Я использую версию разработки statsmodels, но я не думаю, что есть какие-либо изменения, связанные со statsmodels. Я использовал версии панд 0.12 и 0.14.1dev.   -  person Josef    schedule 06.10.2014
comment
@ user333700: Вы не получаете ошибку в блокноте ipython? У вас есть идеи, как это исправить с моей стороны, если это не ошибка?   -  person jrjc    schedule 06.10.2014
comment
В блокноте ошибок нет. (В блокноте у меня есть только панды 0.12, но обе версии patsy.) У меня нет особого представления о том, как это исправить, поскольку я не подозреваю, что может быть не так. Попробуйте просмотреть детали обратной трассировки и проверить, где может быть определена серия C. У вас есть много автоматических импортов, которые могут мешать?   -  person Josef    schedule 07.10.2014
comment
@ user333700: На самом деле это было потому, что у меня была переменная в моем пространстве имен с именем C, но не в DataFrame. Спасибо за вашу помощь   -  person jrjc    schedule 07.10.2014


Ответы (1)


В конце концов я нашел проблему.

Это потому, что была переменная с именем C, которую я использовал ранее в блокноте. Что удивительно, так это то, что это не был столбец df, который я использовал.

В любом случае, основное решение:

del C

перед запуском регрессии.

Надеюсь, это поможет людям, столкнувшимся с той же проблемой.

Но я все еще не уверен, является ли это ожидаемым поведением patsy.

person jrjc    schedule 07.10.2014
comment
Это ожидаемое поведение. Среда оценки patsy разрешается в пространство имен вызывающего объекта. Мы жестко запрограммируем это в statsmodels. См. переменную eval_env в документации patsy. Я обсуждаю раскрытие этого пользователям, чтобы было легче избежать подобных ситуаций. - person jseabold; 07.10.2014
comment
@jseabold: Спасибо за ваш комментарий. Я думаю, было бы здорово просто упомянуть об этом в учебнике (например, в этом, раздел Категориальная переменная) с каким-то окном предупреждения. Потому что я думаю, что этот документ слишком технический для такой маленькой проблемы. Если бы я это увидел, не уверен, что это помогло бы мне. - person jrjc; 07.10.2014
comment
Я добавил об этом примечание и возможность для пользователей контролировать, в какой среде пространства имен оценивается формула. github.com/statsmodels/statsmodels/pull/2031 - person jseabold; 08.10.2014