Создать пользовательскую функцию в 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)
2 ответа
Решение
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)