gpt4 book ai didi

python - 使用带有包含数字/空格的参数的 ols 函数

转载 作者:太空宇宙 更新时间:2023-11-03 10:58:03 25 4
gpt4 key购买 nike

我在使用 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])

[candidate] 是我的预测变量列表。

最亲爱的 Python 专家,我的问题是我究竟如何将列表 [candidate] 中的每个单独项目放在以下表达式的引号内:

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 文件)的处理管道中编写这样的东西——你可能会执行各种任意代码.上述解决方案避免了所有这些问题。

引用:

关于python - 使用带有包含数字/空格的参数的 ols 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38149482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com