其他分享
首页 > 其他分享> > 调用函数中的patsy时出现命名空间问题

调用函数中的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