def _reduce(self, name: str, skipna: bool = True, **kwargs): data = self._data mask = self._mask # coerce to a nan-aware float if needed # (we explicitly use NaN within reductions) if self._hasna: data = self.to_numpy("float64", na_value=np.nan) op = getattr(nanops, "nan" + name) result = op(data, axis=0, skipna=skipna, mask=mask, **kwargs) if np.isnan(result): return libmissing.NA # if we have a boolean op, don't coerce if name in ["any", "all"]: pass # if we have a preservable numeric op, # provide coercion back to an integer type if possible elif name in ["sum", "min", "max", "prod"]: # GH#31409 more performant than casting-then-checking result = com.cast_scalar_indexer(result) return result
def __getitem__(self, key): """ Conserve RangeIndex type for scalar and slice keys. """ super_getitem = super().__getitem__ if is_scalar(key): if not lib.is_integer(key): raise IndexError("only integers, slices (`:`), " "ellipsis (`...`), numpy.newaxis (`None`) " "and integer or boolean " "arrays are valid indices") n = com.cast_scalar_indexer(key) if n != key: return super_getitem(key) try: return self._range[key] except IndexError: raise IndexError("index {key} is out of bounds for axis 0 " "with size {size}".format(key=key, size=len(self))) if isinstance(key, slice): new_range = self._range[key] return self.from_range(new_range, name=self.name) # fall back to Int64Index return super_getitem(key)
def __getitem__(self, key): """ Conserve RangeIndex type for scalar and slice keys. """ super_getitem = super(RangeIndex, self).__getitem__ if is_scalar(key): if not lib.is_integer(key): raise IndexError("only integers, slices (`:`), " "ellipsis (`...`), numpy.newaxis (`None`) " "and integer or boolean " "arrays are valid indices") n = com.cast_scalar_indexer(key) if n != key: return super_getitem(key) if n < 0: n = len(self) + key if n < 0 or n > len(self) - 1: raise IndexError("index {key} is out of bounds for axis 0 " "with size {size}".format(key=key, size=len(self))) return self._start + n * self._step if isinstance(key, slice): # This is basically PySlice_GetIndicesEx, but delegation to our # super routines if we don't have integers length = len(self) # complete missing slice information step = 1 if key.step is None else key.step if key.start is None: start = length - 1 if step < 0 else 0 else: start = key.start if start < 0: start += length if start < 0: start = -1 if step < 0 else 0 if start >= length: start = length - 1 if step < 0 else length if key.stop is None: stop = -1 if step < 0 else length else: stop = key.stop if stop < 0: stop += length if stop < 0: stop = -1 if stop > length: stop = length # delegate non-integer slices if (start != int(start) or stop != int(stop) or step != int(step)): return super_getitem(key) # convert indexes to values start = self._start + self._step * start stop = self._start + self._step * stop step = self._step * step return RangeIndex._simple_new(start, stop, step, name=self.name) # fall back to Int64Index return super_getitem(key)
def __getitem__(self, key): """ Conserve RangeIndex type for scalar and slice keys. """ super_getitem = super(RangeIndex, self).__getitem__ if is_scalar(key): if not lib.is_integer(key): raise IndexError("only integers, slices (`:`), " "ellipsis (`...`), numpy.newaxis (`None`) " "and integer or boolean " "arrays are valid indices") n = com.cast_scalar_indexer(key) if n != key: return super_getitem(key) if n < 0: n = len(self) + key if n < 0 or n > len(self) - 1: raise IndexError("index {key} is out of bounds for axis 0 " "with size {size}".format(key=key, size=len(self))) return self._start + n * self._step if isinstance(key, slice): # This is basically PySlice_GetIndicesEx, but delegation to our # super routines if we don't have integers length = len(self) # complete missing slice information step = 1 if key.step is None else key.step if key.start is None: start = length - 1 if step < 0 else 0 else: start = key.start if start < 0: start += length if start < 0: start = -1 if step < 0 else 0 if start >= length: start = length - 1 if step < 0 else length if key.stop is None: stop = -1 if step < 0 else length else: stop = key.stop if stop < 0: stop += length if stop < 0: stop = -1 if stop > length: stop = length # delegate non-integer slices if (start != int(start) or stop != int(stop) or step != int(step)): return super_getitem(key) # convert indexes to values start = self._start + self._step * start stop = self._start + self._step * stop step = self._step * step return RangeIndex._simple_new(start, stop, step, name=self.name) # fall back to Int64Index return super_getitem(key)