Updated script that can be controled by Nodejs web app
This commit is contained in:
53
lib/python3.13/site-packages/pandas/compat/numpy/__init__.py
Normal file
53
lib/python3.13/site-packages/pandas/compat/numpy/__init__.py
Normal file
@ -0,0 +1,53 @@
|
||||
""" support numpy compatibility across versions """
|
||||
import warnings
|
||||
|
||||
import numpy as np
|
||||
|
||||
from pandas.util.version import Version
|
||||
|
||||
# numpy versioning
|
||||
_np_version = np.__version__
|
||||
_nlv = Version(_np_version)
|
||||
np_version_lt1p23 = _nlv < Version("1.23")
|
||||
np_version_gte1p24 = _nlv >= Version("1.24")
|
||||
np_version_gte1p24p3 = _nlv >= Version("1.24.3")
|
||||
np_version_gte1p25 = _nlv >= Version("1.25")
|
||||
np_version_gt2 = _nlv >= Version("2.0.0")
|
||||
is_numpy_dev = _nlv.dev is not None
|
||||
_min_numpy_ver = "1.22.4"
|
||||
|
||||
|
||||
if _nlv < Version(_min_numpy_ver):
|
||||
raise ImportError(
|
||||
f"this version of pandas is incompatible with numpy < {_min_numpy_ver}\n"
|
||||
f"your numpy version is {_np_version}.\n"
|
||||
f"Please upgrade numpy to >= {_min_numpy_ver} to use this pandas version"
|
||||
)
|
||||
|
||||
|
||||
np_long: type
|
||||
np_ulong: type
|
||||
|
||||
if np_version_gt2:
|
||||
try:
|
||||
with warnings.catch_warnings():
|
||||
warnings.filterwarnings(
|
||||
"ignore",
|
||||
r".*In the future `np\.long` will be defined as.*",
|
||||
FutureWarning,
|
||||
)
|
||||
np_long = np.long # type: ignore[attr-defined]
|
||||
np_ulong = np.ulong # type: ignore[attr-defined]
|
||||
except AttributeError:
|
||||
np_long = np.int_
|
||||
np_ulong = np.uint
|
||||
else:
|
||||
np_long = np.int_
|
||||
np_ulong = np.uint
|
||||
|
||||
|
||||
__all__ = [
|
||||
"np",
|
||||
"_np_version",
|
||||
"is_numpy_dev",
|
||||
]
|
Binary file not shown.
Binary file not shown.
418
lib/python3.13/site-packages/pandas/compat/numpy/function.py
Normal file
418
lib/python3.13/site-packages/pandas/compat/numpy/function.py
Normal file
@ -0,0 +1,418 @@
|
||||
"""
|
||||
For compatibility with numpy libraries, pandas functions or methods have to
|
||||
accept '*args' and '**kwargs' parameters to accommodate numpy arguments that
|
||||
are not actually used or respected in the pandas implementation.
|
||||
|
||||
To ensure that users do not abuse these parameters, validation is performed in
|
||||
'validators.py' to make sure that any extra parameters passed correspond ONLY
|
||||
to those in the numpy signature. Part of that validation includes whether or
|
||||
not the user attempted to pass in non-default values for these extraneous
|
||||
parameters. As we want to discourage users from relying on these parameters
|
||||
when calling the pandas implementation, we want them only to pass in the
|
||||
default values for these parameters.
|
||||
|
||||
This module provides a set of commonly used default arguments for functions and
|
||||
methods that are spread throughout the codebase. This module will make it
|
||||
easier to adjust to future upstream changes in the analogous numpy signatures.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import (
|
||||
TYPE_CHECKING,
|
||||
Any,
|
||||
TypeVar,
|
||||
cast,
|
||||
overload,
|
||||
)
|
||||
|
||||
import numpy as np
|
||||
from numpy import ndarray
|
||||
|
||||
from pandas._libs.lib import (
|
||||
is_bool,
|
||||
is_integer,
|
||||
)
|
||||
from pandas.errors import UnsupportedFunctionCall
|
||||
from pandas.util._validators import (
|
||||
validate_args,
|
||||
validate_args_and_kwargs,
|
||||
validate_kwargs,
|
||||
)
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from pandas._typing import (
|
||||
Axis,
|
||||
AxisInt,
|
||||
)
|
||||
|
||||
AxisNoneT = TypeVar("AxisNoneT", Axis, None)
|
||||
|
||||
|
||||
class CompatValidator:
|
||||
def __init__(
|
||||
self,
|
||||
defaults,
|
||||
fname=None,
|
||||
method: str | None = None,
|
||||
max_fname_arg_count=None,
|
||||
) -> None:
|
||||
self.fname = fname
|
||||
self.method = method
|
||||
self.defaults = defaults
|
||||
self.max_fname_arg_count = max_fname_arg_count
|
||||
|
||||
def __call__(
|
||||
self,
|
||||
args,
|
||||
kwargs,
|
||||
fname=None,
|
||||
max_fname_arg_count=None,
|
||||
method: str | None = None,
|
||||
) -> None:
|
||||
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
|
||||
)
|
||||
else:
|
||||
raise ValueError(f"invalid validation method '{method}'")
|
||||
|
||||
|
||||
ARGMINMAX_DEFAULTS = {"out": None}
|
||||
validate_argmin = CompatValidator(
|
||||
ARGMINMAX_DEFAULTS, fname="argmin", method="both", max_fname_arg_count=1
|
||||
)
|
||||
validate_argmax = CompatValidator(
|
||||
ARGMINMAX_DEFAULTS, fname="argmax", method="both", max_fname_arg_count=1
|
||||
)
|
||||
|
||||
|
||||
def process_skipna(skipna: bool | ndarray | None, args) -> tuple[bool, Any]:
|
||||
if isinstance(skipna, ndarray) or skipna is None:
|
||||
args = (skipna,) + args
|
||||
skipna = True
|
||||
|
||||
return skipna, args
|
||||
|
||||
|
||||
def validate_argmin_with_skipna(skipna: bool | ndarray | None, args, kwargs) -> bool:
|
||||
"""
|
||||
If 'Series.argmin' is called via the 'numpy' library, the third parameter
|
||||
in its signature is 'out', which takes either an ndarray or 'None', so
|
||||
check if the 'skipna' parameter is either an instance of ndarray or is
|
||||
None, since 'skipna' itself should be a boolean
|
||||
"""
|
||||
skipna, args = process_skipna(skipna, args)
|
||||
validate_argmin(args, kwargs)
|
||||
return skipna
|
||||
|
||||
|
||||
def validate_argmax_with_skipna(skipna: bool | ndarray | None, args, kwargs) -> bool:
|
||||
"""
|
||||
If 'Series.argmax' is called via the 'numpy' library, the third parameter
|
||||
in its signature is 'out', which takes either an ndarray or 'None', so
|
||||
check if the 'skipna' parameter is either an instance of ndarray or is
|
||||
None, since 'skipna' itself should be a boolean
|
||||
"""
|
||||
skipna, args = process_skipna(skipna, args)
|
||||
validate_argmax(args, kwargs)
|
||||
return skipna
|
||||
|
||||
|
||||
ARGSORT_DEFAULTS: dict[str, int | str | None] = {}
|
||||
ARGSORT_DEFAULTS["axis"] = -1
|
||||
ARGSORT_DEFAULTS["kind"] = "quicksort"
|
||||
ARGSORT_DEFAULTS["order"] = None
|
||||
ARGSORT_DEFAULTS["kind"] = None
|
||||
ARGSORT_DEFAULTS["stable"] = None
|
||||
|
||||
|
||||
validate_argsort = CompatValidator(
|
||||
ARGSORT_DEFAULTS, fname="argsort", max_fname_arg_count=0, method="both"
|
||||
)
|
||||
|
||||
# two different signatures of argsort, this second validation for when the
|
||||
# `kind` param is supported
|
||||
ARGSORT_DEFAULTS_KIND: dict[str, int | None] = {}
|
||||
ARGSORT_DEFAULTS_KIND["axis"] = -1
|
||||
ARGSORT_DEFAULTS_KIND["order"] = None
|
||||
ARGSORT_DEFAULTS_KIND["stable"] = None
|
||||
validate_argsort_kind = CompatValidator(
|
||||
ARGSORT_DEFAULTS_KIND, fname="argsort", max_fname_arg_count=0, method="both"
|
||||
)
|
||||
|
||||
|
||||
def validate_argsort_with_ascending(ascending: bool | int | None, args, kwargs) -> bool:
|
||||
"""
|
||||
If 'Categorical.argsort' is called via the 'numpy' library, the first
|
||||
parameter in its signature is 'axis', which takes either an integer or
|
||||
'None', so check if the 'ascending' parameter has either integer type or is
|
||||
None, since 'ascending' itself should be a boolean
|
||||
"""
|
||||
if is_integer(ascending) or ascending is None:
|
||||
args = (ascending,) + args
|
||||
ascending = True
|
||||
|
||||
validate_argsort_kind(args, kwargs, max_fname_arg_count=3)
|
||||
ascending = cast(bool, ascending)
|
||||
return ascending
|
||||
|
||||
|
||||
CLIP_DEFAULTS: dict[str, Any] = {"out": None}
|
||||
validate_clip = CompatValidator(
|
||||
CLIP_DEFAULTS, fname="clip", method="both", max_fname_arg_count=3
|
||||
)
|
||||
|
||||
|
||||
@overload
|
||||
def validate_clip_with_axis(axis: ndarray, args, kwargs) -> None:
|
||||
...
|
||||
|
||||
|
||||
@overload
|
||||
def validate_clip_with_axis(axis: AxisNoneT, args, kwargs) -> AxisNoneT:
|
||||
...
|
||||
|
||||
|
||||
def validate_clip_with_axis(
|
||||
axis: ndarray | AxisNoneT, args, kwargs
|
||||
) -> AxisNoneT | None:
|
||||
"""
|
||||
If 'NDFrame.clip' is called via the numpy library, the third parameter in
|
||||
its signature is 'out', which can takes an ndarray, so check if the 'axis'
|
||||
parameter is an instance of ndarray, since 'axis' itself should either be
|
||||
an integer or None
|
||||
"""
|
||||
if isinstance(axis, ndarray):
|
||||
args = (axis,) + args
|
||||
# error: Incompatible types in assignment (expression has type "None",
|
||||
# variable has type "Union[ndarray[Any, Any], str, int]")
|
||||
axis = None # type: ignore[assignment]
|
||||
|
||||
validate_clip(args, kwargs)
|
||||
# error: Incompatible return value type (got "Union[ndarray[Any, Any],
|
||||
# str, int]", expected "Union[str, int, None]")
|
||||
return axis # type: ignore[return-value]
|
||||
|
||||
|
||||
CUM_FUNC_DEFAULTS: dict[str, Any] = {}
|
||||
CUM_FUNC_DEFAULTS["dtype"] = None
|
||||
CUM_FUNC_DEFAULTS["out"] = None
|
||||
validate_cum_func = CompatValidator(
|
||||
CUM_FUNC_DEFAULTS, method="both", max_fname_arg_count=1
|
||||
)
|
||||
validate_cumsum = CompatValidator(
|
||||
CUM_FUNC_DEFAULTS, fname="cumsum", method="both", max_fname_arg_count=1
|
||||
)
|
||||
|
||||
|
||||
def validate_cum_func_with_skipna(skipna: bool, args, kwargs, name) -> bool:
|
||||
"""
|
||||
If this function is called via the 'numpy' library, the third parameter in
|
||||
its signature is 'dtype', which takes either a 'numpy' dtype or 'None', so
|
||||
check if the 'skipna' parameter is a boolean or not
|
||||
"""
|
||||
if not is_bool(skipna):
|
||||
args = (skipna,) + args
|
||||
skipna = True
|
||||
elif isinstance(skipna, np.bool_):
|
||||
skipna = bool(skipna)
|
||||
|
||||
validate_cum_func(args, kwargs, fname=name)
|
||||
return skipna
|
||||
|
||||
|
||||
ALLANY_DEFAULTS: dict[str, bool | None] = {}
|
||||
ALLANY_DEFAULTS["dtype"] = None
|
||||
ALLANY_DEFAULTS["out"] = None
|
||||
ALLANY_DEFAULTS["keepdims"] = False
|
||||
ALLANY_DEFAULTS["axis"] = None
|
||||
validate_all = CompatValidator(
|
||||
ALLANY_DEFAULTS, fname="all", method="both", max_fname_arg_count=1
|
||||
)
|
||||
validate_any = CompatValidator(
|
||||
ALLANY_DEFAULTS, fname="any", method="both", max_fname_arg_count=1
|
||||
)
|
||||
|
||||
LOGICAL_FUNC_DEFAULTS = {"out": None, "keepdims": False}
|
||||
validate_logical_func = CompatValidator(LOGICAL_FUNC_DEFAULTS, method="kwargs")
|
||||
|
||||
MINMAX_DEFAULTS = {"axis": None, "dtype": None, "out": None, "keepdims": False}
|
||||
validate_min = CompatValidator(
|
||||
MINMAX_DEFAULTS, fname="min", method="both", max_fname_arg_count=1
|
||||
)
|
||||
validate_max = CompatValidator(
|
||||
MINMAX_DEFAULTS, fname="max", method="both", max_fname_arg_count=1
|
||||
)
|
||||
|
||||
RESHAPE_DEFAULTS: dict[str, str] = {"order": "C"}
|
||||
validate_reshape = CompatValidator(
|
||||
RESHAPE_DEFAULTS, fname="reshape", method="both", max_fname_arg_count=1
|
||||
)
|
||||
|
||||
REPEAT_DEFAULTS: dict[str, Any] = {"axis": None}
|
||||
validate_repeat = CompatValidator(
|
||||
REPEAT_DEFAULTS, fname="repeat", method="both", max_fname_arg_count=1
|
||||
)
|
||||
|
||||
ROUND_DEFAULTS: dict[str, Any] = {"out": None}
|
||||
validate_round = CompatValidator(
|
||||
ROUND_DEFAULTS, fname="round", method="both", max_fname_arg_count=1
|
||||
)
|
||||
|
||||
SORT_DEFAULTS: dict[str, int | str | None] = {}
|
||||
SORT_DEFAULTS["axis"] = -1
|
||||
SORT_DEFAULTS["kind"] = "quicksort"
|
||||
SORT_DEFAULTS["order"] = None
|
||||
validate_sort = CompatValidator(SORT_DEFAULTS, fname="sort", method="kwargs")
|
||||
|
||||
STAT_FUNC_DEFAULTS: dict[str, Any | None] = {}
|
||||
STAT_FUNC_DEFAULTS["dtype"] = None
|
||||
STAT_FUNC_DEFAULTS["out"] = None
|
||||
|
||||
SUM_DEFAULTS = STAT_FUNC_DEFAULTS.copy()
|
||||
SUM_DEFAULTS["axis"] = None
|
||||
SUM_DEFAULTS["keepdims"] = False
|
||||
SUM_DEFAULTS["initial"] = None
|
||||
|
||||
PROD_DEFAULTS = SUM_DEFAULTS.copy()
|
||||
|
||||
MEAN_DEFAULTS = SUM_DEFAULTS.copy()
|
||||
|
||||
MEDIAN_DEFAULTS = STAT_FUNC_DEFAULTS.copy()
|
||||
MEDIAN_DEFAULTS["overwrite_input"] = False
|
||||
MEDIAN_DEFAULTS["keepdims"] = False
|
||||
|
||||
STAT_FUNC_DEFAULTS["keepdims"] = False
|
||||
|
||||
validate_stat_func = CompatValidator(STAT_FUNC_DEFAULTS, method="kwargs")
|
||||
validate_sum = CompatValidator(
|
||||
SUM_DEFAULTS, fname="sum", method="both", max_fname_arg_count=1
|
||||
)
|
||||
validate_prod = CompatValidator(
|
||||
PROD_DEFAULTS, fname="prod", method="both", max_fname_arg_count=1
|
||||
)
|
||||
validate_mean = CompatValidator(
|
||||
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
|
||||
)
|
||||
|
||||
STAT_DDOF_FUNC_DEFAULTS: dict[str, bool | None] = {}
|
||||
STAT_DDOF_FUNC_DEFAULTS["dtype"] = None
|
||||
STAT_DDOF_FUNC_DEFAULTS["out"] = None
|
||||
STAT_DDOF_FUNC_DEFAULTS["keepdims"] = False
|
||||
validate_stat_ddof_func = CompatValidator(STAT_DDOF_FUNC_DEFAULTS, method="kwargs")
|
||||
|
||||
TAKE_DEFAULTS: dict[str, str | None] = {}
|
||||
TAKE_DEFAULTS["out"] = None
|
||||
TAKE_DEFAULTS["mode"] = "raise"
|
||||
validate_take = CompatValidator(TAKE_DEFAULTS, fname="take", method="kwargs")
|
||||
|
||||
|
||||
def validate_take_with_convert(convert: ndarray | bool | None, args, kwargs) -> bool:
|
||||
"""
|
||||
If this function is called via the 'numpy' library, the third parameter in
|
||||
its signature is 'axis', which takes either an ndarray or 'None', so check
|
||||
if the 'convert' parameter is either an instance of ndarray or is None
|
||||
"""
|
||||
if isinstance(convert, ndarray) or convert is None:
|
||||
args = (convert,) + args
|
||||
convert = True
|
||||
|
||||
validate_take(args, kwargs, max_fname_arg_count=3, method="both")
|
||||
return convert
|
||||
|
||||
|
||||
TRANSPOSE_DEFAULTS = {"axes": None}
|
||||
validate_transpose = CompatValidator(
|
||||
TRANSPOSE_DEFAULTS, fname="transpose", method="both", max_fname_arg_count=0
|
||||
)
|
||||
|
||||
|
||||
def validate_groupby_func(name: str, args, kwargs, allowed=None) -> None:
|
||||
"""
|
||||
'args' and 'kwargs' should be empty, except for allowed kwargs because all
|
||||
of their necessary parameters are explicitly listed in the function
|
||||
signature
|
||||
"""
|
||||
if allowed is None:
|
||||
allowed = []
|
||||
|
||||
kwargs = set(kwargs) - set(allowed)
|
||||
|
||||
if len(args) + len(kwargs) > 0:
|
||||
raise UnsupportedFunctionCall(
|
||||
"numpy operations are not valid with groupby. "
|
||||
f"Use .groupby(...).{name}() instead"
|
||||
)
|
||||
|
||||
|
||||
RESAMPLER_NUMPY_OPS = ("min", "max", "sum", "prod", "mean", "std", "var")
|
||||
|
||||
|
||||
def validate_resampler_func(method: str, args, kwargs) -> None:
|
||||
"""
|
||||
'args' and 'kwargs' should be empty because all of their necessary
|
||||
parameters are explicitly listed in the function signature
|
||||
"""
|
||||
if len(args) + len(kwargs) > 0:
|
||||
if method in RESAMPLER_NUMPY_OPS:
|
||||
raise UnsupportedFunctionCall(
|
||||
"numpy operations are not valid with resample. "
|
||||
f"Use .resample(...).{method}() instead"
|
||||
)
|
||||
raise TypeError("too many arguments passed in")
|
||||
|
||||
|
||||
def validate_minmax_axis(axis: AxisInt | None, ndim: int = 1) -> None:
|
||||
"""
|
||||
Ensure that the axis argument passed to min, max, argmin, or argmax is zero
|
||||
or None, as otherwise it will be incorrectly ignored.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
axis : int or None
|
||||
ndim : int, default 1
|
||||
|
||||
Raises
|
||||
------
|
||||
ValueError
|
||||
"""
|
||||
if axis is 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)
|
Reference in New Issue
Block a user