statsmodels.formula.api 无法识别作为变量名称的数字
Numbers as variable names not recognized by 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)
第一个有效,第二个无效。唯一的区别似乎是变量名称中存在数字字符。这是为什么?
显然,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
then "executes arbitrary Python code." Thus your variable names must be valid Python identifiers。 IE。
大写和小写字母 A 到 Z、下划线 _ 以及除第一个字符外的数字 0 到 9。
正如@Josef 所说,可以使用 patsy Q
来引用变量:
smf.ols('Q("177sdays") ~ b', df2).fit()
考虑以下示例:
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)
第一个有效,第二个无效。唯一的区别似乎是变量名称中存在数字字符。这是为什么?
显然,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
then "executes arbitrary Python code." Thus your variable names must be valid Python identifiers。 IE。
大写和小写字母 A 到 Z、下划线 _ 以及除第一个字符外的数字 0 到 9。
正如@Josef 所说,可以使用 patsy Q
来引用变量:
smf.ols('Q("177sdays") ~ b', df2).fit()