-
-
Notifications
You must be signed in to change notification settings - Fork 152
feat(arithmetic): 🪜 floordiv #1452
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
3df344a to
674b994
Compare
674b994 to
dca5fa2
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A few things:
- You're inconsistent when having
timedeltadivided byintwhere "divided" is either regular division or floor division, andtimedeltais a single element or a sequence of some type. You have that as being not allowed in the stubs, but they work at runtime. Sometimes you do allow it, so you have to fix that. - There are a few places where you say you can't detect via static typing, and I'm surprised at that.
Also, you are making changes here that are independent of supporting floordiv, namely:
- You changed the
pyreflyoverride syntax - You changed some imports from
from pandas import Seriestofrom pandas.core.series import Series
In the future, if you are making changes where the changes don't have to do with the main intent of the PR, make a separate PR for those changes. E.g., in the above case, you could do one for pyrefly and another to change the imports.
| if TYPE_CHECKING_INVALID_USAGE: | ||
| _13 = c // left # type: ignore[operator] # pyright: ignore[reportOperatorIssue] | ||
| _14 = s // left # type: ignore[operator] # pyright: ignore[reportOperatorIssue] | ||
| _15 = d // left # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Bit surprised here that timedelta // left works but a list[timedelta] // left does not.. Shouldn't it have picked up Index[float].__rfloordiv__(list[timedelta]) ?
| check(assert_type(c / left, "pd.Index[complex]"), pd.Index, np.complexfloating) | ||
| if TYPE_CHECKING_INVALID_USAGE: | ||
| _14 = s / left # type: ignore[operator] # pyright: ignore[reportOperatorIssue] | ||
| _15 = d / left # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
same comment as in indexes/test_floordiv.py . This does work:
>>> left = pd.Index([1.0, 2.0, 3.0])
>>> from datetime import timedelta
>>> d = [timedelta(seconds=s) for s in (1, 2, 3)]
>>> d / left
Index([0:00:01, 0:00:01, 0:00:01], dtype='object')| if TYPE_CHECKING_INVALID_USAGE: | ||
| _13 = c // left # type: ignore[operator] # pyright: ignore[reportOperatorIssue] | ||
| _14 = s // left # type: ignore[operator] # pyright: ignore[reportOperatorIssue] | ||
| _15 = d // left # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
same comment - this should work
| if TYPE_CHECKING_INVALID_USAGE: | ||
| assert_type(c // left, Any) | ||
| assert_type(s // left, Any) | ||
| assert_type(d // left, "np.typing.NDArray[np.int64]") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this works
| check(assert_type(c / left, "pd.Index[complex]"), pd.Index, np.complexfloating) | ||
| if TYPE_CHECKING_INVALID_USAGE: | ||
| _14 = s / left # type: ignore[operator] # pyright: ignore[reportOperatorIssue] | ||
| _15 = d / left # type: ignore[operator] # pyright: ignore[reportOperatorIssue] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this works
| if TYPE_CHECKING_INVALID_USAGE: | ||
| left_i.floordiv(c) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] | ||
| left_i.floordiv(s) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] | ||
| # left_i.floordiv(d) # This invalid one cannot be detected by static type checking |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is very surprising. You were able to detect that left_i // d is invalid, so you should be able to do this one.
| if TYPE_CHECKING_INVALID_USAGE: | ||
| _03 = left_i // c # type: ignore[operator] # pyright: ignore[reportOperatorIssue] | ||
| _04 = left_i // s # type: ignore[operator] # pyright: ignore[reportOperatorIssue] | ||
| # _05 = left_i // d # This invalid one cannot be detected by static type checking |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A bit surprising, but then I see that you didn't add s and d in the tests in tests/series/arithmetic/test_truediv.py, so you should add that and things should be the same between floordiv and truediv
| if TYPE_CHECKING_INVALID_USAGE: | ||
| left_i.floordiv(c) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] | ||
| left_i.floordiv(s) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] | ||
| # left_i.floordiv(d) # This invalid one cannot be detected by static type checking |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
surprised at this
| if TYPE_CHECKING_INVALID_USAGE: | ||
| _03 = left_i // c # type: ignore[operator] # pyright: ignore[reportOperatorIssue] | ||
| _04 = left_i // s # type: ignore[operator] # pyright: ignore[reportOperatorIssue] | ||
| # _05 = left_i // d # This invalid one cannot be detected by static type checking |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
same comment
| if TYPE_CHECKING_INVALID_USAGE: | ||
| left_i.floordiv(c) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] | ||
| left_i.floordiv(s) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue] | ||
| # left_i.floordiv(d) # This invalid one cannot be detected by static type checking |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
same comment
This PR adds
floordivforIndexandSeries.TimedeltaIndexandDatetimeIndex#1378