Skip to content

Commit 337db47

Browse files
committed
merge main and fix conflicts in code_checks.sh
2 parents 3e315c7 + 9eb1553 commit 337db47

File tree

11 files changed

+88
-35
lines changed

11 files changed

+88
-35
lines changed

ci/code_checks.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then
339339
--ignore_errors pandas.Series.copy SA01\
340340
--ignore_errors pandas.Series.div PR07\
341341
--ignore_errors pandas.Series.droplevel SA01\
342-
--ignore_errors pandas.Series.dt GL08\
342+
--ignore_errors pandas.Series.dt PR01\`# Accessors are implemented as classes, but we do not document the Parameters section` \
343343
--ignore_errors pandas.Series.dt.as_unit GL08,PR01,PR02\
344344
--ignore_errors pandas.Series.dt.ceil PR01,PR02,SA01\
345345
--ignore_errors pandas.Series.dt.components SA01\

doc/source/whatsnew/v3.0.0.rst

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,16 +91,16 @@ Now using multiple groupings will also pass the unobserved groups to the provide
9191
9292
Similarly:
9393

94-
- In previous versions of pandas the method :meth:`.DataFrameGroupBy.sum` would result in ``0`` for unobserved groups, but :meth:`.DataFrameGroupBy.prod`, :meth:`.DataFrameGroupBy.all`, and :meth:`.DataFrameGroupBy.any` would all result in NA values. Now these methods result in ``1``, ``True``, and ``False`` respectively.
95-
- :meth:`.DataFrameGroupBy.groups` did not include unobserved groups and now does.
94+
- In previous versions of pandas the method :meth:`.DataFrameGroupBy.sum` would result in ``0`` for unobserved groups, but :meth:`.DataFrameGroupBy.prod`, :meth:`.DataFrameGroupBy.all`, and :meth:`.DataFrameGroupBy.any` would all result in NA values. Now these methods result in ``1``, ``True``, and ``False`` respectively.
95+
- :meth:`.DataFrameGroupBy.groups` did not include unobserved groups and now does.
9696

9797
These improvements also fixed certain bugs in groupby:
9898

99-
- :meth:`.DataFrameGroupBy.nunique` would fail when there are multiple groupings, unobserved groups, and ``as_index=False`` (:issue:`52848`)
100-
- :meth:`.DataFrameGroupBy.agg` would fail when there are multiple groupings, unobserved groups, and ``as_index=False`` (:issue:`36698`)
101-
- :meth:`.DataFrameGroupBy.sum` would have incorrect values when there are multiple groupings, unobserved groups, and non-numeric data (:issue:`43891`)
102-
- :meth:`.DataFrameGroupBy.groups` with ``sort=False`` would sort groups; they now occur in the order they are observed (:issue:`56966`)
103-
- :meth:`.DataFrameGroupBy.value_counts` would produce incorrect results when used with some categorical and some non-categorical groupings and ``observed=False`` (:issue:`56016`)
99+
- :meth:`.DataFrameGroupBy.agg` would fail when there are multiple groupings, unobserved groups, and ``as_index=False`` (:issue:`36698`)
100+
- :meth:`.DataFrameGroupBy.groups` with ``sort=False`` would sort groups; they now occur in the order they are observed (:issue:`56966`)
101+
- :meth:`.DataFrameGroupBy.nunique` would fail when there are multiple groupings, unobserved groups, and ``as_index=False`` (:issue:`52848`)
102+
- :meth:`.DataFrameGroupBy.sum` would have incorrect values when there are multiple groupings, unobserved groups, and non-numeric data (:issue:`43891`)
103+
- :meth:`.DataFrameGroupBy.value_counts` would produce incorrect results when used with some categorical and some non-categorical groupings and ``observed=False`` (:issue:`56016`)
104104

105105
.. _whatsnew_300.notable_bug_fixes.notable_bug_fix2:
106106

