@final
def cython_operation(self, *, values: ArrayLike, axis: int, min_count: int=(- 1), comp_ids: np.ndarray, ngroups: int, **kwargs) -> ArrayLike:
    '\n        Call our cython function, with appropriate pre- and post- processing.\n        '
    if (values.ndim > 2):
        raise NotImplementedError('number of dimensions is currently limited to 2')
    elif (values.ndim == 2):
        assert (axis == 1), axis
    elif (not is_1d_only_ea_obj(values)):
        assert (axis == 0)
    dtype = values.dtype
    is_numeric = is_numeric_dtype(dtype)
    self._disallow_invalid_ops(dtype, is_numeric)
    if (not isinstance(values, np.ndarray)):
        return self._ea_wrap_cython_operation(values, min_count=min_count, ngroups=ngroups, comp_ids=comp_ids, **kwargs)
    return self._cython_op_ndim_compat(values, min_count=min_count, ngroups=ngroups, comp_ids=comp_ids, mask=None, **kwargs)
Call our cython function, with appropriate pre- and post- processing.
@final
def cython_operation(self, *, values: ArrayLike, axis: int, min_count: int=(- 1), comp_ids: np.ndarray, ngroups: int, **kwargs) -> ArrayLike:
    '\n        \n        '
    if (values.ndim > 2):
        raise NotImplementedError('number of dimensions is currently limited to 2')
    elif (values.ndim == 2):
        assert (axis == 1), axis
    elif (not is_1d_only_ea_obj(values)):
        assert (axis == 0)
    dtype = values.dtype
    is_numeric = is_numeric_dtype(dtype)
    self._disallow_invalid_ops(dtype, is_numeric)
    if (not isinstance(values, np.ndarray)):
        return self._ea_wrap_cython_operation(values, min_count=min_count, ngroups=ngroups, comp_ids=comp_ids, **kwargs)
    return self._cython_op_ndim_compat(values, min_count=min_count, ngroups=ngroups, comp_ids=comp_ids, mask=None, **kwargs)