Skip to content

Commit bd34731

Browse files
committed
feat(series): #1098 arithmetic truediv
1 parent f340905 commit bd34731

File tree

10 files changed

+984
-9
lines changed

10 files changed

+984
-9
lines changed

pandas-stubs/core/series.pyi

Lines changed: 402 additions & 6 deletions
Large diffs are not rendered by default.

tests/series/arithmetic/__init__.py

Whitespace-only changes.

tests/series/arithmetic/complex/__init__.py

Whitespace-only changes.
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
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+
left = pd.Series([1j, 2j, 3j]) # left operand
8+
9+
10+
def test_truediv_py_scalar() -> None:
11+
"""Test pd.Series[complex] / Python native scalars"""
12+
i, f, c = 1, 1.0, 1j
13+
14+
check(assert_type(left / i, "pd.Series[complex]"), pd.Series, np.complex128)
15+
check(assert_type(left / f, "pd.Series[complex]"), pd.Series, np.complex128)
16+
check(assert_type(left / c, "pd.Series[complex]"), pd.Series, np.complex128)
17+
18+
check(assert_type(i / left, "pd.Series[complex]"), pd.Series, np.complex128)
19+
check(assert_type(f / left, "pd.Series[complex]"), pd.Series, np.complex128)
20+
check(assert_type(c / left, "pd.Series[complex]"), pd.Series, np.complex128)
21+
22+
check(assert_type(left.truediv(i), "pd.Series[complex]"), pd.Series, np.complex128)
23+
check(assert_type(left.truediv(f), "pd.Series[complex]"), pd.Series, np.complex128)
24+
check(assert_type(left.truediv(c), "pd.Series[complex]"), pd.Series, np.complex128)
25+
26+
check(assert_type(left.div(i), "pd.Series[complex]"), pd.Series, np.complex128)
27+
check(assert_type(left.div(f), "pd.Series[complex]"), pd.Series, np.complex128)
28+
check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complex128)
29+
30+
check(assert_type(left.rtruediv(i), "pd.Series[complex]"), pd.Series, np.complex128)
31+
check(assert_type(left.rtruediv(f), "pd.Series[complex]"), pd.Series, np.complex128)
32+
check(assert_type(left.rtruediv(c), "pd.Series[complex]"), pd.Series, np.complex128)
33+
34+
check(assert_type(left.rdiv(i), "pd.Series[complex]"), pd.Series, np.complex128)
35+
check(assert_type(left.rdiv(f), "pd.Series[complex]"), pd.Series, np.complex128)
36+
check(assert_type(left.rdiv(c), "pd.Series[complex]"), pd.Series, np.complex128)
37+
38+
39+
def test_truediv_py_sequence() -> None:
40+
"""Test pd.Series[complex] / Python native sequence"""
41+
i, f, c = [2, 3, 5], [1.0, 2.0, 3.0], [1j, 1j, 4j]
42+
43+
check(assert_type(left / i, "pd.Series[complex]"), pd.Series, np.complex128)
44+
check(assert_type(left / f, "pd.Series[complex]"), pd.Series, np.complex128)
45+
check(assert_type(left / c, "pd.Series[complex]"), pd.Series, np.complex128)
46+
47+
check(assert_type(i / left, "pd.Series[complex]"), pd.Series, np.complex128)
48+
check(assert_type(f / left, "pd.Series[complex]"), pd.Series, np.complex128)
49+
check(assert_type(c / left, "pd.Series[complex]"), pd.Series, np.complex128)
50+
51+
check(assert_type(left.truediv(i), "pd.Series[complex]"), pd.Series, np.complex128)
52+
check(assert_type(left.truediv(f), "pd.Series[complex]"), pd.Series, np.complex128)
53+
check(assert_type(left.truediv(c), "pd.Series[complex]"), pd.Series, np.complex128)
54+
55+
check(assert_type(left.div(i), "pd.Series[complex]"), pd.Series, np.complex128)
56+
check(assert_type(left.div(f), "pd.Series[complex]"), pd.Series, np.complex128)
57+
check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complex128)
58+
59+
check(assert_type(left.rtruediv(i), "pd.Series[complex]"), pd.Series, np.complex128)
60+
check(assert_type(left.rtruediv(f), "pd.Series[complex]"), pd.Series, np.complex128)
61+
check(assert_type(left.rtruediv(c), "pd.Series[complex]"), pd.Series, np.complex128)
62+
63+
check(assert_type(left.rdiv(i), "pd.Series[complex]"), pd.Series, np.complex128)
64+
check(assert_type(left.rdiv(f), "pd.Series[complex]"), pd.Series, np.complex128)
65+
check(assert_type(left.rdiv(c), "pd.Series[complex]"), pd.Series, np.complex128)
66+
67+
68+
def test_truediv_numpy_array() -> None:
69+
"""Test pd.Series[complex] / numpy array"""
70+
i = np.array([2, 3, 5], np.int64)
71+
f = np.array([1.0, 2.0, 3.0], np.float64)
72+
c = np.array([1.1j, 2.2j, 4.1j], np.complex128)
73+
74+
check(assert_type(left / i, "pd.Series[complex]"), pd.Series, np.complex128)
75+
check(assert_type(left / f, "pd.Series[complex]"), pd.Series, np.complex128)
76+
check(assert_type(left / c, "pd.Series[complex]"), pd.Series, np.complex128)
77+
78+
# numpy typing gives ndarray instead of `pd.Series[...]` in reality, which we cannot fix
79+
check(
80+
assert_type( # type: ignore[assert-type]
81+
i / left, "pd.Series[complex]" # pyright: ignore[reportAssertTypeFailure]
82+
),
83+
pd.Series,
84+
np.complex128,
85+
)
86+
check(
87+
assert_type( # type: ignore[assert-type]
88+
f / left, "pd.Series[complex]" # pyright: ignore[reportAssertTypeFailure]
89+
),
90+
pd.Series,
91+
np.complex128,
92+
)
93+
check(
94+
assert_type( # type: ignore[assert-type]
95+
c / left, "pd.Series[complex]" # pyright: ignore[reportAssertTypeFailure]
96+
),
97+
pd.Series,
98+
np.complex128,
99+
)
100+
101+
check(assert_type(left.truediv(i), "pd.Series[complex]"), pd.Series, np.complex128)
102+
check(assert_type(left.truediv(f), "pd.Series[complex]"), pd.Series, np.complex128)
103+
check(assert_type(left.truediv(c), "pd.Series[complex]"), pd.Series, np.complex128)
104+
105+
check(assert_type(left.div(i), "pd.Series[complex]"), pd.Series, np.complex128)
106+
check(assert_type(left.div(f), "pd.Series[complex]"), pd.Series, np.complex128)
107+
check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complex128)
108+
109+
check(assert_type(left.rtruediv(i), "pd.Series[complex]"), pd.Series, np.complex128)
110+
check(assert_type(left.rtruediv(f), "pd.Series[complex]"), pd.Series, np.complex128)
111+
check(assert_type(left.rtruediv(c), "pd.Series[complex]"), pd.Series, np.complex128)
112+
113+
check(assert_type(left.rdiv(i), "pd.Series[complex]"), pd.Series, np.complex128)
114+
check(assert_type(left.rdiv(f), "pd.Series[complex]"), pd.Series, np.complex128)
115+
check(assert_type(left.rdiv(c), "pd.Series[complex]"), pd.Series, np.complex128)
116+
117+
118+
def test_truediv_pd_series() -> None:
119+
"""Test pd.Series[complex] / pandas series"""
120+
i = pd.Series([2, 3, 5])
121+
f = pd.Series([1.0, 2.0, 3.0])
122+
c = pd.Series([1.1j, 2.2j, 4.1j])
123+
124+
check(assert_type(left / i, "pd.Series[complex]"), pd.Series, np.complex128)
125+
check(assert_type(left / f, "pd.Series[complex]"), pd.Series, np.complex128)
126+
check(assert_type(left / c, "pd.Series[complex]"), pd.Series, np.complex128)
127+
128+
check(assert_type(i / left, "pd.Series[complex]"), pd.Series, np.complex128)
129+
check(assert_type(f / left, "pd.Series[complex]"), pd.Series, np.complex128)
130+
check(assert_type(c / left, "pd.Series[complex]"), pd.Series, np.complex128)
131+
132+
check(assert_type(left.truediv(i), "pd.Series[complex]"), pd.Series, np.complex128)
133+
check(assert_type(left.truediv(f), "pd.Series[complex]"), pd.Series, np.complex128)
134+
check(assert_type(left.truediv(c), "pd.Series[complex]"), pd.Series, np.complex128)
135+
136+
check(assert_type(left.div(i), "pd.Series[complex]"), pd.Series, np.complex128)
137+
check(assert_type(left.div(f), "pd.Series[complex]"), pd.Series, np.complex128)
138+
check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complex128)
139+
140+
check(assert_type(left.rtruediv(i), "pd.Series[complex]"), pd.Series, np.complex128)
141+
check(assert_type(left.rtruediv(f), "pd.Series[complex]"), pd.Series, np.complex128)
142+
check(assert_type(left.rtruediv(c), "pd.Series[complex]"), pd.Series, np.complex128)
143+
144+
check(assert_type(left.rdiv(i), "pd.Series[complex]"), pd.Series, np.complex128)
145+
check(assert_type(left.rdiv(f), "pd.Series[complex]"), pd.Series, np.complex128)
146+
check(assert_type(left.rdiv(c), "pd.Series[complex]"), pd.Series, np.complex128)