@@ -277,6 +277,7 @@ Performance improvements
277277
- Performance improvement in :meth:`RangeIndex.__getitem__` with a boolean mask or integers returning a :class:`RangeIndex` instead of a :class:`Index` when possible. (:issue:`57588`)
278278
- Performance improvement in :meth:`RangeIndex.append` when appending the same index (:issue:`57252`)
279279
- Performance improvement in :meth:`RangeIndex.argmin` and :meth:`RangeIndex.argmax` (:issue:`57823`)
280+
- Performance improvement in :meth:`RangeIndex.insert` returning a :class:`RangeIndex` instead of a :class:`Index` when the :class:`RangeIndex` is empty. (:issue:`57833`)
280281
- Performance improvement in :meth:`RangeIndex.round` returning a :class:`RangeIndex` instead of a :class:`Index` when possible. (:issue:`57824`)
281282
- Performance improvement in :meth:`RangeIndex.join` returning a :class:`RangeIndex` instead of a :class:`Index` when possible. (:issue:`57651`, :issue:`57752`)
282283
- Performance improvement in :meth:`RangeIndex.reindex` returning a :class:`RangeIndex` instead of a :class:`Index` when possible. (:issue:`57647`, :issue:`57752`)

pandas/core/groupby/groupby.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2686,7 +2686,7 @@ def _value_counts(
26862686
names = result_series.index.names
26872687
# GH#55951 - Temporarily replace names in case they are integers
26882688
result_series.index.names = range(len(names))
2689-
index_level = list(range(len(self._grouper.groupings)))
2689+
index_level = range(len(self._grouper.groupings))
26902690
result_series = result_series.sort_index(
26912691
level=index_level, sort_remaining=False
26922692
)

pandas/core/indexes/accessors.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,44 @@ class PeriodProperties(Properties):
572572
class CombinedDatetimelikeProperties(
573573
DatetimeProperties, TimedeltaProperties, PeriodProperties
574574
):
575+
"""
576+
Accessor object for Series values' datetime-like, timedelta and period properties.
577+
578+
See Also
579+
--------
580+
DatetimeIndex : Index of datetime64 data.
581+
582+
Examples
583+
--------
584+
>>> dates = pd.Series(
585+
... ["2024-01-01", "2024-01-15", "2024-02-5"], dtype="datetime64[ns]"
586+
... )
587+
>>> dates.dt.day
588+
0 1
589+
1 15
590+
2 5
591+
dtype: int32
592+
>>> dates.dt.month
593+
0 1
594+
1 1
595+
2 2
596+
dtype: int32
597+
598+
>>> dates = pd.Series(
599+
... ["2024-01-01", "2024-01-15", "2024-02-5"], dtype="datetime64[ns, UTC]"
600+
... )
601+
>>> dates.dt.day
602+
0 1
603+
1 15
604+
2 5
605+
dtype: int32
606+
>>> dates.dt.month
607+
0 1
608+
1 1
609+
2 2
610+
dtype: int32
611+
"""
612+
575613
def __new__(cls, data: Series): # pyright: ignore[reportInconsistentConstructor]
576614
# CombinedDatetimelikeProperties isn't really instantiated. Instead
577615
# we need to choose which parent (datetime or timedelta) is

pandas/core/indexes/multi.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -921,7 +921,7 @@ def _set_levels(
921921

922922
if level is None:
923923
new_levels = tuple(ensure_index(lev, copy=copy)._view() for lev in levels)
924-
level_numbers = list(range(len(new_levels)))
924+
level_numbers: range | list[int] = range(len(new_levels))
925925
else:
926926
level_numbers = [self._get_level_number(lev) for lev in level]
927927
new_levels_list = list(self._levels)
@@ -3014,7 +3014,7 @@ def _maybe_to_slice(loc):
30143014
raise KeyError(key) from err
30153015
except TypeError:
30163016
# e.g. test_partial_slicing_with_multiindex partial string slicing
3017-
loc, _ = self.get_loc_level(key, list(range(self.nlevels)))
3017+
loc, _ = self.get_loc_level(key, range(self.nlevels))
30183018
return loc
30193019

30203020
# -- partial selection or non-unique index
@@ -3101,7 +3101,7 @@ def get_loc_level(self, key, level: IndexLabel = 0, drop_level: bool = True):
31013101
>>> mi.get_loc_level(["b", "e"])
31023102
(1, None)
31033103
"""
3104-
if not isinstance(level, (list, tuple)):
3104+
if not isinstance(level, (range, list, tuple)):
31053105
level = self._get_level_number(level)
31063106
else:
31073107
level = [self._get_level_number(lev) for lev in level]

pandas/core/indexes/range.py

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ def __contains__(self, key: Any) -> bool:
396396
hash(key)
397397
try:
398398
key = ensure_python_int(key)
399-
except TypeError:
399+
except (TypeError, OverflowError):
400400
return False
401401
return key in self._range
402402

@@ -1009,23 +1009,27 @@ def delete(self, loc) -> Index: # type: ignore[override]
10091009
return super().delete(loc)
10101010

10111011
def insert(self, loc: int, item) -> Index:
1012-
if len(self) and (is_integer(item) or is_float(item)):
1012+
if is_integer(item) or is_float(item):
10131013
# We can retain RangeIndex is inserting at the beginning or end,
10141014
# or right in the middle.
1015-
rng = self._range
1016-
if loc == 0 and item == self[0] - self.step:
1017-
new_rng = range(rng.start - rng.step, rng.stop, rng.step)
1018-
return type(self)._simple_new(new_rng, name=self._name)
1019-
1020-
elif loc == len(self) and item == self[-1] + self.step:
1021-
new_rng = range(rng.start, rng.stop + rng.step, rng.step)
1022-
return type(self)._simple_new(new_rng, name=self._name)
1023-
1024-
elif len(self) == 2 and item == self[0] + self.step / 2:
1025-
# e.g. inserting 1 into [0, 2]
1026-
step = int(self.step / 2)
1027-
new_rng = range(self.start, self.stop, step)
1015+
if len(self) == 0 and loc == 0 and is_integer(item):
1016+
new_rng = range(item, item + self.step, self.step)
10281017
return type(self)._simple_new(new_rng, name=self._name)
1018+
elif len(self):
1019+
rng = self._range
1020+
if loc == 0 and item == self[0] - self.step:
1021+
new_rng = range(rng.start - rng.step, rng.stop, rng.step)
1022+
return type(self)._simple_new(new_rng, name=self._name)
1023+
1024+
elif loc == len(self) and item == self[-1] + self.step:
1025+
new_rng = range(rng.start, rng.stop + rng.step, rng.step)
1026+
return type(self)._simple_new(new_rng, name=self._name)
1027+
1028+
elif len(self) == 2 and item == self[0] + self.step / 2:
1029+
# e.g. inserting 1 into [0, 2]
1030+
step = int(self.step / 2)
1031+
new_rng = range(self.start, self.stop, step)
1032+
return type(self)._simple_new(new_rng, name=self._name)
10291033

10301034
return super().insert(loc, item)
10311035

pandas/core/reshape/pivot.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
import itertools
34
from typing import (
45
TYPE_CHECKING,
56
Callable,
@@ -422,7 +423,7 @@ def _all_key(key):
422423
row_margin = row_margin.stack()
423424

424425
# GH#26568. Use names instead of indices in case of numeric names
425-
new_order_indices = [len(cols)] + list(range(len(cols)))
426+
new_order_indices = itertools.chain([len(cols)], range(len(cols)))
426427
new_order_names = [row_margin.index.names[i] for i in new_order_indices]
427428
row_margin.index = row_margin.index.reorder_levels(new_order_names)
428429
else:

pandas/core/sorting.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -523,13 +523,13 @@ def _ensure_key_mapped_multiindex(
523523

524524
if level is not None:
525525
if isinstance(level, (str, int)):
526-
sort_levels = [level]
526+
level_iter = [level]
527527
else:
528-
sort_levels = level
528+
level_iter = level
529529

530-
sort_levels = [index._get_level_number(lev) for lev in sort_levels]
530+
sort_levels: range | set = {index._get_level_number(lev) for lev in level_iter}
531531
else:
532-
sort_levels = list(range(index.nlevels)) # satisfies mypy
532+
sort_levels = range(index.nlevels)
533533

534534
mapped = [
535535
ensure_key_mapped(index._get_level_values(level), key)

pandas/io/common.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,12 +1223,14 @@ def is_potential_multi_index(
12231223
bool : Whether or not columns could become a MultiIndex
12241224
"""
12251225
if index_col is None or isinstance(index_col, bool):
1226-
index_col = []
1226+
index_columns = set()
1227+
else:
1228+
index_columns = set(index_col)
12271229

12281230
return bool(
12291231
len(columns)
12301232
and not isinstance(columns, ABCMultiIndex)
1231-
and all(isinstance(c, tuple) for c in columns if c not in list(index_col))
1233+
and all(isinstance(c, tuple) for c in columns if c not in index_columns)
12321234
)
12331235

12341236

pandas/io/parsers/readers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1482,7 +1482,7 @@ def _clean_options(
14821482
)
14831483
else:
14841484
if is_integer(skiprows):
1485-
skiprows = list(range(skiprows))
1485+
skiprows = range(skiprows)
14861486
if skiprows is None:
14871487
skiprows = set()
14881488
elif not callable(skiprows):

0 commit comments

Comments
 (0)