Skip to content

Commit 2e3bbe8

Browse files
Fix result type of Series.sum(...) (#604)
* Fix result type of `Series.sum(...)` * Fix note comment in `test_types_sum()` * Make tests in `test_types_sum()` a bit stricter
1 parent e4731ae commit 2e3bbe8

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

pandas-stubs/core/series.pyi

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,10 @@ from pandas.core.window.rolling import (
7070
Rolling,
7171
Window,
7272
)
73-
from typing_extensions import TypeAlias
73+
from typing_extensions import (
74+
Never,
75+
TypeAlias,
76+
)
7477
import xarray as xr
7578

7679
from pandas._libs.interval import Interval
@@ -1811,6 +1814,30 @@ class Series(IndexOpsMixin, NDFrame, Generic[S1]):
18111814
fill_value: float | None = ...,
18121815
axis: AxisIndex | None = ...,
18131816
) -> Series[S1]: ...
1817+
# ignore needed because of mypy, for using `Never` as type-var.
1818+
@overload
1819+
def sum(
1820+
self: Series[Never], # type: ignore[type-var]
1821+
axis: AxisIndex | None = ...,
1822+
skipna: _bool | None = ...,
1823+
level: None = ...,
1824+
numeric_only: _bool = ...,
1825+
min_count: int = ...,
1826+
**kwargs,
1827+
) -> Any: ...
1828+
# ignore needed because of mypy, for overlapping overloads
1829+
# between `Series[bool]` and `Series[int]`.
1830+
@overload
1831+
def sum( # type: ignore[misc]
1832+
self: Series[bool],
1833+
axis: AxisIndex | None = ...,
1834+
skipna: _bool | None = ...,
1835+
level: None = ...,
1836+
numeric_only: _bool = ...,
1837+
min_count: int = ...,
1838+
**kwargs,
1839+
) -> int: ...
1840+
@overload
18141841
def sum(
18151842
self: Series[S1],
18161843
axis: AxisIndex | None = ...,

tests/test_series.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,36 @@ def test_types_sum() -> None:
332332
s.sum(numeric_only=False)
333333
s.sum(min_count=4)
334334

335+
# Note:
336+
# 1. Return types of `series.groupby(...).sum(...)` are NOT tested
337+
# (waiting for stubs).
338+
# 2. Runtime return types of `series.sum(min_count=...)` are NOT
339+
# tested (because of potential `nan`s).
340+
341+
s0 = assert_type(pd.Series([1, 2, 3, np.nan]), "pd.Series")
342+
check(assert_type(s0.sum(), "Any"), np.float64)
343+
check(assert_type(s0.sum(skipna=False), "Any"), np.float64)
344+
check(assert_type(s0.sum(numeric_only=False), "Any"), np.float64)
345+
assert_type(s0.sum(min_count=4), "Any")
346+
347+
s1 = assert_type(pd.Series([False, True], dtype=bool), "pd.Series[bool]")
348+
check(assert_type(s1.sum(), "int"), np.int64)
349+
check(assert_type(s1.sum(skipna=False), "int"), np.int64)
350+
check(assert_type(s1.sum(numeric_only=False), "int"), np.int64)
351+
assert_type(s1.sum(min_count=4), "int")
352+
353+
s2 = assert_type(pd.Series([0, 1], dtype=int), "pd.Series[int]")
354+
check(assert_type(s2.sum(), "int"), np.int64)
355+
check(assert_type(s2.sum(skipna=False), "int"), np.int64)
356+
check(assert_type(s2.sum(numeric_only=False), "int"), np.int64)
357+
assert_type(s2.sum(min_count=4), "int")
358+
359+
s3 = assert_type(pd.Series([1, 2, 3, np.nan], dtype=float), "pd.Series[float]")
360+
check(assert_type(s3.sum(), "float"), np.float64)
361+
check(assert_type(s3.sum(skipna=False), "float"), np.float64)
362+
check(assert_type(s3.sum(numeric_only=False), "float"), np.float64)
363+
assert_type(s3.sum(min_count=4), "float")
364+
335365

336366
def test_types_cumsum() -> None:
337367
s = pd.Series([1, 2, 3, np.nan])

0 commit comments

Comments
 (0)