Skip to content

Commit 8a01e12

Browse files
committed
Merge branch 'main' into hotfix/cmp0xff/gh718-drop-tss
2 parents f855f86 + 966aebf commit 8a01e12

File tree

10 files changed

+269
-64
lines changed

10 files changed

+269
-64
lines changed

attempt.py

Lines changed: 0 additions & 51 deletions
This file was deleted.

pandas-stubs/core/groupby/generic.pyi

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,13 @@ class DataFrameGroupBy(GroupBy[DataFrame], Generic[ByT, _TT]):
264264
engine_kwargs: WindowingEngineKwargs = ...,
265265
**kwargs,
266266
) -> DataFrame: ...
267+
@overload
268+
def aggregate(
269+
self,
270+
func: AggFuncTypeFrame | None = None,
271+
/,
272+
**kwargs,
273+
) -> DataFrame: ...
267274
agg = aggregate
268275
@overload
269276
def transform(

pandas-stubs/core/indexes/datetimes.pyi

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,46 @@ class DatetimeIndex(
102102
self, periods: int = 1, freq: DateOffset | Timedelta | str | None = None
103103
) -> Self: ...
104104

105+
@overload
106+
def date_range(
107+
start: str | DateAndDatetimeLike,
108+
end: str | DateAndDatetimeLike,
109+
freq: str | timedelta | Timedelta | BaseOffset | None = None,
110+
tz: TimeZones = None,
111+
normalize: bool = False,
112+
name: Hashable | None = None,
113+
inclusive: IntervalClosedType = "both",
114+
unit: TimeUnit | None = None,
115+
) -> DatetimeIndex: ...
116+
@overload
105117
def date_range(
106-
start: str | DateAndDatetimeLike | None = None,
107-
end: str | DateAndDatetimeLike | None = None,
108-
periods: int | None = None,
109-
freq: str | timedelta | Timedelta | BaseOffset = "D",
118+
start: str | DateAndDatetimeLike,
119+
end: str | DateAndDatetimeLike,
120+
periods: int,
121+
tz: TimeZones = None,
122+
normalize: bool = False,
123+
name: Hashable | None = None,
124+
inclusive: IntervalClosedType = "both",
125+
unit: TimeUnit | None = None,
126+
) -> DatetimeIndex: ...
127+
@overload
128+
def date_range(
129+
start: str | DateAndDatetimeLike,
130+
*,
131+
periods: int,
132+
freq: str | timedelta | Timedelta | BaseOffset | None = None,
133+
tz: TimeZones = None,
134+
normalize: bool = False,
135+
name: Hashable | None = None,
136+
inclusive: IntervalClosedType = "both",
137+
unit: TimeUnit | None = None,
138+
) -> DatetimeIndex: ...
139+
@overload
140+
def date_range(
141+
*,
142+
end: str | DateAndDatetimeLike,
143+
periods: int,
144+
freq: str | timedelta | Timedelta | BaseOffset | None = None,
110145
tz: TimeZones = None,
111146
normalize: bool = False,
112147
name: Hashable | None = None,

pandas-stubs/core/indexes/timedeltas.pyi

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,43 @@ class TimedeltaIndex(
7979
def to_series(self, index=..., name: Hashable = ...) -> TimedeltaSeries: ...
8080
def shift(self, periods: int = 1, freq=...) -> Self: ...
8181

82+
@overload
8283
def timedelta_range(
83-
start: TimedeltaConvertibleTypes | None = None,
84-
end: TimedeltaConvertibleTypes | None = None,
85-
periods: int | None = None,
84+
start: TimedeltaConvertibleTypes,
85+
end: TimedeltaConvertibleTypes,
86+
*,
87+
freq: str | DateOffset | Timedelta | dt.timedelta | None = None,
88+
name: Hashable | None = None,
89+
closed: Literal["left", "right"] | None = None,
90+
unit: None | str = ...,
91+
) -> TimedeltaIndex: ...
92+
@overload
93+
def timedelta_range(
94+
*,
95+
end: TimedeltaConvertibleTypes,
96+
periods: int,
97+
freq: str | DateOffset | Timedelta | dt.timedelta | None = None,
98+
name: Hashable | None = None,
99+
closed: Literal["left", "right"] | None = None,
100+
unit: None | str = ...,
101+
) -> TimedeltaIndex: ...
102+
@overload
103+
def timedelta_range(
104+
start: TimedeltaConvertibleTypes,
105+
*,
106+
periods: int,
86107
freq: str | DateOffset | Timedelta | dt.timedelta | None = None,
87108
name: Hashable | None = None,
88109
closed: Literal["left", "right"] | None = None,
110+
unit: None | str = ...,
111+
) -> TimedeltaIndex: ...
112+
@overload
113+
def timedelta_range(
114+
start: TimedeltaConvertibleTypes,
115+
end: TimedeltaConvertibleTypes,
116+
periods: int,
89117
*,
118+
name: Hashable | None = None,
119+
closed: Literal["left", "right"] | None = None,
90120
unit: None | str = ...,
91121
) -> TimedeltaIndex: ...

pandas-stubs/core/series.pyi

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1688,6 +1688,13 @@ class Series(IndexOpsMixin[S1], NDFrame):
16881688
self: Series[_T_COMPLEX], other: np_ndarray_complex
16891689
) -> Series[complex]: ...
16901690
@overload
1691+
def __add__(
1692+
self: Series[_str],
1693+
other: (
1694+
np_ndarray_bool | np_ndarray_anyint | np_ndarray_float | np_ndarray_complex
1695+
),
1696+
) -> Never: ...
1697+
@overload
16911698
def __add__(
16921699
self: Series[_str], other: _str | Sequence[_str] | np_ndarray_str | Series[_str]
16931700
) -> Series[_str]: ...
@@ -1951,6 +1958,13 @@ class Series(IndexOpsMixin[S1], NDFrame):
19511958
self: Series[_T_COMPLEX], other: np_ndarray_complex
19521959
) -> Series[complex]: ...
19531960
@overload
1961+
def __radd__(
1962+
self: Series[_str],
1963+
other: (
1964+
np_ndarray_bool | np_ndarray_anyint | np_ndarray_float | np_ndarray_complex
1965+
),
1966+
) -> Never: ...
1967+
@overload
19541968
def __radd__(
19551969
self: Series[_str], other: _str | Sequence[_str] | np_ndarray_str | Series[_str]
19561970
) -> Series[_str]: ...

tests/series/arithmetic/str/test_add.py

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,71 +4,119 @@
44
import numpy as np
55
from numpy import typing as npt # noqa: F401
66
import pandas as pd
7-
from typing_extensions import assert_type
7+
from typing_extensions import (
8+
Never,
9+
assert_type,
10+
)
811

9-
from tests import check
12+
from tests import (
13+
TYPE_CHECKING_INVALID_USAGE,
14+
check,
15+
)
1016

1117
left = pd.Series(["1", "23", "456"]) # left operand
1218

1319

1420
def test_add_py_scalar() -> None:
15-
"""Testpd.Series[str]+ Python native str"""
21+
"""Testpd.Series[str]+ Python native 'scalar's"""
22+
i = 4
1623
r0 = "right"
1724

25+
if TYPE_CHECKING_INVALID_USAGE:
26+
_0 = left + i # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
1827
check(assert_type(left + r0, "pd.Series[str]"), pd.Series, str)
1928

29+
if TYPE_CHECKING_INVALID_USAGE:
30+
_1 = i + left # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
2031
check(assert_type(r0 + left, "pd.Series[str]"), pd.Series, str)
2132

33+
if TYPE_CHECKING_INVALID_USAGE:
34+
left.add(i) # type: ignore[call-overload] # pyright: ignore[reportArgumentType,reportCallIssue]
2235
check(assert_type(left.add(r0), "pd.Series[str]"), pd.Series, str)
2336

37+
if TYPE_CHECKING_INVALID_USAGE:
38+
left.radd(i) # type: ignore[call-overload] # pyright: ignore[reportArgumentType,reportCallIssue]
2439
check(assert_type(left.radd(r0), "pd.Series[str]"), pd.Series, str)
2540

2641

2742
def test_add_py_sequence() -> None:
2843
"""Testpd.Series[str]+ Python native sequence"""
44+
i = [3, 5, 8]
2945
r0 = ["a", "bc", "def"]
3046
r1 = tuple(r0)
3147

48+
if TYPE_CHECKING_INVALID_USAGE:
49+
_0 = left + i # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
3250
check(assert_type(left + r0, "pd.Series[str]"), pd.Series, str)
3351
check(assert_type(left + r1, "pd.Series[str]"), pd.Series, str)
3452

53+
if TYPE_CHECKING_INVALID_USAGE:
54+
_1 = i + left # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
3555
check(assert_type(r0 + left, "pd.Series[str]"), pd.Series, str)
3656
check(assert_type(r1 + left, "pd.Series[str]"), pd.Series, str)
3757

58+
if TYPE_CHECKING_INVALID_USAGE:
59+
left.add(i) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue]
3860
check(assert_type(left.add(r0), "pd.Series[str]"), pd.Series, str)
3961
check(assert_type(left.add(r1), "pd.Series[str]"), pd.Series, str)
4062