tests/series/arithmetic/float/__init__.py

Whitespace-only changes.
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
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+
left = pd.Series([1.0, 2.0, 3.0]) # left operand
8+
9+
10+
def test_truediv_py_scalar() -> None:
11+
"""Test pd.Series[float] / Python native scalars"""
12+
i, f, c = 1, 1.0, 1j
13+
14+
check(assert_type(left / i, "pd.Series[float]"), pd.Series, np.float64)
15+
check(assert_type(left / f, "pd.Series[float]"), pd.Series, np.float64)
16+
check(assert_type(left / c, "pd.Series[complex]"), pd.Series, np.complex128)
17+
18+
check(assert_type(i / left, "pd.Series[float]"), pd.Series, np.float64)
19+
check(assert_type(f / left, "pd.Series[float]"), pd.Series, np.float64)
20+
check(assert_type(c / left, "pd.Series[complex]"), pd.Series, np.complex128)
21+
22+
check(assert_type(left.truediv(i), "pd.Series[float]"), pd.Series, np.float64)
23+
check(assert_type(left.truediv(f), "pd.Series[float]"), pd.Series, np.float64)
24+
check(assert_type(left.truediv(c), "pd.Series[complex]"), pd.Series, np.complex128)
25+
26+
check(assert_type(left.div(i), "pd.Series[float]"), pd.Series, np.float64)
27+
check(assert_type(left.div(f), "pd.Series[float]"), pd.Series, np.float64)
28+
check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complex128)
29+
30+
check(assert_type(left.rtruediv(i), "pd.Series[float]"), pd.Series, np.float64)
31+
check(assert_type(left.rtruediv(f), "pd.Series[float]"), pd.Series, np.float64)
32+
check(assert_type(left.rtruediv(c), "pd.Series[complex]"), pd.Series, np.complex128)
33+
34+
check(assert_type(left.rdiv(i), "pd.Series[float]"), pd.Series, np.float64)
35+
check(assert_type(left.rdiv(f), "pd.Series[float]"), pd.Series, np.float64)
36+
check(assert_type(left.rdiv(c), "pd.Series[complex]"), pd.Series, np.complex128)
37+
38+
39+
def test_truediv_py_sequence() -> None:
40+
"""Test pd.Series[float] / Python native sequence"""
41+
i, f, c = [2, 3, 5], [1.0, 2.0, 3.0], [1j, 1j, 4j]
42+
43+
check(assert_type(left / i, "pd.Series[float]"), pd.Series, np.float64)
44+
check(assert_type(left / f, "pd.Series[float]"), pd.Series, np.float64)
45+
check(assert_type(left / c, "pd.Series[complex]"), pd.Series, np.complex128)
46+
47+
check(assert_type(i / left, "pd.Series[float]"), pd.Series, np.float64)
48+
check(assert_type(f / left, "pd.Series[float]"), pd.Series, np.float64)
49+
check(assert_type(c / left, "pd.Series[complex]"), pd.Series, np.complex128)
50+
51+
check(assert_type(left.truediv(i), "pd.Series[float]"), pd.Series, np.float64)
52+
check(assert_type(left.truediv(f), "pd.Series[float]"), pd.Series, np.float64)
53+
check(assert_type(left.truediv(c), "pd.Series[complex]"), pd.Series, np.complex128)
54+
55+
check(assert_type(left.div(i), "pd.Series[float]"), pd.Series, np.float64)
56+
check(assert_type(left.div(f), "pd.Series[float]"), pd.Series, np.float64)
57+
check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complex128)
58+
59+
check(assert_type(left.rtruediv(i), "pd.Series[float]"), pd.Series, np.float64)
60+
check(assert_type(left.rtruediv(f), "pd.Series[float]"), pd.Series, np.float64)
61+
check(assert_type(left.rtruediv(c), "pd.Series[complex]"), pd.Series, np.complex128)
62+
63+
check(assert_type(left.rdiv(i), "pd.Series[float]"), pd.Series, np.float64)
64+
check(assert_type(left.rdiv(f), "pd.Series[float]"), pd.Series, np.float64)
65+
check(assert_type(left.rdiv(c), "pd.Series[complex]"), pd.Series, np.complex128)
66+
67+
68+
def test_truediv_numpy_array() -> None:
69+
"""Test pd.Series[float] / numpy array"""
70+
i = np.array([2, 3, 5], np.int64)
71+
f = np.array([1.0, 2.0, 3.0], np.float64)
72+
c = np.array([1.1j, 2.2j, 4.1j], np.complex128)
73+
74+
check(assert_type(left / i, "pd.Series[float]"), pd.Series, np.float64)
75+
check(assert_type(left / f, "pd.Series[float]"), pd.Series, np.float64)
76+
check(assert_type(left / c, "pd.Series[complex]"), pd.Series, np.complex128)
77+
78+
# numpy typing gives ndarray instead of `pd.Series[...]` in reality, which we cannot fix
79+
check(
80+
assert_type( # type: ignore[assert-type]
81+
i / left, "pd.Series[float]" # pyright: ignore[reportAssertTypeFailure]
82+
),
83+
pd.Series,
84+
np.float64,
85+
)
86+
check(
87+
assert_type( # type: ignore[assert-type]
88+
f / left, "pd.Series[float]" # pyright: ignore[reportAssertTypeFailure]
89+
),
90+
pd.Series,
91+
np.float64,
92+
)
93+
check(
94+
assert_type( # type: ignore[assert-type]
95+
c / left, "pd.Series[complex]" # pyright: ignore[reportAssertTypeFailure]
96+
),
97+
pd.Series,
98+
np.complex128,
99+
)
100+
101+
check(assert_type(left.truediv(i), "pd.Series[float]"), pd.Series, np.float64)
102+
check(assert_type(left.truediv(f), "pd.Series[float]"), pd.Series, np.float64)
103+
check(assert_type(left.truediv(c), "pd.Series[complex]"), pd.Series, np.complex128)
104+
105+
check(assert_type(left.div(i), "pd.Series[float]"), pd.Series, np.float64)
106+
check(assert_type(left.div(f), "pd.Series[float]"), pd.Series, np.float64)
107+
check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complex128)
108+
109+
check(assert_type(left.rtruediv(i), "pd.Series[float]"), pd.Series, np.float64)
110+
check(assert_type(left.rtruediv(f), "pd.Series[float]"), pd.Series, np.float64)
111+
check(assert_type(left.rtruediv(c), "pd.Series[complex]"), pd.Series, np.complex128)
112+
113+
check(assert_type(left.rdiv(i), "pd.Series[float]"), pd.Series, np.float64)
114+
check(assert_type(left.rdiv(f), "pd.Series[float]"), pd.Series, np.float64)
115+
check(assert_type(left.rdiv(c), "pd.Series[complex]"), pd.Series, np.complex128)
116+
117+
118+
def test_truediv_pd_series() -> None:
119+
"""Test pd.Series[float] / pandas series"""
120+
i = pd.Series([2, 3, 5])
121+
f = pd.Series([1.0, 2.0, 3.0])
122+
c = pd.Series([1.1j, 2.2j, 4.1j])
123+
124+
check(assert_type(left / i, "pd.Series[float]"), pd.Series, np.float64)
125+
check(assert_type(left / f, "pd.Series[float]"), pd.Series, np.float64)
126+
check(assert_type(left / c, "pd.Series[complex]"), pd.Series, np.complex128)
127+
128+
check(assert_type(i / left, "pd.Series[float]"), pd.Series, np.float64)
129+
check(assert_type(f / left, "pd.Series[float]"), pd.Series, np.float64)
130+
check(assert_type(c / left, "pd.Series[complex]"), pd.Series, np.complex128)
131+
132+
check(assert_type(left.truediv(i), "pd.Series[float]"), pd.Series, np.float64)
133+
check(assert_type(left.truediv(f), "pd.Series[float]"), pd.Series, np.float64)
134+
check(assert_type(left.truediv(c), "pd.Series[complex]"), pd.Series, np.complex128)
135+
136+
check(assert_type(left.div(i), "pd.Series[float]"), pd.Series, np.float64)
137+
check(assert_type(left.div(f), "pd.Series[float]"), pd.Series, np.float64)
138+
check(assert_type(left.div(c), "pd.Series[complex]"), pd.Series, np.complex128)
139+
140+
check(assert_type(left.rtruediv(i), "pd.Series[float]"), pd.Series, np.float64)
141+
check(assert_type(left.rtruediv(f), "pd.Series[float]"), pd.Series, np.float64)
142+
check(assert_type(left.rtruediv(c), "pd.Series[complex]"), pd.Series, np.complex128)
143+
144+
check(assert_type(left.rdiv(i), "pd.Series[float]"), pd.Series, np.float64)
145+
check(assert_type(left.rdiv(f), "pd.Series[float]"), pd.Series, np.float64)
146+
check(assert_type(left.rdiv(c), "pd.Series[complex]"), pd.Series, np.complex128)

tests/series/arithmetic/int/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)