@classmethod
@functools.lru_cache(maxsize=None)
def _get_cython_function(cls, kind: str, how: str, dtype: np.dtype, is_numeric: bool):
    dtype_str = dtype.name
    ftype = cls._CYTHON_FUNCTIONS[kind][how]
    f = getattr(libgroupby, ftype)
    if is_numeric:
        return f
    elif (dtype == object):
        if ('object' not in f.__signatures__):
            raise NotImplementedError(f'function is not implemented for this dtype: [how->{how},dtype->{dtype_str}]')
        return f
@classmethod
@functools.lru_cache(maxsize=None)
def _get_cython_function(cls, kind: str, how: str, dtype: np.dtype, is_numeric: bool):
    dtype_str = dtype.name
    ftype = cls._CYTHON_FUNCTIONS[kind][how]
    f = getattr(libgroupby, ftype)
    if is_numeric:
        return f
    elif (dtype == object):
        if ('object' not in f.__signatures__):
            raise NotImplementedError(f'function is not implemented for this dtype: [how->{how},dtype->{dtype_str}]')
        return f