Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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
32 changes: 30 additions & 2 deletions pandas-stubs/core/series.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -4610,14 +4610,42 @@ class Series(IndexOpsMixin[S1], ElementOpsMixin[S1], NDFrame):
**kwargs: Any,
) -> np_1darray: ...
def tolist(self) -> list[S1]: ...
@overload
def var(
self,
self: Series[Never],
axis: AxisIndex | None = 0,
skipna: _bool | None = True,
ddof: int = 1,
numeric_only: _bool = False,
**kwargs: Any,
) -> Scalar: ...
) -> float: ...
@overload
def var(
self: Series[Timedelta],
axis: AxisIndex | None = 0,
skipna: _bool | None = True,
ddof: int = 1,
numeric_only: _bool = False,
**kwargs: Any,
) -> Never: ...
@overload
def var(
self: Series[complex],
axis: AxisIndex | None = 0,
skipna: _bool | None = True,
ddof: int = 1,
numeric_only: _bool = False,
**kwargs: Any,
) -> float: ...
@overload
def var(
self: SupportsGetItem[Scalar, SupportsTruedivInt[S2]],
axis: AxisIndex | None = 0,
skipna: _bool | None = True,
ddof: int = 1,
numeric_only: _bool = False,
**kwargs: Any,
) -> S2: ...
# Rename axis with `mapper`, `axis`, and `inplace=True`
@overload
def rename_axis(
Expand Down
13 changes: 13 additions & 0 deletions tests/series/test_agg.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,27 +14,31 @@ def test_agg_any_float() -> None:
check(assert_type(series.mean(), float), np.float64)
check(assert_type(series.median(), float), np.float64)
check(assert_type(series.std(), float), np.float64)
check(assert_type(series.var(), float), np.float64)


def test_agg_bool() -> None:
series = pd.Series([True, False, True])
check(assert_type(series.mean(), float), np.float64)
check(assert_type(series.median(), float), np.float64)
check(assert_type(series.std(), float), np.float64)
check(assert_type(series.var(), float), np.float64)


def test_agg_int() -> None:
series = pd.Series([3, 1, 2])
check(assert_type(series.mean(), float), np.float64)
check(assert_type(series.median(), float), np.float64)
check(assert_type(series.std(), float), np.float64)
check(assert_type(series.var(), float), np.float64)


def test_agg_float() -> None:
series = pd.Series([3.0, float("nan"), 2.0])
check(assert_type(series.mean(), float), np.float64)
check(assert_type(series.median(), float), np.float64)
check(assert_type(series.std(), float), np.float64)
check(assert_type(series.var(), float), np.float64)


def test_agg_complex() -> None:
Expand All @@ -57,6 +61,12 @@ def test_agg_complex() -> None:
),
):
check(assert_type(series.std(), np.float64), np.float64)
with pytest_warns_bounded(
np.exceptions.ComplexWarning,
r"Casting complex values to real discards the imaginary part",
upper="2.3.99",
):
check(assert_type(series.var(), float), np.float64)


def test_agg_str() -> None:
Expand All @@ -65,6 +75,7 @@ def test_agg_str() -> None:
series.mean() # type: ignore[misc] # pyright: ignore[reportAttributeAccessIssue]
series.median() # type: ignore[misc] # pyright: ignore[reportAttributeAccessIssue]
series.std() # type: ignore[misc] # pyright: ignore[reportAttributeAccessIssue]
series.var() # type: ignore[misc] # pyright: ignore[reportAttributeAccessIssue]


def test_agg_ts() -> None:
Expand All @@ -83,3 +94,5 @@ def test_agg_td() -> None:
check(assert_type(series.mean(), pd.Timedelta), pd.Timedelta)
check(assert_type(series.median(), pd.Timedelta), pd.Timedelta)
check(assert_type(series.std(), pd.Timedelta), pd.Timedelta)
if TYPE_CHECKING_INVALID_USAGE:
series.var() # type: ignore[misc]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Never is considered as "valid" by type checkers. However if a function call returns Never, type checkers won't check the code after that call.

You can do something like this:

Suggested change
series.var() # type: ignore[misc]
def _0() -> None: # pyright: ignore[reportUnusedFunction]
assert_type(series.var(), Never)

6 changes: 3 additions & 3 deletions tests/series/test_series.py
Original file line number Diff line number Diff line change
Expand Up @@ -780,9 +780,9 @@ def test_types_abs() -> None:

def test_types_var() -> None:
s = pd.Series([-10, 2, 3, 10])
s.var()
s.var(axis=0, ddof=1)
s.var(skipna=True, numeric_only=False)
check(assert_type(s.var(), float), np.float64)
check(assert_type(s.var(axis=0, ddof=1), float), np.float64)
check(assert_type(s.var(skipna=True, numeric_only=False), float), np.float64)


def test_types_std() -> None:
Expand Down
Loading