Skip to content

PERF: use isinstance(obj, Foo) instead of ABCFoo #34040

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

Merged
merged 10 commits into from
May 9, 2020
Merged
57 changes: 26 additions & 31 deletions pandas/core/frame.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
Axis,
Dtype,
FilePathOrBuffer,
FrameOrSeriesUnion,
IndexKeyFunc,
Label,
Level,
Expand Down Expand Up @@ -106,12 +107,6 @@
needs_i8_conversion,
pandas_dtype,
)
from pandas.core.dtypes.generic import (
ABCDataFrame,
ABCIndexClass,
ABCMultiIndex,
ABCSeries,
)
from pandas.core.dtypes.missing import isna, notna

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

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

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

# broadcast across multiple columns if necessary
if broadcast and key in self.columns and value.ndim == 1:
if not self.columns.is_unique or isinstance(self.columns, ABCMultiIndex):
if not self.columns.is_unique or isinstance(self.columns, MultiIndex):
existing_piece = self[key]
if isinstance(existing_piece, DataFrame):
value = np.tile(value, (len(existing_piece.columns), 1))
Expand Down Expand Up @@ -4337,9 +4332,7 @@ def set_index(

missing: List[Label] = []
for col in keys:
if isinstance(
col, (ABCIndexClass, ABCSeries, np.ndarray, list, abc.Iterator)
):
if isinstance(col, (Index, Series, np.ndarray, list, abc.Iterator)):
# arrays are fine as long as they are one-dimensional
# iterators get converted to list below
if getattr(col, "ndim", 1) != 1:
Expand Down Expand Up @@ -4368,19 +4361,19 @@ def set_index(
names = []
if append:
names = list(self.index.names)
if isinstance(self.index, ABCMultiIndex):
if isinstance(self.index, MultiIndex):
for i in range(self.index.nlevels):
arrays.append(self.index._get_level_values(i))
else:
arrays.append(self.index)

to_remove: List[Label] = []
for col in keys:
if isinstance(col, ABCMultiIndex):
if isinstance(col, MultiIndex):
for n in range(col.nlevels):
arrays.append(col._get_level_values(n))
names.extend(col.names)
elif isinstance(col, (ABCIndexClass, ABCSeries)):
elif isinstance(col, (Index, Series)):
# if Index then not MultiIndex (treated above)
arrays.append(col)
names.append(col.name)
Expand Down Expand Up @@ -4625,7 +4618,7 @@ def _maybe_casted_values(index, labels=None):

if not drop:
to_insert: Iterable[Tuple[Any, Optional[Any]]]
if isinstance(self.index, ABCMultiIndex):
if isinstance(self.index, MultiIndex):
names = [
(n if n is not None else f"level_{i}")
for i, n in enumerate(self.index.names)
Expand All @@ -4636,7 +4629,7 @@ def _maybe_casted_values(index, labels=None):
names = [default] if self.index.name is None else [self.index.name]
to_insert = ((self.index, None),)

multi_col = isinstance(self.columns, ABCMultiIndex)
multi_col = isinstance(self.columns, MultiIndex)
for i, (lev, lab) in reversed(list(enumerate(to_insert))):
if not (level is None or i in level):
continue
Expand Down Expand Up @@ -5240,7 +5233,7 @@ def sort_index(
level, ascending=ascending, sort_remaining=sort_remaining
)

elif isinstance(labels, ABCMultiIndex):
elif isinstance(labels, MultiIndex):
from pandas.core.sorting import lexsort_indexer

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

axis = self._get_axis_number(axis)

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

if axis == 0:
assert isinstance(result.index, ABCMultiIndex)
assert isinstance(result.index, MultiIndex)
result.index = result.index.swaplevel(i, j)
else:
assert isinstance(result.columns, ABCMultiIndex)
assert isinstance(result.columns, MultiIndex)
result.columns = result.columns.swaplevel(i, j)
return result

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

result = self.copy()

if axis == 0:
assert isinstance(result.index, ABCMultiIndex)
assert isinstance(result.index, MultiIndex)
result.index = result.index.reorder_levels(order)
else:
assert isinstance(result.columns, ABCMultiIndex)
assert isinstance(result.columns, MultiIndex)
result.columns = result.columns.reorder_levels(order)
return result

Expand Down Expand Up @@ -5913,7 +5906,8 @@ def extract_values(arr):
# Does two things:
# 1. maybe gets the values from the Series / Index
# 2. convert datelike to i8
if isinstance(arr, (ABCIndexClass, ABCSeries)):
# TODO: extract_array?
if isinstance(arr, (Index, Series)):
arr = arr._values

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

def combiner(x, y):
mask = isna(x)
if isinstance(mask, (ABCIndexClass, ABCSeries)):
# TODO: extract_array?
if isinstance(mask, (Index, Series)):
mask = mask._values

x_values = extract_values(x)
Expand Down Expand Up @@ -7020,8 +7015,8 @@ def _gotitem(
self,
key: Union[str, List[str]],
ndim: int,
subset: Optional[Union[Series, ABCDataFrame]] = None,
) -> Union[Series, ABCDataFrame]:
subset: Optional[FrameOrSeriesUnion] = None,
) -> FrameOrSeriesUnion:
"""
Sub-classes to define. Return a sliced object.

Expand Down Expand Up @@ -8225,7 +8220,7 @@ def _count_level(self, level, axis=0, numeric_only=False):
count_axis = frame._get_axis(axis)
agg_axis = frame._get_agg_axis(axis)

if not isinstance(count_axis, ABCMultiIndex):
if not isinstance(count_axis, MultiIndex):
raise TypeError(
f"Can only count levels on hierarchical {self._get_axis_name(axis)}."
)
Expand Down
13 changes: 5 additions & 8 deletions pandas/core/reshape/melt.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,12 @@

from pandas.core.dtypes.common import is_extension_array_dtype, is_list_like
from pandas.core.dtypes.concat import concat_compat
from pandas.core.dtypes.generic import ABCMultiIndex
from pandas.core.dtypes.missing import notna

from pandas.core.arrays import Categorical
import pandas.core.common as com
from pandas.core.frame import DataFrame, _shared_docs
from pandas.core.indexes.base import Index
from pandas.core.indexes.api import Index, MultiIndex
from pandas.core.reshape.concat import concat
from pandas.core.tools.numeric import to_numeric

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

if id_vars is not None:
if not is_list_like(id_vars):
id_vars = [id_vars]
elif isinstance(frame.columns, ABCMultiIndex) and not isinstance(id_vars, list):
elif isinstance(frame.columns, MultiIndex) and not isinstance(id_vars, list):
raise ValueError(
"id_vars must be a list of tuples when columns are a MultiIndex"
)
Expand All @@ -60,9 +59,7 @@ def melt(
if value_vars is not None:
if not is_list_like(value_vars):
value_vars = [value_vars]
elif isinstance(frame.columns, ABCMultiIndex) and not isinstance(
value_vars, list
):
elif isinstance(frame.columns, MultiIndex) and not isinstance(value_vars, list):
raise ValueError(
"value_vars must be a list of tuples when columns are a MultiIndex"
)
Expand All @@ -84,7 +81,7 @@ def melt(
frame.columns = frame.columns.get_level_values(col_level)

if var_name is None:
if isinstance(frame.columns, ABCMultiIndex):
if isinstance(frame.columns, MultiIndex):
if len(frame.columns.names) == len(set(frame.columns.names)):
var_name = frame.columns.names
else:
Expand Down
22 changes: 8 additions & 14 deletions pandas/core/series.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,7 @@
is_object_dtype,
is_scalar,
)
from pandas.core.dtypes.generic import (
ABCDataFrame,
ABCDatetimeIndex,
ABCMultiIndex,
ABCPeriodIndex,
ABCSeries,
)
from pandas.core.dtypes.generic import ABCDataFrame
from pandas.core.dtypes.inference import is_hashable
from pandas.core.dtypes.missing import (
isna,
Expand Down Expand Up @@ -272,7 +266,7 @@ def __init__(
"Cannot construct a Series from an ndarray with "
"compound dtype. Use DataFrame instead."
)
elif isinstance(data, ABCSeries):
elif isinstance(data, Series):
if index is None:
index = data.index
else:
Expand Down Expand Up @@ -3549,7 +3543,7 @@ def swaplevel(self, i=-2, j=-1, copy=True) -> "Series":
Series
Series with levels swapped in MultiIndex.
"""
assert isinstance(self.index, ABCMultiIndex)
assert isinstance(self.index, MultiIndex)
new_index = self.index.swaplevel(i, j)
return self._constructor(self._values, index=new_index, copy=copy).__finalize__(
self, method="swaplevel"
Expand All @@ -3574,7 +3568,7 @@ def reorder_levels(self, order) -> "Series":
raise Exception("Can only reorder levels on a hierarchical axis.")

result = self.copy()
assert isinstance(result.index, ABCMultiIndex)
assert isinstance(result.index, MultiIndex)
result.index = result.index.reorder_levels(order)
return result

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

assert isinstance(self.index, (ABCDatetimeIndex, ABCPeriodIndex))
new_index = self.index.to_timestamp(freq=freq, how=how)
assert isinstance(self.index, PeriodIndex)
new_index = self.index.to_timestamp(freq=freq, how=how) # type: ignore
return self._constructor(new_values, index=new_index).__finalize__(
self, method="to_timestamp"
)
Expand All @@ -4688,8 +4682,8 @@ def to_period(self, freq=None, copy=True) -> "Series":
if copy:
new_values = new_values.copy()

assert isinstance(self.index, ABCDatetimeIndex)
new_index = self.index.to_period(freq=freq)
assert isinstance(self.index, DatetimeIndex)
new_index = self.index.to_period(freq=freq) # type: ignore
return self._constructor(new_values, index=new_index).__finalize__(
self, method="to_period"
)
Expand Down
18 changes: 9 additions & 9 deletions pandas/io/formats/excel.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@

from pandas.core.dtypes import missing
from pandas.core.dtypes.common import is_float, is_scalar
from pandas.core.dtypes.generic import ABCIndex, ABCMultiIndex, ABCPeriodIndex
from pandas.core.dtypes.generic import ABCIndex

from pandas import Index
from pandas import Index, MultiIndex, PeriodIndex
import pandas.core.common as com

from pandas.io.common import stringify_path
Expand Down Expand Up @@ -465,7 +465,7 @@ def _format_header_mi(self):
coloffset = 0
lnum = 0

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

if self.merge_cells:
Expand Down Expand Up @@ -507,7 +507,7 @@ def _format_header_regular(self):

if self.index:
coloffset = 1
if isinstance(self.df.index, ABCMultiIndex):
if isinstance(self.df.index, MultiIndex):
coloffset = len(self.df.index[0])

colnames = self.columns
Expand All @@ -526,7 +526,7 @@ def _format_header_regular(self):
)

def _format_header(self):
if isinstance(self.columns, ABCMultiIndex):
if isinstance(self.columns, MultiIndex):
gen = self._format_header_mi()
else:
gen = self._format_header_regular()
Expand All @@ -545,7 +545,7 @@ def _format_header(self):
return itertools.chain(gen, gen2)

def _format_body(self):
if isinstance(self.df.index, ABCMultiIndex):
if isinstance(self.df.index, MultiIndex):
return self._format_hierarchical_rows()
else:
return self._format_regular_rows()
Expand All @@ -569,15 +569,15 @@ def _format_regular_rows(self):
else:
index_label = self.df.index.names[0]

if isinstance(self.columns, ABCMultiIndex):
if isinstance(self.columns, MultiIndex):
self.rowcounter += 1

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

# write index_values
index_values = self.df.index
if isinstance(self.df.index, ABCPeriodIndex):
if isinstance(self.df.index, PeriodIndex):
index_values = self.df.index.to_timestamp()

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

# if index labels are not empty go ahead and dump
Expand Down
Loading