Skip to content

Commit 34da99d

Browse files
committed
Merge remote-tracking branch 'upstream/main' into natype-arithemtic
2 parents 7213016 + 2106e8b commit 34da99d

File tree

9 files changed

+135
-67
lines changed

9 files changed

+135
-67
lines changed

pandas-stubs/core/frame.pyi

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1760,7 +1760,9 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack):
17601760
@property
17611761
def index(self) -> Index: ...
17621762
@index.setter
1763-
def index(self, idx: Index) -> None: ...
1763+
def index(
1764+
self, idx: AnyArrayLike | SequenceNotStr[Hashable] | tuple[Hashable, ...]
1765+
) -> None: ...
17641766
@property
17651767
def loc(self) -> _LocIndexerFrame[Self]: ...
17661768
@property

pandas-stubs/core/series.pyi

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,13 @@ from typing import (
2626
Generic,
2727
Literal,
2828
NoReturn,
29+
Protocol,
2930
final,
3031
overload,
3132
type_check_only,
3233
)
3334

35+
from _typeshed import SupportsGetItem
3436
from matplotlib.axes import (
3537
Axes as PlotAxes,
3638
SubplotBase,
@@ -187,6 +189,7 @@ from pandas._typing import (
187189
ValueKeyFunc,
188190
VoidDtypeArg,
189191
WriteBuffer,
192+
_T_co,
190193
np_1darray,
191194
np_ndarray_anyint,
192195
np_ndarray_bool,
@@ -203,6 +206,10 @@ from pandas.core.dtypes.dtypes import CategoricalDtype
203206

204207
from pandas.plotting import PlotAccessor
205208

209+
@type_check_only
210+
class _SupportsAdd(Protocol[_T_co]):
211+
def __add__(self, value: Self, /) -> _T_co: ...
212+
206213
class _iLocIndexerSeries(_iLocIndexer, Generic[S1]):
207214
# get item
208215
@overload
@@ -500,7 +507,9 @@ class Series(IndexOpsMixin[S1], NDFrame):
500507
@property
501508
def index(self) -> Index: ...
502509
@index.setter
503-
def index(self, idx: Index) -> None: ...
510+
def index(
511+
self, idx: AnyArrayLike | SequenceNotStr[Hashable] | tuple[Hashable, ...]
512+
) -> None: ...
504513
@overload
505514
def reset_index(
506515
self,
@@ -3751,34 +3760,14 @@ class Series(IndexOpsMixin[S1], NDFrame):
37513760
numeric_only: _bool = False,
37523761
**kwargs: Any,
37533762
) -> float: ...
3754-
@overload
3755-
def sum(
3756-
self: Series[Never],
3757-
axis: AxisIndex | None = 0,
3758-
skipna: _bool | None = ...,
3759-
numeric_only: _bool = ...,
3760-
min_count: int = ...,
3761-
**kwargs: Any,
3762-
) -> Any: ...
3763-
# between `Series[bool]` and `Series[int]`.
3764-
@overload
37653763
def sum(
3766-
self: Series[bool],
3764+
self: SupportsGetItem[Scalar, _SupportsAdd[_T]],
37673765
axis: AxisIndex | None = 0,
37683766
skipna: _bool | None = ...,
37693767
numeric_only: _bool = ...,
37703768
min_count: int = ...,
37713769
**kwargs: Any,
3772-
) -> int: ...
3773-
@overload
3774-
def sum(
3775-
self: Series[S1],
3776-
axis: AxisIndex | None = 0,
3777-
skipna: _bool | None = ...,
3778-
numeric_only: _bool = ...,
3779-
min_count: int = ...,
3780-
**kwargs: Any,
3781-
) -> S1: ...
3770+
) -> _T: ...
37823771
def to_list(self) -> list[S1]: ...
37833772
def tolist(self) -> list[S1]: ...
37843773
def var(

scripts/test/run.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,6 @@ def nightly_pandas():
9494
"pip",
9595
"install",
9696
"--pre",
97-
"--use-deprecated=legacy-resolver",
9897
"--upgrade",
9998
"--extra-index-url",
10099
"https://pypi.anaconda.org/scientific-python-nightly-wheels/simple",

tests/series/test_series.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3982,3 +3982,12 @@ def test_series_explode() -> None:
39823982

39833983
check(assert_type(s.explode(), pd.Series), pd.Series)
39843984
check(assert_type(s.explode(ignore_index=True), pd.Series), pd.Series)
3985+
3986+
3987+
def test_series_index_setter() -> None:
3988+
"""Test Series.index setter property GH1366."""
3989+
sr = pd.Series(["a", "b"])
3990+
3991+
check(assert_type(sr.index, pd.Index), pd.Index)
3992+
sr.index = [2, 3]
3993+
check(assert_type(sr.index, pd.Index), pd.Index)

tests/test_dtypes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ def test_categorical_dtype() -> None:
113113
pd.CategoricalDtype,
114114
)
115115
check(assert_type(cdt.categories, pd.Index), pd.Index)
116-
assert check(assert_type(cdt.ordered, Optional[bool]), bool)
116+
check(assert_type(cdt.ordered, Optional[bool]), bool)
117117

118118

119119
def test_sparse_dtype() -> None:

tests/test_frame.py

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ def test_types_drop() -> None:
463463
check(assert_type(df.drop(index=[0]), pd.DataFrame), pd.DataFrame)
464464
check(assert_type(df.drop(index=1), pd.DataFrame), pd.DataFrame)
465465
check(assert_type(df.drop(labels=0), pd.DataFrame), pd.DataFrame)
466-
assert assert_type(df.drop([0, 0], inplace=True), None) is None
466+
check(assert_type(df.drop([0, 0], inplace=True), None), type(None))
467467
to_drop: list[str] = ["col1"]
468468
check(assert_type(df.drop(columns=to_drop), pd.DataFrame), pd.DataFrame)
469469
# GH 302
@@ -2968,8 +2968,8 @@ def test_types_ffill() -> None:
29682968
assert_type(df.ffill(inplace=False, limit_area="inside"), pd.DataFrame),
29692969
pd.DataFrame,
29702970
)
2971-
assert assert_type(df.ffill(inplace=True), None) is None
2972-
assert assert_type(df.ffill(inplace=True, limit_area="outside"), None) is None
2971+
check(assert_type(df.ffill(inplace=True), None), type(None))
2972+
check(assert_type(df.ffill(inplace=True, limit_area="outside"), None), type(None))
29732973

