Skip to content

Commit d4d8d0a

Browse files
jbrockmendelrhshadrach
authored andcommitted
PERF: use isinstance(obj, Foo) instead of ABCFoo (pandas-dev#34040)
1 parent a3ae0fe commit d4d8d0a

File tree

9 files changed

+66
-92
lines changed

9 files changed

+66
-92
lines changed

pandas/core/frame.py

+26-31
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
Axis,
4848
Dtype,
4949
FilePathOrBuffer,
50+
FrameOrSeriesUnion,
5051
IndexKeyFunc,
5152
Label,
5253
Level,
@@ -106,12 +107,6 @@
106107
needs_i8_conversion,
107108
pandas_dtype,
108109
)
109-
from pandas.core.dtypes.generic import (
110-
ABCDataFrame,
111-
ABCIndexClass,
112-
ABCMultiIndex,
113-
ABCSeries,
114-
)
115110
from pandas.core.dtypes.missing import isna, notna
116111

117112
from pandas.core import algorithms, common as com, nanops, ops
@@ -1838,7 +1833,7 @@ def to_records(
18381833
dtype=[('I', 'S1'), ('A', '<i8'), ('B', '<f8')])
18391834
"""
18401835
if index:
1841-
if isinstance(self.index, ABCMultiIndex):
1836+
if isinstance(self.index, MultiIndex):
18421837
# array of tuples to numpy cols. copy copy copy
18431838
ix_vals = list(map(np.array, zip(*self.index.values)))
18441839
else:
@@ -1851,7 +1846,7 @@ def to_records(
18511846
count = 0
18521847
index_names = list(self.index.names)
18531848

1854-
if isinstance(self.index, ABCMultiIndex):
1849+
if isinstance(self.index, MultiIndex):
18551850
for i, n in enumerate(index_names):
18561851
if n is None:
18571852
index_names[i] = f"level_{count}"
@@ -2782,7 +2777,7 @@ def __getitem__(self, key):
27822777
# The behavior is inconsistent. It returns a Series, except when
27832778
# - the key itself is repeated (test on data.shape, #9519), or
27842779
# - we have a MultiIndex on columns (test on self.columns, #21309)
2785-
if data.shape[1] == 1 and not isinstance(self.columns, ABCMultiIndex):
2780+
if data.shape[1] == 1 and not isinstance(self.columns, MultiIndex):
27862781
data = data[key]
27872782

27882783
return data
@@ -3600,7 +3595,7 @@ def reindexer(value):
36003595
elif isinstance(value, DataFrame):
36013596
# align right-hand-side columns if self.columns
36023597
# is multi-index and self[key] is a sub-frame
3603-
if isinstance(self.columns, ABCMultiIndex) and key in self.columns:
3598+
if isinstance(self.columns, MultiIndex) and key in self.columns:
36043599
loc = self.columns.get_loc(key)
36053600
if isinstance(loc, (slice, Series, np.ndarray, Index)):
36063601
cols = maybe_droplevels(self.columns[loc], key)
@@ -3649,7 +3644,7 @@ def reindexer(value):
36493644

36503645
# broadcast across multiple columns if necessary
36513646
if broadcast and key in self.columns and value.ndim == 1:
3652-
if not self.columns.is_unique or isinstance(self.columns, ABCMultiIndex):
3647+
if not self.columns.is_unique or isinstance(self.columns, MultiIndex):
36533648
existing_piece = self[key]
36543649
if isinstance(existing_piece, DataFrame):
36553650
value = np.tile(value, (len(existing_piece.columns), 1))
@@ -4337,9 +4332,7 @@ def set_index(
43374332

43384333
missing: List[Label] = []
43394334
for col in keys:
4340-
if isinstance(
4341-
col, (ABCIndexClass, ABCSeries, np.ndarray, list, abc.Iterator)
4342-
):
4335+
if isinstance(col, (Index, Series, np.ndarray, list, abc.Iterator)):
43434336
# arrays are fine as long as they are one-dimensional
43444337
# iterators get converted to list below
43454338
if getattr(col, "ndim", 1) != 1:
@@ -4368,19 +4361,19 @@ def set_index(
43684361
names = []
43694362
if append:
43704363
names = list(self.index.names)
4371-
if isinstance(self.index, ABCMultiIndex):
4364+
if isinstance(self.index, MultiIndex):
43724365
for i in range(self.index.nlevels):
43734366
arrays.append(self.index._get_level_values(i))
43744367
else:
43754368
arrays.append(self.index)
43764369

43774370
to_remove: List[Label] = []
43784371
for col in keys:
4379-
if isinstance(col, ABCMultiIndex):
4372+
if isinstance(col, MultiIndex):
43804373
for n in range(col.nlevels):
43814374
arrays.append(col._get_level_values(n))
43824375
names.extend(col.names)
4383-
elif isinstance(col, (ABCIndexClass, ABCSeries)):
4376+
elif isinstance(col, (Index, Series)):
43844377
# if Index then not MultiIndex (treated above)
43854378
arrays.append(col)
43864379
names.append(col.name)
@@ -4625,7 +4618,7 @@ def _maybe_casted_values(index, labels=None):
46254618

46264619
if not drop:
46274620
to_insert: Iterable[Tuple[Any, Optional[Any]]]
4628-
if isinstance(self.index, ABCMultiIndex):
4621+
if isinstance(self.index, MultiIndex):
46294622
names = [
46304623
(n if n is not None else f"level_{i}")
46314624
for i, n in enumerate(self.index.names)
@@ -4636,7 +4629,7 @@ def _maybe_casted_values(index, labels=None):
46364629
names = [default] if self.index.name is None else [self.index.name]
46374630
to_insert = ((self.index, None),)
46384631

4639-
multi_col = isinstance(self.columns, ABCMultiIndex)
4632+
multi_col = isinstance(self.columns, MultiIndex)
46404633
for i, (lev, lab) in reversed(list(enumerate(to_insert))):
46414634
if not (level is None or i in level):
46424635
continue
@@ -5240,7 +5233,7 @@ def sort_index(
52405233
level, ascending=ascending, sort_remaining=sort_remaining
52415234
)
52425235

5243-
elif isinstance(labels, ABCMultiIndex):
5236+
elif isinstance(labels, MultiIndex):
52445237
from pandas.core.sorting import lexsort_indexer
52455238

52465239
indexer = lexsort_indexer(
@@ -5607,14 +5600,14 @@ def swaplevel(self, i=-2, j=-1, axis=0) -> "DataFrame":
56075600

56085601
axis = self._get_axis_number(axis)
56095602

5610-
if not isinstance(result._get_axis(axis), ABCMultiIndex): # pragma: no cover
5603+
if not isinstance(result._get_axis(axis), MultiIndex): # pragma: no cover
56115604
raise TypeError("Can only swap levels on a hierarchical axis.")
56125605

56135606
if axis == 0:
5614-
assert isinstance(result.index, ABCMultiIndex)
5607+
assert isinstance(result.index, MultiIndex)
56155608
result.index = result.index.swaplevel(i, j)
56165609
else:
5617-
assert isinstance(result.columns, ABCMultiIndex)
5610+
assert isinstance(result.columns, MultiIndex)
56185611
result.columns = result.columns.swaplevel(i, j)
56195612
return result
56205613

@@ -5635,16 +5628,16 @@ def reorder_levels(self, order, axis=0) -> "DataFrame":
56355628
DataFrame
56365629
"""
56375630
axis = self._get_axis_number(axis)
5638-
if not isinstance(self._get_axis(axis), ABCMultiIndex): # pragma: no cover
5631+
if not isinstance(self._get_axis(axis), MultiIndex): # pragma: no cover
56395632
raise TypeError("Can only reorder levels on a hierarchical axis.")
56405633

