互惠互利
Reciprocals in patsy
Patsy 的力量不允许负整数,所以,如果我们有一些系列数据 X
,
patsy.dmatrices('X + X**(-1)', X)
returns 一个错误。我如何将 X 的倒数添加到这样的 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 已经为您预定义了一个函数,并将其作为 built-in 提供,名为 I(...)
。通常,您可以将 I(...)
视为一种引用运算符——这是一种表示 "hey patsy, please do not try to interpret anything in this region, just pass it through to Python kthx".
的方式
所以回答你原来的问题:试着写 dmatrix("X + I(1 / X)", data)
(下一个问题:为什么这个奇怪的 hack 函数 I
和所有东西?答案是 30 年前 R 就是这样做的,我想不出更好的方法值得打破兼容性。)
Patsy 的力量不允许负整数,所以,如果我们有一些系列数据 X
,
patsy.dmatrices('X + X**(-1)', X)
returns 一个错误。我如何将 X 的倒数添加到这样的 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 已经为您预定义了一个函数,并将其作为 built-in 提供,名为 I(...)
。通常,您可以将 I(...)
视为一种引用运算符——这是一种表示 "hey patsy, please do not try to interpret anything in this region, just pass it through to Python kthx".
所以回答你原来的问题:试着写 dmatrix("X + I(1 / X)", data)
(下一个问题:为什么这个奇怪的 hack 函数 I
和所有东西?答案是 30 年前 R 就是这样做的,我想不出更好的方法值得打破兼容性。)