Python 帕特西的互惠

Python 帕特西的互惠,python,patsy,Python,Patsy,Patsy的幂不允许负整数,所以,如果我们有一些序列数据X patsy.dmatrices('X + X**(-1)', X) 返回一个错误。如何将X的倒数加到这样一个patsy公式中?运算符的特殊patsy含义在嵌入函数调用中被关闭;因此,如果您编写X+1/X,那么patsy将其解释为特殊的patsy+和/运算符,但是如果您编写类似X+sin(1/X),那么patsy将继续将+解释为特殊的patsy运算符,但整个sin(1/X)表达式被传递给Python进行求值,Python将把/作为正则除

Patsy的幂不允许负整数,所以,如果我们有一些序列数据
X

patsy.dmatrices('X + X**(-1)', X)

返回一个错误。如何将X的倒数加到这样一个patsy公式中?

运算符的特殊patsy含义在嵌入函数调用中被关闭;因此,如果您编写
X+1/X
,那么patsy将其解释为特殊的patsy
+
/
运算符,但是如果您编写类似
X+sin(1/X)
,那么patsy将继续将
+
解释为特殊的patsy运算符,但整个
sin(1/X)
表达式被传递给Python进行求值,Python将把
/
作为正则除法求值

因此,如果我们想计算sin(1/X),这很好。但我们没有(为什么要?)。我们只需要普通的
1/X
。那我们怎么做呢

好吧,我们可能很棘手:我们需要一个函数调用来诱使patsy的解析器忽略
/
,并将其交给Python——但是没有任何东西表明该函数必须做任何事情。我们可以定义一个标识函数:

def identity(value):
    return value
然后在公式中使用它,如
X+identity(1/X)

事实上,这个技巧非常方便,patsy已经为您预定义了一个函数,并提供了一个名为
I(…)
的函数。通常,您可以将
I(…)
视为一种引用操作符——这是一种表示“嘿,帕特西,请不要试图解释此区域中的任何内容,只需将其传递给Python kthx”的方式

因此,要回答您最初的问题,请尝试编写
dmatrix(“X+I(1/X)”,data)


(下一个问题:为什么要对函数
I
和所有东西进行这种奇怪的攻击?答案是30年前R就是这样做的,我想不出任何更好的方法来打破兼容性。)

也不允许
(1/X)
吗?不,1是为常量保留的。另外,patsy定义了
/
的方式,这将计算
1+1:X
。这是patsy对I+I*X的定义,其中我是一个常数向量。我知道我问了一个模糊的问题,6个月后我终于从我要问的程序编写人那里得到了答案。我想知道patsy会如何处理像$I(X%在%c(“a”)这样的事情这在我看来是非常直截了当的!因为我喜欢R,而且我必须使用python,所以对此我非常高兴:)然而,这个I()表达式可以在文档中的某个地方提到。也许是,也许是,但我花了一个小时才在这里找到这篇文章。。不过,谢谢!