diff --git a/pandas/_libs/exceptions.pyx b/pandas/_libs/exceptions.pyx new file mode 100644 index 0000000000000..03d2c85785c65 --- /dev/null +++ b/pandas/_libs/exceptions.pyx @@ -0,0 +1,27 @@ +import inspect +import os + + +cpdef int find_stack_level(): + """ + Find the first place in the stack that is not inside pandas + (tests notwithstanding). + """ + cdef: + int n + str pkg_dir, test_dir, fname + + pkg_dir = os.path.dirname(os.path.dirname(__file__)) + test_dir = os.path.join(pkg_dir, "tests") + + # https://stackoverflow.com/questions/17407119/python-inspect-stack-is-slow + frame = inspect.currentframe() + n = 1 + while frame: + fname = inspect.getfile(frame) + if fname.startswith(pkg_dir) and not fname.startswith(test_dir): + frame = frame.f_back + n += 1 + else: + break + return n diff --git a/pandas/_libs/interval.pyx b/pandas/_libs/interval.pyx index ec1dbff6903e7..eb71a3dfe7187 100644 --- a/pandas/_libs/interval.pyx +++ b/pandas/_libs/interval.pyx @@ -9,7 +9,7 @@ from cpython.datetime cimport ( import_datetime, ) -from pandas.util._exceptions import find_stack_level +from pandas._libs.exceptions import find_stack_level import_datetime() diff --git a/pandas/_testing/asserters.py b/pandas/_testing/asserters.py index c7924dc451752..573875e211f48 100644 --- a/pandas/_testing/asserters.py +++ b/pandas/_testing/asserters.py @@ -8,6 +8,7 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level from pandas._libs.lib import ( NoDefault, no_default, @@ -15,7 +16,6 @@ from pandas._libs.missing import is_matching_na from pandas._libs.sparse import SparseIndex import pandas._libs.testing as _testing -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( is_bool, diff --git a/pandas/core/accessor.py b/pandas/core/accessor.py index 07fa5799fe371..0d2508f1a491b 100644 --- a/pandas/core/accessor.py +++ b/pandas/core/accessor.py @@ -8,8 +8,8 @@ import warnings +from pandas._libs.exceptions import find_stack_level from pandas.util._decorators import doc -from pandas.util._exceptions import find_stack_level class DirNamesMixin: diff --git a/pandas/core/algorithms.py b/pandas/core/algorithms.py index 159c0bb2e72c0..1343a043ec2b5 100644 --- a/pandas/core/algorithms.py +++ b/pandas/core/algorithms.py @@ -25,6 +25,7 @@ iNaT, lib, ) +from pandas._libs.exceptions import find_stack_level from pandas._typing import ( AnyArrayLike, ArrayLike, @@ -34,7 +35,6 @@ npt, ) from pandas.util._decorators import doc -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.cast import ( construct_1d_object_array_from_listlike, diff --git a/pandas/core/apply.py b/pandas/core/apply.py index 18a0f9b7aa2ce..857eedf47b7a1 100644 --- a/pandas/core/apply.py +++ b/pandas/core/apply.py @@ -25,6 +25,7 @@ from pandas._config import option_context from pandas._libs import lib +from pandas._libs.exceptions import find_stack_level from pandas._typing import ( AggFuncType, AggFuncTypeBase, @@ -39,7 +40,6 @@ SpecificationError, ) from pandas.util._decorators import cache_readonly -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.cast import is_nested_object from pandas.core.dtypes.common import ( diff --git a/pandas/core/arraylike.py b/pandas/core/arraylike.py index 280a599de84ed..40f97ab2ff0e6 100644 --- a/pandas/core/arraylike.py +++ b/pandas/core/arraylike.py @@ -13,8 +13,8 @@ import numpy as np from pandas._libs import lib +from pandas._libs.exceptions import find_stack_level from pandas._libs.ops_dispatch import maybe_dispatch_ufunc_to_dunder_op -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.generic import ABCNDFrame diff --git a/pandas/core/arrays/arrow/_arrow_utils.py b/pandas/core/arrays/arrow/_arrow_utils.py index c9666de9f892d..5db5f78713185 100644 --- a/pandas/core/arrays/arrow/_arrow_utils.py +++ b/pandas/core/arrays/arrow/_arrow_utils.py @@ -6,10 +6,10 @@ import numpy as np import pyarrow +from pandas._libs.exceptions import find_stack_level from pandas._typing import IntervalInclusiveType from pandas.errors import PerformanceWarning from pandas.util._decorators import deprecate_kwarg -from pandas.util._exceptions import find_stack_level from pandas.core.arrays.interval import VALID_INCLUSIVE diff --git a/pandas/core/arrays/base.py b/pandas/core/arrays/base.py index 6c9b7adadb7b0..a52eab5a790b6 100644 --- a/pandas/core/arrays/base.py +++ b/pandas/core/arrays/base.py @@ -27,6 +27,7 @@ import numpy as np from pandas._libs import lib +from pandas._libs.exceptions import find_stack_level from pandas._typing import ( ArrayLike, AstypeArg, @@ -48,7 +49,6 @@ cache_readonly, deprecate_nonkeyword_arguments, ) -from pandas.util._exceptions import find_stack_level from pandas.util._validators import ( validate_bool_kwarg, validate_fillna_kwargs, diff --git a/pandas/core/arrays/categorical.py b/pandas/core/arrays/categorical.py index 2c3b7c2f2589d..2748656e8a964 100644 --- a/pandas/core/arrays/categorical.py +++ b/pandas/core/arrays/categorical.py @@ -30,6 +30,7 @@ lib, ) from pandas._libs.arrays import NDArrayBacked +from pandas._libs.exceptions import find_stack_level from pandas._libs.lib import ( NoDefault, no_default, @@ -49,7 +50,6 @@ deprecate_kwarg, deprecate_nonkeyword_arguments, ) -from pandas.util._exceptions import find_stack_level from pandas.util._validators import validate_bool_kwarg from pandas.core.dtypes.cast import coerce_indexer_dtype diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index 11c236836e791..9fb0cc18be1f4 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -26,6 +26,7 @@ lib, ) from pandas._libs.arrays import NDArrayBacked +from pandas._libs.exceptions import find_stack_level from pandas._libs.tslibs import ( BaseOffset, IncompatibleFrequency, @@ -71,7 +72,6 @@ Substitution, cache_readonly, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( is_all_strings, diff --git a/pandas/core/arrays/datetimes.py b/pandas/core/arrays/datetimes.py index ffd093b86582c..7a7fe473d84cd 100644 --- a/pandas/core/arrays/datetimes.py +++ b/pandas/core/arrays/datetimes.py @@ -19,6 +19,7 @@ lib, tslib, ) +from pandas._libs.exceptions import find_stack_level from pandas._libs.tslibs import ( BaseOffset, NaT, @@ -44,7 +45,6 @@ OutOfBoundsDatetime, PerformanceWarning, ) -from pandas.util._exceptions import find_stack_level from pandas.util._validators import validate_inclusive from pandas.core.dtypes.astype import astype_dt64_to_dt64tz diff --git a/pandas/core/arrays/interval.py b/pandas/core/arrays/interval.py index e7198a95c07f1..1bda1fc122518 100644 --- a/pandas/core/arrays/interval.py +++ b/pandas/core/arrays/interval.py @@ -22,6 +22,7 @@ from pandas._config import get_option from pandas._libs import lib +from pandas._libs.exceptions import find_stack_level from pandas._libs.interval import ( VALID_INCLUSIVE, Interval, @@ -46,7 +47,6 @@ deprecate_kwarg, deprecate_nonkeyword_arguments, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.cast import LossySetitemError from pandas.core.dtypes.common import ( diff --git a/pandas/core/arrays/sparse/array.py b/pandas/core/arrays/sparse/array.py index f946f881311c1..8afbe8f7eb74a 100644 --- a/pandas/core/arrays/sparse/array.py +++ b/pandas/core/arrays/sparse/array.py @@ -21,6 +21,7 @@ import numpy as np from pandas._libs import lib +from pandas._libs.exceptions import find_stack_level import pandas._libs.sparse as splib from pandas._libs.sparse import ( BlockIndex, @@ -41,7 +42,6 @@ ) from pandas.compat.numpy import function as nv from pandas.errors import PerformanceWarning -from pandas.util._exceptions import find_stack_level from pandas.util._validators import ( validate_bool_kwarg, validate_insert_loc, diff --git a/pandas/core/arrays/sparse/dtype.py b/pandas/core/arrays/sparse/dtype.py index eaed6257736ba..e1681110a83e5 100644 --- a/pandas/core/arrays/sparse/dtype.py +++ b/pandas/core/arrays/sparse/dtype.py @@ -10,13 +10,13 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level from pandas._typing import ( Dtype, DtypeObj, type_t, ) from pandas.errors import PerformanceWarning -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.astype import astype_nansafe from pandas.core.dtypes.base import ( diff --git a/pandas/core/base.py b/pandas/core/base.py index f7e6c4434da32..e001584499416 100644 --- a/pandas/core/base.py +++ b/pandas/core/base.py @@ -20,6 +20,7 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level import pandas._libs.lib as lib from pandas._typing import ( ArrayLike, @@ -36,7 +37,6 @@ cache_readonly, doc, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( is_categorical_dtype, diff --git a/pandas/core/common.py b/pandas/core/common.py index 980e7a79414ba..a9fa5d0b6a486 100644 --- a/pandas/core/common.py +++ b/pandas/core/common.py @@ -30,6 +30,7 @@ import numpy as np from pandas._libs import lib +from pandas._libs.exceptions import find_stack_level from pandas._typing import ( AnyArrayLike, ArrayLike, @@ -37,7 +38,6 @@ RandomState, T, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.cast import construct_1d_object_array_from_listlike from pandas.core.dtypes.common import ( diff --git a/pandas/core/computation/align.py b/pandas/core/computation/align.py index 2e7a0f842ee6d..d7ad07bfcdb8a 100644 --- a/pandas/core/computation/align.py +++ b/pandas/core/computation/align.py @@ -16,8 +16,8 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level from pandas.errors import PerformanceWarning -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.generic import ( ABCDataFrame, diff --git a/pandas/core/computation/eval.py b/pandas/core/computation/eval.py index 1892069f78edd..9c2552b400f71 100644 --- a/pandas/core/computation/eval.py +++ b/pandas/core/computation/eval.py @@ -6,8 +6,8 @@ import tokenize import warnings +from pandas._libs.exceptions import find_stack_level from pandas._libs.lib import no_default -from pandas.util._exceptions import find_stack_level from pandas.util._validators import validate_bool_kwarg from pandas.core.computation.engines import ENGINES diff --git a/pandas/core/config_init.py b/pandas/core/config_init.py index 8c1a3fece255e..c00f31135195a 100644 --- a/pandas/core/config_init.py +++ b/pandas/core/config_init.py @@ -27,7 +27,7 @@ is_text, ) -from pandas.util._exceptions import find_stack_level +from pandas._libs.exceptions import find_stack_level # compute diff --git a/pandas/core/construction.py b/pandas/core/construction.py index 4b63d492ec1dd..0ac4117c161af 100644 --- a/pandas/core/construction.py +++ b/pandas/core/construction.py @@ -21,6 +21,7 @@ import numpy.ma as ma from pandas._libs import lib +from pandas._libs.exceptions import find_stack_level from pandas._libs.tslibs.period import Period from pandas._typing import ( AnyArrayLike, @@ -30,7 +31,6 @@ T, ) from pandas.errors import IntCastingNaNError -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.base import ( ExtensionDtype, diff --git a/pandas/core/describe.py b/pandas/core/describe.py index c70dbe0b8b0b1..5cf2d6351ca2e 100644 --- a/pandas/core/describe.py +++ b/pandas/core/describe.py @@ -21,12 +21,12 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level from pandas._libs.tslibs import Timestamp from pandas._typing import ( NDFrameT, npt, ) -from pandas.util._exceptions import find_stack_level from pandas.util._validators import validate_percentile from pandas.core.dtypes.common import ( diff --git a/pandas/core/dtypes/astype.py b/pandas/core/dtypes/astype.py index 7fb58468746a8..bee34a0171df7 100644 --- a/pandas/core/dtypes/astype.py +++ b/pandas/core/dtypes/astype.py @@ -15,6 +15,7 @@ import numpy as np from pandas._libs import lib +from pandas._libs.exceptions import find_stack_level from pandas._libs.tslibs import is_unitless from pandas._libs.tslibs.timedeltas import array_to_timedelta64 from pandas._typing import ( @@ -23,7 +24,6 @@ IgnoreRaise, ) from pandas.errors import IntCastingNaNError -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( is_datetime64_dtype, diff --git a/pandas/core/dtypes/cast.py b/pandas/core/dtypes/cast.py index 769656d1c4755..d075c4ce24341 100644 --- a/pandas/core/dtypes/cast.py +++ b/pandas/core/dtypes/cast.py @@ -24,6 +24,7 @@ import numpy as np from pandas._libs import lib +from pandas._libs.exceptions import find_stack_level from pandas._libs.tslibs import ( NaT, OutOfBoundsDatetime, @@ -40,7 +41,6 @@ Scalar, ) from pandas.errors import IntCastingNaNError -from pandas.util._exceptions import find_stack_level from pandas.util._validators import validate_bool_kwarg from pandas.core.dtypes.astype import astype_nansafe diff --git a/pandas/core/dtypes/common.py b/pandas/core/dtypes/common.py index c10461b2fc7f8..6e672b8c90a9f 100644 --- a/pandas/core/dtypes/common.py +++ b/pandas/core/dtypes/common.py @@ -17,12 +17,12 @@ algos, lib, ) +from pandas._libs.exceptions import find_stack_level from pandas._libs.tslibs import conversion from pandas._typing import ( ArrayLike, DtypeObj, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.base import _registry as registry from pandas.core.dtypes.dtypes import ( diff --git a/pandas/core/dtypes/concat.py b/pandas/core/dtypes/concat.py index 059df4009e2f6..1f408ccd6eeb5 100644 --- a/pandas/core/dtypes/concat.py +++ b/pandas/core/dtypes/concat.py @@ -11,11 +11,11 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level from pandas._typing import ( ArrayLike, DtypeObj, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.astype import astype_array from pandas.core.dtypes.cast import ( diff --git a/pandas/core/dtypes/dtypes.py b/pandas/core/dtypes/dtypes.py index 99b2082d409a9..62c66b4ec200a 100644 --- a/pandas/core/dtypes/dtypes.py +++ b/pandas/core/dtypes/dtypes.py @@ -19,6 +19,7 @@ lib, missing as libmissing, ) +from pandas._libs.exceptions import find_stack_level from pandas._libs.interval import ( Interval, _warning_interval, @@ -43,7 +44,6 @@ npt, type_t, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.base import ( ExtensionDtype, diff --git a/pandas/core/dtypes/inference.py b/pandas/core/dtypes/inference.py index 893e4a9be58ef..75b148b0e6046 100644 --- a/pandas/core/dtypes/inference.py +++ b/pandas/core/dtypes/inference.py @@ -11,8 +11,8 @@ import numpy as np from pandas._libs import lib +from pandas._libs.exceptions import find_stack_level from pandas._typing import ArrayLike -from pandas.util._exceptions import find_stack_level is_bool = lib.is_bool diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 338a8ff16e54e..5680265c838ec 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -41,6 +41,7 @@ lib, properties, ) +from pandas._libs.exceptions import find_stack_level from pandas._libs.hashtable import duplicated from pandas._libs.lib import ( NoDefault, @@ -89,7 +90,6 @@ doc, rewrite_axis_style_signature, ) -from pandas.util._exceptions import find_stack_level from pandas.util._validators import ( validate_ascending, validate_axis_style_args, diff --git a/pandas/core/generic.py b/pandas/core/generic.py index a033b7a3f83d7..b8ec2fe1acbe8 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -31,6 +31,7 @@ from pandas._config import config from pandas._libs import lib +from pandas._libs.exceptions import find_stack_level from pandas._libs.tslibs import ( Period, Tick, @@ -81,7 +82,6 @@ doc, rewrite_axis_style_signature, ) -from pandas.util._exceptions import find_stack_level from pandas.util._validators import ( validate_ascending, validate_bool_kwarg, diff --git a/pandas/core/groupby/generic.py b/pandas/core/groupby/generic.py index 9e26598d85e74..eca9476d6f303 100644 --- a/pandas/core/groupby/generic.py +++ b/pandas/core/groupby/generic.py @@ -31,6 +31,7 @@ lib, reduction as libreduction, ) +from pandas._libs.exceptions import find_stack_level from pandas._typing import ( ArrayLike, Manager, @@ -43,7 +44,6 @@ Substitution, doc, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( ensure_int64, diff --git a/pandas/core/groupby/groupby.py b/pandas/core/groupby/groupby.py index 28e1b2b388035..6683d2facaf53 100644 --- a/pandas/core/groupby/groupby.py +++ b/pandas/core/groupby/groupby.py @@ -42,6 +42,7 @@ class providing the base-class of operations. Timestamp, lib, ) +from pandas._libs.exceptions import find_stack_level import pandas._libs.groupby as libgroupby from pandas._typing import ( ArrayLike, @@ -64,7 +65,6 @@ class providing the base-class of operations. cache_readonly, doc, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.cast import ensure_dtype_can_hold_na from pandas.core.dtypes.common import ( diff --git a/pandas/core/groupby/grouper.py b/pandas/core/groupby/grouper.py index b9f4166b475ca..1ef1a2e4aabd1 100644 --- a/pandas/core/groupby/grouper.py +++ b/pandas/core/groupby/grouper.py @@ -14,6 +14,7 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level from pandas._typing import ( ArrayLike, NDFrameT, @@ -21,7 +22,6 @@ ) from pandas.errors import InvalidIndexError from pandas.util._decorators import cache_readonly -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.cast import sanitize_to_nanoseconds from pandas.core.dtypes.common import ( diff --git a/pandas/core/index.py b/pandas/core/index.py index 19e9c6b27e4e7..69b4a3fb9ef63 100644 --- a/pandas/core/index.py +++ b/pandas/core/index.py @@ -3,7 +3,7 @@ import warnings -from pandas.util._exceptions import find_stack_level +from pandas._libs.exceptions import find_stack_level from pandas.core.indexes.api import ( # noqa:F401 CategoricalIndex, diff --git a/pandas/core/indexers/utils.py b/pandas/core/indexers/utils.py index 0f3cdc4195c85..041b5dcead029 100644 --- a/pandas/core/indexers/utils.py +++ b/pandas/core/indexers/utils.py @@ -11,8 +11,8 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level from pandas._typing import AnyArrayLike -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( is_array_like, diff --git a/pandas/core/indexes/accessors.py b/pandas/core/indexes/accessors.py index 46959aa5cd3e2..2742bfba997d7 100644 --- a/pandas/core/indexes/accessors.py +++ b/pandas/core/indexes/accessors.py @@ -8,7 +8,7 @@ import numpy as np -from pandas.util._exceptions import find_stack_level +from pandas._libs.exceptions import find_stack_level from pandas.core.dtypes.common import ( is_categorical_dtype, diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 26b833f78bec6..6fd892241ffc4 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -30,6 +30,7 @@ index as libindex, lib, ) +from pandas._libs.exceptions import find_stack_level import pandas._libs.join as libjoin from pandas._libs.lib import ( is_datetime_array, @@ -65,10 +66,7 @@ deprecate_nonkeyword_arguments, doc, ) -from pandas.util._exceptions import ( - find_stack_level, - rewrite_exception, -) +from pandas.util._exceptions import rewrite_exception from pandas.core.dtypes.astype import astype_nansafe from pandas.core.dtypes.cast import ( diff --git a/pandas/core/indexes/category.py b/pandas/core/indexes/category.py index c1ae3cb1b16ea..14fc1fdb9eaa4 100644 --- a/pandas/core/indexes/category.py +++ b/pandas/core/indexes/category.py @@ -9,6 +9,7 @@ import numpy as np from pandas._libs import index as libindex +from pandas._libs.exceptions import find_stack_level from pandas._typing import ( Dtype, DtypeObj, @@ -18,7 +19,6 @@ cache_readonly, doc, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( is_categorical_dtype, diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index 8014d010afc1b..be051f2bfa1d1 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -22,6 +22,7 @@ Timedelta, lib, ) +from pandas._libs.exceptions import find_stack_level from pandas._libs.tslibs import ( BaseOffset, Resolution, @@ -35,7 +36,6 @@ cache_readonly, doc, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( is_categorical_dtype, diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index 30c770f32c2dc..1f136484945d4 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -24,6 +24,7 @@ index as libindex, lib, ) +from pandas._libs.exceptions import find_stack_level from pandas._libs.tslibs import ( BaseOffset, Resolution, @@ -44,7 +45,6 @@ cache_readonly, doc, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( is_datetime64_dtype, diff --git a/pandas/core/indexes/interval.py b/pandas/core/indexes/interval.py index 23f2e724e208c..2044b765ee2c0 100644 --- a/pandas/core/indexes/interval.py +++ b/pandas/core/indexes/interval.py @@ -16,6 +16,7 @@ import numpy as np from pandas._libs import lib +from pandas._libs.exceptions import find_stack_level from pandas._libs.interval import ( Interval, IntervalMixin, @@ -39,10 +40,7 @@ cache_readonly, deprecate_kwarg, ) -from pandas.util._exceptions import ( - find_stack_level, - rewrite_exception, -) +from pandas.util._exceptions import rewrite_exception from pandas.core.dtypes.cast import ( find_common_type, diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 60f727f54b621..7e97364919549 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -26,6 +26,7 @@ index as libindex, lib, ) +from pandas._libs.exceptions import find_stack_level from pandas._libs.hashtable import duplicated from pandas._typing import ( AnyArrayLike, @@ -47,7 +48,6 @@ deprecate_nonkeyword_arguments, doc, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.cast import coerce_indexer_dtype from pandas.core.dtypes.common import ( diff --git a/pandas/core/indexes/numeric.py b/pandas/core/indexes/numeric.py index a597bea0eb724..3861202456f96 100644 --- a/pandas/core/indexes/numeric.py +++ b/pandas/core/indexes/numeric.py @@ -12,6 +12,7 @@ index as libindex, lib, ) +from pandas._libs.exceptions import find_stack_level from pandas._typing import ( Dtype, npt, @@ -20,7 +21,6 @@ cache_readonly, doc, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( is_dtype_equal, diff --git a/pandas/core/indexes/period.py b/pandas/core/indexes/period.py index c034d9416eae7..0e7d00c99e030 100644 --- a/pandas/core/indexes/period.py +++ b/pandas/core/indexes/period.py @@ -13,6 +13,7 @@ index as libindex, lib, ) +from pandas._libs.exceptions import find_stack_level from pandas._libs.tslibs import ( BaseOffset, NaT, @@ -29,7 +30,6 @@ cache_readonly, doc, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( is_datetime64_any_dtype, diff --git a/pandas/core/indexes/range.py b/pandas/core/indexes/range.py index 376c98b6e176f..24ba0ed561056 100644 --- a/pandas/core/indexes/range.py +++ b/pandas/core/indexes/range.py @@ -21,6 +21,7 @@ lib, ) from pandas._libs.algos import unique_deltas +from pandas._libs.exceptions import find_stack_level from pandas._libs.lib import no_default from pandas._typing import ( Dtype, @@ -31,7 +32,6 @@ cache_readonly, doc, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( ensure_platform_int, diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index fa1ad7ce3c874..6e7a7136b9657 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -13,6 +13,7 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level from pandas._libs.indexing import NDFrameIndexerBase from pandas._libs.lib import item_from_zerodim from pandas.errors import ( @@ -21,7 +22,6 @@ InvalidIndexError, ) from pandas.util._decorators import doc -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.cast import ( can_hold_element, diff --git a/pandas/core/internals/__init__.py b/pandas/core/internals/__init__.py index ea69b567611e4..8ca628761699c 100644 --- a/pandas/core/internals/__init__.py +++ b/pandas/core/internals/__init__.py @@ -43,7 +43,7 @@ def __getattr__(name: str): import warnings - from pandas.util._exceptions import find_stack_level + from pandas._libs.exceptions import find_stack_level if name == "CategoricalBlock": warnings.warn( diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index df327716970f1..046eb28abdb10 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -21,6 +21,7 @@ lib, writers, ) +from pandas._libs.exceptions import find_stack_level from pandas._libs.internals import BlockPlacement from pandas._libs.tslibs import IncompatibleFrequency from pandas._typing import ( @@ -33,7 +34,6 @@ ) from pandas.errors import AbstractMethodError from pandas.util._decorators import cache_readonly -from pandas.util._exceptions import find_stack_level from pandas.util._validators import validate_bool_kwarg from pandas.core.dtypes.astype import astype_array_safe diff --git a/pandas/core/internals/construction.py b/pandas/core/internals/construction.py index c1d0ab730fe7e..cb0109dab410c 100644 --- a/pandas/core/internals/construction.py +++ b/pandas/core/internals/construction.py @@ -18,12 +18,12 @@ import numpy.ma as ma from pandas._libs import lib +from pandas._libs.exceptions import find_stack_level from pandas._typing import ( ArrayLike, DtypeObj, Manager, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.cast import ( construct_1d_arraylike_from_scalar, diff --git a/pandas/core/internals/managers.py b/pandas/core/internals/managers.py index 435992f7d5cff..6abc626b51902 100644 --- a/pandas/core/internals/managers.py +++ b/pandas/core/internals/managers.py @@ -19,6 +19,7 @@ internals as libinternals, lib, ) +from pandas._libs.exceptions import find_stack_level from pandas._libs.internals import BlockPlacement from pandas._typing import ( ArrayLike, @@ -29,7 +30,6 @@ ) from pandas.errors import PerformanceWarning from pandas.util._decorators import cache_readonly -from pandas.util._exceptions import find_stack_level from pandas.util._validators import validate_bool_kwarg from pandas.core.dtypes.cast import infer_dtype_from_scalar diff --git a/pandas/core/ops/__init__.py b/pandas/core/ops/__init__.py index e9fefd9268870..724e1007c9342 100644 --- a/pandas/core/ops/__init__.py +++ b/pandas/core/ops/__init__.py @@ -11,10 +11,10 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level from pandas._libs.ops_dispatch import maybe_dispatch_ufunc_to_dunder_op from pandas._typing import Level from pandas.util._decorators import Appender -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( is_array_like, diff --git a/pandas/core/resample.py b/pandas/core/resample.py index 8797324166745..dae5d932779e9 100644 --- a/pandas/core/resample.py +++ b/pandas/core/resample.py @@ -16,6 +16,7 @@ import numpy as np from pandas._libs import lib +from pandas._libs.exceptions import find_stack_level from pandas._libs.tslibs import ( BaseOffset, IncompatibleFrequency, @@ -44,7 +45,6 @@ deprecate_nonkeyword_arguments, doc, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.generic import ( ABCDataFrame, diff --git a/pandas/core/reshape/concat.py b/pandas/core/reshape/concat.py index 5328c7995ea6f..009a7d7e836ff 100644 --- a/pandas/core/reshape/concat.py +++ b/pandas/core/reshape/concat.py @@ -18,6 +18,7 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level from pandas._typing import ( Axis, HashableT, @@ -26,7 +27,6 @@ cache_readonly, deprecate_nonkeyword_arguments, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.concat import concat_compat from pandas.core.dtypes.generic import ( diff --git a/pandas/core/reshape/melt.py b/pandas/core/reshape/melt.py index 5de9c8e2f4108..bfc190a070792 100644 --- a/pandas/core/reshape/melt.py +++ b/pandas/core/reshape/melt.py @@ -6,11 +6,11 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level from pandas.util._decorators import ( Appender, deprecate_kwarg, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( is_extension_array_dtype, diff --git a/pandas/core/reshape/merge.py b/pandas/core/reshape/merge.py index 6ce5ffac9de52..fc57145c0e1a8 100644 --- a/pandas/core/reshape/merge.py +++ b/pandas/core/reshape/merge.py @@ -23,6 +23,7 @@ join as libjoin, lib, ) +from pandas._libs.exceptions import find_stack_level from pandas._typing import ( ArrayLike, DtypeObj, @@ -35,7 +36,6 @@ Appender, Substitution, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.cast import find_common_type from pandas.core.dtypes.common import ( diff --git a/pandas/core/series.py b/pandas/core/series.py index 765bf9f7e04f1..165919076954d 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -30,6 +30,7 @@ reshape, tslibs, ) +from pandas._libs.exceptions import find_stack_level from pandas._libs.lib import no_default from pandas._typing import ( AggFuncType, @@ -65,7 +66,6 @@ deprecate_nonkeyword_arguments, doc, ) -from pandas.util._exceptions import find_stack_level from pandas.util._validators import ( validate_ascending, validate_bool_kwarg, diff --git a/pandas/core/strings/accessor.py b/pandas/core/strings/accessor.py index d50daad9a22b1..baa6bc8eb6042 100644 --- a/pandas/core/strings/accessor.py +++ b/pandas/core/strings/accessor.py @@ -13,6 +13,7 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level import pandas._libs.lib as lib from pandas._typing import ( DtypeObj, @@ -22,7 +23,6 @@ Appender, deprecate_nonkeyword_arguments, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( ensure_object, diff --git a/pandas/core/tools/datetimes.py b/pandas/core/tools/datetimes.py index 7ec4bc1016a9d..4391319bcc3fe 100644 --- a/pandas/core/tools/datetimes.py +++ b/pandas/core/tools/datetimes.py @@ -20,6 +20,7 @@ import numpy as np from pandas._libs import tslib +from pandas._libs.exceptions import find_stack_level from pandas._libs.tslibs import ( OutOfBoundsDatetime, Timedelta, @@ -42,7 +43,6 @@ Timezone, npt, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( ensure_object, diff --git a/pandas/core/window/common.py b/pandas/core/window/common.py index e31b5c60a37ee..d5ac8749f9f4a 100644 --- a/pandas/core/window/common.py +++ b/pandas/core/window/common.py @@ -7,7 +7,7 @@ import numpy as np -from pandas.util._exceptions import find_stack_level +from pandas._libs.exceptions import find_stack_level from pandas.core.dtypes.generic import ( ABCDataFrame, diff --git a/pandas/core/window/ewm.py b/pandas/core/window/ewm.py index 020ca71050015..1bbc269be4a2e 100644 --- a/pandas/core/window/ewm.py +++ b/pandas/core/window/ewm.py @@ -22,9 +22,9 @@ from pandas import DataFrame, Series from pandas.core.generic import NDFrame +from pandas._libs.exceptions import find_stack_level from pandas.compat.numpy import function as nv from pandas.util._decorators import doc -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( is_datetime64_ns_dtype, diff --git a/pandas/core/window/rolling.py b/pandas/core/window/rolling.py index 84915e2f52f17..0ddc7b09181c4 100644 --- a/pandas/core/window/rolling.py +++ b/pandas/core/window/rolling.py @@ -20,6 +20,7 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level from pandas._libs.tslibs import ( BaseOffset, to_offset, @@ -36,7 +37,6 @@ from pandas.compat.numpy import function as nv from pandas.errors import DataError from pandas.util._decorators import doc -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( ensure_float64, diff --git a/pandas/io/common.py b/pandas/io/common.py index d911499aa848e..b73bbc539d5f7 100644 --- a/pandas/io/common.py +++ b/pandas/io/common.py @@ -45,6 +45,7 @@ import warnings import zipfile +from pandas._libs.exceptions import find_stack_level from pandas._typing import ( BaseBuffer, CompressionDict, @@ -57,7 +58,6 @@ from pandas.compat import get_lzma_file from pandas.compat._optional import import_optional_dependency from pandas.util._decorators import doc -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( is_bool, diff --git a/pandas/io/date_converters.py b/pandas/io/date_converters.py index 85e92da8c2a54..c12f5a62624c8 100644 --- a/pandas/io/date_converters.py +++ b/pandas/io/date_converters.py @@ -5,9 +5,9 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level from pandas._libs.tslibs import parsing from pandas._typing import npt -from pandas.util._exceptions import find_stack_level def parse_date_time(date_col, time_col) -> npt.NDArray[np.object_]: diff --git a/pandas/io/excel/_base.py b/pandas/io/excel/_base.py index 44152f100d390..1ed4251723404 100644 --- a/pandas/io/excel/_base.py +++ b/pandas/io/excel/_base.py @@ -25,6 +25,7 @@ from pandas._config import config +from pandas._libs.exceptions import find_stack_level from pandas._libs.parsers import STR_NA_VALUES from pandas._typing import ( DtypeArg, @@ -44,7 +45,6 @@ deprecate_nonkeyword_arguments, doc, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( is_bool, diff --git a/pandas/io/formats/style.py b/pandas/io/formats/style.py index 9e3f54169d178..be2c5ab6494c2 100644 --- a/pandas/io/formats/style.py +++ b/pandas/io/formats/style.py @@ -21,6 +21,7 @@ from pandas._config import get_option from pandas._libs import lib +from pandas._libs.exceptions import find_stack_level from pandas._typing import ( Axis, FilePath, @@ -37,7 +38,6 @@ Substitution, doc, ) -from pandas.util._exceptions import find_stack_level import pandas as pd from pandas import ( diff --git a/pandas/io/parsers/base_parser.py b/pandas/io/parsers/base_parser.py index 531fa5400f466..0029c85aaab23 100644 --- a/pandas/io/parsers/base_parser.py +++ b/pandas/io/parsers/base_parser.py @@ -24,6 +24,7 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level import pandas._libs.lib as lib import pandas._libs.ops as libops import pandas._libs.parsers as parsers @@ -38,7 +39,6 @@ ParserError, ParserWarning, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.astype import astype_nansafe from pandas.core.dtypes.common import ( diff --git a/pandas/io/parsers/c_parser_wrapper.py b/pandas/io/parsers/c_parser_wrapper.py index 711d0857a5a1c..489e715fa7340 100644 --- a/pandas/io/parsers/c_parser_wrapper.py +++ b/pandas/io/parsers/c_parser_wrapper.py @@ -11,6 +11,7 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level import pandas._libs.parsers as parsers from pandas._typing import ( ArrayLike, @@ -19,7 +20,6 @@ ReadCsvBuffer, ) from pandas.errors import DtypeWarning -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( is_categorical_dtype, diff --git a/pandas/io/parsers/python_parser.py b/pandas/io/parsers/python_parser.py index 3e897f9b1334e..7b2bb9efe36c3 100644 --- a/pandas/io/parsers/python_parser.py +++ b/pandas/io/parsers/python_parser.py @@ -23,6 +23,7 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level import pandas._libs.lib as lib from pandas._typing import ( ArrayLike, @@ -33,7 +34,6 @@ EmptyDataError, ParserError, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import is_integer from pandas.core.dtypes.inference import is_dict_like diff --git a/pandas/io/parsers/readers.py b/pandas/io/parsers/readers.py index dc4556542d8e2..6cfa41af98c3c 100644 --- a/pandas/io/parsers/readers.py +++ b/pandas/io/parsers/readers.py @@ -21,6 +21,7 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level import pandas._libs.lib as lib from pandas._libs.parsers import STR_NA_VALUES from pandas._typing import ( @@ -40,7 +41,6 @@ Appender, deprecate_nonkeyword_arguments, ) -from pandas.util._exceptions import find_stack_level from pandas.util._validators import validate_bool_kwarg from pandas.core.dtypes.common import ( diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index a4049eff8ae71..4c913bfdafd0f 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -39,6 +39,7 @@ lib, writers as libwriters, ) +from pandas._libs.exceptions import find_stack_level from pandas._libs.tslibs import timezones from pandas._typing import ( AnyArrayLike, @@ -58,7 +59,6 @@ PossibleDataLossError, ) from pandas.util._decorators import cache_readonly -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( ensure_object, diff --git a/pandas/io/sql.py b/pandas/io/sql.py index 086a60774ac4e..bd672c774652f 100644 --- a/pandas/io/sql.py +++ b/pandas/io/sql.py @@ -24,6 +24,7 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level import pandas._libs.lib as lib from pandas._typing import ( DateTimeErrorChoices, @@ -34,7 +35,6 @@ AbstractMethodError, DatabaseError, ) -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( is_datetime64tz_dtype, diff --git a/pandas/plotting/_matplotlib/tools.py b/pandas/plotting/_matplotlib/tools.py index a8b1e4c572c43..48f5ce4e1c969 100644 --- a/pandas/plotting/_matplotlib/tools.py +++ b/pandas/plotting/_matplotlib/tools.py @@ -13,7 +13,7 @@ import matplotlib.ticker as ticker import numpy as np -from pandas.util._exceptions import find_stack_level +from pandas._libs.exceptions import find_stack_level from pandas.core.dtypes.common import is_list_like from pandas.core.dtypes.generic import ( diff --git a/pandas/tseries/frequencies.py b/pandas/tseries/frequencies.py index b2fbc022b2708..ab8bd6af40786 100644 --- a/pandas/tseries/frequencies.py +++ b/pandas/tseries/frequencies.py @@ -5,6 +5,7 @@ import numpy as np from pandas._libs.algos import unique_deltas +from pandas._libs.exceptions import find_stack_level from pandas._libs.tslibs import ( Timestamp, get_unit_from_dtype, @@ -32,7 +33,6 @@ from pandas._libs.tslibs.parsing import get_rule_month from pandas._typing import npt from pandas.util._decorators import cache_readonly -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( is_datetime64_dtype, diff --git a/pandas/util/_decorators.py b/pandas/util/_decorators.py index f8359edaa8d44..385e5594dac13 100644 --- a/pandas/util/_decorators.py +++ b/pandas/util/_decorators.py @@ -11,12 +11,12 @@ ) import warnings +from pandas._libs.exceptions import find_stack_level from pandas._libs.properties import cache_readonly from pandas._typing import ( F, T, ) -from pandas.util._exceptions import find_stack_level def deprecate( diff --git a/pandas/util/_exceptions.py b/pandas/util/_exceptions.py index c718451fbf621..24d0b11bb8f67 100644 --- a/pandas/util/_exceptions.py +++ b/pandas/util/_exceptions.py @@ -1,8 +1,6 @@ from __future__ import annotations import contextlib -import inspect -import os from typing import Iterator @@ -23,27 +21,3 @@ def rewrite_exception(old_name: str, new_name: str) -> Iterator[None]: args = args + err.args[1:] err.args = args raise - - -def find_stack_level() -> int: - """ - Find the first place in the stack that is not inside pandas - (tests notwithstanding). - """ - - import pandas as pd - - pkg_dir = os.path.dirname(pd.__file__) - test_dir = os.path.join(pkg_dir, "tests") - - # https://stackoverflow.com/questions/17407119/python-inspect-stack-is-slow - frame = inspect.currentframe() - n = 0 - while frame: - fname = inspect.getfile(frame) - if fname.startswith(pkg_dir) and not fname.startswith(test_dir): - frame = frame.f_back - n += 1 - else: - break - return n diff --git a/pandas/util/_validators.py b/pandas/util/_validators.py index a4a9ebfbf4126..ba763623cea35 100644 --- a/pandas/util/_validators.py +++ b/pandas/util/_validators.py @@ -15,8 +15,8 @@ import numpy as np +from pandas._libs.exceptions import find_stack_level from pandas._typing import IntervalInclusiveType -from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( is_bool, diff --git a/pandas/util/testing.py b/pandas/util/testing.py index db9bfc274cd78..893fcf77f796d 100644 --- a/pandas/util/testing.py +++ b/pandas/util/testing.py @@ -1,6 +1,6 @@ import warnings -from pandas.util._exceptions import find_stack_level +from pandas._libs.exceptions import find_stack_level from pandas._testing import * # noqa:F401,F403,PDF014 diff --git a/setup.py b/setup.py index 70adbd3c083af..5682ebf4c662f 100755 --- a/setup.py +++ b/setup.py @@ -445,6 +445,7 @@ def srcpath(name=None, suffix=".pyx", subdir="src"): }, "_libs.arrays": {"pyxfile": "_libs/arrays"}, "_libs.groupby": {"pyxfile": "_libs/groupby"}, + "_libs.exceptions": {"pyxfile": "_libs/exceptions"}, "_libs.hashing": {"pyxfile": "_libs/hashing", "depends": []}, "_libs.hashtable": { "pyxfile": "_libs/hashtable",