56415634
result = self.copy()
56425635

56435636
if axis == 0:
5644-
assert isinstance(result.index, ABCMultiIndex)
5637+
assert isinstance(result.index, MultiIndex)
56455638
result.index = result.index.reorder_levels(order)
56465639
else:
5647-
assert isinstance(result.columns, ABCMultiIndex)
5640+
assert isinstance(result.columns, MultiIndex)
56485641
result.columns = result.columns.reorder_levels(order)
56495642
return result
56505643

@@ -5913,7 +5906,8 @@ def extract_values(arr):
59135906
# Does two things:
59145907
# 1. maybe gets the values from the Series / Index
59155908
# 2. convert datelike to i8
5916-
if isinstance(arr, (ABCIndexClass, ABCSeries)):
5909+
# TODO: extract_array?
5910+
if isinstance(arr, (Index, Series)):
59175911
arr = arr._values
59185912

59195913
if needs_i8_conversion(arr.dtype):
@@ -5925,7 +5919,8 @@ def extract_values(arr):
59255919

59265920
def combiner(x, y):
59275921
mask = isna(x)
5928-
if isinstance(mask, (ABCIndexClass, ABCSeries)):
5922+
# TODO: extract_array?
5923+
if isinstance(mask, (Index, Series)):
59295924
mask = mask._values
59305925

