考虑以下示例:
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 :(得分:6)
显然,statsmodels
使用名为patsy
的库来解释传递给ols
的公式。从docs开始,形式为:
y ~ a + a:b + np.log(x)
将构造一个形式为patsy的对象:
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。
答案 1 :(得分:1)
正如@Josef所说,可以使用patsy Q
来引用变量:
smf.ols('Q("177sdays") ~ b', df2).fit()