2016-11-23 71 views
2

认可请看下面的例子:号作为变量名不statsmodels.formula.api

import pandas as pd 
from pandas import DataFrame 
import statsmodels.formula.api as smf 
df = DataFrame({'a': [1,2,3], 'b': [2,3,4]}) 
df2 = DataFrame({'177sdays': [1,2,3], 'b': [2,3,4]}) 

然后 smf.ols('a ~ b', df) smf.ols('177sdays ~ b', df2)

而且第一工作和第二个没有。唯一的区别似乎是变量名中存在数字字符。为什么是这样?

+0

特别是它会生成错误无效语法! – user7147790

+0

...有效的python名称不能以数字开头。也许在引擎盖下有一个statsmodels eval。尝试用下划线加前缀。 –

+0

'Q'可以“引用”任意变量名称http://patsy.readthedocs.io/en/latest/builtins-reference.html#patsy.builtins.Q – user333700

回答

3

显然,statsmodels使用名为patsy的库来解释传递给ols的公式。从docs形式的快报:

y ~ a + a:b + np.log(x) 

将构造形式的懦夫对象:

ModelDesc([Term([EvalFactor("y")])], 
     [Term([]), 
     Term([EvalFactor("a")]), 
     Term([EvalFactor("a"), EvalFactor("b")]), 
     Term([EvalFactor("np.log(x)")])]) 

EvalFactor然后 “执行任意的Python代码”。因此你的变量名必须是有效的Python identifiers.。即 大写和小写字母A到Z,下划线_和第一个字符除外,数字0到9.

+0

谢谢!这很清楚。 – user7147790

+0

这是非常有帮助的。否则,这是一个带有完全模糊错误信息的“疑难杂症”。谢谢! – Jeff