繁体   English   中英

使用包含数字/空格的参数的ols函数

[英]Using ols function with parameters that contain numbers/spaces

我在使用statsmodels.formula.api函数时遇到了很多困难

       ols(formula,data).fit().rsquared_adj 

由于我的预测者名字的性质。 预测者有数字和空格等,显然不喜欢。 我知道我需要使用像patsy.builtins.Q这样的东西。所以我要说我的预测器是weight.in.kg,它应该按如下方式输入:

Q("weight.in.kg")

所以我需要从列表中取出我的公式,并且使用这个patsy.builtin.Q修改列表中的每个项目都会遇到困难。

formula = "{} ~ {} + 1".format(response, ' + '.join([candidate])

[候选人]是我的预测者名单。

我最亲爱的python专家的问题是,我是如何将列表[候选者]中的每个单独项目放在以下表达式的引号中:

Q( '')

这样ols功能实际上可以读取它吗? 抱歉,如果这是非常明显的,我不擅长python。

现在你开始在你的公式中找到你想要的术语列表,然后尝试将它们粘贴到一个复杂的字符串中,patsy将解析并转换回术语列表。 您可以看到patsy为这种公式生成的数据结构( ModelDesc.from_formula是patsy的解析器):

In [7]: from patsy import ModelDesc

In [8]: ModelDesc.from_formula("y ~ x1 + x2 + x3")
Out[8]: 
ModelDesc(lhs_termlist=[Term([EvalFactor('y')])],
          rhs_termlist=[Term([]),
                        Term([EvalFactor('x1')]),
                        Term([EvalFactor('x2')]),
                        Term([EvalFactor('x3')])])

这可能看起来有点令人生畏,但实际上它非常简单 - 你有一个ModelDesc ,代表一个公式,它有一个左侧的术语列表和一个右侧的术语列表。 每个术语由Term对象表示,每个Term都有一个因子列表。 (这里每个术语只有一个因素 - 如果你有任何交互,那么这些术语会有多个因素。)此外,“空交互” Term([])是patsy代表截距术语的方式。

所以你可以通过直接创建你想要的术语并将它们传递给patsy来避免所有这些复杂的引用/解析,跳过字符串解析步骤

from patsy import ModelDesc, Term, LookupFactor

response_terms = [Term([LookupFactor(response)])]
# start with intercept...
model_terms = [Term([])]
# ...then add another term for each candidate
model_terms += [Term([LookupFactor(c)]) for c in candidates]
model_desc = ModelDesc(response_terms, model_terms)

现在你可以将那个model_desc对象传递给你通常传递patsy公式的任何函数:

ols(model_desc, data).fit().rsquared_adj

这里有另一个技巧:你会注意到第一个例子有EvalFactor对象,现在我们正在使用LookupFactor对象。 区别在于EvalFactor接受一串任意Python代码,如果你想编写像np.log(x1)这样的东西,这很好,但是如果你有像weight.in.kg这样的变量,那真的很烦人。 LookupFactor直接获取变量的名称以查找数据,因此不需要进一步引用。

或者,您可以使用一些更高级的Python字符串处理来执行此操作,例如:

quoted = ["Q('{}')".format(c) for c in candidates]
formula = "{} ~ {} + 1".format(response, ' + '.join(quoted))

但是,虽然开始时这有点简单,但它更脆弱 - 例如,考虑(或尝试)如果您的某个参数包含引号字符会发生什么! 永远不应该在处理管道中写这样的东西,其中候选名称来自你无法控制的其他地方(例如随机的CSV文件) - 你可以获得各种任意代码执行。 上述解决方案避免了所有这些问题。

参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM