From ba3d0f2d128c997069e4d83ca3adb0ca089df366 Mon Sep 17 00:00:00 2001 From: Tom Augspurger Date: Fri, 3 Apr 2020 10:09:21 -0500 Subject: [PATCH 1/3] Pass method in __finalize__ This passes `method` everywhere we use `__finalize__`. This will be useful for future enhancements buliding on `__finalize__`. --- pandas/core/base.py | 2 +- pandas/core/frame.py | 10 ++-- pandas/core/generic.py | 90 ++++++++++++++++++++++-------------- pandas/core/indexes/multi.py | 2 +- pandas/core/ops/__init__.py | 2 +- pandas/core/series.py | 64 ++++++++++++++++--------- 6 files changed, 106 insertions(+), 64 deletions(-) diff --git a/pandas/core/base.py b/pandas/core/base.py index a28a2c9594341..5945d8a4b432d 100644 --- a/pandas/core/base.py +++ b/pandas/core/base.py @@ -1521,4 +1521,4 @@ def duplicated(self, keep="first"): else: return self._constructor( duplicated(self, keep=keep), index=self.index - ).__finalize__(self) + ).__finalize__(self, method="duplicated") diff --git a/pandas/core/frame.py b/pandas/core/frame.py index be04bbc7942c4..94ec49c5b1b2a 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -2521,7 +2521,7 @@ def transpose(self, *args, copy: bool = False) -> "DataFrame": new_values, index=self.columns, columns=self.index ) - return result.__finalize__(self) + return result.__finalize__(self, method="transpose") @property def T(self) -> "DataFrame": @@ -2662,7 +2662,7 @@ def _getitem_multilevel(self, key): result = self._constructor( new_values, index=self.index, columns=result_columns ) - result = result.__finalize__(self) + result = result.__finalize__(self, method="_getitem_multilevel") # If there is only one column being returned, and its name is # either an empty string, or a tuple with an empty string as its @@ -4480,7 +4480,7 @@ def _maybe_casted_values(index, labels=None): @Appender(_shared_docs["isna"] % _shared_doc_kwargs) def isna(self) -> "DataFrame": result = self._constructor(self._data.isna(func=isna)) - return result.__finalize__(self) + return result.__finalize__(self, method="isna") @Appender(_shared_docs["isna"] % _shared_doc_kwargs) def isnull(self) -> "DataFrame": @@ -4808,7 +4808,7 @@ def sort_values( if inplace: return self._update_inplace(result) else: - return result.__finalize__(self) + return result.__finalize__(self, method="sort_values") def sort_index( self, @@ -4944,7 +4944,7 @@ def sort_index( if inplace: return self._update_inplace(result) else: - return result.__finalize__(self) + return result.__finalize__(self, method="sort_index") def value_counts( self, diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 143e4543e7ab8..6dabd7047d30a 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -144,7 +144,9 @@ def _single_replace(self, to_replace, method, inplace, limit): if values.dtype == orig_dtype and inplace: return - result = pd.Series(values, index=self.index, dtype=self.dtype).__finalize__(self) + result = pd.Series(values, index=self.index, dtype=self.dtype).__finalize__( + self, method="_single_replace" + ) if inplace: self._update_inplace(result) @@ -588,7 +590,9 @@ def swapaxes(self: FrameOrSeries, axis1, axis2, copy=True) -> FrameOrSeries: if copy: new_values = new_values.copy() - return self._constructor(new_values, *new_axes).__finalize__(self) + return self._constructor(new_values, *new_axes).__finalize__( + self, method="swapaxes" + ) def droplevel(self: FrameOrSeries, level, axis=0) -> FrameOrSeries: """ @@ -991,7 +995,7 @@ def rename( self._update_inplace(result) return None else: - return result.__finalize__(self) + return result.__finalize__(self, method="rename") @rewrite_axis_style_signature("mapper", [("copy", True), ("inplace", False)]) def rename_axis(self, mapper=lib.no_default, **kwargs): @@ -1357,7 +1361,7 @@ def __invert__(self): return self new_data = self._data.apply(operator.invert) - result = self._constructor(new_data).__finalize__(self) + result = self._constructor(new_data).__finalize__(self, method="__invert__") return result def __nonzero__(self): @@ -1802,7 +1806,9 @@ def __array_wrap__(self, result, context=None): # ptp also requires the item_from_zerodim return result d = self._construct_axes_dict(self._AXIS_ORDERS, copy=False) - return self._constructor(result, **d).__finalize__(self) + return self._constructor(result, **d).__finalize__( + self, method="__array_wrap__" + ) # ideally we would define this to avoid the getattr checks, but # is slower @@ -3360,7 +3366,7 @@ class max_speed new_data = self._data.take( indices, axis=self._get_block_manager_axis(axis), verify=True ) - return self._constructor(new_data).__finalize__(self) + return self._constructor(new_data).__finalize__(self, method="take") def _take_with_is_copy(self: FrameOrSeries, indices, axis=0) -> FrameOrSeries: """ @@ -3567,7 +3573,7 @@ def _slice(self: FrameOrSeries, slobj: slice, axis=0) -> FrameOrSeries: assert isinstance(slobj, slice), type(slobj) axis = self._get_block_manager_axis(axis) result = self._constructor(self._data.get_slice(slobj, axis=axis)) - result = result.__finalize__(self) + result = result.__finalize__(self, method="_slice") # this could be a view # but only in a single-dtyped view sliceable case @@ -4433,7 +4439,7 @@ def reindex(self: FrameOrSeries, *args, **kwargs) -> FrameOrSeries: # perform the reindex on the axes return self._reindex_axes( axes, level, limit, tolerance, method, fill_value, copy - ).__finalize__(self) + ).__finalize__(self, method="reindex") def _reindex_axes( self: FrameOrSeries, axes, level, limit, tolerance, method, fill_value, copy @@ -4506,7 +4512,9 @@ def _reindex_with_indexers( if copy and new_data is self._data: new_data = new_data.copy() - return self._constructor(new_data).__finalize__(self) + return self._constructor(new_data).__finalize__( + self, method="_reindex_with_indexers" + ) def filter( self: FrameOrSeries, @@ -5132,7 +5140,7 @@ def pipe(self, func, *args, **kwargs): # Attribute access def __finalize__( - self: FrameOrSeries, other, method=None, **kwargs + self: FrameOrSeries, other, method: Optional[str] = None, **kwargs ) -> FrameOrSeries: """ Propagate metadata from other to self. @@ -5268,7 +5276,9 @@ def _consolidate(self, inplace: bool_t = False): else: f = lambda: self._data.consolidate() cons_data = self._protect_consolidate(f) - return self._constructor(cons_data).__finalize__(self) + return self._constructor(cons_data).__finalize__( + self, method="_consolidate" + ) @property def _is_mixed_type(self) -> bool_t: @@ -5297,10 +5307,14 @@ def _check_inplace_setting(self, value) -> bool_t: return True def _get_numeric_data(self): - return self._constructor(self._data.get_numeric_data()).__finalize__(self) + return self._constructor(self._data.get_numeric_data()).__finalize__( + self, method="_get_numeric_data" + ) def _get_bool_data(self): - return self._constructor(self._data.get_bool_data()).__finalize__(self) + return self._constructor(self._data.get_bool_data()).__finalize__( + self, method="_get_bool_data" + ) # ---------------------------------------------------------------------- # Internal Interface Methods @@ -5427,7 +5441,7 @@ def _to_dict_of_blocks(self, copy: bool_t = True): Internal ONLY """ return { - k: self._constructor(v).__finalize__(self) + k: self._constructor(v).__finalize__(self, mehtod="_to_dict_of_blocks") for k, v, in self._data.to_dict(copy=copy).items() } @@ -5567,7 +5581,7 @@ def astype( else: # else, only a single dtype is given new_data = self._data.astype(dtype=dtype, copy=copy, errors=errors) - return self._constructor(new_data).__finalize__(self) + return self._constructor(new_data).__finalize__(self, method="_astype") # GH 19920: retain column metadata after concat result = pd.concat(results, axis=1, copy=False) @@ -5680,7 +5694,7 @@ def copy(self: FrameOrSeries, deep: bool_t = True) -> FrameOrSeries: dtype: object """ data = self._data.copy(deep=deep) - return self._constructor(data).__finalize__(self) + return self._constructor(data).__finalize__(self, method="copy") def __copy__(self: FrameOrSeries, deep: bool_t = True) -> FrameOrSeries: return self.copy(deep=deep) @@ -5739,7 +5753,7 @@ def _convert( coerce=coerce, copy=copy, ) - ).__finalize__(self) + ).__finalize__(self, method="_convert") def infer_objects(self: FrameOrSeries) -> FrameOrSeries: """ @@ -5788,7 +5802,7 @@ def infer_objects(self: FrameOrSeries) -> FrameOrSeries: self._data.convert( datetime=True, numeric=False, timedelta=True, coerce=False, copy=True ) - ).__finalize__(self) + ).__finalize__(self, method="infer_objects") def convert_dtypes( self: FrameOrSeries, @@ -6115,7 +6129,7 @@ def fillna( if inplace: return self._update_inplace(result) else: - return result.__finalize__(self) + return result.__finalize__(self, method="fillna") def ffill( self: FrameOrSeries, @@ -6631,7 +6645,7 @@ def replace( if inplace: return self._update_inplace(result) else: - return result.__finalize__(self) + return result.__finalize__(self, method="replace") _shared_docs[ "interpolate" @@ -6897,7 +6911,7 @@ def interpolate( if inplace: return self._update_inplace(result) else: - return result.__finalize__(self) + return result.__finalize__(self, method="interpolate") # ---------------------------------------------------------------------- # Timeseries methods Methods @@ -7135,11 +7149,11 @@ def asof(self, where, subset=None): @Appender(_shared_docs["isna"] % _shared_doc_kwargs) def isna(self: FrameOrSeries) -> FrameOrSeries: - return isna(self).__finalize__(self) + return isna(self).__finalize__(self, method="isna") @Appender(_shared_docs["isna"] % _shared_doc_kwargs) def isnull(self: FrameOrSeries) -> FrameOrSeries: - return isna(self).__finalize__(self) + return isna(self).__finalize__(self, method="isnull") _shared_docs[ "notna" @@ -7205,11 +7219,11 @@ def isnull(self: FrameOrSeries) -> FrameOrSeries: @Appender(_shared_docs["notna"] % _shared_doc_kwargs) def notna(self: FrameOrSeries) -> FrameOrSeries: - return notna(self).__finalize__(self) + return notna(self).__finalize__(self, method="notna") @Appender(_shared_docs["notna"] % _shared_doc_kwargs) def notnull(self: FrameOrSeries) -> FrameOrSeries: - return notna(self).__finalize__(self) + return notna(self).__finalize__(self, method="notnull") def _clip_with_scalar(self, lower, upper, inplace: bool_t = False): if (lower is not None and np.any(isna(lower))) or ( @@ -8223,7 +8237,7 @@ def ranker(data): pct=pct, ) ranks = self._constructor(ranks, **data._construct_axes_dict()) - return ranks.__finalize__(self) + return ranks.__finalize__(self, method="rank") # if numeric_only is None, and we can't get anything, we try with # numeric_only=True @@ -8430,7 +8444,10 @@ def _align_frame( left.index = join_index right.index = join_index - return left.__finalize__(self), right.__finalize__(other) + return ( + left.__finalize__(self, method="_align_frame"), + right.__finalize__(other, method="_align_frame"), + ) def _align_series( self, @@ -8514,7 +8531,10 @@ def _align_series( left.index = join_index right.index = join_index - return left.__finalize__(self), right.__finalize__(other) + return ( + left.__finalize__(self, method="_align_series"), + right.__finalize__(other, method="_align_series"), + ) def _where( self, @@ -8655,7 +8675,7 @@ def _where( axis=block_axis, ) result = self._constructor(new_data) - return result.__finalize__(self) + return result.__finalize__(self, method="_where") _shared_docs[ "where" @@ -8927,7 +8947,7 @@ def shift( else: return self.tshift(periods, freq) - return self._constructor(new_data).__finalize__(self) + return self._constructor(new_data).__finalize__(self, method="shift") def slice_shift(self: FrameOrSeries, periods: int = 1, axis=0) -> FrameOrSeries: """ @@ -8964,7 +8984,7 @@ def slice_shift(self: FrameOrSeries, periods: int = 1, axis=0) -> FrameOrSeries: shifted_axis = self._get_axis(axis)[islicer] new_obj.set_axis(shifted_axis, axis=axis, inplace=True) - return new_obj.__finalize__(self) + return new_obj.__finalize__(self, method="slice_shift") def tshift( self: FrameOrSeries, periods: int = 1, freq=None, axis: Axis = 0 @@ -9024,7 +9044,7 @@ def tshift( result = self.copy() result.set_axis(new_ax, axis, inplace=True) - return result.__finalize__(self) + return result.__finalize__(self, method="tshift") def truncate( self: FrameOrSeries, before=None, after=None, axis=None, copy: bool_t = True @@ -9235,7 +9255,7 @@ def _tz_convert(ax, tz): result = self.copy(deep=copy) result = result.set_axis(ax, axis=axis, inplace=False) - return result.__finalize__(self) + return result.__finalize__(self, method="tz_convert") def tz_localize( self: FrameOrSeries, @@ -9404,7 +9424,7 @@ def _tz_localize(ax, tz, ambiguous, nonexistent): result = self.copy(deep=copy) result = result.set_axis(ax, axis=axis, inplace=False) - return result.__finalize__(self) + return result.__finalize__(self, method="tz_localize") # ---------------------------------------------------------------------- # Numeric Methods @@ -11183,7 +11203,7 @@ def block_accum_func(blk_values): d = self._construct_axes_dict() d["copy"] = False - return self._constructor(result, **d).__finalize__(self) + return self._constructor(result, **d).__finalize__(self, method=name) return set_function_name(cum_func, name, cls) diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 10d62b522a255..512ec2666c56c 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -2342,7 +2342,7 @@ def _get_values_for_loc(self, series: "Series", loc, key): new_index = self[loc] new_index = maybe_droplevels(new_index, key) new_ser = series._constructor(new_values, index=new_index, name=series.name) - return new_ser.__finalize__(series) + return new_ser.__finalize__(series, method="_get_values_for_loc") def _convert_listlike_indexer(self, keyarr): """ diff --git a/pandas/core/ops/__init__.py b/pandas/core/ops/__init__.py index 10dcb59977cdd..55833c8fa89b3 100644 --- a/pandas/core/ops/__init__.py +++ b/pandas/core/ops/__init__.py @@ -413,7 +413,7 @@ def _construct_result( # We do not pass dtype to ensure that the Series constructor # does inference in the case where `result` has object-dtype. out = left._constructor(result, index=index) - out = out.__finalize__(left) + out = out.__finalize__(left, method="_construct_result") # Set the result's name after __finalize__ is called because __finalize__ # would set it back to self.name diff --git a/pandas/core/series.py b/pandas/core/series.py index 03b82365358ac..9b2be63e61e1d 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -661,7 +661,7 @@ def view(self, dtype=None) -> "Series": """ return self._constructor( self._values.view(dtype), index=self.index - ).__finalize__(self) + ).__finalize__(self, method="view") # ---------------------------------------------------------------------- # NDArray Compat @@ -829,7 +829,7 @@ def take(self, indices, axis=0, is_copy=None, **kwargs) -> "Series": return self._constructor( new_values, index=new_index, fastpath=True - ).__finalize__(self) + ).__finalize__(self, method="take") def _take_with_is_copy(self, indices, axis=0): """ @@ -962,12 +962,14 @@ def _get_values_tuple(self, key): # If key is contained, would have returned by now indexer, new_index = self.index.get_loc_level(key) return self._constructor(self._values[indexer], index=new_index).__finalize__( - self + self, method="_get_values_tuple", ) def _get_values(self, indexer): try: - return self._constructor(self._data.get_slice(indexer)).__finalize__(self) + return self._constructor(self._data.get_slice(indexer)).__finalize__( + self, method="_get_values" + ) except ValueError: # mpl compat if we look up e.g. ser[:, np.newaxis]; # see tests.series.timeseries.test_mpl_compat_hack @@ -1181,7 +1183,9 @@ def repeat(self, repeats, axis=None) -> "Series": nv.validate_repeat(tuple(), dict(axis=axis)) new_index = self.index.repeat(repeats) new_values = self._values.repeat(repeats) - return self._constructor(new_values, index=new_index).__finalize__(self) + return self._constructor(new_values, index=new_index).__finalize__( + self, method="repeat" + ) def reset_index(self, level=None, drop=False, name=None, inplace=False): """ @@ -1308,7 +1312,7 @@ def reset_index(self, level=None, drop=False, name=None, inplace=False): else: return self._constructor( self._values.copy(), index=new_index - ).__finalize__(self) + ).__finalize__(self, method="reset_index") elif inplace: raise TypeError( "Cannot reset_index inplace on a Series to create a DataFrame" @@ -1709,7 +1713,9 @@ def count(self, level=None): obs = level_codes[notna(self._values)] out = np.bincount(obs, minlength=len(lev) or None) - return self._constructor(out, index=lev, dtype="int64").__finalize__(self) + return self._constructor(out, index=lev, dtype="int64").__finalize__( + self, method="count" + ) def mode(self, dropna=True) -> "Series": """ @@ -2132,7 +2138,9 @@ def round(self, decimals=0, *args, **kwargs) -> "Series": """ nv.validate_round(args, kwargs) result = self._values.round(decimals) - result = self._constructor(result, index=self.index).__finalize__(self) + result = self._constructor(result, index=self.index).__finalize__( + self, method="round" + ) return result @@ -2354,7 +2362,9 @@ def diff(self, periods: int = 1) -> "Series": dtype: float64 """ result = algorithms.diff(self.array, periods) - return self._constructor(result, index=self.index).__finalize__(self) + return self._constructor(result, index=self.index).__finalize__( + self, method="diff" + ) def autocorr(self, lag=1) -> float: """ @@ -2471,7 +2481,7 @@ def dot(self, other): if isinstance(other, ABCDataFrame): return self._constructor( np.dot(lvals, rvals), index=other.columns - ).__finalize__(self) + ).__finalize__(self, method="dot") elif isinstance(other, Series): return np.dot(lvals, rvals) elif isinstance(rvals, np.ndarray): @@ -2996,7 +3006,7 @@ def _try_kind_sort(arr): if inplace: self._update_inplace(result) else: - return result.__finalize__(self) + return result.__finalize__(self, method="sort_values") def sort_index( self, @@ -3174,7 +3184,7 @@ def sort_index( if inplace: self._update_inplace(result) else: - return result.__finalize__(self) + return result.__finalize__(self, method="sort_index") def argsort(self, axis=0, kind="quicksort", order=None) -> "Series": """ @@ -3208,11 +3218,13 @@ def argsort(self, axis=0, kind="quicksort", order=None) -> "Series": result = Series(-1, index=self.index, name=self.name, dtype="int64") notmask = ~mask result[notmask] = np.argsort(values[notmask], kind=kind) - return self._constructor(result, index=self.index).__finalize__(self) + return self._constructor(result, index=self.index).__finalize__( + self, method="argsort" + ) else: return self._constructor( np.argsort(values, kind=kind), index=self.index, dtype="int64" - ).__finalize__(self) + ).__finalize__(self, method="argsort") def nlargest(self, n=5, keep="first") -> "Series": """ @@ -3430,7 +3442,7 @@ def swaplevel(self, i=-2, j=-1, copy=True) -> "Series": assert isinstance(self.index, ABCMultiIndex) new_index = self.index.swaplevel(i, j) return self._constructor(self._values, index=new_index, copy=copy).__finalize__( - self + self, method="swaplevel" ) def reorder_levels(self, order) -> "Series": @@ -3634,7 +3646,9 @@ def map(self, arg, na_action=None) -> "Series": dtype: object """ new_values = super()._map_values(arg, na_action=na_action) - return self._constructor(new_values, index=self.index).__finalize__(self) + return self._constructor(new_values, index=self.index).__finalize__( + self, method="map" + ) def _gotitem(self, key, ndim, subset=None) -> "Series": """ @@ -3821,7 +3835,7 @@ def apply(self, func, convert_dtype=True, args=(), **kwds): """ if len(self) == 0: return self._constructor(dtype=self.dtype, index=self.index).__finalize__( - self + self, method="apply" ) # dispatch to agg @@ -3858,7 +3872,9 @@ def f(x): # so extension arrays can be used return self._constructor_expanddim(pd.array(mapped), index=self.index) else: - return self._constructor(mapped, index=self.index).__finalize__(self) + return self._constructor(mapped, index=self.index).__finalize__( + self, method="apply" + ) def _reduce( self, op, name, axis=0, skipna=True, numeric_only=None, filter_type=None, **kwds @@ -4303,7 +4319,9 @@ def isin(self, values) -> "Series": Name: animal, dtype: bool """ result = algorithms.isin(self, values) - return self._constructor(result, index=self.index).__finalize__(self) + return self._constructor(result, index=self.index).__finalize__( + self, method="isin" + ) def between(self, left, right, inclusive=True) -> "Series": """ @@ -4539,7 +4557,9 @@ def to_timestamp(self, freq=None, how="start", copy=True) -> "Series": assert isinstance(self.index, (ABCDatetimeIndex, ABCPeriodIndex)) new_index = self.index.to_timestamp(freq=freq, how=how) - return self._constructor(new_values, index=new_index).__finalize__(self) + return self._constructor(new_values, index=new_index).__finalize__( + self, method="to_timestamp" + ) def to_period(self, freq=None, copy=True) -> "Series": """ @@ -4564,7 +4584,9 @@ def to_period(self, freq=None, copy=True) -> "Series": assert isinstance(self.index, ABCDatetimeIndex) new_index = self.index.to_period(freq=freq) - return self._constructor(new_values, index=new_index).__finalize__(self) + return self._constructor(new_values, index=new_index).__finalize__( + self, method="to_period" + ) # ---------------------------------------------------------------------- # Add index From 1a3220fa0a9b8e9e7c04b8c622e4467ec0da0e36 Mon Sep 17 00:00:00 2001 From: Tom Augspurger Date: Mon, 6 Apr 2020 07:33:46 -0500 Subject: [PATCH 2/3] note --- pandas/core/generic.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 6dabd7047d30a..c60d7a9590f88 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -5149,9 +5149,14 @@ def __finalize__( ---------- other : the object from which to get the attributes that we are going to propagate - method : optional, a passed method name ; possibly to take different - types of propagation actions based on this + method : str, optional + A passed method name providing context on where ``__finalize__`` + was called. + .. warning: + + The value passed as `method` are not currently considered + stable across pandas releases. """ if isinstance(other, NDFrame): for name in other.attrs: From fc74c767df38567507a9c1debda6ecaceaf3efb1 Mon Sep 17 00:00:00 2001 From: Tom Augspurger Date: Mon, 6 Apr 2020 14:55:26 -0500 Subject: [PATCH 3/3] remove underscored --- pandas/core/frame.py | 2 +- pandas/core/generic.py | 36 +++++++++++++----------------------- pandas/core/indexes/multi.py | 2 +- pandas/core/ops/__init__.py | 2 +- pandas/core/series.py | 6 ++---- 5 files changed, 18 insertions(+), 30 deletions(-) diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 41646e4fb7407..aedbba755227d 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -2656,7 +2656,7 @@ def _getitem_multilevel(self, key): result = self._constructor( new_values, index=self.index, columns=result_columns ) - result = result.__finalize__(self, method="_getitem_multilevel") + result = result.__finalize__(self) # If there is only one column being returned, and its name is # either an empty string, or a tuple with an empty string as its diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 0b0525da14557..16725e72d5df2 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -144,9 +144,7 @@ def _single_replace(self, to_replace, method, inplace, limit): if values.dtype == orig_dtype and inplace: return - result = pd.Series(values, index=self.index, dtype=self.dtype).__finalize__( - self, method="_single_replace" - ) + result = pd.Series(values, index=self.index, dtype=self.dtype).__finalize__(self) if inplace: self._update_inplace(result) @@ -3574,7 +3572,7 @@ def _slice(self: FrameOrSeries, slobj: slice, axis=0) -> FrameOrSeries: assert isinstance(slobj, slice), type(slobj) axis = self._get_block_manager_axis(axis) result = self._constructor(self._mgr.get_slice(slobj, axis=axis)) - result = result.__finalize__(self, method="_slice") + result = result.__finalize__(self) # this could be a view # but only in a single-dtyped view sliceable case @@ -4509,9 +4507,7 @@ def _reindex_with_indexers( if copy and new_data is self._mgr: new_data = new_data.copy() - return self._constructor(new_data).__finalize__( - self, method="_reindex_with_indexers" - ) + return self._constructor(new_data).__finalize__(self) def filter( self: FrameOrSeries, @@ -5277,9 +5273,7 @@ def _consolidate(self, inplace: bool_t = False): else: f = lambda: self._mgr.consolidate() cons_data = self._protect_consolidate(f) - return self._constructor(cons_data).__finalize__( - self, method="_consolidate" - ) + return self._constructor(cons_data).__finalize__(self) @property def _is_mixed_type(self) -> bool_t: @@ -5308,14 +5302,10 @@ def _check_inplace_setting(self, value) -> bool_t: return True def _get_numeric_data(self): - return self._constructor(self._mgr.get_numeric_data()).__finalize__( - self, method="_get_numeric_data" - ) + return self._constructor(self._mgr.get_numeric_data()).__finalize__(self,) def _get_bool_data(self): - return self._constructor(self._mgr.get_bool_data()).__finalize__( - self, method="_get_bool_data" - ) + return self._constructor(self._mgr.get_bool_data()).__finalize__(self,) # ---------------------------------------------------------------------- # Internal Interface Methods @@ -5442,7 +5432,7 @@ def _to_dict_of_blocks(self, copy: bool_t = True): Internal ONLY """ return { - k: self._constructor(v).__finalize__(self, method="_to_dict_of_blocks") + k: self._constructor(v).__finalize__(self) for k, v, in self._mgr.to_dict(copy=copy).items() } @@ -5755,7 +5745,7 @@ def _convert( coerce=coerce, copy=copy, ) - ).__finalize__(self, method="_convert") + ).__finalize__(self) def infer_objects(self: FrameOrSeries) -> FrameOrSeries: """ @@ -8455,8 +8445,8 @@ def _align_frame( right.index = join_index return ( - left.__finalize__(self, method="_align_frame"), - right.__finalize__(other, method="_align_frame"), + left.__finalize__(self), + right.__finalize__(other), ) def _align_series( @@ -8542,8 +8532,8 @@ def _align_series( right.index = join_index return ( - left.__finalize__(self, method="_align_series"), - right.__finalize__(other, method="_align_series"), + left.__finalize__(self), + right.__finalize__(other), ) def _where( @@ -8685,7 +8675,7 @@ def _where( axis=block_axis, ) result = self._constructor(new_data) - return result.__finalize__(self, method="_where") + return result.__finalize__(self) _shared_docs[ "where" diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 5290a8885a21e..4e2d07ddf9225 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -2365,7 +2365,7 @@ def _get_values_for_loc(self, series: "Series", loc, key): new_index = self[loc] new_index = maybe_droplevels(new_index, key) new_ser = series._constructor(new_values, index=new_index, name=series.name) - return new_ser.__finalize__(series, method="_get_values_for_loc") + return new_ser.__finalize__(series) def _convert_listlike_indexer(self, keyarr): """ diff --git a/pandas/core/ops/__init__.py b/pandas/core/ops/__init__.py index 9d3d595aa7eab..d6ba9d763366b 100644 --- a/pandas/core/ops/__init__.py +++ b/pandas/core/ops/__init__.py @@ -413,7 +413,7 @@ def _construct_result( # We do not pass dtype to ensure that the Series constructor # does inference in the case where `result` has object-dtype. out = left._constructor(result, index=index) - out = out.__finalize__(left, method="_construct_result") + out = out.__finalize__(left) # Set the result's name after __finalize__ is called because __finalize__ # would set it back to self.name diff --git a/pandas/core/series.py b/pandas/core/series.py index 4e3f370047f20..ccb1ec25b5ba4 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -962,14 +962,12 @@ def _get_values_tuple(self, key): # If key is contained, would have returned by now indexer, new_index = self.index.get_loc_level(key) return self._constructor(self._values[indexer], index=new_index).__finalize__( - self, method="_get_values_tuple", + self, ) def _get_values(self, indexer): try: - return self._constructor(self._mgr.get_slice(indexer)).__finalize__( - self, method="_get_values" - ) + return self._constructor(self._mgr.get_slice(indexer)).__finalize__(self,) except ValueError: # mpl compat if we look up e.g. ser[:, np.newaxis]; # see tests.series.timeseries.test_mpl_compat_hack