29742974

29752975
def test_types_bfill() -> None:
@@ -2981,16 +2981,16 @@ def test_types_bfill() -> None:
29812981
assert_type(df.bfill(inplace=False, limit_area="inside"), pd.DataFrame),
29822982
pd.DataFrame,
29832983
)
2984-
assert assert_type(df.bfill(inplace=True), None) is None
2985-
assert assert_type(df.bfill(inplace=True, limit_area="outside"), None) is None
2984+
check(assert_type(df.bfill(inplace=True), None), type(None))
2985+
check(assert_type(df.bfill(inplace=True, limit_area="outside"), None), type(None))
29862986

29872987

29882988
def test_types_replace() -> None:
29892989
# GH 44
29902990
df = pd.DataFrame([[1, 2, 3]])
29912991
check(assert_type(df.replace(1, 2), pd.DataFrame), pd.DataFrame)
29922992
check(assert_type(df.replace(1, 2, inplace=False), pd.DataFrame), pd.DataFrame)
2993-
assert assert_type(df.replace(1, 2, inplace=True), None) is None
2993+
check(assert_type(df.replace(1, 2, inplace=True), None), type(None))
29942994

29952995

29962996
def test_dataframe_replace() -> None:
@@ -3286,12 +3286,12 @@ def test_frame_ndarray_assignmment() -> None:
32863286

32873287
def test_not_hashable() -> None:
32883288
# GH 113
3289-
assert assert_type(pd.DataFrame.__hash__, None) is None
3290-
assert assert_type(pd.DataFrame().__hash__, None) is None
3291-
assert assert_type(pd.Series.__hash__, None) is None
3292-
assert assert_type(pd.Series([], dtype=object).__hash__, None) is None
3293-
assert assert_type(pd.Index.__hash__, None) is None
3294-
assert assert_type(pd.Index([]).__hash__, None) is None
3289+
check(assert_type(pd.DataFrame.__hash__, None), type(None))
3290+
check(assert_type(pd.DataFrame().__hash__, None), type(None))
3291+
check(assert_type(pd.Series.__hash__, None), type(None))
3292+
check(assert_type(pd.Series([], dtype=object).__hash__, None), type(None))
3293+
check(assert_type(pd.Index.__hash__, None), type(None))
3294+
check(assert_type(pd.Index([]).__hash__, None), type(None))
32953295

32963296
def test_func(_: Hashable):
32973297
pass
@@ -4171,9 +4171,11 @@ def test_insert_newvalues() -> None:
41714171
df = pd.DataFrame({"a": [1, 2]})
41724172
ab = pd.DataFrame({"col1": [1, 2], "col2": [3, 4]})
41734173
ef = pd.DataFrame({"z": [4, 5, 6]})
4174-
assert assert_type(df.insert(loc=0, column="b", value=None), None) is None
4175-
assert assert_type(ab.insert(loc=0, column="newcol", value=[99, 99]), None) is None
4176-
assert assert_type(ef.insert(loc=0, column="g", value=4), None) is None
4174+
check(assert_type(df.insert(loc=0, column="b", value=None), None), type(None))
4175+
check(
4176+
assert_type(ab.insert(loc=0, column="newcol", value=[99, 99]), None), type(None)
4177+
)
4178+
check(assert_type(ef.insert(loc=0, column="g", value=4), None), type(None))
41774179

