def _reduce(self, name: str, skipna: bool = True, **kwargs): data = self._data mask = self._mask if name == "sum": return masked_reductions.sum(data, mask, skipna=skipna, **kwargs) # 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 ["min", "max", "prod"]: # GH#31409 more performant than casting-then-checking result = com.cast_scalar_indexer(result) return result
def sum(self, skipna=True, min_count=0, **kwargs): nv.validate_sum((), kwargs) result = masked_reductions.sum(values=self._data, mask=self._mask, skipna=skipna, min_count=min_count) return result
def _reduce(self, name: str, skipna: bool = True, **kwargs): if name in {"any", "all"}: return getattr(self, name)(skipna=skipna, **kwargs) data = self._data mask = self._mask if name == "sum": return masked_reductions.sum(data, mask, skipna=skipna, **kwargs) # coerce to a nan-aware float if needed 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 numeric op that would result in an int, coerce to int if possible if name == "prod" and notna(result): int_result = np.int64(result) if int_result == result: result = int_result elif name in ["min", "max"] and notna(result): result = np.bool_(result) return result
def sum(self, *, skipna=True, min_count=0, axis: int | None = 0, **kwargs): nv.validate_sum((), kwargs) # TODO: do this in validate_sum? if "out" in kwargs: # np.sum; test_floating_array_numpy_sum if kwargs["out"] is not None: raise NotImplementedError kwargs.pop("out") result = masked_reductions.sum( self._data, self._mask, skipna=skipna, min_count=min_count, axis=axis, ) return self._wrap_reduction_result( "sum", result, skipna=skipna, axis=axis, **kwargs )