From c91ce7cc3c5af96951aad7ae7c70746f6f652dcb Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Tue, 13 Dec 2022 21:11:45 +0000 Subject: [PATCH 01/13] DEPR: deprecate Index.holds_integer --- doc/source/whatsnew/v2.0.0.rst | 1 + pandas/core/dtypes/common.py | 7 +++++++ pandas/core/indexes/base.py | 14 ++++++++++++-- pandas/plotting/_core.py | 7 ++++--- pandas/plotting/_matplotlib/core.py | 9 +++++---- pandas/tests/indexes/common.py | 6 ++++++ 6 files changed, 35 insertions(+), 9 deletions(-) diff --git a/doc/source/whatsnew/v2.0.0.rst b/doc/source/whatsnew/v2.0.0.rst index 7efb199bb2edb..bc78c20f9cce7 100644 --- a/doc/source/whatsnew/v2.0.0.rst +++ b/doc/source/whatsnew/v2.0.0.rst @@ -575,6 +575,7 @@ Deprecations - Deprecated :func:`pandas.io.sql.execute`(:issue:`50185`) - :meth:`Index.is_integer` has been deprecated. Use :func:`pandas.api.types.is_integer_dtype` instead (:issue:`50042`) - :meth:`Index.is_floating` has been deprecated. Use :func:`pandas.api.types.is_float_dtype` instead (:issue:`50042`) +- :meth:`Index.holds_integer` has been deprecated. Use :func:`pandas.api.types.infer_dtype` instead (:issue:`xxxxx`) .. --------------------------------------------------------------------------- .. _whatsnew_200.prior_deprecations: diff --git a/pandas/core/dtypes/common.py b/pandas/core/dtypes/common.py index aa3cdcd65b344..018013637cc1b 100644 --- a/pandas/core/dtypes/common.py +++ b/pandas/core/dtypes/common.py @@ -1609,6 +1609,13 @@ def infer_dtype_from_object(dtype) -> type: return infer_dtype_from_object(np.dtype(dtype)) +def holds_integer(value) -> bool: + """ + Whether the type is an integer type. + """ + return lib.infer_dtype(value) in ["integer", "mixed-integer"] + + def _validate_date_like_dtype(dtype) -> None: """ Check whether the dtype is a date-like dtype. Raises an error if invalid. diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index ea684c0693d8b..9c0a406a934ce 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -88,6 +88,7 @@ ensure_int64, ensure_object, ensure_platform_int, + holds_integer, is_bool_dtype, is_categorical_dtype, is_complex_dtype, @@ -2481,8 +2482,17 @@ def is_interval(self) -> bool: def holds_integer(self) -> bool: """ Whether the type is an integer type. + + .. deprecated:: 2.0.0 + Use `pandas.api.types.infer_dtype` instead """ - return self.inferred_type in ["integer", "mixed-integer"] + warnings.warn( + f"{type(self).__name__}.holds_integer is deprecated." + "Use pandas.api.types.infer_dtype instead", + FutureWarning, + stacklevel=find_stack_level(), + ) + return holds_integer(self._values) @cache_readonly def inferred_type(self) -> str_t: @@ -5528,7 +5538,7 @@ def _should_fallback_to_positional(self) -> bool: """ Should an integer key be treated as positional? """ - return not self.holds_integer() + return not holds_integer(self) _index_shared_docs[ "get_indexer_non_unique" diff --git a/pandas/plotting/_core.py b/pandas/plotting/_core.py index 2dc236a033415..b607164e54d26 100644 --- a/pandas/plotting/_core.py +++ b/pandas/plotting/_core.py @@ -16,6 +16,7 @@ ) from pandas.core.dtypes.common import ( + holds_integer, is_integer, is_list_like, ) @@ -940,7 +941,7 @@ def __call__(self, *args, **kwargs): f"{kind} requires either y column or 'subplots=True'" ) if y is not None: - if is_integer(y) and not data.columns.holds_integer(): + if is_integer(y) and not holds_integer(data.columns): y = data.columns[y] # converted to series actually. copy to not modify data = data[y].copy() @@ -948,7 +949,7 @@ def __call__(self, *args, **kwargs): elif isinstance(data, ABCDataFrame): data_cols = data.columns if x is not None: - if is_integer(x) and not data.columns.holds_integer(): + if is_integer(x) and not holds_integer(data.columns): x = data_cols[x] elif not isinstance(data[x], ABCSeries): raise ValueError("x must be a label or position") @@ -957,7 +958,7 @@ def __call__(self, *args, **kwargs): # check if we have y as int or list of ints int_ylist = is_list_like(y) and all(is_integer(c) for c in y) int_y_arg = is_integer(y) or int_ylist - if int_y_arg and not data.columns.holds_integer(): + if int_y_arg and not holds_integer(data.columns): y = data_cols[y] label_kw = kwargs["label"] if "label" in kwargs else False diff --git a/pandas/plotting/_matplotlib/core.py b/pandas/plotting/_matplotlib/core.py index 3277ec06df650..0bd744ad77343 100644 --- a/pandas/plotting/_matplotlib/core.py +++ b/pandas/plotting/_matplotlib/core.py @@ -27,6 +27,7 @@ from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( + holds_integer, is_categorical_dtype, is_extension_array_dtype, is_float, @@ -1137,9 +1138,9 @@ def __init__(self, data, x, y, **kwargs) -> None: MPLPlot.__init__(self, data, **kwargs) if x is None or y is None: raise ValueError(self._kind + " requires an x and y column") - if is_integer(x) and not self.data.columns.holds_integer(): + if is_integer(x) and not holds_integer(self.data.columns): x = self.data.columns[x] - if is_integer(y) and not self.data.columns.holds_integer(): + if is_integer(y) and not holds_integer(self.data.columns): y = self.data.columns[y] # Scatter plot allows to plot objects data @@ -1196,7 +1197,7 @@ def __init__(self, data, x, y, s=None, c=None, **kwargs) -> None: elif is_hashable(s) and s in data.columns: s = data[s] super().__init__(data, x, y, s=s, **kwargs) - if is_integer(c) and not self.data.columns.holds_integer(): + if is_integer(c) and not holds_integer(self.data.columns.holds): c = self.data.columns[c] self.c = c @@ -1291,7 +1292,7 @@ def _kind(self) -> Literal["hexbin"]: def __init__(self, data, x, y, C=None, **kwargs) -> None: super().__init__(data, x, y, **kwargs) - if is_integer(C) and not self.data.columns.holds_integer(): + if is_integer(C) and not holds_integer(self.data.columns): C = self.data.columns[C] self.C = C diff --git a/pandas/tests/indexes/common.py b/pandas/tests/indexes/common.py index 9063d5cf5d60a..d63bf588ec5ef 100644 --- a/pandas/tests/indexes/common.py +++ b/pandas/tests/indexes/common.py @@ -809,6 +809,12 @@ def test_is_integer_is_deprecated(self, simple_index): with tm.assert_produces_warning(FutureWarning): idx.is_integer() + def test_holds_integer_deprecated(selfm, simple_index): + # GHXXXXX + idx = simple_index + with tm.assert_produces_warning(FutureWarning): + idx.holds_integer() + class NumericBase(Base): """ From 72738f2dea2cef6b18098fb74163aef3483eb86d Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Tue, 13 Dec 2022 21:22:21 +0000 Subject: [PATCH 02/13] add GH number --- doc/source/whatsnew/v2.0.0.rst | 2 +- pandas/tests/indexes/common.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/whatsnew/v2.0.0.rst b/doc/source/whatsnew/v2.0.0.rst index bc78c20f9cce7..b85abe39dccc9 100644 --- a/doc/source/whatsnew/v2.0.0.rst +++ b/doc/source/whatsnew/v2.0.0.rst @@ -575,7 +575,7 @@ Deprecations - Deprecated :func:`pandas.io.sql.execute`(:issue:`50185`) - :meth:`Index.is_integer` has been deprecated. Use :func:`pandas.api.types.is_integer_dtype` instead (:issue:`50042`) - :meth:`Index.is_floating` has been deprecated. Use :func:`pandas.api.types.is_float_dtype` instead (:issue:`50042`) -- :meth:`Index.holds_integer` has been deprecated. Use :func:`pandas.api.types.infer_dtype` instead (:issue:`xxxxx`) +- :meth:`Index.holds_integer` has been deprecated. Use :func:`pandas.api.types.infer_dtype` instead (:issue:`50243`) .. --------------------------------------------------------------------------- .. _whatsnew_200.prior_deprecations: diff --git a/pandas/tests/indexes/common.py b/pandas/tests/indexes/common.py index d63bf588ec5ef..257e20586e6a9 100644 --- a/pandas/tests/indexes/common.py +++ b/pandas/tests/indexes/common.py @@ -810,7 +810,7 @@ def test_is_integer_is_deprecated(self, simple_index): idx.is_integer() def test_holds_integer_deprecated(selfm, simple_index): - # GHXXXXX + # GH50243 idx = simple_index with tm.assert_produces_warning(FutureWarning): idx.holds_integer() From 876f779b52c2a08025dbb871ae81faeed5a3cd9e Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Tue, 13 Dec 2022 22:09:20 +0000 Subject: [PATCH 03/13] pylint fix --- pandas/tests/indexes/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/indexes/common.py b/pandas/tests/indexes/common.py index 257e20586e6a9..94caf756a01fd 100644 --- a/pandas/tests/indexes/common.py +++ b/pandas/tests/indexes/common.py @@ -809,7 +809,7 @@ def test_is_integer_is_deprecated(self, simple_index): with tm.assert_produces_warning(FutureWarning): idx.is_integer() - def test_holds_integer_deprecated(selfm, simple_index): + def test_holds_integer_deprecated(self, simple_index): # GH50243 idx = simple_index with tm.assert_produces_warning(FutureWarning): From e6e8afefb67086c61b7155e5235c5f22b3edd25f Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Tue, 13 Dec 2022 23:11:25 +0000 Subject: [PATCH 04/13] attribute fix --- pandas/plotting/_matplotlib/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/plotting/_matplotlib/core.py b/pandas/plotting/_matplotlib/core.py index 0bd744ad77343..6a89f12890171 100644 --- a/pandas/plotting/_matplotlib/core.py +++ b/pandas/plotting/_matplotlib/core.py @@ -1197,7 +1197,7 @@ def __init__(self, data, x, y, s=None, c=None, **kwargs) -> None: elif is_hashable(s) and s in data.columns: s = data[s] super().__init__(data, x, y, s=s, **kwargs) - if is_integer(c) and not holds_integer(self.data.columns.holds): + if is_integer(c) and not holds_integer(self.data.columns): c = self.data.columns[c] self.c = c From 2d908f944264e225b786be32808cbd96a4c4d6fb Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Wed, 14 Dec 2022 21:59:58 +0000 Subject: [PATCH 05/13] remove usage of hold_integer, keep .inferred_type --- pandas/core/dtypes/common.py | 7 ------- pandas/core/indexes/base.py | 5 ++--- pandas/plotting/_core.py | 8 ++++---- pandas/plotting/_matplotlib/core.py | 9 ++++----- 4 files changed, 10 insertions(+), 19 deletions(-) diff --git a/pandas/core/dtypes/common.py b/pandas/core/dtypes/common.py index 018013637cc1b..aa3cdcd65b344 100644 --- a/pandas/core/dtypes/common.py +++ b/pandas/core/dtypes/common.py @@ -1609,13 +1609,6 @@ def infer_dtype_from_object(dtype) -> type: return infer_dtype_from_object(np.dtype(dtype)) -def holds_integer(value) -> bool: - """ - Whether the type is an integer type. - """ - return lib.infer_dtype(value) in ["integer", "mixed-integer"] - - def _validate_date_like_dtype(dtype) -> None: """ Check whether the dtype is a date-like dtype. Raises an error if invalid. diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 9c0a406a934ce..0e04707d35e39 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -88,7 +88,6 @@ ensure_int64, ensure_object, ensure_platform_int, - holds_integer, is_bool_dtype, is_categorical_dtype, is_complex_dtype, @@ -2492,7 +2491,7 @@ def holds_integer(self) -> bool: FutureWarning, stacklevel=find_stack_level(), ) - return holds_integer(self._values) + return self.inferred_type in ["integer", "mixed-integer"] @cache_readonly def inferred_type(self) -> str_t: @@ -5538,7 +5537,7 @@ def _should_fallback_to_positional(self) -> bool: """ Should an integer key be treated as positional? """ - return not holds_integer(self) + return self.inferred_type not in ["integer", "mixed-integer"] _index_shared_docs[ "get_indexer_non_unique" diff --git a/pandas/plotting/_core.py b/pandas/plotting/_core.py index b607164e54d26..9e302f6176872 100644 --- a/pandas/plotting/_core.py +++ b/pandas/plotting/_core.py @@ -16,8 +16,8 @@ ) from pandas.core.dtypes.common import ( - holds_integer, is_integer, + is_integer_dtype, is_list_like, ) from pandas.core.dtypes.generic import ( @@ -941,7 +941,7 @@ def __call__(self, *args, **kwargs): f"{kind} requires either y column or 'subplots=True'" ) if y is not None: - if is_integer(y) and not holds_integer(data.columns): + if is_integer(y) and not is_integer_dtype(data.columns): y = data.columns[y] # converted to series actually. copy to not modify data = data[y].copy() @@ -949,7 +949,7 @@ def __call__(self, *args, **kwargs): elif isinstance(data, ABCDataFrame): data_cols = data.columns if x is not None: - if is_integer(x) and not holds_integer(data.columns): + if is_integer(x) and not is_integer_dtype(data.columns): x = data_cols[x] elif not isinstance(data[x], ABCSeries): raise ValueError("x must be a label or position") @@ -958,7 +958,7 @@ def __call__(self, *args, **kwargs): # check if we have y as int or list of ints int_ylist = is_list_like(y) and all(is_integer(c) for c in y) int_y_arg = is_integer(y) or int_ylist - if int_y_arg and not holds_integer(data.columns): + if int_y_arg and not is_integer_dtype(data.columns): y = data_cols[y] label_kw = kwargs["label"] if "label" in kwargs else False diff --git a/pandas/plotting/_matplotlib/core.py b/pandas/plotting/_matplotlib/core.py index 6a89f12890171..93f28ae91198d 100644 --- a/pandas/plotting/_matplotlib/core.py +++ b/pandas/plotting/_matplotlib/core.py @@ -27,7 +27,6 @@ from pandas.util._exceptions import find_stack_level from pandas.core.dtypes.common import ( - holds_integer, is_categorical_dtype, is_extension_array_dtype, is_float, @@ -1138,9 +1137,9 @@ def __init__(self, data, x, y, **kwargs) -> None: MPLPlot.__init__(self, data, **kwargs) if x is None or y is None: raise ValueError(self._kind + " requires an x and y column") - if is_integer(x) and not holds_integer(self.data.columns): + if is_integer(x) and not is_integer_dtype(self.data.columns): x = self.data.columns[x] - if is_integer(y) and not holds_integer(self.data.columns): + if is_integer(y) and not is_integer_dtype(self.data.columns): y = self.data.columns[y] # Scatter plot allows to plot objects data @@ -1197,7 +1196,7 @@ def __init__(self, data, x, y, s=None, c=None, **kwargs) -> None: elif is_hashable(s) and s in data.columns: s = data[s] super().__init__(data, x, y, s=s, **kwargs) - if is_integer(c) and not holds_integer(self.data.columns): + if is_integer(c) and not is_integer_dtype(self.data.columns): c = self.data.columns[c] self.c = c @@ -1292,7 +1291,7 @@ def _kind(self) -> Literal["hexbin"]: def __init__(self, data, x, y, C=None, **kwargs) -> None: super().__init__(data, x, y, **kwargs) - if is_integer(C) and not holds_integer(self.data.columns): + if is_integer(C) and not is_integer_dtype(self.data.columns): C = self.data.columns[C] self.C = C From 2289453ddf5521cd0b0215743938265019267c4a Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Wed, 14 Dec 2022 23:40:29 +0000 Subject: [PATCH 06/13] update Index._should_fallback_to_positional --- pandas/core/indexes/base.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 0e04707d35e39..bb0eac0588e96 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -5537,7 +5537,13 @@ def _should_fallback_to_positional(self) -> bool: """ Should an integer key be treated as positional? """ - return self.inferred_type not in ["integer", "mixed-integer"] + if is_integer_dtype(self): + return False + elif is_object_dtype(self): + inferred_dtype = lib.infer_dtype(self._values, skipna=False) + return inferred_dtype not in ["integer", "mixed-integer"] + else: + return True _index_shared_docs[ "get_indexer_non_unique" From dfb36b0bbc57de75c6ead3d153cc0fdfc44e6fad Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Wed, 14 Dec 2022 23:58:45 +0000 Subject: [PATCH 07/13] use ._should_fallback_to_positional --- pandas/plotting/_core.py | 7 +++---- pandas/plotting/_matplotlib/core.py | 8 ++++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/pandas/plotting/_core.py b/pandas/plotting/_core.py index 9e302f6176872..f74f870cc3d03 100644 --- a/pandas/plotting/_core.py +++ b/pandas/plotting/_core.py @@ -17,7 +17,6 @@ from pandas.core.dtypes.common import ( is_integer, - is_integer_dtype, is_list_like, ) from pandas.core.dtypes.generic import ( @@ -941,7 +940,7 @@ def __call__(self, *args, **kwargs): f"{kind} requires either y column or 'subplots=True'" ) if y is not None: - if is_integer(y) and not is_integer_dtype(data.columns): + if is_integer(y) and data.columns._should_fallback_to_positional: y = data.columns[y] # converted to series actually. copy to not modify data = data[y].copy() @@ -949,7 +948,7 @@ def __call__(self, *args, **kwargs): elif isinstance(data, ABCDataFrame): data_cols = data.columns if x is not None: - if is_integer(x) and not is_integer_dtype(data.columns): + if is_integer(x) and data.columns._should_fallback_to_positional: x = data_cols[x] elif not isinstance(data[x], ABCSeries): raise ValueError("x must be a label or position") @@ -958,7 +957,7 @@ def __call__(self, *args, **kwargs): # check if we have y as int or list of ints int_ylist = is_list_like(y) and all(is_integer(c) for c in y) int_y_arg = is_integer(y) or int_ylist - if int_y_arg and not is_integer_dtype(data.columns): + if int_y_arg and data.columns._should_fallback_to_positional: y = data_cols[y] label_kw = kwargs["label"] if "label" in kwargs else False diff --git a/pandas/plotting/_matplotlib/core.py b/pandas/plotting/_matplotlib/core.py index 93f28ae91198d..3ff11454c8fa8 100644 --- a/pandas/plotting/_matplotlib/core.py +++ b/pandas/plotting/_matplotlib/core.py @@ -1137,9 +1137,9 @@ def __init__(self, data, x, y, **kwargs) -> None: MPLPlot.__init__(self, data, **kwargs) if x is None or y is None: raise ValueError(self._kind + " requires an x and y column") - if is_integer(x) and not is_integer_dtype(self.data.columns): + if is_integer(x) and self.data.columns._should_fallback_to_positional: x = self.data.columns[x] - if is_integer(y) and not is_integer_dtype(self.data.columns): + if is_integer(y) and self.data.columns._should_fallback_to_positional: y = self.data.columns[y] # Scatter plot allows to plot objects data @@ -1196,7 +1196,7 @@ def __init__(self, data, x, y, s=None, c=None, **kwargs) -> None: elif is_hashable(s) and s in data.columns: s = data[s] super().__init__(data, x, y, s=s, **kwargs) - if is_integer(c) and not is_integer_dtype(self.data.columns): + if is_integer(c) and self.data.columns._should_fallback_to_positional: c = self.data.columns[c] self.c = c @@ -1291,7 +1291,7 @@ def _kind(self) -> Literal["hexbin"]: def __init__(self, data, x, y, C=None, **kwargs) -> None: super().__init__(data, x, y, **kwargs) - if is_integer(C) and not is_integer_dtype(self.data.columns): + if is_integer(C) and self.data.columns._should_fallback_to_positional: C = self.data.columns[C] self.C = C From 2f42299f2cc2a117babe0a1282699f8c9131a122 Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Thu, 15 Dec 2022 00:10:24 +0000 Subject: [PATCH 08/13] small fix --- pandas/core/indexes/base.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index bb0eac0588e96..718437b10e6c3 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -5540,8 +5540,7 @@ def _should_fallback_to_positional(self) -> bool: if is_integer_dtype(self): return False elif is_object_dtype(self): - inferred_dtype = lib.infer_dtype(self._values, skipna=False) - return inferred_dtype not in ["integer", "mixed-integer"] + return self.inferred_type not in ["integer", "mixed-integer"] else: return True From 5a53f93f44eb25e5cef492531b2881f4a231d480 Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Fri, 16 Dec 2022 00:26:39 +0000 Subject: [PATCH 09/13] refactor to have ._holds_integer --- pandas/core/indexes/base.py | 17 +++++++++-------- pandas/tests/indexes/common.py | 6 +++++- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 718437b10e6c3..443398c19a1af 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -98,7 +98,6 @@ is_float_dtype, is_hashable, is_integer, - is_integer_dtype, is_interval_dtype, is_iterator, is_list_like, @@ -2477,6 +2476,13 @@ def is_interval(self) -> bool: """ return self.inferred_type in ["interval"] + @final + def _holds_integer(self) -> bool: + """ + Whether the type is an integer type. + """ + return self.inferred_type in ["integer", "mixed-integer"] + @final def holds_integer(self) -> bool: """ @@ -2491,7 +2497,7 @@ def holds_integer(self) -> bool: FutureWarning, stacklevel=find_stack_level(), ) - return self.inferred_type in ["integer", "mixed-integer"] + return self._holds_integer() @cache_readonly def inferred_type(self) -> str_t: @@ -5537,12 +5543,7 @@ def _should_fallback_to_positional(self) -> bool: """ Should an integer key be treated as positional? """ - if is_integer_dtype(self): - return False - elif is_object_dtype(self): - return self.inferred_type not in ["integer", "mixed-integer"] - else: - return True + return not self._holds_integer() _index_shared_docs[ "get_indexer_non_unique" diff --git a/pandas/tests/indexes/common.py b/pandas/tests/indexes/common.py index 94caf756a01fd..20a07d71372f0 100644 --- a/pandas/tests/indexes/common.py +++ b/pandas/tests/indexes/common.py @@ -812,7 +812,11 @@ def test_is_integer_is_deprecated(self, simple_index): def test_holds_integer_deprecated(self, simple_index): # GH50243 idx = simple_index - with tm.assert_produces_warning(FutureWarning): + msg = ( + f"{type(idx).__name__}.holds_integer is deprecated." + "Use pandas.api.types.infer_dtype instead" + ) + with tm.assert_produces_warning(FutureWarning, match=msg): idx.holds_integer() From 529106407872a097562b0ef7df0387fc60d27b30 Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Tue, 20 Dec 2022 22:09:52 +0000 Subject: [PATCH 10/13] use _holds_integer in plotting._core.py --- pandas/plotting/_core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/plotting/_core.py b/pandas/plotting/_core.py index f74f870cc3d03..723342887b9fa 100644 --- a/pandas/plotting/_core.py +++ b/pandas/plotting/_core.py @@ -940,7 +940,7 @@ def __call__(self, *args, **kwargs): f"{kind} requires either y column or 'subplots=True'" ) if y is not None: - if is_integer(y) and data.columns._should_fallback_to_positional: + if is_integer(y) and not data.columns._holds_integer(): y = data.columns[y] # converted to series actually. copy to not modify data = data[y].copy() @@ -948,7 +948,7 @@ def __call__(self, *args, **kwargs): elif isinstance(data, ABCDataFrame): data_cols = data.columns if x is not None: - if is_integer(x) and data.columns._should_fallback_to_positional: + if is_integer(x) and not data.columns._holds_integer(): x = data_cols[x] elif not isinstance(data[x], ABCSeries): raise ValueError("x must be a label or position") From ed7ce688125b5a1401bfb4a77efb1db02c52f285 Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Wed, 28 Dec 2022 00:45:40 +0000 Subject: [PATCH 11/13] use _holds_integer in plotting._atplotlib.core.py --- pandas/plotting/_matplotlib/core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/plotting/_matplotlib/core.py b/pandas/plotting/_matplotlib/core.py index 3ff11454c8fa8..1c4dfce75c17d 100644 --- a/pandas/plotting/_matplotlib/core.py +++ b/pandas/plotting/_matplotlib/core.py @@ -1196,7 +1196,7 @@ def __init__(self, data, x, y, s=None, c=None, **kwargs) -> None: elif is_hashable(s) and s in data.columns: s = data[s] super().__init__(data, x, y, s=s, **kwargs) - if is_integer(c) and self.data.columns._should_fallback_to_positional: + if is_integer(c) and self.data.columns._holds_integer(): c = self.data.columns[c] self.c = c @@ -1291,7 +1291,7 @@ def _kind(self) -> Literal["hexbin"]: def __init__(self, data, x, y, C=None, **kwargs) -> None: super().__init__(data, x, y, **kwargs) - if is_integer(C) and self.data.columns._should_fallback_to_positional: + if is_integer(C) and self.data.columns._holds_integer(): C = self.data.columns[C] self.C = C From ca3c9f3763d35ef1b470aeb34fffa2c9dceea4b8 Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Wed, 28 Dec 2022 08:03:44 +0000 Subject: [PATCH 12/13] fix use of Index._holds_integer --- pandas/plotting/_core.py | 2 +- pandas/plotting/_matplotlib/core.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pandas/plotting/_core.py b/pandas/plotting/_core.py index 723342887b9fa..fbd1eef138792 100644 --- a/pandas/plotting/_core.py +++ b/pandas/plotting/_core.py @@ -957,7 +957,7 @@ def __call__(self, *args, **kwargs): # check if we have y as int or list of ints int_ylist = is_list_like(y) and all(is_integer(c) for c in y) int_y_arg = is_integer(y) or int_ylist - if int_y_arg and data.columns._should_fallback_to_positional: + if int_y_arg and not data.columns._holds_integer(): y = data_cols[y] label_kw = kwargs["label"] if "label" in kwargs else False diff --git a/pandas/plotting/_matplotlib/core.py b/pandas/plotting/_matplotlib/core.py index 1c4dfce75c17d..fd17e57a16c4b 100644 --- a/pandas/plotting/_matplotlib/core.py +++ b/pandas/plotting/_matplotlib/core.py @@ -1137,9 +1137,9 @@ def __init__(self, data, x, y, **kwargs) -> None: MPLPlot.__init__(self, data, **kwargs) if x is None or y is None: raise ValueError(self._kind + " requires an x and y column") - if is_integer(x) and self.data.columns._should_fallback_to_positional: + if is_integer(x) and not self.data.columns._holds_integer(): x = self.data.columns[x] - if is_integer(y) and self.data.columns._should_fallback_to_positional: + if is_integer(y) and not self.data.columns._holds_integer(): y = self.data.columns[y] # Scatter plot allows to plot objects data @@ -1196,7 +1196,7 @@ def __init__(self, data, x, y, s=None, c=None, **kwargs) -> None: elif is_hashable(s) and s in data.columns: s = data[s] super().__init__(data, x, y, s=s, **kwargs) - if is_integer(c) and self.data.columns._holds_integer(): + if is_integer(c) and not self.data.columns._holds_integer(): c = self.data.columns[c] self.c = c @@ -1291,7 +1291,7 @@ def _kind(self) -> Literal["hexbin"]: def __init__(self, data, x, y, C=None, **kwargs) -> None: super().__init__(data, x, y, **kwargs) - if is_integer(C) and self.data.columns._holds_integer(): + if is_integer(C) and not self.data.columns._holds_integer(): C = self.data.columns[C] self.C = C From d8f0aa73a0c5b1f20b3f4298d426152d9ce9e0b3 Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Sat, 14 Jan 2023 13:25:39 +0000 Subject: [PATCH 13/13] update --- pandas/core/indexes/base.py | 5 +++-- pandas/tests/indexes/common.py | 5 +---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 443398c19a1af..b7a535550bf0d 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -98,6 +98,7 @@ is_float_dtype, is_hashable, is_integer, + is_integer_dtype, is_interval_dtype, is_iterator, is_list_like, @@ -2492,8 +2493,8 @@ def holds_integer(self) -> bool: Use `pandas.api.types.infer_dtype` instead """ warnings.warn( - f"{type(self).__name__}.holds_integer is deprecated." - "Use pandas.api.types.infer_dtype instead", + f"{type(self).__name__}.holds_integer is deprecated. " + "Use pandas.api.types.infer_dtype instead.", FutureWarning, stacklevel=find_stack_level(), ) diff --git a/pandas/tests/indexes/common.py b/pandas/tests/indexes/common.py index 20a07d71372f0..acdef2bcb5379 100644 --- a/pandas/tests/indexes/common.py +++ b/pandas/tests/indexes/common.py @@ -812,10 +812,7 @@ def test_is_integer_is_deprecated(self, simple_index): def test_holds_integer_deprecated(self, simple_index): # GH50243 idx = simple_index - msg = ( - f"{type(idx).__name__}.holds_integer is deprecated." - "Use pandas.api.types.infer_dtype instead" - ) + msg = f"{type(idx).__name__}.holds_integer is deprecated. " with tm.assert_produces_warning(FutureWarning, match=msg): idx.holds_integer()