41784180

41794181
def test_astype() -> None:
@@ -4650,7 +4652,7 @@ def test_unstack() -> None:
46504652
df_flt = pd.DataFrame(
46514653
[
46524654
["a", "b", 1],
4653-
["a", "a", 12],
4655+
["a", "a", 12.2],
46544656
["b", "b", 14],
46554657
]
46564658
).set_index([0, 1])
@@ -4813,3 +4815,12 @@ def test_from_records() -> None:
48134815
),
48144816
pd.DataFrame,
48154817
)
4818+
4819+
4820+
def test_frame_index_setter() -> None:
4821+
"""Test DataFrame.index setter property GH1366."""
4822+
df = pd.DataFrame(data={"col1": [1, 2], "col2": [3, 4]})
4823+
4824+
check(assert_type(df.index, pd.Index), pd.Index)
4825+
df.index = [2, 3]
4826+
check(assert_type(df.index, pd.Index), pd.Index)

tests/test_testing.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from typing_extensions import assert_type
1111

1212
from tests import (
13+
PD_LTE_23,
1314
TYPE_CHECKING_INVALID_USAGE,
1415
check,
1516
ensure_clean,
@@ -20,14 +21,23 @@ def test_types_assert_series_equal() -> None:
2021
s1 = pd.Series([0, 1, 1, 0])
2122
s2 = pd.Series([0, 1, 1, 0])
2223
assert_series_equal(left=s1, right=s2)
23-
assert_series_equal(
24-
s1,
25-
s2,
26-
check_freq=False,
27-
check_categorical=True,
28-
check_flags=True,
29-
check_datetimelike_compat=True,
30-
)
24+
if PD_LTE_23:
25+
assert_series_equal(
26+
s1,
27+
s2,
28+
check_freq=False,
29+
check_categorical=True,
30+
check_flags=True,
31+
check_datetimelike_compat=True,
32+
)
33+
else:
34+
assert_series_equal(
35+
s1,
36+
s2,
37+
check_freq=False,
38+
check_categorical=True,
39+
check_flags=True,
40+
)
3141
if TYPE_CHECKING_INVALID_USAGE:
3242
assert_series_equal( # type: ignore[call-overload] # pyright: ignore[reportCallIssue]
3343
s1,

tests/test_timefuncs.py

Lines changed: 62 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ def test_timedelta_series_string() -> None:
190190

191191
def test_timestamp_timedelta_series_arithmetic() -> None:
192192
ts1 = pd.to_datetime(pd.Series(["2022-03-05", "2022-03-06"]))
193-
assert isinstance(ts1.iloc[0], pd.Timestamp)
193+
check(assert_type(ts1.iloc[0], pd.Timestamp), pd.Timestamp)
194194
td1 = pd.to_timedelta([2, 3], "seconds")
195195
ts2 = pd.to_datetime(pd.Series(["2022-03-08", "2022-03-10"]))
196196
r1 = ts1 - ts2
@@ -203,8 +203,12 @@ def test_timestamp_timedelta_series_arithmetic() -> None:
203203
check(assert_type(r4, "pd.Series[float]"), pd.Series, float)
204204
sb = pd.Series([1, 2]) == pd.Series([1, 3])
205205
check(assert_type(sb, "pd.Series[bool]"), pd.Series, np.bool_)
206-
r5 = sb * r1
207-
check(assert_type(r5, "TimedeltaSeries"), pd.Series, pd.Timedelta)
206+
207+
# https://github.com/pandas-dev/pandas/issues/62316
208+
if PD_LTE_23:
209+
r5 = sb * r1
210+
check(assert_type(r5, "TimedeltaSeries"), pd.Series, pd.Timedelta)
211+
208212
r6 = r1 * 4
209213
check(assert_type(r6, "TimedeltaSeries"), pd.Series, pd.Timedelta)
210214

@@ -324,7 +328,7 @@ def test_timedelta_series_sum() -> None:
324328
def test_iso_calendar() -> None:
325329
# GH 31
326330
dates = pd.date_range(start="2012-01-01", end="2019-12-31", freq="W-MON")
327-
dates.isocalendar()
331+
check(assert_type(dates.isocalendar(), pd.DataFrame), pd.DataFrame)
328332

329333

330334
def test_fail_on_adding_two_timestamps() -> None:
@@ -339,7 +343,7 @@ def test_fail_on_adding_two_timestamps() -> None:
339343
def test_dtindex_tzinfo() -> None:
340344
# GH 71
341345
dti = pd.date_range("2000-1-1", periods=10)
342-
assert assert_type(dti.tzinfo, Optional[dt.tzinfo]) is None
346+
check(assert_type(dti.tzinfo, Optional[dt.tzinfo]), type(None))
343347

344348

345349
def test_todatetime_fromnumpy() -> None:
@@ -418,7 +422,7 @@ def test_series_dt_accessors() -> None:
418422
check(assert_type(s0.dt.is_leap_year, "pd.Series[bool]"), pd.Series, np.bool_)
419423
check(assert_type(s0.dt.daysinmonth, "pd.Series[int]"), pd.Series, np.integer)
420424
check(assert_type(s0.dt.days_in_month, "pd.Series[int]"), pd.Series, np.integer)
421-
assert assert_type(s0.dt.tz, Optional[dt.tzinfo]) is None
425+
check(assert_type(s0.dt.tz, Optional[dt.tzinfo]), type(None))
422426
check(assert_type(s0.dt.freq, Optional[str]), str)
423427
check(assert_type(s0.dt.isocalendar(), pd.DataFrame), pd.DataFrame)
424428
check(assert_type(s0.dt.to_period("D"), "PeriodSeries"), pd.Series, pd.Period)
@@ -1203,19 +1207,61 @@ def test_to_timedelta_index() -> None:
12031207

12041208

12051209
def test_bdate_range_holidays() -> None:
1206-
pd.bdate_range("2000-1-1", "2001-1-1", freq="C", holidays=["2000-12-15"])
1207-
pd.bdate_range("2000-1-1", "2001-1-1", freq="C", holidays=[dt.date(2000, 12, 15)])
1208-
pd.bdate_range(
1209-
"2000-1-1", "2001-1-1", freq="C", holidays=[pd.Timestamp(2000, 12, 15)]
1210+
check(
1211+
assert_type(
1212+
pd.bdate_range("2000-1-1", "2001-1-1", freq="C", holidays=["2000-12-15"]),
1213+
pd.DatetimeIndex,
1214+
),
1215+
pd.DatetimeIndex,
1216+
)
1217+
check(
1218+
assert_type(
1219+
pd.bdate_range(
1220+
"2000-1-1", "2001-1-1", freq="C", holidays=[dt.date(2000, 12, 15)]
1221+
),
1222+
pd.DatetimeIndex,
1223+
),
1224+
pd.DatetimeIndex,
1225+
)
1226+
check(
1227+
assert_type(
1228+
pd.bdate_range(
1229+
"2000-1-1", "2001-1-1", freq="C", holidays=[pd.Timestamp(2000, 12, 15)]
1230+
),
1231+
pd.DatetimeIndex,
1232+
),
1233+
pd.DatetimeIndex,
12101234
)
1211-
pd.bdate_range(
1212-
"2000-1-1", "2001-1-1", freq="C", holidays=[np.datetime64("2000-12-15")]
1235+
check(
1236+
assert_type(
1237+
pd.bdate_range(
1238+
"2000-1-1", "2001-1-1", freq="C", holidays=[np.datetime64("2000-12-15")]
1239+
),
1240+
pd.DatetimeIndex,
1241+
),
1242+
pd.DatetimeIndex,
12131243
)
1214-
pd.bdate_range(
1215-
"2000-1-1", "2001-1-1", freq="C", holidays=[dt.datetime(2000, 12, 15)]
1244+
check(
1245+
assert_type(
1246+
pd.bdate_range(
1247+
"2000-1-1", "2001-1-1", freq="C", holidays=[dt.datetime(2000, 12, 15)]
1248+
),
1249+
pd.DatetimeIndex,
1250+
),
1251+
pd.DatetimeIndex,
12161252
)
1217-
pd.bdate_range(
1218-
"2000-1-1", "2001-1-1", freq="C", holidays=[dt.date(2000, 12, 15)], name=("a",)
1253+
check(
1254+
assert_type(
1255+
pd.bdate_range(
1256+
"2000-1-1",
1257+
"2001-1-1",
1258+
freq="C",
1259+
holidays=[dt.date(2000, 12, 15)],
1260+
name=("a",),
1261+
),
1262+
pd.DatetimeIndex,
1263+
),
1264+
pd.DatetimeIndex,
12191265
)
12201266

12211267

tests/test_windowing.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
)
1515
from typing_extensions import assert_type
1616

17+
from pandas._libs.tslibs.offsets import DateOffset
18+
1719
from tests import (
1820
PD_LTE_23,
1921
check,
@@ -56,7 +58,7 @@ def test_rolling_basic_math() -> None:
5658

5759
def test_rolling_datetime_index() -> None:
5860
offset_1d = to_offset("1D")
59-
assert offset_1d is not None
61+
check(assert_type(offset_1d, DateOffset), DateOffset)
6062

6163
check(assert_type(DF_DTI.rolling("1D"), "Rolling[DataFrame]"), Rolling, DataFrame)
6264
check(

0 commit comments

Comments
 (0)