Skip to content

Commit 514eefe

Browse files
GH1089 Migrate frame/series tests to new framework
1 parent 3f42941 commit 514eefe

File tree

3 files changed

+118
-68
lines changed

3 files changed

+118
-68
lines changed

pandas-stubs/core/frame.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ if sys.version_info >= (3, 12):
246246
@overload
247247
def __getitem__(self, key: Scalar | tuple[Hashable, ...]) -> Series: ... # type: ignore[overload-overlap] # pyright: ignore[reportOverlappingOverload]
248248
@overload
249-
def __getitem__( # type: ignore[overload-overlap] # pyright: ignore[reportOverlappingOverload]
249+
def __getitem__( # pyright: ignore[reportOverlappingOverload]
250250
self, key: Iterable[Hashable] | slice
251251
) -> Self: ...
252252
@overload

tests/test_frame.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2409,7 +2409,7 @@ def test_indexslice_getitem():
24092409
ind = pd.Index([2, 3])
24102410
check(
24112411
assert_type(
2412-
pd.IndexSlice[ind, :], tuple["pd.Index[int]", "slice[None, None, None]"]
2412+
pd.IndexSlice[ind, :], tuple["pd.Index[int]", "slice[None, None, None]"] # type: ignore[type-arg]
24132413
),
24142414
tuple,
24152415
)
@@ -2451,10 +2451,10 @@ def test_sum_get_add() -> None:
24512451

24522452

24532453
def test_getset_untyped() -> None:
2454-
result: int = 10
24552454
df = pd.DataFrame({"x": [1, 2, 3, 4, 5], "y": [10, 20, 30, 40, 50]})
24562455
# Tests that Dataframe.__getitem__ needs to return untyped series.
2457-
result = df["x"].max()
2456+
# TODO this typecheck is actually bogus as the right part is "Unknown"
2457+
result: pd.Series = df["x"].max()
24582458

24592459

24602460
def test_getmultiindex_columns() -> None:
@@ -2965,7 +2965,9 @@ def sum_mean(x: pd.DataFrame) -> float:
29652965
pd.Series,
29662966
)
29672967

2968-
lfunc: Callable[[pd.DataFrame], float] = lambda x: x.sum().mean()
2968+
def lfunc(x: pd.DataFrame) -> float:
2969+
return x.sum().mean()
2970+
29692971
with pytest_warns_bounded(
29702972
DeprecationWarning,
29712973
"DataFrameGroupBy.apply operated on the grouping columns.",

tests/test_series.py

Lines changed: 111 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -145,20 +145,20 @@ def test_types_all() -> None:
145145

146146
def test_types_csv() -> None:
147147
s = pd.Series(data=[1, 2, 3])
148-
csv_df: str = s.to_csv()
148+
check(assert_type(s.to_csv(), str), str)
149149

150150
with ensure_clean() as path:
151151
s.to_csv(path)
152-
s2: pd.DataFrame = pd.read_csv(path)
152+
check(assert_type(pd.read_csv(path), pd.DataFrame), pd.DataFrame)
153153

154154
with ensure_clean() as path:
155155
s.to_csv(Path(path))
156-
s3: pd.DataFrame = pd.read_csv(Path(path))
156+
check(assert_type(pd.read_csv(Path(path)), pd.DataFrame), pd.DataFrame)
157157

158158
# This keyword was added in 1.1.0 https://pandas.pydata.org/docs/whatsnew/v1.1.0.html
159159
with ensure_clean() as path:
160160
s.to_csv(path, errors="replace")
161-
s4: pd.DataFrame = pd.read_csv(path)
161+
check(assert_type(pd.read_csv(path), pd.DataFrame), pd.DataFrame)
162162

163163

164164
def test_types_copy() -> None:
@@ -229,11 +229,11 @@ def test_types_boolean_indexing() -> None:
229229
def test_types_df_to_df_comparison() -> None:
230230
s = pd.Series(data={"col1": [1, 2]})
231231
s2 = pd.Series(data={"col1": [3, 2]})
232-
res_gt: pd.Series = s > s2
233-
res_ge: pd.Series = s >= s2
234-
res_lt: pd.Series = s < s2
235-
res_le: pd.Series = s <= s2
236-
res_e: pd.Series = s == s2
232+
check(assert_type(s > s2, "pd.Series[bool]"), pd.Series, np.bool_)
233+
check(assert_type(s >= s2, "pd.Series[bool]"), pd.Series, np.bool_)
234+
check(assert_type(s < s2, "pd.Series[bool]"), pd.Series, np.bool_)
235+
check(assert_type(s <= s2, "pd.Series[bool]"), pd.Series, np.bool_)
236+
check(assert_type(s == s2, "pd.Series[bool]"), pd.Series, np.bool_)
237237

238238

239239
def test_types_head_tail() -> None:
@@ -309,7 +309,11 @@ def test_types_drop_multilevel() -> None:
309309
codes=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]],
310310
)
311311
s = pd.Series(data=[1, 2, 3, 4, 5, 6], index=index)
312-
res: pd.Series = s.drop(labels="first", level=1)
312+
check(
313+
assert_type(s.drop(labels="first", level=1), "pd.Series[int]"),
314+
pd.Series,
315+
np.int64,
316+
)
313317

