From fda183327d0befdd08f99ba585c22d82f2093267 Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Fri, 19 Feb 2021 08:47:52 +0000 Subject: [PATCH] keep local imports relative --- .pre-commit-config.yaml | 3 +- pandas/__init__.py | 30 ++--- pandas/_config/__init__.py | 8 +- pandas/_config/dates.py | 2 +- pandas/_config/display.py | 2 +- pandas/_config/localization.py | 2 +- pandas/_libs/__init__.py | 4 +- pandas/_libs/tslibs/__init__.py | 24 ++-- pandas/_testing/__init__.py | 25 ++-- pandas/_testing/_io.py | 5 +- pandas/_typing.py | 29 ++-- pandas/api/__init__.py | 2 +- pandas/compat/__init__.py | 3 +- pandas/conftest.py | 18 +-- pandas/core/aggregation.py | 18 +-- pandas/core/algorithms.py | 34 ++--- pandas/core/api.py | 69 +++++----- pandas/core/apply.py | 39 +++--- pandas/core/arraylike.py | 13 +- pandas/core/arrays/__init__.py | 26 ++-- pandas/core/arrays/_arrow_utils.py | 2 +- pandas/core/arrays/_mixins.py | 3 +- pandas/core/arrays/base.py | 4 +- pandas/core/arrays/boolean.py | 7 +- pandas/core/arrays/categorical.py | 7 +- pandas/core/arrays/datetimelike.py | 19 +-- pandas/core/arrays/datetimes.py | 11 +- pandas/core/arrays/floating.py | 7 +- pandas/core/arrays/integer.py | 17 +-- pandas/core/arrays/interval.py | 16 ++- pandas/core/arrays/masked.py | 8 +- pandas/core/arrays/numeric.py | 9 +- pandas/core/arrays/numpy_.py | 5 +- pandas/core/arrays/period.py | 7 +- pandas/core/arrays/sparse/__init__.py | 6 +- pandas/core/arrays/sparse/accessor.py | 10 +- pandas/core/arrays/sparse/array.py | 3 +- pandas/core/arrays/sparse/dtype.py | 4 +- pandas/core/arrays/string_.py | 18 +-- pandas/core/arrays/string_arrow.py | 3 +- pandas/core/arrays/timedeltas.py | 17 +-- pandas/core/base.py | 30 ++--- pandas/core/common.py | 10 +- pandas/core/computation/align.py | 3 +- pandas/core/computation/api.py | 2 +- pandas/core/computation/engines.py | 8 +- pandas/core/computation/eval.py | 14 +- pandas/core/computation/expr.py | 11 +- pandas/core/computation/expressions.py | 3 +- pandas/core/computation/ops.py | 15 ++- pandas/core/computation/pytables.py | 23 ++-- pandas/core/computation/scope.py | 2 +- pandas/core/config_init.py | 8 +- pandas/core/construction.py | 22 +-- pandas/core/describe.py | 9 +- pandas/core/dtypes/api.py | 2 +- pandas/core/dtypes/base.py | 2 +- pandas/core/dtypes/cast.py | 10 +- pandas/core/dtypes/common.py | 8 +- pandas/core/dtypes/concat.py | 20 +-- pandas/core/dtypes/dtypes.py | 16 +-- pandas/core/dtypes/missing.py | 6 +- pandas/core/frame.py | 125 +++++++++--------- pandas/core/generic.py | 100 +++++++------- pandas/core/groupby/__init__.py | 6 +- pandas/core/groupby/generic.py | 19 +-- pandas/core/groupby/groupby.py | 19 +-- pandas/core/groupby/grouper.py | 11 +- pandas/core/groupby/ops.py | 9 +- pandas/core/index.py | 4 +- pandas/core/indexers.py | 10 +- pandas/core/indexes/accessors.py | 5 +- pandas/core/indexes/api.py | 18 +-- pandas/core/indexes/base.py | 30 +++-- pandas/core/indexes/category.py | 5 +- pandas/core/indexes/datetimelike.py | 9 +- pandas/core/indexes/datetimes.py | 15 ++- pandas/core/indexes/extension.py | 3 +- pandas/core/indexes/interval.py | 13 +- pandas/core/indexes/multi.py | 17 +-- pandas/core/indexes/numeric.py | 3 +- pandas/core/indexes/period.py | 11 +- pandas/core/indexes/range.py | 7 +- pandas/core/indexes/timedeltas.py | 7 +- pandas/core/indexing.py | 18 +-- pandas/core/internals/__init__.py | 10 +- pandas/core/internals/array_manager.py | 9 +- pandas/core/internals/concat.py | 7 +- pandas/core/internals/construction.py | 7 +- pandas/core/internals/managers.py | 7 +- pandas/core/internals/ops.py | 4 +- pandas/core/missing.py | 6 +- pandas/core/nanops.py | 9 +- pandas/core/ops/__init__.py | 15 ++- pandas/core/ops/array_ops.py | 9 +- pandas/core/ops/methods.py | 4 +- pandas/core/ops/missing.py | 2 +- pandas/core/resample.py | 52 ++++---- pandas/core/reshape/api.py | 12 +- pandas/core/reshape/melt.py | 5 +- pandas/core/reshape/merge.py | 2 +- pandas/core/reshape/pivot.py | 5 +- pandas/core/reshape/reshape.py | 4 +- pandas/core/series.py | 104 +++++++-------- pandas/core/sorting.py | 19 +-- pandas/core/strings/__init__.py | 4 +- pandas/core/strings/object_array.py | 2 +- pandas/core/tools/datetimes.py | 2 +- pandas/core/window/__init__.py | 6 +- pandas/core/window/ewm.py | 11 +- pandas/core/window/expanding.py | 6 +- pandas/core/window/rolling.py | 9 +- pandas/io/api.py | 30 ++--- pandas/io/clipboards.py | 6 +- pandas/io/excel/__init__.py | 12 +- pandas/io/excel/_base.py | 13 +- pandas/io/excel/_odfreader.py | 2 +- pandas/io/excel/_odswriter.py | 5 +- pandas/io/excel/_openpyxl.py | 4 +- pandas/io/excel/_pyxlsb.py | 2 +- pandas/io/excel/_xlrd.py | 2 +- pandas/io/excel/_xlsxwriter.py | 4 +- pandas/io/excel/_xlwt.py | 4 +- pandas/io/feather_format.py | 2 +- pandas/io/formats/csvs.py | 2 +- pandas/io/formats/excel.py | 8 +- pandas/io/formats/format.py | 11 +- pandas/io/formats/html.py | 5 +- pandas/io/formats/info.py | 4 +- pandas/io/formats/latex.py | 2 +- pandas/io/formats/printing.py | 4 +- pandas/io/formats/string.py | 4 +- pandas/io/formats/style.py | 2 +- pandas/io/html.py | 6 +- pandas/io/json/__init__.py | 6 +- pandas/io/json/_json.py | 7 +- pandas/io/orc.py | 2 +- pandas/io/parquet.py | 2 +- pandas/io/parsers/__init__.py | 2 +- pandas/io/parsers/c_parser_wrapper.py | 2 +- pandas/io/parsers/python_parser.py | 2 +- pandas/io/parsers/readers.py | 7 +- pandas/io/pickle.py | 2 +- pandas/io/pytables.py | 4 +- pandas/io/sas/__init__.py | 2 +- pandas/io/sas/sas7bdat.py | 5 +- pandas/io/sas/sas_xport.py | 3 +- pandas/io/sas/sasreader.py | 4 +- pandas/io/spss.py | 2 +- pandas/io/stata.py | 2 +- pandas/plotting/__init__.py | 4 +- pandas/plotting/_matplotlib/__init__.py | 14 +- pandas/plotting/_matplotlib/boxplot.py | 7 +- pandas/plotting/_matplotlib/core.py | 11 +- pandas/plotting/_matplotlib/hist.py | 5 +- pandas/plotting/_matplotlib/misc.py | 5 +- pandas/plotting/_matplotlib/timeseries.py | 13 +- pandas/plotting/_matplotlib/tools.py | 2 +- pandas/plotting/_misc.py | 2 +- pandas/testing.py | 2 +- pandas/tests/api/test_types.py | 3 +- pandas/tests/arithmetic/test_datetime64.py | 3 +- pandas/tests/arithmetic/test_period.py | 3 +- pandas/tests/arithmetic/test_timedelta64.py | 3 +- pandas/tests/arrays/categorical/test_api.py | 3 +- .../tests/arrays/categorical/test_indexing.py | 3 +- .../arrays/categorical/test_operators.py | 3 +- pandas/tests/arrays/categorical/test_repr.py | 3 +- pandas/tests/base/test_fillna.py | 3 +- pandas/tests/base/test_unique.py | 3 +- pandas/tests/base/test_value_counts.py | 3 +- pandas/tests/extension/arrow/test_bool.py | 2 +- pandas/tests/extension/arrow/test_string.py | 2 +- .../tests/extension/arrow/test_timestamp.py | 2 +- pandas/tests/extension/base/__init__.py | 28 ++-- pandas/tests/extension/base/casting.py | 3 +- pandas/tests/extension/base/constructors.py | 3 +- pandas/tests/extension/base/dtype.py | 3 +- pandas/tests/extension/base/getitem.py | 3 +- pandas/tests/extension/base/groupby.py | 3 +- pandas/tests/extension/base/interface.py | 3 +- pandas/tests/extension/base/io.py | 3 +- pandas/tests/extension/base/methods.py | 3 +- pandas/tests/extension/base/missing.py | 3 +- pandas/tests/extension/base/ops.py | 3 +- pandas/tests/extension/base/printing.py | 3 +- pandas/tests/extension/base/reduce.py | 3 +- pandas/tests/extension/base/reshaping.py | 3 +- pandas/tests/extension/base/setitem.py | 3 +- pandas/tests/extension/decimal/__init__.py | 2 +- .../tests/extension/decimal/test_decimal.py | 3 +- pandas/tests/extension/json/__init__.py | 2 +- pandas/tests/extension/json/test_json.py | 3 +- pandas/tests/extension/list/__init__.py | 2 +- pandas/tests/extension/list/test_list.py | 3 +- pandas/tests/extension/test_boolean.py | 3 +- pandas/tests/extension/test_categorical.py | 3 +- pandas/tests/extension/test_datetime.py | 3 +- pandas/tests/extension/test_floating.py | 3 +- pandas/tests/extension/test_integer.py | 3 +- pandas/tests/extension/test_interval.py | 3 +- pandas/tests/extension/test_numpy.py | 3 +- pandas/tests/extension/test_period.py | 3 +- pandas/tests/extension/test_sparse.py | 3 +- pandas/tests/extension/test_string.py | 3 +- pandas/tests/frame/test_arithmetic.py | 3 +- pandas/tests/generic/test_frame.py | 3 +- pandas/tests/generic/test_series.py | 3 +- pandas/tests/indexes/datetimelike.py | 3 +- .../indexes/datetimes/test_date_range.py | 2 +- pandas/tests/indexes/test_base.py | 3 +- pandas/tests/indexes/test_numeric.py | 3 +- pandas/tests/indexing/test_iloc.py | 3 +- pandas/tests/indexing/test_indexing.py | 5 +- pandas/tests/indexing/test_loc.py | 3 +- pandas/tests/indexing/test_scalar.py | 3 +- pandas/tests/io/excel/test_readers.py | 3 +- pandas/tests/io/excel/test_xlrd.py | 3 +- pandas/tests/io/pytables/test_append.py | 3 +- pandas/tests/io/pytables/test_categorical.py | 3 +- pandas/tests/io/pytables/test_compat.py | 3 +- pandas/tests/io/pytables/test_complex.py | 7 +- pandas/tests/io/pytables/test_errors.py | 9 +- .../tests/io/pytables/test_file_handling.py | 13 +- pandas/tests/io/pytables/test_keys.py | 3 +- pandas/tests/io/pytables/test_put.py | 5 +- pandas/tests/io/pytables/test_read.py | 9 +- .../io/pytables/test_retain_attributes.py | 3 +- pandas/tests/io/pytables/test_round_trip.py | 5 +- pandas/tests/io/pytables/test_select.py | 7 +- pandas/tests/io/pytables/test_store.py | 3 +- pandas/tests/io/pytables/test_subclass.py | 3 +- pandas/tests/io/pytables/test_time_series.py | 3 +- pandas/tests/io/pytables/test_timezones.py | 3 +- pandas/tests/io/test_pickle.py | 2 +- pandas/tests/plotting/test_boxplot_method.py | 7 +- pandas/tests/plotting/test_common.py | 3 +- pandas/tests/plotting/test_datetimelike.py | 3 +- pandas/tests/plotting/test_groupby.py | 3 +- pandas/tests/plotting/test_hist_method.py | 3 +- pandas/tests/plotting/test_misc.py | 7 +- pandas/tests/plotting/test_series.py | 7 +- pandas/tests/reshape/merge/test_join.py | 3 +- pandas/tests/strings/test_cat.py | 3 +- .../tseries/offsets/test_business_day.py | 11 +- .../tseries/offsets/test_business_hour.py | 3 +- .../offsets/test_custom_business_hour.py | 3 +- pandas/tests/tseries/offsets/test_dst.py | 2 +- pandas/tests/tseries/offsets/test_fiscal.py | 13 +- pandas/tests/tseries/offsets/test_month.py | 11 +- pandas/tests/tseries/offsets/test_offsets.py | 11 +- pandas/tests/tseries/offsets/test_ticks.py | 3 +- pandas/tests/tseries/offsets/test_week.py | 2 +- .../tests/tseries/offsets/test_yqm_offsets.py | 11 +- pandas/tseries/api.py | 3 +- pandas/tseries/holiday.py | 2 +- pandas/util/__init__.py | 12 +- 257 files changed, 1184 insertions(+), 1032 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d433fb08209bf..fbd2daf9204e8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -208,7 +208,8 @@ repos: hooks: - id: no-string-hints - repo: https://github.com/MarcoGorelli/abs-imports - rev: v0.1.2 + rev: c434798 hooks: - id: abs-imports files: ^pandas/ + args: [--keep-local-imports-relative] diff --git a/pandas/__init__.py b/pandas/__init__.py index cc4c99efc4345..b24dfe268c94b 100644 --- a/pandas/__init__.py +++ b/pandas/__init__.py @@ -19,14 +19,14 @@ del hard_dependencies, dependency, missing_dependencies # numpy compat -from pandas.compat import ( +from .compat import ( np_version_under1p17 as _np_version_under1p17, np_version_under1p18 as _np_version_under1p18, is_numpy_dev as _is_numpy_dev, ) try: - from pandas._libs import hashtable as _hashtable, lib as _lib, tslib as _tslib + from ._libs import hashtable as _hashtable, lib as _lib, tslib as _tslib except ImportError as e: # pragma: no cover # hack but overkill to use re module = str(e).replace("cannot import name ", "") @@ -36,7 +36,7 @@ "'python setup.py build_ext --force' to build the C extensions first." ) from e -from pandas._config import ( +from ._config import ( get_option, set_option, reset_option, @@ -48,7 +48,7 @@ # let init-time option registration happen import pandas.core.config_init -from pandas.core.api import ( +from .core.api import ( # dtype Int8Dtype, Int16Dtype, @@ -115,14 +115,14 @@ DataFrame, ) -from pandas.core.arrays.sparse import SparseDtype +from .core.arrays.sparse import SparseDtype -from pandas.tseries.api import infer_freq -from pandas.tseries import offsets +from .tseries.api import infer_freq +from .tseries import offsets -from pandas.core.computation.api import eval +from .core.computation.api import eval -from pandas.core.reshape.api import ( +from .core.reshape.api import ( concat, lreshape, melt, @@ -139,9 +139,9 @@ ) import pandas.api -from pandas.util._print_versions import show_versions +from .util._print_versions import show_versions -from pandas.io.api import ( +from .io.api import ( # excel ExcelFile, ExcelWriter, @@ -173,14 +173,14 @@ read_spss, ) -from pandas.io.json import _json_normalize as json_normalize +from .io.json import _json_normalize as json_normalize -from pandas.util._tester import test +from .util._tester import test import pandas.testing import pandas.arrays # use the closest tagged version if possible -from pandas._version import get_versions +from ._version import get_versions v = get_versions() __version__ = v.get("closest-tag", v["version"]) @@ -237,7 +237,7 @@ def __getattr__(name): FutureWarning, stacklevel=2, ) - from pandas.core.arrays.sparse import SparseArray as _SparseArray + from .core.arrays.sparse import SparseArray as _SparseArray return _SparseArray diff --git a/pandas/_config/__init__.py b/pandas/_config/__init__.py index 65936a9fcdbf3..cbafa0edae1b6 100644 --- a/pandas/_config/__init__.py +++ b/pandas/_config/__init__.py @@ -15,9 +15,9 @@ "option_context", "options", ] -from pandas._config import config -from pandas._config import dates # noqa:F401 -from pandas._config.config import ( +from . import config +from . import dates # noqa:F401 +from .config import ( describe_option, get_option, option_context, @@ -25,4 +25,4 @@ reset_option, set_option, ) -from pandas._config.display import detect_console_encoding +from .display import detect_console_encoding diff --git a/pandas/_config/dates.py b/pandas/_config/dates.py index 5bf2b49ce5904..f59cbd6339932 100644 --- a/pandas/_config/dates.py +++ b/pandas/_config/dates.py @@ -1,7 +1,7 @@ """ config for datetime formatting """ -from pandas._config import config as cf +from . import config as cf pc_date_dayfirst_doc = """ : boolean diff --git a/pandas/_config/display.py b/pandas/_config/display.py index ec819481525da..7ae66e3fc1f11 100644 --- a/pandas/_config/display.py +++ b/pandas/_config/display.py @@ -6,7 +6,7 @@ import sys from typing import Optional -from pandas._config import config as cf +from . import config as cf # ----------------------------------------------------------------------------- # Global formatting options diff --git a/pandas/_config/localization.py b/pandas/_config/localization.py index bc76aca93da2a..76b442da651ac 100644 --- a/pandas/_config/localization.py +++ b/pandas/_config/localization.py @@ -8,7 +8,7 @@ import re import subprocess -from pandas._config.config import options +from .config import options @contextmanager diff --git a/pandas/_libs/__init__.py b/pandas/_libs/__init__.py index f119e280f5867..4ea32377d1446 100644 --- a/pandas/_libs/__init__.py +++ b/pandas/_libs/__init__.py @@ -10,8 +10,8 @@ ] -from pandas._libs.interval import Interval -from pandas._libs.tslibs import ( +from .interval import Interval +from .tslibs import ( NaT, NaTType, OutOfBoundsDatetime, diff --git a/pandas/_libs/tslibs/__init__.py b/pandas/_libs/tslibs/__init__.py index e38ed9a20e55b..ddd41f48a374e 100644 --- a/pandas/_libs/tslibs/__init__.py +++ b/pandas/_libs/tslibs/__init__.py @@ -27,38 +27,38 @@ "tz_compare", ] -from pandas._libs.tslibs import dtypes -from pandas._libs.tslibs.conversion import ( +from . import dtypes +from .conversion import ( OutOfBoundsTimedelta, localize_pydatetime, ) -from pandas._libs.tslibs.dtypes import Resolution -from pandas._libs.tslibs.nattype import ( +from .dtypes import Resolution +from .nattype import ( NaT, NaTType, iNaT, is_null_datetimelike, nat_strings, ) -from pandas._libs.tslibs.np_datetime import OutOfBoundsDatetime -from pandas._libs.tslibs.offsets import ( +from .np_datetime import OutOfBoundsDatetime +from .offsets import ( BaseOffset, Tick, to_offset, ) -from pandas._libs.tslibs.period import ( +from .period import ( IncompatibleFrequency, Period, ) -from pandas._libs.tslibs.timedeltas import ( +from .timedeltas import ( Timedelta, delta_to_nanoseconds, ints_to_pytimedelta, ) -from pandas._libs.tslibs.timestamps import Timestamp -from pandas._libs.tslibs.timezones import tz_compare -from pandas._libs.tslibs.tzconversion import tz_convert_from_utc_single -from pandas._libs.tslibs.vectorized import ( +from .timestamps import Timestamp +from .timezones import tz_compare +from .tzconversion import tz_convert_from_utc_single +from .vectorized import ( dt64arr_to_periodarr, get_resolution, ints_to_pydatetime, diff --git a/pandas/_testing/__init__.py b/pandas/_testing/__init__.py index 6b88bd26627b0..80d11d59b330a 100644 --- a/pandas/_testing/__init__.py +++ b/pandas/_testing/__init__.py @@ -49,7 +49,14 @@ Series, bdate_range, ) -from pandas._testing._io import ( # noqa:F401 +from pandas.core.arrays import ( + DatetimeArray, + PeriodArray, + TimedeltaArray, + period_array, +) + +from ._io import ( # noqa:F401 close, network, round_trip_localpath, @@ -58,14 +65,14 @@ with_connectivity_check, write_to_compressed, ) -from pandas._testing._random import ( # noqa:F401 +from ._random import ( # noqa:F401 randbool, rands, rands_array, randu_array, ) -from pandas._testing._warnings import assert_produces_warning # noqa:F401 -from pandas._testing.asserters import ( # noqa:F401 +from ._warnings import assert_produces_warning # noqa:F401 +from .asserters import ( # noqa:F401 assert_almost_equal, assert_attr_equal, assert_categorical_equal, @@ -88,8 +95,8 @@ assert_timedelta_array_equal, raise_assert_detail, ) -from pandas._testing.compat import get_dtype # noqa:F401 -from pandas._testing.contexts import ( # noqa:F401 +from .compat import get_dtype # noqa:F401 +from .contexts import ( # noqa:F401 RNGContext, decompress_file, ensure_clean, @@ -99,12 +106,6 @@ use_numexpr, with_csv_dialect, ) -from pandas.core.arrays import ( - DatetimeArray, - PeriodArray, - TimedeltaArray, - period_array, -) if TYPE_CHECKING: from pandas import ( diff --git a/pandas/_testing/_io.py b/pandas/_testing/_io.py index e327f48f9a888..4cc49043b1e25 100644 --- a/pandas/_testing/_io.py +++ b/pandas/_testing/_io.py @@ -19,11 +19,12 @@ ) import pandas as pd -from pandas._testing._random import rands -from pandas._testing.contexts import ensure_clean from pandas.io.common import urlopen +from ._random import rands +from .contexts import ensure_clean + _RAISE_NETWORK_ERROR_DEFAULT = False lzma = import_lzma() diff --git a/pandas/_typing.py b/pandas/_typing.py index 074b57054c0d1..fc3c209df0200 100644 --- a/pandas/_typing.py +++ b/pandas/_typing.py @@ -38,32 +38,29 @@ if TYPE_CHECKING: from typing import final - from pandas._libs import ( + from . import Interval + from ._libs import ( Period, Timedelta, Timestamp, ) - - from pandas.core.dtypes.dtypes import ExtensionDtype - - from pandas import Interval - from pandas.core.arrays.base import ExtensionArray # noqa: F401 - from pandas.core.frame import DataFrame - from pandas.core.generic import NDFrame # noqa: F401 - from pandas.core.groupby.generic import ( + from .core.arrays.base import ExtensionArray # noqa: F401 + from .core.dtypes.dtypes import ExtensionDtype + from .core.frame import DataFrame + from .core.generic import NDFrame # noqa: F401 + from .core.groupby.generic import ( DataFrameGroupBy, SeriesGroupBy, ) - from pandas.core.indexes.base import Index - from pandas.core.internals import ( + from .core.indexes.base import Index + from .core.internals import ( ArrayManager, BlockManager, ) - from pandas.core.resample import Resampler - from pandas.core.series import Series - from pandas.core.window.rolling import BaseWindow - - from pandas.io.formats.format import EngFormatter + from .core.resample import Resampler + from .core.series import Series + from .core.window.rolling import BaseWindow + from .io.formats.format import EngFormatter else: # typing.final does not exist until py38 final = lambda x: x diff --git a/pandas/api/__init__.py b/pandas/api/__init__.py index c22f37f2ef292..9c524cabae3dd 100644 --- a/pandas/api/__init__.py +++ b/pandas/api/__init__.py @@ -1,5 +1,5 @@ """ public toolkit API """ -from pandas.api import ( # noqa +from . import ( # noqa extensions, indexers, types, diff --git a/pandas/compat/__init__.py b/pandas/compat/__init__.py index eb6cf4f9d7d85..9cb8543f9fe0f 100644 --- a/pandas/compat/__init__.py +++ b/pandas/compat/__init__.py @@ -12,7 +12,8 @@ import warnings from pandas._typing import F -from pandas.compat.numpy import ( + +from .numpy import ( is_numpy_dev, np_array_datetime64_compat, np_datetime64_compat, diff --git a/pandas/conftest.py b/pandas/conftest.py index ce572e42abec6..bb1ef6738142f 100644 --- a/pandas/conftest.py +++ b/pandas/conftest.py @@ -45,13 +45,10 @@ import pandas.util._test_decorators as td -from pandas.core.dtypes.dtypes import ( - DatetimeTZDtype, - IntervalDtype, -) - import pandas as pd -from pandas import ( +import pandas._testing as tm + +from . import ( DataFrame, Interval, Period, @@ -59,9 +56,12 @@ Timedelta, Timestamp, ) -import pandas._testing as tm -from pandas.core import ops -from pandas.core.indexes.api import ( +from .core import ops +from .core.dtypes.dtypes import ( + DatetimeTZDtype, + IntervalDtype, +) +from .core.indexes.api import ( Index, MultiIndex, ) diff --git a/pandas/core/aggregation.py b/pandas/core/aggregation.py index 744a1ffa5fea1..f3b02dfebf523 100644 --- a/pandas/core/aggregation.py +++ b/pandas/core/aggregation.py @@ -32,22 +32,22 @@ FrameOrSeriesUnion, ) -from pandas.core.dtypes.common import ( +import pandas.core.common as com + +from .algorithms import safe_sort +from .base import SpecificationError +from .dtypes.common import ( is_dict_like, is_list_like, ) -from pandas.core.dtypes.generic import ( +from .dtypes.generic import ( ABCDataFrame, ABCSeries, ) - -from pandas.core.algorithms import safe_sort -from pandas.core.base import SpecificationError -import pandas.core.common as com -from pandas.core.indexes.api import Index +from .indexes.api import Index if TYPE_CHECKING: - from pandas.core.series import Series + from .series import Series def reconstruct_func( @@ -482,7 +482,7 @@ def transform_dict_like( """ Compute transform in the case of a dict-like func """ - from pandas.core.reshape.concat import concat + from .reshape.concat import concat if len(func) == 0: raise ValueError("No transform functions were provided") diff --git a/pandas/core/algorithms.py b/pandas/core/algorithms.py index 40533cdd554b3..f82fdf8b44c76 100644 --- a/pandas/core/algorithms.py +++ b/pandas/core/algorithms.py @@ -36,12 +36,17 @@ ) from pandas.util._decorators import doc -from pandas.core.dtypes.cast import ( +from .construction import ( + array, + ensure_wrapped_if_datetimelike, + extract_array, +) +from .dtypes.cast import ( construct_1d_object_array_from_listlike, infer_dtype_from_array, maybe_promote, ) -from pandas.core.dtypes.common import ( +from .dtypes.common import ( ensure_float64, ensure_int64, ensure_object, @@ -68,8 +73,8 @@ needs_i8_conversion, pandas_dtype, ) -from pandas.core.dtypes.dtypes import PandasDtype -from pandas.core.dtypes.generic import ( +from .dtypes.dtypes import PandasDtype +from .dtypes.generic import ( ABCDatetimeArray, ABCExtensionArray, ABCIndex, @@ -78,17 +83,11 @@ ABCSeries, ABCTimedeltaArray, ) -from pandas.core.dtypes.missing import ( +from .dtypes.missing import ( isna, na_value_for_dtype, ) - -from pandas.core.construction import ( - array, - ensure_wrapped_if_datetimelike, - extract_array, -) -from pandas.core.indexers import validate_indices +from .indexers import validate_indices if TYPE_CHECKING: from pandas import ( @@ -97,7 +96,8 @@ Index, Series, ) - from pandas.core.arrays import ( + + from .arrays import ( DatetimeArray, TimedeltaArray, ) @@ -819,12 +819,12 @@ def value_counts( ------- Series """ - from pandas.core.series import Series + from .series import Series name = getattr(values, "name", None) if bins is not None: - from pandas.core.reshape.tile import cut + from .reshape.tile import cut values = Series(values) try: @@ -2247,8 +2247,8 @@ def _sort_tuples(values: np.ndarray): nans (can't use `np.sort` as it may fail when str and nan are mixed in a column as types cannot be compared). """ - from pandas.core.internals.construction import to_arrays - from pandas.core.sorting import lexsort_indexer + from .internals.construction import to_arrays + from .sorting import lexsort_indexer arrays, _ = to_arrays(values, None) indexer = lexsort_indexer(arrays, orders=True) diff --git a/pandas/core/api.py b/pandas/core/api.py index 2677530455b07..9037edee5f253 100644 --- a/pandas/core/api.py +++ b/pandas/core/api.py @@ -8,31 +8,21 @@ ) from pandas._libs.missing import NA -from pandas.core.dtypes.dtypes import ( - CategoricalDtype, - DatetimeTZDtype, - IntervalDtype, - PeriodDtype, -) -from pandas.core.dtypes.missing import ( - isna, - isnull, - notna, - notnull, -) +from pandas.io.formats.format import set_eng_float_format +from pandas.tseries.offsets import DateOffset -from pandas.core.algorithms import ( +from .algorithms import ( factorize, unique, value_counts, ) -from pandas.core.arrays import Categorical -from pandas.core.arrays.boolean import BooleanDtype -from pandas.core.arrays.floating import ( +from .arrays import Categorical +from .arrays.boolean import BooleanDtype +from .arrays.floating import ( Float32Dtype, Float64Dtype, ) -from pandas.core.arrays.integer import ( +from .arrays.integer import ( Int8Dtype, Int16Dtype, Int32Dtype, @@ -42,14 +32,26 @@ UInt32Dtype, UInt64Dtype, ) -from pandas.core.arrays.string_ import StringDtype -from pandas.core.construction import array -from pandas.core.flags import Flags -from pandas.core.groupby import ( +from .arrays.string_ import StringDtype +from .construction import array +from .dtypes.dtypes import ( + CategoricalDtype, + DatetimeTZDtype, + IntervalDtype, + PeriodDtype, +) +from .dtypes.missing import ( + isna, + isnull, + notna, + notnull, +) +from .flags import Flags +from .groupby import ( Grouper, NamedAgg, ) -from pandas.core.indexes.api import ( +from .indexes.api import ( CategoricalIndex, DatetimeIndex, Float64Index, @@ -62,24 +64,21 @@ TimedeltaIndex, UInt64Index, ) -from pandas.core.indexes.datetimes import ( +from .indexes.datetimes import ( bdate_range, date_range, ) -from pandas.core.indexes.interval import ( +from .indexes.interval import ( Interval, interval_range, ) -from pandas.core.indexes.period import period_range -from pandas.core.indexes.timedeltas import timedelta_range -from pandas.core.indexing import IndexSlice -from pandas.core.series import Series -from pandas.core.tools.datetimes import to_datetime -from pandas.core.tools.numeric import to_numeric -from pandas.core.tools.timedeltas import to_timedelta - -from pandas.io.formats.format import set_eng_float_format -from pandas.tseries.offsets import DateOffset +from .indexes.period import period_range +from .indexes.timedeltas import timedelta_range +from .indexing import IndexSlice +from .series import Series +from .tools.datetimes import to_datetime +from .tools.numeric import to_numeric +from .tools.timedeltas import to_timedelta # DataFrame needs to be imported after NamedAgg to avoid a circular import -from pandas.core.frame import DataFrame # isort:skip +from .frame import DataFrame # isort:skip diff --git a/pandas/core/apply.py b/pandas/core/apply.py index b41c432dff172..1b4583c9fcc44 100644 --- a/pandas/core/apply.py +++ b/pandas/core/apply.py @@ -30,42 +30,43 @@ ) from pandas.util._decorators import cache_readonly -from pandas.core.dtypes.cast import is_nested_object -from pandas.core.dtypes.common import ( +import pandas.core.common as com + +from .algorithms import safe_sort +from .base import ( + DataError, + SpecificationError, +) +from .construction import ( + array as pd_array, + create_series_with_explicit_dtype, +) +from .dtypes.cast import is_nested_object +from .dtypes.common import ( is_dict_like, is_extension_array_dtype, is_list_like, is_sequence, ) -from pandas.core.dtypes.generic import ( +from .dtypes.generic import ( ABCDataFrame, ABCNDFrame, ABCSeries, ) -from pandas.core.algorithms import safe_sort -from pandas.core.base import ( - DataError, - SpecificationError, -) -import pandas.core.common as com -from pandas.core.construction import ( - array as pd_array, - create_series_with_explicit_dtype, -) - if TYPE_CHECKING: from pandas import ( DataFrame, Index, Series, ) - from pandas.core.groupby import ( + + from .groupby import ( DataFrameGroupBy, SeriesGroupBy, ) - from pandas.core.resample import Resampler - from pandas.core.window.rolling import BaseWindow + from .resample import Resampler + from .window.rolling import BaseWindow ResType = Dict[int, Any] @@ -210,7 +211,7 @@ def agg_list_like(self, _axis: int) -> FrameOrSeriesUnion: ------- Result of aggregation. """ - from pandas.core.reshape.concat import concat + from .reshape.concat import concat obj = self.obj arg = cast(List[AggFuncTypeBase], self.f) @@ -355,7 +356,7 @@ def agg_dict_like(self, _axis: int) -> FrameOrSeriesUnion: ) raise SpecificationError(f"Column(s) {cols} do not exist") - from pandas.core.reshape.concat import concat + from .reshape.concat import concat if selected_obj.ndim == 1: # key only used for output diff --git a/pandas/core/arraylike.py b/pandas/core/arraylike.py index 3f45f503d0f62..4cf7a2e3065ac 100644 --- a/pandas/core/arraylike.py +++ b/pandas/core/arraylike.py @@ -15,12 +15,12 @@ from pandas._libs import lib -from pandas.core.construction import extract_array -from pandas.core.ops import ( +from .construction import extract_array +from .ops import ( maybe_dispatch_ufunc_to_dunder_op, roperator, ) -from pandas.core.ops.common import unpack_zerodim_and_defer +from .ops.common import unpack_zerodim_and_defer class OpsMixin: @@ -183,7 +183,8 @@ def _maybe_fallback(ufunc: Callable, method: str, *inputs: Any, **kwargs: Any): See https://github.com/pandas-dev/pandas/pull/39239 """ from pandas import DataFrame - from pandas.core.generic import NDFrame + + from .generic import NDFrame n_alignable = sum(isinstance(x, NDFrame) for x in inputs) n_frames = sum(isinstance(x, DataFrame) for x in inputs) @@ -242,8 +243,8 @@ def array_ufunc(self, ufunc: np.ufunc, method: str, *inputs: Any, **kwargs: Any) -------- numpy.org/doc/stable/reference/arrays.classes.html#numpy.class.__array_ufunc__ """ - from pandas.core.generic import NDFrame - from pandas.core.internals import BlockManager + from .generic import NDFrame + from .internals import BlockManager cls = type(self) diff --git a/pandas/core/arrays/__init__.py b/pandas/core/arrays/__init__.py index 22f15ca9650db..599e8ac98c6f6 100644 --- a/pandas/core/arrays/__init__.py +++ b/pandas/core/arrays/__init__.py @@ -1,23 +1,23 @@ -from pandas.core.arrays.base import ( +from .base import ( ExtensionArray, ExtensionOpsMixin, ExtensionScalarOpsMixin, ) -from pandas.core.arrays.boolean import BooleanArray -from pandas.core.arrays.categorical import Categorical -from pandas.core.arrays.datetimes import DatetimeArray -from pandas.core.arrays.floating import FloatingArray -from pandas.core.arrays.integer import IntegerArray -from pandas.core.arrays.interval import IntervalArray -from pandas.core.arrays.masked import BaseMaskedArray -from pandas.core.arrays.numpy_ import PandasArray -from pandas.core.arrays.period import ( +from .boolean import BooleanArray +from .categorical import Categorical +from .datetimes import DatetimeArray +from .floating import FloatingArray +from .integer import IntegerArray +from .interval import IntervalArray +from .masked import BaseMaskedArray +from .numpy_ import PandasArray +from .period import ( PeriodArray, period_array, ) -from pandas.core.arrays.sparse import SparseArray -from pandas.core.arrays.string_ import StringArray -from pandas.core.arrays.timedeltas import TimedeltaArray +from .sparse import SparseArray +from .string_ import StringArray +from .timedeltas import TimedeltaArray __all__ = [ "ExtensionArray", diff --git a/pandas/core/arrays/_arrow_utils.py b/pandas/core/arrays/_arrow_utils.py index 31f6896b12f98..9bf40706e1141 100644 --- a/pandas/core/arrays/_arrow_utils.py +++ b/pandas/core/arrays/_arrow_utils.py @@ -4,7 +4,7 @@ import numpy as np import pyarrow -from pandas.core.arrays.interval import VALID_CLOSED +from .interval import VALID_CLOSED _pyarrow_version_ge_015 = LooseVersion(pyarrow.__version__) >= LooseVersion("0.15") diff --git a/pandas/core/arrays/_mixins.py b/pandas/core/arrays/_mixins.py index 825757ddffee4..2a2d62073d092 100644 --- a/pandas/core/arrays/_mixins.py +++ b/pandas/core/arrays/_mixins.py @@ -33,10 +33,11 @@ value_counts, ) from pandas.core.array_algos.transforms import shift -from pandas.core.arrays.base import ExtensionArray from pandas.core.construction import extract_array from pandas.core.indexers import check_array_indexer +from .base import ExtensionArray + NDArrayBackedExtensionArrayT = TypeVar( "NDArrayBackedExtensionArrayT", bound="NDArrayBackedExtensionArray" ) diff --git a/pandas/core/arrays/base.py b/pandas/core/arrays/base.py index edc8fa14ca142..209298819ca0b 100644 --- a/pandas/core/arrays/base.py +++ b/pandas/core/arrays/base.py @@ -515,8 +515,8 @@ def astype(self, dtype, copy=True): array : ndarray NumPy ndarray with 'dtype' for its dtype. """ - from pandas.core.arrays.string_ import StringDtype - from pandas.core.arrays.string_arrow import ArrowStringDtype + from .string_ import StringDtype + from .string_arrow import ArrowStringDtype dtype = pandas_dtype(dtype) if is_dtype_equal(dtype, self.dtype): diff --git a/pandas/core/arrays/boolean.py b/pandas/core/arrays/boolean.py index 260cd08707473..52c19d1025dd2 100644 --- a/pandas/core/arrays/boolean.py +++ b/pandas/core/arrays/boolean.py @@ -39,7 +39,8 @@ from pandas.core.dtypes.missing import isna from pandas.core import ops -from pandas.core.arrays.masked import ( + +from .masked import ( BaseMaskedArray, BaseMaskedDtype, ) @@ -727,7 +728,7 @@ def _maybe_mask_result(self, result, mask, other, op_name: str): if (is_float_dtype(other) or is_float(other)) or ( op_name in ["rtruediv", "truediv"] ): - from pandas.core.arrays import FloatingArray + from . import FloatingArray return FloatingArray(result, mask, copy=False) @@ -735,7 +736,7 @@ def _maybe_mask_result(self, result, mask, other, op_name: str): return BooleanArray(result, mask, copy=False) elif is_integer_dtype(result): - from pandas.core.arrays import IntegerArray + from . import IntegerArray return IntegerArray(result, mask, copy=False) else: diff --git a/pandas/core/arrays/categorical.py b/pandas/core/arrays/categorical.py index 916d4f9f2fd28..66ecd7940c68a 100644 --- a/pandas/core/arrays/categorical.py +++ b/pandas/core/arrays/categorical.py @@ -91,7 +91,6 @@ take_nd, unique1d, ) -from pandas.core.arrays._mixins import NDArrayBackedExtensionArray from pandas.core.base import ( ExtensionArray, NoNewAttributesMixin, @@ -111,6 +110,8 @@ from pandas.io.formats import console +from ._mixins import NDArrayBackedExtensionArray + if TYPE_CHECKING: from pandas import Index @@ -2391,7 +2392,7 @@ def _str_map(self, f, na_value=np.nan, dtype=np.dtype(object)): # Optimization to apply the callable `f` to the categories once # and rebuild the result by `take`ing from the result with the codes. # Returns the same type as the object-dtype implementation though. - from pandas.core.arrays import PandasArray + from . import PandasArray categories = self.categories codes = self.codes @@ -2400,7 +2401,7 @@ def _str_map(self, f, na_value=np.nan, dtype=np.dtype(object)): def _str_get_dummies(self, sep="|"): # sep may not be in categories. Just bail on this. - from pandas.core.arrays import PandasArray + from . import PandasArray return PandasArray(self.astype(str))._str_get_dummies(sep) diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index 5dd55ff0f1fa2..ee4430bccfff7 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -94,10 +94,6 @@ unique1d, ) from pandas.core.arraylike import OpsMixin -from pandas.core.arrays._mixins import ( - NDArrayBackedExtensionArray, - ravel_compat, -) import pandas.core.common as com from pandas.core.construction import ( array, @@ -115,8 +111,13 @@ from pandas.tseries import frequencies +from ._mixins import ( + NDArrayBackedExtensionArray, + ravel_compat, +) + if TYPE_CHECKING: - from pandas.core.arrays import ( + from . import ( DatetimeArray, TimedeltaArray, ) @@ -1086,7 +1087,7 @@ def _add_timedelta_arraylike(self, other): if isinstance(other, np.ndarray): # ndarray[timedelta64]; wrap in TimedeltaIndex for op - from pandas.core.arrays import TimedeltaArray + from . import TimedeltaArray other = TimedeltaArray._from_sequence(other) @@ -1250,7 +1251,7 @@ def __add__(self, other): return NotImplemented if isinstance(result, np.ndarray) and is_timedelta64_dtype(result.dtype): - from pandas.core.arrays import TimedeltaArray + from . import TimedeltaArray return TimedeltaArray(result) return result @@ -1306,7 +1307,7 @@ def __sub__(self, other): return NotImplemented if isinstance(result, np.ndarray) and is_timedelta64_dtype(result.dtype): - from pandas.core.arrays import TimedeltaArray + from . import TimedeltaArray return TimedeltaArray(result) return result @@ -1322,7 +1323,7 @@ def __rsub__(self, other): return Timestamp(other) - self if not isinstance(other, DatetimeLikeArrayMixin): # Avoid down-casting DatetimeIndex - from pandas.core.arrays import DatetimeArray + from . import DatetimeArray other = DatetimeArray(other) return other - self diff --git a/pandas/core/arrays/datetimes.py b/pandas/core/arrays/datetimes.py index 05184ea02e7a2..f0ad8189faf68 100644 --- a/pandas/core/arrays/datetimes.py +++ b/pandas/core/arrays/datetimes.py @@ -67,8 +67,6 @@ from pandas.core.dtypes.missing import isna from pandas.core.algorithms import checked_add_with_arr -from pandas.core.arrays import datetimelike as dtl -from pandas.core.arrays._ranges import generate_regular_range import pandas.core.common as com from pandas.tseries.frequencies import get_period_alias @@ -78,6 +76,9 @@ Tick, ) +from . import datetimelike as dtl +from ._ranges import generate_regular_range + _midnight = time(0, 0) @@ -1109,7 +1110,7 @@ def to_period(self, freq=None): PeriodIndex(['2017-01-01', '2017-01-02'], dtype='period[D]', freq='D') """ - from pandas.core.arrays import PeriodArray + from . import PeriodArray if self.tz is not None: warnings.warn( @@ -1158,7 +1159,7 @@ def to_perioddelta(self, freq): FutureWarning, stacklevel=3, ) - from pandas.core.arrays.timedeltas import TimedeltaArray + from .timedeltas import TimedeltaArray i8delta = self.asi8 - self.to_period(freq).to_timestamp().asi8 m8delta = i8delta.view("m8[ns]") @@ -1890,7 +1891,7 @@ def std( # Because std is translation-invariant, we can get self.std # by calculating (self - Timestamp(0)).std, and we can do it # without creating a copy by using a view on self._ndarray - from pandas.core.arrays import TimedeltaArray + from . import TimedeltaArray tda = TimedeltaArray(self._ndarray.view("i8")) return tda.std( diff --git a/pandas/core/arrays/floating.py b/pandas/core/arrays/floating.py index a43b30f5043e2..152643769d25d 100644 --- a/pandas/core/arrays/floating.py +++ b/pandas/core/arrays/floating.py @@ -37,12 +37,13 @@ ) from pandas.core.dtypes.missing import isna -from pandas.core.arrays.numeric import ( +from pandas.core.ops import invalid_comparison +from pandas.core.tools.numeric import to_numeric + +from .numeric import ( NumericArray, NumericDtype, ) -from pandas.core.ops import invalid_comparison -from pandas.core.tools.numeric import to_numeric class FloatingDtype(NumericDtype): diff --git a/pandas/core/arrays/integer.py b/pandas/core/arrays/integer.py index d62a05253b265..f0004147251f6 100644 --- a/pandas/core/arrays/integer.py +++ b/pandas/core/arrays/integer.py @@ -40,16 +40,17 @@ ) from pandas.core.dtypes.missing import isna -from pandas.core.arrays.masked import ( +from pandas.core.ops import invalid_comparison +from pandas.core.tools.numeric import to_numeric + +from .masked import ( BaseMaskedArray, BaseMaskedDtype, ) -from pandas.core.arrays.numeric import ( +from .numeric import ( NumericArray, NumericDtype, ) -from pandas.core.ops import invalid_comparison -from pandas.core.tools.numeric import to_numeric class _IntegerDtype(NumericDtype): @@ -106,7 +107,7 @@ def _get_common_dtype(self, dtypes: List[DtypeObj]) -> Optional[DtypeObj]: if np.issubdtype(np_dtype, np.integer): return INT_STR_TO_DTYPE[str(np_dtype)] elif np.issubdtype(np_dtype, np.floating): - from pandas.core.arrays.floating import FLOAT_STR_TO_DTYPE + from .floating import FLOAT_STR_TO_DTYPE return FLOAT_STR_TO_DTYPE[str(np_dtype)] return None @@ -401,7 +402,7 @@ def _values_for_argsort(self) -> np.ndarray: return data def _cmp_method(self, other, op): - from pandas.core.arrays import BooleanArray + from . import BooleanArray mask = None @@ -476,12 +477,12 @@ def _maybe_mask_result(self, result, mask, other, op_name: str): if (is_float_dtype(other) or is_float(other)) or ( op_name in ["rtruediv", "truediv"] ): - from pandas.core.arrays import FloatingArray + from . import FloatingArray return FloatingArray(result, mask, copy=False) if result.dtype == "timedelta64[ns]": - from pandas.core.arrays import TimedeltaArray + from . import TimedeltaArray result[mask] = iNaT return TimedeltaArray._simple_new(result) diff --git a/pandas/core/arrays/interval.py b/pandas/core/arrays/interval.py index 6cfc0e1853b74..870f8acdab002 100644 --- a/pandas/core/arrays/interval.py +++ b/pandas/core/arrays/interval.py @@ -69,11 +69,6 @@ take, value_counts, ) -from pandas.core.arrays.base import ( - ExtensionArray, - _extension_array_shared_docs, -) -from pandas.core.arrays.categorical import Categorical import pandas.core.common as com from pandas.core.construction import ( array, @@ -87,6 +82,12 @@ unpack_zerodim_and_defer, ) +from .base import ( + ExtensionArray, + _extension_array_shared_docs, +) +from .categorical import Categorical + IntervalArrayT = TypeVar("IntervalArrayT", bound="IntervalArray") _interval_shared_docs = {} @@ -808,7 +809,8 @@ def astype(self, dtype, copy=True): ExtensionArray or NumPy ndarray with 'dtype' for its dtype. """ from pandas import Index - from pandas.core.arrays.string_ import StringDtype + + from .string_ import StringDtype if dtype is not None: dtype = pandas_dtype(dtype) @@ -1370,7 +1372,7 @@ def __arrow_array__(self, type=None): """ import pyarrow - from pandas.core.arrays._arrow_utils import ArrowIntervalType + from ._arrow_utils import ArrowIntervalType try: subtype = pyarrow.from_numpy_dtype(self.dtype.subtype) diff --git a/pandas/core/arrays/masked.py b/pandas/core/arrays/masked.py index bae14f4e560c2..2580005a11642 100644 --- a/pandas/core/arrays/masked.py +++ b/pandas/core/arrays/masked.py @@ -51,12 +51,14 @@ ) from pandas.core.array_algos import masked_reductions from pandas.core.arraylike import OpsMixin -from pandas.core.arrays import ExtensionArray from pandas.core.indexers import check_array_indexer +from . import ExtensionArray + if TYPE_CHECKING: from pandas import Series - from pandas.core.arrays import BooleanArray + + from . import BooleanArray BaseMaskedArrayT = TypeVar("BaseMaskedArrayT", bound="BaseMaskedArray") @@ -358,7 +360,7 @@ def take( def isin(self, values) -> BooleanArray: - from pandas.core.arrays import BooleanArray + from . import BooleanArray result = isin(self._data, values) if self._hasna: diff --git a/pandas/core/arrays/numeric.py b/pandas/core/arrays/numeric.py index 57017e44a66e9..73a3e4841af70 100644 --- a/pandas/core/arrays/numeric.py +++ b/pandas/core/arrays/numeric.py @@ -26,7 +26,8 @@ ) from pandas.core import ops -from pandas.core.arrays.masked import ( + +from .masked import ( BaseMaskedArray, BaseMaskedDtype, ) @@ -44,7 +45,7 @@ def __from_arrow__( """ import pyarrow - from pandas.core.arrays._arrow_utils import pyarrow_array_to_numpy_and_mask + from ._arrow_utils import pyarrow_array_to_numpy_and_mask array_class = self.construct_array_type() @@ -181,12 +182,12 @@ def reconstruct(x): # raise for reduce up above. if is_integer_dtype(x.dtype): - from pandas.core.arrays import IntegerArray + from . import IntegerArray m = mask.copy() return IntegerArray(x, m) elif is_float_dtype(x.dtype): - from pandas.core.arrays import FloatingArray + from . import FloatingArray m = mask.copy() return FloatingArray(x, m) diff --git a/pandas/core/arrays/numpy_.py b/pandas/core/arrays/numpy_.py index fd95ab987b18a..e03fdc50d4f56 100644 --- a/pandas/core/arrays/numpy_.py +++ b/pandas/core/arrays/numpy_.py @@ -27,9 +27,10 @@ ops, ) from pandas.core.arraylike import OpsMixin -from pandas.core.arrays._mixins import NDArrayBackedExtensionArray from pandas.core.strings.object_array import ObjectStringArrayMixin +from ._mixins import NDArrayBackedExtensionArray + class PandasArray( OpsMixin, @@ -390,7 +391,7 @@ def _wrap_ndarray_result(self, result: np.ndarray): # If we have timedelta64[ns] result, return a TimedeltaArray instead # of a PandasArray if result.dtype == "timedelta64[ns]": - from pandas.core.arrays import TimedeltaArray + from . import TimedeltaArray return TimedeltaArray._simple_new(result) return type(self)(result) diff --git a/pandas/core/arrays/period.py b/pandas/core/arrays/period.py index 109be2c67bb1a..c5008b10e37c5 100644 --- a/pandas/core/arrays/period.py +++ b/pandas/core/arrays/period.py @@ -73,9 +73,10 @@ ) import pandas.core.algorithms as algos -from pandas.core.arrays import datetimelike as dtl import pandas.core.common as com +from . import datetimelike as dtl + _shared_doc_kwargs = { "klass": "PeriodArray", } @@ -343,7 +344,7 @@ def __arrow_array__(self, type=None): """ import pyarrow - from pandas.core.arrays._arrow_utils import ArrowPeriodType + from ._arrow_utils import ArrowPeriodType if type is not None: if pyarrow.types.is_integer(type): @@ -462,7 +463,7 @@ def to_timestamp(self, freq=None, how="start"): ------- DatetimeArray/Index """ - from pandas.core.arrays import DatetimeArray + from . import DatetimeArray how = libperiod.validate_end_alias(how) diff --git a/pandas/core/arrays/sparse/__init__.py b/pandas/core/arrays/sparse/__init__.py index 18294ead0329d..b11af8f6fbb6b 100644 --- a/pandas/core/arrays/sparse/__init__.py +++ b/pandas/core/arrays/sparse/__init__.py @@ -1,13 +1,13 @@ # flake8: noqa: F401 -from pandas.core.arrays.sparse.accessor import ( +from .accessor import ( SparseAccessor, SparseFrameAccessor, ) -from pandas.core.arrays.sparse.array import ( +from .array import ( BlockIndex, IntIndex, SparseArray, make_sparse_index, ) -from pandas.core.arrays.sparse.dtype import SparseDtype +from .dtype import SparseDtype diff --git a/pandas/core/arrays/sparse/accessor.py b/pandas/core/arrays/sparse/accessor.py index c3d11793dbd8c..73f190dda45e6 100644 --- a/pandas/core/arrays/sparse/accessor.py +++ b/pandas/core/arrays/sparse/accessor.py @@ -10,8 +10,9 @@ PandasDelegate, delegate_names, ) -from pandas.core.arrays.sparse.array import SparseArray -from pandas.core.arrays.sparse.dtype import SparseDtype + +from .array import SparseArray +from .dtype import SparseDtype class BaseAccessor: @@ -91,7 +92,8 @@ def from_coo(cls, A, dense_index=False): dtype: Sparse[float64, nan] """ from pandas import Series - from pandas.core.arrays.sparse.scipy_sparse import coo_to_sparse_series + + from .scipy_sparse import coo_to_sparse_series result = coo_to_sparse_series(A, dense_index=dense_index) result = Series(result.array, index=result.index, copy=False) @@ -171,7 +173,7 @@ def to_coo(self, row_levels=(0,), column_levels=(1,), sort_labels=False): >>> columns [('a', 0), ('a', 1), ('b', 0), ('b', 1)] """ - from pandas.core.arrays.sparse.scipy_sparse import sparse_series_to_coo + from .scipy_sparse import sparse_series_to_coo A, rows, columns = sparse_series_to_coo( self._parent, row_levels, column_levels, sort_labels=sort_labels diff --git a/pandas/core/arrays/sparse/array.py b/pandas/core/arrays/sparse/array.py index a209037f9a9a6..619ec29ace892 100644 --- a/pandas/core/arrays/sparse/array.py +++ b/pandas/core/arrays/sparse/array.py @@ -66,7 +66,6 @@ import pandas.core.algorithms as algos from pandas.core.arraylike import OpsMixin from pandas.core.arrays import ExtensionArray -from pandas.core.arrays.sparse.dtype import SparseDtype from pandas.core.base import PandasObject import pandas.core.common as com from pandas.core.construction import ( @@ -80,6 +79,8 @@ import pandas.io.formats.printing as printing +from .dtype import SparseDtype + # ---------------------------------------------------------------------------- # Array diff --git a/pandas/core/arrays/sparse/dtype.py b/pandas/core/arrays/sparse/dtype.py index 948edcbd99e64..06e669a1ef338 100644 --- a/pandas/core/arrays/sparse/dtype.py +++ b/pandas/core/arrays/sparse/dtype.py @@ -39,7 +39,7 @@ ) if TYPE_CHECKING: - from pandas.core.arrays.sparse.array import SparseArray + from .array import SparseArray @register_extension_dtype @@ -197,7 +197,7 @@ def construct_array_type(cls) -> Type[SparseArray]: ------- type """ - from pandas.core.arrays.sparse.array import SparseArray + from .array import SparseArray return SparseArray diff --git a/pandas/core/arrays/string_.py b/pandas/core/arrays/string_.py index 6fd68050bc8dc..b78f70318705f 100644 --- a/pandas/core/arrays/string_.py +++ b/pandas/core/arrays/string_.py @@ -35,16 +35,17 @@ from pandas.core import ops from pandas.core.array_algos import masked_reductions -from pandas.core.arrays import ( +from pandas.core.construction import extract_array +from pandas.core.indexers import check_array_indexer +from pandas.core.missing import isna + +from . import ( FloatingArray, IntegerArray, PandasArray, ) -from pandas.core.arrays.floating import FloatingDtype -from pandas.core.arrays.integer import _IntegerDtype -from pandas.core.construction import extract_array -from pandas.core.indexers import check_array_indexer -from pandas.core.missing import isna +from .floating import FloatingDtype +from .integer import _IntegerDtype if TYPE_CHECKING: import pyarrow @@ -229,7 +230,7 @@ def _from_sequence(cls, scalars, *, dtype: Optional[Dtype] = None, copy=False): if dtype: assert dtype == "string" - from pandas.core.arrays.masked import BaseMaskedArray + from .masked import BaseMaskedArray if isinstance(scalars, BaseMaskedArray): # avoid costly conversion to object dtype @@ -408,7 +409,8 @@ def _str_map(self, f, na_value=None, dtype: Optional[Dtype] = None): IntegerArray, StringArray, ) - from pandas.core.arrays.string_ import StringDtype + + from .string_ import StringDtype if dtype is None: dtype = StringDtype() diff --git a/pandas/core/arrays/string_arrow.py b/pandas/core/arrays/string_arrow.py index e2b0ad372bf88..0a2be48f4dc8a 100644 --- a/pandas/core/arrays/string_arrow.py +++ b/pandas/core/arrays/string_arrow.py @@ -34,13 +34,14 @@ is_scalar, ) from pandas.core.arraylike import OpsMixin -from pandas.core.arrays.base import ExtensionArray from pandas.core.indexers import ( check_array_indexer, validate_indices, ) from pandas.core.missing import get_fill_func +from .base import ExtensionArray + try: import pyarrow as pa except ImportError: diff --git a/pandas/core/arrays/timedeltas.py b/pandas/core/arrays/timedeltas.py index 893644be23a0e..b4b5de3945854 100644 --- a/pandas/core/arrays/timedeltas.py +++ b/pandas/core/arrays/timedeltas.py @@ -57,15 +57,16 @@ from pandas.core import nanops from pandas.core.algorithms import checked_add_with_arr -from pandas.core.arrays import ( - IntegerArray, - datetimelike as dtl, -) -from pandas.core.arrays._ranges import generate_regular_range import pandas.core.common as com from pandas.core.construction import extract_array from pandas.core.ops.common import unpack_zerodim_and_defer +from . import ( + IntegerArray, + datetimelike as dtl, +) +from ._ranges import generate_regular_range + def _field_accessor(name: str, alias: str, docstring: str): def f(self) -> np.ndarray: @@ -432,7 +433,7 @@ def _add_period(self, other: Period): Add a Period object. """ # We will wrap in a PeriodArray and defer to the reversed operation - from pandas.core.arrays.period import PeriodArray + from .period import PeriodArray i8vals = np.broadcast_to(other.ordinal, self.shape) oth = PeriodArray(i8vals, freq=other.freq) @@ -444,7 +445,7 @@ def _add_datetime_arraylike(self, other): """ if isinstance(other, np.ndarray): # At this point we have already checked that dtype is datetime64 - from pandas.core.arrays import DatetimeArray + from . import DatetimeArray other = DatetimeArray(other) @@ -453,7 +454,7 @@ def _add_datetime_arraylike(self, other): def _add_datetimelike_scalar(self, other): # adding a timedeltaindex to a datetimelike - from pandas.core.arrays import DatetimeArray + from . import DatetimeArray assert other is not NaT other = Timestamp(other) diff --git a/pandas/core/base.py b/pandas/core/base.py index fd40e0467720d..1f22816fde22e 100644 --- a/pandas/core/base.py +++ b/pandas/core/base.py @@ -32,35 +32,35 @@ doc, ) -from pandas.core.dtypes.common import ( +import pandas.core.nanops as nanops + +from . import algorithms +from .accessor import DirNamesMixin +from .algorithms import ( + duplicated, + unique1d, + value_counts, +) +from .arraylike import OpsMixin +from .arrays import ExtensionArray +from .construction import create_series_with_explicit_dtype +from .dtypes.common import ( is_categorical_dtype, is_dict_like, is_extension_array_dtype, is_object_dtype, is_scalar, ) -from pandas.core.dtypes.generic import ( +from .dtypes.generic import ( ABCDataFrame, ABCIndex, ABCSeries, ) -from pandas.core.dtypes.missing import ( +from .dtypes.missing import ( isna, remove_na_arraylike, ) -from pandas.core import algorithms -from pandas.core.accessor import DirNamesMixin -from pandas.core.algorithms import ( - duplicated, - unique1d, - value_counts, -) -from pandas.core.arraylike import OpsMixin -from pandas.core.arrays import ExtensionArray -from pandas.core.construction import create_series_with_explicit_dtype -import pandas.core.nanops as nanops - if TYPE_CHECKING: from pandas import Categorical diff --git a/pandas/core/common.py b/pandas/core/common.py index 50aed70bf275d..3b7f441e25240 100644 --- a/pandas/core/common.py +++ b/pandas/core/common.py @@ -36,20 +36,20 @@ ) from pandas.compat import np_version_under1p18 -from pandas.core.dtypes.cast import construct_1d_object_array_from_listlike -from pandas.core.dtypes.common import ( +from .dtypes.cast import construct_1d_object_array_from_listlike +from .dtypes.common import ( is_array_like, is_bool_dtype, is_extension_array_dtype, is_integer, ) -from pandas.core.dtypes.generic import ( +from .dtypes.generic import ( ABCExtensionArray, ABCIndex, ABCSeries, ) -from pandas.core.dtypes.inference import iterable_not_string -from pandas.core.dtypes.missing import ( # noqa +from .dtypes.inference import iterable_not_string +from .dtypes.missing import ( # noqa isna, isnull, notnull, diff --git a/pandas/core/computation/align.py b/pandas/core/computation/align.py index 94724d559e501..39e40714559e0 100644 --- a/pandas/core/computation/align.py +++ b/pandas/core/computation/align.py @@ -30,7 +30,8 @@ from pandas.core.base import PandasObject import pandas.core.common as com -from pandas.core.computation.common import result_type_many + +from .common import result_type_many if TYPE_CHECKING: from pandas.core.indexes.api import Index diff --git a/pandas/core/computation/api.py b/pandas/core/computation/api.py index 31e8a4873b0ad..8234dc7bd782b 100644 --- a/pandas/core/computation/api.py +++ b/pandas/core/computation/api.py @@ -1,3 +1,3 @@ # flake8: noqa -from pandas.core.computation.eval import eval +from .eval import eval diff --git a/pandas/core/computation/engines.py b/pandas/core/computation/engines.py index 5b2dbed7af6ea..c1b6ae6e801b0 100644 --- a/pandas/core/computation/engines.py +++ b/pandas/core/computation/engines.py @@ -8,17 +8,17 @@ Type, ) -from pandas.core.computation.align import ( +import pandas.io.formats.printing as printing + +from .align import ( align_terms, reconstruct_object, ) -from pandas.core.computation.ops import ( +from .ops import ( MATHOPS, REDUCTIONS, ) -import pandas.io.formats.printing as printing - _ne_builtins = frozenset(MATHOPS + REDUCTIONS) diff --git a/pandas/core/computation/eval.py b/pandas/core/computation/eval.py index 51fcbb02fd926..f1fa1c020f794 100644 --- a/pandas/core/computation/eval.py +++ b/pandas/core/computation/eval.py @@ -9,15 +9,15 @@ from pandas._libs.lib import no_default from pandas.util._validators import validate_bool_kwarg -from pandas.core.computation.engines import ENGINES -from pandas.core.computation.expr import ( +from pandas.io.formats.printing import pprint_thing + +from .engines import ENGINES +from .expr import ( PARSERS, Expr, ) -from pandas.core.computation.parsing import tokenize_string -from pandas.core.computation.scope import ensure_scope - -from pandas.io.formats.printing import pprint_thing +from .parsing import tokenize_string +from .scope import ensure_scope def _check_engine(engine: Optional[str]) -> str: @@ -41,7 +41,7 @@ def _check_engine(engine: Optional[str]) -> str: str Engine name. """ - from pandas.core.computation.check import NUMEXPR_INSTALLED + from .check import NUMEXPR_INSTALLED if engine is None: engine = "numexpr" if NUMEXPR_INSTALLED else "python" diff --git a/pandas/core/computation/expr.py b/pandas/core/computation/expr.py index 02660539f4981..097556b2d4475 100644 --- a/pandas/core/computation/expr.py +++ b/pandas/core/computation/expr.py @@ -23,7 +23,10 @@ from pandas.compat import PY39 import pandas.core.common as com -from pandas.core.computation.ops import ( + +import pandas.io.formats.printing as printing + +from .ops import ( ARITH_OPS_SYMS, BOOL_OPS_SYMS, CMP_OPS_SYMS, @@ -41,13 +44,11 @@ UndefinedVariableError, is_term, ) -from pandas.core.computation.parsing import ( +from .parsing import ( clean_backtick_quoted_toks, tokenize_string, ) -from pandas.core.computation.scope import Scope - -import pandas.io.formats.printing as printing +from .scope import Scope def _rewrite_assign(tok: Tuple[int, str]) -> Tuple[int, str]: diff --git a/pandas/core/computation/expressions.py b/pandas/core/computation/expressions.py index 05736578b6337..2d2a920e829b3 100644 --- a/pandas/core/computation/expressions.py +++ b/pandas/core/computation/expressions.py @@ -21,9 +21,10 @@ from pandas.core.dtypes.generic import ABCDataFrame -from pandas.core.computation.check import NUMEXPR_INSTALLED from pandas.core.ops import roperator +from .check import NUMEXPR_INSTALLED + if NUMEXPR_INSTALLED: import numexpr as ne diff --git a/pandas/core/computation/ops.py b/pandas/core/computation/ops.py index 2f7623060e7dc..d0d73eb780f64 100644 --- a/pandas/core/computation/ops.py +++ b/pandas/core/computation/ops.py @@ -25,17 +25,18 @@ ) import pandas.core.common as com -from pandas.core.computation.common import ( - ensure_decoded, - result_type_many, -) -from pandas.core.computation.scope import DEFAULT_GLOBALS from pandas.io.formats.printing import ( pprint_thing, pprint_thing_encoded, ) +from .common import ( + ensure_decoded, + result_type_many, +) +from .scope import DEFAULT_GLOBALS + REDUCTIONS = ("sum", "prod") _unary_math_ops = ( @@ -457,7 +458,7 @@ def evaluate(self, env, engine: str, parser, term_type, eval_in_python): if self.op in eval_in_python: res = self.func(left.value, right.value) else: - from pandas.core.computation.eval import eval + from .eval import eval res = eval(self, local_dict=env, engine=engine, parser=parser) @@ -618,7 +619,7 @@ def __repr__(self) -> str: class FuncNode: def __init__(self, name: str): - from pandas.core.computation.check import ( + from .check import ( NUMEXPR_INSTALLED, NUMEXPR_VERSION, ) diff --git a/pandas/core/computation/pytables.py b/pandas/core/computation/pytables.py index 5e7fdb8dc9c7d..d7823cc136199 100644 --- a/pandas/core/computation/pytables.py +++ b/pandas/core/computation/pytables.py @@ -21,17 +21,6 @@ from pandas.core.dtypes.common import is_list_like import pandas.core.common as com -from pandas.core.computation import ( - expr, - ops, - scope as _scope, -) -from pandas.core.computation.common import ensure_decoded -from pandas.core.computation.expr import BaseExprVisitor -from pandas.core.computation.ops import ( - UndefinedVariableError, - is_term, -) from pandas.core.construction import extract_array from pandas.core.indexes.base import Index @@ -40,6 +29,18 @@ pprint_thing_encoded, ) +from . import ( + expr, + ops, + scope as _scope, +) +from .common import ensure_decoded +from .expr import BaseExprVisitor +from .ops import ( + UndefinedVariableError, + is_term, +) + class PyTablesScope(_scope.Scope): __slots__ = ("queryables",) diff --git a/pandas/core/computation/scope.py b/pandas/core/computation/scope.py index 71d725051977f..4e0be018e5a83 100644 --- a/pandas/core/computation/scope.py +++ b/pandas/core/computation/scope.py @@ -209,7 +209,7 @@ def resolve(self, key: str, is_local: bool): return self.temps[key] except KeyError as err: # runtime import because ops imports from scope - from pandas.core.computation.ops import UndefinedVariableError + from .ops import UndefinedVariableError raise UndefinedVariableError(key, is_local) from err diff --git a/pandas/core/config_init.py b/pandas/core/config_init.py index 56ef1ea28ed1b..9e862e2cf1c3d 100644 --- a/pandas/core/config_init.py +++ b/pandas/core/config_init.py @@ -33,7 +33,7 @@ def use_bottleneck_cb(key): - from pandas.core import nanops + from . import nanops nanops.set_use_bottleneck(cf.get_option(key)) @@ -47,7 +47,7 @@ def use_bottleneck_cb(key): def use_numexpr_cb(key): - from pandas.core.computation import expressions + from .computation import expressions expressions.set_use_numexpr(cf.get_option(key)) @@ -61,7 +61,7 @@ def use_numexpr_cb(key): def use_numba_cb(key): - from pandas.core.util import numba_ + from .util import numba_ numba_.set_use_numba(cf.get_option(key)) @@ -473,7 +473,7 @@ def _deprecate_negative_int_max_colwidth(key): def use_inf_as_na_cb(key): - from pandas.core.dtypes.missing import _use_inf_as_na + from .dtypes.missing import _use_inf_as_na _use_inf_as_na(key) diff --git a/pandas/core/construction.py b/pandas/core/construction.py index dd75473da6d78..f6c9a5c84a779 100644 --- a/pandas/core/construction.py +++ b/pandas/core/construction.py @@ -31,11 +31,13 @@ DtypeObj, ) -from pandas.core.dtypes.base import ( +import pandas.core.common as com + +from .dtypes.base import ( ExtensionDtype, registry, ) -from pandas.core.dtypes.cast import ( +from .dtypes.cast import ( construct_1d_arraylike_from_scalar, construct_1d_ndarray_preserving_na, construct_1d_object_array_from_listlike, @@ -45,7 +47,7 @@ maybe_convert_platform, maybe_upcast, ) -from pandas.core.dtypes.common import ( +from .dtypes.common import ( is_datetime64_ns_dtype, is_extension_array_dtype, is_float_dtype, @@ -56,15 +58,13 @@ is_string_dtype, is_timedelta64_ns_dtype, ) -from pandas.core.dtypes.generic import ( +from .dtypes.generic import ( ABCExtensionArray, ABCIndex, ABCPandasArray, ABCSeries, ) -from pandas.core.dtypes.missing import isna - -import pandas.core.common as com +from .dtypes.missing import isna if TYPE_CHECKING: from pandas import ( @@ -286,7 +286,7 @@ def array( ... ValueError: Cannot pass scalar '1' to 'pandas.array'. """ - from pandas.core.arrays import ( + from .arrays import ( BooleanArray, DatetimeArray, FloatingArray, @@ -425,12 +425,12 @@ def ensure_wrapped_if_datetimelike(arr): """ if isinstance(arr, np.ndarray): if arr.dtype.kind == "M": - from pandas.core.arrays import DatetimeArray + from .arrays import DatetimeArray return DatetimeArray._from_sequence(arr) elif arr.dtype.kind == "m": - from pandas.core.arrays import TimedeltaArray + from .arrays import TimedeltaArray return TimedeltaArray._from_sequence(arr) @@ -706,7 +706,7 @@ def create_series_with_explicit_dtype( ------- Series """ - from pandas.core.series import Series + from .series import Series if is_empty_data(data) and dtype is None: dtype = dtype_if_empty diff --git a/pandas/core/describe.py b/pandas/core/describe.py index 3a872c6202e04..03c5c424696e8 100644 --- a/pandas/core/describe.py +++ b/pandas/core/describe.py @@ -30,16 +30,15 @@ ) from pandas.util._validators import validate_percentile -from pandas.core.dtypes.common import ( +from pandas.io.formats.format import format_percentiles + +from .dtypes.common import ( is_bool_dtype, is_datetime64_any_dtype, is_numeric_dtype, is_timedelta64_dtype, ) - -from pandas.core.reshape.concat import concat - -from pandas.io.formats.format import format_percentiles +from .reshape.concat import concat if TYPE_CHECKING: from pandas import ( diff --git a/pandas/core/dtypes/api.py b/pandas/core/dtypes/api.py index 051affd0af1f9..cb0912cbcf880 100644 --- a/pandas/core/dtypes/api.py +++ b/pandas/core/dtypes/api.py @@ -1,6 +1,6 @@ # flake8: noqa -from pandas.core.dtypes.common import ( +from .common import ( is_array_like, is_bool, is_bool_dtype, diff --git a/pandas/core/dtypes/base.py b/pandas/core/dtypes/base.py index d83405803753a..d86f2a6405032 100644 --- a/pandas/core/dtypes/base.py +++ b/pandas/core/dtypes/base.py @@ -19,7 +19,7 @@ from pandas._typing import DtypeObj from pandas.errors import AbstractMethodError -from pandas.core.dtypes.generic import ( +from .generic import ( ABCDataFrame, ABCIndex, ABCSeries, diff --git a/pandas/core/dtypes/cast.py b/pandas/core/dtypes/cast.py index 669bfe08d42b0..e53d02c9322a1 100644 --- a/pandas/core/dtypes/cast.py +++ b/pandas/core/dtypes/cast.py @@ -53,7 +53,7 @@ from pandas.util._exceptions import find_stack_level from pandas.util._validators import validate_bool_kwarg -from pandas.core.dtypes.common import ( +from .common import ( DT64NS_DTYPE, POSSIBLY_CAST_DTYPES, TD64NS_DTYPE, @@ -87,20 +87,20 @@ is_timedelta64_ns_dtype, is_unsigned_integer_dtype, ) -from pandas.core.dtypes.dtypes import ( +from .dtypes import ( DatetimeTZDtype, ExtensionDtype, IntervalDtype, PeriodDtype, ) -from pandas.core.dtypes.generic import ( +from .generic import ( ABCDataFrame, ABCExtensionArray, ABCIndex, ABCSeries, ) -from pandas.core.dtypes.inference import is_list_like -from pandas.core.dtypes.missing import ( +from .inference import is_list_like +from .missing import ( is_valid_na_for_dtype, isna, na_value_for_dtype, diff --git a/pandas/core/dtypes/common.py b/pandas/core/dtypes/common.py index 0966d0b93cc25..cb3885a3b6952 100644 --- a/pandas/core/dtypes/common.py +++ b/pandas/core/dtypes/common.py @@ -23,19 +23,19 @@ Optional, ) -from pandas.core.dtypes.base import registry -from pandas.core.dtypes.dtypes import ( +from .base import registry +from .dtypes import ( CategoricalDtype, DatetimeTZDtype, ExtensionDtype, IntervalDtype, PeriodDtype, ) -from pandas.core.dtypes.generic import ( +from .generic import ( ABCCategorical, ABCIndex, ) -from pandas.core.dtypes.inference import ( # noqa:F401 +from .inference import ( # noqa:F401 is_array_like, is_bool, is_complex, diff --git a/pandas/core/dtypes/concat.py b/pandas/core/dtypes/concat.py index 42ac786ff315e..372c563781b04 100644 --- a/pandas/core/dtypes/concat.py +++ b/pandas/core/dtypes/concat.py @@ -10,25 +10,25 @@ DtypeObj, ) -from pandas.core.dtypes.cast import find_common_type -from pandas.core.dtypes.common import ( +from pandas.core.arrays import ExtensionArray +from pandas.core.arrays.sparse import SparseArray +from pandas.core.construction import ( + array, + ensure_wrapped_if_datetimelike, +) + +from .cast import find_common_type +from .common import ( is_categorical_dtype, is_dtype_equal, is_extension_array_dtype, is_sparse, ) -from pandas.core.dtypes.generic import ( +from .generic import ( ABCCategoricalIndex, ABCSeries, ) -from pandas.core.arrays import ExtensionArray -from pandas.core.arrays.sparse import SparseArray -from pandas.core.construction import ( - array, - ensure_wrapped_if_datetimelike, -) - def _cast_to_common_type(arr: ArrayLike, dtype: DtypeObj) -> ArrayLike: """ diff --git a/pandas/core/dtypes/dtypes.py b/pandas/core/dtypes/dtypes.py index da3a9269cf2c4..ed2fa2f3d3147 100644 --- a/pandas/core/dtypes/dtypes.py +++ b/pandas/core/dtypes/dtypes.py @@ -38,15 +38,15 @@ Ordered, ) -from pandas.core.dtypes.base import ( +from .base import ( ExtensionDtype, register_extension_dtype, ) -from pandas.core.dtypes.generic import ( +from .generic import ( ABCCategoricalIndex, ABCIndex, ) -from pandas.core.dtypes.inference import ( +from .inference import ( is_bool, is_list_like, ) @@ -591,7 +591,7 @@ def ordered(self) -> Ordered: @property def _is_boolean(self) -> bool: - from pandas.core.dtypes.common import is_bool_dtype + from .common import is_bool_dtype return is_bool_dtype(self.categories) @@ -621,7 +621,7 @@ def _get_common_dtype(self, dtypes: List[DtypeObj]) -> Optional[DtypeObj]: x.categories.dtype if isinstance(x, CategoricalDtype) else x for x in dtypes ] # TODO should categorical always give an answer? - from pandas.core.dtypes.cast import find_common_type + from .cast import find_common_type return find_common_type(non_cat_dtypes) @@ -1046,7 +1046,7 @@ class IntervalDtype(PandasExtensionDtype): _cache: Dict[str_type, PandasExtensionDtype] = {} def __new__(cls, subtype=None, closed: Optional[str_type] = None): - from pandas.core.dtypes.common import ( + from .common import ( is_string_dtype, pandas_dtype, ) @@ -1181,7 +1181,7 @@ def __eq__(self, other: Any) -> bool: elif self.closed != other.closed: return False else: - from pandas.core.dtypes.common import is_dtype_equal + from .common import is_dtype_equal return is_dtype_equal(self.subtype, other.subtype) @@ -1246,7 +1246,7 @@ def _get_common_dtype(self, dtypes: List[DtypeObj]) -> Optional[DtypeObj]: if not all(cast("IntervalDtype", x).closed == closed for x in dtypes): return np.dtype(object) - from pandas.core.dtypes.cast import find_common_type + from .cast import find_common_type common = find_common_type([cast("IntervalDtype", x).subtype for x in dtypes]) if common == object: diff --git a/pandas/core/dtypes/missing.py b/pandas/core/dtypes/missing.py index 3279007fcebe1..dca5b45ef9811 100644 --- a/pandas/core/dtypes/missing.py +++ b/pandas/core/dtypes/missing.py @@ -19,7 +19,7 @@ DtypeObj, ) -from pandas.core.dtypes.common import ( +from .common import ( DT64NS_DTYPE, TD64NS_DTYPE, ensure_object, @@ -37,14 +37,14 @@ is_string_like_dtype, needs_i8_conversion, ) -from pandas.core.dtypes.generic import ( +from .generic import ( ABCDataFrame, ABCExtensionArray, ABCIndex, ABCMultiIndex, ABCSeries, ) -from pandas.core.dtypes.inference import is_list_like +from .inference import is_list_like isposinf_scalar = libmissing.isposinf_scalar isneginf_scalar = libmissing.isneginf_scalar diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 3fe330f659513..d7ccc1d17aaea 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -89,7 +89,38 @@ validate_percentile, ) -from pandas.core.dtypes.cast import ( +from pandas.io.common import get_handle +from pandas.io.formats import ( + console, + format as fmt, +) +from pandas.io.formats.info import ( + BaseInfo, + DataFrameInfo, +) +import pandas.plotting + +from . import ( + algorithms, + common as com, + generic, + nanops, + ops, +) +from .accessor import CachedAccessor +from .aggregation import ( + reconstruct_func, + relabel_result, + transform, +) +from .arraylike import OpsMixin +from .arrays import ExtensionArray +from .arrays.sparse import SparseFrameAccessor +from .construction import ( + extract_array, + sanitize_masked_array, +) +from .dtypes.cast import ( construct_1d_arraylike_from_scalar, construct_2d_arraylike_from_scalar, find_common_type, @@ -101,7 +132,7 @@ maybe_infer_to_datetimelike, validate_numeric_casting, ) -from pandas.core.dtypes.common import ( +from .dtypes.common import ( ensure_int64, ensure_platform_int, infer_dtype_from_object, @@ -123,57 +154,36 @@ is_sequence, pandas_dtype, ) -from pandas.core.dtypes.missing import ( +from .dtypes.missing import ( isna, notna, ) - -from pandas.core import ( - algorithms, - common as com, - generic, - nanops, - ops, -) -from pandas.core.accessor import CachedAccessor -from pandas.core.aggregation import ( - reconstruct_func, - relabel_result, - transform, -) -from pandas.core.arraylike import OpsMixin -from pandas.core.arrays import ExtensionArray -from pandas.core.arrays.sparse import SparseFrameAccessor -from pandas.core.construction import ( - extract_array, - sanitize_masked_array, -) -from pandas.core.generic import ( +from .generic import ( NDFrame, _shared_docs, ) -from pandas.core.indexers import check_key_length -from pandas.core.indexes import base as ibase -from pandas.core.indexes.api import ( +from .indexers import check_key_length +from .indexes import base as ibase +from .indexes.api import ( DatetimeIndex, Index, PeriodIndex, ensure_index, ensure_index_from_sequences, ) -from pandas.core.indexes.multi import ( +from .indexes.multi import ( MultiIndex, maybe_droplevels, ) -from pandas.core.indexing import ( +from .indexing import ( check_bool_indexer, convert_to_index_sliceable, ) -from pandas.core.internals import ( +from .internals import ( ArrayManager, BlockManager, ) -from pandas.core.internals.construction import ( +from .internals.construction import ( arrays_to_mgr, dataclasses_to_dicts, init_dict, @@ -186,25 +196,14 @@ to_arrays, treat_as_nested, ) -from pandas.core.reshape.melt import melt -from pandas.core.series import Series -from pandas.core.sorting import ( +from .reshape.melt import melt +from .series import Series +from .sorting import ( get_group_index, lexsort_indexer, nargsort, ) -from pandas.io.common import get_handle -from pandas.io.formats import ( - console, - format as fmt, -) -from pandas.io.formats.info import ( - BaseInfo, - DataFrameInfo, -) -import pandas.plotting - if TYPE_CHECKING: from typing import Literal @@ -213,11 +212,11 @@ TimestampConvertibleTypes, ) - from pandas.core.groupby.generic import DataFrameGroupBy - from pandas.core.resample import Resampler - from pandas.io.formats.style import Styler + from .groupby.generic import DataFrameGroupBy + from .resample import Resampler + # --------------------------------------------------------------------- # Docstring templates @@ -3708,7 +3707,7 @@ def eval(self, expr: str, inplace: bool = False, **kwargs): 3 4 4 8 0 4 5 2 7 3 """ - from pandas.core.computation.eval import eval as _eval + from .computation.eval import eval as _eval inplace = validate_bool_kwarg(inplace, "inplace") resolvers = kwargs.pop("resolvers", None) @@ -6851,7 +6850,7 @@ def groupby( observed: bool = False, dropna: bool = True, ) -> DataFrameGroupBy: - from pandas.core.groupby.generic import DataFrameGroupBy + from .groupby.generic import DataFrameGroupBy if squeeze is not no_default: warnings.warn( @@ -7029,7 +7028,7 @@ def groupby( @Substitution("") @Appender(_shared_docs["pivot"]) def pivot(self, index=None, columns=None, values=None) -> DataFrame: - from pandas.core.reshape.pivot import pivot + from .reshape.pivot import pivot return pivot(self, index=index, columns=columns, values=values) @@ -7181,7 +7180,7 @@ def pivot_table( margins_name="All", observed=False, ) -> DataFrame: - from pandas.core.reshape.pivot import pivot_table + from .reshape.pivot import pivot_table return pivot_table( self, @@ -7357,7 +7356,7 @@ def stack(self, level: Level = -1, dropna: bool = True): dog kg NaN 2.0 m 3.0 NaN """ - from pandas.core.reshape.reshape import ( + from .reshape.reshape import ( stack, stack_multiple, ) @@ -7505,7 +7504,7 @@ def unstack(self, level=-1, fill_value=None): b 4.0 dtype: float64 """ - from pandas.core.reshape.reshape import unstack + from .reshape.reshape import unstack result = unstack(self, level, fill_value) @@ -7758,7 +7757,7 @@ def aggregate(self, func=None, axis: Axis = 0, *args, **kwargs): return result def _aggregate(self, arg, axis: Axis = 0, *args, **kwargs): - from pandas.core.apply import frame_apply + from .apply import frame_apply op = frame_apply( self if axis == 0 else self.T, @@ -7936,7 +7935,7 @@ def apply( 1 1 2 2 1 2 """ - from pandas.core.apply import frame_apply + from .apply import frame_apply op = frame_apply( self, @@ -8160,7 +8159,7 @@ def append( if (self.columns.get_indexer(other.columns) >= 0).all(): other = other.reindex(columns=self.columns) - from pandas.core.reshape.concat import concat + from .reshape.concat import concat if isinstance(other, (list, tuple)): to_concat = [self, *other] @@ -8314,8 +8313,8 @@ def _join_compat( rsuffix: str = "", sort: bool = False, ): - from pandas.core.reshape.concat import concat - from pandas.core.reshape.merge import merge + from .reshape.concat import concat + from .reshape.merge import merge if isinstance(other, Series): if other.name is None: @@ -8390,7 +8389,7 @@ def merge( indicator: bool = False, validate: Optional[str] = None, ) -> DataFrame: - from pandas.core.reshape.merge import merge + from .reshape.merge import merge return merge( self, @@ -8485,7 +8484,7 @@ def round(self, decimals=0, *args, **kwargs) -> DataFrame: 2 0.7 0.0 3 0.2 0.0 """ - from pandas.core.reshape.concat import concat + from .reshape.concat import concat def _dict_round(df, decimals): for col, vals in df.items(): @@ -9673,7 +9672,7 @@ def isin(self, values) -> DataFrame: dog False False """ if isinstance(values, dict): - from pandas.core.reshape.concat import concat + from .reshape.concat import concat values = collections.defaultdict(list, values) return concat( diff --git a/pandas/core/generic.py b/pandas/core/generic.py index a32ae7090ef8b..929c01b5b1804 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -75,7 +75,33 @@ validate_fillna_kwargs, ) -from pandas.core.dtypes.common import ( +import pandas.core.algorithms as algos +import pandas.core.common as com + +from pandas.io.formats import format as fmt +from pandas.io.formats.format import ( + DataFrameFormatter, + DataFrameRenderer, +) +from pandas.io.formats.printing import pprint_thing + +from . import ( + arraylike, + indexing, + missing, + nanops, +) +from .arrays import ExtensionArray +from .base import ( + PandasObject, + SelectionMixin, +) +from .construction import ( + create_series_with_explicit_dtype, + extract_array, +) +from .describe import describe_ndframe +from .dtypes.common import ( ensure_int64, ensure_object, ensure_str, @@ -96,37 +122,18 @@ is_timedelta64_dtype, pandas_dtype, ) -from pandas.core.dtypes.generic import ( +from .dtypes.generic import ( ABCDataFrame, ABCSeries, ) -from pandas.core.dtypes.inference import is_hashable -from pandas.core.dtypes.missing import ( +from .dtypes.inference import is_hashable +from .dtypes.missing import ( isna, notna, ) - -from pandas.core import ( - arraylike, - indexing, - missing, - nanops, -) -import pandas.core.algorithms as algos -from pandas.core.arrays import ExtensionArray -from pandas.core.base import ( - PandasObject, - SelectionMixin, -) -import pandas.core.common as com -from pandas.core.construction import ( - create_series_with_explicit_dtype, - extract_array, -) -from pandas.core.describe import describe_ndframe -from pandas.core.flags import Flags -from pandas.core.indexes import base as ibase -from pandas.core.indexes.api import ( +from .flags import Flags +from .indexes import base as ibase +from .indexes.api import ( DatetimeIndex, Index, MultiIndex, @@ -134,36 +141,29 @@ RangeIndex, ensure_index, ) -from pandas.core.internals import ( +from .internals import ( ArrayManager, BlockManager, ) -from pandas.core.missing import find_valid_index -from pandas.core.ops import align_method_FRAME -from pandas.core.reshape.concat import concat -from pandas.core.shared_docs import _shared_docs -from pandas.core.sorting import get_indexer_indexer -from pandas.core.window import ( +from .missing import find_valid_index +from .ops import align_method_FRAME +from .reshape.concat import concat +from .shared_docs import _shared_docs +from .sorting import get_indexer_indexer +from .window import ( Expanding, ExponentialMovingWindow, Rolling, Window, ) -from pandas.io.formats import format as fmt -from pandas.io.formats.format import ( - DataFrameFormatter, - DataFrameRenderer, -) -from pandas.io.formats.printing import pprint_thing - if TYPE_CHECKING: from pandas._libs.tslibs import BaseOffset - from pandas.core.frame import DataFrame - from pandas.core.resample import Resampler - from pandas.core.series import Series - from pandas.core.window.indexers import BaseIndexer + from .frame import DataFrame + from .resample import Resampler + from .series import Series + from .window.indexers import BaseIndexer # goal is to be able to define the docs close to function, while still being # able to share @@ -552,7 +552,7 @@ def _get_axis_resolvers(self, axis: str) -> Dict[str, Union[Series, MultiIndex]] @final def _get_index_resolvers(self) -> Dict[Hashable, Union[Series, MultiIndex]]: - from pandas.core.computation.parsing import clean_column_name + from .computation.parsing import clean_column_name d: Dict[str, Union[Series, MultiIndex]] = {} for axis_name in self._AXIS_ORDERS: @@ -569,7 +569,7 @@ def _get_cleaned_column_resolvers(self) -> Dict[Hashable, Series]: be referred to by backtick quoting. Used in :meth:`DataFrame.eval`. """ - from pandas.core.computation.parsing import clean_column_name + from .computation.parsing import clean_column_name if isinstance(self, ABCSeries): return {clean_column_name(self.name): self} @@ -7615,7 +7615,7 @@ def asfreq( 2000-01-01 00:02:30 3.0 2000-01-01 00:03:00 3.0 """ - from pandas.core.resample import asfreq + from .resample import asfreq return asfreq( self, @@ -8182,7 +8182,7 @@ def resample( 2000-10-02 00:41:00 24 Freq: 17T, dtype: int64 """ - from pandas.core.resample import get_resampler + from .resample import get_resampler axis = self._get_axis_number(axis) return get_resampler( @@ -8470,7 +8470,7 @@ def compare( keep_shape: bool_t = False, keep_equal: bool_t = False, ): - from pandas.core.reshape.concat import concat + from .reshape.concat import concat if type(self) is not type(other): cls_self, cls_other = type(self).__name__, type(other).__name__ @@ -9533,7 +9533,7 @@ def truncate( # if we have a date index, convert to dates, otherwise # treat like a slice if ax._is_all_dates: - from pandas.core.tools.datetimes import to_datetime + from .tools.datetimes import to_datetime before = to_datetime(before) after = to_datetime(after) diff --git a/pandas/core/groupby/__init__.py b/pandas/core/groupby/__init__.py index 8248f378e2c1a..9ea010e6e3831 100644 --- a/pandas/core/groupby/__init__.py +++ b/pandas/core/groupby/__init__.py @@ -1,10 +1,10 @@ -from pandas.core.groupby.generic import ( +from .generic import ( DataFrameGroupBy, NamedAgg, SeriesGroupBy, ) -from pandas.core.groupby.groupby import GroupBy -from pandas.core.groupby.grouper import Grouper +from .groupby import GroupBy +from .grouper import Grouper __all__ = [ "DataFrameGroupBy", diff --git a/pandas/core/groupby/generic.py b/pandas/core/groupby/generic.py index c1a277925de2a..e3f3b97105330 100644 --- a/pandas/core/groupby/generic.py +++ b/pandas/core/groupby/generic.py @@ -94,15 +94,6 @@ from pandas.core.construction import create_series_with_explicit_dtype from pandas.core.frame import DataFrame from pandas.core.generic import NDFrame -from pandas.core.groupby import base -from pandas.core.groupby.groupby import ( - GroupBy, - _agg_template, - _apply_docs, - _transform_template, - get_groupby, - group_selection_context, -) from pandas.core.indexes.api import ( Index, MultiIndex, @@ -115,6 +106,16 @@ from pandas.plotting import boxplot_frame_groupby +from . import base +from .groupby import ( + GroupBy, + _agg_template, + _apply_docs, + _transform_template, + get_groupby, + group_selection_context, +) + if TYPE_CHECKING: from pandas.core.internals import Block diff --git a/pandas/core/groupby/groupby.py b/pandas/core/groupby/groupby.py index bc277bf67614d..1634b5d540c97 100644 --- a/pandas/core/groupby/groupby.py +++ b/pandas/core/groupby/groupby.py @@ -94,11 +94,6 @@ class providing the base-class of operations. import pandas.core.common as com from pandas.core.frame import DataFrame from pandas.core.generic import NDFrame -from pandas.core.groupby import ( - base, - numba_, - ops, -) from pandas.core.indexes.api import ( CategoricalIndex, Index, @@ -108,6 +103,12 @@ class providing the base-class of operations. from pandas.core.sorting import get_group_index_sorter from pandas.core.util.numba_ import NUMBA_FUNC_CACHE +from . import ( + base, + numba_, + ops, +) + _common_see_also = """ See Also -------- @@ -589,7 +590,7 @@ def __init__( self.dropna = dropna if grouper is None: - from pandas.core.groupby.grouper import get_grouper + from .grouper import get_grouper grouper, exclusions, obj = get_grouper( obj, @@ -2179,7 +2180,7 @@ def nth(self, n: Union[int, List[int]], dropna: Optional[str] = None) -> DataFra # create a grouper with the original parameters, but on dropped # object - from pandas.core.groupby.grouper import get_grouper + from .grouper import get_grouper grouper, _, _ = get_grouper( dropped, @@ -3111,11 +3112,11 @@ def get_groupby( klass: Type[GroupBy] if isinstance(obj, Series): - from pandas.core.groupby.generic import SeriesGroupBy + from .generic import SeriesGroupBy klass = SeriesGroupBy elif isinstance(obj, DataFrame): - from pandas.core.groupby.generic import DataFrameGroupBy + from .generic import DataFrameGroupBy klass = DataFrameGroupBy else: diff --git a/pandas/core/groupby/grouper.py b/pandas/core/groupby/grouper.py index 89becb880c519..979678b6d2ed6 100644 --- a/pandas/core/groupby/grouper.py +++ b/pandas/core/groupby/grouper.py @@ -38,11 +38,6 @@ ) import pandas.core.common as com from pandas.core.frame import DataFrame -from pandas.core.groupby import ops -from pandas.core.groupby.categorical import ( - recode_for_groupby, - recode_from_groupby, -) from pandas.core.indexes.api import ( CategoricalIndex, Index, @@ -52,6 +47,12 @@ from pandas.io.formats.printing import pprint_thing +from . import ops +from .categorical import ( + recode_for_groupby, + recode_from_groupby, +) + class Grouper: """ diff --git a/pandas/core/groupby/ops.py b/pandas/core/groupby/ops.py index 00cb65fff3803..cf5520e4f782d 100644 --- a/pandas/core/groupby/ops.py +++ b/pandas/core/groupby/ops.py @@ -75,10 +75,6 @@ import pandas.core.common as com from pandas.core.frame import DataFrame from pandas.core.generic import NDFrame -from pandas.core.groupby import ( - base, - grouper, -) from pandas.core.indexes.api import ( Index, MultiIndex, @@ -94,6 +90,11 @@ get_indexer_dict, ) +from . import ( + base, + grouper, +) + class BaseGrouper: """ diff --git a/pandas/core/index.py b/pandas/core/index.py index 44f434e038a4b..3a5923e5a6cb8 100644 --- a/pandas/core/index.py +++ b/pandas/core/index.py @@ -1,6 +1,6 @@ import warnings -from pandas.core.indexes.api import ( # noqa:F401 +from .indexes.api import ( # noqa:F401 CategoricalIndex, DatetimeIndex, Float64Index, @@ -19,7 +19,7 @@ ensure_index_from_sequences, get_objs_combined_axis, ) -from pandas.core.indexes.multi import sparsify_labels # noqa:F401 +from .indexes.multi import sparsify_labels # noqa:F401 # GH#30193 warnings.warn( diff --git a/pandas/core/indexers.py b/pandas/core/indexers.py index 0649cc3efc153..02f4f778ad2cf 100644 --- a/pandas/core/indexers.py +++ b/pandas/core/indexers.py @@ -14,7 +14,7 @@ ArrayLike, ) -from pandas.core.dtypes.common import ( +from .dtypes.common import ( is_array_like, is_bool_dtype, is_extension_array_dtype, @@ -22,14 +22,14 @@ is_integer_dtype, is_list_like, ) -from pandas.core.dtypes.generic import ( +from .dtypes.generic import ( ABCIndex, ABCSeries, ) if TYPE_CHECKING: - from pandas.core.frame import DataFrame - from pandas.core.indexes.base import Index + from .frame import DataFrame + from .indexes.base import Index # ----------------------------------------------------------- # Indexer Identification @@ -514,7 +514,7 @@ def check_array_indexer(array: AnyArrayLike, indexer: Any) -> Any: ... IndexError: arrays used as indices must be of integer or boolean type """ - from pandas.core.construction import array as pd_array + from .construction import array as pd_array # whatever is not an array-like is returned as-is (possible valid array # indexers that are not array-like: integer, slice, Ellipsis, None) diff --git a/pandas/core/indexes/accessors.py b/pandas/core/indexes/accessors.py index 017f58bff03e9..f784434fe77c0 100644 --- a/pandas/core/indexes/accessors.py +++ b/pandas/core/indexes/accessors.py @@ -32,8 +32,9 @@ NoNewAttributesMixin, PandasObject, ) -from pandas.core.indexes.datetimes import DatetimeIndex -from pandas.core.indexes.timedeltas import TimedeltaIndex + +from .datetimes import DatetimeIndex +from .timedeltas import TimedeltaIndex if TYPE_CHECKING: from pandas import Series diff --git a/pandas/core/indexes/api.py b/pandas/core/indexes/api.py index 5656323b82fb7..39223e3e8cd4d 100644 --- a/pandas/core/indexes/api.py +++ b/pandas/core/indexes/api.py @@ -10,26 +10,26 @@ ) from pandas.errors import InvalidIndexError -from pandas.core.indexes.base import ( +from .base import ( Index, _new_Index, ensure_index, ensure_index_from_sequences, get_unanimous_names, ) -from pandas.core.indexes.category import CategoricalIndex -from pandas.core.indexes.datetimes import DatetimeIndex -from pandas.core.indexes.interval import IntervalIndex -from pandas.core.indexes.multi import MultiIndex -from pandas.core.indexes.numeric import ( +from .category import CategoricalIndex +from .datetimes import DatetimeIndex +from .interval import IntervalIndex +from .multi import MultiIndex +from .numeric import ( Float64Index, Int64Index, NumericIndex, UInt64Index, ) -from pandas.core.indexes.period import PeriodIndex -from pandas.core.indexes.range import RangeIndex -from pandas.core.indexes.timedeltas import TimedeltaIndex +from .period import PeriodIndex +from .range import RangeIndex +from .timedeltas import TimedeltaIndex _sort_msg = textwrap.dedent( """\ diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 71095b8f4113a..74d115bccb55c 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -141,7 +141,6 @@ import pandas.core.common as com from pandas.core.construction import extract_array from pandas.core.indexers import deprecate_ndim_indexing -from pandas.core.indexes.frozen import FrozenList from pandas.core.ops import get_op_result_name from pandas.core.ops.invalid import make_invalid_op from pandas.core.sorting import ( @@ -158,6 +157,8 @@ pprint_thing, ) +from .frozen import FrozenList + if TYPE_CHECKING: from pandas import ( CategoricalIndex, @@ -166,7 +167,8 @@ RangeIndex, Series, ) - from pandas.core.indexes.datetimelike import DatetimeIndexOpsMixin + + from .datetimelike import DatetimeIndexOpsMixin __all__ = ["Index"] @@ -204,7 +206,7 @@ def _new_Index(cls, d): # required for backward compat, because PI can't be instantiated with # ordinals through __new__ GH #13277 if issubclass(cls, ABCPeriodIndex): - from pandas.core.indexes.period import _new_PeriodIndex + from .period import _new_PeriodIndex return _new_PeriodIndex(cls, **d) @@ -333,7 +335,8 @@ def __new__( ) from pandas.core.arrays import PandasArray - from pandas.core.indexes.range import RangeIndex + + from .range import RangeIndex name = maybe_extract_name(name, data, cls) @@ -432,7 +435,7 @@ def __new__( if data and all(isinstance(e, tuple) for e in data): # we must be all tuples, otherwise don't construct # 10697 - from pandas.core.indexes.multi import MultiIndex + from .multi import MultiIndex return MultiIndex.from_tuples( data, names=name or kwargs.get("names") @@ -831,7 +834,7 @@ def astype(self, dtype, copy=True): return self.copy() if copy else self elif is_categorical_dtype(dtype): - from pandas.core.indexes.category import CategoricalIndex + from .category import CategoricalIndex return CategoricalIndex( self._values, name=self.name, dtype=dtype, copy=copy @@ -1821,7 +1824,7 @@ def _drop_level_numbers(self, levnums: List[int]): result._name = new_names[0] return result else: - from pandas.core.indexes.multi import MultiIndex + from .multi import MultiIndex return MultiIndex( levels=new_levels, @@ -3940,9 +3943,10 @@ def join(self, other, how="left", level=None, return_indexers=False, sort=False) @final def _join_multi(self, other, how, return_indexers=True): - from pandas.core.indexes.multi import MultiIndex from pandas.core.reshape.merge import restore_dropped_levels_multijoin + from .multi import MultiIndex + # figure out join names self_names_list = list(com.not_none(*self.names)) other_names_list = list(com.not_none(*other.names)) @@ -4058,7 +4062,7 @@ def _join_level( MultiIndex will not be changed; otherwise, it will tie out with `other`. """ - from pandas.core.indexes.multi import MultiIndex + from .multi import MultiIndex def _get_leaf_sorter(labels): """ @@ -5329,7 +5333,7 @@ def map(self, mapper, na_action=None): If the function returns a tuple with more than one element a MultiIndex will be returned. """ - from pandas.core.indexes.multi import MultiIndex + from .multi import MultiIndex new_values = super()._map_values(mapper, na_action=na_action) @@ -6067,7 +6071,7 @@ def ensure_index_from_sequences(sequences, names=None): -------- ensure_index """ - from pandas.core.indexes.multi import MultiIndex + from .multi import MultiIndex if len(sequences) == 1: if names is not None: @@ -6140,7 +6144,7 @@ def ensure_index( converted, all_arrays = lib.clean_index_list(index_like) if len(converted) > 0 and all_arrays: - from pandas.core.indexes.multi import MultiIndex + from .multi import MultiIndex return MultiIndex.from_arrays(converted) else: @@ -6198,7 +6202,7 @@ def _validate_join_method(method: str): def default_index(n: int) -> RangeIndex: - from pandas.core.indexes.range import RangeIndex + from .range import RangeIndex return RangeIndex(0, n, name=None) diff --git a/pandas/core/indexes/category.py b/pandas/core/indexes/category.py index 13c53dfafed4d..e48d5520247a3 100644 --- a/pandas/core/indexes/category.py +++ b/pandas/core/indexes/category.py @@ -39,12 +39,13 @@ ) from pandas.core.construction import extract_array import pandas.core.indexes.base as ibase -from pandas.core.indexes.base import ( + +from .base import ( Index, _index_shared_docs, maybe_extract_name, ) -from pandas.core.indexes.extension import ( +from .extension import ( NDArrayBackedExtensionIndex, inherit_names, ) diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index b2c67ae2f0a00..6bdeb102555a4 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -57,17 +57,18 @@ from pandas.core.arrays.datetimelike import DatetimeLikeArrayMixin import pandas.core.common as com import pandas.core.indexes.base as ibase -from pandas.core.indexes.base import ( +from pandas.core.tools.timedeltas import to_timedelta + +from .base import ( Index, _index_shared_docs, ) -from pandas.core.indexes.extension import ( +from .extension import ( NDArrayBackedExtensionIndex, inherit_names, make_wrapped_arith_op, ) -from pandas.core.indexes.numeric import Int64Index -from pandas.core.tools.timedeltas import to_timedelta +from .numeric import Int64Index if TYPE_CHECKING: from pandas import CategoricalIndex diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index 9ea43d083f5b3..ed2ef4815cd59 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -55,14 +55,15 @@ tz_to_dtype, ) import pandas.core.common as com -from pandas.core.indexes.base import ( +from pandas.core.tools.times import to_time + +from .base import ( Index, get_unanimous_names, maybe_extract_name, ) -from pandas.core.indexes.datetimelike import DatetimeTimedeltaMixin -from pandas.core.indexes.extension import inherit_names -from pandas.core.tools.times import to_time +from .datetimelike import DatetimeTimedeltaMixin +from .extension import inherit_names if TYPE_CHECKING: from pandas import ( @@ -286,21 +287,21 @@ def tz_localize(self, tz, ambiguous="raise", nonexistent="raise") -> DatetimeInd @doc(DatetimeArray.to_period) def to_period(self, freq=None) -> PeriodIndex: - from pandas.core.indexes.api import PeriodIndex + from .api import PeriodIndex arr = self._data.to_period(freq) return PeriodIndex._simple_new(arr, name=self.name) @doc(DatetimeArray.to_perioddelta) def to_perioddelta(self, freq) -> TimedeltaIndex: - from pandas.core.indexes.api import TimedeltaIndex + from .api import TimedeltaIndex arr = self._data.to_perioddelta(freq) return TimedeltaIndex._simple_new(arr, name=self.name) @doc(DatetimeArray.to_julian_date) def to_julian_date(self) -> Float64Index: - from pandas.core.indexes.api import Float64Index + from .api import Float64Index arr = self._data.to_julian_date() return Float64Index._simple_new(arr, name=self.name) diff --git a/pandas/core/indexes/extension.py b/pandas/core/indexes/extension.py index 4150ec745bd2e..a7d925eae9bf1 100644 --- a/pandas/core/indexes/extension.py +++ b/pandas/core/indexes/extension.py @@ -28,9 +28,10 @@ from pandas.core.arrays import ExtensionArray from pandas.core.arrays._mixins import NDArrayBackedExtensionArray from pandas.core.indexers import deprecate_ndim_indexing -from pandas.core.indexes.base import Index from pandas.core.ops import get_op_result_name +from .base import Index + _T = TypeVar("_T", bound="NDArrayBackedExtensionIndex") diff --git a/pandas/core/indexes/interval.py b/pandas/core/indexes/interval.py index c2fabfc332b23..67ce62a5cbad8 100644 --- a/pandas/core/indexes/interval.py +++ b/pandas/core/indexes/interval.py @@ -81,27 +81,28 @@ import pandas.core.common as com from pandas.core.indexers import is_valid_positional_slice import pandas.core.indexes.base as ibase -from pandas.core.indexes.base import ( +from pandas.core.ops import get_op_result_name + +from .base import ( Index, _index_shared_docs, default_pprint, ensure_index, maybe_extract_name, ) -from pandas.core.indexes.datetimes import ( +from .datetimes import ( DatetimeIndex, date_range, ) -from pandas.core.indexes.extension import ( +from .extension import ( ExtensionIndex, inherit_names, ) -from pandas.core.indexes.multi import MultiIndex -from pandas.core.indexes.timedeltas import ( +from .multi import MultiIndex +from .timedeltas import ( TimedeltaIndex, timedelta_range, ) -from pandas.core.ops import get_op_result_name if TYPE_CHECKING: from pandas import CategoricalIndex diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 7ef81b0947a22..1a7f76495fe51 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -74,14 +74,6 @@ from pandas.core.arrays.categorical import factorize_from_iterables import pandas.core.common as com import pandas.core.indexes.base as ibase -from pandas.core.indexes.base import ( - Index, - _index_shared_docs, - ensure_index, - get_unanimous_names, -) -from pandas.core.indexes.frozen import FrozenList -from pandas.core.indexes.numeric import Int64Index from pandas.core.ops.invalid import make_invalid_op from pandas.core.sorting import ( get_group_index, @@ -95,6 +87,15 @@ pprint_thing, ) +from .base import ( + Index, + _index_shared_docs, + ensure_index, + get_unanimous_names, +) +from .frozen import FrozenList +from .numeric import Int64Index + if TYPE_CHECKING: from pandas import ( CategoricalIndex, diff --git a/pandas/core/indexes/numeric.py b/pandas/core/indexes/numeric.py index 96c8c1ab9b69c..fc642959734b2 100644 --- a/pandas/core/indexes/numeric.py +++ b/pandas/core/indexes/numeric.py @@ -33,7 +33,8 @@ from pandas.core.dtypes.generic import ABCSeries import pandas.core.common as com -from pandas.core.indexes.base import ( + +from .base import ( Index, maybe_extract_name, ) diff --git a/pandas/core/indexes/period.py b/pandas/core/indexes/period.py index 0c5dbec2094e5..57a8f1436d579 100644 --- a/pandas/core/indexes/period.py +++ b/pandas/core/indexes/period.py @@ -51,14 +51,15 @@ ) import pandas.core.common as com import pandas.core.indexes.base as ibase -from pandas.core.indexes.base import maybe_extract_name -from pandas.core.indexes.datetimelike import DatetimeIndexOpsMixin -from pandas.core.indexes.datetimes import ( + +from .base import maybe_extract_name +from .datetimelike import DatetimeIndexOpsMixin +from .datetimes import ( DatetimeIndex, Index, ) -from pandas.core.indexes.extension import inherit_names -from pandas.core.indexes.numeric import Int64Index +from .extension import inherit_names +from .numeric import Int64Index _index_doc_kwargs = dict(ibase._index_doc_kwargs) _index_doc_kwargs.update({"target_klass": "PeriodIndex or list of Periods"}) diff --git a/pandas/core/indexes/range.py b/pandas/core/indexes/range.py index bd9a92a657991..cd3198949668d 100644 --- a/pandas/core/indexes/range.py +++ b/pandas/core/indexes/range.py @@ -40,12 +40,13 @@ import pandas.core.common as com from pandas.core.construction import extract_array import pandas.core.indexes.base as ibase -from pandas.core.indexes.base import maybe_extract_name -from pandas.core.indexes.numeric import ( +from pandas.core.ops.common import unpack_zerodim_and_defer + +from .base import maybe_extract_name +from .numeric import ( Float64Index, Int64Index, ) -from pandas.core.ops.common import unpack_zerodim_and_defer if TYPE_CHECKING: from pandas import Index diff --git a/pandas/core/indexes/timedeltas.py b/pandas/core/indexes/timedeltas.py index a23dd10bc3c0e..609b3e4eee80a 100644 --- a/pandas/core/indexes/timedeltas.py +++ b/pandas/core/indexes/timedeltas.py @@ -23,12 +23,13 @@ from pandas.core.arrays import datetimelike as dtl from pandas.core.arrays.timedeltas import TimedeltaArray import pandas.core.common as com -from pandas.core.indexes.base import ( + +from .base import ( Index, maybe_extract_name, ) -from pandas.core.indexes.datetimelike import DatetimeTimedeltaMixin -from pandas.core.indexes.extension import inherit_names +from .datetimelike import DatetimeTimedeltaMixin +from .extension import inherit_names @inherit_names( diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index 7b4921080e2e1..d2845ee0d486b 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -24,7 +24,10 @@ ) from pandas.util._decorators import doc -from pandas.core.dtypes.common import ( +import pandas.core.common as com + +from .construction import array as pd_array +from .dtypes.common import ( is_array_like, is_bool_dtype, is_hashable, @@ -36,26 +39,23 @@ is_scalar, is_sequence, ) -from pandas.core.dtypes.concat import concat_compat -from pandas.core.dtypes.generic import ( +from .dtypes.concat import concat_compat +from .dtypes.generic import ( ABCDataFrame, ABCMultiIndex, ABCSeries, ) -from pandas.core.dtypes.missing import ( +from .dtypes.missing import ( infer_fill_value, isna, ) - -import pandas.core.common as com -from pandas.core.construction import array as pd_array -from pandas.core.indexers import ( +from .indexers import ( check_array_indexer, is_exact_shape_match, is_list_like_indexer, length_of_indexer, ) -from pandas.core.indexes.api import Index +from .indexes.api import Index if TYPE_CHECKING: from pandas import ( diff --git a/pandas/core/internals/__init__.py b/pandas/core/internals/__init__.py index 132598e03d6c0..1b91c13bb99b7 100644 --- a/pandas/core/internals/__init__.py +++ b/pandas/core/internals/__init__.py @@ -1,6 +1,6 @@ -from pandas.core.internals.array_manager import ArrayManager -from pandas.core.internals.base import DataManager -from pandas.core.internals.blocks import ( # io.pytables, io.packers +from .array_manager import ArrayManager +from .base import DataManager +from .blocks import ( # io.pytables, io.packers Block, CategoricalBlock, DatetimeBlock, @@ -12,8 +12,8 @@ TimeDeltaBlock, make_block, ) -from pandas.core.internals.concat import concatenate_block_managers -from pandas.core.internals.managers import ( +from .concat import concatenate_block_managers +from .managers import ( BlockManager, SingleBlockManager, create_block_manager_from_arrays, diff --git a/pandas/core/internals/array_manager.py b/pandas/core/internals/array_manager.py index 0e52ebf69137c..1396985b211d8 100644 --- a/pandas/core/internals/array_manager.py +++ b/pandas/core/internals/array_manager.py @@ -56,11 +56,12 @@ Index, ensure_index, ) -from pandas.core.internals.base import DataManager -from pandas.core.internals.blocks import make_block + +from .base import DataManager +from .blocks import make_block if TYPE_CHECKING: - from pandas.core.internals.managers import SingleBlockManager + from .managers import SingleBlockManager T = TypeVar("T", bound="ArrayManager") @@ -643,7 +644,7 @@ def iget(self, i: int) -> SingleBlockManager: """ Return the data as a SingleBlockManager. """ - from pandas.core.internals.managers import SingleBlockManager + from .managers import SingleBlockManager values = self.arrays[i] block = make_block(values, placement=slice(0, len(values)), ndim=1) diff --git a/pandas/core/internals/concat.py b/pandas/core/internals/concat.py index aa3545b83dfe3..db5eca8a3db0d 100644 --- a/pandas/core/internals/concat.py +++ b/pandas/core/internals/concat.py @@ -41,9 +41,10 @@ DatetimeArray, ExtensionArray, ) -from pandas.core.internals.array_manager import ArrayManager -from pandas.core.internals.blocks import make_block -from pandas.core.internals.managers import BlockManager + +from .array_manager import ArrayManager +from .blocks import make_block +from .managers import BlockManager if TYPE_CHECKING: from pandas import Index diff --git a/pandas/core/internals/construction.py b/pandas/core/internals/construction.py index 2cfe613b7072b..2f685082ff04f 100644 --- a/pandas/core/internals/construction.py +++ b/pandas/core/internals/construction.py @@ -70,7 +70,8 @@ get_objs_combined_axis, union_indexes, ) -from pandas.core.internals.managers import ( + +from .managers import ( create_block_manager_from_arrays, create_block_manager_from_blocks, ) @@ -165,7 +166,7 @@ def mgr_to_mgr(mgr, typ: str): Convert to specific type of Manager. Does not copy if the type is already correct. Does not guarantee a copy otherwise. """ - from pandas.core.internals import ( + from . import ( ArrayManager, BlockManager, ) @@ -259,7 +260,7 @@ def init_ndarray(values, index, columns, dtype: Optional[DtypeObj], copy: bool): if isinstance(dvals_list[n], np.ndarray): dvals_list[n] = dvals_list[n].reshape(1, -1) - from pandas.core.internals.blocks import make_block + from .blocks import make_block # TODO: What about re-joining object columns? block_values = [ diff --git a/pandas/core/internals/managers.py b/pandas/core/internals/managers.py index 4ad094f315c78..5eff1ad67a045 100644 --- a/pandas/core/internals/managers.py +++ b/pandas/core/internals/managers.py @@ -62,8 +62,9 @@ Index, ensure_index, ) -from pandas.core.internals.base import DataManager -from pandas.core.internals.blocks import ( + +from .base import DataManager +from .blocks import ( Block, CategoricalBlock, DatetimeTZBlock, @@ -74,7 +75,7 @@ get_block_type, make_block, ) -from pandas.core.internals.ops import ( +from .ops import ( blockwise_all, operate_blockwise, ) diff --git a/pandas/core/internals/ops.py b/pandas/core/internals/ops.py index 70d4f3b91c245..b98106d55ea0f 100644 --- a/pandas/core/internals/ops.py +++ b/pandas/core/internals/ops.py @@ -13,8 +13,8 @@ from pandas._typing import ArrayLike if TYPE_CHECKING: - from pandas.core.internals.blocks import Block - from pandas.core.internals.managers import BlockManager + from .blocks import Block + from .managers import BlockManager BlockPairInfo = namedtuple( diff --git a/pandas/core/missing.py b/pandas/core/missing.py index 9ae5f7d1b7497..743f92cf52d07 100644 --- a/pandas/core/missing.py +++ b/pandas/core/missing.py @@ -26,14 +26,14 @@ ) from pandas.compat._optional import import_optional_dependency -from pandas.core.dtypes.cast import infer_dtype_from -from pandas.core.dtypes.common import ( +from .dtypes.cast import infer_dtype_from +from .dtypes.common import ( ensure_float64, is_integer_dtype, is_numeric_v_string_like, needs_i8_conversion, ) -from pandas.core.dtypes.missing import isna +from .dtypes.missing import isna if TYPE_CHECKING: from pandas import Index diff --git a/pandas/core/nanops.py b/pandas/core/nanops.py index 24e75a2bbeff2..efc7ac8f27984 100644 --- a/pandas/core/nanops.py +++ b/pandas/core/nanops.py @@ -29,7 +29,8 @@ ) from pandas.compat._optional import import_optional_dependency -from pandas.core.dtypes.common import ( +from .construction import extract_array +from .dtypes.common import ( get_dtype, is_any_int_dtype, is_bool_dtype, @@ -46,15 +47,13 @@ needs_i8_conversion, pandas_dtype, ) -from pandas.core.dtypes.dtypes import PeriodDtype -from pandas.core.dtypes.missing import ( +from .dtypes.dtypes import PeriodDtype +from .dtypes.missing import ( isna, na_value_for_dtype, notna, ) -from pandas.core.construction import extract_array - bn = import_optional_dependency("bottleneck", errors="warn") _BOTTLENECK_INSTALLED = bn is not None _USE_BOTTLENECK = False diff --git a/pandas/core/ops/__init__.py b/pandas/core/ops/__init__.py index 8ace64fedacb9..6f794d1d69d64 100644 --- a/pandas/core/ops/__init__.py +++ b/pandas/core/ops/__init__.py @@ -30,30 +30,31 @@ from pandas.core.dtypes.missing import isna from pandas.core import algorithms -from pandas.core.ops.array_ops import ( # noqa:F401 + +from .array_ops import ( # noqa:F401 arithmetic_op, comp_method_OBJECT_ARRAY, comparison_op, get_array_op, logical_op, ) -from pandas.core.ops.common import ( # noqa:F401 +from .common import ( # noqa:F401 get_op_result_name, unpack_zerodim_and_defer, ) -from pandas.core.ops.docstrings import ( +from .docstrings import ( _flex_comp_doc_FRAME, _op_descriptions, make_flex_doc, ) -from pandas.core.ops.invalid import invalid_comparison # noqa:F401 -from pandas.core.ops.mask_ops import ( # noqa: F401 +from .invalid import invalid_comparison # noqa:F401 +from .mask_ops import ( # noqa: F401 kleene_and, kleene_or, kleene_xor, ) -from pandas.core.ops.methods import add_flex_arithmetic_methods # noqa:F401 -from pandas.core.ops.roperator import ( # noqa:F401 +from .methods import add_flex_arithmetic_methods # noqa:F401 +from .roperator import ( # noqa:F401 radd, rand_, rdiv, diff --git a/pandas/core/ops/array_ops.py b/pandas/core/ops/array_ops.py index 10807dffb026b..5289ef726a27a 100644 --- a/pandas/core/ops/array_ops.py +++ b/pandas/core/ops/array_ops.py @@ -46,10 +46,11 @@ ) from pandas.core.construction import ensure_wrapped_if_datetimelike -from pandas.core.ops import missing -from pandas.core.ops.dispatch import should_extension_dispatch -from pandas.core.ops.invalid import invalid_comparison -from pandas.core.ops.roperator import rpow + +from . import missing +from .dispatch import should_extension_dispatch +from .invalid import invalid_comparison +from .roperator import rpow def comp_method_OBJECT_ARRAY(op, x, y): diff --git a/pandas/core/ops/methods.py b/pandas/core/ops/methods.py index 700c4a946e2b2..c7fda4306ba8c 100644 --- a/pandas/core/ops/methods.py +++ b/pandas/core/ops/methods.py @@ -8,7 +8,7 @@ ABCSeries, ) -from pandas.core.ops.roperator import ( +from .roperator import ( radd, rdivmod, rfloordiv, @@ -36,7 +36,7 @@ def _get_method_wrappers(cls): """ # TODO: make these non-runtime imports once the relevant functions # are no longer in __init__ - from pandas.core.ops import ( + from . import ( flex_arith_method_FRAME, flex_comp_method_FRAME, flex_method_SERIES, diff --git a/pandas/core/ops/missing.py b/pandas/core/ops/missing.py index 20b7510c33160..25b0066df022d 100644 --- a/pandas/core/ops/missing.py +++ b/pandas/core/ops/missing.py @@ -31,7 +31,7 @@ is_scalar, ) -from pandas.core.ops.roperator import ( +from .roperator import ( rdivmod, rfloordiv, rmod, diff --git a/pandas/core/resample.py b/pandas/core/resample.py index 2308f9edb4328..cd3df5bf1f8e6 100644 --- a/pandas/core/resample.py +++ b/pandas/core/resample.py @@ -36,56 +36,56 @@ doc, ) -from pandas.core.dtypes.generic import ( +import pandas.core.algorithms as algos + +from pandas.tseries.frequencies import ( + is_subperiod, + is_superperiod, +) +from pandas.tseries.offsets import ( + DateOffset, + Day, + Nano, + Tick, +) + +from .apply import ResamplerWindowApply +from .base import DataError +from .dtypes.generic import ( ABCDataFrame, ABCSeries, ) - -import pandas.core.algorithms as algos -from pandas.core.apply import ResamplerWindowApply -from pandas.core.base import DataError -from pandas.core.generic import ( +from .generic import ( NDFrame, _shared_docs, ) -from pandas.core.groupby.base import ( +from .groupby.base import ( GotItemMixin, ShallowMixin, ) -from pandas.core.groupby.generic import SeriesGroupBy -from pandas.core.groupby.groupby import ( +from .groupby.generic import SeriesGroupBy +from .groupby.groupby import ( BaseGroupBy, GroupBy, _pipe_template, get_groupby, ) -from pandas.core.groupby.grouper import Grouper -from pandas.core.groupby.ops import BinGrouper -from pandas.core.indexes.api import Index -from pandas.core.indexes.datetimes import ( +from .groupby.grouper import Grouper +from .groupby.ops import BinGrouper +from .indexes.api import Index +from .indexes.datetimes import ( DatetimeIndex, date_range, ) -from pandas.core.indexes.period import ( +from .indexes.period import ( PeriodIndex, period_range, ) -from pandas.core.indexes.timedeltas import ( +from .indexes.timedeltas import ( TimedeltaIndex, timedelta_range, ) -from pandas.tseries.frequencies import ( - is_subperiod, - is_superperiod, -) -from pandas.tseries.offsets import ( - DateOffset, - Day, - Nano, - Tick, -) - _shared_docs_kwargs: Dict[str, str] = {} diff --git a/pandas/core/reshape/api.py b/pandas/core/reshape/api.py index 58d741c2c6988..647bc3dbfc66c 100644 --- a/pandas/core/reshape/api.py +++ b/pandas/core/reshape/api.py @@ -1,23 +1,23 @@ # flake8: noqa -from pandas.core.reshape.concat import concat -from pandas.core.reshape.melt import ( +from .concat import concat +from .melt import ( lreshape, melt, wide_to_long, ) -from pandas.core.reshape.merge import ( +from .merge import ( merge, merge_asof, merge_ordered, ) -from pandas.core.reshape.pivot import ( +from .pivot import ( crosstab, pivot, pivot_table, ) -from pandas.core.reshape.reshape import get_dummies -from pandas.core.reshape.tile import ( +from .reshape import get_dummies +from .tile import ( cut, qcut, ) diff --git a/pandas/core/reshape/melt.py b/pandas/core/reshape/melt.py index 80a44e8fda39b..70bafc18fcfd4 100644 --- a/pandas/core/reshape/melt.py +++ b/pandas/core/reshape/melt.py @@ -28,11 +28,12 @@ Index, MultiIndex, ) -from pandas.core.reshape.concat import concat -from pandas.core.reshape.util import tile_compat from pandas.core.shared_docs import _shared_docs from pandas.core.tools.numeric import to_numeric +from .concat import concat +from .util import tile_compat + if TYPE_CHECKING: from pandas import ( DataFrame, diff --git a/pandas/core/reshape/merge.py b/pandas/core/reshape/merge.py index 79d018427aa33..0ab5a1965bd3d 100644 --- a/pandas/core/reshape/merge.py +++ b/pandas/core/reshape/merge.py @@ -173,7 +173,7 @@ def _groupby_and_merge(by, on, left: DataFrame, right: DataFrame, merge_pieces): # preserve the original order # if we have a missing piece this can be reset - from pandas.core.reshape.concat import concat + from .concat import concat result = concat(pieces, ignore_index=True) result = result.reindex(columns=pieces[0].columns, copy=False) diff --git a/pandas/core/reshape/pivot.py b/pandas/core/reshape/pivot.py index 778e37bc07eb5..9ccfbf146180e 100644 --- a/pandas/core/reshape/pivot.py +++ b/pandas/core/reshape/pivot.py @@ -44,10 +44,11 @@ MultiIndex, get_objs_combined_axis, ) -from pandas.core.reshape.concat import concat -from pandas.core.reshape.util import cartesian_product from pandas.core.series import Series +from .concat import concat +from .util import cartesian_product + if TYPE_CHECKING: from pandas import DataFrame diff --git a/pandas/core/reshape/reshape.py b/pandas/core/reshape/reshape.py index 4ccdbc089a058..bf795c6f8790d 100644 --- a/pandas/core/reshape/reshape.py +++ b/pandas/core/reshape/reshape.py @@ -841,7 +841,7 @@ def get_dummies( 1 0.0 1.0 0.0 2 0.0 0.0 1.0 """ - from pandas.core.reshape.concat import concat + from .concat import concat dtypes_to_encode = ["object", "category"] @@ -931,7 +931,7 @@ def _get_dummies_1d( drop_first=False, dtype: Optional[Dtype] = None, ): - from pandas.core.reshape.concat import concat + from .concat import concat # Series avoids inconsistent NaN handling codes, levels = factorize_from_iterable(Series(data)) diff --git a/pandas/core/series.py b/pandas/core/series.py index cbb66918a661b..b62e61cc76deb 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -56,13 +56,39 @@ validate_percentile, ) -from pandas.core.dtypes.cast import ( +import pandas.core.common as com +import pandas.core.indexes.base as ibase + +import pandas.io.formats.format as fmt +import pandas.plotting + +from . import ( + algorithms, + base, + generic, + missing, + nanops, + ops, +) +from .accessor import CachedAccessor +from .aggregation import transform +from .apply import series_apply +from .arrays import ExtensionArray +from .arrays.categorical import CategoricalAccessor +from .arrays.sparse import SparseAccessor +from .construction import ( + create_series_with_explicit_dtype, + extract_array, + is_empty_data, + sanitize_array, +) +from .dtypes.cast import ( convert_dtypes, maybe_box_native, maybe_cast_to_extension_array, validate_numeric_casting, ) -from pandas.core.dtypes.common import ( +from .dtypes.common import ( ensure_platform_int, is_bool, is_categorical_dtype, @@ -76,66 +102,40 @@ pandas_dtype, validate_all_hashable, ) -from pandas.core.dtypes.generic import ABCDataFrame -from pandas.core.dtypes.inference import is_hashable -from pandas.core.dtypes.missing import ( +from .dtypes.generic import ABCDataFrame +from .dtypes.inference import is_hashable +from .dtypes.missing import ( isna, na_value_for_dtype, notna, remove_na_arraylike, ) - -from pandas.core import ( - algorithms, - base, - generic, - missing, - nanops, - ops, -) -from pandas.core.accessor import CachedAccessor -from pandas.core.aggregation import transform -from pandas.core.apply import series_apply -from pandas.core.arrays import ExtensionArray -from pandas.core.arrays.categorical import CategoricalAccessor -from pandas.core.arrays.sparse import SparseAccessor -import pandas.core.common as com -from pandas.core.construction import ( - create_series_with_explicit_dtype, - extract_array, - is_empty_data, - sanitize_array, -) -from pandas.core.generic import NDFrame -from pandas.core.indexers import ( +from .generic import NDFrame +from .indexers import ( deprecate_ndim_indexing, unpack_1tuple, ) -from pandas.core.indexes.accessors import CombinedDatetimelikeProperties -from pandas.core.indexes.api import ( +from .indexes.accessors import CombinedDatetimelikeProperties +from .indexes.api import ( CategoricalIndex, Float64Index, Index, MultiIndex, ensure_index, ) -import pandas.core.indexes.base as ibase -from pandas.core.indexes.datetimes import DatetimeIndex -from pandas.core.indexes.period import PeriodIndex -from pandas.core.indexes.timedeltas import TimedeltaIndex -from pandas.core.indexing import check_bool_indexer -from pandas.core.internals import SingleBlockManager -from pandas.core.internals.construction import sanitize_index -from pandas.core.shared_docs import _shared_docs -from pandas.core.sorting import ( +from .indexes.datetimes import DatetimeIndex +from .indexes.period import PeriodIndex +from .indexes.timedeltas import TimedeltaIndex +from .indexing import check_bool_indexer +from .internals import SingleBlockManager +from .internals.construction import sanitize_index +from .shared_docs import _shared_docs +from .sorting import ( ensure_key_mapped, nargsort, ) -from pandas.core.strings import StringMethods -from pandas.core.tools.datetimes import to_datetime - -import pandas.io.formats.format as fmt -import pandas.plotting +from .strings import StringMethods +from .tools.datetimes import to_datetime if TYPE_CHECKING: from pandas._typing import ( @@ -143,9 +143,9 @@ TimestampConvertibleTypes, ) - from pandas.core.frame import DataFrame - from pandas.core.groupby.generic import SeriesGroupBy - from pandas.core.resample import Resampler + from .frame import DataFrame + from .groupby.generic import SeriesGroupBy + from .resample import Resampler __all__ = ["Series"] @@ -464,7 +464,7 @@ def _constructor_expanddim(self) -> Type[DataFrame]: Used when a manipulation result has one higher dimension as the original, such as Series.to_frame() """ - from pandas.core.frame import DataFrame + from .frame import DataFrame return DataFrame @@ -1736,7 +1736,7 @@ def groupby( observed: bool = False, dropna: bool = True, ) -> SeriesGroupBy: - from pandas.core.groupby.generic import SeriesGroupBy + from .groupby.generic import SeriesGroupBy if squeeze is not no_default: warnings.warn( @@ -2715,7 +2715,7 @@ def append(self, to_append, ignore_index=False, verify_integrity=False): ... ValueError: Indexes have overlapping values: [0, 1, 2] """ - from pandas.core.reshape.concat import concat + from .reshape.concat import concat if isinstance(to_append, (list, tuple)): to_concat = [self] @@ -3854,7 +3854,7 @@ def unstack(self, level=-1, fill_value=None): a 1 3 b 2 4 """ - from pandas.core.reshape.reshape import unstack + from .reshape.reshape import unstack return unstack(self, level, fill_value) diff --git a/pandas/core/sorting.py b/pandas/core/sorting.py index 67863036929b3..0dbb44581e042 100644 --- a/pandas/core/sorting.py +++ b/pandas/core/sorting.py @@ -24,20 +24,21 @@ from pandas._libs.hashtable import unique_label_indices from pandas._typing import IndexKeyFunc -from pandas.core.dtypes.common import ( +import pandas.core.algorithms as algorithms + +from .construction import extract_array +from .dtypes.common import ( ensure_int64, ensure_platform_int, is_extension_array_dtype, ) -from pandas.core.dtypes.generic import ABCMultiIndex -from pandas.core.dtypes.missing import isna - -import pandas.core.algorithms as algorithms -from pandas.core.construction import extract_array +from .dtypes.generic import ABCMultiIndex +from .dtypes.missing import isna if TYPE_CHECKING: from pandas import MultiIndex - from pandas.core.indexes.base import Index + + from .indexes.base import Index _INT64_MAX = np.iinfo(np.int64).max @@ -289,7 +290,7 @@ def lexsort_indexer( .. versionadded:: 1.0.0 """ - from pandas.core.arrays import Categorical + from .arrays import Categorical labels = [] shape = [] @@ -485,7 +486,7 @@ def ensure_key_mapped(values, key: Optional[Callable], levels=None): levels : Optional[List], if values is a MultiIndex, list of levels to apply the key to. """ - from pandas.core.indexes.api import Index + from .indexes.api import Index if not key: return values diff --git a/pandas/core/strings/__init__.py b/pandas/core/strings/__init__.py index 943686fc85a05..243250f0360a0 100644 --- a/pandas/core/strings/__init__.py +++ b/pandas/core/strings/__init__.py @@ -26,7 +26,7 @@ # - PandasArray # - Categorical -from pandas.core.strings.accessor import StringMethods -from pandas.core.strings.base import BaseStringArrayMethods +from .accessor import StringMethods +from .base import BaseStringArrayMethods __all__ = ["StringMethods", "BaseStringArrayMethods"] diff --git a/pandas/core/strings/object_array.py b/pandas/core/strings/object_array.py index 0a4543057c386..e1346de69b1a8 100644 --- a/pandas/core/strings/object_array.py +++ b/pandas/core/strings/object_array.py @@ -26,7 +26,7 @@ ) from pandas.core.dtypes.missing import isna -from pandas.core.strings.base import BaseStringArrayMethods +from .base import BaseStringArrayMethods class ObjectStringArrayMixin(BaseStringArrayMethods): diff --git a/pandas/core/tools/datetimes.py b/pandas/core/tools/datetimes.py index 18f9ece3e3812..56656cd5a3220 100644 --- a/pandas/core/tools/datetimes.py +++ b/pandas/core/tools/datetimes.py @@ -1025,6 +1025,6 @@ def to_time(arg, format=None, infer_time_format=False, errors="raise"): FutureWarning, stacklevel=2, ) - from pandas.core.tools.times import to_time + from .times import to_time return to_time(arg, format, infer_time_format, errors) diff --git a/pandas/core/window/__init__.py b/pandas/core/window/__init__.py index 8f42cd782c67f..f41cb652323f1 100644 --- a/pandas/core/window/__init__.py +++ b/pandas/core/window/__init__.py @@ -1,12 +1,12 @@ -from pandas.core.window.ewm import ( # noqa:F401 +from .ewm import ( # noqa:F401 ExponentialMovingWindow, ExponentialMovingWindowGroupby, ) -from pandas.core.window.expanding import ( # noqa:F401 +from .expanding import ( # noqa:F401 Expanding, ExpandingGroupby, ) -from pandas.core.window.rolling import ( # noqa:F401 +from .rolling import ( # noqa:F401 Rolling, RollingGroupby, Window, diff --git a/pandas/core/window/ewm.py b/pandas/core/window/ewm.py index 518119b63209e..4d5e26a1cd064 100644 --- a/pandas/core/window/ewm.py +++ b/pandas/core/window/ewm.py @@ -26,8 +26,9 @@ import pandas.core.common as common from pandas.core.util.numba_ import maybe_use_numba -from pandas.core.window.common import zsqrt -from pandas.core.window.doc import ( + +from .common import zsqrt +from .doc import ( _shared_docs, args_compat, create_section_header, @@ -36,13 +37,13 @@ template_returns, template_see_also, ) -from pandas.core.window.indexers import ( +from .indexers import ( BaseIndexer, ExponentialMovingWindowIndexer, GroupbyIndexer, ) -from pandas.core.window.numba_ import generate_numba_groupby_ewma_func -from pandas.core.window.rolling import ( +from .numba_ import generate_numba_groupby_ewma_func +from .rolling import ( BaseWindow, BaseWindowGroupby, ) diff --git a/pandas/core/window/expanding.py b/pandas/core/window/expanding.py index 64e092d853456..f4fef4c32afc0 100644 --- a/pandas/core/window/expanding.py +++ b/pandas/core/window/expanding.py @@ -14,7 +14,7 @@ from pandas.compat.numpy import function as nv from pandas.util._decorators import doc -from pandas.core.window.doc import ( +from .doc import ( _shared_docs, args_compat, create_section_header, @@ -26,12 +26,12 @@ window_agg_numba_parameters, window_apply_parameters, ) -from pandas.core.window.indexers import ( +from .indexers import ( BaseIndexer, ExpandingIndexer, GroupbyIndexer, ) -from pandas.core.window.rolling import ( +from .rolling import ( BaseWindowGroupby, RollingAndExpandingMixin, ) diff --git a/pandas/core/window/rolling.py b/pandas/core/window/rolling.py index 20bf0142b0855..d39fbde782f37 100644 --- a/pandas/core/window/rolling.py +++ b/pandas/core/window/rolling.py @@ -77,11 +77,12 @@ NUMBA_FUNC_CACHE, maybe_use_numba, ) -from pandas.core.window.common import ( + +from .common import ( flex_binary_moment, zsqrt, ) -from pandas.core.window.doc import ( +from .doc import ( _shared_docs, args_compat, create_section_header, @@ -94,13 +95,13 @@ window_agg_numba_parameters, window_apply_parameters, ) -from pandas.core.window.indexers import ( +from .indexers import ( BaseIndexer, FixedWindowIndexer, GroupbyIndexer, VariableWindowIndexer, ) -from pandas.core.window.numba_ import ( +from .numba_ import ( generate_manual_numpy_nan_agg_with_axis, generate_numba_apply_func, generate_numba_table_func, diff --git a/pandas/io/api.py b/pandas/io/api.py index 2241f491b5d48..699eb10e1996e 100644 --- a/pandas/io/api.py +++ b/pandas/io/api.py @@ -4,36 +4,36 @@ # flake8: noqa -from pandas.io.clipboards import read_clipboard -from pandas.io.excel import ( +from .clipboards import read_clipboard +from .excel import ( ExcelFile, ExcelWriter, read_excel, ) -from pandas.io.feather_format import read_feather -from pandas.io.gbq import read_gbq -from pandas.io.html import read_html -from pandas.io.json import read_json -from pandas.io.orc import read_orc -from pandas.io.parquet import read_parquet -from pandas.io.parsers import ( +from .feather_format import read_feather +from .gbq import read_gbq +from .html import read_html +from .json import read_json +from .orc import read_orc +from .parquet import read_parquet +from .parsers import ( read_csv, read_fwf, read_table, ) -from pandas.io.pickle import ( +from .pickle import ( read_pickle, to_pickle, ) -from pandas.io.pytables import ( +from .pytables import ( HDFStore, read_hdf, ) -from pandas.io.sas import read_sas -from pandas.io.spss import read_spss -from pandas.io.sql import ( +from .sas import read_sas +from .spss import read_spss +from .sql import ( read_sql, read_sql_query, read_sql_table, ) -from pandas.io.stata import read_stata +from .stata import read_stata diff --git a/pandas/io/clipboards.py b/pandas/io/clipboards.py index 54cb6b9f91137..00c9e73dffae9 100644 --- a/pandas/io/clipboards.py +++ b/pandas/io/clipboards.py @@ -35,8 +35,8 @@ def read_clipboard(sep=r"\s+", **kwargs): # pragma: no cover if encoding is not None and encoding.lower().replace("-", "") != "utf8": raise NotImplementedError("reading from clipboard only supports utf-8 encoding") - from pandas.io.clipboard import clipboard_get - from pandas.io.parsers import read_csv + from .clipboard import clipboard_get + from .parsers import read_csv text = clipboard_get() @@ -107,7 +107,7 @@ def to_clipboard(obj, excel=True, sep=None, **kwargs): # pragma: no cover if encoding is not None and encoding.lower().replace("-", "") != "utf8": raise ValueError("clipboard only supports utf-8 encoding") - from pandas.io.clipboard import clipboard_set + from .clipboard import clipboard_set if excel is None: excel = True diff --git a/pandas/io/excel/__init__.py b/pandas/io/excel/__init__.py index 854e2a1ec3a73..e9bef63447e7e 100644 --- a/pandas/io/excel/__init__.py +++ b/pandas/io/excel/__init__.py @@ -1,13 +1,13 @@ -from pandas.io.excel._base import ( +from ._base import ( ExcelFile, ExcelWriter, read_excel, ) -from pandas.io.excel._odswriter import ODSWriter as _ODSWriter -from pandas.io.excel._openpyxl import OpenpyxlWriter as _OpenpyxlWriter -from pandas.io.excel._util import register_writer -from pandas.io.excel._xlsxwriter import XlsxWriter as _XlsxWriter -from pandas.io.excel._xlwt import XlwtWriter as _XlwtWriter +from ._odswriter import ODSWriter as _ODSWriter +from ._openpyxl import OpenpyxlWriter as _OpenpyxlWriter +from ._util import register_writer +from ._xlsxwriter import XlsxWriter as _XlsxWriter +from ._xlwt import XlwtWriter as _XlwtWriter __all__ = ["read_excel", "ExcelWriter", "ExcelFile"] diff --git a/pandas/io/excel/_base.py b/pandas/io/excel/_base.py index 9ad589d4583c6..b73c38b8675dd 100644 --- a/pandas/io/excel/_base.py +++ b/pandas/io/excel/_base.py @@ -54,14 +54,15 @@ stringify_path, validate_header_arg, ) -from pandas.io.excel._util import ( +from pandas.io.parsers import TextParser + +from ._util import ( fill_mi_header, get_default_engine, get_writer, maybe_convert_usecols, pop_header_name, ) -from pandas.io.parsers import TextParser _read_excel_doc = ( """ @@ -1064,10 +1065,10 @@ class ExcelFile: This is not supported, switch to using ``openpyxl`` instead. """ - from pandas.io.excel._odfreader import ODFReader - from pandas.io.excel._openpyxl import OpenpyxlReader - from pandas.io.excel._pyxlsb import PyxlsbReader - from pandas.io.excel._xlrd import XlrdReader + from ._odfreader import ODFReader + from ._openpyxl import OpenpyxlReader + from ._pyxlsb import PyxlsbReader + from ._xlrd import XlrdReader _engines: Mapping[str, Any] = { "xlrd": XlrdReader, diff --git a/pandas/io/excel/_odfreader.py b/pandas/io/excel/_odfreader.py index c5aa4a061a05b..0bbbfe05fc508 100644 --- a/pandas/io/excel/_odfreader.py +++ b/pandas/io/excel/_odfreader.py @@ -14,7 +14,7 @@ import pandas as pd -from pandas.io.excel._base import BaseExcelReader +from ._base import BaseExcelReader class ODFReader(BaseExcelReader): diff --git a/pandas/io/excel/_odswriter.py b/pandas/io/excel/_odswriter.py index d00e600b4e5d4..1e03354e94436 100644 --- a/pandas/io/excel/_odswriter.py +++ b/pandas/io/excel/_odswriter.py @@ -13,10 +13,11 @@ import pandas._libs.json as json from pandas._typing import StorageOptions -from pandas.io.excel._base import ExcelWriter -from pandas.io.excel._util import validate_freeze_panes from pandas.io.formats.excel import ExcelCell +from ._base import ExcelWriter +from ._util import validate_freeze_panes + class ODSWriter(ExcelWriter): engine = "odf" diff --git a/pandas/io/excel/_openpyxl.py b/pandas/io/excel/_openpyxl.py index be2c9b919a5c3..9d1a8cde9761b 100644 --- a/pandas/io/excel/_openpyxl.py +++ b/pandas/io/excel/_openpyxl.py @@ -17,11 +17,11 @@ ) from pandas.compat._optional import import_optional_dependency -from pandas.io.excel._base import ( +from ._base import ( BaseExcelReader, ExcelWriter, ) -from pandas.io.excel._util import validate_freeze_panes +from ._util import validate_freeze_panes if TYPE_CHECKING: from openpyxl.descriptors.serialisable import Serialisable diff --git a/pandas/io/excel/_pyxlsb.py b/pandas/io/excel/_pyxlsb.py index 71ec189854f6d..0acbd1533ed86 100644 --- a/pandas/io/excel/_pyxlsb.py +++ b/pandas/io/excel/_pyxlsb.py @@ -7,7 +7,7 @@ ) from pandas.compat._optional import import_optional_dependency -from pandas.io.excel._base import BaseExcelReader +from ._base import BaseExcelReader class PyxlsbReader(BaseExcelReader): diff --git a/pandas/io/excel/_xlrd.py b/pandas/io/excel/_xlrd.py index 5eb88a694218a..6f29128c9ba63 100644 --- a/pandas/io/excel/_xlrd.py +++ b/pandas/io/excel/_xlrd.py @@ -5,7 +5,7 @@ from pandas._typing import StorageOptions from pandas.compat._optional import import_optional_dependency -from pandas.io.excel._base import BaseExcelReader +from ._base import BaseExcelReader class XlrdReader(BaseExcelReader): diff --git a/pandas/io/excel/_xlsxwriter.py b/pandas/io/excel/_xlsxwriter.py index 849572cff813a..04703bd5a6296 100644 --- a/pandas/io/excel/_xlsxwriter.py +++ b/pandas/io/excel/_xlsxwriter.py @@ -7,8 +7,8 @@ import pandas._libs.json as json from pandas._typing import StorageOptions -from pandas.io.excel._base import ExcelWriter -from pandas.io.excel._util import validate_freeze_panes +from ._base import ExcelWriter +from ._util import validate_freeze_panes class _XlsxStyler: diff --git a/pandas/io/excel/_xlwt.py b/pandas/io/excel/_xlwt.py index a8386242faf72..310cb28c629e9 100644 --- a/pandas/io/excel/_xlwt.py +++ b/pandas/io/excel/_xlwt.py @@ -6,8 +6,8 @@ import pandas._libs.json as json from pandas._typing import StorageOptions -from pandas.io.excel._base import ExcelWriter -from pandas.io.excel._util import validate_freeze_panes +from ._base import ExcelWriter +from ._util import validate_freeze_panes if TYPE_CHECKING: from xlwt import XFStyle diff --git a/pandas/io/feather_format.py b/pandas/io/feather_format.py index 3999f91a7b141..d35d50ebe941b 100644 --- a/pandas/io/feather_format.py +++ b/pandas/io/feather_format.py @@ -16,7 +16,7 @@ ) from pandas.core import generic -from pandas.io.common import get_handle +from .common import get_handle @doc(storage_options=generic._shared_docs["storage_options"]) diff --git a/pandas/io/formats/csvs.py b/pandas/io/formats/csvs.py index ca8340cfd0a24..bf4fe02077a5d 100644 --- a/pandas/io/formats/csvs.py +++ b/pandas/io/formats/csvs.py @@ -42,7 +42,7 @@ from pandas.io.common import get_handle if TYPE_CHECKING: - from pandas.io.formats.format import DataFrameFormatter + from .format import DataFrameFormatter class CSVFormatter: diff --git a/pandas/io/formats/excel.py b/pandas/io/formats/excel.py index 1ec2f7bfdd4be..3b8d8da671e01 100644 --- a/pandas/io/formats/excel.py +++ b/pandas/io/formats/excel.py @@ -42,13 +42,13 @@ from pandas.core import generic import pandas.core.common as com -from pandas.io.formats._color_data import CSS4_COLORS -from pandas.io.formats.css import ( +from ._color_data import CSS4_COLORS +from .css import ( CSSResolver, CSSWarning, ) -from pandas.io.formats.format import get_level_lengths -from pandas.io.formats.printing import pprint_thing +from .format import get_level_lengths +from .printing import pprint_thing class ExcelCell: diff --git a/pandas/io/formats/format.py b/pandas/io/formats/format.py index a1b6986079723..c80c0972b264a 100644 --- a/pandas/io/formats/format.py +++ b/pandas/io/formats/format.py @@ -98,7 +98,8 @@ from pandas.core.reshape.concat import concat from pandas.io.common import stringify_path -from pandas.io.formats.printing import ( + +from .printing import ( adjoin, justify, pprint_thing, @@ -968,7 +969,7 @@ def to_latex( """ Render a DataFrame to a LaTeX tabular/longtable environment output. """ - from pandas.io.formats.latex import LatexFormatter + from .latex import LatexFormatter latex_formatter = LatexFormatter( self.fmt, @@ -1016,7 +1017,7 @@ def to_html( render_links : bool, default False Convert URLs to HTML links. """ - from pandas.io.formats.html import ( + from .html import ( HTMLFormatter, NotebookFormatter, ) @@ -1051,7 +1052,7 @@ def to_string( line_width : int, optional Width to wrap a line in characters. """ - from pandas.io.formats.string import StringFormatter + from .string import StringFormatter string_formatter = StringFormatter(self.fmt, line_width=line_width) string = string_formatter.to_string() @@ -1079,7 +1080,7 @@ def to_csv( """ Render dataframe as comma-separated file. """ - from pandas.io.formats.csvs import CSVFormatter + from .csvs import CSVFormatter if path_or_buf is None: created_buffer = True diff --git a/pandas/io/formats/html.py b/pandas/io/formats/html.py index 6f4a6d87c7959..e7d3503049ab5 100644 --- a/pandas/io/formats/html.py +++ b/pandas/io/formats/html.py @@ -25,11 +25,12 @@ ) from pandas.io.common import is_url -from pandas.io.formats.format import ( + +from .format import ( DataFrameFormatter, get_level_lengths, ) -from pandas.io.formats.printing import pprint_thing +from .printing import pprint_thing class HTMLFormatter: diff --git a/pandas/io/formats/info.py b/pandas/io/formats/info.py index 2c1739998da08..7723b9d7a893f 100644 --- a/pandas/io/formats/info.py +++ b/pandas/io/formats/info.py @@ -26,8 +26,8 @@ from pandas.core.indexes.api import Index -from pandas.io.formats import format as fmt -from pandas.io.formats.printing import pprint_thing +from . import format as fmt +from .printing import pprint_thing if TYPE_CHECKING: from pandas.core.frame import DataFrame diff --git a/pandas/io/formats/latex.py b/pandas/io/formats/latex.py index fce0814e979a4..d8436727e6b33 100644 --- a/pandas/io/formats/latex.py +++ b/pandas/io/formats/latex.py @@ -19,7 +19,7 @@ from pandas.core.dtypes.generic import ABCMultiIndex -from pandas.io.formats.format import DataFrameFormatter +from .format import DataFrameFormatter def _split_into_full_short_caption( diff --git a/pandas/io/formats/printing.py b/pandas/io/formats/printing.py index acb17aee50b76..35f6d3e81bade 100644 --- a/pandas/io/formats/printing.py +++ b/pandas/io/formats/printing.py @@ -321,8 +321,8 @@ def format_object_summary( ------- summary string """ - from pandas.io.formats.console import get_console_size - from pandas.io.formats.format import get_adjustment + from .console import get_console_size + from .format import get_adjustment display_width, _ = get_console_size() if display_width is None: diff --git a/pandas/io/formats/string.py b/pandas/io/formats/string.py index 622001f280885..57b3f7ceb42e2 100644 --- a/pandas/io/formats/string.py +++ b/pandas/io/formats/string.py @@ -10,8 +10,8 @@ import numpy as np -from pandas.io.formats.format import DataFrameFormatter -from pandas.io.formats.printing import pprint_thing +from .format import DataFrameFormatter +from .printing import pprint_thing class StringFormatter: diff --git a/pandas/io/formats/style.py b/pandas/io/formats/style.py index 877e146fd8681..e832e2e413bd5 100644 --- a/pandas/io/formats/style.py +++ b/pandas/io/formats/style.py @@ -355,7 +355,7 @@ def to_excel( freeze_panes: Optional[Tuple[int, int]] = None, ) -> None: - from pandas.io.formats.excel import ExcelFormatter + from .excel import ExcelFormatter formatter = ExcelFormatter( self, diff --git a/pandas/io/html.py b/pandas/io/html.py index 7541e5d62fd1e..829b9c6ae063d 100644 --- a/pandas/io/html.py +++ b/pandas/io/html.py @@ -31,14 +31,14 @@ from pandas.core.construction import create_series_with_explicit_dtype from pandas.core.frame import DataFrame -from pandas.io.common import ( +from .common import ( is_url, stringify_path, urlopen, validate_header_arg, ) -from pandas.io.formats.printing import pprint_thing -from pandas.io.parsers import TextParser +from .formats.printing import pprint_thing +from .parsers import TextParser _IMPORTS = False _HAS_BS4 = False diff --git a/pandas/io/json/__init__.py b/pandas/io/json/__init__.py index 1de1abcdb9920..20c92de3ae2c8 100644 --- a/pandas/io/json/__init__.py +++ b/pandas/io/json/__init__.py @@ -1,14 +1,14 @@ -from pandas.io.json._json import ( +from ._json import ( dumps, loads, read_json, to_json, ) -from pandas.io.json._normalize import ( +from ._normalize import ( _json_normalize, json_normalize, ) -from pandas.io.json._table_schema import build_table_schema +from ._table_schema import build_table_schema __all__ = [ "dumps", diff --git a/pandas/io/json/_json.py b/pandas/io/json/_json.py index 635a493d03d61..3f6e038031590 100644 --- a/pandas/io/json/_json.py +++ b/pandas/io/json/_json.py @@ -61,12 +61,13 @@ is_url, stringify_path, ) -from pandas.io.json._normalize import convert_to_line_delimits -from pandas.io.json._table_schema import ( +from pandas.io.parsers.readers import validate_integer + +from ._normalize import convert_to_line_delimits +from ._table_schema import ( build_table_schema, parse_table_schema, ) -from pandas.io.parsers.readers import validate_integer loads = json.loads dumps = json.dumps diff --git a/pandas/io/orc.py b/pandas/io/orc.py index df76156aac9eb..8b0c9c00373ee 100644 --- a/pandas/io/orc.py +++ b/pandas/io/orc.py @@ -10,7 +10,7 @@ from pandas._typing import FilePathOrBuffer -from pandas.io.common import get_handle +from .common import get_handle if TYPE_CHECKING: from pandas import DataFrame diff --git a/pandas/io/parquet.py b/pandas/io/parquet.py index 183d753ddd60b..f026a0a8b2ae1 100644 --- a/pandas/io/parquet.py +++ b/pandas/io/parquet.py @@ -29,7 +29,7 @@ ) from pandas.core import generic -from pandas.io.common import ( +from .common import ( IOHandles, get_handle, is_fsspec_url, diff --git a/pandas/io/parsers/__init__.py b/pandas/io/parsers/__init__.py index ff11968db15f0..c7f9b328fc304 100644 --- a/pandas/io/parsers/__init__.py +++ b/pandas/io/parsers/__init__.py @@ -1,4 +1,4 @@ -from pandas.io.parsers.readers import ( +from .readers import ( TextFileReader, TextParser, read_csv, diff --git a/pandas/io/parsers/c_parser_wrapper.py b/pandas/io/parsers/c_parser_wrapper.py index 135e093cdc1e0..253b86c3a220c 100644 --- a/pandas/io/parsers/c_parser_wrapper.py +++ b/pandas/io/parsers/c_parser_wrapper.py @@ -3,7 +3,7 @@ from pandas.core.indexes.api import ensure_index_from_sequences -from pandas.io.parsers.base_parser import ( +from .base_parser import ( ParserBase, is_index_col, ) diff --git a/pandas/io/parsers/python_parser.py b/pandas/io/parsers/python_parser.py index 37f553c724c9e..8957016a997ae 100644 --- a/pandas/io/parsers/python_parser.py +++ b/pandas/io/parsers/python_parser.py @@ -30,7 +30,7 @@ from pandas.core.dtypes.common import is_integer -from pandas.io.parsers.base_parser import ( +from .base_parser import ( ParserBase, parser_defaults, ) diff --git a/pandas/io/parsers/readers.py b/pandas/io/parsers/readers.py index edfc7ee0b6258..633dde249f644 100644 --- a/pandas/io/parsers/readers.py +++ b/pandas/io/parsers/readers.py @@ -43,13 +43,14 @@ from pandas.core.indexes.api import RangeIndex from pandas.io.common import validate_header_arg -from pandas.io.parsers.base_parser import ( + +from .base_parser import ( ParserBase, is_index_col, parser_defaults, ) -from pandas.io.parsers.c_parser_wrapper import CParserWrapper -from pandas.io.parsers.python_parser import ( +from .c_parser_wrapper import CParserWrapper +from .python_parser import ( FixedWidthFieldParser, PythonParser, ) diff --git a/pandas/io/pickle.py b/pandas/io/pickle.py index 785afce9e0214..66612245679af 100644 --- a/pandas/io/pickle.py +++ b/pandas/io/pickle.py @@ -13,7 +13,7 @@ from pandas.core import generic -from pandas.io.common import get_handle +from .common import get_handle @doc(storage_options=generic._shared_docs["storage_options"]) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 88b444acfea62..d3bea85ff73fb 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -94,8 +94,8 @@ from pandas.core.indexes.api import ensure_index from pandas.core.internals import BlockManager -from pandas.io.common import stringify_path -from pandas.io.formats.printing import ( +from .common import stringify_path +from .formats.printing import ( adjoin, pprint_thing, ) diff --git a/pandas/io/sas/__init__.py b/pandas/io/sas/__init__.py index 8f81352e6aecb..fa6b29a1a3fcc 100644 --- a/pandas/io/sas/__init__.py +++ b/pandas/io/sas/__init__.py @@ -1 +1 @@ -from pandas.io.sas.sasreader import read_sas # noqa +from .sasreader import read_sas # noqa diff --git a/pandas/io/sas/sas7bdat.py b/pandas/io/sas/sas7bdat.py index 392dfa22ee67b..5faa9a221e608 100644 --- a/pandas/io/sas/sas7bdat.py +++ b/pandas/io/sas/sas7bdat.py @@ -37,9 +37,10 @@ from pandas import isna from pandas.io.common import get_handle -from pandas.io.sas._sas import Parser import pandas.io.sas.sas_constants as const -from pandas.io.sas.sasreader import ReaderBase + +from ._sas import Parser +from .sasreader import ReaderBase def _parse_datetime(sas_datetime: float, unit: str): diff --git a/pandas/io/sas/sas_xport.py b/pandas/io/sas/sas_xport.py index c71de542bbf77..ff854efc6bdd6 100644 --- a/pandas/io/sas/sas_xport.py +++ b/pandas/io/sas/sas_xport.py @@ -23,7 +23,8 @@ import pandas as pd from pandas.io.common import get_handle -from pandas.io.sas.sasreader import ReaderBase + +from .sasreader import ReaderBase _correct_line1 = ( "HEADER RECORD*******LIBRARY HEADER RECORD!!!!!!!" diff --git a/pandas/io/sas/sasreader.py b/pandas/io/sas/sasreader.py index 69da038929482..a92684a34e543 100644 --- a/pandas/io/sas/sasreader.py +++ b/pandas/io/sas/sasreader.py @@ -136,7 +136,7 @@ def read_sas( reader: ReaderBase if format.lower() == "xport": - from pandas.io.sas.sas_xport import XportReader + from .sas_xport import XportReader reader = XportReader( filepath_or_buffer, @@ -145,7 +145,7 @@ def read_sas( chunksize=chunksize, ) elif format.lower() == "sas7bdat": - from pandas.io.sas.sas7bdat import SAS7BDATReader + from .sas7bdat import SAS7BDATReader reader = SAS7BDATReader( filepath_or_buffer, diff --git a/pandas/io/spss.py b/pandas/io/spss.py index fb0ecee995463..ee5008e02dedf 100644 --- a/pandas/io/spss.py +++ b/pandas/io/spss.py @@ -11,7 +11,7 @@ from pandas.core.api import DataFrame -from pandas.io.common import stringify_path +from .common import stringify_path def read_spss( diff --git a/pandas/io/stata.py b/pandas/io/stata.py index 462c7b41f4271..b6985994e657b 100644 --- a/pandas/io/stata.py +++ b/pandas/io/stata.py @@ -68,7 +68,7 @@ from pandas.core.indexes.base import Index from pandas.core.series import Series -from pandas.io.common import get_handle +from .common import get_handle _version_error = ( "Version of given Stata file is {version}. pandas supports importing " diff --git a/pandas/plotting/__init__.py b/pandas/plotting/__init__.py index 55c861e384d67..ae85bb8e7334c 100644 --- a/pandas/plotting/__init__.py +++ b/pandas/plotting/__init__.py @@ -55,7 +55,7 @@ For the discussion about the API see https://github.com/pandas-dev/pandas/issues/26747. """ -from pandas.plotting._core import ( +from ._core import ( PlotAccessor, boxplot, boxplot_frame, @@ -63,7 +63,7 @@ hist_frame, hist_series, ) -from pandas.plotting._misc import ( +from ._misc import ( andrews_curves, autocorrelation_plot, bootstrap_plot, diff --git a/pandas/plotting/_matplotlib/__init__.py b/pandas/plotting/_matplotlib/__init__.py index b12ca6187c945..849aba95ae50b 100644 --- a/pandas/plotting/_matplotlib/__init__.py +++ b/pandas/plotting/_matplotlib/__init__.py @@ -6,17 +6,17 @@ Type, ) -from pandas.plotting._matplotlib.boxplot import ( +from .boxplot import ( BoxPlot, boxplot, boxplot_frame, boxplot_frame_groupby, ) -from pandas.plotting._matplotlib.converter import ( +from .converter import ( deregister, register, ) -from pandas.plotting._matplotlib.core import ( +from .core import ( AreaPlot, BarhPlot, BarPlot, @@ -25,13 +25,13 @@ PiePlot, ScatterPlot, ) -from pandas.plotting._matplotlib.hist import ( +from .hist import ( HistPlot, KdePlot, hist_frame, hist_series, ) -from pandas.plotting._matplotlib.misc import ( +from .misc import ( andrews_curves, autocorrelation_plot, bootstrap_plot, @@ -40,10 +40,10 @@ radviz, scatter_matrix, ) -from pandas.plotting._matplotlib.tools import table +from .tools import table if TYPE_CHECKING: - from pandas.plotting._matplotlib.core import MPLPlot + from .core import MPLPlot PLOT_CLASSES: Dict[str, Type[MPLPlot]] = { "line": LinePlot, diff --git a/pandas/plotting/_matplotlib/boxplot.py b/pandas/plotting/_matplotlib/boxplot.py index 1ec4efe7b4795..afb560ac18418 100644 --- a/pandas/plotting/_matplotlib/boxplot.py +++ b/pandas/plotting/_matplotlib/boxplot.py @@ -14,12 +14,13 @@ import pandas.core.common as com from pandas.io.formats.printing import pprint_thing -from pandas.plotting._matplotlib.core import ( + +from .core import ( LinePlot, MPLPlot, ) -from pandas.plotting._matplotlib.style import get_standard_colors -from pandas.plotting._matplotlib.tools import ( +from .style import get_standard_colors +from .tools import ( create_subplots, flatten_axes, maybe_adjust_figure, diff --git a/pandas/plotting/_matplotlib/core.py b/pandas/plotting/_matplotlib/core.py index 3b0d59501ba05..6fe0cacde8bc7 100644 --- a/pandas/plotting/_matplotlib/core.py +++ b/pandas/plotting/_matplotlib/core.py @@ -43,17 +43,18 @@ import pandas.core.common as com from pandas.io.formats.printing import pprint_thing -from pandas.plotting._matplotlib.compat import mpl_ge_3_0_0 -from pandas.plotting._matplotlib.converter import register_pandas_matplotlib_converters -from pandas.plotting._matplotlib.style import get_standard_colors -from pandas.plotting._matplotlib.timeseries import ( + +from .compat import mpl_ge_3_0_0 +from .converter import register_pandas_matplotlib_converters +from .style import get_standard_colors +from .timeseries import ( decorate_axes, format_dateaxis, maybe_convert_index, maybe_resample, use_dynamic_x, ) -from pandas.plotting._matplotlib.tools import ( +from .tools import ( create_subplots, flatten_axes, format_date_labels, diff --git a/pandas/plotting/_matplotlib/hist.py b/pandas/plotting/_matplotlib/hist.py index 3de467c77d289..13563406666e4 100644 --- a/pandas/plotting/_matplotlib/hist.py +++ b/pandas/plotting/_matplotlib/hist.py @@ -18,11 +18,12 @@ ) from pandas.io.formats.printing import pprint_thing -from pandas.plotting._matplotlib.core import ( + +from .core import ( LinePlot, MPLPlot, ) -from pandas.plotting._matplotlib.tools import ( +from .tools import ( create_subplots, flatten_axes, maybe_adjust_figure, diff --git a/pandas/plotting/_matplotlib/misc.py b/pandas/plotting/_matplotlib/misc.py index 3d5f4af72db6c..054f695c77ab0 100644 --- a/pandas/plotting/_matplotlib/misc.py +++ b/pandas/plotting/_matplotlib/misc.py @@ -17,8 +17,9 @@ from pandas.core.dtypes.missing import notna from pandas.io.formats.printing import pprint_thing -from pandas.plotting._matplotlib.style import get_standard_colors -from pandas.plotting._matplotlib.tools import ( + +from .style import get_standard_colors +from .tools import ( create_subplots, do_adjust_figure, maybe_adjust_figure, diff --git a/pandas/plotting/_matplotlib/timeseries.py b/pandas/plotting/_matplotlib/timeseries.py index 8374988708701..04e4a74ca61af 100644 --- a/pandas/plotting/_matplotlib/timeseries.py +++ b/pandas/plotting/_matplotlib/timeseries.py @@ -26,17 +26,18 @@ ) from pandas.io.formats.printing import pprint_thing -from pandas.plotting._matplotlib.converter import ( - TimeSeries_DateFormatter, - TimeSeries_DateLocator, - TimeSeries_TimedeltaFormatter, -) from pandas.tseries.frequencies import ( get_period_alias, is_subperiod, is_superperiod, ) +from .converter import ( + TimeSeries_DateFormatter, + TimeSeries_DateLocator, + TimeSeries_TimedeltaFormatter, +) + if TYPE_CHECKING: from matplotlib.axes import Axes @@ -136,7 +137,7 @@ def _replot_ax(ax: Axes, freq, kwargs): # for tsplot if isinstance(plotf, str): - from pandas.plotting._matplotlib import PLOT_CLASSES + from . import PLOT_CLASSES plotf = PLOT_CLASSES[plotf]._plot diff --git a/pandas/plotting/_matplotlib/tools.py b/pandas/plotting/_matplotlib/tools.py index 500d570835493..88e1257d813f5 100644 --- a/pandas/plotting/_matplotlib/tools.py +++ b/pandas/plotting/_matplotlib/tools.py @@ -25,7 +25,7 @@ ABCSeries, ) -from pandas.plotting._matplotlib import compat +from . import compat if TYPE_CHECKING: from matplotlib.axes import Axes diff --git a/pandas/plotting/_misc.py b/pandas/plotting/_misc.py index e0a860b9d8709..dae49ddc120de 100644 --- a/pandas/plotting/_misc.py +++ b/pandas/plotting/_misc.py @@ -1,6 +1,6 @@ from contextlib import contextmanager -from pandas.plotting._core import _get_plot_backend +from ._core import _get_plot_backend def table(ax, data, rowLabels=None, colLabels=None, **kwargs): diff --git a/pandas/testing.py b/pandas/testing.py index 841b55df48556..237ca56eca9e5 100644 --- a/pandas/testing.py +++ b/pandas/testing.py @@ -3,7 +3,7 @@ """ -from pandas._testing import ( +from ._testing import ( assert_extension_array_equal, assert_frame_equal, assert_index_equal, diff --git a/pandas/tests/api/test_types.py b/pandas/tests/api/test_types.py index 71804bded3e44..31423c03dee34 100644 --- a/pandas/tests/api/test_types.py +++ b/pandas/tests/api/test_types.py @@ -1,6 +1,7 @@ import pandas._testing as tm from pandas.api import types -from pandas.tests.api.test_api import Base + +from .test_api import Base class TestTypes(Base): diff --git a/pandas/tests/arithmetic/test_datetime64.py b/pandas/tests/arithmetic/test_datetime64.py index f28407df24508..fa6e17674d3cb 100644 --- a/pandas/tests/arithmetic/test_datetime64.py +++ b/pandas/tests/arithmetic/test_datetime64.py @@ -40,7 +40,8 @@ TimedeltaArray, ) from pandas.core.ops import roperator -from pandas.tests.arithmetic.common import ( + +from .common import ( assert_invalid_addsub_type, assert_invalid_comparison, get_upcast_box, diff --git a/pandas/tests/arithmetic/test_period.py b/pandas/tests/arithmetic/test_period.py index f0c03fee50b39..71fcbb2d83ccc 100644 --- a/pandas/tests/arithmetic/test_period.py +++ b/pandas/tests/arithmetic/test_period.py @@ -25,7 +25,8 @@ import pandas._testing as tm from pandas.core import ops from pandas.core.arrays import TimedeltaArray -from pandas.tests.arithmetic.common import assert_invalid_comparison + +from .common import assert_invalid_comparison # ------------------------------------------------------------------ # Comparisons diff --git a/pandas/tests/arithmetic/test_timedelta64.py b/pandas/tests/arithmetic/test_timedelta64.py index 3df54f769a6e4..fc06c567aee52 100644 --- a/pandas/tests/arithmetic/test_timedelta64.py +++ b/pandas/tests/arithmetic/test_timedelta64.py @@ -26,7 +26,8 @@ timedelta_range, ) import pandas._testing as tm -from pandas.tests.arithmetic.common import ( + +from .common import ( assert_invalid_addsub_type, assert_invalid_comparison, get_upcast_box, diff --git a/pandas/tests/arrays/categorical/test_api.py b/pandas/tests/arrays/categorical/test_api.py index a6dea639488a2..a2140599c6225 100644 --- a/pandas/tests/arrays/categorical/test_api.py +++ b/pandas/tests/arrays/categorical/test_api.py @@ -12,7 +12,8 @@ ) import pandas._testing as tm from pandas.core.arrays.categorical import recode_for_categories -from pandas.tests.arrays.categorical.common import TestCategorical + +from .common import TestCategorical class TestCategoricalAPI: diff --git a/pandas/tests/arrays/categorical/test_indexing.py b/pandas/tests/arrays/categorical/test_indexing.py index 5b31776301f7b..793e5ed9ce61d 100644 --- a/pandas/tests/arrays/categorical/test_indexing.py +++ b/pandas/tests/arrays/categorical/test_indexing.py @@ -14,7 +14,8 @@ ) import pandas._testing as tm import pandas.core.common as com -from pandas.tests.arrays.categorical.common import TestCategorical + +from .common import TestCategorical class TestCategoricalIndexingWithFactor(TestCategorical): diff --git a/pandas/tests/arrays/categorical/test_operators.py b/pandas/tests/arrays/categorical/test_operators.py index 4a00df2d783cf..463897fb38618 100644 --- a/pandas/tests/arrays/categorical/test_operators.py +++ b/pandas/tests/arrays/categorical/test_operators.py @@ -12,7 +12,8 @@ date_range, ) import pandas._testing as tm -from pandas.tests.arrays.categorical.common import TestCategorical + +from .common import TestCategorical class TestCategoricalOpsWithFactor(TestCategorical): diff --git a/pandas/tests/arrays/categorical/test_repr.py b/pandas/tests/arrays/categorical/test_repr.py index e23fbb16190ea..1e5e79433fe83 100644 --- a/pandas/tests/arrays/categorical/test_repr.py +++ b/pandas/tests/arrays/categorical/test_repr.py @@ -9,7 +9,8 @@ period_range, timedelta_range, ) -from pandas.tests.arrays.categorical.common import TestCategorical + +from .common import TestCategorical class TestCategoricalReprWithFactor(TestCategorical): diff --git a/pandas/tests/base/test_fillna.py b/pandas/tests/base/test_fillna.py index c6f58af4c5c3a..1e7c83da6f670 100644 --- a/pandas/tests/base/test_fillna.py +++ b/pandas/tests/base/test_fillna.py @@ -13,7 +13,8 @@ from pandas import Index import pandas._testing as tm -from pandas.tests.base.common import allow_na_ops + +from .common import allow_na_ops def test_fillna(index_or_series_obj): diff --git a/pandas/tests/base/test_unique.py b/pandas/tests/base/test_unique.py index 4aefa4be176fb..c9f52c409fa57 100644 --- a/pandas/tests/base/test_unique.py +++ b/pandas/tests/base/test_unique.py @@ -10,7 +10,8 @@ import pandas as pd import pandas._testing as tm -from pandas.tests.base.common import allow_na_ops + +from .common import allow_na_ops def test_unique(index_or_series_obj): diff --git a/pandas/tests/base/test_value_counts.py b/pandas/tests/base/test_value_counts.py index 4151781f0dbf5..db24694e4dc51 100644 --- a/pandas/tests/base/test_value_counts.py +++ b/pandas/tests/base/test_value_counts.py @@ -21,7 +21,8 @@ TimedeltaIndex, ) import pandas._testing as tm -from pandas.tests.base.common import allow_na_ops + +from .common import allow_na_ops def test_value_counts(index_or_series_obj): diff --git a/pandas/tests/extension/arrow/test_bool.py b/pandas/tests/extension/arrow/test_bool.py index 829be279b45d3..d513c175e728b 100644 --- a/pandas/tests/extension/arrow/test_bool.py +++ b/pandas/tests/extension/arrow/test_bool.py @@ -8,7 +8,7 @@ pytest.importorskip("pyarrow", minversion="0.13.0") -from pandas.tests.extension.arrow.arrays import ( # isort:skip +from .arrays import ( # isort:skip ArrowBoolArray, ArrowBoolDtype, ) diff --git a/pandas/tests/extension/arrow/test_string.py b/pandas/tests/extension/arrow/test_string.py index 23a07b2031bf5..abd5c1f386dc5 100644 --- a/pandas/tests/extension/arrow/test_string.py +++ b/pandas/tests/extension/arrow/test_string.py @@ -4,7 +4,7 @@ pytest.importorskip("pyarrow", minversion="0.13.0") -from pandas.tests.extension.arrow.arrays import ArrowStringDtype # isort:skip +from .arrays import ArrowStringDtype # isort:skip def test_constructor_from_list(): diff --git a/pandas/tests/extension/arrow/test_timestamp.py b/pandas/tests/extension/arrow/test_timestamp.py index 819e5549d05ae..cd6f49f9a8e05 100644 --- a/pandas/tests/extension/arrow/test_timestamp.py +++ b/pandas/tests/extension/arrow/test_timestamp.py @@ -15,7 +15,7 @@ import pyarrow as pa # isort:skip -from pandas.tests.extension.arrow.arrays import ArrowExtensionArray # isort:skip +from .arrays import ArrowExtensionArray # isort:skip @register_extension_dtype diff --git a/pandas/tests/extension/base/__init__.py b/pandas/tests/extension/base/__init__.py index 9cf3bdab40d0b..323cb843b2d74 100644 --- a/pandas/tests/extension/base/__init__.py +++ b/pandas/tests/extension/base/__init__.py @@ -41,26 +41,26 @@ class TestMyDtype(BaseDtypeTests): ``assert_series_equal`` on your base test class. """ -from pandas.tests.extension.base.casting import BaseCastingTests # noqa -from pandas.tests.extension.base.constructors import BaseConstructorsTests # noqa -from pandas.tests.extension.base.dtype import BaseDtypeTests # noqa -from pandas.tests.extension.base.getitem import BaseGetitemTests # noqa -from pandas.tests.extension.base.groupby import BaseGroupbyTests # noqa -from pandas.tests.extension.base.interface import BaseInterfaceTests # noqa -from pandas.tests.extension.base.io import BaseParsingTests # noqa -from pandas.tests.extension.base.methods import BaseMethodsTests # noqa -from pandas.tests.extension.base.missing import BaseMissingTests # noqa -from pandas.tests.extension.base.ops import ( # noqa +from .casting import BaseCastingTests # noqa +from .constructors import BaseConstructorsTests # noqa +from .dtype import BaseDtypeTests # noqa +from .getitem import BaseGetitemTests # noqa +from .groupby import BaseGroupbyTests # noqa +from .interface import BaseInterfaceTests # noqa +from .io import BaseParsingTests # noqa +from .methods import BaseMethodsTests # noqa +from .missing import BaseMissingTests # noqa +from .ops import ( # noqa BaseArithmeticOpsTests, BaseComparisonOpsTests, BaseOpsUtil, BaseUnaryOpsTests, ) -from pandas.tests.extension.base.printing import BasePrintingTests # noqa -from pandas.tests.extension.base.reduce import ( # noqa +from .printing import BasePrintingTests # noqa +from .reduce import ( # noqa BaseBooleanReduceTests, BaseNoReduceTests, BaseNumericReduceTests, ) -from pandas.tests.extension.base.reshaping import BaseReshapingTests # noqa -from pandas.tests.extension.base.setitem import BaseSetitemTests # noqa +from .reshaping import BaseReshapingTests # noqa +from .setitem import BaseSetitemTests # noqa diff --git a/pandas/tests/extension/base/casting.py b/pandas/tests/extension/base/casting.py index 0b79a5368a542..039b42210224e 100644 --- a/pandas/tests/extension/base/casting.py +++ b/pandas/tests/extension/base/casting.py @@ -3,7 +3,8 @@ import pandas as pd from pandas.core.internals import ObjectBlock -from pandas.tests.extension.base.base import BaseExtensionTests + +from .base import BaseExtensionTests class BaseCastingTests(BaseExtensionTests): diff --git a/pandas/tests/extension/base/constructors.py b/pandas/tests/extension/base/constructors.py index 6f0d8d16a0224..9dbfd2a5589c0 100644 --- a/pandas/tests/extension/base/constructors.py +++ b/pandas/tests/extension/base/constructors.py @@ -3,7 +3,8 @@ import pandas as pd from pandas.core.internals import ExtensionBlock -from pandas.tests.extension.base.base import BaseExtensionTests + +from .base import BaseExtensionTests class BaseConstructorsTests(BaseExtensionTests): diff --git a/pandas/tests/extension/base/dtype.py b/pandas/tests/extension/base/dtype.py index ea4443010c6a6..96145e4fb78a7 100644 --- a/pandas/tests/extension/base/dtype.py +++ b/pandas/tests/extension/base/dtype.py @@ -9,7 +9,8 @@ is_object_dtype, is_string_dtype, ) -from pandas.tests.extension.base.base import BaseExtensionTests + +from .base import BaseExtensionTests class BaseDtypeTests(BaseExtensionTests): diff --git a/pandas/tests/extension/base/getitem.py b/pandas/tests/extension/base/getitem.py index 286ed9c736f31..bfd6da0fc864d 100644 --- a/pandas/tests/extension/base/getitem.py +++ b/pandas/tests/extension/base/getitem.py @@ -2,7 +2,8 @@ import pytest import pandas as pd -from pandas.tests.extension.base.base import BaseExtensionTests + +from .base import BaseExtensionTests class BaseGetitemTests(BaseExtensionTests): diff --git a/pandas/tests/extension/base/groupby.py b/pandas/tests/extension/base/groupby.py index 30b115b9dba6f..c81304695f353 100644 --- a/pandas/tests/extension/base/groupby.py +++ b/pandas/tests/extension/base/groupby.py @@ -2,7 +2,8 @@ import pandas as pd import pandas._testing as tm -from pandas.tests.extension.base.base import BaseExtensionTests + +from .base import BaseExtensionTests class BaseGroupbyTests(BaseExtensionTests): diff --git a/pandas/tests/extension/base/interface.py b/pandas/tests/extension/base/interface.py index 05a28f20b956a..6a4ff68b4580f 100644 --- a/pandas/tests/extension/base/interface.py +++ b/pandas/tests/extension/base/interface.py @@ -5,7 +5,8 @@ import pandas as pd import pandas._testing as tm -from pandas.tests.extension.base.base import BaseExtensionTests + +from .base import BaseExtensionTests class BaseInterfaceTests(BaseExtensionTests): diff --git a/pandas/tests/extension/base/io.py b/pandas/tests/extension/base/io.py index a8c25db3181d0..3de752a8c682a 100644 --- a/pandas/tests/extension/base/io.py +++ b/pandas/tests/extension/base/io.py @@ -4,7 +4,8 @@ import pytest import pandas as pd -from pandas.tests.extension.base.base import BaseExtensionTests + +from .base import BaseExtensionTests class BaseParsingTests(BaseExtensionTests): diff --git a/pandas/tests/extension/base/methods.py b/pandas/tests/extension/base/methods.py index bf5e9fe009cd1..67348cfe57c2d 100644 --- a/pandas/tests/extension/base/methods.py +++ b/pandas/tests/extension/base/methods.py @@ -9,7 +9,8 @@ import pandas as pd import pandas._testing as tm from pandas.core.sorting import nargsort -from pandas.tests.extension.base.base import BaseExtensionTests + +from .base import BaseExtensionTests class BaseMethodsTests(BaseExtensionTests): diff --git a/pandas/tests/extension/base/missing.py b/pandas/tests/extension/base/missing.py index 0cf03533915f2..a5969ef961bab 100644 --- a/pandas/tests/extension/base/missing.py +++ b/pandas/tests/extension/base/missing.py @@ -2,7 +2,8 @@ import pandas as pd import pandas._testing as tm -from pandas.tests.extension.base.base import BaseExtensionTests + +from .base import BaseExtensionTests class BaseMissingTests(BaseExtensionTests): diff --git a/pandas/tests/extension/base/ops.py b/pandas/tests/extension/base/ops.py index 2a27f670fa046..9b1681094cef5 100644 --- a/pandas/tests/extension/base/ops.py +++ b/pandas/tests/extension/base/ops.py @@ -8,7 +8,8 @@ import pandas as pd import pandas._testing as tm from pandas.core import ops -from pandas.tests.extension.base.base import BaseExtensionTests + +from .base import BaseExtensionTests class BaseOpsUtil(BaseExtensionTests): diff --git a/pandas/tests/extension/base/printing.py b/pandas/tests/extension/base/printing.py index eab75be66080f..ad34a83c7cf71 100644 --- a/pandas/tests/extension/base/printing.py +++ b/pandas/tests/extension/base/printing.py @@ -3,7 +3,8 @@ import pytest import pandas as pd -from pandas.tests.extension.base.base import BaseExtensionTests + +from .base import BaseExtensionTests class BasePrintingTests(BaseExtensionTests): diff --git a/pandas/tests/extension/base/reduce.py b/pandas/tests/extension/base/reduce.py index 0f7bd59411eb5..55f8aca1b8ae0 100644 --- a/pandas/tests/extension/base/reduce.py +++ b/pandas/tests/extension/base/reduce.py @@ -4,7 +4,8 @@ import pandas as pd import pandas._testing as tm -from pandas.tests.extension.base.base import BaseExtensionTests + +from .base import BaseExtensionTests class BaseReduceTests(BaseExtensionTests): diff --git a/pandas/tests/extension/base/reshaping.py b/pandas/tests/extension/base/reshaping.py index 18f6084f989dc..44e3fc1eb56d8 100644 --- a/pandas/tests/extension/base/reshaping.py +++ b/pandas/tests/extension/base/reshaping.py @@ -5,7 +5,8 @@ import pandas as pd from pandas.core.internals import ExtensionBlock -from pandas.tests.extension.base.base import BaseExtensionTests + +from .base import BaseExtensionTests class BaseReshapingTests(BaseExtensionTests): diff --git a/pandas/tests/extension/base/setitem.py b/pandas/tests/extension/base/setitem.py index 16b9b8e8efdea..9ec842d801919 100644 --- a/pandas/tests/extension/base/setitem.py +++ b/pandas/tests/extension/base/setitem.py @@ -3,7 +3,8 @@ import pandas as pd import pandas._testing as tm -from pandas.tests.extension.base.base import BaseExtensionTests + +from .base import BaseExtensionTests class BaseSetitemTests(BaseExtensionTests): diff --git a/pandas/tests/extension/decimal/__init__.py b/pandas/tests/extension/decimal/__init__.py index 34727b43a7b0f..ab8f8f3e91c19 100644 --- a/pandas/tests/extension/decimal/__init__.py +++ b/pandas/tests/extension/decimal/__init__.py @@ -1,4 +1,4 @@ -from pandas.tests.extension.decimal.array import ( +from .array import ( DecimalArray, DecimalDtype, make_data, diff --git a/pandas/tests/extension/decimal/test_decimal.py b/pandas/tests/extension/decimal/test_decimal.py index 23b1ce250a5e5..9d4b2d230a802 100644 --- a/pandas/tests/extension/decimal/test_decimal.py +++ b/pandas/tests/extension/decimal/test_decimal.py @@ -9,7 +9,8 @@ import pandas._testing as tm from pandas.api.types import infer_dtype from pandas.tests.extension import base -from pandas.tests.extension.decimal.array import ( + +from .array import ( DecimalArray, DecimalDtype, make_data, diff --git a/pandas/tests/extension/json/__init__.py b/pandas/tests/extension/json/__init__.py index 7ebfd54a5b0d6..8de9f99d8fb06 100644 --- a/pandas/tests/extension/json/__init__.py +++ b/pandas/tests/extension/json/__init__.py @@ -1,4 +1,4 @@ -from pandas.tests.extension.json.array import ( +from .array import ( JSONArray, JSONDtype, make_data, diff --git a/pandas/tests/extension/json/test_json.py b/pandas/tests/extension/json/test_json.py index b8fa158083327..5605f343916f0 100644 --- a/pandas/tests/extension/json/test_json.py +++ b/pandas/tests/extension/json/test_json.py @@ -6,7 +6,8 @@ import pandas as pd import pandas._testing as tm from pandas.tests.extension import base -from pandas.tests.extension.json.array import ( + +from .array import ( JSONArray, JSONDtype, make_data, diff --git a/pandas/tests/extension/list/__init__.py b/pandas/tests/extension/list/__init__.py index 0f3f2f3537788..acae7322a80a8 100644 --- a/pandas/tests/extension/list/__init__.py +++ b/pandas/tests/extension/list/__init__.py @@ -1,4 +1,4 @@ -from pandas.tests.extension.list.array import ( +from .array import ( ListArray, ListDtype, make_data, diff --git a/pandas/tests/extension/list/test_list.py b/pandas/tests/extension/list/test_list.py index 295f08679c3eb..32e5207a17dc6 100644 --- a/pandas/tests/extension/list/test_list.py +++ b/pandas/tests/extension/list/test_list.py @@ -1,7 +1,8 @@ import pytest import pandas as pd -from pandas.tests.extension.list.array import ( + +from .array import ( ListArray, ListDtype, make_data, diff --git a/pandas/tests/extension/test_boolean.py b/pandas/tests/extension/test_boolean.py index 3ef3beaa9c1b1..0f235143be5d9 100644 --- a/pandas/tests/extension/test_boolean.py +++ b/pandas/tests/extension/test_boolean.py @@ -19,7 +19,8 @@ import pandas as pd import pandas._testing as tm from pandas.core.arrays.boolean import BooleanDtype -from pandas.tests.extension import base + +from . import base def make_data(): diff --git a/pandas/tests/extension/test_categorical.py b/pandas/tests/extension/test_categorical.py index 3f1f2c02c79f7..6c184256d7435 100644 --- a/pandas/tests/extension/test_categorical.py +++ b/pandas/tests/extension/test_categorical.py @@ -26,7 +26,8 @@ ) import pandas._testing as tm from pandas.api.types import CategoricalDtype -from pandas.tests.extension import base + +from . import base def make_data(): diff --git a/pandas/tests/extension/test_datetime.py b/pandas/tests/extension/test_datetime.py index 6c5963402b3d7..0ac416a2b6b6a 100644 --- a/pandas/tests/extension/test_datetime.py +++ b/pandas/tests/extension/test_datetime.py @@ -20,7 +20,8 @@ import pandas as pd from pandas.core.arrays import DatetimeArray -from pandas.tests.extension import base + +from . import base @pytest.fixture(params=["US/Central"]) diff --git a/pandas/tests/extension/test_floating.py b/pandas/tests/extension/test_floating.py index 617dfc694741e..b96717995b359 100644 --- a/pandas/tests/extension/test_floating.py +++ b/pandas/tests/extension/test_floating.py @@ -25,7 +25,8 @@ Float32Dtype, Float64Dtype, ) -from pandas.tests.extension import base + +from . import base def make_data(): diff --git a/pandas/tests/extension/test_integer.py b/pandas/tests/extension/test_integer.py index 2305edc1e1327..4f755ff01a5c0 100644 --- a/pandas/tests/extension/test_integer.py +++ b/pandas/tests/extension/test_integer.py @@ -32,7 +32,8 @@ UInt32Dtype, UInt64Dtype, ) -from pandas.tests.extension import base + +from . import base def make_data(): diff --git a/pandas/tests/extension/test_interval.py b/pandas/tests/extension/test_interval.py index 1bc06ee4b6397..1f53916ae0007 100644 --- a/pandas/tests/extension/test_interval.py +++ b/pandas/tests/extension/test_interval.py @@ -20,7 +20,8 @@ from pandas import Interval from pandas.core.arrays import IntervalArray -from pandas.tests.extension import base + +from . import base def make_data(): diff --git a/pandas/tests/extension/test_numpy.py b/pandas/tests/extension/test_numpy.py index 17f29e02a2883..e4812c5b3afd5 100644 --- a/pandas/tests/extension/test_numpy.py +++ b/pandas/tests/extension/test_numpy.py @@ -24,7 +24,8 @@ import pandas as pd import pandas._testing as tm from pandas.core.arrays.numpy_ import PandasArray -from pandas.tests.extension import base + +from . import base @pytest.fixture(params=["float", "object"]) diff --git a/pandas/tests/extension/test_period.py b/pandas/tests/extension/test_period.py index bbb991259ac29..ae4a287eb3a6f 100644 --- a/pandas/tests/extension/test_period.py +++ b/pandas/tests/extension/test_period.py @@ -22,7 +22,8 @@ import pandas as pd from pandas.core.arrays import PeriodArray -from pandas.tests.extension import base + +from . import base @pytest.fixture diff --git a/pandas/tests/extension/test_sparse.py b/pandas/tests/extension/test_sparse.py index 067fada5edcae..bb3c25282ac80 100644 --- a/pandas/tests/extension/test_sparse.py +++ b/pandas/tests/extension/test_sparse.py @@ -28,7 +28,8 @@ from pandas import SparseDtype import pandas._testing as tm from pandas.arrays import SparseArray -from pandas.tests.extension import base + +from . import base def make_data(fill_value): diff --git a/pandas/tests/extension/test_string.py b/pandas/tests/extension/test_string.py index d0a3ef17afdbc..1e8ad22c0f7d7 100644 --- a/pandas/tests/extension/test_string.py +++ b/pandas/tests/extension/test_string.py @@ -23,7 +23,8 @@ import pandas as pd from pandas.core.arrays.string_ import StringDtype from pandas.core.arrays.string_arrow import ArrowStringDtype -from pandas.tests.extension import base + +from . import base @pytest.fixture( diff --git a/pandas/tests/frame/test_arithmetic.py b/pandas/tests/frame/test_arithmetic.py index 44b6d44ee6275..f72fd2248847d 100644 --- a/pandas/tests/frame/test_arithmetic.py +++ b/pandas/tests/frame/test_arithmetic.py @@ -19,7 +19,8 @@ _MIN_ELEMENTS, NUMEXPR_INSTALLED, ) -from pandas.tests.frame.common import ( + +from .common import ( _check_mixed_float, _check_mixed_int, ) diff --git a/pandas/tests/generic/test_frame.py b/pandas/tests/generic/test_frame.py index 49a1dc8bbb21c..d80930050f124 100644 --- a/pandas/tests/generic/test_frame.py +++ b/pandas/tests/generic/test_frame.py @@ -12,7 +12,8 @@ date_range, ) import pandas._testing as tm -from pandas.tests.generic.test_generic import Generic + +from .test_generic import Generic class TestDataFrame(Generic): diff --git a/pandas/tests/generic/test_series.py b/pandas/tests/generic/test_series.py index 823ce7435f229..530515c3fc162 100644 --- a/pandas/tests/generic/test_series.py +++ b/pandas/tests/generic/test_series.py @@ -10,7 +10,8 @@ date_range, ) import pandas._testing as tm -from pandas.tests.generic.test_generic import Generic + +from .test_generic import Generic class TestSeries(Generic): diff --git a/pandas/tests/indexes/datetimelike.py b/pandas/tests/indexes/datetimelike.py index 4c8ab27d2c824..33fba672e9dc6 100644 --- a/pandas/tests/indexes/datetimelike.py +++ b/pandas/tests/indexes/datetimelike.py @@ -5,7 +5,8 @@ import pandas as pd import pandas._testing as tm -from pandas.tests.indexes.common import Base + +from .common import Base class DatetimeLike(Base): diff --git a/pandas/tests/indexes/datetimes/test_date_range.py b/pandas/tests/indexes/datetimes/test_date_range.py index 9399945bf1913..91933e9266703 100644 --- a/pandas/tests/indexes/datetimes/test_date_range.py +++ b/pandas/tests/indexes/datetimes/test_date_range.py @@ -714,7 +714,7 @@ def test_date_range_timezone_str_argument(self, tzstr): tm.assert_index_equal(result, expected) def test_date_range_with_fixedoffset_noname(self): - from pandas.tests.indexes.datetimes.test_timezones import fixed_off_no_name + from .test_timezones import fixed_off_no_name off = fixed_off_no_name start = datetime(2012, 3, 11, 5, 0, 0, tzinfo=off) diff --git a/pandas/tests/indexes/test_base.py b/pandas/tests/indexes/test_base.py index 127f0432efa01..369ce352f5559 100644 --- a/pandas/tests/indexes/test_base.py +++ b/pandas/tests/indexes/test_base.py @@ -43,7 +43,8 @@ ensure_index, ensure_index_from_sequences, ) -from pandas.tests.indexes.common import Base + +from .common import Base class TestIndex(Base): diff --git a/pandas/tests/indexes/test_numeric.py b/pandas/tests/indexes/test_numeric.py index 74c961418176b..e3e63814edb93 100644 --- a/pandas/tests/indexes/test_numeric.py +++ b/pandas/tests/indexes/test_numeric.py @@ -15,7 +15,8 @@ UInt64Index, ) import pandas._testing as tm -from pandas.tests.indexes.common import Base + +from .common import Base class TestArithmetic: diff --git a/pandas/tests/indexing/test_iloc.py b/pandas/tests/indexing/test_iloc.py index 881e47f4f5fe2..8309bd7dc068b 100644 --- a/pandas/tests/indexing/test_iloc.py +++ b/pandas/tests/indexing/test_iloc.py @@ -25,7 +25,8 @@ import pandas._testing as tm from pandas.api.types import is_scalar from pandas.core.indexing import IndexingError -from pandas.tests.indexing.common import Base + +from .common import Base # We pass through the error message from numpy _slice_iloc_msg = re.escape( diff --git a/pandas/tests/indexing/test_indexing.py b/pandas/tests/indexing/test_indexing.py index 842394ac75f3e..272788748ca09 100644 --- a/pandas/tests/indexing/test_indexing.py +++ b/pandas/tests/indexing/test_indexing.py @@ -23,8 +23,9 @@ timedelta_range, ) import pandas._testing as tm -from pandas.tests.indexing.common import _mklbl -from pandas.tests.indexing.test_floats import gen_obj + +from .common import _mklbl +from .test_floats import gen_obj # ------------------------------------------------------------------------ # Indexing test cases diff --git a/pandas/tests/indexing/test_loc.py b/pandas/tests/indexing/test_loc.py index 55a979859a12a..b0722d1b83383 100644 --- a/pandas/tests/indexing/test_loc.py +++ b/pandas/tests/indexing/test_loc.py @@ -33,7 +33,8 @@ ) import pandas._testing as tm from pandas.api.types import is_scalar -from pandas.tests.indexing.common import Base + +from .common import Base class TestLoc(Base): diff --git a/pandas/tests/indexing/test_scalar.py b/pandas/tests/indexing/test_scalar.py index 39611bce2b4fa..2d96912631b56 100644 --- a/pandas/tests/indexing/test_scalar.py +++ b/pandas/tests/indexing/test_scalar.py @@ -15,7 +15,8 @@ date_range, ) import pandas._testing as tm -from pandas.tests.indexing.common import Base + +from .common import Base class TestScalar(Base): diff --git a/pandas/tests/io/excel/test_readers.py b/pandas/tests/io/excel/test_readers.py index 1c71666e88651..5e7d4a3e2cb75 100644 --- a/pandas/tests/io/excel/test_readers.py +++ b/pandas/tests/io/excel/test_readers.py @@ -20,7 +20,8 @@ Series, ) import pandas._testing as tm -from pandas.tests.io.excel import xlrd_version + +from . import xlrd_version read_ext_params = [".xls", ".xlsx", ".xlsm", ".xlsb", ".ods"] engine_params = [ diff --git a/pandas/tests/io/excel/test_xlrd.py b/pandas/tests/io/excel/test_xlrd.py index c0d8acf8ab562..4ceb64e1117c5 100644 --- a/pandas/tests/io/excel/test_xlrd.py +++ b/pandas/tests/io/excel/test_xlrd.py @@ -4,10 +4,11 @@ import pandas as pd import pandas._testing as tm -from pandas.tests.io.excel import xlrd_version from pandas.io.excel import ExcelFile +from . import xlrd_version + xlrd = pytest.importorskip("xlrd") xlwt = pytest.importorskip("xlwt") diff --git a/pandas/tests/io/pytables/test_append.py b/pandas/tests/io/pytables/test_append.py index 3eebeee9788c6..b9310427887a9 100644 --- a/pandas/tests/io/pytables/test_append.py +++ b/pandas/tests/io/pytables/test_append.py @@ -18,7 +18,8 @@ date_range, read_hdf, ) -from pandas.tests.io.pytables.common import ( + +from .common import ( _maybe_remove, ensure_clean_path, ensure_clean_store, diff --git a/pandas/tests/io/pytables/test_categorical.py b/pandas/tests/io/pytables/test_categorical.py index 858e38e40f017..3e28c5cd98fee 100644 --- a/pandas/tests/io/pytables/test_categorical.py +++ b/pandas/tests/io/pytables/test_categorical.py @@ -9,7 +9,8 @@ concat, read_hdf, ) -from pandas.tests.io.pytables.common import ( + +from .common import ( _maybe_remove, ensure_clean_path, ensure_clean_store, diff --git a/pandas/tests/io/pytables/test_compat.py b/pandas/tests/io/pytables/test_compat.py index c7200385aa998..36abc665f6735 100644 --- a/pandas/tests/io/pytables/test_compat.py +++ b/pandas/tests/io/pytables/test_compat.py @@ -2,7 +2,8 @@ import pandas as pd import pandas._testing as tm -from pandas.tests.io.pytables.common import ensure_clean_path + +from .common import ensure_clean_path tables = pytest.importorskip("tables") diff --git a/pandas/tests/io/pytables/test_complex.py b/pandas/tests/io/pytables/test_complex.py index 8e1dee5873512..20e6d212c31da 100644 --- a/pandas/tests/io/pytables/test_complex.py +++ b/pandas/tests/io/pytables/test_complex.py @@ -11,13 +11,14 @@ Series, ) import pandas._testing as tm -from pandas.tests.io.pytables.common import ( + +from pandas.io.pytables import read_hdf + +from .common import ( ensure_clean_path, ensure_clean_store, ) -from pandas.io.pytables import read_hdf - # TODO(ArrayManager) HDFStore relies on accessing the blocks pytestmark = td.skip_array_manager_not_yet_implemented diff --git a/pandas/tests/io/pytables/test_errors.py b/pandas/tests/io/pytables/test_errors.py index 11ee5e3564634..dc623855f162b 100644 --- a/pandas/tests/io/pytables/test_errors.py +++ b/pandas/tests/io/pytables/test_errors.py @@ -16,16 +16,17 @@ date_range, read_hdf, ) -from pandas.tests.io.pytables.common import ( - ensure_clean_path, - ensure_clean_store, -) from pandas.io.pytables import ( Term, _maybe_adjust_name, ) +from .common import ( + ensure_clean_path, + ensure_clean_store, +) + pytestmark = pytest.mark.single diff --git a/pandas/tests/io/pytables/test_file_handling.py b/pandas/tests/io/pytables/test_file_handling.py index 6340311b234f1..59eac8e063d1c 100644 --- a/pandas/tests/io/pytables/test_file_handling.py +++ b/pandas/tests/io/pytables/test_file_handling.py @@ -13,12 +13,6 @@ _testing as tm, read_hdf, ) -from pandas.tests.io.pytables.common import ( - _maybe_remove, - ensure_clean_path, - ensure_clean_store, - tables, -) from pandas.io import pytables as pytables from pandas.io.pytables import ( @@ -27,6 +21,13 @@ Term, ) +from .common import ( + _maybe_remove, + ensure_clean_path, + ensure_clean_store, + tables, +) + pytestmark = pytest.mark.single diff --git a/pandas/tests/io/pytables/test_keys.py b/pandas/tests/io/pytables/test_keys.py index 02b79bd0fdbc1..947ece11eba83 100644 --- a/pandas/tests/io/pytables/test_keys.py +++ b/pandas/tests/io/pytables/test_keys.py @@ -5,7 +5,8 @@ HDFStore, _testing as tm, ) -from pandas.tests.io.pytables.common import ( + +from .common import ( ensure_clean_path, ensure_clean_store, tables, diff --git a/pandas/tests/io/pytables/test_put.py b/pandas/tests/io/pytables/test_put.py index 4f8c7c84a9fcc..d8cf35cd68399 100644 --- a/pandas/tests/io/pytables/test_put.py +++ b/pandas/tests/io/pytables/test_put.py @@ -22,12 +22,13 @@ _testing as tm, concat, ) -from pandas.tests.io.pytables.common import ( +from pandas.util import _test_decorators as td + +from .common import ( _maybe_remove, ensure_clean_path, ensure_clean_store, ) -from pandas.util import _test_decorators as td pytestmark = pytest.mark.single diff --git a/pandas/tests/io/pytables/test_read.py b/pandas/tests/io/pytables/test_read.py index f8d302a0190f8..c1e18be46b44d 100644 --- a/pandas/tests/io/pytables/test_read.py +++ b/pandas/tests/io/pytables/test_read.py @@ -16,14 +16,15 @@ _testing as tm, read_hdf, ) -from pandas.tests.io.pytables.common import ( +from pandas.util import _test_decorators as td + +from pandas.io.pytables import TableIterator + +from .common import ( _maybe_remove, ensure_clean_path, ensure_clean_store, ) -from pandas.util import _test_decorators as td - -from pandas.io.pytables import TableIterator pytestmark = pytest.mark.single diff --git a/pandas/tests/io/pytables/test_retain_attributes.py b/pandas/tests/io/pytables/test_retain_attributes.py index 16772d03c6d26..10185c799a3e8 100644 --- a/pandas/tests/io/pytables/test_retain_attributes.py +++ b/pandas/tests/io/pytables/test_retain_attributes.py @@ -11,7 +11,8 @@ date_range, read_hdf, ) -from pandas.tests.io.pytables.common import ( + +from .common import ( _maybe_remove, ensure_clean_path, ensure_clean_store, diff --git a/pandas/tests/io/pytables/test_round_trip.py b/pandas/tests/io/pytables/test_round_trip.py index 03d3d838a936c..6fda138ea75d5 100644 --- a/pandas/tests/io/pytables/test_round_trip.py +++ b/pandas/tests/io/pytables/test_round_trip.py @@ -20,12 +20,13 @@ bdate_range, read_hdf, ) -from pandas.tests.io.pytables.common import ( +from pandas.util import _test_decorators as td + +from .common import ( _maybe_remove, ensure_clean_path, ensure_clean_store, ) -from pandas.util import _test_decorators as td _default_compressor = "blosc" diff --git a/pandas/tests/io/pytables/test_select.py b/pandas/tests/io/pytables/test_select.py index a8f63bdc5fb2f..6ee9c7eae76a6 100644 --- a/pandas/tests/io/pytables/test_select.py +++ b/pandas/tests/io/pytables/test_select.py @@ -20,15 +20,16 @@ isna, read_hdf, ) -from pandas.tests.io.pytables.common import ( + +from pandas.io.pytables import Term + +from .common import ( _maybe_remove, ensure_clean_path, ensure_clean_store, tables, ) -from pandas.io.pytables import Term - pytestmark = pytest.mark.single diff --git a/pandas/tests/io/pytables/test_store.py b/pandas/tests/io/pytables/test_store.py index ef75c86190a25..9e0a215c52911 100644 --- a/pandas/tests/io/pytables/test_store.py +++ b/pandas/tests/io/pytables/test_store.py @@ -25,7 +25,8 @@ timedelta_range, ) import pandas._testing as tm -from pandas.tests.io.pytables.common import ( + +from .common import ( _maybe_remove, ensure_clean_path, ensure_clean_store, diff --git a/pandas/tests/io/pytables/test_subclass.py b/pandas/tests/io/pytables/test_subclass.py index 75b04f332e054..eb6d85cd1c0da 100644 --- a/pandas/tests/io/pytables/test_subclass.py +++ b/pandas/tests/io/pytables/test_subclass.py @@ -5,13 +5,14 @@ Series, ) import pandas._testing as tm -from pandas.tests.io.pytables.common import ensure_clean_path from pandas.io.pytables import ( HDFStore, read_hdf, ) +from .common import ensure_clean_path + class TestHDFStoreSubclass: # GH 33748 diff --git a/pandas/tests/io/pytables/test_time_series.py b/pandas/tests/io/pytables/test_time_series.py index 5e42dbde4b9f1..a7b5176e7f977 100644 --- a/pandas/tests/io/pytables/test_time_series.py +++ b/pandas/tests/io/pytables/test_time_series.py @@ -8,7 +8,8 @@ Series, _testing as tm, ) -from pandas.tests.io.pytables.common import ensure_clean_store + +from .common import ensure_clean_store pytestmark = pytest.mark.single diff --git a/pandas/tests/io/pytables/test_timezones.py b/pandas/tests/io/pytables/test_timezones.py index f67efb4cc60be..3075c9187ff83 100644 --- a/pandas/tests/io/pytables/test_timezones.py +++ b/pandas/tests/io/pytables/test_timezones.py @@ -18,7 +18,8 @@ date_range, ) import pandas._testing as tm -from pandas.tests.io.pytables.common import ( + +from .common import ( _maybe_remove, ensure_clean_path, ensure_clean_store, diff --git a/pandas/tests/io/test_pickle.py b/pandas/tests/io/test_pickle.py index 63dfbd59acd94..a83c32512580b 100644 --- a/pandas/tests/io/test_pickle.py +++ b/pandas/tests/io/test_pickle.py @@ -57,7 +57,7 @@ @pytest.fixture(scope="module") def current_pickle_data(): # our current version pickle data - from pandas.tests.io.generate_legacy_storage_files import create_pickle_data + from .generate_legacy_storage_files import create_pickle_data return create_pickle_data() diff --git a/pandas/tests/plotting/test_boxplot_method.py b/pandas/tests/plotting/test_boxplot_method.py index 448679d562a4a..86956debeb8b9 100644 --- a/pandas/tests/plotting/test_boxplot_method.py +++ b/pandas/tests/plotting/test_boxplot_method.py @@ -16,13 +16,14 @@ timedelta_range, ) import pandas._testing as tm -from pandas.tests.plotting.common import ( + +import pandas.plotting as plotting + +from .common import ( TestPlotBase, _check_plot_works, ) -import pandas.plotting as plotting - pytestmark = pytest.mark.slow diff --git a/pandas/tests/plotting/test_common.py b/pandas/tests/plotting/test_common.py index 4674fc1bb2c18..67a132a656286 100644 --- a/pandas/tests/plotting/test_common.py +++ b/pandas/tests/plotting/test_common.py @@ -3,7 +3,8 @@ import pandas.util._test_decorators as td from pandas import DataFrame -from pandas.tests.plotting.common import ( + +from .common import ( TestPlotBase, _check_plot_works, _gen_two_subplots, diff --git a/pandas/tests/plotting/test_datetimelike.py b/pandas/tests/plotting/test_datetimelike.py index 6e71b56e8182b..866c21c50312a 100644 --- a/pandas/tests/plotting/test_datetimelike.py +++ b/pandas/tests/plotting/test_datetimelike.py @@ -37,10 +37,11 @@ period_range, ) from pandas.core.indexes.timedeltas import timedelta_range -from pandas.tests.plotting.common import TestPlotBase from pandas.tseries.offsets import WeekOfMonth +from .common import TestPlotBase + pytestmark = pytest.mark.slow diff --git a/pandas/tests/plotting/test_groupby.py b/pandas/tests/plotting/test_groupby.py index 76320767a6b01..d10d3ee938215 100644 --- a/pandas/tests/plotting/test_groupby.py +++ b/pandas/tests/plotting/test_groupby.py @@ -13,7 +13,8 @@ Series, ) import pandas._testing as tm -from pandas.tests.plotting.common import TestPlotBase + +from .common import TestPlotBase pytestmark = pytest.mark.slow diff --git a/pandas/tests/plotting/test_hist_method.py b/pandas/tests/plotting/test_hist_method.py index a6e3ba71e94ab..78c059bf2cb50 100644 --- a/pandas/tests/plotting/test_hist_method.py +++ b/pandas/tests/plotting/test_hist_method.py @@ -13,7 +13,8 @@ to_datetime, ) import pandas._testing as tm -from pandas.tests.plotting.common import ( + +from .common import ( TestPlotBase, _check_plot_works, ) diff --git a/pandas/tests/plotting/test_misc.py b/pandas/tests/plotting/test_misc.py index 7f0d1802580b9..ba5d6fe474410 100644 --- a/pandas/tests/plotting/test_misc.py +++ b/pandas/tests/plotting/test_misc.py @@ -10,13 +10,14 @@ Series, ) import pandas._testing as tm -from pandas.tests.plotting.common import ( + +import pandas.plotting as plotting + +from .common import ( TestPlotBase, _check_plot_works, ) -import pandas.plotting as plotting - pytestmark = pytest.mark.slow diff --git a/pandas/tests/plotting/test_series.py b/pandas/tests/plotting/test_series.py index 59b0cc99d94fb..9511d470ceac7 100644 --- a/pandas/tests/plotting/test_series.py +++ b/pandas/tests/plotting/test_series.py @@ -16,13 +16,14 @@ date_range, ) import pandas._testing as tm -from pandas.tests.plotting.common import ( + +import pandas.plotting as plotting + +from .common import ( TestPlotBase, _check_plot_works, ) -import pandas.plotting as plotting - pytestmark = pytest.mark.slow diff --git a/pandas/tests/reshape/merge/test_join.py b/pandas/tests/reshape/merge/test_join.py index e5499c44be7d7..0a415fe2d7868 100644 --- a/pandas/tests/reshape/merge/test_join.py +++ b/pandas/tests/reshape/merge/test_join.py @@ -13,7 +13,8 @@ merge, ) import pandas._testing as tm -from pandas.tests.reshape.merge.test_merge import ( + +from .test_merge import ( NGROUPS, N, get_test_data, diff --git a/pandas/tests/strings/test_cat.py b/pandas/tests/strings/test_cat.py index cdaccf0dad8e6..b2e6aaa927c96 100644 --- a/pandas/tests/strings/test_cat.py +++ b/pandas/tests/strings/test_cat.py @@ -10,7 +10,8 @@ _testing as tm, concat, ) -from pandas.tests.strings.test_strings import assert_series_or_index_equal + +from .test_strings import assert_series_or_index_equal @pytest.mark.parametrize("other", [None, Series, Index]) diff --git a/pandas/tests/tseries/offsets/test_business_day.py b/pandas/tests/tseries/offsets/test_business_day.py index 26df051ef928f..0348212e1d42e 100644 --- a/pandas/tests/tseries/offsets/test_business_day.py +++ b/pandas/tests/tseries/offsets/test_business_day.py @@ -23,15 +23,16 @@ _testing as tm, read_pickle, ) -from pandas.tests.tseries.offsets.common import ( + +from pandas.tseries import offsets as offsets +from pandas.tseries.holiday import USFederalHolidayCalendar + +from .common import ( Base, assert_is_on_offset, assert_offset_equal, ) -from pandas.tests.tseries.offsets.test_offsets import _ApplyCases - -from pandas.tseries import offsets as offsets -from pandas.tseries.holiday import USFederalHolidayCalendar +from .test_offsets import _ApplyCases class TestBusinessDay(Base): diff --git a/pandas/tests/tseries/offsets/test_business_hour.py b/pandas/tests/tseries/offsets/test_business_hour.py index 72b939b79c321..33b9723922e4a 100644 --- a/pandas/tests/tseries/offsets/test_business_hour.py +++ b/pandas/tests/tseries/offsets/test_business_hour.py @@ -23,7 +23,8 @@ _testing as tm, date_range, ) -from pandas.tests.tseries.offsets.common import ( + +from .common import ( Base, assert_offset_equal, ) diff --git a/pandas/tests/tseries/offsets/test_custom_business_hour.py b/pandas/tests/tseries/offsets/test_custom_business_hour.py index 07270008adbd2..e931e359fe5a8 100644 --- a/pandas/tests/tseries/offsets/test_custom_business_hour.py +++ b/pandas/tests/tseries/offsets/test_custom_business_hour.py @@ -14,7 +14,8 @@ ) import pandas._testing as tm -from pandas.tests.tseries.offsets.common import ( + +from .common import ( Base, assert_offset_equal, ) diff --git a/pandas/tests/tseries/offsets/test_dst.py b/pandas/tests/tseries/offsets/test_dst.py index 0ae94b6b57640..2ad146fdcf50a 100644 --- a/pandas/tests/tseries/offsets/test_dst.py +++ b/pandas/tests/tseries/offsets/test_dst.py @@ -28,7 +28,7 @@ YearEnd, ) -from pandas.tests.tseries.offsets.test_offsets import get_utc_offset_hours +from .test_offsets import get_utc_offset_hours class TestDST: diff --git a/pandas/tests/tseries/offsets/test_fiscal.py b/pandas/tests/tseries/offsets/test_fiscal.py index 1eee9e611e0f1..a5881961b6bb3 100644 --- a/pandas/tests/tseries/offsets/test_fiscal.py +++ b/pandas/tests/tseries/offsets/test_fiscal.py @@ -10,12 +10,6 @@ from pandas import Timestamp import pandas._testing as tm -from pandas.tests.tseries.offsets.common import ( - Base, - WeekDay, - assert_is_on_offset, - assert_offset_equal, -) from pandas.tseries.frequencies import get_offset from pandas.tseries.offsets import ( @@ -23,6 +17,13 @@ FY5253Quarter, ) +from .common import ( + Base, + WeekDay, + assert_is_on_offset, + assert_offset_equal, +) + def makeFY5253LastOfMonthQuarter(*args, **kwds): return FY5253Quarter(*args, variation="last", **kwds) diff --git a/pandas/tests/tseries/offsets/test_month.py b/pandas/tests/tseries/offsets/test_month.py index b9c0cfe75fe7e..b35815e145f77 100644 --- a/pandas/tests/tseries/offsets/test_month.py +++ b/pandas/tests/tseries/offsets/test_month.py @@ -24,15 +24,16 @@ _testing as tm, date_range, ) -from pandas.tests.tseries.offsets.common import ( + +from pandas.tseries import offsets as offsets +from pandas.tseries.holiday import USFederalHolidayCalendar + +from .common import ( Base, assert_is_on_offset, assert_offset_equal, ) -from pandas.tests.tseries.offsets.test_offsets import _ApplyCases - -from pandas.tseries import offsets as offsets -from pandas.tseries.holiday import USFederalHolidayCalendar +from .test_offsets import _ApplyCases class CustomBusinessMonthBase: diff --git a/pandas/tests/tseries/offsets/test_offsets.py b/pandas/tests/tseries/offsets/test_offsets.py index 50bfc21637407..f4d502f63deb2 100644 --- a/pandas/tests/tseries/offsets/test_offsets.py +++ b/pandas/tests/tseries/offsets/test_offsets.py @@ -31,11 +31,6 @@ from pandas import DatetimeIndex import pandas._testing as tm -from pandas.tests.tseries.offsets.common import ( - Base, - WeekDay, - assert_offset_equal, -) import pandas.tseries.offsets as offsets from pandas.tseries.offsets import ( @@ -60,6 +55,12 @@ WeekOfMonth, ) +from .common import ( + Base, + WeekDay, + assert_offset_equal, +) + _ApplyCases = List[Tuple[BaseOffset, Dict[datetime, datetime]]] diff --git a/pandas/tests/tseries/offsets/test_ticks.py b/pandas/tests/tseries/offsets/test_ticks.py index 52a2f3aeee850..19e89081f5953 100644 --- a/pandas/tests/tseries/offsets/test_ticks.py +++ b/pandas/tests/tseries/offsets/test_ticks.py @@ -23,7 +23,6 @@ Timestamp, ) import pandas._testing as tm -from pandas.tests.tseries.offsets.common import assert_offset_equal from pandas.tseries import offsets from pandas.tseries.offsets import ( @@ -35,6 +34,8 @@ Second, ) +from .common import assert_offset_equal + # --------------------------------------------------------------------- # Test Helpers diff --git a/pandas/tests/tseries/offsets/test_week.py b/pandas/tests/tseries/offsets/test_week.py index b46a36e00f2da..e78ac29dc8b60 100644 --- a/pandas/tests/tseries/offsets/test_week.py +++ b/pandas/tests/tseries/offsets/test_week.py @@ -15,7 +15,7 @@ WeekOfMonth, ) -from pandas.tests.tseries.offsets.common import ( +from .common import ( Base, WeekDay, assert_is_on_offset, diff --git a/pandas/tests/tseries/offsets/test_yqm_offsets.py b/pandas/tests/tseries/offsets/test_yqm_offsets.py index 260f7368123a4..12f9dd3ac732c 100644 --- a/pandas/tests/tseries/offsets/test_yqm_offsets.py +++ b/pandas/tests/tseries/offsets/test_yqm_offsets.py @@ -7,11 +7,6 @@ import pandas as pd from pandas import Timestamp -from pandas.tests.tseries.offsets.common import ( - Base, - assert_is_on_offset, - assert_offset_equal, -) from pandas.tseries.offsets import ( BMonthBegin, @@ -28,6 +23,12 @@ YearEnd, ) +from .common import ( + Base, + assert_is_on_offset, + assert_offset_equal, +) + # -------------------------------------------------------------------- # Misc diff --git a/pandas/tseries/api.py b/pandas/tseries/api.py index 2094791ecdc60..1d5ebf3e9729f 100644 --- a/pandas/tseries/api.py +++ b/pandas/tseries/api.py @@ -4,5 +4,6 @@ # flake8: noqa -from pandas.tseries.frequencies import infer_freq import pandas.tseries.offsets as offsets + +from .frequencies import infer_freq diff --git a/pandas/tseries/holiday.py b/pandas/tseries/holiday.py index ce303928dc8ee..3b42027d039c5 100644 --- a/pandas/tseries/holiday.py +++ b/pandas/tseries/holiday.py @@ -27,7 +27,7 @@ date_range, ) -from pandas.tseries.offsets import ( +from .offsets import ( Day, Easter, ) diff --git a/pandas/util/__init__.py b/pandas/util/__init__.py index 35a88a802003e..35c8bc546f70a 100644 --- a/pandas/util/__init__.py +++ b/pandas/util/__init__.py @@ -1,14 +1,14 @@ -from pandas.util._decorators import ( # noqa - Appender, - Substitution, - cache_readonly, -) - from pandas.core.util.hashing import ( # noqa hash_array, hash_pandas_object, ) +from ._decorators import ( # noqa + Appender, + Substitution, + cache_readonly, +) + def __getattr__(name): if name == "testing":