8th day of python challenges 111-117
This commit is contained in:
66
venv/lib/python3.6/site-packages/pandas/compat/__init__.py
Normal file
66
venv/lib/python3.6/site-packages/pandas/compat/__init__.py
Normal file
@@ -0,0 +1,66 @@
|
||||
"""
|
||||
compat
|
||||
======
|
||||
|
||||
Cross-compatible functions for different versions of Python.
|
||||
|
||||
Other items:
|
||||
* platform checker
|
||||
"""
|
||||
import platform
|
||||
import struct
|
||||
import sys
|
||||
|
||||
PY36 = sys.version_info >= (3, 6)
|
||||
PY37 = sys.version_info >= (3, 7)
|
||||
PYPY = platform.python_implementation() == "PyPy"
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# functions largely based / taken from the six module
|
||||
|
||||
# Much of the code in this module comes from Benjamin Peterson's six library.
|
||||
# The license for this library can be found in LICENSES/SIX and the code can be
|
||||
# found at https://bitbucket.org/gutworth/six
|
||||
|
||||
|
||||
def set_function_name(f, name, cls):
|
||||
"""
|
||||
Bind the name/qualname attributes of the function
|
||||
"""
|
||||
f.__name__ = name
|
||||
f.__qualname__ = "{klass}.{name}".format(klass=cls.__name__, name=name)
|
||||
f.__module__ = cls.__module__
|
||||
return f
|
||||
|
||||
|
||||
def raise_with_traceback(exc, traceback=Ellipsis):
|
||||
"""
|
||||
Raise exception with existing traceback.
|
||||
If traceback is not passed, uses sys.exc_info() to get traceback.
|
||||
"""
|
||||
if traceback == Ellipsis:
|
||||
_, _, traceback = sys.exc_info()
|
||||
raise exc.with_traceback(traceback)
|
||||
|
||||
|
||||
# https://github.com/pandas-dev/pandas/pull/9123
|
||||
def is_platform_little_endian():
|
||||
""" am I little endian """
|
||||
return sys.byteorder == "little"
|
||||
|
||||
|
||||
def is_platform_windows():
|
||||
return sys.platform == "win32" or sys.platform == "cygwin"
|
||||
|
||||
|
||||
def is_platform_linux():
|
||||
return sys.platform == "linux2"
|
||||
|
||||
|
||||
def is_platform_mac():
|
||||
return sys.platform == "darwin"
|
||||
|
||||
|
||||
def is_platform_32bit():
|
||||
return struct.calcsize("P") * 8 < 64
|
111
venv/lib/python3.6/site-packages/pandas/compat/_optional.py
Normal file
111
venv/lib/python3.6/site-packages/pandas/compat/_optional.py
Normal file
@@ -0,0 +1,111 @@
|
||||
import distutils.version
|
||||
import importlib
|
||||
import types
|
||||
import warnings
|
||||
|
||||
# Update install.rst when updating versions!
|
||||
|
||||
VERSIONS = {
|
||||
"bs4": "4.6.0",
|
||||
"bottleneck": "1.2.1",
|
||||
"fastparquet": "0.2.1",
|
||||
"gcsfs": "0.2.2",
|
||||
"lxml.etree": "3.8.0",
|
||||
"matplotlib": "2.2.2",
|
||||
"numexpr": "2.6.2",
|
||||
"odfpy": "1.3.0",
|
||||
"openpyxl": "2.4.8",
|
||||
"pandas_gbq": "0.8.0",
|
||||
"pyarrow": "0.9.0",
|
||||
"pytables": "3.4.2",
|
||||
"s3fs": "0.0.8",
|
||||
"scipy": "0.19.0",
|
||||
"sqlalchemy": "1.1.4",
|
||||
"tables": "3.4.2",
|
||||
"xarray": "0.8.2",
|
||||
"xlrd": "1.1.0",
|
||||
"xlwt": "1.2.0",
|
||||
"xlsxwriter": "0.9.8",
|
||||
}
|
||||
|
||||
message = (
|
||||
"Missing optional dependency '{name}'. {extra} "
|
||||
"Use pip or conda to install {name}."
|
||||
)
|
||||
version_message = (
|
||||
"Pandas requires version '{minimum_version}' or newer of '{name}' "
|
||||
"(version '{actual_version}' currently installed)."
|
||||
)
|
||||
|
||||
|
||||
def _get_version(module: types.ModuleType) -> str:
|
||||
version = getattr(module, "__version__", None)
|
||||
if version is None:
|
||||
# xlrd uses a capitalized attribute name
|
||||
version = getattr(module, "__VERSION__", None)
|
||||
|
||||
if version is None:
|
||||
raise ImportError("Can't determine version for {}".format(module.__name__))
|
||||
return version
|
||||
|
||||
|
||||
def import_optional_dependency(
|
||||
name: str, extra: str = "", raise_on_missing: bool = True, on_version: str = "raise"
|
||||
):
|
||||
"""
|
||||
Import an optional dependency.
|
||||
|
||||
By default, if a dependency is missing an ImportError with a nice
|
||||
message will be raised. If a dependency is present, but too old,
|
||||
we raise.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
name : str
|
||||
The module name. This should be top-level only, so that the
|
||||
version may be checked.
|
||||
extra : str
|
||||
Additional text to include in the ImportError message.
|
||||
raise_on_missing : bool, default True
|
||||
Whether to raise if the optional dependency is not found.
|
||||
When False and the module is not present, None is returned.
|
||||
on_version : str {'raise', 'warn'}
|
||||
What to do when a dependency's version is too old.
|
||||
|
||||
* raise : Raise an ImportError
|
||||
* warn : Warn that the version is too old. Returns None
|
||||
* ignore: Return the module, even if the version is too old.
|
||||
It's expected that users validate the version locally when
|
||||
using ``on_version="ignore"`` (see. ``io/html.py``)
|
||||
|
||||
Returns
|
||||
-------
|
||||
maybe_module : Optional[ModuleType]
|
||||
The imported module, when found and the version is correct.
|
||||
None is returned when the package is not found and `raise_on_missing`
|
||||
is False, or when the package's version is too old and `on_version`
|
||||
is ``'warn'``.
|
||||
"""
|
||||
try:
|
||||
module = importlib.import_module(name)
|
||||
except ImportError:
|
||||
if raise_on_missing:
|
||||
raise ImportError(message.format(name=name, extra=extra)) from None
|
||||
else:
|
||||
return None
|
||||
|
||||
minimum_version = VERSIONS.get(name)
|
||||
if minimum_version:
|
||||
version = _get_version(module)
|
||||
if distutils.version.LooseVersion(version) < minimum_version:
|
||||
assert on_version in {"warn", "raise", "ignore"}
|
||||
msg = version_message.format(
|
||||
minimum_version=minimum_version, name=name, actual_version=version
|
||||
)
|
||||
if on_version == "warn":
|
||||
warnings.warn(msg, UserWarning)
|
||||
return None
|
||||
elif on_version == "raise":
|
||||
raise ImportError(msg)
|
||||
|
||||
return module
|
23
venv/lib/python3.6/site-packages/pandas/compat/chainmap.py
Normal file
23
venv/lib/python3.6/site-packages/pandas/compat/chainmap.py
Normal file
@@ -0,0 +1,23 @@
|
||||
from collections import ChainMap
|
||||
|
||||
|
||||
class DeepChainMap(ChainMap):
|
||||
def __setitem__(self, key, value):
|
||||
for mapping in self.maps:
|
||||
if key in mapping:
|
||||
mapping[key] = value
|
||||
return
|
||||
self.maps[0][key] = value
|
||||
|
||||
def __delitem__(self, key):
|
||||
for mapping in self.maps:
|
||||
if key in mapping:
|
||||
del mapping[key]
|
||||
return
|
||||
raise KeyError(key)
|
||||
|
||||
# override because the m parameter is introduced in Python 3.4
|
||||
def new_child(self, m=None):
|
||||
if m is None:
|
||||
m = {}
|
||||
return self.__class__(m, *self.maps)
|
@@ -0,0 +1,74 @@
|
||||
""" support numpy compatibility across versions """
|
||||
|
||||
from distutils.version import LooseVersion
|
||||
import re
|
||||
|
||||
import numpy as np
|
||||
|
||||
# numpy versioning
|
||||
_np_version = np.__version__
|
||||
_nlv = LooseVersion(_np_version)
|
||||
_np_version_under1p14 = _nlv < LooseVersion("1.14")
|
||||
_np_version_under1p15 = _nlv < LooseVersion("1.15")
|
||||
_np_version_under1p16 = _nlv < LooseVersion("1.16")
|
||||
_np_version_under1p17 = _nlv < LooseVersion("1.17")
|
||||
_is_numpy_dev = ".dev" in str(_nlv)
|
||||
|
||||
|
||||
if _nlv < "1.13.3":
|
||||
raise ImportError(
|
||||
"this version of pandas is incompatible with "
|
||||
"numpy < 1.13.3\n"
|
||||
"your numpy version is {0}.\n"
|
||||
"Please upgrade numpy to >= 1.13.3 to use "
|
||||
"this pandas version".format(_np_version)
|
||||
)
|
||||
|
||||
|
||||
_tz_regex = re.compile("[+-]0000$")
|
||||
|
||||
|
||||
def tz_replacer(s):
|
||||
if isinstance(s, str):
|
||||
if s.endswith("Z"):
|
||||
s = s[:-1]
|
||||
elif _tz_regex.search(s):
|
||||
s = s[:-5]
|
||||
return s
|
||||
|
||||
|
||||
def np_datetime64_compat(s, *args, **kwargs):
|
||||
"""
|
||||
provide compat for construction of strings to numpy datetime64's with
|
||||
tz-changes in 1.11 that make '2015-01-01 09:00:00Z' show a deprecation
|
||||
warning, when need to pass '2015-01-01 09:00:00'
|
||||
"""
|
||||
s = tz_replacer(s)
|
||||
return np.datetime64(s, *args, **kwargs)
|
||||
|
||||
|
||||
def np_array_datetime64_compat(arr, *args, **kwargs):
|
||||
"""
|
||||
provide compat for construction of an array of strings to a
|
||||
np.array(..., dtype=np.datetime64(..))
|
||||
tz-changes in 1.11 that make '2015-01-01 09:00:00Z' show a deprecation
|
||||
warning, when need to pass '2015-01-01 09:00:00'
|
||||
"""
|
||||
# is_list_like
|
||||
if hasattr(arr, "__iter__") and not isinstance(arr, (str, bytes)):
|
||||
arr = [tz_replacer(s) for s in arr]
|
||||
else:
|
||||
arr = tz_replacer(arr)
|
||||
|
||||
return np.array(arr, *args, **kwargs)
|
||||
|
||||
|
||||
__all__ = [
|
||||
"np",
|
||||
"_np_version",
|
||||
"_np_version_under1p14",
|
||||
"_np_version_under1p15",
|
||||
"_np_version_under1p16",
|
||||
"_np_version_under1p17",
|
||||
"_is_numpy_dev",
|
||||
]
|
424
venv/lib/python3.6/site-packages/pandas/compat/numpy/function.py
Normal file
424
venv/lib/python3.6/site-packages/pandas/compat/numpy/function.py
Normal file
@@ -0,0 +1,424 @@
|
||||
"""
|
||||
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 collections import OrderedDict
|
||||
from distutils.version import LooseVersion
|
||||
from typing import Any, Dict, Optional, Union
|
||||
|
||||
from numpy import __version__ as _np_version, 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,
|
||||
)
|
||||
|
||||
|
||||
class CompatValidator:
|
||||
def __init__(self, defaults, fname=None, method=None, max_fname_arg_count=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=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
|
||||
)
|
||||
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(
|
||||
"invalid validation method " "'{method}'".format(method=method)
|
||||
)
|
||||
|
||||
|
||||
ARGMINMAX_DEFAULTS = dict(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, args):
|
||||
if isinstance(skipna, ndarray) or skipna is None:
|
||||
args = (skipna,) + args
|
||||
skipna = True
|
||||
|
||||
return skipna, args
|
||||
|
||||
|
||||
def validate_argmin_with_skipna(skipna, args, kwargs):
|
||||
"""
|
||||
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, args, kwargs):
|
||||
"""
|
||||
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 = OrderedDict() # type: OrderedDict[str, Optional[Union[int, str]]]
|
||||
ARGSORT_DEFAULTS["axis"] = -1
|
||||
ARGSORT_DEFAULTS["kind"] = "quicksort"
|
||||
ARGSORT_DEFAULTS["order"] = None
|
||||
|
||||
if LooseVersion(_np_version) >= LooseVersion("1.17.0"):
|
||||
# GH-26361. NumPy added radix sort and changed default to None.
|
||||
ARGSORT_DEFAULTS["kind"] = 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 = OrderedDict() # type: OrderedDict[str, Optional[int]]
|
||||
ARGSORT_DEFAULTS_KIND["axis"] = -1
|
||||
ARGSORT_DEFAULTS_KIND["order"] = None
|
||||
validate_argsort_kind = CompatValidator(
|
||||
ARGSORT_DEFAULTS_KIND, fname="argsort", max_fname_arg_count=0, method="both"
|
||||
)
|
||||
|
||||
|
||||
def validate_argsort_with_ascending(ascending, args, kwargs):
|
||||
"""
|
||||
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)
|
||||
return ascending
|
||||
|
||||
|
||||
CLIP_DEFAULTS = dict(out=None) # type Dict[str, Any]
|
||||
validate_clip = CompatValidator(
|
||||
CLIP_DEFAULTS, fname="clip", method="both", max_fname_arg_count=3
|
||||
)
|
||||
|
||||
|
||||
def validate_clip_with_axis(axis, args, kwargs):
|
||||
"""
|
||||
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
|
||||
axis = None
|
||||
|
||||
validate_clip(args, kwargs)
|
||||
return axis
|
||||
|
||||
|
||||
COMPRESS_DEFAULTS = OrderedDict() # type: OrderedDict[str, Any]
|
||||
COMPRESS_DEFAULTS["axis"] = None
|
||||
COMPRESS_DEFAULTS["out"] = None
|
||||
validate_compress = CompatValidator(
|
||||
COMPRESS_DEFAULTS, fname="compress", method="both", max_fname_arg_count=1
|
||||
)
|
||||
|
||||
CUM_FUNC_DEFAULTS = OrderedDict() # type: OrderedDict[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, args, kwargs, name):
|
||||
"""
|
||||
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
|
||||
|
||||
validate_cum_func(args, kwargs, fname=name)
|
||||
return skipna
|
||||
|
||||
|
||||
ALLANY_DEFAULTS = OrderedDict() # type: OrderedDict[str, Optional[bool]]
|
||||
ALLANY_DEFAULTS["dtype"] = None
|
||||
ALLANY_DEFAULTS["out"] = None
|
||||
ALLANY_DEFAULTS["keepdims"] = False
|
||||
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 = dict(out=None, keepdims=False)
|
||||
validate_logical_func = CompatValidator(LOGICAL_FUNC_DEFAULTS, method="kwargs")
|
||||
|
||||
MINMAX_DEFAULTS = dict(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(order="C") # type: Dict[str, str]
|
||||
validate_reshape = CompatValidator(
|
||||
RESHAPE_DEFAULTS, fname="reshape", method="both", max_fname_arg_count=1
|
||||
)
|
||||
|
||||
REPEAT_DEFAULTS = dict(axis=None) # type: Dict[str, Any]
|
||||
validate_repeat = CompatValidator(
|
||||
REPEAT_DEFAULTS, fname="repeat", method="both", max_fname_arg_count=1
|
||||
)
|
||||
|
||||
ROUND_DEFAULTS = dict(out=None) # type: Dict[str, Any]
|
||||
validate_round = CompatValidator(
|
||||
ROUND_DEFAULTS, fname="round", method="both", max_fname_arg_count=1
|
||||
)
|
||||
|
||||
SORT_DEFAULTS = OrderedDict() # type: OrderedDict[str, Optional[Union[int, str]]]
|
||||
SORT_DEFAULTS["axis"] = -1
|
||||
SORT_DEFAULTS["kind"] = "quicksort"
|
||||
SORT_DEFAULTS["order"] = None
|
||||
validate_sort = CompatValidator(SORT_DEFAULTS, fname="sort", method="kwargs")
|
||||
|
||||
STAT_FUNC_DEFAULTS = OrderedDict() # type: OrderedDict[str, Optional[Any]]
|
||||
STAT_FUNC_DEFAULTS["dtype"] = None
|
||||
STAT_FUNC_DEFAULTS["out"] = None
|
||||
|
||||
PROD_DEFAULTS = SUM_DEFAULTS = STAT_FUNC_DEFAULTS.copy()
|
||||
SUM_DEFAULTS["keepdims"] = False
|
||||
SUM_DEFAULTS["initial"] = None
|
||||
|
||||
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(
|
||||
STAT_FUNC_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 = OrderedDict() # type: OrderedDict[str, Optional[bool]]
|
||||
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 = OrderedDict() # type: OrderedDict[str, Optional[str]]
|
||||
TAKE_DEFAULTS["out"] = None
|
||||
TAKE_DEFAULTS["mode"] = "raise"
|
||||
validate_take = CompatValidator(TAKE_DEFAULTS, fname="take", method="kwargs")
|
||||
|
||||
|
||||
def validate_take_with_convert(convert, args, kwargs):
|
||||
"""
|
||||
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 = dict(axes=None)
|
||||
validate_transpose = CompatValidator(
|
||||
TRANSPOSE_DEFAULTS, fname="transpose", method="both", max_fname_arg_count=0
|
||||
)
|
||||
|
||||
|
||||
def validate_window_func(name, args, kwargs):
|
||||
numpy_args = ("axis", "dtype", "out")
|
||||
msg = (
|
||||
"numpy operations are not "
|
||||
"valid with window objects. "
|
||||
"Use .{func}() directly instead ".format(func=name)
|
||||
)
|
||||
|
||||
if len(args) > 0:
|
||||
raise UnsupportedFunctionCall(msg)
|
||||
|
||||
for arg in numpy_args:
|
||||
if arg in kwargs:
|
||||
raise UnsupportedFunctionCall(msg)
|
||||
|
||||
|
||||
def validate_rolling_func(name, args, kwargs):
|
||||
numpy_args = ("axis", "dtype", "out")
|
||||
msg = (
|
||||
"numpy operations are not "
|
||||
"valid with window objects. "
|
||||
"Use .rolling(...).{func}() instead ".format(func=name)
|
||||
)
|
||||
|
||||
if len(args) > 0:
|
||||
raise UnsupportedFunctionCall(msg)
|
||||
|
||||
for arg in numpy_args:
|
||||
if arg in kwargs:
|
||||
raise UnsupportedFunctionCall(msg)
|
||||
|
||||
|
||||
def validate_expanding_func(name, args, kwargs):
|
||||
numpy_args = ("axis", "dtype", "out")
|
||||
msg = (
|
||||
"numpy operations are not "
|
||||
"valid with window objects. "
|
||||
"Use .expanding(...).{func}() instead ".format(func=name)
|
||||
)
|
||||
|
||||
if len(args) > 0:
|
||||
raise UnsupportedFunctionCall(msg)
|
||||
|
||||
for arg in numpy_args:
|
||||
if arg in kwargs:
|
||||
raise UnsupportedFunctionCall(msg)
|
||||
|
||||
|
||||
def validate_groupby_func(name, args, kwargs, allowed=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. Use .groupby(...)."
|
||||
"{func}() instead".format(func=name)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
RESAMPLER_NUMPY_OPS = ("min", "max", "sum", "prod", "mean", "std", "var")
|
||||
|
||||
|
||||
def validate_resampler_func(method, args, kwargs):
|
||||
"""
|
||||
'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. Use .resample(...)."
|
||||
"{func}() instead".format(func=method)
|
||||
)
|
||||
)
|
||||
else:
|
||||
raise TypeError("too many arguments passed in")
|
||||
|
||||
|
||||
def validate_minmax_axis(axis):
|
||||
"""
|
||||
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
|
||||
|
||||
Raises
|
||||
------
|
||||
ValueError
|
||||
"""
|
||||
ndim = 1 # hard-coded for Index
|
||||
if axis is None:
|
||||
return
|
||||
if axis >= ndim or (axis < 0 and ndim + axis < 0):
|
||||
raise ValueError(
|
||||
"`axis` must be fewer than the number of "
|
||||
"dimensions ({ndim})".format(ndim=ndim)
|
||||
)
|
221
venv/lib/python3.6/site-packages/pandas/compat/pickle_compat.py
Normal file
221
venv/lib/python3.6/site-packages/pandas/compat/pickle_compat.py
Normal file
@@ -0,0 +1,221 @@
|
||||
"""
|
||||
Support pre-0.12 series pickle compatibility.
|
||||
"""
|
||||
|
||||
import copy
|
||||
import pickle as pkl
|
||||
import sys
|
||||
|
||||
import pandas # noqa
|
||||
from pandas import Index
|
||||
|
||||
|
||||
def load_reduce(self):
|
||||
stack = self.stack
|
||||
args = stack.pop()
|
||||
func = stack[-1]
|
||||
|
||||
if len(args) and type(args[0]) is type:
|
||||
n = args[0].__name__ # noqa
|
||||
|
||||
try:
|
||||
stack[-1] = func(*args)
|
||||
return
|
||||
except Exception as e:
|
||||
|
||||
# If we have a deprecated function,
|
||||
# try to replace and try again.
|
||||
|
||||
msg = "_reconstruct: First argument must be a sub-type of ndarray"
|
||||
|
||||
if msg in str(e):
|
||||
try:
|
||||
cls = args[0]
|
||||
stack[-1] = object.__new__(cls)
|
||||
return
|
||||
except TypeError:
|
||||
pass
|
||||
|
||||
# try to re-encode the arguments
|
||||
if getattr(self, "encoding", None) is not None:
|
||||
args = tuple(
|
||||
arg.encode(self.encoding) if isinstance(arg, str) else arg
|
||||
for arg in args
|
||||
)
|
||||
try:
|
||||
stack[-1] = func(*args)
|
||||
return
|
||||
except TypeError:
|
||||
pass
|
||||
|
||||
# unknown exception, re-raise
|
||||
if getattr(self, "is_verbose", None):
|
||||
print(sys.exc_info())
|
||||
print(func, args)
|
||||
raise
|
||||
|
||||
|
||||
# If classes are moved, provide compat here.
|
||||
_class_locations_map = {
|
||||
("pandas.core.sparse.array", "SparseArray"): ("pandas.core.arrays", "SparseArray"),
|
||||
# 15477
|
||||
#
|
||||
# TODO: When FrozenNDArray is removed, add
|
||||
# the following lines for compat:
|
||||
#
|
||||
# ('pandas.core.base', 'FrozenNDArray'):
|
||||
# ('numpy', 'ndarray'),
|
||||
# ('pandas.core.indexes.frozen', 'FrozenNDArray'):
|
||||
# ('numpy', 'ndarray'),
|
||||
#
|
||||
# Afterwards, remove the current entry
|
||||
# for `pandas.core.base.FrozenNDArray`.
|
||||
("pandas.core.base", "FrozenNDArray"): (
|
||||
"pandas.core.indexes.frozen",
|
||||
"FrozenNDArray",
|
||||
),
|
||||
("pandas.core.base", "FrozenList"): ("pandas.core.indexes.frozen", "FrozenList"),
|
||||
# 10890
|
||||
("pandas.core.series", "TimeSeries"): ("pandas.core.series", "Series"),
|
||||
("pandas.sparse.series", "SparseTimeSeries"): (
|
||||
"pandas.core.sparse.series",
|
||||
"SparseSeries",
|
||||
),
|
||||
# 12588, extensions moving
|
||||
("pandas._sparse", "BlockIndex"): ("pandas._libs.sparse", "BlockIndex"),
|
||||
("pandas.tslib", "Timestamp"): ("pandas._libs.tslib", "Timestamp"),
|
||||
# 18543 moving period
|
||||
("pandas._period", "Period"): ("pandas._libs.tslibs.period", "Period"),
|
||||
("pandas._libs.period", "Period"): ("pandas._libs.tslibs.period", "Period"),
|
||||
# 18014 moved __nat_unpickle from _libs.tslib-->_libs.tslibs.nattype
|
||||
("pandas.tslib", "__nat_unpickle"): (
|
||||
"pandas._libs.tslibs.nattype",
|
||||
"__nat_unpickle",
|
||||
),
|
||||
("pandas._libs.tslib", "__nat_unpickle"): (
|
||||
"pandas._libs.tslibs.nattype",
|
||||
"__nat_unpickle",
|
||||
),
|
||||
# 15998 top-level dirs moving
|
||||
("pandas.sparse.array", "SparseArray"): (
|
||||
"pandas.core.arrays.sparse",
|
||||
"SparseArray",
|
||||
),
|
||||
("pandas.sparse.series", "SparseSeries"): (
|
||||
"pandas.core.sparse.series",
|
||||
"SparseSeries",
|
||||
),
|
||||
("pandas.sparse.frame", "SparseDataFrame"): (
|
||||
"pandas.core.sparse.frame",
|
||||
"SparseDataFrame",
|
||||
),
|
||||
("pandas.indexes.base", "_new_Index"): ("pandas.core.indexes.base", "_new_Index"),
|
||||
("pandas.indexes.base", "Index"): ("pandas.core.indexes.base", "Index"),
|
||||
("pandas.indexes.numeric", "Int64Index"): (
|
||||
"pandas.core.indexes.numeric",
|
||||
"Int64Index",
|
||||
),
|
||||
("pandas.indexes.range", "RangeIndex"): ("pandas.core.indexes.range", "RangeIndex"),
|
||||
("pandas.indexes.multi", "MultiIndex"): ("pandas.core.indexes.multi", "MultiIndex"),
|
||||
("pandas.tseries.index", "_new_DatetimeIndex"): (
|
||||
"pandas.core.indexes.datetimes",
|
||||
"_new_DatetimeIndex",
|
||||
),
|
||||
("pandas.tseries.index", "DatetimeIndex"): (
|
||||
"pandas.core.indexes.datetimes",
|
||||
"DatetimeIndex",
|
||||
),
|
||||
("pandas.tseries.period", "PeriodIndex"): (
|
||||
"pandas.core.indexes.period",
|
||||
"PeriodIndex",
|
||||
),
|
||||
# 19269, arrays moving
|
||||
("pandas.core.categorical", "Categorical"): ("pandas.core.arrays", "Categorical"),
|
||||
# 19939, add timedeltaindex, float64index compat from 15998 move
|
||||
("pandas.tseries.tdi", "TimedeltaIndex"): (
|
||||
"pandas.core.indexes.timedeltas",
|
||||
"TimedeltaIndex",
|
||||
),
|
||||
("pandas.indexes.numeric", "Float64Index"): (
|
||||
"pandas.core.indexes.numeric",
|
||||
"Float64Index",
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
# our Unpickler sub-class to override methods and some dispatcher
|
||||
# functions for compat
|
||||
|
||||
|
||||
class Unpickler(pkl._Unpickler): # type: ignore
|
||||
def find_class(self, module, name):
|
||||
# override superclass
|
||||
key = (module, name)
|
||||
module, name = _class_locations_map.get(key, key)
|
||||
return super().find_class(module, name)
|
||||
|
||||
|
||||
Unpickler.dispatch = copy.copy(Unpickler.dispatch)
|
||||
Unpickler.dispatch[pkl.REDUCE[0]] = load_reduce
|
||||
|
||||
|
||||
def load_newobj(self):
|
||||
args = self.stack.pop()
|
||||
cls = self.stack[-1]
|
||||
|
||||
# compat
|
||||
if issubclass(cls, Index):
|
||||
obj = object.__new__(cls)
|
||||
else:
|
||||
obj = cls.__new__(cls, *args)
|
||||
|
||||
self.stack[-1] = obj
|
||||
|
||||
|
||||
Unpickler.dispatch[pkl.NEWOBJ[0]] = load_newobj
|
||||
|
||||
|
||||
def load_newobj_ex(self):
|
||||
kwargs = self.stack.pop()
|
||||
args = self.stack.pop()
|
||||
cls = self.stack.pop()
|
||||
|
||||
# compat
|
||||
if issubclass(cls, Index):
|
||||
obj = object.__new__(cls)
|
||||
else:
|
||||
obj = cls.__new__(cls, *args, **kwargs)
|
||||
self.append(obj)
|
||||
|
||||
|
||||
try:
|
||||
Unpickler.dispatch[pkl.NEWOBJ_EX[0]] = load_newobj_ex
|
||||
except (AttributeError, KeyError):
|
||||
pass
|
||||
|
||||
|
||||
def load(fh, encoding=None, is_verbose=False):
|
||||
"""load a pickle, with a provided encoding
|
||||
|
||||
if compat is True:
|
||||
fake the old class hierarchy
|
||||
if it works, then return the new type objects
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fh : a filelike object
|
||||
encoding : an optional encoding
|
||||
is_verbose : show exception output
|
||||
"""
|
||||
|
||||
try:
|
||||
fh.seek(0)
|
||||
if encoding is not None:
|
||||
up = Unpickler(fh, encoding=encoding)
|
||||
else:
|
||||
up = Unpickler(fh)
|
||||
up.is_verbose = is_verbose
|
||||
|
||||
return up.load()
|
||||
except (ValueError, TypeError):
|
||||
raise
|
Reference in New Issue
Block a user