314318

315319
def test_types_drop_duplicates() -> None:
@@ -382,7 +386,11 @@ def test_types_sort_index() -> None:
382386
# This was added in 1.1.0 https://pandas.pydata.org/docs/whatsnew/v1.1.0.html
383387
def test_types_sort_index_with_key() -> None:
384388
s = pd.Series([1, 2, 3], index=["a", "B", "c"])
385-
res: pd.Series = s.sort_index(key=lambda k: k.str.lower())
389+
check(
390+
assert_type(s.sort_index(key=lambda k: k.str.lower()), "pd.Series[int]"),
391+
pd.Series,
392+
np.int64,
393+
)
386394

387395

388396
def test_types_sort_values() -> None:
@@ -412,7 +420,11 @@ def test_types_sort_values() -> None:
412420
# This was added in 1.1.0 https://pandas.pydata.org/docs/whatsnew/v1.1.0.html
413421
def test_types_sort_values_with_key() -> None:
414422
s = pd.Series([1, 2, 3], index=[2, 3, 1])
415-
res: pd.Series = s.sort_values(key=lambda k: -k)
423+
check(
424+
assert_type(s.sort_values(key=lambda k: -k), "pd.Series[int]"),
425+
pd.Series,
426+
np.integer,
427+
)
416428

417429

418430
def test_types_shift() -> None:
@@ -435,18 +447,32 @@ def test_types_rank() -> None:
435447

436448
def test_types_mean() -> None:
437449
s = pd.Series([1, 2, 3, np.nan])
438-
f1: float = s.mean()
439-
s1: pd.Series = s.groupby(level=0).mean()
440-
f2: float = s.mean(skipna=False)
441-
f3: float = s.mean(numeric_only=False)
450+
check(assert_type(s.mean(), float), float)
451+
check(
452+
assert_type(
453+
s.groupby(level=0).mean(), # pyright: ignore[reportAssertTypeFailure]
454+
"pd.Series[float]",
455+
),
456+
pd.Series,
457+
float,
458+
)
459+
check(assert_type(s.mean(skipna=False), float), float)
460+
check(assert_type(s.mean(numeric_only=False), float), float)
442461

443462

444463
def test_types_median() -> None:
445464
s = pd.Series([1, 2, 3, np.nan])
446-
f1: float = s.median()
447-
s1: pd.Series = s.groupby(level=0).median()
448-
f2: float = s.median(skipna=False)
449-
f3: float = s.median(numeric_only=False)
465+
check(assert_type(s.median(), float), float)
466+
check(
467+
assert_type(
468+
s.groupby(level=0).median(), # pyright: ignore[reportAssertTypeFailure]
469+
"pd.Series[float]",
470+
),
471+
pd.Series,
472+
float,
473+
)
474+
check(assert_type(s.median(skipna=False), float), float)
475+
check(assert_type(s.median(numeric_only=False), float), float)
450476

451477

452478
def test_types_sum() -> None:
@@ -624,63 +650,79 @@ def test_types_element_wise_arithmetic() -> None:
624650
s = pd.Series([0, 1, -10])
625651
s2 = pd.Series([7, -5, 10])
626652

627-
res_add1: pd.Series = s + s2
628-
res_add2: pd.Series = s.add(s2, fill_value=0)
653+
check(assert_type(s + s2, "pd.Series[int]"), pd.Series, np.integer)
654+
check(assert_type(s.add(s2, fill_value=0), "pd.Series[int]"), pd.Series, np.integer)
629655

630-
res_sub: pd.Series = s - s2
631-
res_sub2: pd.Series = s.sub(s2, fill_value=0)
656+
check(assert_type(s - s2, pd.Series), pd.Series, np.integer)
657+
check(assert_type(s.sub(s2, fill_value=0), "pd.Series[int]"), pd.Series, np.integer)
632658