63+
if TYPE_CHECKING_INVALID_USAGE:
64+
left.radd(i) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue]
4165
check(assert_type(left.radd(r0), "pd.Series[str]"), pd.Series, str)
4266
check(assert_type(left.radd(r1), "pd.Series[str]"), pd.Series, str)
4367

4468

4569
def test_add_numpy_array() -> None:
4670
"""Testpd.Series[str]+ numpy array"""
71+
i = np.array([3, 5, 8], np.int64)
4772
r0 = np.array(["a", "bc", "def"], np.str_)
4873

74+
if TYPE_CHECKING_INVALID_USAGE:
75+
assert_type(left + i, Never)
4976
check(assert_type(left + r0, "pd.Series[str]"), pd.Series, str)
5077

51-
# `numpy` typing gives `npt.NDArray[np.str_]` in the static type
78+
# `numpy` typing gives `npt.NDArray[np.int64]` in the static type
5279
# checking, where our `__radd__` cannot override. At runtime, they return
5380
# `Series`s.
81+
if TYPE_CHECKING_INVALID_USAGE:
82+
assert_type(i + left, "npt.NDArray[np.int64]")
5483
if sys.version_info >= (3, 11):
84+
# `numpy` typing gives `npt.NDArray[np.int64]` in the static type
85+
# checking, where our `__radd__` cannot override. At runtime, they return
86+
# `Series`s.
5587
check(assert_type(r0 + left, "npt.NDArray[np.str_]"), pd.Series, str)
5688
else:
89+
# Python 3.10 uses NumPy 2.2.6, and it has for r0 ndarray[tuple[int,...], dtype[str_]]
90+
# Python 3.11+ uses NumPy 2.3.2, and it has for r0 ndarray[tuple[Any,...,dtype[str_]]
91+
# https://github.com/pandas-dev/pandas-stubs/pull/1274#discussion_r2291498975
5792
check(assert_type(r0 + left, Any), pd.Series, str)
5893

