diff --git a/pandas-stubs/core/series.pyi b/pandas-stubs/core/series.pyi index d206adcb..735749d2 100644 --- a/pandas-stubs/core/series.pyi +++ b/pandas-stubs/core/series.pyi @@ -2097,27 +2097,48 @@ class Series(IndexOpsMixin[S1], NDFrame): def __sub__(self, other: num | _ListLike | Series) -> Series: ... @overload def __truediv__( - self: Series[Never], other: Scalar | _ListLike | Series + self: Series[Never], other: complex | _ListLike | Series ) -> Series: ... @overload def __truediv__(self, other: Series[Never]) -> Series: ... @overload def __truediv__( - self: Series[int], + self: Series[bool], other: int | Sequence[int] | np_ndarray_anyint | np_ndarray_float | Series[int], ) -> Series[float]: ... @overload def __truediv__( - self: Series[int], other: _T_COMPLEX | Sequence[_T_COMPLEX] | Series[_T_COMPLEX] + self: Series[bool], + other: _T_COMPLEX | Sequence[_T_COMPLEX] | Series[_T_COMPLEX], ) -> Series[_T_COMPLEX]: ... @overload def __truediv__( - self: Series[int], other: np_ndarray_complex - ) -> Series[complex]: ... + self: Series[int], + other: ( + _T_INT + | Sequence[_T_INT] + | np_ndarray_bool + | np_ndarray_anyint + | np_ndarray_float + | Series[_T_INT] + ), + ) -> Series[float]: ... + @overload + def __truediv__( + self: Series[int], + other: _T_COMPLEX | Sequence[_T_COMPLEX] | Series[_T_COMPLEX], + ) -> Series[_T_COMPLEX]: ... @overload def __truediv__( self: Series[float], - other: int | Sequence[int] | np_ndarray_anyint | np_ndarray_float | Series[int], + other: ( + _T_INT + | Sequence[_T_INT] + | np_ndarray_bool + | np_ndarray_anyint + | np_ndarray_float + | Series[_T_INT] + ), ) -> Series[float]: ... @overload def __truediv__( @@ -2126,7 +2147,7 @@ class Series(IndexOpsMixin[S1], NDFrame): ) -> Series[_T_COMPLEX]: ... @overload def __truediv__( - self: Series[float], other: np_ndarray_complex + self: Series[_T_COMPLEX], other: np_ndarray_complex ) -> Series[complex]: ... @overload def __truediv__( @@ -2134,9 +2155,9 @@ class Series(IndexOpsMixin[S1], NDFrame): other: ( _T_COMPLEX | Sequence[_T_COMPLEX] + | np_ndarray_bool | np_ndarray_anyint | np_ndarray_float - | np_ndarray_complex | Series[_T_COMPLEX] ), ) -> Series[complex]: ... @@ -2145,7 +2166,7 @@ class Series(IndexOpsMixin[S1], NDFrame): @overload def truediv( self: Series[Never], - other: Scalar | _ListLike | Series, + other: complex | _ListLike | Series, level: Level | None = None, fill_value: float | None = None, axis: AxisIndex = 0, @@ -2160,7 +2181,7 @@ class Series(IndexOpsMixin[S1], NDFrame): ) -> Series: ... @overload def truediv( - self: Series[int], + self: Series[bool], other: int | Sequence[int] | np_ndarray_anyint | np_ndarray_float | Series[int], level: Level | None = None, fill_value: float | None = None, @@ -2168,7 +2189,7 @@ class Series(IndexOpsMixin[S1], NDFrame): ) -> Series[float]: ... @overload def truediv( - self: Series[int], + self: Series[bool], other: _T_COMPLEX | Sequence[_T_COMPLEX] | Series[_T_COMPLEX], level: Level | None = None, fill_value: float | None = None, @@ -2177,11 +2198,26 @@ class Series(IndexOpsMixin[S1], NDFrame): @overload def truediv( self: Series[int], - other: np_ndarray_complex, + other: ( + _T_INT + | Sequence[_T_INT] + | np_ndarray_bool + | np_ndarray_anyint + | np_ndarray_float + | Series[_T_INT] + ), level: Level | None = None, fill_value: float | None = None, axis: AxisIndex = 0, - ) -> Series[complex]: ... + ) -> Series[float]: ... + @overload + def truediv( + self: Series[int], + other: _T_COMPLEX | Sequence[_T_COMPLEX] | Series[_T_COMPLEX], + level: Level | None = None, + fill_value: float | None = None, + axis: AxisIndex = 0, + ) -> Series[_T_COMPLEX]: ... @overload def truediv( self: Series[float], @@ -2200,7 +2236,7 @@ class Series(IndexOpsMixin[S1], NDFrame): ) -> Series[_T_COMPLEX]: ... @overload def truediv( - self: Series[float], + self: Series[_T_COMPLEX], other: np_ndarray_complex, level: Level | None = None, fill_value: float | None = None, @@ -2212,9 +2248,9 @@ class Series(IndexOpsMixin[S1], NDFrame): other: ( _T_COMPLEX | Sequence[_T_COMPLEX] + | np_ndarray_bool | np_ndarray_anyint | np_ndarray_float - | np_ndarray_complex | Series[_T_COMPLEX] ), level: Level | None = None, @@ -2231,20 +2267,31 @@ class Series(IndexOpsMixin[S1], NDFrame): ) -> Series: ... div = truediv @overload - def __rtruediv__(self: Series[Never], other: Scalar | _ListLike) -> Series: ... + def __rtruediv__(self: Series[Never], other: complex | _ListLike) -> Series: ... @overload def __rtruediv__( - self: Series[int], - other: int | Sequence[int] | np_ndarray_anyint | np_ndarray_float, + self: Series[bool], + other: _T_INT | Sequence[_T_INT] | np_ndarray_anyint | np_ndarray_float, ) -> Series[float]: ... @overload def __rtruediv__( - self: Series[int], other: _T_COMPLEX | Sequence[_T_COMPLEX] + self: Series[bool], other: _T_COMPLEX | Sequence[_T_COMPLEX] ) -> Series[_T_COMPLEX]: ... @overload def __rtruediv__( - self: Series[int], other: np_ndarray_complex - ) -> Series[complex]: ... + self: Series[int], + other: ( + _T_INT + | Sequence[_T_INT] + | np_ndarray_bool + | np_ndarray_anyint + | np_ndarray_float + ), + ) -> Series[float]: ... + @overload + def __rtruediv__( + self: Series[int], other: _T_COMPLEX | Sequence[_T_COMPLEX] + ) -> Series[_T_COMPLEX]: ... @overload def __rtruediv__( self: Series[float], @@ -2255,33 +2302,33 @@ class Series(IndexOpsMixin[S1], NDFrame): self: Series[float], other: _T_COMPLEX | Sequence[_T_COMPLEX] ) -> Series[_T_COMPLEX]: ... @overload - def __rtruediv__( - self: Series[float], other: np_ndarray_complex - ) -> Series[complex]: ... - @overload def __rtruediv__( self: Series[complex], other: ( _T_COMPLEX | Sequence[_T_COMPLEX] + | np_ndarray_bool | np_ndarray_anyint | np_ndarray_float - | np_ndarray_complex ), ) -> Series[complex]: ... @overload + def __rtruediv__( + self: Series[_T_COMPLEX], other: np_ndarray_complex + ) -> Series[complex]: ... + @overload def __rtruediv__(self, other: Path) -> Series: ... @overload def rtruediv( self: Series[Never], - other: Scalar | _ListLike | Series, + other: complex | _ListLike | Series, level: Level | None = None, fill_value: float | None = None, axis: AxisIndex = 0, ) -> Series: ... @overload def rtruediv( - self: Series[int], + self: Series[bool], other: int | Sequence[int] | np_ndarray_anyint | np_ndarray_float | Series[int], level: Level | None = None, fill_value: float | None = None, @@ -2289,7 +2336,7 @@ class Series(IndexOpsMixin[S1], NDFrame): ) -> Series[float]: ... @overload def rtruediv( - self: Series[int], + self: Series[bool], other: _T_COMPLEX | Sequence[_T_COMPLEX] | Series[_T_COMPLEX], level: Level | None = None, fill_value: float | None = None, @@ -2298,44 +2345,51 @@ class Series(IndexOpsMixin[S1], NDFrame): @overload def rtruediv( self: Series[int], - other: np_ndarray_complex, + other: ( + _T_INT + | Sequence[_T_INT] + | np_ndarray_bool + | np_ndarray_anyint + | np_ndarray_float + | Series[_T_INT] + ), level: Level | None = None, fill_value: float | None = None, axis: AxisIndex = 0, - ) -> Series[complex]: ... + ) -> Series[float]: ... @overload def rtruediv( - self: Series[float], - other: int | Sequence[int] | np_ndarray_anyint | np_ndarray_float | Series[int], + self: Series[int], + other: _T_COMPLEX | Sequence[_T_COMPLEX] | Series[_T_COMPLEX], level: Level | None = None, fill_value: float | None = None, axis: AxisIndex = 0, - ) -> Series[float]: ... + ) -> Series[_T_COMPLEX]: ... @overload def rtruediv( self: Series[float], - other: _T_COMPLEX | Sequence[_T_COMPLEX] | Series[_T_COMPLEX], + other: int | Sequence[int] | np_ndarray_anyint | np_ndarray_float | Series[int], level: Level | None = None, fill_value: float | None = None, axis: AxisIndex = 0, - ) -> Series[_T_COMPLEX]: ... + ) -> Series[float]: ... @overload def rtruediv( self: Series[float], - other: np_ndarray_complex, + other: _T_COMPLEX | Sequence[_T_COMPLEX] | Series[_T_COMPLEX], level: Level | None = None, fill_value: float | None = None, axis: AxisIndex = 0, - ) -> Series[complex]: ... + ) -> Series[_T_COMPLEX]: ... @overload def rtruediv( self: Series[complex], other: ( _T_COMPLEX | Sequence[_T_COMPLEX] + | np_ndarray_bool | np_ndarray_anyint | np_ndarray_float - | np_ndarray_complex | Series[_T_COMPLEX] ), level: Level | None = None, @@ -2343,6 +2397,14 @@ class Series(IndexOpsMixin[S1], NDFrame): axis: AxisIndex = 0, ) -> Series[complex]: ... @overload + def rtruediv( + self: Series[_T_COMPLEX], + other: np_ndarray_complex, + level: Level | None = None, + fill_value: float | None = None, + axis: AxisIndex = 0, + ) -> Series[complex]: ... + @overload def rtruediv( self, other: Path, diff --git a/tests/series/arithmetic/bool/test_truediv.py b/tests/series/arithmetic/bool/test_truediv.py new file mode 100644 index 00000000..e4b8cd0d --- /dev/null +++ b/tests/series/arithmetic/bool/test_truediv.py @@ -0,0 +1,175 @@ +import numpy as np +from numpy import typing as npt # noqa: F401 +import pandas as pd +from typing_extensions import assert_type + +from tests import check + +left = pd.Series([True, False, True]) # left operand + + +def test_truediv_py_scalar() -> None: + """Test pd.Series[bool] / Python native scalars""" + i, f, c = 1, 1.0, 1j + + 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(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) + + check(assert_type(left.truediv(i), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.truediv(f), "pd.Series[float]"), pd.Series, np.floating) + check( + assert_type(left.truediv(c), "pd.Series[complex]"), + pd.Series, + np.complexfloating, + ) + + check(assert_type(left.div(i), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.div(f), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complexfloating) + + check(assert_type(left.rtruediv(i), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.rtruediv(f), "pd.Series[float]"), pd.Series, np.floating) + check( + assert_type(left.rtruediv(c), "pd.Series[complex]"), + pd.Series, + np.complexfloating, + ) + + check(assert_type(left.rdiv(i), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.rdiv(f), "pd.Series[float]"), pd.Series, np.floating) + check( + assert_type(left.rdiv(c), "pd.Series[complex]"), pd.Series, np.complexfloating + ) + + +def test_truediv_py_sequence() -> None: + """Test pd.Series[bool] / Python native sequence""" + i, f, c = [2, 3, 5], [1.0, 2.0, 3.0], [1j, 1j, 4j] + + 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(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) + + check(assert_type(left.truediv(i), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.truediv(f), "pd.Series[float]"), pd.Series, np.floating) + check( + assert_type(left.truediv(c), "pd.Series[complex]"), + pd.Series, + np.complexfloating, + ) + + check(assert_type(left.div(i), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.div(f), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complexfloating) + + check(assert_type(left.rtruediv(i), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.rtruediv(f), "pd.Series[float]"), pd.Series, np.floating) + check( + assert_type(left.rtruediv(c), "pd.Series[complex]"), + pd.Series, + np.complexfloating, + ) + + check(assert_type(left.rdiv(i), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.rdiv(f), "pd.Series[float]"), pd.Series, np.floating) + check( + assert_type(left.rdiv(c), "pd.Series[complex]"), pd.Series, np.complexfloating + ) + + +def test_truediv_numpy_array() -> None: + """Test pd.Series[bool] / numpy array""" + i = np.array([2, 3, 5], np.int64) + f = np.array([1.0, 2.0, 3.0], np.float64) + c = np.array([1.1j, 2.2j, 4.1j], np.complex128) + + 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) + + # `numpy` typing gives the corresponding `ndarray`s in the static type + # checking, where our `__rtruediv__` cannot override. At runtime, they return + # `Series`s with the correct element type. + check(assert_type(i / left, "npt.NDArray[np.float64]"), pd.Series, np.floating) + check(assert_type(f / left, "npt.NDArray[np.float64]"), pd.Series, np.floating) + check( + assert_type(c / left, "npt.NDArray[np.complex128]"), + pd.Series, + np.complexfloating, + ) + + check(assert_type(left.truediv(i), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.truediv(f), "pd.Series[float]"), pd.Series, np.floating) + check( + assert_type(left.truediv(c), "pd.Series[complex]"), + pd.Series, + np.complexfloating, + ) + + check(assert_type(left.div(i), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.div(f), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complexfloating) + + check(assert_type(left.rtruediv(i), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.rtruediv(f), "pd.Series[float]"), pd.Series, np.floating) + check( + assert_type(left.rtruediv(c), "pd.Series[complex]"), + pd.Series, + np.complexfloating, + ) + + check(assert_type(left.rdiv(i), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.rdiv(f), "pd.Series[float]"), pd.Series, np.floating) + check( + assert_type(left.rdiv(c), "pd.Series[complex]"), pd.Series, np.complexfloating + ) + + +def test_truediv_pd_series() -> None: + """Test pd.Series[bool] / pandas series""" + i = pd.Series([2, 3, 5]) + f = pd.Series([1.0, 2.0, 3.0]) + c = pd.Series([1.1j, 2.2j, 4.1j]) + + 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(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) + + check(assert_type(left.truediv(i), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.truediv(f), "pd.Series[float]"), pd.Series, np.floating) + check( + assert_type(left.truediv(c), "pd.Series[complex]"), + pd.Series, + np.complexfloating, + ) + + check(assert_type(left.div(i), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.div(f), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complexfloating) + + check(assert_type(left.rtruediv(i), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.rtruediv(f), "pd.Series[float]"), pd.Series, np.floating) + check( + assert_type(left.rtruediv(c), "pd.Series[complex]"), + pd.Series, + np.complexfloating, + ) + + check(assert_type(left.rdiv(i), "pd.Series[float]"), pd.Series, np.floating) + check(assert_type(left.rdiv(f), "pd.Series[float]"), pd.Series, np.floating) + check( + assert_type(left.rdiv(c), "pd.Series[complex]"), pd.Series, np.complexfloating + ) diff --git a/tests/series/arithmetic/complex/test_truediv.py b/tests/series/arithmetic/complex/test_truediv.py index 996541b8..ddf3529d 100644 --- a/tests/series/arithmetic/complex/test_truediv.py +++ b/tests/series/arithmetic/complex/test_truediv.py @@ -10,16 +10,23 @@ def test_truediv_py_scalar() -> None: """Test pd.Series[complex] / Python native scalars""" - i, f, c = 1, 1.0, 1j + b, i, f, c = True, 1, 1.0, 1j + check(assert_type(left / b, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left / i, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left / f, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left / c, "pd.Series[complex]"), pd.Series, np.complexfloating) + check(assert_type(b / left, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(i / left, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(f / left, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(c / left, "pd.Series[complex]"), pd.Series, np.complexfloating) + check( + assert_type(left.truediv(b), "pd.Series[complex]"), + pd.Series, + np.complexfloating, + ) check( assert_type(left.truediv(i), "pd.Series[complex]"), pd.Series, @@ -36,10 +43,16 @@ def test_truediv_py_scalar() -> None: np.complexfloating, ) + check(assert_type(left.div(b), "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left.div(i), "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left.div(f), "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complexfloating) + check( + assert_type(left.rtruediv(b), "pd.Series[complex]"), + pd.Series, + np.complexfloating, + ) check( assert_type(left.rtruediv(i), "pd.Series[complex]"), pd.Series, @@ -56,6 +69,9 @@ def test_truediv_py_scalar() -> None: np.complexfloating, ) + check( + assert_type(left.rdiv(b), "pd.Series[complex]"), pd.Series, np.complexfloating + ) check( assert_type(left.rdiv(i), "pd.Series[complex]"), pd.Series, np.complexfloating ) @@ -69,16 +85,23 @@ def test_truediv_py_scalar() -> None: def test_truediv_py_sequence() -> None: """Test pd.Series[complex] / Python native sequence""" - i, f, c = [2, 3, 5], [1.0, 2.0, 3.0], [1j, 1j, 4j] + 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[complex]"), pd.Series, np.complexfloating) check(assert_type(left / i, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left / f, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left / c, "pd.Series[complex]"), pd.Series, np.complexfloating) + check(assert_type(b / left, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(i / left, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(f / left, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(c / left, "pd.Series[complex]"), pd.Series, np.complexfloating) + check( + assert_type(left.truediv(b), "pd.Series[complex]"), + pd.Series, + np.complexfloating, + ) check( assert_type(left.truediv(i), "pd.Series[complex]"), pd.Series, @@ -95,10 +118,16 @@ def test_truediv_py_sequence() -> None: np.complexfloating, ) + check(assert_type(left.div(b), "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left.div(i), "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left.div(f), "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complexfloating) + check( + assert_type(left.rtruediv(b), "pd.Series[complex]"), + pd.Series, + np.complexfloating, + ) check( assert_type(left.rtruediv(i), "pd.Series[complex]"), pd.Series, @@ -115,6 +144,9 @@ def test_truediv_py_sequence() -> None: np.complexfloating, ) + check( + assert_type(left.rdiv(b), "pd.Series[complex]"), pd.Series, np.complexfloating + ) check( assert_type(left.rdiv(i), "pd.Series[complex]"), pd.Series, np.complexfloating ) @@ -128,10 +160,12 @@ def test_truediv_py_sequence() -> None: def test_truediv_numpy_array() -> None: """Test pd.Series[complex] / numpy array""" + b = np.array([True, False, True], np.bool_) i = np.array([2, 3, 5], np.int64) f = np.array([1.0, 2.0, 3.0], np.float64) c = np.array([1.1j, 2.2j, 4.1j], np.complex128) + check(assert_type(left / b, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left / i, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left / f, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left / c, "pd.Series[complex]"), pd.Series, np.complexfloating) @@ -139,6 +173,9 @@ def test_truediv_numpy_array() -> None: # `numpy` typing gives the corresponding `ndarray`s in the static type # checking, where our `__rtruediv__` cannot override. At runtime, they return # `Series`s with the correct element type. + check( + assert_type(b / left, "npt.NDArray[np.float64]"), pd.Series, np.complexfloating + ) check( assert_type(i / left, "npt.NDArray[np.float64]"), pd.Series, np.complexfloating ) @@ -151,6 +188,11 @@ def test_truediv_numpy_array() -> None: np.complexfloating, ) + check( + assert_type(left.truediv(b), "pd.Series[complex]"), + pd.Series, + np.complexfloating, + ) check( assert_type(left.truediv(i), "pd.Series[complex]"), pd.Series, @@ -167,10 +209,16 @@ def test_truediv_numpy_array() -> None: np.complexfloating, ) + check(assert_type(left.div(b), "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left.div(i), "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left.div(f), "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complexfloating) + check( + assert_type(left.rtruediv(b), "pd.Series[complex]"), + pd.Series, + np.complexfloating, + ) check( assert_type(left.rtruediv(i), "pd.Series[complex]"), pd.Series, @@ -187,6 +235,9 @@ def test_truediv_numpy_array() -> None: np.complexfloating, ) + check( + assert_type(left.rdiv(b), "pd.Series[complex]"), pd.Series, np.complexfloating + ) check( assert_type(left.rdiv(i), "pd.Series[complex]"), pd.Series, np.complexfloating ) @@ -200,18 +251,26 @@ def test_truediv_numpy_array() -> None: def test_truediv_pd_series() -> None: """Test pd.Series[complex] / pandas series""" + b = pd.Series([True, False, True]) i = pd.Series([2, 3, 5]) f = pd.Series([1.0, 2.0, 3.0]) c = pd.Series([1.1j, 2.2j, 4.1j]) + check(assert_type(left / b, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left / i, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left / f, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left / c, "pd.Series[complex]"), pd.Series, np.complexfloating) + check(assert_type(b / left, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(i / left, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(f / left, "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(c / left, "pd.Series[complex]"), pd.Series, np.complexfloating) + check( + assert_type(left.truediv(b), "pd.Series[complex]"), + pd.Series, + np.complexfloating, + ) check( assert_type(left.truediv(i), "pd.Series[complex]"), pd.Series, @@ -228,10 +287,16 @@ def test_truediv_pd_series() -> None: np.complexfloating, ) + check(assert_type(left.div(b), "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left.div(i), "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left.div(f), "pd.Series[complex]"), pd.Series, np.complexfloating) check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complexfloating) + check( + assert_type(left.rtruediv(b), "pd.Series[complex]"), + pd.Series, + np.complexfloating, + ) check( assert_type(left.rtruediv(i), "pd.Series[complex]"), pd.Series, @@ -248,6 +313,9 @@ def test_truediv_pd_series() -> None: np.complexfloating, ) + check( + assert_type(left.rdiv(b), "pd.Series[complex]"), pd.Series, np.complexfloating + ) check( assert_type(left.rdiv(i), "pd.Series[complex]"), pd.Series, np.complexfloating ) diff --git a/tests/series/arithmetic/float/test_truediv.py b/tests/series/arithmetic/float/test_truediv.py index 2bb8c482..80d283c6 100644 --- a/tests/series/arithmetic/float/test_truediv.py +++ b/tests/series/arithmetic/float/test_truediv.py @@ -10,7 +10,7 @@ def test_truediv_py_scalar() -> None: """Test pd.Series[float] / Python native scalars""" - i, f, c = 1, 1.0, 1j + b, i, f, c = True, 1, 1.0, 1j check(assert_type(left / i, "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left / f, "pd.Series[float]"), pd.Series, np.floating) @@ -49,7 +49,7 @@ def test_truediv_py_scalar() -> None: def test_truediv_py_sequence() -> None: """Test pd.Series[float] / Python native sequence""" - i, f, c = [2, 3, 5], [1.0, 2.0, 3.0], [1j, 1j, 4j] + b, i, f, c = [True, False, True], [2, 3, 5], [1.0, 2.0, 3.0], [1j, 1j, 4j] check(assert_type(left / i, "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left / f, "pd.Series[float]"), pd.Series, np.floating) @@ -88,6 +88,7 @@ def test_truediv_py_sequence() -> None: def test_truediv_numpy_array() -> None: """Test pd.Series[float] / numpy array""" + b = np.array([True, False, True], np.bool_) i = np.array([2, 3, 5], np.int64) f = np.array([1.0, 2.0, 3.0], np.float64) c = np.array([1.1j, 2.2j, 4.1j], np.complex128) @@ -136,6 +137,7 @@ def test_truediv_numpy_array() -> None: def test_truediv_pd_series() -> None: """Test pd.Series[float] / pandas series""" + b = pd.Series([True, False, True]) i = pd.Series([2, 3, 5]) f = pd.Series([1.0, 2.0, 3.0]) c = pd.Series([1.1j, 2.2j, 4.1j]) diff --git a/tests/series/arithmetic/int/test_truediv.py b/tests/series/arithmetic/int/test_truediv.py index 34e642e4..4f0785cc 100644 --- a/tests/series/arithmetic/int/test_truediv.py +++ b/tests/series/arithmetic/int/test_truediv.py @@ -10,16 +10,19 @@ def test_truediv_py_scalar() -> None: """Test pd.Series[int] / Python native scalars""" - i, f, c = 1, 1.0, 1j + b, i, f, c = True, 1, 1.0, 1j + check(assert_type(left / b, "pd.Series[float]"), pd.Series, np.floating) 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) 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) + check(assert_type(left.truediv(b), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.truediv(i), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.truediv(f), "pd.Series[float]"), pd.Series, np.floating) check( @@ -28,10 +31,12 @@ def test_truediv_py_scalar() -> None: np.complexfloating, ) + check(assert_type(left.div(b), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.div(i), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.div(f), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complexfloating) + check(assert_type(left.rtruediv(b), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.rtruediv(i), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.rtruediv(f), "pd.Series[float]"), pd.Series, np.floating) check( @@ -40,6 +45,7 @@ def test_truediv_py_scalar() -> None: np.complexfloating, ) + check(assert_type(left.rdiv(b), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.rdiv(i), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.rdiv(f), "pd.Series[float]"), pd.Series, np.floating) check( @@ -49,16 +55,19 @@ def test_truediv_py_scalar() -> None: def test_truediv_py_sequence() -> None: """Test pd.Series[int] / Python native sequence""" - i, f, c = [2, 3, 5], [1.0, 2.0, 3.0], [1j, 1j, 4j] + 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) 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) 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) + check(assert_type(left.truediv(b), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.truediv(i), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.truediv(f), "pd.Series[float]"), pd.Series, np.floating) check( @@ -67,10 +76,12 @@ def test_truediv_py_sequence() -> None: np.complexfloating, ) + check(assert_type(left.div(b), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.div(i), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.div(f), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complexfloating) + check(assert_type(left.rtruediv(b), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.rtruediv(i), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.rtruediv(f), "pd.Series[float]"), pd.Series, np.floating) check( @@ -79,6 +90,7 @@ def test_truediv_py_sequence() -> None: np.complexfloating, ) + check(assert_type(left.rdiv(b), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.rdiv(i), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.rdiv(f), "pd.Series[float]"), pd.Series, np.floating) check( @@ -88,10 +100,12 @@ def test_truediv_py_sequence() -> None: def test_truediv_numpy_array() -> None: """Test pd.Series[int] / numpy array""" + b = np.array([True, False, True], np.bool_) i = np.array([2, 3, 5], np.int64) f = np.array([1.0, 2.0, 3.0], np.float64) c = np.array([1.1j, 2.2j, 4.1j], np.complex128) + check(assert_type(left / b, "pd.Series[float]"), pd.Series, np.floating) 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) @@ -99,6 +113,7 @@ def test_truediv_numpy_array() -> None: # `numpy` typing gives the corresponding `ndarray`s in the static type # checking, where our `__rtruediv__` cannot override. At runtime, they return # `Series`s with the correct element type. + check(assert_type(b / left, "npt.NDArray[np.float64]"), pd.Series, np.floating) check(assert_type(i / left, "npt.NDArray[np.float64]"), pd.Series, np.floating) check(assert_type(f / left, "npt.NDArray[np.float64]"), pd.Series, np.floating) check( @@ -107,6 +122,7 @@ def test_truediv_numpy_array() -> None: np.complexfloating, ) + check(assert_type(left.truediv(b), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.truediv(i), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.truediv(f), "pd.Series[float]"), pd.Series, np.floating) check( @@ -115,10 +131,12 @@ def test_truediv_numpy_array() -> None: np.complexfloating, ) + check(assert_type(left.div(b), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.div(i), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.div(f), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complexfloating) + check(assert_type(left.rtruediv(b), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.rtruediv(i), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.rtruediv(f), "pd.Series[float]"), pd.Series, np.floating) check( @@ -127,6 +145,7 @@ def test_truediv_numpy_array() -> None: np.complexfloating, ) + check(assert_type(left.rdiv(b), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.rdiv(i), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.rdiv(f), "pd.Series[float]"), pd.Series, np.floating) check( @@ -136,18 +155,22 @@ def test_truediv_numpy_array() -> None: def test_truediv_pd_series() -> None: """Test pd.Series[int] / pandas series""" + b = pd.Series([True, False, True]) i = pd.Series([2, 3, 5]) f = pd.Series([1.0, 2.0, 3.0]) c = pd.Series([1.1j, 2.2j, 4.1j]) + check(assert_type(left / b, "pd.Series[float]"), pd.Series, np.floating) 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) 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) + check(assert_type(left.truediv(b), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.truediv(i), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.truediv(f), "pd.Series[float]"), pd.Series, np.floating) check( @@ -156,10 +179,12 @@ def test_truediv_pd_series() -> None: np.complexfloating, ) + check(assert_type(left.div(b), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.div(i), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.div(f), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complexfloating) + check(assert_type(left.rtruediv(b), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.rtruediv(i), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.rtruediv(f), "pd.Series[float]"), pd.Series, np.floating) check( @@ -168,6 +193,7 @@ def test_truediv_pd_series() -> None: np.complexfloating, ) + check(assert_type(left.rdiv(b), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.rdiv(i), "pd.Series[float]"), pd.Series, np.floating) check(assert_type(left.rdiv(f), "pd.Series[float]"), pd.Series, np.floating) check( diff --git a/tests/series/arithmetic/test_truediv.py b/tests/series/arithmetic/test_truediv.py index c5d5efaf..155a0c0e 100644 --- a/tests/series/arithmetic/test_truediv.py +++ b/tests/series/arithmetic/test_truediv.py @@ -15,28 +15,34 @@ def test_truediv_py_scalar() -> None: """Test pd.Series[Any] / Python native scalars""" - i, f, c = 1, 1.0, 1j + b, i, f, c = True, 1, 1.0, 1j + check(assert_type(left / b, pd.Series), pd.Series) check(assert_type(left / i, pd.Series), pd.Series) check(assert_type(left / f, pd.Series), pd.Series) check(assert_type(left / c, pd.Series), pd.Series) + check(assert_type(b / left, pd.Series), pd.Series) check(assert_type(i / left, pd.Series), pd.Series) check(assert_type(f / left, pd.Series), pd.Series) check(assert_type(c / left, pd.Series), pd.Series) + check(assert_type(left.truediv(b), pd.Series), pd.Series) check(assert_type(left.truediv(i), pd.Series), pd.Series) check(assert_type(left.truediv(f), pd.Series), pd.Series) check(assert_type(left.truediv(c), pd.Series), pd.Series) + check(assert_type(left.div(b), pd.Series), pd.Series) check(assert_type(left.div(i), pd.Series), pd.Series) check(assert_type(left.div(f), pd.Series), pd.Series) check(assert_type(left.div(c), pd.Series), pd.Series) + check(assert_type(left.rtruediv(b), pd.Series), pd.Series) check(assert_type(left.rtruediv(i), pd.Series), pd.Series) check(assert_type(left.rtruediv(f), pd.Series), pd.Series) check(assert_type(left.rtruediv(c), pd.Series), pd.Series) + check(assert_type(left.rdiv(b), pd.Series), pd.Series) check(assert_type(left.rdiv(i), pd.Series), pd.Series) check(assert_type(left.rdiv(f), pd.Series), pd.Series) check(assert_type(left.rdiv(c), pd.Series), pd.Series) @@ -44,28 +50,34 @@ def test_truediv_py_scalar() -> None: def test_truediv_py_sequence() -> None: """Test pd.Series[Any] / Python native sequence""" - i, f, c = [2, 3, 5], [1.0, 2.0, 3.0], [1j, 1j, 4j] + 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), pd.Series) check(assert_type(left / i, pd.Series), pd.Series) check(assert_type(left / f, pd.Series), pd.Series) check(assert_type(left / c, pd.Series), pd.Series) + check(assert_type(b / left, pd.Series), pd.Series) check(assert_type(i / left, pd.Series), pd.Series) check(assert_type(f / left, pd.Series), pd.Series) check(assert_type(c / left, pd.Series), pd.Series) + check(assert_type(left.truediv(b), pd.Series), pd.Series) check(assert_type(left.truediv(i), pd.Series), pd.Series) check(assert_type(left.truediv(f), pd.Series), pd.Series) check(assert_type(left.truediv(c), pd.Series), pd.Series) + check(assert_type(left.div(b), pd.Series), pd.Series) check(assert_type(left.div(i), pd.Series), pd.Series) check(assert_type(left.div(f), pd.Series), pd.Series) check(assert_type(left.div(c), pd.Series), pd.Series) + check(assert_type(left.rtruediv(b), pd.Series), pd.Series) check(assert_type(left.rtruediv(i), pd.Series), pd.Series) check(assert_type(left.rtruediv(f), pd.Series), pd.Series) check(assert_type(left.rtruediv(c), pd.Series), pd.Series) + check(assert_type(left.rdiv(b), pd.Series), pd.Series) check(assert_type(left.rdiv(i), pd.Series), pd.Series) check(assert_type(left.rdiv(f), pd.Series), pd.Series) check(assert_type(left.rdiv(c), pd.Series), pd.Series) @@ -73,10 +85,12 @@ def test_truediv_py_sequence() -> None: def test_truediv_numpy_array() -> None: """Test pd.Series[Any] / numpy array""" + b = np.array([True, False, True], np.bool_) i = np.array([2, 3, 5], np.int64) f = np.array([1.0, 2.0, 3.0], np.float64) c = np.array([1.1j, 2.2j, 4.1j], np.complex64) + check(assert_type(left / b, pd.Series), pd.Series) check(assert_type(left / i, pd.Series), pd.Series) check(assert_type(left / f, pd.Series), pd.Series) check(assert_type(left / c, pd.Series), pd.Series) @@ -85,6 +99,9 @@ def test_truediv_numpy_array() -> None: # checking, where our `__rtruediv__` cannot override. At runtime, they return # `Series`s. # `mypy` thinks the return types are `Any`, which is a bug. + check( + assert_type(b / left, "npt.NDArray[np.float64]"), pd.Series # type: ignore[assert-type] + ) check( assert_type(i / left, "npt.NDArray[np.float64]"), pd.Series # type: ignore[assert-type] ) @@ -95,18 +112,22 @@ def test_truediv_numpy_array() -> None: assert_type(c / left, "npt.NDArray[np.complex128]"), pd.Series # type: ignore[assert-type] ) + check(assert_type(left.truediv(b), pd.Series), pd.Series) check(assert_type(left.truediv(i), pd.Series), pd.Series) check(assert_type(left.truediv(f), pd.Series), pd.Series) check(assert_type(left.truediv(c), pd.Series), pd.Series) + check(assert_type(left.div(b), pd.Series), pd.Series) check(assert_type(left.div(i), pd.Series), pd.Series) check(assert_type(left.div(f), pd.Series), pd.Series) check(assert_type(left.div(c), pd.Series), pd.Series) + check(assert_type(left.rtruediv(b), pd.Series), pd.Series) check(assert_type(left.rtruediv(i), pd.Series), pd.Series) check(assert_type(left.rtruediv(f), pd.Series), pd.Series) check(assert_type(left.rtruediv(c), pd.Series), pd.Series) + check(assert_type(left.rdiv(b), pd.Series), pd.Series) check(assert_type(left.rdiv(i), pd.Series), pd.Series) check(assert_type(left.rdiv(f), pd.Series), pd.Series) check(assert_type(left.rdiv(c), pd.Series), pd.Series) @@ -114,30 +135,37 @@ def test_truediv_numpy_array() -> None: def test_truediv_pd_series() -> None: """Test pd.Series[Any] / pandas series""" + b = pd.Series([True, False, True]) i = pd.Series([2, 3, 5]) f = pd.Series([1.0, 2.0, 3.0]) c = pd.Series([1.1j, 2.2j, 4.1j]) + check(assert_type(left / b, pd.Series), pd.Series) check(assert_type(left / i, pd.Series), pd.Series) check(assert_type(left / f, pd.Series), pd.Series) check(assert_type(left / c, pd.Series), pd.Series) + check(assert_type(b / left, pd.Series), pd.Series) check(assert_type(i / left, pd.Series), pd.Series) check(assert_type(f / left, pd.Series), pd.Series) check(assert_type(c / left, pd.Series), pd.Series) + check(assert_type(left.truediv(b), pd.Series), pd.Series) check(assert_type(left.truediv(i), pd.Series), pd.Series) check(assert_type(left.truediv(f), pd.Series), pd.Series) check(assert_type(left.truediv(c), pd.Series), pd.Series) + check(assert_type(left.div(b), pd.Series), pd.Series) check(assert_type(left.div(i), pd.Series), pd.Series) check(assert_type(left.div(f), pd.Series), pd.Series) check(assert_type(left.div(c), pd.Series), pd.Series) + check(assert_type(left.rtruediv(b), pd.Series), pd.Series) check(assert_type(left.rtruediv(i), pd.Series), pd.Series) check(assert_type(left.rtruediv(f), pd.Series), pd.Series) check(assert_type(left.rtruediv(c), pd.Series), pd.Series) + check(assert_type(left.rdiv(b), pd.Series), pd.Series) check(assert_type(left.rdiv(i), pd.Series), pd.Series) check(assert_type(left.rdiv(f), pd.Series), pd.Series) check(assert_type(left.rdiv(c), pd.Series), pd.Series)