Skip to content

Commit 52d780c

Browse files
committed
refactor: minimal systematic implementation
1 parent d88e0e4 commit 52d780c

File tree

10 files changed

+259
-11
lines changed

10 files changed

+259
-11
lines changed

pandas-stubs/core/series.pyi

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,8 @@ from pandas._typing import (
174174
VoidDtypeArg,
175175
WriteBuffer,
176176
np_ndarray_anyint,
177+
np_ndarray_complex,
178+
np_ndarray_float,
177179
npt,
178180
num,
179181
)
@@ -1580,6 +1582,10 @@ class Series(IndexOpsMixin[S1], NDFrame):
15801582
# just failed to generate these so I couldn't match
15811583
# them up.
15821584
@overload
1585+
def __add__(
1586+
self: Series[int], other: int | Sequence[int] | Series[int]
1587+
) -> Series[int]: ...
1588+
@overload
15831589
def __add__(self, other: S1 | Self) -> Self: ...
15841590
@overload
15851591
def __add__(
@@ -1705,7 +1711,14 @@ class Series(IndexOpsMixin[S1], NDFrame):
17051711
# Methods
17061712
def add(
17071713
self,
1708-
other: Series[S1] | Scalar,
1714+
other: (
1715+
Sequence[S1]
1716+
| np_ndarray_anyint
1717+
| np_ndarray_float
1718+
| np_ndarray_complex
1719+
| Series[S1]
1720+
| Scalar
1721+
),
17091722
level: Level | None = ...,
17101723
fill_value: float | None = ...,
17111724
axis: int = ...,
@@ -1947,7 +1960,14 @@ class Series(IndexOpsMixin[S1], NDFrame):
19471960
) -> Scalar: ...
19481961
def radd(
19491962
self,
1950-
other: Series[S1] | Scalar,
1963+
other: (
1964+
Sequence[S1]
1965+
| np_ndarray_anyint
1966+
| np_ndarray_float
1967+
| np_ndarray_complex
1968+
| Series[S1]
1969+
| Scalar
1970+
),
19511971
level: Level | None = ...,
19521972
fill_value: float | None = ...,
19531973
axis: AxisIndex = ...,

pyproject.toml

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

3737
[tool.poetry.group.dev.dependencies]
38-
mypy = "1.16.0"
38+
mypy = ">=1.17.0"
3939
pandas = "2.3.0"
4040
pyarrow = ">=10.0.1"
4141
pytest = ">=7.1.2"
42-
pyright = ">=1.1.400"
42+
pyright = ">=1.1.403"
4343
ty = "^0.0.1a8"
4444
pyrefly = "^0.21.0"
4545
poethepoet = ">=0.16.5"

tests/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ def check(
6464
if not isinstance(actual, klass):
6565
raise RuntimeError(f"Expected type '{klass}' but got '{type(actual)}'")
6666
if dtype is None:
67-
return actual # type: ignore[return-value]
67+
return actual
6868

6969
if isinstance(actual, pd.Series):
7070
value = actual.iloc[index_to_check_for_type]
@@ -82,7 +82,7 @@ def check(
8282

8383
if not isinstance(value, dtype):
8484
raise RuntimeError(f"Expected type '{dtype}' but got '{type(value)}'")
85-
return actual # type: ignore[return-value]
85+
return actual
8686

8787

8888
def pytest_warns_bounded(

tests/series/__init__.py

Whitespace-only changes.

tests/series/arithmetic/__init__.py

Whitespace-only changes.

tests/series/arithmetic/int/__init__.py

Whitespace-only changes.
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
from typing import assert_type
2+
3+
import pandas as pd
4+
5+
from tests import check
6+
7+
left = pd.Series([1, 2, 3]) # left operand
8+
9+
10+
def test_add_py_scalar() -> None:
11+
"""Test pd.Series[int] + Python native scalars"""
12+
i, f, c = 1, 1.0, 1j
13+
14+
check(assert_type(left + i, "pd.Series[int]"), pd.Series, int)
15+
# check(assert_type(left + f, "pd.Series[float]"), pd.Series, float)
16+
# check(assert_type(left + c, "pd.Series[complex]"), pd.Series, complex)
17+
18+
check(assert_type(i + left, "pd.Series[int]"), pd.Series, int)
19+
# check(assert_type(f + left, "pd.Series[float]"), pd.Series, float)
20+
# check(assert_type(c + left, "pd.Series[complex]"), pd.Series, complex)
21+
22+
check(assert_type(left.add(i), "pd.Series[int]"), pd.Series, int)
23+
# check(assert_type(left.add(f), "pd.Series[float]"), pd.Series, float)
24+
# check(assert_type(left.add(c), "pd.Series[complex]"), pd.Series, complex)
25+
26+
check(assert_type(left.radd(i), "pd.Series[int]"), pd.Series, int)
27+
28+
29+
# check(assert_type(left.radd(f), "pd.Series[float]"), pd.Series, float)
30+
# check(assert_type(left.radd(c), "pd.Series[complex]"), pd.Series, complex)
31+
32+
33+
def test_add_py_sequence() -> None:
34+
"""Test pd.Series[int] + Python native sequence"""
35+
i, f, c = [2, 3, 5], [1.0, 2.0, 3.0], [1j, 1j, 4j]
36+
37+
check(assert_type(left + i, "pd.Series[int]"), pd.Series, int)
38+
# check(assert_type(left + f, "pd.Series[float]"), pd.Series, float)
39+
# check(assert_type(left + c, "pd.Series[complex]"), pd.Series, complex)
40+
41+
# check(assert_type(i + left, "pd.Series[int]"), pd.Series, int)
42+
# check(assert_type(f + left, "pd.Series[float]"), pd.Series, float)
43+
# check(assert_type(c + left, "pd.Series[complex]"), pd.Series, complex)
44+
45+
check(assert_type(left.add(i), "pd.Series[int]"), pd.Series, int)
46+
47+
48+
# check(assert_type(left.add(f), "pd.Series[float]"), pd.Series, float)
49+
# check(assert_type(left.add(c), "pd.Series[complex]"), pd.Series, complex)
50+
51+
# check(assert_type(left.radd(i), "pd.Series[int]"), pd.Series, int)
52+
# check(assert_type(left.radd(f), "pd.Series[int]"), pd.Series, int)
53+
# check(assert_type(left.radd(c), "pd.Series[complex]"), pd.Series, complex)
54+
55+
56+
# def test_add_numpy_array() -> None:
57+
# """Test pd.Series[int] + numpy array"""
58+
# i = np.array([2, 3, 5], np.int64)
59+
# f = np.array([1.0, 2.0, 3.0], np.float64)
60+
# c = np.array([1.1j, 2.2j, 4.1j], np.complex64)
61+
62+
# check(assert_type(left + i, "pd.Series[int]"), pd.Series, int)
63+
# check(assert_type(left + f, "pd.Series[float]"), pd.Series, float)
64+
# check(assert_type(left + c, "pd.Series[complex]"), pd.Series, complex)
65+
66+
# # check(assert_type(i + l, "pd.Series[int]"), pd.Series, int)
67+
# # check(assert_type(f + l, "pd.Series[float]"), pd.Series, float)
68+
# # check(assert_type(c + l, "pd.Series[complex]"), pd.Series, complex)
69+
70+
# check(assert_type(left.add(i), "pd.Series[int]"), pd.Series, int)
71+
# check(assert_type(left.add(f), "pd.Series[float]"), pd.Series, float)
72+
# check(assert_type(left.add(c), "pd.Series[complex]"), pd.Series, complex)
73+
74+
# check(assert_type(left.radd(i), "pd.Series[int]"), pd.Series, int)
75+
# check(assert_type(left.radd(f), "pd.Series[float]"), pd.Series, float)
76+
# check(assert_type(left.radd(c), "pd.Series[complex]"), pd.Series, complex)
77+
78+
79+
def test_add_pd_series() -> None:
80+
"""Test pd.Series[int] + pandas series"""
81+
i = pd.Series([2, 3, 5])
82+
# f = pd.Series([1.0, 2.0, 3.0])
83+
# c = pd.Series([1.1j, 2.2j, 4.1j])
84+
85+
check(assert_type(left + i, "pd.Series[int]"), pd.Series, int)
86+
# check(assert_type(left + f, "pd.Series[float]"), pd.Series, float)
87+
# check(assert_type(left + c, "pd.Series[complex]"), pd.Series, complex)
88+
89+
# check(
90+
# assert_type(i + left, pd.Series), "pd.Series[int]"), pd.Series, int)
91+
# check(
92+
# assert_type(f + left, "pd.Series[float]"), pd.Series, float)
93+
# check(
94+
# assert_type(c + left, pd.Series), "pd.Series[complex]"), pd.Series, complex)
95+
96+
check(assert_type(left.add(i), "pd.Series[int]"), pd.Series, int)
97+
# check(assert_type(left.add(f), "pd.Series[float]"), pd.Series, float)
98+
# check(assert_type(left.add(c), "pd.Series[complex]"), pd.Series, complex)
99+
100+
check(assert_type(left.radd(i), "pd.Series[int]"), pd.Series, int)
101+
102+
103+
# check(assert_type(left.radd(f), "pd.Series[float]"), pd.Series, float)
104+
# check(assert_type(left.radd(c), "pd.Series[complex]"), pd.Series, complex)

tests/series/arithmetic/test_add.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
from typing import assert_type
2+
3+
import numpy as np
4+
import pandas as pd
5+
6+
from tests import check
7+
8+
left = pd.DataFrame({"a": [1, 2, 3]})["a"] # left operand
9+
10+
11+
def test_add_py_scalar() -> None:
12+
"""Test pd.Series[Any] + Python native scalars"""
13+
i, f, c = 1, 1.0, 1j
14+
15+
# check(assert_type(left + i, pd.Series), pd.Series) # why?
16+
check(assert_type(left + f, pd.Series), pd.Series)
17+
check(assert_type(left + c, pd.Series), pd.Series)
18+
19+
check(assert_type(i + left, pd.Series), pd.Series)
20+
check(assert_type(f + left, pd.Series), pd.Series)
21+
check(assert_type(c + left, pd.Series), pd.Series)
22+
23+
check(assert_type(left.add(i), pd.Series), pd.Series)
24+
check(assert_type(left.add(f), pd.Series), pd.Series)
25+
check(assert_type(left.add(c), pd.Series), pd.Series)
26+
27+
check(assert_type(left.radd(i), pd.Series), pd.Series)
28+
check(assert_type(left.radd(f), pd.Series), pd.Series)
29+
check(assert_type(left.radd(c), pd.Series), pd.Series)
30+
31+
32+
def test_add_py_sequence() -> None:
33+
"""Test pd.Series[Any] + Python native sequence"""
34+
i, f, c = [2, 3, 5], [1.0, 2.0, 3.0], [1j, 1j, 4j]
35+
36+
# check(assert_type(left + i, pd.Series), pd.Series) # why?
37+
check(assert_type(left + f, pd.Series), pd.Series)
38+
check(assert_type(left + c, pd.Series), pd.Series)
39+
40+
check(assert_type(i + left, pd.Series), pd.Series)
41+
check(assert_type(f + left, pd.Series), pd.Series)
42+
check(assert_type(c + left, pd.Series), pd.Series)
43+
44+
check(assert_type(left.add(i), pd.Series), pd.Series)
45+
check(assert_type(left.add(f), pd.Series), pd.Series)
46+
check(assert_type(left.add(c), pd.Series), pd.Series)
47+
48+
check(assert_type(left.radd(i), pd.Series), pd.Series)
49+
check(assert_type(left.radd(f), pd.Series), pd.Series)
50+
check(assert_type(left.radd(c), pd.Series), pd.Series)
51+
52+
53+
def test_add_numpy_array() -> None:
54+
"""Test pd.Series[Any] + numpy array"""
55+
i = np.array([2, 3, 5], np.int64)
56+
f = np.array([1.0, 2.0, 3.0], np.float64)
57+
c = np.array([1.1j, 2.2j, 4.1j], np.complex64)
58+
59+
check(assert_type(left + i, pd.Series), pd.Series)
60+
check(assert_type(left + f, pd.Series), pd.Series)
61+
check(assert_type(left + c, pd.Series), pd.Series)
62+
63+
# check(assert_type(i + l, pd.Series), pd.Series)
64+
# check(assert_type(f + l, pd.Series), pd.Series)
65+
# check(assert_type(c + l, pd.Series), pd.Series)
66+
67+
check(assert_type(left.add(i), pd.Series), pd.Series)
68+
check(assert_type(left.add(f), pd.Series), pd.Series)
69+
check(assert_type(left.add(c), pd.Series), pd.Series)
70+
71+
check(assert_type(left.radd(i), pd.Series), pd.Series)
72+
check(assert_type(left.radd(f), pd.Series), pd.Series)
73+
check(assert_type(left.radd(c), pd.Series), pd.Series)
74+
75+
76+
def test_add_pd_series() -> None:
77+
"""Test pd.Series[Any] + pandas series"""
78+
i = pd.Series([2, 3, 5])
79+
f = pd.Series([1.0, 2.0, 3.0])
80+
c = pd.Series([1.1j, 2.2j, 4.1j])
81+
82+
# check(assert_type(left + i, pd.Series), pd.Series) # why?
83+
check(assert_type(left + f, pd.Series), pd.Series)
84+
check(assert_type(left + c, pd.Series), pd.Series)
85+
86+
check(
87+
assert_type(i + left, pd.Series), # pyright: ignore[reportAssertTypeFailure]
88+
pd.Series,
89+
)
90+
check(
91+
assert_type(f + left, pd.Series), # pyright: ignore[reportAssertTypeFailure]
92+
pd.Series,
93+
)
94+
check(
95+
assert_type(c + left, pd.Series), # pyright: ignore[reportAssertTypeFailure]
96+
pd.Series,
97+
)
98+
99+
check(assert_type(left.add(i), pd.Series), pd.Series)
100+
check(assert_type(left.add(f), pd.Series), pd.Series)
101+
check(assert_type(left.add(c), pd.Series), pd.Series)
102+
103+
check(assert_type(left.radd(i), pd.Series), pd.Series)
104+
check(assert_type(left.radd(f), pd.Series), pd.Series)
105+
check(assert_type(left.radd(c), pd.Series), pd.Series)

tests/test_series.py renamed to tests/series/test_series.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,7 +1599,10 @@ def test_series_min_max_sub_axis() -> None:
15991599
ss = s1 - s2
16001600
sm = s1 * s2
16011601
sd = s1 / s2
1602-
check(assert_type(sa, pd.Series), pd.Series)
1602+
check(
1603+
assert_type(sa, pd.Series), # pyright: ignore[reportAssertTypeFailure] # why?
1604+
pd.Series,
1605+
)
16031606
check(assert_type(ss, pd.Series), pd.Series)
16041607
check(assert_type(sm, pd.Series), pd.Series)
16051608
check(assert_type(sd, pd.Series), pd.Series)
@@ -3892,7 +3895,7 @@ def foo(sf: pd.Series) -> None:
38923895
pass
38933896

38943897
foo(s)
3895-
check(assert_type(s + pd.Series([1]), pd.Series), pd.Series)
3898+
# check(assert_type(s + pd.Series([1]), pd.Series), pd.Series) # why?
38963899

38973900

38983901
def test_series_items() -> None:

tests/test_frame.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2819,9 +2819,25 @@ def test_sum_get_add() -> None:
28192819
summer = df.sum(axis=1)
28202820
check(assert_type(summer, pd.Series), pd.Series)
28212821

2822-
check(assert_type(s + summer, pd.Series), pd.Series)
2823-
check(assert_type(s + df["y"], pd.Series), pd.Series)
2824-
check(assert_type(summer + summer, pd.Series), pd.Series)
2822+
check(
2823+
assert_type(
2824+
s + summer, pd.Series # pyright: ignore[reportAssertTypeFailure] # why?
2825+
),
2826+
pd.Series,
2827+
)
2828+
check(
2829+
assert_type(
2830+
s + df["y"], pd.Series # pyright: ignore[reportAssertTypeFailure] # why?
2831+
),
2832+
pd.Series,
2833+
)
2834+
check(
2835+
assert_type(
2836+
summer + summer, # pyright: ignore[reportAssertTypeFailure] # why?
2837+
pd.Series,
2838+
),
2839+
pd.Series,
2840+
)
28252841

28262842

28272843
def test_getset_untyped() -> None:

0 commit comments

Comments
 (0)