diff --git a/pandas-stubs/core/base.pyi b/pandas-stubs/core/base.pyi index ec9a22f39..e4b820d79 100644 --- a/pandas-stubs/core/base.pyi +++ b/pandas-stubs/core/base.pyi @@ -22,6 +22,7 @@ import numpy.typing as npt from pandas.core.arraylike import OpsMixin from pandas.core.arrays import ExtensionArray from pandas.core.arrays.categorical import Categorical +from pandas.core.arrays.floating import FloatingArray from pandas.core.arrays.integer import IntegerArray from pandas.core.arrays.timedeltas import TimedeltaArray from pandas.core.indexes.accessors import ArrayDescriptor @@ -192,7 +193,7 @@ ScalarArrayIndexJustFloat: TypeAlias = ( | np.floating | Sequence[Just[float] | np.floating] | np_ndarray_float - # | FloatingArray # TODO: after pandas-dev/pandas-stubs#1469 + | FloatingArray | Index[float] ) ScalarArrayIndexSeriesJustFloat: TypeAlias = ScalarArrayIndexJustFloat | Series[float] @@ -207,16 +208,6 @@ ScalarArrayIndexSeriesJustComplex: TypeAlias = ( ScalarArrayIndexJustComplex | Series[complex] ) -ScalarArrayIndexIntNoBool: TypeAlias = ( - Just[int] - | np.integer - | Sequence[int | np.integer] - | np_ndarray_anyint - | IntegerArray - | Index[int] -) -ScalarArrayIndexSeriesIntNoBool: TypeAlias = ScalarArrayIndexIntNoBool | Series[int] - NumpyRealScalar: TypeAlias = np.bool | np.integer | np.floating IndexReal: TypeAlias = Index[bool] | Index[int] | Index[float] ScalarArrayIndexReal: TypeAlias = ( diff --git a/pandas-stubs/core/frame.pyi b/pandas-stubs/core/frame.pyi index d4bb41511..69345fa6e 100644 --- a/pandas-stubs/core/frame.pyi +++ b/pandas-stubs/core/frame.pyi @@ -1027,6 +1027,7 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack): axis: Axis | None = ..., limit: int = ..., inplace: Literal[True], + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 ) -> None: ... @overload def fillna( @@ -1045,6 +1046,7 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack): *, inplace: Literal[True], regex: ReplaceValue | Mapping[HashableT3, ReplaceValue] = ..., + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 ) -> None: ... @overload def replace( @@ -2048,6 +2050,7 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack): inplace: Literal[True], limit: int | None = ..., limit_area: Literal["inside", "outside"] | None = ..., + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 ) -> None: ... @overload def bfill( @@ -2107,6 +2110,7 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack): axis: Axis | None = ..., inplace: Literal[True], **kwargs: Any, + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 ) -> None: ... @overload def clip( @@ -2117,6 +2121,7 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack): axis: Axis = ..., inplace: Literal[True], **kwargs: Any, + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 ) -> None: ... @overload def clip( @@ -2127,6 +2132,7 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack): axis: Axis = ..., inplace: Literal[True], **kwargs: Any, + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 ) -> None: ... @final def copy(self, deep: _bool = True) -> Self: ... @@ -2211,6 +2217,7 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack): inplace: Literal[True], limit: int | None = ..., limit_area: Literal["inside", "outside"] | None = ..., + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 ) -> None: ... @overload def ffill( @@ -2272,6 +2279,7 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack): limit_area: Literal["inside", "outside"] | None = ..., inplace: Literal[True], **kwargs: Any, + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 ) -> None: ... @overload def interpolate( @@ -2329,6 +2337,7 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack): inplace: Literal[True], axis: Axis | None = ..., level: Level | None = None, + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 ) -> None: ... @overload def mask( @@ -2801,6 +2810,7 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack): inplace: Literal[True], axis: Axis | None = ..., level: Level | None = None, + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 ) -> None: ... @overload def where( diff --git a/pandas-stubs/core/indexes/base.pyi b/pandas-stubs/core/indexes/base.pyi index 09bb37a8a..62863bf7c 100644 --- a/pandas-stubs/core/indexes/base.pyi +++ b/pandas-stubs/core/indexes/base.pyi @@ -39,9 +39,9 @@ from pandas.core.base import ( IndexOpsMixin, IndexReal, ScalarArrayIndexComplex, - ScalarArrayIndexIntNoBool, ScalarArrayIndexJustComplex, ScalarArrayIndexJustFloat, + ScalarArrayIndexJustInt, ScalarArrayIndexReal, ScalarArrayIndexTimedelta, Supports_ProtoAdd, @@ -1012,7 +1012,7 @@ class Index(IndexOpsMixin[S1], ElementOpsMixin[S1]): ) -> Index[float]: ... @overload def __truediv__( - self: Index[bool] | Index[int], other: ScalarArrayIndexIntNoBool + self: Index[bool] | Index[int], other: ScalarArrayIndexJustInt ) -> Index[float]: ... @overload def __truediv__( @@ -1063,7 +1063,7 @@ class Index(IndexOpsMixin[S1], ElementOpsMixin[S1]): ) -> Index[float]: ... @overload def __rtruediv__( - self: Index[bool] | Index[int], other: ScalarArrayIndexIntNoBool + self: Index[bool] | Index[int], other: ScalarArrayIndexJustInt ) -> Index[float]: ... @overload def __rtruediv__( # type: ignore[misc] diff --git a/pandas-stubs/core/series.pyi b/pandas-stubs/core/series.pyi index 4f6ddc425..c732e3826 100644 --- a/pandas-stubs/core/series.pyi +++ b/pandas-stubs/core/series.pyi @@ -77,7 +77,6 @@ from pandas.core.base import ( IndexOpsMixin, NumListLike, ScalarArrayIndexSeriesComplex, - ScalarArrayIndexSeriesIntNoBool, ScalarArrayIndexSeriesJustComplex, ScalarArrayIndexSeriesJustFloat, ScalarArrayIndexSeriesJustInt, @@ -1280,6 +1279,7 @@ class Series(IndexOpsMixin[S1], ElementOpsMixin[S1], NDFrame): *, regex: ReplaceValue = ..., inplace: Literal[True], + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 ) -> None: ... @overload def replace( @@ -1543,6 +1543,7 @@ class Series(IndexOpsMixin[S1], ElementOpsMixin[S1], NDFrame): limit_direction: Literal["forward", "backward", "both"] | None = ..., limit_area: Literal["inside", "outside"] | None = ..., **kwargs: Any, + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 ) -> None: ... @overload def interpolate( @@ -1581,6 +1582,7 @@ class Series(IndexOpsMixin[S1], ElementOpsMixin[S1], NDFrame): axis: AxisIndex | None = 0, inplace: Literal[True], **kwargs: Any, + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 ) -> None: ... @overload def clip( @@ -3681,7 +3683,7 @@ class Series(IndexOpsMixin[S1], ElementOpsMixin[S1], NDFrame): ) -> Series[float]: ... @overload def __truediv__( - self: Series[bool] | Series[int], other: ScalarArrayIndexSeriesIntNoBool + self: Series[bool] | Series[int], other: ScalarArrayIndexSeriesJustInt ) -> Series[float]: ... @overload def __truediv__( @@ -3773,7 +3775,7 @@ class Series(IndexOpsMixin[S1], ElementOpsMixin[S1], NDFrame): @overload def truediv( self: Series[bool] | Series[int], - other: ScalarArrayIndexSeriesIntNoBool, + other: ScalarArrayIndexSeriesJustInt | Sequence[bool | np.bool], level: Level | None = None, fill_value: float | None = None, axis: AxisIndex = 0, @@ -3883,7 +3885,7 @@ class Series(IndexOpsMixin[S1], ElementOpsMixin[S1], NDFrame): ) -> Series[float]: ... @overload def __rtruediv__( - self: Series[bool] | Series[int], other: ScalarArrayIndexSeriesIntNoBool + self: Series[bool] | Series[int], other: ScalarArrayIndexSeriesJustInt ) -> Series[float]: ... @overload def __rtruediv__( # type: ignore[misc] @@ -3966,7 +3968,7 @@ class Series(IndexOpsMixin[S1], ElementOpsMixin[S1], NDFrame): @overload def rtruediv( self: Series[bool] | Series[int], - other: ScalarArrayIndexSeriesIntNoBool, + other: ScalarArrayIndexSeriesJustInt | Sequence[bool | np.bool], level: Level | None = None, fill_value: float | None = None, axis: AxisIndex = 0, diff --git a/tests/indexes/arithmetic/bool/test_truediv.py b/tests/indexes/arithmetic/bool/test_truediv.py index 00d2571fa..7bb82ecbd 100644 --- a/tests/indexes/arithmetic/bool/test_truediv.py +++ b/tests/indexes/arithmetic/bool/test_truediv.py @@ -43,12 +43,16 @@ def test_truediv_py_sequence(left: "pd.Index[bool]") -> None: """Test pd.Index[bool] / Python native sequences""" b, i, f, c = [True, False, True], [2, 3, 5], [1.0, 2.0, 3.0], [1j, 1j, 4j] - check(assert_type(left / b, "pd.Index[float]"), pd.Index, np.floating) + if TYPE_CHECKING_INVALID_USAGE: + # TODO: python/mypy#20061 + _00 = left / b # pyright: ignore[reportOperatorIssue] check(assert_type(left / i, "pd.Index[float]"), pd.Index, np.floating) check(assert_type(left / f, "pd.Index[float]"), pd.Index, np.floating) check(assert_type(left / c, "pd.Index[complex]"), pd.Index, np.complexfloating) - check(assert_type(b / left, "pd.Index[float]"), pd.Index, np.floating) + if TYPE_CHECKING_INVALID_USAGE: + # TODO: python/mypy#20061 + _10 = b / left # pyright: ignore[reportOperatorIssue] check(assert_type(i / left, "pd.Index[float]"), pd.Index, np.floating) check(assert_type(f / left, "pd.Index[float]"), pd.Index, np.floating) check(assert_type(c / left, "pd.Index[complex]"), pd.Index, np.complexfloating) diff --git a/tests/indexes/arithmetic/timedeltaindex/test_floordiv.py b/tests/indexes/arithmetic/timedeltaindex/test_floordiv.py index fd0b570ee..9b395f0a8 100644 --- a/tests/indexes/arithmetic/timedeltaindex/test_floordiv.py +++ b/tests/indexes/arithmetic/timedeltaindex/test_floordiv.py @@ -14,6 +14,7 @@ ) from tests import ( + PD_LTE_23, TYPE_CHECKING_INVALID_USAGE, check, ) @@ -62,7 +63,12 @@ def test_floordiv_py_sequence(left: pd.TimedeltaIndex) -> None: if TYPE_CHECKING_INVALID_USAGE: _03 = left // c # type: ignore[operator] # pyright: ignore[reportOperatorIssue] _04 = left // s # type: ignore[operator] # pyright: ignore[reportOperatorIssue] - check(assert_type(left // d, "pd.Index[int]"), pd.Index, int) + # TODO: pandas-dev/pandas#62552 switch to np.integer after Pandas 3.0 + check( + assert_type(left // d, "pd.Index[int]"), + pd.Index, + int if PD_LTE_23 else np.integer, + ) if TYPE_CHECKING_INVALID_USAGE: _10 = b // left # type: ignore[operator] # pyright: ignore[reportOperatorIssue] diff --git a/tests/series/arithmetic/bool/test_truediv.py b/tests/series/arithmetic/bool/test_truediv.py index d366f950d..900cf7e1d 100644 --- a/tests/series/arithmetic/bool/test_truediv.py +++ b/tests/series/arithmetic/bool/test_truediv.py @@ -81,12 +81,16 @@ def test_truediv_py_sequence(left: "pd.Series[bool]") -> None: """Test pd.Series[bool] / Python native sequences""" b, i, f, c = [True, False, True], [2, 3, 5], [1.0, 2.0, 3.0], [1j, 1j, 4j] - check(assert_type(left / b, "pd.Series[float]"), pd.Series, np.floating) + if TYPE_CHECKING_INVALID_USAGE: + # TODO: python/mypy#20061 + _00 = left / b # pyright: ignore[reportOperatorIssue] check(assert_type(left / i, "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left / f, "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left / c, "pd.Series[complex]"), pd.Series, np.complexfloating) - check(assert_type(b / left, "pd.Series[float]"), pd.Series, np.floating) + if TYPE_CHECKING_INVALID_USAGE: + # TODO: python/mypy#20061 + _10 = b / left # pyright: ignore[reportOperatorIssue] check(assert_type(i / left, "pd.Series[float]"), pd.Series, np.floating) check(assert_type(f / left, "pd.Series[float]"), pd.Series, np.floating) check(assert_type(c / left, "pd.Series[complex]"), pd.Series, np.complexfloating) diff --git a/tests/series/arithmetic/timedelta/test_floordiv.py b/tests/series/arithmetic/timedelta/test_floordiv.py index dcea23361..d75203cde 100644 --- a/tests/series/arithmetic/timedelta/test_floordiv.py +++ b/tests/series/arithmetic/timedelta/test_floordiv.py @@ -14,6 +14,7 @@ ) from tests import ( + PD_LTE_23, TYPE_CHECKING_INVALID_USAGE, check, ) @@ -87,7 +88,12 @@ def test_floordiv_py_sequence(left: "pd.Series[pd.Timedelta]") -> None: if TYPE_CHECKING_INVALID_USAGE: _03 = left // c # type: ignore[operator] # pyright: ignore[reportOperatorIssue] _04 = left // s # type: ignore[operator] # pyright: ignore[reportOperatorIssue] - check(assert_type(left // d, "pd.Series[int]"), pd.Series, int) + # TODO: pandas-dev/pandas#62552 switch to np.integer after Pandas 3.0 + check( + assert_type(left // d, "pd.Series[int]"), + pd.Series, + int if PD_LTE_23 else np.integer, + ) if TYPE_CHECKING_INVALID_USAGE: _10 = b // left # type: ignore[operator] # pyright: ignore[reportOperatorIssue] diff --git a/tests/series/test_series.py b/tests/series/test_series.py index e60ea1c7c..be96e4a9b 100644 --- a/tests/series/test_series.py +++ b/tests/series/test_series.py @@ -394,7 +394,11 @@ def test_types_fillna() -> None: pd.Series, float, ) - assert assert_type(s.fillna(0, inplace=True), None) is None + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + assert assert_type(s.fillna(0, inplace=True), None) is None + else: + check(assert_type(s.fillna(0, inplace=True), None), pd.Series, np.floating) check(assert_type(s.fillna(0), "pd.Series[float]"), pd.Series, float) check( assert_type(s.fillna(0, limit=1), "pd.Series[float]"), @@ -469,11 +473,7 @@ def test_types_shift() -> None: """Test shift operator on series with different arguments.""" s = pd.Series([1, 2, 3], index=pd.date_range("2020", periods=3)) check(assert_type(s.shift(), pd.Series), pd.Series, np.floating) - check( - assert_type(s.shift(axis=0, periods=1), pd.Series), - pd.Series, - np.floating, - ) + check(assert_type(s.shift(axis=0, periods=1), pd.Series), pd.Series, np.floating) check(assert_type(s.shift(-1, fill_value=0), pd.Series), pd.Series, np.integer) check(assert_type(s.shift(freq="1D"), pd.Series), pd.Series, np.integer) check(assert_type(s.shift(freq=BDay(1)), pd.Series), pd.Series, np.integer) @@ -646,17 +646,38 @@ def test_types_clip() -> None: pd.Series, np.integer, ) - check(assert_type(s.clip(lower=0, upper=5, inplace=True), None), type(None)) - check(assert_type(s.clip(lower=0, upper=None, inplace=True), None), type(None)) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check(assert_type(s.clip(lower=0, upper=5, inplace=True), None), type(None)) + check(assert_type(s.clip(lower=0, upper=None, inplace=True), None), type(None)) + else: + check( + assert_type(s.clip(lower=0, upper=5, inplace=True), None), + pd.Series, + np.integer, + ) + check( + assert_type(s.clip(lower=0, upper=None, inplace=True), None), + pd.Series, + np.integer, + ) check( assert_type(s.clip(lower=None, upper=None, inplace=True), "pd.Series[int]"), pd.Series, np.integer, ) - check( - assert_type(s.clip(lower=None, upper=5, inplace=True), None), - type(None), - ) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check( + assert_type(s.clip(lower=None, upper=5, inplace=True), None), + type(None), + ) + else: + check( + assert_type(s.clip(lower=None, upper=5, inplace=True), None), + pd.Series, + np.integer, + ) check( assert_type(s.clip(lower=lower, upper=upper), "pd.Series[int]"), pd.Series, @@ -672,15 +693,40 @@ def test_types_clip() -> None: pd.Series, np.integer, ) - check(assert_type(s.clip(lower=lower, upper=upper, inplace=True), None), type(None)) - check( - assert_type(s.clip(lower=lower, upper=upper, axis=0, inplace=True), None), - type(None), - ) - check( - assert_type(s.clip(lower=lower, upper=upper, axis="index", inplace=True), None), - type(None), - ) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check( + assert_type(s.clip(lower=lower, upper=upper, inplace=True), None), + type(None), + ) + check( + assert_type(s.clip(lower=lower, upper=upper, axis=0, inplace=True), None), + type(None), + ) + check( + assert_type( + s.clip(lower=lower, upper=upper, axis="index", inplace=True), None + ), + type(None), + ) + else: + check( + assert_type(s.clip(lower=lower, upper=upper, inplace=True), None), + pd.Series, + np.integer, + ) + check( + assert_type(s.clip(lower=lower, upper=upper, axis=0, inplace=True), None), + pd.Series, + np.integer, + ) + check( + assert_type( + s.clip(lower=lower, upper=upper, axis="index", inplace=True), None + ), + pd.Series, + np.integer, + ) # without lower check(assert_type(s.clip(upper=None), "pd.Series[int]"), pd.Series, np.integer) @@ -690,7 +736,11 @@ def test_types_clip() -> None: pd.Series, np.integer, ) - check(assert_type(s.clip(upper=5, inplace=True), None), type(None)) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check(assert_type(s.clip(upper=5, inplace=True), None), type(None)) + else: + check(assert_type(s.clip(upper=5, inplace=True), None), pd.Series, np.integer) check(assert_type(s.clip(upper=upper), "pd.Series[int]"), pd.Series, np.integer) check( assert_type(s.clip(upper=upper, axis=0), "pd.Series[int]"), @@ -702,11 +752,28 @@ def test_types_clip() -> None: pd.Series, np.integer, ) - check(assert_type(s.clip(upper=upper, inplace=True), None), type(None)) - check(assert_type(s.clip(upper=upper, axis=0, inplace=True), None), type(None)) - check( - assert_type(s.clip(upper=upper, axis="index", inplace=True), None), type(None) - ) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check(assert_type(s.clip(upper=upper, inplace=True), None), type(None)) + check(assert_type(s.clip(upper=upper, axis=0, inplace=True), None), type(None)) + check( + assert_type(s.clip(upper=upper, axis="index", inplace=True), None), + type(None), + ) + else: + check( + assert_type(s.clip(upper=upper, inplace=True), None), pd.Series, np.integer + ) + check( + assert_type(s.clip(upper=upper, axis=0, inplace=True), None), + pd.Series, + np.integer, + ) + check( + assert_type(s.clip(upper=upper, axis="index", inplace=True), None), + pd.Series, + np.integer, + ) # without upper check(assert_type(s.clip(lower=None), "pd.Series[int]"), pd.Series, np.integer) @@ -717,7 +784,11 @@ def test_types_clip() -> None: pd.Series, np.integer, ) - check(assert_type(s.clip(lower=0, inplace=True), None), type(None)) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check(assert_type(s.clip(lower=0, inplace=True), None), type(None)) + else: + check(assert_type(s.clip(lower=0, inplace=True), None), pd.Series, np.integer) check( assert_type(s.clip(lower=None, inplace=True), "pd.Series[int]"), pd.Series, @@ -734,11 +805,28 @@ def test_types_clip() -> None: pd.Series, np.integer, ) - check(assert_type(s.clip(lower=lower, inplace=True), None), type(None)) - check(assert_type(s.clip(lower=lower, axis=0, inplace=True), None), type(None)) - check( - assert_type(s.clip(lower=lower, axis="index", inplace=True), None), type(None) - ) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check(assert_type(s.clip(lower=lower, inplace=True), None), type(None)) + check(assert_type(s.clip(lower=lower, axis=0, inplace=True), None), type(None)) + check( + assert_type(s.clip(lower=lower, axis="index", inplace=True), None), + type(None), + ) + else: + check( + assert_type(s.clip(lower=lower, inplace=True), None), pd.Series, np.integer + ) + check( + assert_type(s.clip(lower=lower, axis=0, inplace=True), None), + pd.Series, + np.integer, + ) + check( + assert_type(s.clip(lower=lower, axis="index", inplace=True), None), + pd.Series, + np.integer, + ) if TYPE_CHECKING_INVALID_USAGE: s.clip(lower=lower, axis=1) # type: ignore[call-overload] # pyright: ignore[reportArgumentType] @@ -1322,11 +1410,7 @@ def test_types_agg() -> None: def test_types_aggregate() -> None: s = pd.Series([1, 2, 3], index=["col1", "col2", "col3"]) check(assert_type(s.aggregate("min"), int), np.integer) - check( - assert_type(s.aggregate(["min", "max"]), pd.Series), - pd.Series, - np.integer, - ) + check(assert_type(s.aggregate(["min", "max"]), pd.Series), pd.Series, np.integer) check(assert_type(s.aggregate({"a": "min"}), pd.Series), pd.Series, np.integer) with pytest_warns_bounded( FutureWarning, @@ -1334,11 +1418,7 @@ def test_types_aggregate() -> None: upper="2.3.99", ): check(assert_type(s.aggregate(min), int), np.integer if PD_LTE_23 else int) - check( - assert_type(s.aggregate([min, max]), pd.Series), - pd.Series, - np.integer, - ) + check(assert_type(s.aggregate([min, max]), pd.Series), pd.Series, np.integer) check(assert_type(s.aggregate({0: min}), pd.Series), pd.Series, np.integer) @@ -1521,8 +1601,17 @@ def test_types_bfill() -> None: pd.Series, np.integer, ) - assert assert_type(s1.bfill(inplace=True), None) is None - assert assert_type(s1.bfill(inplace=True, limit_area="outside"), None) is None + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + assert assert_type(s1.bfill(inplace=True), None) is None + assert assert_type(s1.bfill(inplace=True, limit_area="outside"), None) is None + else: + check(assert_type(s1.bfill(inplace=True), None), pd.Series, np.integer) + check( + assert_type(s1.bfill(inplace=True, limit_area="outside"), None), + pd.Series, + np.integer, + ) def test_types_ewm() -> None: @@ -1571,8 +1660,17 @@ def test_types_ffill() -> None: pd.Series, np.integer, ) - assert assert_type(s1.ffill(inplace=True), None) is None - assert assert_type(s1.ffill(inplace=True, limit_area="outside"), None) is None + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + assert assert_type(s1.ffill(inplace=True), None) is None + assert assert_type(s1.ffill(inplace=True, limit_area="outside"), None) is None + else: + check(assert_type(s1.ffill(inplace=True), None), pd.Series, np.integer) + check( + assert_type(s1.ffill(inplace=True, limit_area="outside"), None), + pd.Series, + np.integer, + ) def test_types_as_type() -> None: @@ -1679,7 +1777,11 @@ def test_types_replace() -> None: pd.Series, np.integer, ) - assert assert_type(s.replace(1, 2, inplace=True), None) is None + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + assert assert_type(s.replace(1, 2, inplace=True), None) is None + else: + check(assert_type(s.replace(1, 2, inplace=True), None), pd.Series, np.integer) def test_series_replace() -> None: @@ -1966,11 +2068,7 @@ def test_resample() -> None: def test_squeeze() -> None: s1 = pd.Series([1, 2, 3]) - check( - assert_type(s1.squeeze(), "pd.Series[int] | Scalar"), - pd.Series, - np.integer, - ) + check(assert_type(s1.squeeze(), "pd.Series[int] | Scalar"), pd.Series, np.integer) s2 = pd.Series([1]) check(assert_type(s2.squeeze(), "pd.Series[int] | Scalar"), np.integer) @@ -3147,7 +3245,17 @@ def test_interpolate() -> None: pd.Series, np.integer, ) - check(assert_type(s.interpolate(method="linear", inplace=True), None), type(None)) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check( + assert_type(s.interpolate(method="linear", inplace=True), None), type(None) + ) + else: + check( + assert_type(s.interpolate(method="linear", inplace=True), None), + pd.Series, + np.integer, + ) def test_groupby_diff() -> None: diff --git a/tests/test_frame.py b/tests/test_frame.py index e2f358c80..60e6292e6 100644 --- a/tests/test_frame.py +++ b/tests/test_frame.py @@ -559,7 +559,11 @@ def test_types_drop_duplicates() -> None: def test_types_fillna() -> None: df = pd.DataFrame(data={"col1": [np.nan, np.nan], "col2": [3, np.nan]}) check(assert_type(df.fillna(0), pd.DataFrame), pd.DataFrame) - check(assert_type(df.fillna(0, axis=1, inplace=True), None), type(None)) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check(assert_type(df.fillna(0, axis=1, inplace=True), None), type(None)) + else: + check(assert_type(df.fillna(0, axis=1, inplace=True), None), pd.DataFrame) def test_types_sort_index() -> None: @@ -871,14 +875,25 @@ def test_dataframe_clip() -> None: ), pd.DataFrame, ) - check( - assert_type(df.clip(lower=5, upper=None, axis=None, inplace=True), None), - type(None), - ) - check( - assert_type(df.clip(lower=None, upper=15, axis=None, inplace=True), None), - type(None), - ) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check( + assert_type(df.clip(lower=5, upper=None, axis=None, inplace=True), None), + type(None), + ) + check( + assert_type(df.clip(lower=None, upper=15, axis=None, inplace=True), None), + type(None), + ) + else: + check( + assert_type(df.clip(lower=5, upper=None, axis=None, inplace=True), None), + pd.DataFrame, + ) + check( + assert_type(df.clip(lower=None, upper=15, axis=None, inplace=True), None), + pd.DataFrame, + ) check( assert_type(df.clip(lower=None, upper=None, axis=0), pd.DataFrame), pd.DataFrame @@ -901,28 +916,65 @@ def test_dataframe_clip() -> None: ), pd.DataFrame, ) - check( - assert_type(df.clip(lower=5, upper=None, axis="index", inplace=True), None), - type(None), - ) - check( - assert_type(df.clip(lower=None, upper=15, axis="index", inplace=True), None), - type(None), - ) - check( - assert_type( - df.clip(lower=pd.Series([1, 2]), upper=None, axis="index", inplace=True), - None, - ), - type(None), - ) - check( - assert_type( - df.clip(lower=None, upper=pd.Series([1, 2]), axis="index", inplace=True), - None, - ), - type(None), - ) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check( + assert_type(df.clip(lower=5, upper=None, axis="index", inplace=True), None), + type(None), + ) + check( + assert_type( + df.clip(lower=None, upper=15, axis="index", inplace=True), None + ), + type(None), + ) + check( + assert_type( + df.clip( + lower=pd.Series([1, 2]), upper=None, axis="index", inplace=True + ), + None, + ), + type(None), + ) + check( + assert_type( + df.clip( + lower=None, upper=pd.Series([1, 2]), axis="index", inplace=True + ), + None, + ), + type(None), + ) + else: + check( + assert_type(df.clip(lower=5, upper=None, axis="index", inplace=True), None), + pd.DataFrame, + ) + check( + assert_type( + df.clip(lower=None, upper=15, axis="index", inplace=True), None + ), + pd.DataFrame, + ) + check( + assert_type( + df.clip( + lower=pd.Series([1, 2]), upper=None, axis="index", inplace=True + ), + None, + ), + pd.DataFrame, + ) + check( + assert_type( + df.clip( + lower=None, upper=pd.Series([1, 2]), axis="index", inplace=True + ), + None, + ), + pd.DataFrame, + ) check( assert_type(df.clip(lower=None, upper=None, axis="index"), pd.DataFrame), pd.DataFrame, @@ -953,14 +1005,25 @@ def test_dataframe_clip() -> None: ), pd.DataFrame, ) - check( - assert_type(df.clip(lower=5, upper=None, axis=0, inplace=True), None), - type(None), - ) - check( - assert_type(df.clip(lower=None, upper=15, axis=0, inplace=True), None), - type(None), - ) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check( + assert_type(df.clip(lower=5, upper=None, axis=0, inplace=True), None), + type(None), + ) + check( + assert_type(df.clip(lower=None, upper=15, axis=0, inplace=True), None), + type(None), + ) + else: + check( + assert_type(df.clip(lower=5, upper=None, axis=0, inplace=True), None), + pd.DataFrame, + ) + check( + assert_type(df.clip(lower=None, upper=15, axis=0, inplace=True), None), + pd.DataFrame, + ) # without lower check(assert_type(df.clip(upper=None, axis=None), pd.DataFrame), pd.DataFrame) @@ -969,7 +1032,13 @@ def test_dataframe_clip() -> None: assert_type(df.clip(upper=None, axis=None, inplace=True), pd.DataFrame), pd.DataFrame, ) - check(assert_type(df.clip(upper=15, axis=None, inplace=True), None), type(None)) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check(assert_type(df.clip(upper=15, axis=None, inplace=True), None), type(None)) + else: + check( + assert_type(df.clip(upper=15, axis=None, inplace=True), None), pd.DataFrame + ) check(assert_type(df.clip(upper=None, axis=0), pd.DataFrame), pd.DataFrame) check(assert_type(df.clip(upper=15, axis=0), pd.DataFrame), pd.DataFrame) @@ -981,11 +1050,28 @@ def test_dataframe_clip() -> None: assert_type(df.clip(upper=None, axis="index", inplace=True), pd.DataFrame), pd.DataFrame, ) - check(assert_type(df.clip(upper=15, axis="index", inplace=True), None), type(None)) - check( - assert_type(df.clip(upper=pd.Series([1, 2]), axis="index", inplace=True), None), - type(None), - ) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check( + assert_type(df.clip(upper=15, axis="index", inplace=True), None), type(None) + ) + check( + assert_type( + df.clip(upper=pd.Series([1, 2]), axis="index", inplace=True), None + ), + type(None), + ) + else: + check( + assert_type(df.clip(upper=15, axis="index", inplace=True), None), + pd.DataFrame, + ) + check( + assert_type( + df.clip(upper=pd.Series([1, 2]), axis="index", inplace=True), None + ), + pd.DataFrame, + ) check(assert_type(df.clip(upper=None, axis="index"), pd.DataFrame), pd.DataFrame) check(assert_type(df.clip(upper=15, axis="index"), pd.DataFrame), pd.DataFrame) check( @@ -996,7 +1082,14 @@ def test_dataframe_clip() -> None: assert_type(df.clip(upper=None, axis=0, inplace=True), pd.DataFrame), pd.DataFrame, ) - check(assert_type(df.clip(upper=15, axis=0, inplace=True), None), type(None)) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check(assert_type(df.clip(upper=15, axis=0, inplace=True), None), type(None)) + else: + check( + assert_type(df.clip(upper=15, axis=0, inplace=True), None), + pd.DataFrame, + ) # without upper check( @@ -1008,10 +1101,17 @@ def test_dataframe_clip() -> None: assert_type(df.clip(lower=None, axis=None, inplace=True), pd.DataFrame), pd.DataFrame, ) - check( - assert_type(df.clip(lower=5, axis=None, inplace=True), None), - type(None), - ) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check( + assert_type(df.clip(lower=5, axis=None, inplace=True), None), + type(None), + ) + else: + check( + assert_type(df.clip(lower=5, axis=None, inplace=True), None), + pd.DataFrame, + ) check( assert_type(df.clip(lower=None, axis=None, inplace=True), pd.DataFrame), pd.DataFrame, @@ -1027,14 +1127,32 @@ def test_dataframe_clip() -> None: assert_type(df.clip(lower=None, axis="index", inplace=True), pd.DataFrame), pd.DataFrame, ) - check( - assert_type(df.clip(lower=5, axis="index", inplace=True), None), - type(None), - ) - check( - assert_type(df.clip(lower=pd.Series([1, 2]), axis="index", inplace=True), None), - type(None), - ) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check( + assert_type(df.clip(lower=5, axis="index", inplace=True), None), + type(None), + ) + else: + check( + assert_type(df.clip(lower=5, axis="index", inplace=True), None), + pd.DataFrame, + ) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check( + assert_type( + df.clip(lower=pd.Series([1, 2]), axis="index", inplace=True), None + ), + type(None), + ) + else: + check( + assert_type( + df.clip(lower=pd.Series([1, 2]), axis="index", inplace=True), None + ), + pd.DataFrame, + ) check( assert_type(df.clip(lower=None, axis="index"), pd.DataFrame), pd.DataFrame, @@ -1051,7 +1169,14 @@ def test_dataframe_clip() -> None: assert_type(df.clip(lower=None, axis=0, inplace=True), pd.DataFrame), pd.DataFrame, ) - check(assert_type(df.clip(lower=5, axis=0, inplace=True), None), type(None)) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check(assert_type(df.clip(lower=5, axis=0, inplace=True), None), type(None)) + else: + check( + assert_type(df.clip(lower=5, axis=0, inplace=True), None), + pd.DataFrame, + ) def test_types_abs() -> None: @@ -3013,8 +3138,18 @@ def test_types_ffill() -> None: assert_type(df.ffill(inplace=False, limit_area="inside"), pd.DataFrame), pd.DataFrame, ) - check(assert_type(df.ffill(inplace=True), None), type(None)) - check(assert_type(df.ffill(inplace=True, limit_area="outside"), None), type(None)) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check(assert_type(df.ffill(inplace=True), None), type(None)) + check( + assert_type(df.ffill(inplace=True, limit_area="outside"), None), type(None) + ) + else: + check(assert_type(df.ffill(inplace=True), None), pd.DataFrame) + check( + assert_type(df.ffill(inplace=True, limit_area="outside"), None), + pd.DataFrame, + ) def test_types_bfill() -> None: @@ -3026,8 +3161,18 @@ def test_types_bfill() -> None: assert_type(df.bfill(inplace=False, limit_area="inside"), pd.DataFrame), pd.DataFrame, ) - check(assert_type(df.bfill(inplace=True), None), type(None)) - check(assert_type(df.bfill(inplace=True, limit_area="outside"), None), type(None)) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check(assert_type(df.bfill(inplace=True), None), type(None)) + check( + assert_type(df.bfill(inplace=True, limit_area="outside"), None), type(None) + ) + else: + check(assert_type(df.bfill(inplace=True), None), pd.DataFrame) + check( + assert_type(df.bfill(inplace=True, limit_area="outside"), None), + pd.DataFrame, + ) def test_types_replace() -> None: @@ -3035,7 +3180,11 @@ def test_types_replace() -> None: df = pd.DataFrame([[1, 2, 3]]) check(assert_type(df.replace(1, 2), pd.DataFrame), pd.DataFrame) check(assert_type(df.replace(1, 2, inplace=False), pd.DataFrame), pd.DataFrame) - check(assert_type(df.replace(1, 2, inplace=True), None), type(None)) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check(assert_type(df.replace(1, 2, inplace=True), None), type(None)) + else: + check(assert_type(df.replace(1, 2, inplace=True), None), pd.DataFrame) def test_dataframe_replace() -> None: @@ -3938,21 +4087,38 @@ def test_loc_slice() -> None: check(assert_type(df.loc[mask, mask_col], pd.DataFrame), pd.DataFrame) -def test_where() -> None: - df = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]}) +def where_cond1(x: int) -> bool: + return x % 2 == 0 - def cond1(x: int) -> bool: - return x % 2 == 0 - check(assert_type(df.where(cond1), pd.DataFrame), pd.DataFrame) +def where_cond2(x: pd.DataFrame) -> pd.DataFrame: + return x > 1 + - def cond2(x: pd.DataFrame) -> pd.DataFrame: - return x > 1 +where_cond3 = pd.DataFrame({"a": [True, True, False], "b": [False, False, False]}) + + +@pytest.mark.parametrize("cond", [where_cond1, where_cond2, where_cond3]) +def test_where( + cond: Callable[[int], bool] | Callable[[pd.DataFrame], pd.DataFrame] | pd.DataFrame, +) -> None: + df = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]}) - check(assert_type(df.where(cond2), pd.DataFrame), pd.DataFrame) + check(df.where(cond), pd.DataFrame) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check(df.where(cond, inplace=True), type(None)) + else: + check(df.where(cond, inplace=True), pd.DataFrame) - cond3 = pd.DataFrame({"a": [True, True, False], "b": [False, False, False]}) - check(assert_type(df.where(cond3), pd.DataFrame), pd.DataFrame) + if TYPE_CHECKING: + assert_type(df.where(where_cond1), pd.DataFrame) + assert_type(df.where(where_cond2), pd.DataFrame) + assert_type(df.where(where_cond3), pd.DataFrame) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + assert_type(df.where(where_cond1, inplace=True), None) + assert_type(df.where(where_cond2, inplace=True), None) + assert_type(df.where(where_cond3, inplace=True), None) def test_mask() -> None: @@ -3962,6 +4128,11 @@ def cond1(x: int) -> bool: return x % 2 == 0 check(assert_type(df.mask(cond1), pd.DataFrame), pd.DataFrame) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check(assert_type(df.mask(cond1, inplace=True), None), type(None)) + else: + check(assert_type(df.mask(cond1, inplace=True), None), pd.DataFrame) def test_setitem_loc() -> None: @@ -4498,7 +4669,16 @@ def test_interpolate() -> None: assert_type(df.interpolate(method="linear", inplace=False), pd.DataFrame), pd.DataFrame, ) - check(assert_type(df.interpolate(method="linear", inplace=True), None), type(None)) + # TODO: pandas-dev/pandas#63195 return Self after Pandas 3.0 + if PD_LTE_23: + check( + assert_type(df.interpolate(method="linear", inplace=True), None), type(None) + ) + else: + check( + assert_type(df.interpolate(method="linear", inplace=True), None), + pd.DataFrame, + ) def test_getitem_generator() -> None: