Недопустимое имя переменной Statsmodels (Patsy) / объект 'Series' не вызывается Ошибка

1

Обновить:

Ошибка могла быть вызвана тем фактом, что в моем наборе данных также есть переменная с именем "Q", которая конфликтует с Q-функцией. В этом случае, как мне изящно решить это?


Обновление: Вы можете загрузить мой набор данных здесь.


Я запускаю простую регрессию OLS со статистическими данными и файлами данных pandas следующим образом:

import statsmodels.formula.api as sm
import pandas as pd
df=pd.read_csv("exp.csv")
#df is a dataframe that I have containing many variable names such as AAPL, SPY, INF, etc.
for column in df: 
    result=sm.ols(formula="SPY"+" ~ "+column, data=df).fit()

Однако одним из имен столбцов в df является INF. Я думаю, возможно, INF является зарезервированным словом для пасты, код дает мне следующую ошибку:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/statsmodels/base/model.py", line 155, in from_formula
    missing=missing)
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/statsmodels/formula/formulatools.py", line 65, in handle_formula_data
    NA_action=na_action)
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/patsy/highlevel.py", line 310, in dmatrices
    NA_action, return_type)
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/patsy/highlevel.py", line 165, in _do_highlevel_design
    NA_action)
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/patsy/highlevel.py", line 62, in _try_incr_builders
    formula_like = ModelDesc.from_formula(formula_like)
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/patsy/desc.py", line 165, in from_formula
    value = Evaluator().eval(tree, require_evalexpr=False)
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/patsy/desc.py", line 400, in eval
    result = self._evaluators[key](self, tree)
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/patsy/desc.py", line 221, in _eval_any_tilde
    exprs = [evaluator.eval(arg) for arg in tree.args]    
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/patsy/desc.py", line 400, in eval
    result = self._evaluators[key](self, tree)
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/patsy/desc.py", line 355, in _eval_number
    "only allowed with **", tree)
patsy.PatsyError: numbers besides '0' and '1' are only allowed with **
    SPY ~ INF
          ^^^

Я также попытался использовать функцию Q:

result=sm.ols(formula="SPY"+" ~ "+"Q('INF')", data=df).fit()

Тем не менее, это дает мне следующую ошибку:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/statsmodels/base/model.py", line 155, in from_formula
    missing=missing)
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/statsmodels/formula/formulatools.py", line 65, in handle_formula_data
    NA_action=na_action)
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/patsy/highlevel.py", line 310, in dmatrices
    NA_action, return_type)
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/patsy/highlevel.py", line 165, in _do_highlevel_design
    NA_action)
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/patsy/highlevel.py", line 70, in _try_incr_builders
    NA_action)
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/patsy/build.py", line 696, in design_matrix_builders
    NA_action)
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/patsy/build.py", line 443, in _examine_factor_types
    value = factor.eval(factor_states[factor], data)
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/patsy/eval.py", line 566, in eval
    data)
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/patsy/eval.py", line 551, in _eval
    inner_namespace=inner_namespace)
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/patsy/compat.py", line 36, in call_and_wrap_exc
    return f(*args, **kwargs)
  File "/home/ap248/.local/easybuild/software/2017/Core/miniconda2/4.3.27/lib/python2.7/site-packages/patsy/eval.py", line 166, in eval
    + self._namespaces))
  File "<string>", line 1, in <module>
TypeError: 'Series' object is not callable

Любая идея, как его решить?

Теги:
pandas
statistics
regression
statsmodels

2 ответа

0
Лучший ответ

Я решил проблему, проигнорировав формулу и используя вместо этого прямой интерфейс:

for column in df: 
    Y,X = df[column], df['SPY']
    X = sm.add_constant(X)
    result=sm.OLS(Y,X).fit()

Мне кажется, что интерфейс все еще имеет некоторые проблемы и не прост в использовании.

1

Согласно этой ссылке: http://patsy.readthedocs.io/en/latest/builtins-reference.html#patsy.builtins.Q вы можете использовать Q ("var") в формуле, чтобы избавиться от ошибки.

Следующий код должен работать.

model = sm.ols('SPY ~ Q("INF")',data=df).fit()

Полный пример

import statsmodels.formula.api as sm
import pandas as pd
import numpy as np

a = np.random.rand(10,3)
df = pd.DataFrame(data=a, columns=['SPY','INF','X'])

model = sm.ols('SPY ~ Q("INF")',data=df).fit()
  • 0
    Но почему он дал мне объект серии, который не вызывается ошибкой? Код кажется мне одинаковым.
  • 0
    Ошибка могла быть вызвана тем, что в моем наборе данных также есть переменная с именем "Q", которая конфликтует с функцией Q. В таком случае, как мне это элегантно решить? @sukhbinder

Ещё вопросы

Сообщество Overcoder
Наверх
Меню