Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 21 additions & 22 deletions pandas-stubs/core/series.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -1628,12 +1628,6 @@ class Series(IndexOpsMixin[S1], NDFrame):
self, other: int | np_ndarray_anyint | Series[int]
) -> Series[int]: ...
# def __array__(self, dtype: Optional[_bool] = ...) -> _np_ndarray
@overload
def __div__(self: Series[int], other: Series[int]) -> Series[float]: ...
@overload
def __div__(self: Series[int], other: int) -> Series[float]: ...
@overload
def __div__(self, other: num | _ListLike | Series[S1]) -> Series[S1]: ...
def __eq__(self, other: object) -> Series[_bool]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride]
def __floordiv__(self, other: num | _ListLike | Series[S1]) -> Series[int]: ...
def __ge__( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride]
Expand All @@ -1649,15 +1643,19 @@ class Series(IndexOpsMixin[S1], NDFrame):
self, other: S1 | _ListLike | Series[S1] | datetime | timedelta | date
) -> Series[_bool]: ...
@overload
def __mul__( # type: ignore[overload-overlap] # pyright: ignore[reportOverlappingOverload]
self, other: S1 | Self
) -> Self: ...
@overload
def __mul__(
self, other: timedelta | Timedelta | TimedeltaSeries | np.timedelta64
) -> TimedeltaSeries: ...
@overload
def __mul__(self: Series[int], other: int) -> Series[int]: ...
@overload
def __mul__(self: Series[int], other: Series[int]) -> Series[int]: ...
def __mul__( # pyright: ignore[reportOverlappingOverload]
self: Series[int], other: Series[int] | int
) -> Series[int]: ...
@overload
def __mul__(self: Series[int], other: Series[float]) -> Series[float]: ...
def __mul__(self: Series[int], other: Series[float] | float) -> Series[float]: ...
@overload
def __mul__(self: Series[Any], other: Series[Any]) -> Series: ...
@overload
Expand Down Expand Up @@ -1687,12 +1685,6 @@ class Series(IndexOpsMixin[S1], NDFrame):
def __rand__( # pyright: ignore[reportIncompatibleMethodOverride]
self, other: int | np_ndarray_anyint | Series[int]
) -> Series[int]: ...
@overload
def __rdiv__(self: Series[int], other: int) -> Series[float]: ...
@overload
def __rdiv__(self: Series[int], other: Series[int]) -> Series[float]: ...
@overload
def __rdiv__(self, other: num | _ListLike | Series[S1]) -> Series[S1]: ...
def __rdivmod__(self, other: num | _ListLike | Series[S1]) -> Series[S1]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride]
def __rfloordiv__(self, other: num | _ListLike | Series[S1]) -> Series[S1]: ...
def __rmod__(self, other: num | _ListLike | Series[S1]) -> Series[S1]: ...
Expand Down Expand Up @@ -1741,16 +1733,23 @@ class Series(IndexOpsMixin[S1], NDFrame):
@overload
def __sub__(
self: Series[int],
other: int,
other: int | Series[int],
) -> Series[int]: ...
@overload
def __sub__(
self,
other: complex,
) -> Series[complex]: ...
@overload
def __sub__(self, other: S1 | Self) -> Self: ...
@overload
def __sub__(self, other: num | _ListLike | Series) -> Series: ...
def __truediv__(self, other: num | _ListLike | Series[S1] | Path) -> Series: ...
@overload
def __truediv__(self: Series[int], other: Series[int] | int) -> Series[float]: ...
@overload
def __truediv__(
self, other: num | _ListLike | Series[S1] | Path
) -> Series | Self: ...
# ignore needed for mypy as we want different results based on the arguments
@overload # type: ignore[override]
def __xor__( # pyright: ignore[reportOverlappingOverload]
Expand Down Expand Up @@ -1956,9 +1955,9 @@ class Series(IndexOpsMixin[S1], NDFrame):
@overload
def mul(
self: Series[int],
other: Series[int],
other: Series[int] | int,
level: Level | None = ...,
fill_value: float | None = ...,
fill_value: int | None = ...,
axis: AxisIndex | None = ...,
) -> Series[int]: ...
@overload
Expand Down Expand Up @@ -2152,7 +2151,7 @@ class Series(IndexOpsMixin[S1], NDFrame):
**kwargs,
) -> float: ...
@overload
def sub(
def sub( # pyright: ignore[reportOverlappingOverload]
self: Series[int],
other: int,
level: Level | None = ...,
Expand All @@ -2166,7 +2165,7 @@ class Series(IndexOpsMixin[S1], NDFrame):
level: Level | None = ...,
fill_value: float | None = ...,
axis: AxisIndex | None = ...,
) -> Series[int]: ...
) -> Series[float]: ...
@overload
def sub(
self,
Expand Down
26 changes: 15 additions & 11 deletions tests/test_series.py
Original file line number Diff line number Diff line change
Expand Up @@ -653,15 +653,14 @@ def test_types_element_wise_arithmetic() -> None:
check(assert_type(s + s2, "pd.Series[int]"), pd.Series, np.integer)
check(assert_type(s.add(s2, fill_value=0), "pd.Series[int]"), pd.Series, np.integer)

check(assert_type(s - s2, pd.Series), pd.Series, np.integer)
check(assert_type(s - s2, "pd.Series[int]"), pd.Series, np.integer)
check(assert_type(s.sub(s2, fill_value=0), "pd.Series[int]"), pd.Series, np.integer)

check(assert_type(s * s2, "pd.Series[int]"), pd.Series, np.integer)
check(assert_type(s.mul(s2, fill_value=0), "pd.Series[int]"), pd.Series, np.integer)

# GH1089 should be the following
# check(assert_type(s / s2, "pd.Series[float]"), pd.Series, np.float64)
check(assert_type(s / s2, "pd.Series"), pd.Series, np.float64)
check(assert_type(s / s2, "pd.Series[float]"), pd.Series, np.float64)
check(
assert_type(s.div(s2, fill_value=0), "pd.Series[float]"), pd.Series, np.float64
)
Expand Down Expand Up @@ -696,11 +695,9 @@ def test_types_scalar_arithmetic() -> None:
check(assert_type(s.sub(1, fill_value=0), "pd.Series[int]"), pd.Series, np.integer)

check(assert_type(s * 2, "pd.Series[int]"), pd.Series, np.integer)
check(assert_type(s.mul(2, fill_value=0), pd.Series), pd.Series, np.integer)
check(assert_type(s.mul(2, fill_value=0), "pd.Series[int]"), pd.Series, np.integer)

# GH1089 should be
# check(assert_type(s / 2, "pd.Series[float]"), pd.Series, np.float64)
check(assert_type(s / 2, pd.Series), pd.Series, np.float64)
check(assert_type(s / 2, "pd.Series[float]"), pd.Series, np.float64)
check(
assert_type(s.div(2, fill_value=0), "pd.Series[float]"), pd.Series, np.float64
)
Expand Down Expand Up @@ -1312,10 +1309,12 @@ def test_types_dot() -> None:
s1 = pd.Series([0, 1, 2, 3])
s2 = pd.Series([-1, 2, -3, 4])
df1 = pd.DataFrame([[0, 1], [-2, 3], [4, -5], [6, 7]])
df2 = pd.DataFrame([[0.0, 1.0], [-2.0, 3.0], [4.0, -5.0], [6.0, 7.0]])
n1 = np.array([[0, 1], [1, 2], [-1, -1], [2, 0]])
check(assert_type(s1.dot(s2), Scalar), np.integer)
check(assert_type(s1 @ s2, Scalar), np.integer)
check(assert_type(s1.dot(df1), pd.Series), pd.Series, np.integer)
check(assert_type(s1.dot(df2), pd.Series), pd.Series, np.float64)
check(assert_type(s1 @ df1, pd.Series), pd.Series)
check(assert_type(s1.dot(n1), np.ndarray), np.ndarray)
check(assert_type(s1 @ n1, np.ndarray), np.ndarray)
Expand All @@ -1336,10 +1335,15 @@ def test_series_min_max_sub_axis() -> None:
sm = s1 * s2
sd = s1 / s2
check(assert_type(sa, pd.Series), pd.Series)
check(assert_type(ss, pd.Series), pd.Series)
# TODO GH1089 This should not match to Series[int]
check(assert_type(sm, pd.Series), pd.Series, np.integer) # pyright: ignore[reportAssertTypeFailure]
check(assert_type(sd, pd.Series), pd.Series)
check(
assert_type(ss, pd.Series), # pyright: ignore[reportAssertTypeFailure]
pd.Series,
)
check(assert_type(sm, pd.Series), pd.Series)
check(
assert_type(sd, pd.Series), # pyright: ignore[reportAssertTypeFailure]
pd.Series,
)


def test_series_index_isin() -> None:
Expand Down
Loading