diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 1203cd9fbd1b3..540524df44632 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -47,6 +47,7 @@ Axis, Dtype, FilePathOrBuffer, + FrameOrSeriesUnion, IndexKeyFunc, Label, Level, @@ -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 @@ -1838,7 +1833,7 @@ def to_records( dtype=[('I', 'S1'), ('A', ' "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 @@ -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 @@ -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): @@ -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) @@ -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. @@ -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)}." ) diff --git a/pandas/core/reshape/melt.py b/pandas/core/reshape/melt.py index c3e170b0e39c4..1a315ff0ead52 100644 --- a/pandas/core/reshape/melt.py +++ b/pandas/core/reshape/melt.py @@ -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 @@ -33,7 +32,7 @@ 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) @@ -41,7 +40,7 @@ def melt( 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" ) @@ -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" ) @@ -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: diff --git a/pandas/core/series.py b/pandas/core/series.py index 64220862c3e51..b236825ac4dc8 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -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, @@ -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: @@ -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" @@ -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 @@ -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" ) @@ -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" ) diff --git a/pandas/io/formats/excel.py b/pandas/io/formats/excel.py index aac1df5dcd396..4ec20977a5e7f 100644 --- a/pandas/io/formats/excel.py +++ b/pandas/io/formats/excel.py @@ -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 @@ -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: @@ -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 @@ -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() @@ -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() @@ -569,7 +569,7 @@ 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: @@ -577,7 +577,7 @@ def _format_regular_rows(self): # 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): @@ -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 diff --git a/pandas/io/formats/format.py b/pandas/io/formats/format.py index c7eb3eeedcadf..68ad559967ece 100644 --- a/pandas/io/formats/format.py +++ b/pandas/io/formats/format.py @@ -56,12 +56,6 @@ is_scalar, is_timedelta64_dtype, ) -from pandas.core.dtypes.generic import ( - ABCDatetimeIndex, - ABCMultiIndex, - ABCPeriodIndex, - ABCTimedeltaIndex, -) from pandas.core.dtypes.missing import isna, notna from pandas.core.arrays.datetimes import DatetimeArray @@ -69,7 +63,7 @@ from pandas.core.base import PandasObject import pandas.core.common as com from pandas.core.construction import extract_array -from pandas.core.indexes.api import Index, ensure_index +from pandas.core.indexes.api import Index, MultiIndex, PeriodIndex, ensure_index from pandas.core.indexes.datetimes import DatetimeIndex from pandas.core.indexes.timedeltas import TimedeltaIndex @@ -294,7 +288,7 @@ def _get_footer(self) -> str: if getattr(self.series.index, "freq", None) is not None: assert isinstance( - self.series.index, (ABCDatetimeIndex, ABCPeriodIndex, ABCTimedeltaIndex) + self.series.index, (DatetimeIndex, PeriodIndex, TimedeltaIndex) ) footer += f"Freq: {self.series.index.freqstr}" @@ -329,7 +323,7 @@ def _get_footer(self) -> str: def _get_formatted_index(self) -> Tuple[List[str], bool]: index = self.tr_series.index - is_multi = isinstance(index, ABCMultiIndex) + is_multi = isinstance(index, MultiIndex) if is_multi: have_header = any(name for name in index.names) @@ -976,7 +970,7 @@ def _get_formatted_column_labels(self, frame: "DataFrame") -> List[List[str]]: columns = frame.columns - if isinstance(columns, ABCMultiIndex): + if isinstance(columns, MultiIndex): fmt_columns = columns.format(sparsify=False, adjoin=False) fmt_columns = list(zip(*fmt_columns)) dtypes = self.frame.dtypes._values @@ -1036,7 +1030,7 @@ def _get_formatted_index(self, frame: "DataFrame") -> List[str]: columns = frame.columns fmt = self._get_formatter("__index__") - if isinstance(index, ABCMultiIndex): + if isinstance(index, MultiIndex): fmt_index = index.format( sparsify=self.sparsify, adjoin=False, @@ -1071,7 +1065,7 @@ def _get_formatted_index(self, frame: "DataFrame") -> List[str]: def _get_column_name_list(self) -> List[str]: names: List[str] = [] columns = self.frame.columns - if isinstance(columns, ABCMultiIndex): + if isinstance(columns, MultiIndex): names.extend("" if name is None else name for name in columns.names) else: names.append("" if columns.name is None else columns.name) @@ -1767,7 +1761,7 @@ def _cond(values): def _has_names(index: Index) -> bool: - if isinstance(index, ABCMultiIndex): + if isinstance(index, MultiIndex): return com.any_not_none(*index.names) else: return index.name is not None diff --git a/pandas/io/formats/html.py b/pandas/io/formats/html.py index 1be0f977f9b20..e31d977512f1e 100644 --- a/pandas/io/formats/html.py +++ b/pandas/io/formats/html.py @@ -9,9 +9,7 @@ from pandas._libs import lib -from pandas.core.dtypes.generic import ABCMultiIndex - -from pandas import option_context +from pandas import MultiIndex, option_context from pandas.io.common import is_url from pandas.io.formats.format import ( @@ -233,7 +231,7 @@ def _write_table(self, indent: int = 0) -> None: def _write_col_header(self, indent: int) -> None: truncate_h = self.fmt.truncate_h - if isinstance(self.columns, ABCMultiIndex): + if isinstance(self.columns, MultiIndex): template = 'colspan="{span:d}" halign="left"' if self.fmt.sparsify: @@ -376,7 +374,7 @@ def _write_body(self, indent: int) -> None: fmt_values = self._get_formatted_values() # write values - if self.fmt.index and isinstance(self.frame.index, ABCMultiIndex): + if self.fmt.index and isinstance(self.frame.index, MultiIndex): self._write_hierarchical_rows(fmt_values, indent + self.indent_delta) else: self._write_regular_rows(fmt_values, indent + self.indent_delta) @@ -585,7 +583,7 @@ def write_style(self) -> None: ("tbody tr th:only-of-type", "vertical-align", "middle"), ("tbody tr th", "vertical-align", "top"), ] - if isinstance(self.columns, ABCMultiIndex): + if isinstance(self.columns, MultiIndex): element_props.append(("thead tr th", "text-align", "left")) if self.show_row_idx_names: element_props.append( diff --git a/pandas/plotting/_matplotlib/boxplot.py b/pandas/plotting/_matplotlib/boxplot.py index e36696dc23a87..4b79bef41d025 100644 --- a/pandas/plotting/_matplotlib/boxplot.py +++ b/pandas/plotting/_matplotlib/boxplot.py @@ -5,7 +5,6 @@ import numpy as np from pandas.core.dtypes.common import is_dict_like -from pandas.core.dtypes.generic import ABCSeries from pandas.core.dtypes.missing import remove_na_arraylike import pandas as pd @@ -248,7 +247,7 @@ def boxplot( if return_type not in BoxPlot._valid_return_types: raise ValueError("return_type must be {'axes', 'dict', 'both'}") - if isinstance(data, ABCSeries): + if isinstance(data, pd.Series): data = data.to_frame("x") column = "x" diff --git a/pandas/plotting/_matplotlib/converter.py b/pandas/plotting/_matplotlib/converter.py index 11c59a0903440..c6d159d3d016b 100644 --- a/pandas/plotting/_matplotlib/converter.py +++ b/pandas/plotting/_matplotlib/converter.py @@ -22,9 +22,8 @@ is_integer_dtype, is_nested_list_like, ) -from pandas.core.dtypes.generic import ABCSeries -from pandas import Index, get_option +from pandas import Index, Series, get_option import pandas.core.common as com from pandas.core.indexes.datetimes import date_range from pandas.core.indexes.period import Period, PeriodIndex, period_range @@ -252,7 +251,7 @@ def _dt_to_float_ordinal(dt): preserving hours, minutes, seconds and microseconds. Return value is a :func:`float`. """ - if isinstance(dt, (np.ndarray, Index, ABCSeries)) and is_datetime64_ns_dtype(dt): + if isinstance(dt, (np.ndarray, Index, Series)) and is_datetime64_ns_dtype(dt): base = dates.epoch2num(dt.asi8 / 1.0e9) else: base = dates.date2num(dt) @@ -288,8 +287,8 @@ def try_parse(values): return values elif isinstance(values, str): return try_parse(values) - elif isinstance(values, (list, tuple, np.ndarray, Index, ABCSeries)): - if isinstance(values, ABCSeries): + elif isinstance(values, (list, tuple, np.ndarray, Index, Series)): + if isinstance(values, Series): # https://github.com/matplotlib/matplotlib/issues/11391 # Series was skipped. Convert to DatetimeIndex to get asi8 values = Index(values) diff --git a/pandas/tests/series/test_apply.py b/pandas/tests/series/test_apply.py index 54cf307a6ee66..589f8933efa96 100644 --- a/pandas/tests/series/test_apply.py +++ b/pandas/tests/series/test_apply.py @@ -4,10 +4,8 @@ import numpy as np import pytest -from pandas.core.dtypes.generic import ABCMultiIndex - import pandas as pd -from pandas import DataFrame, Index, Series, isna +from pandas import DataFrame, Index, MultiIndex, Series, isna import pandas._testing as tm from pandas.core.base import SpecificationError @@ -519,7 +517,7 @@ def test_map(self, datetime_series): tm.assert_series_equal(a.map(c), exp) def test_map_empty(self, indices): - if isinstance(indices, ABCMultiIndex): + if isinstance(indices, MultiIndex): pytest.skip("Initializing a Series from a MultiIndex is not supported") s = Series(indices)