633-
res_mul: pd.Series = s * s2
634-
res_mul2: pd.Series = s.mul(s2, fill_value=0)
659+
check(assert_type(s * s2, pd.Series), pd.Series, np.integer)
660+
check(assert_type(s.mul(s2, fill_value=0), pd.Series), pd.Series, np.integer)
635661

636-
res_div: pd.Series = s / s2
637-
res_div2: pd.Series = s.div(s2, fill_value=0)
662+
check(assert_type(s / s2, pd.Series), pd.Series, np.float64)
663+
check(
664+
assert_type(s.div(s2, fill_value=0), "pd.Series[float]"), pd.Series, np.float64
665+
)
638666

639-
res_floordiv: pd.Series = s // s2
640-
res_floordiv2: pd.Series = s.floordiv(s2, fill_value=0)
667+
check(assert_type(s // s2, "pd.Series[int]"), pd.Series, np.integer)
668+
check(
669+
assert_type(s.floordiv(s2, fill_value=0), "pd.Series[int]"),
670+
pd.Series,
671+
np.integer,
672+
)
641673

642-
res_mod: pd.Series = s % s2
643-
res_mod2: pd.Series = s.mod(s2, fill_value=0)
674+
check(assert_type(s % s2, "pd.Series[int]"), pd.Series, np.integer)
675+
check(assert_type(s.mod(s2, fill_value=0), "pd.Series[int]"), pd.Series, np.integer)
644676

645-
res_pow: pd.Series = s ** s2.abs()
646-
res_pow2: pd.Series = s.pow(s2.abs(), fill_value=0)
677+
check(assert_type(s ** s2.abs(), "pd.Series[int]"), pd.Series, np.integer)
678+
check(
679+
assert_type(s.pow(s2.abs(), fill_value=0), "pd.Series[int]"),
680+
pd.Series,
681+
np.integer,
682+
)
647683

648684
check(assert_type(divmod(s, s2), tuple["pd.Series[int]", "pd.Series[int]"]), tuple)
649685

650686

651687
def test_types_scalar_arithmetic() -> None:
652688
s = pd.Series([0, 1, -10])
653689

654-
res_add1: pd.Series = s + 1
655-
res_add2: pd.Series = s.add(1, fill_value=0)
690+
check(assert_type(s + 1, "pd.Series[int]"), pd.Series, np.integer)
691+
check(assert_type(s.add(1, fill_value=0), "pd.Series[int]"), pd.Series, np.integer)
656692

657-
res_sub: pd.Series = s - 1
658-
res_sub2: pd.Series = s.sub(1, fill_value=0)
693+
check(assert_type(s - 1, pd.Series), pd.Series, np.integer)
694+
check(assert_type(s.sub(1, fill_value=0), "pd.Series[int]"), pd.Series, np.integer)
659695

660-
res_mul: pd.Series = s * 2
661-
res_mul2: pd.Series = s.mul(2, fill_value=0)
696+
check(assert_type(s * 2, pd.Series), pd.Series, np.integer)
697+
check(assert_type(s.mul(2, fill_value=0), pd.Series), pd.Series, np.integer)
662698

663-
res_div: pd.Series = s / 2
664-
res_div2: pd.Series = s.div(2, fill_value=0)
699+
check(assert_type(s / 2, pd.Series), pd.Series, np.float64)
700+
check(
701+
assert_type(s.div(2, fill_value=0), "pd.Series[float]"), pd.Series, np.float64
702+
)
665703

666-
res_floordiv: pd.Series = s // 2
667-
res_floordiv2: pd.Series = s.floordiv(2, fill_value=0)
704+
check(assert_type(s // 2, "pd.Series[int]"), pd.Series, np.integer)
705+
check(
706+
assert_type(s.floordiv(2, fill_value=0), "pd.Series[int]"),
707+
pd.Series,
708+
np.integer,
709+
)
668710

669-
res_mod: pd.Series = s % 2
670-
res_mod2: pd.Series = s.mod(2, fill_value=0)
711+
check(assert_type(s % 2, "pd.Series[int]"), pd.Series, np.integer)
712+
check(assert_type(s.mod(2, fill_value=0), "pd.Series[int]"), pd.Series, np.integer)
671713

672-
res_pow: pd.Series = s**2
673-
res_pow1: pd.Series = s**0
674-
res_pow2: pd.Series = s**0.213
675-
res_pow3: pd.Series = s.pow(0.5)
714+
check(assert_type(s**2, "pd.Series[int]"), pd.Series, np.integer)
715+
check(assert_type(s**0, "pd.Series[int]"), pd.Series, np.integer)
716+
check(assert_type(s**0.213, "pd.Series[int]"), pd.Series, np.float64)
717+
check(assert_type(s.pow(0.5), "pd.Series[int]"), pd.Series, np.float64)
676718

677719

678720
# GH 103
679721
def test_types_complex_arithmetic() -> None:
680722
c = 1 + 1j
681723
s = pd.Series([1.0, 2.0, 3.0])
682-
x = s + c
683-
y = s - c
724+
check(assert_type(s + c, pd.Series), pd.Series)
725+
check(assert_type(s - c, pd.Series), pd.Series)
684726

685727

686728
def test_types_groupby() -> None:
@@ -1105,8 +1147,8 @@ def test_types_getitem() -> None:
11051147
s = pd.Series({"key": [0, 1, 2, 3]})
11061148
key: list[int] = s["key"]
11071149
s2 = pd.Series([0, 1, 2, 3])
1108-
value: int = s2[0]
1109-
s3: pd.Series = s[:2]
1150+
check(assert_type(s2[0], int), np.integer)
1151+
check(assert_type(s[:2], pd.Series), pd.Series)
11101152

11111153

11121154
def test_types_getitem_by_timestamp() -> None:
@@ -1117,9 +1159,9 @@ def test_types_getitem_by_timestamp() -> None:
11171159

11181160
def test_types_eq() -> None:
11191161
s1 = pd.Series([1, 2, 3])
1120-
res1: pd.Series = s1 == 1
1162+
check(assert_type(s1 == 1, "pd.Series[bool]"), pd.Series, np.bool_)
11211163
s2 = pd.Series([1, 2, 4])
1122-
res2: pd.Series = s1 == s2
1164+
check(assert_type(s1 == s2, "pd.Series[bool]"), pd.Series, np.bool_)
11231165

11241166

11251167
def test_types_rename_axis() -> None:
@@ -1317,7 +1359,7 @@ def test_series_multiindex_getitem() -> None:
13171359
s = pd.Series(
13181360
[1, 2, 3, 4], index=pd.MultiIndex.from_product([["a", "b"], ["x", "y"]])
13191361
)
1320-
s1: pd.Series = s["a", :]
1362+
check(assert_type(s["a", :], "pd.Series[int]"), pd.Series, np.integer)
13211363

13221364

13231365
def test_series_mul() -> None:
@@ -1408,13 +1450,19 @@ def test_cat_accessor() -> None:
14081450

14091451

14101452
def test_cat_ctor_values() -> None:
1411-
c1 = pd.Categorical(["a", "b", "a"])
1453+
check(assert_type(pd.Categorical(["a", "b", "a"]), pd.Categorical), pd.Categorical)
14121454
# GH 95
1413-
c2 = pd.Categorical(pd.Series(["a", "b", "a"]))
1455+
check(
1456+
assert_type(pd.Categorical(pd.Series(["a", "b", "a"])), pd.Categorical),
1457+
pd.Categorical,
1458+
)
14141459
s: Sequence = cast(Sequence, ["a", "b", "a"])
1415-
c3 = pd.Categorical(s)
1460+
check(assert_type(pd.Categorical(s), pd.Categorical), pd.Categorical)
14161461
# GH 107
1417-
c4 = pd.Categorical(np.array([1, 2, 3, 1, 1]))
1462+
check(
1463+
assert_type(pd.Categorical(np.array([1, 2, 3, 1, 1])), pd.Categorical),
1464+
pd.Categorical,
1465+
)
14181466

14191467

14201468
def test_iloc_getitem_ndarray() -> None:
@@ -2768,7 +2816,7 @@ def test_astype_other() -> None:
27682816

27692817
def test_all_astype_args_tested() -> None:
27702818
"""Check that all relevant numpy type aliases are tested."""
2771-
NUMPY_ALIASES: set[str] = {k for k in np.sctypeDict}
2819+
NUMPY_ALIASES: set[str | int] = {k for k in np.sctypeDict}
27722820
EXCLUDED_ALIASES = {
27732821
"datetime64",
27742822
"m",
@@ -2889,7 +2937,7 @@ def test_convert_dtypes_dtype_backend() -> None:
28892937
def test_apply_returns_none() -> None:
28902938
# GH 557
28912939
s = pd.Series([1, 2, 3])
2892-
check(assert_type(s.apply(lambda x: None), pd.Series), pd.Series)
2940+
check(assert_type(s.apply(lambda _: None), pd.Series), pd.Series)
28932941

28942942

28952943
def test_loc_callable() -> None:

0 commit comments

Comments
 (0)