From b09cb356833951b1b888f30663e0d4275506c331 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Sat, 1 Feb 2020 15:41:11 -0800 Subject: [PATCH 1/4] REF: remove one-line methods --- pandas/core/generic.py | 4 +++- pandas/core/indexing.py | 12 +++--------- pandas/core/series.py | 5 +++-- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 3b1d7e4c50be5..5477f30f83ef7 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -3501,7 +3501,9 @@ def _iget_item_cache(self, item): def _box_item_values(self, key, values): raise AbstractMethodError(self) - def _slice(self: FrameOrSeries, slobj: slice, axis=0, kind=None) -> FrameOrSeries: + def _slice( + self: FrameOrSeries, slobj: slice, axis=0, kind: str = "getitem" + ) -> FrameOrSeries: """ Construct a slice of this container. diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index 7e56148b7569e..731a5a1f12071 100755 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -591,12 +591,6 @@ def _get_label(self, label, axis: int): return self.obj._xs(label, axis=axis) - def _get_loc(self, key: int, axis: int): - return self.obj._ixs(key, axis=axis) - - def _slice(self, obj, axis: int, kind=None): - return self.obj._slice(obj, axis=axis, kind=kind) - def _get_setitem_indexer(self, key): if self.axis is not None: return self._convert_tuple(key) @@ -1865,7 +1859,7 @@ def _get_slice_axis(self, slice_obj: slice, axis: int): ) if isinstance(indexer, slice): - return self._slice(indexer, axis=axis, kind="iloc") + return self.obj._slice(indexer, axis=axis, kind="iloc") else: # DatetimeIndex overrides Index.slice_indexer and may # return a DatetimeIndex instead of a slice object. @@ -2038,7 +2032,7 @@ def _getitem_axis(self, key, axis: int): # validate the location self._validate_integer(key, axis) - return self._get_loc(key, axis=axis) + return self.obj._ixs(key, axis=axis) def _get_slice_axis(self, slice_obj: slice, axis: int): # caller is responsible for ensuring non-None axis @@ -2048,7 +2042,7 @@ def _get_slice_axis(self, slice_obj: slice, axis: int): return obj.copy(deep=False) indexer = self._convert_slice_indexer(slice_obj, axis) - return self._slice(indexer, axis=axis, kind="iloc") + return self.obj._slice(indexer, axis=axis, kind="iloc") def _convert_to_indexer(self, key, axis: int): """ diff --git a/pandas/core/series.py b/pandas/core/series.py index e5cea8ebfc914..4a9745b2f3ff0 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -846,8 +846,9 @@ def _ixs(self, i: int, axis: int = 0): else: return values[i] - def _slice(self, slobj: slice, axis: int = 0, kind=None) -> "Series": - slobj = self.index._convert_slice_indexer(slobj, kind=kind or "getitem") + def _slice(self, slobj: slice, axis: int = 0, kind: str = "getitem") -> "Series": + # in practice kind is either "getitem" or "iloc" + slobj = self.index._convert_slice_indexer(slobj, kind=kind) return self._get_values(slobj) def __getitem__(self, key): From a0cbf5e7fca50ef9cc473f205ba0203dac80bb9f Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Sun, 2 Feb 2020 22:22:35 -0800 Subject: [PATCH 2/4] edit comment --- pandas/core/series.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/series.py b/pandas/core/series.py index d055c234e1454..2696533b1bc1b 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -842,7 +842,7 @@ def _ixs(self, i: int, axis: int = 0): return self._values[i] def _slice(self, slobj: slice, axis: int = 0, kind: str = "getitem") -> "Series": - # in practice kind is either "getitem" or "iloc" + # kind is either "getitem" or "iloc" slobj = self.index._convert_slice_indexer(slobj, kind=kind) return self._get_values(slobj) From dc3ec1e46fb2411c506001d5ad76803d5dd1048a Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Mon, 3 Feb 2020 08:49:16 -0800 Subject: [PATCH 3/4] inline indexing 1-liners --- pandas/core/indexing.py | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index fcab6b8a289dd..6f7e56d659efd 100755 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -694,17 +694,6 @@ def _convert_tuple(self, key): keyidx.append(idx) return tuple(keyidx) - def _convert_scalar_indexer(self, key, axis: int): - # if we are accessing via lowered dim, use the last dim - ax = self.obj._get_axis(min(axis, self.ndim - 1)) - # a scalar - return ax._convert_scalar_indexer(key, kind=self.name) - - def _convert_slice_indexer(self, key: slice, axis: int): - # if we are accessing via lowered dim, use the last dim - ax = self.obj._get_axis(min(axis, self.ndim - 1)) - return ax._convert_slice_indexer(key, kind=self.name) - def _has_valid_setitem_indexer(self, indexer) -> bool: return True @@ -1629,7 +1618,8 @@ def _validate_key(self, key, axis: int): return if not is_list_like_indexer(key): - self._convert_scalar_indexer(key, axis) + labels = self.obj._get_axis(axis) + labels._convert_scalar_indexer(key, kind="loc") def _is_scalar_access(self, key: Tuple) -> bool: """ @@ -1798,11 +1788,11 @@ def _convert_to_indexer(self, key, axis: int): labels = self.obj._get_axis(axis) if isinstance(key, slice): - return self._convert_slice_indexer(key, axis) + return labels._convert_slice_indexer(key, kind="loc") # try to find out correct indexer, if not type correct raise try: - key = self._convert_scalar_indexer(key, axis) + key = labels._convert_scalar_indexer(key, kind="loc") except TypeError: # but we will allow setting pass @@ -2034,19 +2024,22 @@ def _get_slice_axis(self, slice_obj: slice, axis: int): if not need_slice(slice_obj): return obj.copy(deep=False) - indexer = self._convert_slice_indexer(slice_obj, axis) + labels = obj._get_axis(axis) + indexer = labels._convert_slice_indexer(slice_obj, kind="iloc") return self.obj._slice(indexer, axis=axis, kind="iloc") def _convert_to_indexer(self, key, axis: int): """ Much simpler as we only have to deal with our valid types. """ + labels = self.obj._get_axis(axis) + # make need to convert a float key if isinstance(key, slice): - return self._convert_slice_indexer(key, axis) + return labels._convert_slice_indexer(key, kind="iloc") elif is_float(key): - return self._convert_scalar_indexer(key, axis) + return labels._convert_scalar_indexer(key, kind="iloc") try: self._validate_key(key, axis) From 57c5ce678af14483b10b354565f60d3284d97bba Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Thu, 6 Feb 2020 09:19:32 -0800 Subject: [PATCH 4/4] add assertion --- pandas/core/series.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/series.py b/pandas/core/series.py index 1b9d958e963b3..0786674daf874 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -841,7 +841,7 @@ def _ixs(self, i: int, axis: int = 0): return self._values[i] def _slice(self, slobj: slice, axis: int = 0, kind: str = "getitem") -> "Series": - # kind is either "getitem" or "iloc" + assert kind in ["getitem", "iloc"] slobj = self.index._convert_slice_indexer(slobj, kind=kind) return self._get_values(slobj)