Skip to content

Commit b34d0e3

Browse files
committed
fix(series): #1372 cumprod
1 parent c38b6a3 commit b34d0e3

File tree

9 files changed

+71
-52
lines changed

9 files changed

+71
-52
lines changed

pandas-stubs/core/series.pyi

Lines changed: 5 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,10 @@ from pandas.plotting import PlotAccessor
210210
class _SupportsAdd(Protocol[_T_co]):
211211
def __add__(self, value: Self, /) -> _T_co: ...
212212

213+
@type_check_only
214+
class _SupportsMul(Protocol[_T_co]):
215+
def __mul__(self, value: Self, /) -> _T_co: ...
216+
213217
class _iLocIndexerSeries(_iLocIndexer, Generic[S1]):
214218
# get item
215219
@overload
@@ -3503,17 +3507,8 @@ class Series(IndexOpsMixin[S1], NDFrame):
35033507
*args: Any,
35043508
**kwargs: Any,
35053509
) -> Series[S1]: ...
3506-
@overload
3507-
def cumprod(
3508-
self: Series[_str],
3509-
axis: AxisIndex = ...,
3510-
skipna: _bool = ...,
3511-
*args: Any,
3512-
**kwargs: Any,
3513-
) -> Never: ...
3514-
@overload
35153510
def cumprod(
3516-
self,
3511+
self: SupportsGetItem[Scalar, _SupportsMul[S1]],
35173512
axis: AxisIndex = ...,
35183513
skipna: _bool = ...,
35193514
*args: Any,
@@ -3900,13 +3895,6 @@ class TimestampSeries(_SeriesSubclassBase[Timestamp, np.datetime64]):
39003895
**kwargs: Any,
39013896
) -> Timedelta: ...
39023897
def diff(self, periods: int = ...) -> TimedeltaSeries: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride]
3903-
def cumprod(
3904-
self,
3905-
axis: AxisIndex = ...,
3906-
skipna: _bool = ...,
3907-
*args: Any,
3908-
**kwargs: Any,
3909-
) -> Never: ...
39103898

39113899
class TimedeltaSeries(_SeriesSubclassBase[Timedelta, np.timedelta64]):
39123900
# ignores needed because of mypy
@@ -4012,39 +4000,18 @@ class TimedeltaSeries(_SeriesSubclassBase[Timedelta, np.timedelta64]):
40124000
*args: Any,
40134001
**kwargs: Any,
40144002
) -> TimedeltaSeries: ...
4015-
def cumprod(
4016-
self,
4017-
axis: AxisIndex = ...,
4018-
skipna: _bool = ...,
4019-
*args: Any,
4020-
**kwargs: Any,
4021-
) -> Never: ...
40224003

40234004
class PeriodSeries(_SeriesSubclassBase[Period, np.object_]):
40244005
@property
40254006
def dt(self) -> PeriodProperties: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride]
40264007
def __sub__(self, other: PeriodSeries) -> OffsetSeries: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride]
40274008
def diff(self, periods: int = ...) -> OffsetSeries: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride]
4028-
def cumprod(
4029-
self,
4030-
axis: AxisIndex = ...,
4031-
skipna: _bool = ...,
4032-
*args: Any,
4033-
**kwargs: Any,
4034-
) -> Never: ...
40354009

40364010
class OffsetSeries(_SeriesSubclassBase[BaseOffset, np.object_]):
40374011
@overload # type: ignore[override]
40384012
def __radd__(self, other: Period) -> PeriodSeries: ...
40394013
@overload
40404014
def __radd__(self, other: BaseOffset) -> OffsetSeries: ...
4041-
def cumprod(
4042-
self,
4043-
axis: AxisIndex = ...,
4044-
skipna: _bool = ...,
4045-
*args: Any,
4046-
**kwargs: Any,
4047-
) -> Never: ...
40484015

