diff --git a/pandas/core/arrays/base.py b/pandas/core/arrays/base.py index 97a764fa7dbe8..bb910b687cd0f 100644 --- a/pandas/core/arrays/base.py +++ b/pandas/core/arrays/base.py @@ -27,7 +27,7 @@ class ExtensionArray(object): The interface includes the following abstract methods that must be implemented by subclasses: - * _constructor_from_sequence + * _from_sequence * _from_factorized * __getitem__ * __len__ @@ -78,7 +78,7 @@ class ExtensionArray(object): # Constructors # ------------------------------------------------------------------------ @classmethod - def _constructor_from_sequence(cls, scalars): + def _from_sequence(cls, scalars): """Construct a new ExtensionArray from a sequence of scalars. Parameters @@ -365,7 +365,7 @@ def fillna(self, value=None, method=None, limit=None): func = pad_1d if method == 'pad' else backfill_1d new_values = func(self.astype(object), limit=limit, mask=mask) - new_values = self._constructor_from_sequence(new_values) + new_values = self._from_sequence(new_values) else: # fill with value new_values = self.copy() @@ -384,7 +384,7 @@ def unique(self): from pandas import unique uniques = unique(self.astype(object)) - return self._constructor_from_sequence(uniques) + return self._from_sequence(uniques) def _values_for_factorize(self): # type: () -> Tuple[ndarray, Any] diff --git a/pandas/core/arrays/categorical.py b/pandas/core/arrays/categorical.py index b5a4785fd98a6..599161521f3a7 100644 --- a/pandas/core/arrays/categorical.py +++ b/pandas/core/arrays/categorical.py @@ -422,7 +422,7 @@ def _constructor(self): return Categorical @classmethod - def _constructor_from_sequence(cls, scalars): + def _from_sequence(cls, scalars): return Categorical(scalars) def copy(self): diff --git a/pandas/tests/extension/base/constructors.py b/pandas/tests/extension/base/constructors.py index 5ac3a84517fe9..489a430bb4020 100644 --- a/pandas/tests/extension/base/constructors.py +++ b/pandas/tests/extension/base/constructors.py @@ -11,7 +11,7 @@ class BaseConstructorsTests(BaseExtensionTests): def test_array_from_scalars(self, data): scalars = [data[0], data[1], data[2]] - result = data._constructor_from_sequence(scalars) + result = data._from_sequence(scalars) assert isinstance(result, type(data)) def test_series_constructor(self, data): diff --git a/pandas/tests/extension/base/getitem.py b/pandas/tests/extension/base/getitem.py index 4e2a65eba06dc..ac156900671a6 100644 --- a/pandas/tests/extension/base/getitem.py +++ b/pandas/tests/extension/base/getitem.py @@ -145,7 +145,7 @@ def test_take_series(self, data): s = pd.Series(data) result = s.take([0, -1]) expected = pd.Series( - data._constructor_from_sequence([data[0], data[len(data) - 1]]), + data._from_sequence([data[0], data[len(data) - 1]]), index=[0, len(data) - 1]) self.assert_series_equal(result, expected) @@ -158,12 +158,11 @@ def test_reindex(self, data, na_value): n = len(data) result = s.reindex([-1, 0, n]) expected = pd.Series( - data._constructor_from_sequence([na_value, data[0], na_value]), + data._from_sequence([na_value, data[0], na_value]), index=[-1, 0, n]) self.assert_series_equal(result, expected) result = s.reindex([n, n + 1]) - expected = pd.Series( - data._constructor_from_sequence([na_value, na_value]), - index=[n, n + 1]) + expected = pd.Series(data._from_sequence([na_value, na_value]), + index=[n, n + 1]) self.assert_series_equal(result, expected) diff --git a/pandas/tests/extension/base/methods.py b/pandas/tests/extension/base/methods.py index 430c571aab0a4..c5436aa731d50 100644 --- a/pandas/tests/extension/base/methods.py +++ b/pandas/tests/extension/base/methods.py @@ -76,7 +76,7 @@ def test_sort_values_frame(self, data_for_sorting, ascending): @pytest.mark.parametrize('box', [pd.Series, lambda x: x]) @pytest.mark.parametrize('method', [lambda x: x.unique(), pd.unique]) def test_unique(self, data, box, method): - duplicated = box(data._constructor_from_sequence([data[0], data[0]])) + duplicated = box(data._from_sequence([data[0], data[0]])) result = method(duplicated) diff --git a/pandas/tests/extension/base/missing.py b/pandas/tests/extension/base/missing.py index d3360eb199a89..f6cee9af0b722 100644 --- a/pandas/tests/extension/base/missing.py +++ b/pandas/tests/extension/base/missing.py @@ -70,7 +70,8 @@ def test_fillna_series(self, data_missing): ser = pd.Series(data_missing) result = ser.fillna(fill_value) - expected = pd.Series(type(data_missing)([fill_value, fill_value])) + expected = pd.Series( + data_missing._from_sequence([fill_value, fill_value])) self.assert_series_equal(result, expected) # Fill with a series @@ -89,7 +90,8 @@ def test_fillna_series_method(self, data_missing, method): data_missing = type(data_missing)(data_missing[::-1]) result = pd.Series(data_missing).fillna(method=method) - expected = pd.Series(type(data_missing)([fill_value, fill_value])) + expected = pd.Series( + data_missing._from_sequence([fill_value, fill_value])) self.assert_series_equal(result, expected) @@ -102,7 +104,7 @@ def test_fillna_frame(self, data_missing): }).fillna(fill_value) expected = pd.DataFrame({ - "A": type(data_missing)([fill_value, fill_value]), + "A": data_missing._from_sequence([fill_value, fill_value]), "B": [1, 2], }) diff --git a/pandas/tests/extension/base/reshaping.py b/pandas/tests/extension/base/reshaping.py index f50222b82df0f..40456453cb43d 100644 --- a/pandas/tests/extension/base/reshaping.py +++ b/pandas/tests/extension/base/reshaping.py @@ -47,8 +47,8 @@ def test_align(self, data, na_value): r1, r2 = pd.Series(a).align(pd.Series(b, index=[1, 2, 3])) # Assumes that the ctor can take a list of scalars of the type - e1 = pd.Series(type(data)(list(a) + [na_value])) - e2 = pd.Series(type(data)([na_value] + list(b))) + e1 = pd.Series(data._from_sequence(list(a) + [na_value])) + e2 = pd.Series(data._from_sequence([na_value] + list(b))) self.assert_series_equal(r1, e1) self.assert_series_equal(r2, e2) @@ -60,8 +60,8 @@ def test_align_frame(self, data, na_value): ) # Assumes that the ctor can take a list of scalars of the type - e1 = pd.DataFrame({'A': type(data)(list(a) + [na_value])}) - e2 = pd.DataFrame({'A': type(data)([na_value] + list(b))}) + e1 = pd.DataFrame({'A': data._from_sequence(list(a) + [na_value])}) + e2 = pd.DataFrame({'A': data._from_sequence([na_value] + list(b))}) self.assert_frame_equal(r1, e1) self.assert_frame_equal(r2, e2) @@ -71,9 +71,8 @@ def test_align_series_frame(self, data, na_value): df = pd.DataFrame({"col": np.arange(len(ser) + 1)}) r1, r2 = ser.align(df) - e1 = pd.Series( - data._constructor_from_sequence(list(data) + [na_value]), - name=ser.name) + e1 = pd.Series(data._from_sequence(list(data) + [na_value]), + name=ser.name) self.assert_series_equal(r1, e1) self.assert_frame_equal(r2, df) @@ -105,14 +104,13 @@ def test_merge(self, data, na_value): res = pd.merge(df1, df2) exp = pd.DataFrame( {'int1': [1, 1, 2], 'int2': [1, 2, 3], 'key': [0, 0, 1], - 'ext': data._constructor_from_sequence( - [data[0], data[0], data[1]])}) + 'ext': data._from_sequence([data[0], data[0], data[1]])}) self.assert_frame_equal(res, exp[['ext', 'int1', 'key', 'int2']]) res = pd.merge(df1, df2, how='outer') exp = pd.DataFrame( {'int1': [1, 1, 2, 3, np.nan], 'int2': [1, 2, 3, np.nan, 4], 'key': [0, 0, 1, 2, 3], - 'ext': data._constructor_from_sequence( + 'ext': data._from_sequence( [data[0], data[0], data[1], data[2], na_value])}) self.assert_frame_equal(res, exp[['ext', 'int1', 'key', 'int2']]) diff --git a/pandas/tests/extension/base/setitem.py b/pandas/tests/extension/base/setitem.py index e91345b504d86..4e27f1eca538f 100644 --- a/pandas/tests/extension/base/setitem.py +++ b/pandas/tests/extension/base/setitem.py @@ -27,7 +27,7 @@ def test_setitem_sequence_mismatched_length_raises(self, data, as_array): ser = pd.Series(data) value = [data[0]] if as_array: - value = type(data)(value) + value = data._from_sequence(value) xpr = 'cannot set using a {} indexer with a different length' with tm.assert_raises_regex(ValueError, xpr.format('list-like')): diff --git a/pandas/tests/extension/decimal/array.py b/pandas/tests/extension/decimal/array.py index a8e88365b5648..28e667a776c7b 100644 --- a/pandas/tests/extension/decimal/array.py +++ b/pandas/tests/extension/decimal/array.py @@ -36,7 +36,7 @@ def __init__(self, values): self._items = self._data = self.data = self.values @classmethod - def _constructor_from_sequence(cls, scalars): + def _from_sequence(cls, scalars): return cls(scalars) @classmethod diff --git a/pandas/tests/extension/json/array.py b/pandas/tests/extension/json/array.py index 33843492cb706..1f7fcbdfd585a 100644 --- a/pandas/tests/extension/json/array.py +++ b/pandas/tests/extension/json/array.py @@ -34,7 +34,7 @@ def __init__(self, values): self.data = values @classmethod - def _constructor_from_sequence(cls, scalars): + def _from_sequence(cls, scalars): return cls(scalars) @classmethod @@ -45,9 +45,7 @@ def __getitem__(self, item): if isinstance(item, numbers.Integral): return self.data[item] elif isinstance(item, np.ndarray) and item.dtype == 'bool': - return self._constructor_from_sequence([ - x for x, m in zip(self, item) if m - ]) + return self._from_sequence([x for x, m in zip(self, item) if m]) elif isinstance(item, collections.Iterable): # fancy indexing return type(self)([self.data[i] for i in item]) @@ -95,7 +93,7 @@ def take(self, indexer, allow_fill=True, fill_value=None): except IndexError: raise IndexError("Index is out of bounds or cannot do a " "non-empty take from an empty array.") - return self._constructor_from_sequence(output) + return self._from_sequence(output) def copy(self, deep=False): return type(self)(self.data[:])