Создать пользовательскую функцию в Patsy - PullRequest
0 голосов
/ 12 июня 2018
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 ]

0 голосов
/ 14 июня 2018

Я тестирую более близко, подражая тому, что установило в системе формул 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)
0 голосов
/ 12 июня 2018

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)
...