59315926
x_values = extract_values(x)
@@ -7020,8 +7015,8 @@ def _gotitem(
70207015
self,
70217016
key: Union[str, List[str]],
70227017
ndim: int,
7023-
subset: Optional[Union[Series, ABCDataFrame]] = None,
7024-
) -> Union[Series, ABCDataFrame]:
7018+
subset: Optional[FrameOrSeriesUnion] = None,
7019+
) -> FrameOrSeriesUnion:
70257020
"""
70267021
Sub-classes to define. Return a sliced object.
70277022
@@ -8225,7 +8220,7 @@ def _count_level(self, level, axis=0, numeric_only=False):
82258220
count_axis = frame._get_axis(axis)
82268221
agg_axis = frame._get_agg_axis(axis)
82278222

8228-
if not isinstance(count_axis, ABCMultiIndex):
8223+
if not isinstance(count_axis, MultiIndex):
82298224
raise TypeError(
82308225
f"Can only count levels on hierarchical {self._get_axis_name(axis)}."
82318226
)

pandas/core/reshape/melt.py

+5-8
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@
77

88
from pandas.core.dtypes.common import is_extension_array_dtype, is_list_like
99
from pandas.core.dtypes.concat import concat_compat
10-
from pandas.core.dtypes.generic import ABCMultiIndex
1110
from pandas.core.dtypes.missing import notna
1211

1312
from pandas.core.arrays import Categorical
1413
import pandas.core.common as com
1514
from pandas.core.frame import DataFrame, _shared_docs
16-
from pandas.core.indexes.base import Index
15+
from pandas.core.indexes.api import Index, MultiIndex
1716
from pandas.core.reshape.concat import concat
1817
from pandas.core.tools.numeric import to_numeric
1918

@@ -33,15 +32,15 @@ def melt(
3332
# TODO: what about the existing index?
3433
# If multiindex, gather names of columns on all level for checking presence
3534
# of `id_vars` and `value_vars`
36-
if isinstance(frame.columns, ABCMultiIndex):
35+
if isinstance(frame.columns, MultiIndex):
3736
cols = [x for c in frame.columns for x in c]
3837
else:
3938
cols = list(frame.columns)
4039

4140
if id_vars is not None:
4241
if not is_list_like(id_vars):
4342
id_vars = [id_vars]
44-
elif isinstance(frame.columns, ABCMultiIndex) and not isinstance(id_vars, list):
43+
elif isinstance(frame.columns, MultiIndex) and not isinstance(id_vars, list):
4544
raise ValueError(
4645
"id_vars must be a list of tuples when columns are a MultiIndex"
4746
)
@@ -60,9 +59,7 @@ def melt(
6059
if value_vars is not None:
6160
if not is_list_like(value_vars):
6261
value_vars = [value_vars]
63-
elif isinstance(frame.columns, ABCMultiIndex) and not isinstance(
64-
value_vars, list
65-
):
62+
elif isinstance(frame.columns, MultiIndex) and not isinstance(value_vars, list):
6663
raise ValueError(
6764
"value_vars must be a list of tuples when columns are a MultiIndex"
6865
)
@@ -84,7 +81,7 @@ def melt(
8481
frame.columns = frame.columns.get_level_values(col_level)
8582

8683
if var_name is None:
87-
if isinstance(frame.columns, ABCMultiIndex):
84+
if isinstance(frame.columns, MultiIndex):
8885
if len(frame.columns.names) == len(set(frame.columns.names)):
8986
var_name = frame.columns.names
9087
else:

pandas/core/series.py

+8-14
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,7 @@
4545
is_object_dtype,
4646
is_scalar,
4747
)
48-
from pandas.core.dtypes.generic import (
49-
ABCDataFrame,
50-
ABCDatetimeIndex,
51-
ABCMultiIndex,
52-
ABCPeriodIndex,
53-
ABCSeries,
54-
)
48+
from pandas.core.dtypes.generic import ABCDataFrame
5549
from pandas.core.dtypes.inference import is_hashable
5650
from pandas.core.dtypes.missing import (
5751
isna,
@@ -272,7 +266,7 @@ def __init__(
272266
"Cannot construct a Series from an ndarray with "
273267
"compound dtype. Use DataFrame instead."
274268
)
275-
elif isinstance(data, ABCSeries):
269+
elif isinstance(data, Series):
276270
if index is None:
277271
index = data.index
278272
else:
@@ -3549,7 +3543,7 @@ def swaplevel(self, i=-2, j=-1, copy=True) -> "Series":
35493543
Series
35503544
Series with levels swapped in MultiIndex.
35513545
"""
3552-
assert isinstance(self.index, ABCMultiIndex)
3546+
assert isinstance(self.index, MultiIndex)
35533547
new_index = self.index.swaplevel(i, j)
35543548
return self._constructor(self._values, index=new_index, copy=copy).__finalize__(
35553549
self, method="swaplevel"
@@ -3574,7 +3568,7 @@ def reorder_levels(self, order) -> "Series":
35743568
raise Exception("Can only reorder levels on a hierarchical axis.")
35753569

35763570
result = self.copy()
3577-
assert isinstance(result.index, ABCMultiIndex)
3571+
assert isinstance(result.index, MultiIndex)
35783572
result.index = result.index.reorder_levels(order)
35793573
return result
35803574

@@ -4661,8 +4655,8 @@ def to_timestamp(self, freq=None, how="start", copy=True) -> "Series":
46614655
if copy:
46624656
new_values = new_values.copy()
46634657

4664-
assert isinstance(self.index, (ABCDatetimeIndex, ABCPeriodIndex))
4665-
new_index = self.index.to_timestamp(freq=freq, how=how)
4658+
assert isinstance(self.index, PeriodIndex)
4659+
new_index = self.index.to_timestamp(freq=freq, how=how) # type: ignore
46664660
return self._constructor(new_values, index=new_index).__finalize__(
46674661
self, method="to_timestamp"
46684662
)
@@ -4688,8 +4682,8 @@ def to_period(self, freq=None, copy=True) -> "Series":
46884682
if copy:
46894683
new_values = new_values.copy()
46904684

4691-
assert isinstance(self.index, ABCDatetimeIndex)
4692-
new_index = self.index.to_period(freq=freq)
4685+
assert isinstance(self.index, DatetimeIndex)
4686+
new_index = self.index.to_period(freq=freq) # type: ignore
46934687
return self._constructor(new_values, index=new_index).__finalize__(
46944688
self, method="to_period"
46954689
)

pandas/io/formats/excel.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414

1515
from pandas.core.dtypes import missing
1616
from pandas.core.dtypes.common import is_float, is_scalar
17-
from pandas.core.dtypes.generic import ABCIndex, ABCMultiIndex, ABCPeriodIndex
17+
from pandas.core.dtypes.generic import ABCIndex
1818

19-
from pandas import Index
19+
from pandas import Index, MultiIndex, PeriodIndex
2020
import pandas.core.common as com
2121

2222
from pandas.io.common import stringify_path
@@ -465,7 +465,7 @@ def _format_header_mi(self):
465465
coloffset = 0
466466
lnum = 0
467467

468-
if self.index and isinstance(self.df.index, ABCMultiIndex):
468+
if self.index and isinstance(self.df.index, MultiIndex):
469469
coloffset = len(self.df.index[0]) - 1
470470

471471
if self.merge_cells:
@@ -507,7 +507,7 @@ def _format_header_regular(self):
507507

508508
if self.index:
509509
coloffset = 1
510-
if isinstance(self.df.index, ABCMultiIndex):
510+
if isinstance(self.df.index, MultiIndex):
511511
coloffset = len(self.df.index[0])
512512

513513
colnames = self.columns
@@ -526,7 +526,7 @@ def _format_header_regular(self):
526526
)
527527

