From adfea2a103e06933b605ccb0129a82a5aa25da35 Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Thu, 13 Apr 2023 10:38:32 +0100 Subject: [PATCH 1/3] CLN: clean-up numpy/function.py a bit --- pandas/compat/numpy/function.py | 65 +++++++++++++++++++++------------ pandas/core/generic.py | 12 +----- 2 files changed, 44 insertions(+), 33 deletions(-) diff --git a/pandas/compat/numpy/function.py b/pandas/compat/numpy/function.py index f6e80aba0c34f..2426afef3aeb8 100644 --- a/pandas/compat/numpy/function.py +++ b/pandas/compat/numpy/function.py @@ -69,25 +69,27 @@ def __call__( max_fname_arg_count=None, method: str | None = None, ) -> None: - if args or kwargs: - fname = self.fname if fname is None else fname - max_fname_arg_count = ( - self.max_fname_arg_count - if max_fname_arg_count is None - else max_fname_arg_count + if not args and not kwargs: + return None + + fname = self.fname if fname is None else fname + max_fname_arg_count = ( + self.max_fname_arg_count + if max_fname_arg_count is None + else max_fname_arg_count + ) + method = self.method if method is None else method + + if method == "args": + validate_args(fname, args, max_fname_arg_count, self.defaults) + elif method == "kwargs": + validate_kwargs(fname, kwargs, self.defaults) + elif method == "both": + validate_args_and_kwargs( + fname, args, kwargs, max_fname_arg_count, self.defaults ) - method = self.method if method is None else method - - if method == "args": - validate_args(fname, args, max_fname_arg_count, self.defaults) - elif method == "kwargs": - validate_kwargs(fname, kwargs, self.defaults) - elif method == "both": - validate_args_and_kwargs( - fname, args, kwargs, max_fname_arg_count, self.defaults - ) - else: - raise ValueError(f"invalid validation method '{method}'") + else: + raise ValueError(f"invalid validation method '{method}'") ARGMINMAX_DEFAULTS = {"out": None} @@ -285,10 +287,9 @@ def validate_cum_func_with_skipna(skipna: bool, args, kwargs, name) -> bool: SUM_DEFAULTS["keepdims"] = False SUM_DEFAULTS["initial"] = None -PROD_DEFAULTS = STAT_FUNC_DEFAULTS.copy() -PROD_DEFAULTS["axis"] = None -PROD_DEFAULTS["keepdims"] = False -PROD_DEFAULTS["initial"] = None +PROD_DEFAULTS = SUM_DEFAULTS.copy() + +MEAN_DEFAULTS = SUM_DEFAULTS.copy() MEDIAN_DEFAULTS = STAT_FUNC_DEFAULTS.copy() MEDIAN_DEFAULTS["overwrite_input"] = False @@ -304,7 +305,7 @@ def validate_cum_func_with_skipna(skipna: bool, args, kwargs, name) -> bool: PROD_DEFAULTS, fname="prod", method="both", max_fname_arg_count=1 ) validate_mean = CompatValidator( - STAT_FUNC_DEFAULTS, fname="mean", method="both", max_fname_arg_count=1 + MEAN_DEFAULTS, fname="mean", method="both", max_fname_arg_count=1 ) validate_median = CompatValidator( MEDIAN_DEFAULTS, fname="median", method="both", max_fname_arg_count=1 @@ -395,3 +396,21 @@ def validate_minmax_axis(axis: AxisInt | None, ndim: int = 1) -> None: return if axis >= ndim or (axis < 0 and ndim + axis < 0): raise ValueError(f"`axis` must be fewer than the number of dimensions ({ndim})") + + +_validation_funcs = { + "median": validate_median, + "mean": validate_mean, + "min": validate_min, + "max": validate_max, + "sum": validate_sum, + "prod": validate_prod, +} + + +def validate_func(fname, args, kwargs) -> None: + if fname not in _validation_funcs: + return validate_stat_func(args, kwargs, fname=fname) + + validation_func = _validation_funcs[fname] + return validation_func(args, kwargs) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 3da4f96444215..e209c4b492e61 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -11345,10 +11345,7 @@ def _stat_function( numeric_only: bool_t = False, **kwargs, ): - if name == "median": - nv.validate_median((), kwargs) - else: - nv.validate_stat_func((), kwargs, fname=name) + nv.validate_func(name, (), kwargs) validate_bool_kwarg(skipna, "skipna", none_allowed=False) @@ -11445,12 +11442,7 @@ def _min_count_stat_function( min_count: int = 0, **kwargs, ): - if name == "sum": - nv.validate_sum((), kwargs) - elif name == "prod": - nv.validate_prod((), kwargs) - else: - nv.validate_stat_func((), kwargs, fname=name) + nv.validate_func(name, (), kwargs) validate_bool_kwarg(skipna, "skipna", none_allowed=False) From a6d7350f0024ca6bb8821c890e20e818ed4a5fe5 Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Thu, 13 Apr 2023 13:32:25 +0100 Subject: [PATCH 2/3] add asserts --- pandas/core/generic.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index e209c4b492e61..f55800c7f44e1 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -11345,6 +11345,7 @@ def _stat_function( numeric_only: bool_t = False, **kwargs, ): + assert name in ["median", "mean", "min", "max", "kurt", "skew"], name nv.validate_func(name, (), kwargs) validate_bool_kwarg(skipna, "skipna", none_allowed=False) @@ -11442,6 +11443,7 @@ def _min_count_stat_function( min_count: int = 0, **kwargs, ): + assert name in ["sum", "prod"], name nv.validate_func(name, (), kwargs) validate_bool_kwarg(skipna, "skipna", none_allowed=False) From 6b8c222af4272aebd40f97f6a54162ed9877cada Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Thu, 13 Apr 2023 15:33:46 +0100 Subject: [PATCH 3/3] fix ptp test failure --- pandas/compat/numpy/function.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/compat/numpy/function.py b/pandas/compat/numpy/function.py index 2426afef3aeb8..a36e25a9df410 100644 --- a/pandas/compat/numpy/function.py +++ b/pandas/compat/numpy/function.py @@ -249,7 +249,7 @@ def validate_cum_func_with_skipna(skipna: bool, args, kwargs, name) -> bool: LOGICAL_FUNC_DEFAULTS = {"out": None, "keepdims": False} validate_logical_func = CompatValidator(LOGICAL_FUNC_DEFAULTS, method="kwargs") -MINMAX_DEFAULTS = {"axis": None, "out": None, "keepdims": False} +MINMAX_DEFAULTS = {"axis": None, "dtype": None, "out": None, "keepdims": False} validate_min = CompatValidator( MINMAX_DEFAULTS, fname="min", method="both", max_fname_arg_count=1 )