调用函数中的patsy时出现命名空间问题
作者:互联网
我正在尝试为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模块正在包装器的命名空间中查找函数square.有没有一种安全的Python方式可以处理这种情况,而无需先验地知道函数的名称是什么或需要多少个函数?
仅供参考:这是针对Python 3.4.3.
解决方法:
statsmodels使用patsy包来解析公式并创建设计矩阵. patsy允许用户函数作为公式的一部分,并在用户名称空间或环境中获取或评估用户函数.
作为参考,请参见http://patsy.readthedocs.org/en/latest/API-reference.html中的eval_env关键字
from_formula是实现patsy的公式接口的模型方法.它使用eval_env向patsy提供必要的信息,默认情况下是用户的调用环境.用户可以使用相应的关键字参数覆盖它.
定义eval_env的最简单方法是使用整数,该整数指示patsy应该使用的堆栈级别. from_formula对其进行递增以考虑statsmodels方法中的附加级别.
根据评论,eval_env = 2将使用创建模型的级别中的下一个更高级别,例如与模型= smf.logit(…,eval_env = 2).
这将创建模型,调用patsy并创建设计矩阵,model.fit()将对其进行估计并返回结果实例.
标签:python-3-x,namespaces,patsy,python,statsmodels 来源: https://codeday.me/bug/20191118/2030589.html