40494016
class IntervalSeries(
40504017
_SeriesSubclassBase[Interval[_OrderableT], np.object_], Generic[_OrderableT]

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@ types-pytz = ">= 2022.1.1"
3636
numpy = ">= 1.23.5"
3737

3838
[tool.poetry.group.dev.dependencies]
39-
mypy = "1.17.1"
39+
mypy = "1.18.1"
4040
pandas = "2.3.2"
4141
pyarrow = ">=10.0.1"
4242
pytest = ">=7.1.2"
4343
pyright = ">=1.1.405"
4444
ty = ">=0.0.1a20"
45-
pyrefly = ">=0.32.0"
45+
pyrefly = ">=0.33.0"
4646
poethepoet = ">=0.16.5"
4747
loguru = ">=0.6.0"
4848
typing-extensions = ">=4.4.0"

tests/series/test_series.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3948,24 +3948,18 @@ def test_timedelta_index_cumprod() -> None:
39483948
offset_series = as_period_series - as_period_series
39493949

39503950
if TYPE_CHECKING_INVALID_USAGE:
3951-
assert_type(pd.Series(["a", "b"]).cumprod(), Never)
3951+
offset_series.cumprod() # type: ignore[misc] # pyright: ignore[reportAttributeAccessIssue]
39523952

39533953
if TYPE_CHECKING_INVALID_USAGE:
3954-
assert_type(offset_series.cumprod(), Never)
3954+
pd.Series([pd.Timedelta(0), pd.Timedelta(1)]).cumprod() # type: ignore[misc] # pyright: ignore[reportAttributeAccessIssue]
39553955

39563956
if TYPE_CHECKING_INVALID_USAGE:
3957-
assert_type(pd.Series([pd.Timedelta(0), pd.Timedelta(1)]).cumprod(), Never)
3957+
pd.Series( # type: ignore[misc]
3958+
[pd.Timestamp("2024-04-29"), pd.Timestamp("2034-08-28")]
3959+
).cumprod() # pyright: ignore[reportAttributeAccessIssue]
39583960

39593961
if TYPE_CHECKING_INVALID_USAGE:
3960-
assert_type(
3961-
pd.Series(
3962-
[pd.Timestamp("2024-04-29"), pd.Timestamp("2034-08-28")]
3963-
).cumprod(),
3964-
Never,
3965-
)
3966-
3967-
if TYPE_CHECKING_INVALID_USAGE:
3968-
assert_type(as_period_series.cumprod(), Never)
3962+
as_period_series.cumprod() # type: ignore[misc] # pyright: ignore[reportAttributeAccessIssue]
39693963

39703964

39713965
def test_series_str_methods() -> None:

tests/series/window/__init__.py

Whitespace-only changes.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import numpy as np
2+
import pandas as pd
3+
from typing_extensions import assert_type
4+
5+
from tests import check
6+
7+
series = pd.DataFrame({"A": [1.0, float("nan"), 2.0]})["A"]
8+
9+
10+
def test_window_any() -> None:
11+
check(assert_type(series.cumprod(), pd.Series), pd.Series, np.floating)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import numpy as np
2+
import pandas as pd
3+
from typing_extensions import assert_type
4+
5+
from tests import check
6+
7+
series = pd.Series([3j, 3 + 4j, 2j])
8+
9+
10+
def test_window_complex() -> None:
11+
check(
12+
assert_type(series.cumprod(), "pd.Series[complex]"),
13+
pd.Series,
14+
np.complexfloating,
15+
)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import numpy as np
2+
import pandas as pd
3+
from typing_extensions import assert_type
4+
5+
from tests import check
6+
7+
series = pd.Series([3.0, float("nan"), 2.0])
8+
9+
10+
def test_window_float() -> None:
11+
check(assert_type(series.cumprod(), "pd.Series[float]"), pd.Series, np.floating)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import numpy as np
2+
import pandas as pd
3+
from typing_extensions import assert_type
4+
5+
from tests import check
6+
7+
series = pd.Series([3, 1, 2])
8+
9+
10+
def test_window_int() -> None:
11+
check(assert_type(series.cumprod(), "pd.Series[int]"), pd.Series, np.integer)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import pandas as pd
2+
3+
from tests import TYPE_CHECKING_INVALID_USAGE
4+
5+
series = pd.Series(["1", "a", "🐼"])
6+
7+
8+
def test_window_str() -> None:
9+
if TYPE_CHECKING_INVALID_USAGE:
10+
series.cumprod() # type: ignore[misc] # pyright: ignore[reportAttributeAccessIssue]

0 commit comments

Comments
 (0)