在 Patsy 中创建自定义函数
Create a custom function in Patsy
import patsy
from patsy import dmatrices, dmatrix, demo_data
dt=pd.DataFrame({'F1':['a','b','c','d','e','a'],'F2':['X','X','Y','Y','Z','Z']})
我知道我能做到
dmatrix("1+I(F1=='a')",dt)
但是我可以创建任意函数 patsy 吗?我试图在 R 的公式语言中模仿相同级别的灵活性,但在 python
中似乎并不直接实现
def abd(x):
1 if x in ['a','b','d'] else 0
dmatrix("1+abd(F1)",dt)
IIUC
def abd(x):
return x.isin(['a','b','d'])
dmatrix("1+abd(F1)",dt)
Out[182]:
DesignMatrix with shape (6, 2)
Intercept abd(F1)[T.True]
1 1
1 1
1 0
1 1
1 0
1 1
Terms:
'Intercept' (column 0)
'abd(F1)' (column 1)
我测试更接近于在 R 公式系统中建立的东西。以下是已接受答案的更简单表示。 Python 通过设计提供了这种灵活性。 R当然可以做同样的事情(自定义函数)但是更容易被忽略。
import pandas as pd
from patsy import dmatrices, dmatrix, demo_data
dt=pd.DataFrame({'F1':['a','b','c','d','e','a'],'F2':['X','X','Y','Y','Z','Z']})
def xx(x,y):return(np.isin(x,list(y))*1)
dmatrix("1+xx(F1,['a','b'])",dt)
DesignMatrix with shape (6, 2)
Intercept xx(F1, ['a', 'b'])
1 1
1 1
1 0
1 0
1 0
1 1
Terms:
'Intercept' (column 0)
"xx(F1, ['a', 'b'])" (column 1)
import patsy
from patsy import dmatrices, dmatrix, demo_data
dt=pd.DataFrame({'F1':['a','b','c','d','e','a'],'F2':['X','X','Y','Y','Z','Z']})
我知道我能做到
dmatrix("1+I(F1=='a')",dt)
但是我可以创建任意函数 patsy 吗?我试图在 R 的公式语言中模仿相同级别的灵活性,但在 python
中似乎并不直接实现def abd(x):
1 if x in ['a','b','d'] else 0
dmatrix("1+abd(F1)",dt)
IIUC
def abd(x):
return x.isin(['a','b','d'])
dmatrix("1+abd(F1)",dt)
Out[182]:
DesignMatrix with shape (6, 2)
Intercept abd(F1)[T.True]
1 1
1 1
1 0
1 1
1 0
1 1
Terms:
'Intercept' (column 0)
'abd(F1)' (column 1)
我测试更接近于在 R 公式系统中建立的东西。以下是已接受答案的更简单表示。 Python 通过设计提供了这种灵活性。 R当然可以做同样的事情(自定义函数)但是更容易被忽略。
import pandas as pd
from patsy import dmatrices, dmatrix, demo_data
dt=pd.DataFrame({'F1':['a','b','c','d','e','a'],'F2':['X','X','Y','Y','Z','Z']})
def xx(x,y):return(np.isin(x,list(y))*1)
dmatrix("1+xx(F1,['a','b'])",dt)
DesignMatrix with shape (6, 2)
Intercept xx(F1, ['a', 'b'])
1 1
1 1
1 0
1 0
1 0
1 1
Terms:
'Intercept' (column 0)
"xx(F1, ['a', 'b'])" (column 1)