我正在尝试为 statsmodels 公式 API 编写一个包装器(这是一个简化版本,该函数的作用远不止于此):
import statsmodels.formula.api as smf
def wrapper(formula, data, **kwargs):
return smf.logit(formula, data).fit(**kwargs)
如果我将此函数提供给用户,然后用户尝试定义他/她自己的函数:
def square(x):
return x**2
model = wrapper('y ~ x + square(x)', data=df)
他们将收到NameError
因为patsy
模块正在查找的命名空间wrapper
对于函数square
。是否有一种安全的、Pythonic 的方法来处理这种情况,而无需事先知道函数名称是什么或需要多少个函数?
仅供参考:这是针对 Python 3.4.3 的。
statsmodels 使用 patsy 包来解析公式并创建设计矩阵。 patsy 允许用户函数作为公式的一部分,并在用户命名空间或环境中获取或计算用户函数。
作为参考,请参阅 eval_env 关键字http://patsy.readthedocs.org/en/latest/API-reference.html http://patsy.readthedocs.org/en/latest/API-reference.html
from_formula
是模型的方法,它实现了 patsy 的公式接口。它使用eval_env
向 patsy 提供必要的信息,默认情况下这是用户的调用环境。用户可以使用相应的关键字参数覆盖它。
定义 eval_env 的最简单方法是作为一个整数,指示 patsy 应使用的堆栈级别。 from_formula 正在增加它以考虑 statsmodels 方法中的附加级别。
根据评论, eval_env = 2 将使用创建模型的级别的下一个更高级别,例如和model = smf.logit(..., eval_env=2)
.
这将创建模型,调用 patsy 并创建设计矩阵,model.fit()
将估计它并返回结果实例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)