94+
if TYPE_CHECKING_INVALID_USAGE:
95+
left.add(i) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue]
5996
check(assert_type(left.add(r0), "pd.Series[str]"), pd.Series, str)
6097

98+
if TYPE_CHECKING_INVALID_USAGE:
99+
left.radd(i) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue]
61100
check(assert_type(left.radd(r0), "pd.Series[str]"), pd.Series, str)
62101

63102

64103
def test_add_pd_series() -> None:
65104
"""Testpd.Series[str]+ pandas series"""
105+
i = pd.Series([3, 5, 8])
66106
r0 = pd.Series(["a", "bc", "def"])
67107

108+
if TYPE_CHECKING_INVALID_USAGE:
109+
_0 = left + i # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
68110
check(assert_type(left + r0, "pd.Series[str]"), pd.Series, str)
69111

112+
if TYPE_CHECKING_INVALID_USAGE:
113+
_1 = i + left # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
70114
check(assert_type(r0 + left, "pd.Series[str]"), pd.Series, str)
71115

116+
if TYPE_CHECKING_INVALID_USAGE:
117+
left.add(i) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue]
72118
check(assert_type(left.add(r0), "pd.Series[str]"), pd.Series, str)
73119

120+
if TYPE_CHECKING_INVALID_USAGE:
121+
left.radd(i) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue]
74122
check(assert_type(left.radd(r0), "pd.Series[str]"), pd.Series, str)

tests/series/test_series.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1598,7 +1598,6 @@ def test_series_min_max_sub_axis() -> None:
15981598
ss = s1 - s2
15991599
sm = s1 * s2
16001600
sd = s1 / s2
1601-
s1.__sub__(s2)
16021601
check(assert_type(sa, pd.Series), pd.Series)
16031602
check(assert_type(ss, pd.Series), pd.Series)
16041603
check(assert_type(sm, pd.Series), pd.Series)

tests/test_groupby.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1123,3 +1123,19 @@ def add_constant_to_mean(group: DataFrame, constant: int) -> DataFrame:
11231123
add_constant_to_mean,
11241124
constant="5", # type: ignore[call-overload] # pyright: ignore[reportCallIssue, reportArgumentType]
11251125
)
1126+
1127+
1128+
def test_frame_groupby_aggregate() -> None:
1129+
"""Test DataFrame.groupby.aggregate (GH1339)."""
1130+
df = DataFrame(
1131+
{
1132+
"a": [1, 2, 3],
1133+
"b": [4, 5, 6],
1134+
"c": [7, 8, 9],
1135+
}
1136+
)
1137+
1138+
dico = {"a": ("a", "mean")}
1139+
1140+
check(assert_type(df.groupby("b").agg(a=("a", "mean")), DataFrame), DataFrame)
1141+
check(assert_type(df.groupby("b").agg(**dico), DataFrame), DataFrame)

tests/test_styler.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from pandas._typing import Scalar
2323

2424
from tests import (
25+
PD_LTE_23,
2526
check,
2627
ensure_clean,
2728
)
@@ -141,7 +142,9 @@ def test_highlight_quantile() -> None:
141142

142143

143144
def test_loader() -> None:
144-
check(assert_type(DF.style.loader, PackageLoader), PackageLoader)
145+
if PD_LTE_23:
146+
# see GH62123 for pandas main repo, type changes in pandas 3.0
147+
check(assert_type(DF.style.loader, PackageLoader), PackageLoader)
145148

146149

147150
def test_pipe() -> None:

0 commit comments

Comments
 (0)