From b7d221dce93270b242464712c6751578ede96c13 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sat, 8 Jun 2019 15:53:17 +0100 Subject: [PATCH 1/3] CLN: remove Panel-specific parts of core.generic --- pandas/core/generic.py | 50 +++++++++++----------------- pandas/tests/generic/test_generic.py | 31 +++++++++++++++++ 2 files changed, 51 insertions(+), 30 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 19d093dd29457..13baa4cf5f157 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -1568,13 +1568,13 @@ def _is_level_reference(self, key, axis=0): ------- is_level : bool """ - axis = self._get_axis_number(axis) - if self.ndim > 2: raise NotImplementedError( "_is_level_reference is not implemented for {type}" .format(type=type(self))) + axis = self._get_axis_number(axis) + return (key is not None and is_hashable(key) and key in self.axes[axis].names and @@ -2782,6 +2782,11 @@ class (index) object 'bird' 'bird' 'mammal' 'mammal' speed (date, animal) int64 350 18 361 15 """ + if self.ndim > 2: + raise NotImplementedError( + "to_xarray is not implemented for {type}" + .format(type=type(self))) + try: import xarray except ImportError: @@ -2794,15 +2799,9 @@ class (index) object 'bird' 'bird' 'mammal' 'mammal' if self.ndim == 1: return xarray.DataArray.from_series(self) - elif self.ndim == 2: + else: return xarray.Dataset.from_dataframe(self) - # > 2 dims - coords = [(a, self._get_axis(a)) for a in self._AXIS_ORDERS] - return xarray.DataArray(self, - coords=coords, - ) - def to_latex(self, buf=None, columns=None, col_space=None, header=True, index=True, na_rep='NaN', formatters=None, float_format=None, sparsify=None, index_names=True, bold_rows=False, @@ -6051,22 +6050,11 @@ def fillna(self, value=None, method=None, axis=None, inplace=False, return result - # > 3d - if self.ndim > 3: + if self.ndim > 2: raise NotImplementedError('Cannot fillna with a method for > ' - '3dims') - - # 3d - elif self.ndim == 3: - # fill in 2d chunks - result = {col: s.fillna(method=method, value=value) - for col, s in self.iteritems()} - prelim_obj = self._constructor.from_dict(result) - new_obj = prelim_obj.__finalize__(self) - new_data = new_obj._data + '2dims') else: - # 2d or less new_data = self._data.interpolate(method=method, axis=axis, limit=limit, inplace=inplace, coerce=True, @@ -6783,7 +6771,9 @@ def interpolate(self, method='linear', axis=0, limit=None, inplace=False, inplace = validate_bool_kwarg(inplace, 'inplace') if self.ndim > 2: - raise NotImplementedError("Interpolate has not been implemented ") + raise NotImplementedError( + "interpolate is not implemented for {type}" + .format(type=type(self))) if axis == 0: ax = self._info_axis_name @@ -6953,6 +6943,9 @@ def asof(self, where, subset=None): 2018-02-27 09:03:30 30.0 NaN 2018-02-27 09:04:30 40.0 NaN """ + if self.ndim > 2: + raise NotImplementedError("asof is not implemented " + "for {type}".format(type=type(self))) if isinstance(where, str): from pandas import to_datetime where = to_datetime(where) @@ -6964,9 +6957,6 @@ def asof(self, where, subset=None): if is_series: if subset is not None: raise ValueError("subset is not valid for Series") - elif self.ndim > 2: - raise NotImplementedError("asof is not implemented " - "for {type}".format(type=type(self))) else: if subset is None: subset = self.columns @@ -8371,11 +8361,11 @@ def rank(self, axis=0, method='average', numeric_only=None, 3 spider 8.0 4.0 4.0 4.0 1.000 4 snake NaN NaN NaN 5.0 NaN """ - axis = self._get_axis_number(axis) - if self.ndim > 2: - msg = "rank does not make sense when ndim > 2" - raise NotImplementedError(msg) + raise NotImplementedError("rank is not implemented " + "for {type}".format(type=type(self))) + + axis = self._get_axis_number(axis) if na_option not in {'keep', 'top', 'bottom'}: msg = "na_option must be one of 'keep', 'top', or 'bottom'" diff --git a/pandas/tests/generic/test_generic.py b/pandas/tests/generic/test_generic.py index e6d9851b1bb99..0a5d61841cc45 100644 --- a/pandas/tests/generic/test_generic.py +++ b/pandas/tests/generic/test_generic.py @@ -7,6 +7,7 @@ import pandas as pd from pandas import DataFrame, MultiIndex, Series, date_range +from pandas.core.generic import NDFrame import pandas.util.testing as tm from pandas.util.testing import assert_frame_equal, assert_series_equal @@ -918,3 +919,33 @@ def test_axis_classmethods(self, box): assert obj._get_axis_name(v) == box._get_axis_name(v) assert obj._get_block_manager_axis(v) == \ box._get_block_manager_axis(v) + + +@pytest.mark.parametrize('method, args', [ + ('_is_level_reference', ['key']), + ('_is_label_reference', ['key']), + ('_is_label_or_level_reference', ['key']), + ('_check_label_or_level_ambiguity', ['key']), + ('_get_label_or_level_values', ['key']), + ('_drop_labels_or_levels', ['keys']), + ('to_xarray', []), + ('interpolate', []), + ('asof', ['where']), + ('rank', []) +]) +def test_ndframe_not_implemented_raises(method, args, monkeypatch): + obj = NDFrame(np.empty(shape=(0, 0, 0))) + msg = ("{} is not implemented for " + "").format(method) + with pytest.raises(NotImplementedError, match=msg): + getattr(obj, method)(*args) + + +def test_fillna_method_arg_raises(monkeypatch): + monkeypatch.setattr(NDFrame, '_consolidate_inplace', lambda x: x) + monkeypatch.setattr(NDFrame, '_get_axis_number', lambda x, y: 0) + monkeypatch.setattr(NDFrame, '_is_mixed_type', False) + obj = NDFrame(np.empty(shape=(0, 0, 0))) + msg = ("Cannot fillna with a method for > 2dims") + with pytest.raises(NotImplementedError, match=msg): + obj.fillna(method='backfill') From ff2747d2a57116a856096def3c97b3dc5fb2ebb5 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sat, 8 Jun 2019 17:41:55 +0100 Subject: [PATCH 2/3] remove monkeypatch from test_ndframe_not_implemented_raises --- pandas/tests/generic/test_generic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/generic/test_generic.py b/pandas/tests/generic/test_generic.py index 0a5d61841cc45..f398b37f6391f 100644 --- a/pandas/tests/generic/test_generic.py +++ b/pandas/tests/generic/test_generic.py @@ -933,7 +933,7 @@ def test_axis_classmethods(self, box): ('asof', ['where']), ('rank', []) ]) -def test_ndframe_not_implemented_raises(method, args, monkeypatch): +def test_ndframe_not_implemented_raises(method, args): obj = NDFrame(np.empty(shape=(0, 0, 0))) msg = ("{} is not implemented for " "").format(method) From 626c4dc95625bf3f503a58576bae1c5a7bf22964 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sat, 8 Jun 2019 21:15:25 +0100 Subject: [PATCH 3/3] remove ndim>2 checks --- pandas/core/generic.py | 68 ++-------------------------- pandas/tests/generic/test_generic.py | 31 ------------- 2 files changed, 5 insertions(+), 94 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 13baa4cf5f157..c4e08f50958f7 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -1568,11 +1568,6 @@ def _is_level_reference(self, key, axis=0): ------- is_level : bool """ - if self.ndim > 2: - raise NotImplementedError( - "_is_level_reference is not implemented for {type}" - .format(type=type(self))) - axis = self._get_axis_number(axis) return (key is not None and @@ -1600,11 +1595,6 @@ def _is_label_reference(self, key, axis=0): ------- is_label: bool """ - if self.ndim > 2: - raise NotImplementedError( - "_is_label_reference is not implemented for {type}" - .format(type=type(self))) - axis = self._get_axis_number(axis) other_axes = (ax for ax in range(self._AXIS_LEN) if ax != axis) @@ -1632,12 +1622,6 @@ def _is_label_or_level_reference(self, key, axis=0): ------- is_label_or_level: bool """ - - if self.ndim > 2: - raise NotImplementedError( - "_is_label_or_level_reference is not implemented for {type}" - .format(type=type(self))) - return (self._is_level_reference(key, axis=axis) or self._is_label_reference(key, axis=axis)) @@ -1659,11 +1643,6 @@ def _check_label_or_level_ambiguity(self, key, axis=0): ------ ValueError: `key` is ambiguous """ - if self.ndim > 2: - raise NotImplementedError( - "_check_label_or_level_ambiguity is not implemented for {type}" - .format(type=type(self))) - axis = self._get_axis_number(axis) other_axes = (ax for ax in range(self._AXIS_LEN) if ax != axis) @@ -1724,11 +1703,6 @@ def _get_label_or_level_values(self, key, axis=0): if `key` is ambiguous. This will become an ambiguity error in a future version """ - if self.ndim > 2: - raise NotImplementedError( - "_get_label_or_level_values is not implemented for {type}" - .format(type=type(self))) - axis = self._get_axis_number(axis) other_axes = [ax for ax in range(self._AXIS_LEN) if ax != axis] @@ -1787,11 +1761,6 @@ def _drop_labels_or_levels(self, keys, axis=0): ValueError if any `keys` match neither a label nor a level """ - if self.ndim > 2: - raise NotImplementedError( - "_drop_labels_or_levels is not implemented for {type}" - .format(type=type(self))) - axis = self._get_axis_number(axis) # Validate keys @@ -2781,12 +2750,6 @@ class (index) object 'bird' 'bird' 'mammal' 'mammal' Data variables: speed (date, animal) int64 350 18 361 15 """ - - if self.ndim > 2: - raise NotImplementedError( - "to_xarray is not implemented for {type}" - .format(type=type(self))) - try: import xarray except ImportError: @@ -5691,11 +5654,7 @@ def astype(self, dtype, copy=True, errors='raise', **kwargs): 'the key in Series dtype mappings.') new_type = dtype[self.name] return self.astype(new_type, copy, errors, **kwargs) - elif self.ndim > 2: - raise NotImplementedError( - 'astype() only accepts a dtype arg of type dict when ' - 'invoked on Series and DataFrames.' - ) + for col_name in dtype.keys(): if col_name not in self: raise KeyError('Only a column name can be used for the ' @@ -6050,15 +6009,10 @@ def fillna(self, value=None, method=None, axis=None, inplace=False, return result - if self.ndim > 2: - raise NotImplementedError('Cannot fillna with a method for > ' - '2dims') - - else: - new_data = self._data.interpolate(method=method, axis=axis, - limit=limit, inplace=inplace, - coerce=True, - downcast=downcast) + new_data = self._data.interpolate(method=method, axis=axis, + limit=limit, inplace=inplace, + coerce=True, + downcast=downcast) else: if len(self._get_axis(axis)) == 0: return self @@ -6770,11 +6724,6 @@ def interpolate(self, method='linear', axis=0, limit=None, inplace=False, """ inplace = validate_bool_kwarg(inplace, 'inplace') - if self.ndim > 2: - raise NotImplementedError( - "interpolate is not implemented for {type}" - .format(type=type(self))) - if axis == 0: ax = self._info_axis_name _maybe_transposed_self = self @@ -6943,9 +6892,6 @@ def asof(self, where, subset=None): 2018-02-27 09:03:30 30.0 NaN 2018-02-27 09:04:30 40.0 NaN """ - if self.ndim > 2: - raise NotImplementedError("asof is not implemented " - "for {type}".format(type=type(self))) if isinstance(where, str): from pandas import to_datetime where = to_datetime(where) @@ -8361,10 +8307,6 @@ def rank(self, axis=0, method='average', numeric_only=None, 3 spider 8.0 4.0 4.0 4.0 1.000 4 snake NaN NaN NaN 5.0 NaN """ - if self.ndim > 2: - raise NotImplementedError("rank is not implemented " - "for {type}".format(type=type(self))) - axis = self._get_axis_number(axis) if na_option not in {'keep', 'top', 'bottom'}: diff --git a/pandas/tests/generic/test_generic.py b/pandas/tests/generic/test_generic.py index f398b37f6391f..e6d9851b1bb99 100644 --- a/pandas/tests/generic/test_generic.py +++ b/pandas/tests/generic/test_generic.py @@ -7,7 +7,6 @@ import pandas as pd from pandas import DataFrame, MultiIndex, Series, date_range -from pandas.core.generic import NDFrame import pandas.util.testing as tm from pandas.util.testing import assert_frame_equal, assert_series_equal @@ -919,33 +918,3 @@ def test_axis_classmethods(self, box): assert obj._get_axis_name(v) == box._get_axis_name(v) assert obj._get_block_manager_axis(v) == \ box._get_block_manager_axis(v) - - -@pytest.mark.parametrize('method, args', [ - ('_is_level_reference', ['key']), - ('_is_label_reference', ['key']), - ('_is_label_or_level_reference', ['key']), - ('_check_label_or_level_ambiguity', ['key']), - ('_get_label_or_level_values', ['key']), - ('_drop_labels_or_levels', ['keys']), - ('to_xarray', []), - ('interpolate', []), - ('asof', ['where']), - ('rank', []) -]) -def test_ndframe_not_implemented_raises(method, args): - obj = NDFrame(np.empty(shape=(0, 0, 0))) - msg = ("{} is not implemented for " - "").format(method) - with pytest.raises(NotImplementedError, match=msg): - getattr(obj, method)(*args) - - -def test_fillna_method_arg_raises(monkeypatch): - monkeypatch.setattr(NDFrame, '_consolidate_inplace', lambda x: x) - monkeypatch.setattr(NDFrame, '_get_axis_number', lambda x, y: 0) - monkeypatch.setattr(NDFrame, '_is_mixed_type', False) - obj = NDFrame(np.empty(shape=(0, 0, 0))) - msg = ("Cannot fillna with a method for > 2dims") - with pytest.raises(NotImplementedError, match=msg): - obj.fillna(method='backfill')