Skip to content

Commit 38b46dc

Browse files
committed
floordiv
1 parent d291f96 commit 38b46dc

File tree

9 files changed

+242
-153
lines changed

9 files changed

+242
-153
lines changed

pandas-stubs/core/indexes/timedeltas.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ class TimedeltaIndex(
133133
def __floordiv__( # pyright: ignore[reportIncompatibleMethodOverride]
134134
self, other: _DT_FACTOR_SEQ | Self
135135
) -> Index[int]: ...
136-
@overload # type: ignore[override]
136+
@overload
137137
def __rfloordiv__( # pyrefly: ignore[bad-override]
138138
self,
139139
other: (

pandas-stubs/core/series.pyi

Lines changed: 65 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2143,28 +2143,34 @@ class Series(IndexOpsMixin[S1], ElementOpsMixin[S1], NDFrame):
21432143
) -> Series[_str]: ...
21442144
# ignore needed for mypy as we want different results based on the arguments
21452145
@overload # type: ignore[override]
2146-
# pyrefly: ignore # bad-override
2147-
def __and__( # pyright: ignore[reportOverlappingOverload]
2146+
def __and__( # pyright: ignore[reportOverlappingOverload] # pyrefly: ignore[bad-override]
21482147
self, other: bool | list[int] | MaskType
21492148
) -> Series[bool]: ...
21502149
@overload
21512150
def __and__(self, other: int | np_ndarray_anyint | Series[int]) -> Series[int]: ...
21522151
def __eq__(self, other: object) -> Series[_bool]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride]
21532152
@overload
2154-
def __floordiv__(
2153+
def __floordiv__( # type: ignore[overload-overlap]
21552154
self: Series[Never],
21562155
other: (
21572156
float
21582157
| Sequence[float]
21592158
| np_ndarray_bool
21602159
| np_ndarray_anyint
21612160
| np_ndarray_float
2162-
| Index
2163-
| Series
2161+
| Index[bool]
2162+
| Index[int]
2163+
| Index[float]
2164+
| Series[bool]
2165+
| Series[int]
2166+
| Series[float]
21642167
),
21652168
) -> Series: ...
21662169
@overload
2167-
def __floordiv__(self, other: Index[Never] | Series[Never]) -> Series: ...
2170+
def __floordiv__(
2171+
self: Series[bool] | Series[int] | Series[float] | Series[Timedelta],
2172+
other: Index[Never] | Series[Never],
2173+
) -> Series: ...
21682174
@overload
21692175
def __floordiv__(
21702176
self: Series[int] | Series[float],
@@ -2230,7 +2236,27 @@ class Series(IndexOpsMixin[S1], ElementOpsMixin[S1], NDFrame):
22302236
) -> Series[int]: ...
22312237
@overload
22322238
def floordiv(
2233-
self,
2239+
self: Series[Never],
2240+
other: (
2241+
float
2242+
| Sequence[float]
2243+
| np_ndarray_bool
2244+
| np_ndarray_anyint
2245+
| np_ndarray_float
2246+
| Index[bool]
2247+
| Index[int]
2248+
| Index[float]
2249+
| Series[bool]
2250+
| Series[int]
2251+
| Series[float]
2252+
),
2253+
level: Level | None = ...,
2254+
fill_value: float | None = None,
2255+
axis: AxisIndex | None = 0,
2256+
) -> Series: ...
2257+
@overload
2258+
def floordiv(
2259+
self: Series[bool] | Series[int] | Series[float] | Series[Timedelta],
22342260
other: Index[Never] | Series[Never],
22352261
level: Level | None = ...,
22362262
fill_value: float | None = None,
@@ -2313,20 +2339,27 @@ class Series(IndexOpsMixin[S1], ElementOpsMixin[S1], NDFrame):
23132339
axis: AxisIndex | None = 0,
23142340
) -> Series[int]: ...
23152341
@overload
2316-
def __rfloordiv__(
2342+
def __rfloordiv__( # type: ignore[overload-overlap]
23172343
self: Series[Never],
23182344
other: (
23192345
float
23202346
| Sequence[float]
23212347
| np_ndarray_bool
23222348
| np_ndarray_anyint
23232349
| np_ndarray_float
2324-
| Index
2325-
| Series
2350+
| Index[bool]
2351+
| Index[int]
2352+
| Index[float]
2353+
| Series[bool]
2354+
| Series[int]
2355+
| Series[float]
23262356
),
23272357
) -> Series: ...
23282358
@overload
2329-
def __rfloordiv__(self, other: Index[Never] | Series[Never]) -> Series: ...
2359+
def __rfloordiv__(
2360+
self: Series[bool] | Series[int] | Series[float] | Series[Timedelta],
2361+
other: Index[Never] | Series[Never],
2362+
) -> Series: ...
23302363
@overload
23312364
def __rfloordiv__(
23322365
self: Series[int] | Series[float],
@@ -2388,7 +2421,27 @@ class Series(IndexOpsMixin[S1], ElementOpsMixin[S1], NDFrame):
23882421
) -> Series[int]: ...
23892422
@overload
23902423
def rfloordiv(
2391-
self,
2424+
self: Series[Never],
2425+
other: (
2426+
float
2427+
| Sequence[float]
2428+
| np_ndarray_bool
2429+
| np_ndarray_anyint
2430+
| np_ndarray_float
2431+
| Index[bool]
2432+
| Index[int]
2433+
| Index[float]
2434+
| Series[bool]
2435+
| Series[int]
2436+
| Series[float]
2437+
),
2438+
level: Level | None = ...,
2439+
fill_value: float | None = None,
2440+
axis: AxisIndex | None = 0,
2441+
) -> Series: ...
2442+
@overload
2443+
def rfloordiv(
2444+
self: Series[bool] | Series[int] | Series[float] | Series[Timedelta],
23922445
other: Index[Never] | Series[Never],
23932446
level: Level | None = ...,
23942447
fill_value: float | None = None,

tests/indexes/arithmetic/test_floordiv.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ def test_floordiv_numpy_array(left_i: pd.Index) -> None:
9898
if TYPE_CHECKING_INVALID_USAGE:
9999
assert_type(c // left_i, Any)
100100
assert_type(s // left_i, Any)
101-
assert_type(d // left_i, "np.typing.NDArray[np.int64]")
101+
assert_type(d // left_i, Any) # pyright: ignore[reportAssertTypeFailure]
102102

103103

104104
def test_floordiv_pd_index(left_i: pd.Index) -> None:

tests/indexes/test_indexes.py

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -264,17 +264,6 @@ def test_types_to_numpy() -> None:
264264
)
265265

266266

267-
def test_index_arithmetic() -> None:
268-
# GH 287
269-
idx = pd.Index([1, 2.2, 3], dtype=float)
270-
check(assert_type(idx * 3, "pd.Index[float]"), pd.Index, np.float64)
271-
check(assert_type(idx / 3, "pd.Index[float]"), pd.Index, np.float64)
272-
check(assert_type(idx // 3, "pd.Index[float]"), pd.Index, np.float64)
273-
check(assert_type(3 * idx, "pd.Index[float]"), pd.Index, np.float64)
274-
check(assert_type(3 / idx, "pd.Index[float]"), pd.Index, np.float64)
275-
check(assert_type(3 // idx, "pd.Index[float]"), pd.Index, np.float64)
276-
277-
278267
def test_range_index_union() -> None:
279268
check(
280269
assert_type(
@@ -845,9 +834,6 @@ def test_index_operators() -> None:
845834
i1 = pd.Index([1, 2, 3])
846835
i2 = pd.Index([4, 5, 6])
847836

848-
check(assert_type(i1 // i2, "pd.Index[int]"), pd.Index)
849-
check(assert_type(i1 // 10, "pd.Index[int]"), pd.Index)
850-
check(assert_type(10 // i1, "pd.Index[int]"), pd.Index)
851837
check(assert_type(i1**i2, "pd.Index[int]"), pd.Index)
852838
check(assert_type(i1**2, "pd.Index[int]"), pd.Index)
853839
check(assert_type(2**i1, "pd.Index[int]"), pd.Index)
@@ -1196,31 +1182,6 @@ def test_new() -> None:
11961182
)
11971183

11981184

1199-
def test_timedelta_div() -> None:
1200-
index = pd.Index([pd.Timedelta(days=1)], dtype="timedelta64[s]")
1201-
delta = dt.timedelta(1)
1202-
1203-
check(assert_type(index / delta, "pd.Index[float]"), pd.Index, float)
1204-
check(assert_type(index / [delta], "pd.Index[float]"), pd.Index, float)
1205-
check(assert_type(index / 1, pd.TimedeltaIndex), pd.TimedeltaIndex, pd.Timedelta)
1206-
check(assert_type(index / [1], pd.TimedeltaIndex), pd.TimedeltaIndex, pd.Timedelta)
1207-
check(assert_type(index // delta, "pd.Index[int]"), pd.Index, np.longlong)
1208-
check(assert_type(index // [delta], "pd.Index[int]"), pd.Index, int)
1209-
check(assert_type(index // 1, pd.TimedeltaIndex), pd.TimedeltaIndex, pd.Timedelta)
1210-
check(assert_type(index // [1], pd.TimedeltaIndex), pd.TimedeltaIndex, pd.Timedelta)
1211-
1212-
check(assert_type(delta / index, "pd.Index[float]"), pd.Index, float)
1213-
check(assert_type([delta] / index, "pd.Index[float]"), pd.Index, float)
1214-
check(assert_type(delta // index, "pd.Index[int]"), pd.Index, np.longlong)
1215-
check(assert_type([delta] // index, "pd.Index[int]"), pd.Index, np.signedinteger)
1216-
1217-
if TYPE_CHECKING_INVALID_USAGE:
1218-
_0 = 1 / index # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
1219-
_1 = [1] / index # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
1220-
_2 = 1 // index # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
1221-
_3 = [1] // index # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
1222-
1223-
12241185
def test_datetime_operators_builtin() -> None:
12251186
time = pd.date_range("2022-01-01", "2022-01-31", freq="D")
12261187
check(assert_type(time + dt.timedelta(0), pd.DatetimeIndex), pd.DatetimeIndex)

tests/scalars/test_scalars.py

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -653,21 +653,13 @@ def test_timedelta_add_sub() -> None:
653653
def test_timedelta_mul_div() -> None:
654654
td = pd.Timedelta("1 day")
655655

656-
i_idx = pd.Index([1, 2, 3], dtype=int)
657-
f_idx = pd.Index([1.2, 2.2, 3.4], dtype=float)
658-
659656
np_intp_arr: npt.NDArray[np.integer] = np.array([1, 2, 3])
660657
np_float_arr: npt.NDArray[np.floating] = np.array([1.2, 2.2, 3.4])
661658

662659
md_int = 3
663660
md_float = 3.5
664661
md_ndarray_intp = np_intp_arr
665662
md_ndarray_float = np_float_arr
666-
mp_series_int = pd.Series([1, 2, 3], dtype=int)
667-
md_series_float = pd.Series([1.2, 2.2, 3.4], dtype=float)
668-
md_int64_index = i_idx
669-
md_float_index = f_idx
670-
md_timedelta_series = pd.Series(pd.timedelta_range("1 day", periods=3))
671663

672664
check(assert_type(td * md_int, pd.Timedelta), pd.Timedelta)
673665
check(assert_type(td * md_float, pd.Timedelta), pd.Timedelta)
@@ -709,23 +701,6 @@ def test_timedelta_mul_div() -> None:
709701
np.ndarray,
710702
np.timedelta64,
711703
)
712-
check(
713-
assert_type(td // mp_series_int, "pd.Series[pd.Timedelta]"),
714-
pd.Series,
715-
pd.Timedelta,
716-
)
717-
check(
718-
assert_type(td // md_series_float, "pd.Series[pd.Timedelta]"),
719-
pd.Series,
720-
pd.Timedelta,
721-
)
722-
check(assert_type(td // md_int64_index, pd.TimedeltaIndex), pd.TimedeltaIndex)
723-
check(assert_type(td // md_float_index, pd.TimedeltaIndex), pd.TimedeltaIndex)
724-
check(
725-
assert_type(td // md_timedelta_series, "pd.Series[int]"),
726-
pd.Series,
727-
np.longlong,
728-
)
729704

730705
check(assert_type(pd.NaT // td, float), float)
731706
# Note: None of the reverse floordiv work
@@ -736,10 +711,6 @@ def test_timedelta_mul_div() -> None:
736711
_01 = md_float // td # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
737712
_02 = md_ndarray_intp // td # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
738713
_03 = md_ndarray_float // td # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
739-
_04 = mp_series_int // td # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
740-
_05 = md_series_float // td # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
741-
_06 = md_int64_index // td # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
742-
_07 = md_float_index // td # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
743714

744715
check(assert_type(td / td, float), float)
745716
check(assert_type(td / pd.NaT, float), float)

tests/series/arithmetic/float/test_truediv.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ def test_truediv_py_sequence(left: "pd.Series[float]") -> None:
114114
check(assert_type(c / left, "pd.Series[complex]"), pd.Series, np.complexfloating)
115115
if TYPE_CHECKING_INVALID_USAGE:
116116
_14 = s / left # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
117-
check(assert_type(d / left, "pd.Series[pd.Timedelta]"), pd.Series, pd.Timedelta)
117+
check(assert_type(d / left, "pd.Series[pd.Timedelta]"), pd.Series, timedelta)
118118

119119
check(assert_type(left.truediv(b), "pd.Series[float]"), pd.Series, np.floating)
120120
check(assert_type(left.truediv(i), "pd.Series[float]"), pd.Series, np.floating)

0 commit comments

Comments
 (0)