数字作为变量名称无法被statsmodels.formula.api识别

时间:2016-11-23 01:25:13

标签: python pandas statsmodels

考虑以下示例:

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)

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

2 个答案:

答案 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()