使用 re 从 Patsy 公式中删除项
Removing Terms from Patsy Formulas with re
上下文:Python3.4.3
我不太擅长正则表达式,我似乎无法使用 re
.
找到可靠的解决方案
假设我们有一个很长的 patsy formula 并且在中间某处是一个表达式,例如:
... + xvar + np.log(xvar)+xvar**2 + xvar2+ z...
Patsy 公式只是遵循良好规则的字符串,所以我想知道是否有人写过/可以轻松地写出一种从给定公式中删除特定术语的可靠方法?所以,例如:
>>> remove_term(long_formula, 'xvar')
... + np.log(xvar)+xvar**2 + xvar2+ z...
和
>>> remove_term(long_formula, 'xvar2')
... + xvar + np.log(xvar)+xvar**2 + z...
等这也需要在右侧公式规范的开头/结尾有一个变量。
我有限的 regex-foo 只产生如下内容:
re.sub('[^(]\s*xvar\s*',' FOUND IT ', 'y ~ xvar + np.log(xvar)')
也许是半复杂的 if/else re.sub
情况?
没有通用的方法可以用正则表达式做您想做的事情,因为 Patsy 的公式语言不是正则语言。 (就像 HTML is not a regular language 一样。)
但是无论如何也没有必要去弄乱字符串——因为 documented here,patsy 提供了一个很好的面向对象的公式表示作为其 public API 的一部分。在内部,您每次调用 dmatrix
时都在使用它:公式字符串被解析为这种表示形式,然后这种表示形式用于下游的所有内容。但您也可以直接使用它,例如:
In [3]: m = patsy.ModelDesc.from_formula("xvar + np.log(xvar)+xvar**2 + xvar2")
In [4]: m
Out[4]:
ModelDesc(lhs_termlist=[],
rhs_termlist=[Term([]),
Term([EvalFactor('xvar')]),
Term([EvalFactor('np.log(xvar)')]),
Term([EvalFactor('xvar2')])])
In [5]: m.rhs_termlist.remove(patsy.Term([patsy.EvalFactor('xvar')]))
In [6]: m
Out[6]:
ModelDesc(lhs_termlist=[],
rhs_termlist=[Term([]),
Term([EvalFactor('np.log(xvar)')]),
Term([EvalFactor('xvar2')])])
然后将 m
传递给需要公式的 patsy 函数,例如 patsy.dmatrix(m, dataframe)
.
上下文:Python3.4.3
我不太擅长正则表达式,我似乎无法使用 re
.
假设我们有一个很长的 patsy formula 并且在中间某处是一个表达式,例如:
... + xvar + np.log(xvar)+xvar**2 + xvar2+ z...
Patsy 公式只是遵循良好规则的字符串,所以我想知道是否有人写过/可以轻松地写出一种从给定公式中删除特定术语的可靠方法?所以,例如:
>>> remove_term(long_formula, 'xvar')
... + np.log(xvar)+xvar**2 + xvar2+ z...
和
>>> remove_term(long_formula, 'xvar2')
... + xvar + np.log(xvar)+xvar**2 + z...
等这也需要在右侧公式规范的开头/结尾有一个变量。
我有限的 regex-foo 只产生如下内容:
re.sub('[^(]\s*xvar\s*',' FOUND IT ', 'y ~ xvar + np.log(xvar)')
也许是半复杂的 if/else re.sub
情况?
没有通用的方法可以用正则表达式做您想做的事情,因为 Patsy 的公式语言不是正则语言。 (就像 HTML is not a regular language 一样。)
但是无论如何也没有必要去弄乱字符串——因为 documented here,patsy 提供了一个很好的面向对象的公式表示作为其 public API 的一部分。在内部,您每次调用 dmatrix
时都在使用它:公式字符串被解析为这种表示形式,然后这种表示形式用于下游的所有内容。但您也可以直接使用它,例如:
In [3]: m = patsy.ModelDesc.from_formula("xvar + np.log(xvar)+xvar**2 + xvar2")
In [4]: m
Out[4]:
ModelDesc(lhs_termlist=[],
rhs_termlist=[Term([]),
Term([EvalFactor('xvar')]),
Term([EvalFactor('np.log(xvar)')]),
Term([EvalFactor('xvar2')])])
In [5]: m.rhs_termlist.remove(patsy.Term([patsy.EvalFactor('xvar')]))
In [6]: m
Out[6]:
ModelDesc(lhs_termlist=[],
rhs_termlist=[Term([]),
Term([EvalFactor('np.log(xvar)')]),
Term([EvalFactor('xvar2')])])
然后将 m
传递给需要公式的 patsy 函数,例如 patsy.dmatrix(m, dataframe)
.