528528
def _format_header(self):
529-
if isinstance(self.columns, ABCMultiIndex):
529+
if isinstance(self.columns, MultiIndex):
530530
gen = self._format_header_mi()
531531
else:
532532
gen = self._format_header_regular()
@@ -545,7 +545,7 @@ def _format_header(self):
545545
return itertools.chain(gen, gen2)
546546

547547
def _format_body(self):
548-
if isinstance(self.df.index, ABCMultiIndex):
548+
if isinstance(self.df.index, MultiIndex):
549549
return self._format_hierarchical_rows()
550550
else:
551551
return self._format_regular_rows()
@@ -569,15 +569,15 @@ def _format_regular_rows(self):
569569
else:
570570
index_label = self.df.index.names[0]
571571

572-
if isinstance(self.columns, ABCMultiIndex):
572+
if isinstance(self.columns, MultiIndex):
573573
self.rowcounter += 1
574574

575575
if index_label and self.header is not False:
576576
yield ExcelCell(self.rowcounter - 1, 0, index_label, self.header_style)
577577

578578
# write index_values
579579
index_values = self.df.index
580-
if isinstance(self.df.index, ABCPeriodIndex):
580+
if isinstance(self.df.index, PeriodIndex):
581581
index_values = self.df.index.to_timestamp()
582582

583583
for idx, idxval in enumerate(index_values):
@@ -609,7 +609,7 @@ def _format_hierarchical_rows(self):
609609
# with index names (blank if None) for
610610
# unambiguous round-trip, unless not merging,
611611
# in which case the names all go on one row Issue #11328
612-
if isinstance(self.columns, ABCMultiIndex) and self.merge_cells:
612+
if isinstance(self.columns, MultiIndex) and self.merge_cells:
613613
self.rowcounter += 1
614614

615615
# if index labels are not empty go ahead and dump

0 commit comments

Comments
 (0)