diff --git a/pandas-stubs/_typing.pyi b/pandas-stubs/_typing.pyi index d140b79d5..d7eb64837 100644 --- a/pandas-stubs/_typing.pyi +++ b/pandas-stubs/_typing.pyi @@ -31,6 +31,7 @@ from pandas.core.generic import NDFrame from pandas.core.groupby.grouper import Grouper from pandas.core.indexes.base import Index from pandas.core.series import Series +from pandas.core.tools.datetimes import FulldatetimeDict from typing_extensions import ( ParamSpec, TypeAlias, @@ -73,22 +74,6 @@ DatetimeDictArg: TypeAlias = ( ) DictConvertible: TypeAlias = FulldatetimeDict | DataFrame -class YearMonthDayDict(TypedDict, total=True): - year: DatetimeDictArg - month: DatetimeDictArg - day: DatetimeDictArg - -class FulldatetimeDict(YearMonthDayDict, total=False): - hour: DatetimeDictArg - hours: DatetimeDictArg - minute: DatetimeDictArg - minutes: DatetimeDictArg - second: DatetimeDictArg - seconds: DatetimeDictArg - ms: DatetimeDictArg - us: DatetimeDictArg - ns: DatetimeDictArg - CorrelationMethod: TypeAlias = ( Literal["pearson", "kendall", "spearman"] | Callable[[np.ndarray, np.ndarray], float] diff --git a/pandas-stubs/core/tools/datetimes.pyi b/pandas-stubs/core/tools/datetimes.pyi index 9210d4bd9..6d45eef4d 100644 --- a/pandas-stubs/core/tools/datetimes.pyi +++ b/pandas-stubs/core/tools/datetimes.pyi @@ -5,6 +5,7 @@ from datetime import ( ) from typing import ( Literal, + TypedDict, overload, ) @@ -37,6 +38,24 @@ DatetimeScalar: TypeAlias = Scalar | datetime | np.datetime64 | date DatetimeScalarOrArrayConvertible: TypeAlias = DatetimeScalar | ArrayConvertible +DatetimeDictArg: TypeAlias = list[Scalar] | tuple[Scalar, ...] | AnyArrayLike + +class YearMonthDayDict(TypedDict, total=True): + year: DatetimeDictArg + month: DatetimeDictArg + day: DatetimeDictArg + +class FulldatetimeDict(YearMonthDayDict, total=False): + hour: DatetimeDictArg + hours: DatetimeDictArg + minute: DatetimeDictArg + minutes: DatetimeDictArg + second: DatetimeDictArg + seconds: DatetimeDictArg + ms: DatetimeDictArg + us: DatetimeDictArg + ns: DatetimeDictArg + @overload def to_datetime( arg: DatetimeScalar, diff --git a/tests/__init__.py b/tests/__init__.py index 2dcce20af..7b5c93b58 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -14,12 +14,39 @@ ) import numpy as np +import numpy.typing as npt import pandas as pd + +# Next set of imports is to keep the private imports needed for testing +# in one place +from pandas._testing import ensure_clean as ensure_clean from pandas.core.groupby.groupby import BaseGroupBy from pandas.util.version import Version import pytest -from pandas._typing import T +if TYPE_CHECKING: + from pandas._typing import ( + BooleanDtypeArg as BooleanDtypeArg, + BytesDtypeArg as BytesDtypeArg, + CategoryDtypeArg as CategoryDtypeArg, + ComplexDtypeArg as ComplexDtypeArg, + Dtype as Dtype, + FloatDtypeArg as FloatDtypeArg, + IntDtypeArg as IntDtypeArg, + ObjectDtypeArg as ObjectDtypeArg, + StrDtypeArg as StrDtypeArg, + T as T, + TimedeltaDtypeArg as TimedeltaDtypeArg, + TimestampDtypeArg as TimestampDtypeArg, + UIntDtypeArg as UIntDtypeArg, + VoidDtypeArg as VoidDtypeArg, + np_ndarray_bool as np_ndarray_bool, + np_ndarray_int as np_ndarray_int, + ) +else: + # Separately define here so pytest works + np_ndarray_bool = npt.NDArray[np.bool_] + np_ndarray_int = npt.NDArray[np.signedinteger] TYPE_CHECKING_INVALID_USAGE: Final = TYPE_CHECKING WINDOWS = os.name == "nt" or "cygwin" in platform.system().lower() diff --git a/tests/extension/decimal/array.py b/tests/extension/decimal/array.py index 0bf86335d..0a9b4e2bb 100644 --- a/tests/extension/decimal/array.py +++ b/tests/extension/decimal/array.py @@ -1,5 +1,6 @@ from __future__ import annotations +from builtins import type as type_t import decimal import numbers import sys @@ -24,7 +25,6 @@ from pandas._typing import ( TakeIndexer, - type_t, ) from pandas.core.dtypes.base import ExtensionDtype diff --git a/tests/test_api_typing.py b/tests/test_api_typing.py index 8ccca9e58..358d3acca 100644 --- a/tests/test_api_typing.py +++ b/tests/test_api_typing.py @@ -2,7 +2,7 @@ import numpy as np import pandas as pd -from pandas._testing import ensure_clean +from pandas import read_json from pandas.api.typing import ( DataFrameGroupBy, DatetimeIndexResamplerGroupby, @@ -29,9 +29,10 @@ assert_type, ) -from tests import check - -from pandas.io.json._json import read_json +from tests import ( + check, + ensure_clean, +) ResamplerGroupBy: TypeAlias = ( DatetimeIndexResamplerGroupby diff --git a/tests/test_dtypes.py b/tests/test_dtypes.py index 3736fd09f..4be3994a5 100644 --- a/tests/test_dtypes.py +++ b/tests/test_dtypes.py @@ -14,6 +14,10 @@ import numpy as np import pandas as pd from pandas.api.types import is_any_real_numeric_dtype +from pandas.api.typing import ( + NaTType, + NAType, +) from pandas.core.arrays import ( BooleanArray, IntegerArray, @@ -21,8 +25,6 @@ import pyarrow as pa from typing_extensions import assert_type -from pandas._libs import NaTType -from pandas._libs.missing import NAType from pandas._typing import Scalar from tests import ( diff --git a/tests/test_frame.py b/tests/test_frame.py index 47dbc6460..9859a84a6 100644 --- a/tests/test_frame.py +++ b/tests/test_frame.py @@ -31,7 +31,8 @@ import numpy as np import numpy.typing as npt import pandas as pd -from pandas._testing import ensure_clean +from pandas import Timestamp +from pandas.api.typing import NAType from pandas.core.resample import ( DatetimeIndexResampler, Resampler, @@ -44,14 +45,13 @@ ) import xarray as xr -from pandas._libs.missing import NAType -from pandas._libs.tslibs.timestamps import Timestamp from pandas._typing import Scalar from tests import ( PD_LTE_22, TYPE_CHECKING_INVALID_USAGE, check, + ensure_clean, pytest_warns_bounded, ) diff --git a/tests/test_indexes.py b/tests/test_indexes.py index f704993c9..feea7535b 100644 --- a/tests/test_indexes.py +++ b/tests/test_indexes.py @@ -1,7 +1,10 @@ from __future__ import annotations import datetime as dt -from typing import Union +from typing import ( + TYPE_CHECKING, + Union, +) import numpy as np from numpy import typing as npt @@ -13,7 +16,8 @@ assert_type, ) -from pandas._typing import Dtype # noqa: F401 +if TYPE_CHECKING: + from tests import Dtype # noqa: F401 from tests import ( PD_LTE_22, diff --git a/tests/test_io.py b/tests/test_io.py index c1910b841..32df677ba 100644 --- a/tests/test_io.py +++ b/tests/test_io.py @@ -40,7 +40,7 @@ read_table, read_xml, ) -from pandas._testing import ensure_clean +from pandas.api.typing import JsonReader import pytest import sqlalchemy import sqlalchemy.orm @@ -51,11 +51,11 @@ TYPE_CHECKING_INVALID_USAGE, WINDOWS, check, + ensure_clean, ) from tests import NUMPY20 # See https://github.com/PyTables/PyTables/issues/1172 from pandas.io.api import to_pickle -from pandas.io.json._json import JsonReader from pandas.io.parsers import TextFileReader from pandas.io.pytables import ( TableIterator, diff --git a/tests/test_pandas.py b/tests/test_pandas.py index be8d9b80a..b9ff22c86 100644 --- a/tests/test_pandas.py +++ b/tests/test_pandas.py @@ -13,6 +13,10 @@ import pandas as pd from pandas import Grouper from pandas.api.extensions import ExtensionArray +from pandas.api.typing import ( + NaTType, + NAType, +) import pandas.util as pdutil # TODO: github.com/pandas-dev/pandas/issues/55023 @@ -23,8 +27,6 @@ assert_type, ) -from pandas._libs.missing import NAType -from pandas._libs.tslibs import NaTType from pandas._typing import Scalar from tests import ( diff --git a/tests/test_scalars.py b/tests/test_scalars.py index 0b130320b..3d8125e93 100644 --- a/tests/test_scalars.py +++ b/tests/test_scalars.py @@ -13,16 +13,13 @@ import numpy as np from numpy import typing as npt import pandas as pd +from pandas.api.typing import NaTType import pytz from typing_extensions import ( TypeAlias, assert_type, ) -from pandas._libs.tslibs import ( - BaseOffset, - NaTType, -) from pandas._libs.tslibs.timedeltas import Components from pandas._typing import TimeUnit @@ -32,7 +29,10 @@ pytest_warns_bounded, ) -from pandas.tseries.offsets import Day +from pandas.tseries.offsets import ( + BaseOffset, + Day, +) if TYPE_CHECKING: from pandas.core.series import ( @@ -42,14 +42,14 @@ TimestampSeries, ) - from pandas._typing import np_ndarray_bool else: - np_ndarray_bool = npt.NDArray[np.bool_] TimedeltaSeries: TypeAlias = pd.Series TimestampSeries: TypeAlias = pd.Series PeriodSeries: TypeAlias = pd.Series OffsetSeries: TypeAlias = pd.Series +from tests import np_ndarray_bool + def test_interval() -> None: interval_i = pd.Interval(0, 1, closed="left") diff --git a/tests/test_series.py b/tests/test_series.py index f84648df1..79ec2c7a5 100644 --- a/tests/test_series.py +++ b/tests/test_series.py @@ -25,11 +25,11 @@ import numpy as np import pandas as pd -from pandas._testing import ensure_clean from pandas.api.extensions import ( ExtensionArray, ExtensionDtype, ) +from pandas.api.typing import NAType from pandas.core.arrays.datetimes import DatetimeArray from pandas.core.arrays.timedeltas import TimedeltaArray from pandas.core.window import ExponentialMovingWindow @@ -43,9 +43,6 @@ ) import xarray as xr -from pandas._libs.missing import NAType -from pandas._libs.tslibs import BaseOffset -from pandas._libs.tslibs.offsets import YearEnd from pandas._typing import ( DtypeObj, Scalar, @@ -56,11 +53,16 @@ TYPE_CHECKING_INVALID_USAGE, WINDOWS, check, + ensure_clean, pytest_warns_bounded, ) from tests.extension.decimal.array import DecimalDtype from pandas.io.formats.format import EngFormatter +from pandas.tseries.offsets import ( + BaseOffset, + YearEnd, +) if TYPE_CHECKING: from pandas.core.series import ( @@ -68,13 +70,8 @@ TimedeltaSeries, TimestampSeries, ) -else: - TimedeltaSeries: TypeAlias = pd.Series - TimestampSeries: TypeAlias = pd.Series - OffsetSeries: TypeAlias = pd.Series -if TYPE_CHECKING: - from pandas._typing import ( + from tests import ( BooleanDtypeArg, BytesDtypeArg, CategoryDtypeArg, @@ -88,7 +85,12 @@ UIntDtypeArg, VoidDtypeArg, ) - from pandas._typing import np_ndarray_int # noqa: F401 + from tests import np_ndarray_int # noqa: F401 + +else: + TimedeltaSeries: TypeAlias = pd.Series + TimestampSeries: TypeAlias = pd.Series + OffsetSeries: TypeAlias = pd.Series # Tests will use numpy 2.1 in python 3.10 or later diff --git a/tests/test_string_accessors.py b/tests/test_string_accessors.py index 4e83160f8..649dae780 100644 --- a/tests/test_string_accessors.py +++ b/tests/test_string_accessors.py @@ -2,15 +2,13 @@ import re import numpy as np -import numpy.typing as npt import pandas as pd from typing_extensions import assert_type -from tests import check - -# Separately define here so pytest works -np_ndarray_bool = npt.NDArray[np.bool_] - +from tests import ( + check, + np_ndarray_bool, +) DATA = ["applep", "bananap", "Cherryp", "DATEp", "eGGpLANTp", "123p", "23.45p"] DATA_BYTES = [b"applep", b"bananap"] diff --git a/tests/test_styler.py b/tests/test_styler.py index 976b5a110..3293a173d 100644 --- a/tests/test_styler.py +++ b/tests/test_styler.py @@ -16,13 +16,15 @@ Index, Series, ) -from pandas._testing import ensure_clean import pytest from typing_extensions import assert_type from pandas._typing import Scalar -from tests import check +from tests import ( + check, + ensure_clean, +) from pandas.io.formats.style import Styler diff --git a/tests/test_testing.py b/tests/test_testing.py index 00566a8a9..c4ca7a876 100644 --- a/tests/test_testing.py +++ b/tests/test_testing.py @@ -3,7 +3,6 @@ import os.path import pandas as pd -from pandas._testing import ensure_clean from pandas.testing import ( assert_frame_equal, assert_series_equal, @@ -13,6 +12,7 @@ from tests import ( TYPE_CHECKING_INVALID_USAGE, check, + ensure_clean, ) diff --git a/tests/test_timefuncs.py b/tests/test_timefuncs.py index ab5a3fe75..6f009256b 100644 --- a/tests/test_timefuncs.py +++ b/tests/test_timefuncs.py @@ -3,7 +3,6 @@ import datetime as dt from typing import ( TYPE_CHECKING, - Any, Optional, cast, ) @@ -20,22 +19,14 @@ import numpy as np from numpy import typing as npt import pandas as pd +from pandas.api.typing import NaTType +from pandas.core.tools.datetimes import FulldatetimeDict import pytz from typing_extensions import ( assert_never, assert_type, ) -from pandas._libs import NaTType -from pandas._libs.tslibs import BaseOffset - -from pandas.tseries.frequencies import to_offset -from pandas.tseries.offsets import DateOffset - -if TYPE_CHECKING: - from pandas._typing import FulldatetimeDict -else: - FulldatetimeDict = Any from pandas._typing import TimeUnit from tests import ( @@ -45,12 +36,15 @@ pytest_warns_bounded, ) +from pandas.tseries.frequencies import to_offset from pandas.tseries.holiday import USFederalHolidayCalendar from pandas.tseries.offsets import ( + BaseOffset, BusinessDay, BusinessHour, CustomBusinessDay, CustomBusinessHour, + DateOffset, Day, ) @@ -59,9 +53,7 @@ from pandas.core.series import TimedeltaSeries # noqa: F401 from pandas.core.series import TimestampSeries # noqa: F401 - -# Separately define here so pytest works -np_ndarray_bool = npt.NDArray[np.bool_] +from tests import np_ndarray_bool def test_types_init() -> None: