Skip to content

Commit acada37

Browse files
committed
feat(arithmetic): multiplication
1 parent 0042dfd commit acada37

File tree

23 files changed

+846
-493
lines changed

23 files changed

+846
-493
lines changed

pandas-stubs/_libs/tslibs/period.pyi

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import datetime
22
from typing import (
33
Literal,
4+
Self,
45
overload,
56
)
67

@@ -87,15 +88,23 @@ class Period(PeriodMixin):
8788
@overload
8889
def __sub__(self, other: TimedeltaIndex) -> PeriodIndex: ...
8990
@overload
90-
def __add__(self, other: _PeriodAddSub) -> Period: ...
91+
def __add__(self, other: _PeriodAddSub) -> Self: ...
9192
@overload
9293
def __add__(self, other: NaTType) -> NaTType: ...
9394
@overload
9495
def __add__(self, other: Index) -> PeriodIndex: ...
96+
# Ignored due to indecipherable error from mypy:
97+
# Forward operator "__add__" is not callable [misc]
9598
@overload
96-
def __add__(
97-
self, other: Series[BaseOffset] | Series[Timedelta]
98-
) -> Series[Period]: ... # pyrefly: ignore[bad-specialization]
99+
def __radd__(self, other: _PeriodAddSub) -> Self: ... # type: ignore[misc]
100+
@overload
101+
def __radd__(self, other: NaTType) -> NaTType: ...
102+
# Real signature is -> PeriodIndex, but conflicts with Index.__add__
103+
# Changing Index is very hard due to Index inheritance
104+
# Signatures of "__radd__" of "Period" and "__add__" of "Index"
105+
# are unsafely overlapping
106+
@overload
107+
def __radd__(self, other: Index) -> PeriodIndex: ...
99108
# ignore[misc] here because we know all other comparisons
100109
# are False, so we use Literal[False]
101110
@overload
@@ -168,18 +177,6 @@ class Period(PeriodMixin):
168177
def __ne__(self, other: np_ndarray[ShapeT, np.object_]) -> np_ndarray[ShapeT, np.bool]: ... # type: ignore[overload-overlap]
169178
@overload
170179
def __ne__(self, other: object) -> Literal[True]: ...
171-
# Ignored due to indecipherable error from mypy:
172-
# Forward operator "__add__" is not callable [misc]
173-
@overload
174-
def __radd__(self, other: _PeriodAddSub) -> Period: ... # type: ignore[misc]
175-
# Real signature is -> PeriodIndex, but conflicts with Index.__add__
176-
# Changing Index is very hard due to Index inheritance
177-
# Signatures of "__radd__" of "Period" and "__add__" of "Index"
178-
# are unsafely overlapping
179-
@overload
180-
def __radd__(self, other: Index) -> Index: ...
181-
@overload
182-
def __radd__(self, other: NaTType) -> NaTType: ...
183180
@property
184181
def day(self) -> int: ...
185182
@property

pandas-stubs/_libs/tslibs/timedeltas.pyi

Lines changed: 27 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
# pyright: strict
2-
import datetime as dt
3-
from datetime import timedelta
2+
from datetime import (
3+
date,
4+
datetime,
5+
timedelta,
6+
)
47
from typing import (
58
ClassVar,
69
Literal,
@@ -135,17 +138,17 @@ class Timedelta(timedelta):
135138
def ceil(self, freq: str | BaseOffset) -> Self: ...
136139
@property
137140
def resolution_string(self) -> str: ...
138-
# Override due to more types supported than dt.timedelta
141+
# Override due to more types supported than timedelta
139142
@overload # type: ignore[override]
140-
def __add__(self, other: dt.datetime | np.datetime64) -> Timestamp: ...
143+
def __add__(self, other: datetime | np.datetime64) -> Timestamp: ...
141144
@overload
142145
def __add__(self, other: timedelta | np.timedelta64) -> Self: ...
143146
@overload
144147
def __add__(self, other: NaTType) -> NaTType: ...
145148
@overload
146149
def __add__(self, other: Period) -> Period: ...
147150
@overload
148-
def __add__(self, other: dt.date) -> dt.date: ...
151+
def __add__(self, other: date) -> date: ...
149152
@overload
150153
def __add__(
151154
self, other: np_ndarray[ShapeT, np.timedelta64]
@@ -155,13 +158,13 @@ class Timedelta(timedelta):
155158
self, other: np_ndarray[ShapeT, np.datetime64]
156159
) -> np_ndarray[ShapeT, np.datetime64]: ...
157160
@overload
158-
def __radd__(self, other: dt.datetime | np.datetime64) -> Timestamp: ... # type: ignore[misc]
161+
def __radd__(self, other: datetime | np.datetime64) -> Timestamp: ... # type: ignore[misc]
159162
@overload
160163
def __radd__(self, other: timedelta | np.timedelta64) -> Self: ...
161164
@overload
162165
def __radd__(self, other: NaTType) -> NaTType: ...
163166
@overload
164-
def __radd__(self, other: dt.date) -> dt.date: ...
167+
def __radd__(self, other: date) -> date: ...
165168
@overload
166169
def __radd__(
167170
self, other: np_ndarray[ShapeT, np.timedelta64]
@@ -170,7 +173,7 @@ class Timedelta(timedelta):
170173
def __radd__(
171174
self, other: np_ndarray[ShapeT, np.datetime64]
172175
) -> np_ndarray[ShapeT, np.datetime64]: ...
173-
# Override due to more types supported than dt.timedelta
176+
# Override due to more types supported than timedelta
174177
@overload # type: ignore[override]
175178
def __sub__(self, other: timedelta | Timedelta | np.timedelta64) -> Timedelta: ...
176179
@overload
@@ -186,7 +189,7 @@ class Timedelta(timedelta):
186189
@overload
187190
def __rsub__(self, other: timedelta | Timedelta | np.timedelta64) -> Timedelta: ...
188191
@overload
189-
def __rsub__(self, other: dt.datetime | Timestamp | np.datetime64) -> Timestamp: ... # type: ignore[misc]
192+
def __rsub__(self, other: datetime | Timestamp | np.datetime64) -> Timestamp: ... # type: ignore[misc]
190193
@overload
191194
def __rsub__(self, other: NaTType) -> NaTType: ...
192195
@overload
@@ -208,41 +211,28 @@ class Timedelta(timedelta):
208211
def __neg__(self) -> Timedelta: ...
209212
def __pos__(self) -> Timedelta: ...
210213
def __abs__(self) -> Timedelta: ...
211-
# Override due to more types supported than dt.timedelta
214+
# Override due to more types supported than timedelta
212215
@overload # type: ignore[override]
213216
def __mul__(self, other: float) -> Timedelta: ...
214217
@overload
215218
def __mul__(
216-
self, other: np_ndarray[ShapeT, np.integer] | np_ndarray[ShapeT, np.floating]
219+
self, other: np_ndarray[ShapeT, np.bool_ | np.integer | np.floating]
217220
) -> np_ndarray[ShapeT, np.timedelta64]: ...
218221
@overload
219-
def __mul__(self, other: Series[int]) -> Series[Timedelta]: ...
220-
@overload
221-
def __mul__(self, other: Series[float]) -> Series[Timedelta]: ...
222-
@overload
223-
def __mul__(self, other: Index[int] | Index[float]) -> TimedeltaIndex: ...
224-
@overload
225222
def __rmul__(self, other: float) -> Timedelta: ...
226223
@overload
227224
def __rmul__(
228-
self, other: np_ndarray[ShapeT, np.floating] | np_ndarray[ShapeT, np.integer]
225+
self, other: np_ndarray[ShapeT, np.bool_ | np.integer | np.floating]
229226
) -> np_ndarray[ShapeT, np.timedelta64]: ...
230-
@overload
231-
def __rmul__(self, other: Series[int]) -> Series[Timedelta]: ...
232-
@overload
233-
def __rmul__(self, other: Series[float]) -> Series[Timedelta]: ...
234-
# maybe related to https://github.com/python/mypy/issues/10755
235-
@overload
236-
def __rmul__(self, other: Index[int] | Index[float]) -> TimedeltaIndex: ...
237-
# Override due to more types supported than dt.timedelta
227+
# Override due to more types supported than timedelta
238228
# error: Signature of "__floordiv__" incompatible with supertype "timedelta"
239229
@overload # type: ignore[override]
240230
def __floordiv__(self, other: timedelta | Timedelta | np.timedelta64) -> int: ...
241231
@overload
242232
def __floordiv__(self, other: float) -> Timedelta: ...
243233
@overload
244234
def __floordiv__(
245-
self, other: np_ndarray[ShapeT, np.integer] | np_ndarray[ShapeT, np.floating]
235+
self, other: np_ndarray[ShapeT, np.integer | np.floating]
246236
) -> np_ndarray[ShapeT, np.timedelta64]: ...
247237
@overload
248238
def __floordiv__(
@@ -266,14 +256,14 @@ class Timedelta(timedelta):
266256
def __rfloordiv__(
267257
self, other: np_ndarray[ShapeT, np.timedelta64]
268258
) -> np_ndarray[ShapeT, np.int_]: ...
269-
# Override due to more types supported than dt.timedelta
259+
# Override due to more types supported than timedelta
270260
@overload # type: ignore[override]
271261
def __truediv__(self, other: timedelta | Timedelta | NaTType) -> float: ...
272262
@overload
273263
def __truediv__(self, other: float) -> Timedelta: ...
274264
@overload
275265
def __truediv__(
276-
self, other: np_ndarray[ShapeT, np.integer] | np_ndarray[ShapeT, np.floating]
266+
self, other: np_ndarray[ShapeT, np.integer | np.floating]
277267
) -> np_ndarray[ShapeT, np.timedelta64]: ...
278268
@overload
279269
def __truediv__(self, other: Series[Timedelta]) -> Series[float]: ...
@@ -284,7 +274,7 @@ class Timedelta(timedelta):
284274
@overload
285275
def __truediv__(self, other: Index[int] | Index[float]) -> TimedeltaIndex: ...
286276
def __rtruediv__(self, other: timedelta | Timedelta | NaTType) -> float: ...
287-
# Override due to more types supported than dt.timedelta
277+
# Override due to more types supported than timedelta
288278
@overload
289279
def __eq__(self, other: timedelta | Timedelta | np.timedelta64) -> bool: ... # type: ignore[overload-overlap] # pyright: ignore[reportOverlappingOverload]
290280
@overload
@@ -297,7 +287,7 @@ class Timedelta(timedelta):
297287
) -> np_ndarray[ShapeT, np.bool_]: ...
298288
@overload
299289
def __eq__(self, other: object) -> Literal[False]: ...
300-
# Override due to more types supported than dt.timedelta
290+
# Override due to more types supported than timedelta
301291
@overload
302292
def __ne__(self, other: timedelta | Timedelta | np.timedelta64) -> bool: ... # type: ignore[overload-overlap] # pyright: ignore[reportOverlappingOverload]
303293
@overload
@@ -310,7 +300,7 @@ class Timedelta(timedelta):
310300
) -> np_ndarray[ShapeT, np.bool_]: ...
311301
@overload
312302
def __ne__(self, other: object) -> Literal[True]: ...
313-
# Override due to more types supported than dt.timedelta
303+
# Override due to more types supported than timedelta
314304
@overload # type: ignore[override]
315305
def __mod__(self, other: timedelta) -> Timedelta: ...
316306
@overload
@@ -321,7 +311,7 @@ class Timedelta(timedelta):
321311
def __mod__(self, other: Index[int] | Index[float]) -> TimedeltaIndex: ...
322312
@overload
323313
def __mod__(
324-
self, other: np_ndarray[ShapeT, np.integer] | np_ndarray[ShapeT, np.floating]
314+
self, other: np_ndarray[ShapeT, np.integer | np.floating]
325315
) -> np_ndarray[ShapeT, np.timedelta64]: ...
326316
@overload
327317
def __mod__(
@@ -330,7 +320,7 @@ class Timedelta(timedelta):
330320
def __divmod__(self, other: timedelta) -> tuple[int, Timedelta]: ...
331321
# Mypy complains Forward operator "<inequality op>" is not callable, so ignore misc
332322
# for le, lt ge and gt
333-
# Override due to more types supported than dt.timedelta
323+
# Override due to more types supported than timedelta
334324
@overload # type: ignore[override]
335325
def __le__(self, other: timedelta | Timedelta | np.timedelta64) -> bool: ... # type: ignore[misc]
336326
@overload
@@ -341,7 +331,7 @@ class Timedelta(timedelta):
341331
) -> np_ndarray[ShapeT, np.bool_]: ...
342332
@overload
343333
def __le__(self, other: Series[pd.Timedelta]) -> Series[bool]: ...
344-
# Override due to more types supported than dt.timedelta
334+
# Override due to more types supported than timedelta
345335
@overload # type: ignore[override]
346336
def __lt__(self, other: timedelta | Timedelta | np.timedelta64) -> bool: ... # type: ignore[misc]
347337
@overload
@@ -352,7 +342,7 @@ class Timedelta(timedelta):
352342
) -> np_ndarray[ShapeT, np.bool_]: ...
353343
@overload
354344
def __lt__(self, other: Series[pd.Timedelta]) -> Series[bool]: ...
355-
# Override due to more types supported than dt.timedelta
345+
# Override due to more types supported than timedelta
356346
@overload # type: ignore[override]
357347
def __ge__(self, other: timedelta | Timedelta | np.timedelta64) -> bool: ... # type: ignore[misc]
358348
@overload
@@ -363,7 +353,7 @@ class Timedelta(timedelta):
363353
) -> np_ndarray[ShapeT, np.bool_]: ...
364354
@overload
365355
def __ge__(self, other: Series[pd.Timedelta]) -> Series[bool]: ...
366-
# Override due to more types supported than dt.timedelta
356+
# Override due to more types supported than timedelta
367357
@overload # type: ignore[override]
368358
def __gt__(self, other: timedelta | Timedelta | np.timedelta64) -> bool: ... # type: ignore[misc]
369359
@overload

pandas-stubs/_typing.pyi

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ RandomState: TypeAlias = (
173173
)
174174

175175
# dtypes
176-
NpDtype: TypeAlias = str | np.dtype[np.generic] | type[str | complex | bool | object]
176+
NpDtypeNoStr: TypeAlias = np.dtype[np.generic] | type[complex | bool | object]
177+
NpDtype: TypeAlias = str | NpDtypeNoStr | type[str]
177178
Dtype: TypeAlias = ExtensionDtype | NpDtype
178179

179180
# AstypeArg is more carefully defined here as compared to pandas
@@ -847,19 +848,21 @@ MaskType: TypeAlias = Series[bool] | np_ndarray_bool | list[bool]
847848

848849
T_INT = TypeVar("T_INT", bound=int)
849850
T_COMPLEX = TypeVar("T_COMPLEX", bound=complex)
850-
SeriesDTypeNoDateTime: TypeAlias = (
851-
str
852-
| bytes
851+
SeriesDTypeNoStrDateTime: TypeAlias = (
852+
bytes
853853
| bool
854854
| int
855855
| float
856856
| complex
857-
| Dtype
857+
| NpDtypeNoStr
858+
| ExtensionDtype
858859
| Period
859860
| Interval
860861
| CategoricalDtype
861862
| BaseOffset
862-
| list[str]
863+
)
864+
SeriesDTypeNoDateTime: TypeAlias = (
865+
str | SeriesDTypeNoStrDateTime | type[str] | list[str]
863866
)
864867
SeriesDType: TypeAlias = (
865868
SeriesDTypeNoDateTime
@@ -869,6 +872,9 @@ SeriesDType: TypeAlias = (
869872
| datetime.timedelta # includes pd.Timedelta
870873
)
871874
S1 = TypeVar("S1", bound=SeriesDType, default=Any)
875+
S1_CO_NSDT = TypeVar(
876+
"S1_CO_NSDT", bound=SeriesDTypeNoStrDateTime, default=Any, covariant=True
877+
)
872878
S1_CT_NDT = TypeVar(
873879
"S1_CT_NDT", bound=SeriesDTypeNoDateTime, default=Any, contravariant=True
874880
)

0 commit comments

Comments
 (0)