diff --git a/doc/source/whatsnew/v0.25.0.rst b/doc/source/whatsnew/v0.25.0.rst index a21e9773243da..8a8f0594f0d3e 100644 --- a/doc/source/whatsnew/v0.25.0.rst +++ b/doc/source/whatsnew/v0.25.0.rst @@ -478,6 +478,8 @@ Other Deprecations - The :meth:`DataFrame.compound` and :meth:`Series.compound` methods are deprecated and will be removed in a future version (:issue:`26405`). - The internal attributes ``_start``, ``_stop`` and ``_step`` attributes of :class:`RangeIndex` have been deprecated. Use the public attributes :attr:`~RangeIndex.start`, :attr:`~RangeIndex.stop` and :attr:`~RangeIndex.step` instead (:issue:`26581`). +- The :meth:`Series.ftype`, :meth:`Series.ftypes` and :meth:`DataFrame.ftypes` methods are deprecated and will be removed in a future version. + Instead, use :meth:`Series.dtype` and :meth:`DataFrame.dtypes` (:issue:`26705`). .. _whatsnew_0250.prior_deprecations: diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 19d093dd29457..dcfbdf842dc80 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -5525,6 +5525,9 @@ def ftypes(self): """ Return the ftypes (indication of sparse/dense and dtype) in DataFrame. + .. deprecated:: 0.25.0 + Use :func:`dtypes` instead. + This returns a Series with the data type of each column. The result's index is the original DataFrame's columns. Columns with mixed types are stored with the ``object`` dtype. See @@ -5562,6 +5565,11 @@ def ftypes(self): 3 float64:sparse dtype: object """ + warnings.warn("DataFrame.ftypes is deprecated and will " + "be removed in a future version. " + "Use DataFrame.dtypes instead.", + FutureWarning, stacklevel=2) + from pandas import Series return Series(self._data.get_ftypes(), index=self._info_axis, dtype=np.object_) diff --git a/pandas/core/series.py b/pandas/core/series.py index 472d984234275..cc4a9b84dc863 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -419,14 +419,30 @@ def dtypes(self): def ftype(self): """ Return if the data is sparse|dense. + + .. deprecated:: 0.25.0 + Use :func:`dtype` instead. """ + warnings.warn("Series.ftype is deprecated and will " + "be removed in a future version. " + "Use Series.dtype instead.", + FutureWarning, stacklevel=2) + return self._data.ftype @property def ftypes(self): """ Return if the data is sparse|dense. + + .. deprecated:: 0.25.0 + Use :func:`dtypes` instead. """ + warnings.warn("Series.ftypes is deprecated and will " + "be removed in a future version. " + "Use Series.dtype instead.", + FutureWarning, stacklevel=2) + return self._data.ftype @property diff --git a/pandas/tests/frame/test_dtypes.py b/pandas/tests/frame/test_dtypes.py index 575eac68b111b..96cf70483d4e7 100644 --- a/pandas/tests/frame/test_dtypes.py +++ b/pandas/tests/frame/test_dtypes.py @@ -38,23 +38,34 @@ def test_concat_empty_dataframe_dtypes(self): def test_empty_frame_dtypes_ftypes(self): empty_df = pd.DataFrame() assert_series_equal(empty_df.dtypes, pd.Series(dtype=np.object)) - assert_series_equal(empty_df.ftypes, pd.Series(dtype=np.object)) + + # GH 26705 - Assert .ftypes is deprecated + with tm.assert_produces_warning(FutureWarning): + assert_series_equal(empty_df.ftypes, pd.Series(dtype=np.object)) nocols_df = pd.DataFrame(index=[1, 2, 3]) assert_series_equal(nocols_df.dtypes, pd.Series(dtype=np.object)) - assert_series_equal(nocols_df.ftypes, pd.Series(dtype=np.object)) + + # GH 26705 - Assert .ftypes is deprecated + with tm.assert_produces_warning(FutureWarning): + assert_series_equal(nocols_df.ftypes, pd.Series(dtype=np.object)) norows_df = pd.DataFrame(columns=list("abc")) assert_series_equal(norows_df.dtypes, pd.Series( np.object, index=list("abc"))) - assert_series_equal(norows_df.ftypes, pd.Series( - 'object:dense', index=list("abc"))) + + # GH 26705 - Assert .ftypes is deprecated + with tm.assert_produces_warning(FutureWarning): + assert_series_equal(norows_df.ftypes, pd.Series( + 'object:dense', index=list("abc"))) norows_int_df = pd.DataFrame(columns=list("abc")).astype(np.int32) assert_series_equal(norows_int_df.dtypes, pd.Series( np.dtype('int32'), index=list("abc"))) - assert_series_equal(norows_int_df.ftypes, pd.Series( - 'int32:dense', index=list("abc"))) + # GH 26705 - Assert .ftypes is deprecated + with tm.assert_produces_warning(FutureWarning): + assert_series_equal(norows_int_df.ftypes, pd.Series( + 'int32:dense', index=list("abc"))) odict = OrderedDict df = pd.DataFrame(odict([('a', 1), ('b', True), ('c', 1.0)]), @@ -66,11 +77,17 @@ def test_empty_frame_dtypes_ftypes(self): ('b', 'bool:dense'), ('c', 'float64:dense')])) assert_series_equal(df.dtypes, ex_dtypes) - assert_series_equal(df.ftypes, ex_ftypes) + + # GH 26705 - Assert .ftypes is deprecated + with tm.assert_produces_warning(FutureWarning): + assert_series_equal(df.ftypes, ex_ftypes) # same but for empty slice of df assert_series_equal(df[:0].dtypes, ex_dtypes) - assert_series_equal(df[:0].ftypes, ex_ftypes) + + # GH 26705 - Assert .ftypes is deprecated + with tm.assert_produces_warning(FutureWarning): + assert_series_equal(df[:0].ftypes, ex_ftypes) def test_datetime_with_tz_dtypes(self): tzframe = DataFrame({'A': date_range('20130101', periods=3), @@ -402,7 +419,10 @@ def test_ftypes(self): B='float32:dense', C='float16:dense', D='float64:dense')).sort_values() - result = frame.ftypes.sort_values() + + # GH 26705 - Assert .ftypes is deprecated + with tm.assert_produces_warning(FutureWarning): + result = frame.ftypes.sort_values() assert_series_equal(result, expected) def test_astype(self): diff --git a/pandas/tests/series/test_combine_concat.py b/pandas/tests/series/test_combine_concat.py index f11595febf6ed..e9e87e5bb07a7 100644 --- a/pandas/tests/series/test_combine_concat.py +++ b/pandas/tests/series/test_combine_concat.py @@ -247,21 +247,30 @@ def test_concat_empty_series_dtypes(self): result = pd.concat([Series(dtype='float64').to_sparse(), Series( dtype='float64').to_sparse()]) assert result.dtype == 'Sparse[float64]' - assert result.ftype == 'float64:sparse' + + # GH 26705 - Assert .ftype is deprecated + with tm.assert_produces_warning(FutureWarning): + assert result.ftype == 'float64:sparse' result = pd.concat([Series(dtype='float64').to_sparse(), Series( dtype='float64')]) # TODO: release-note: concat sparse dtype expected = pd.core.sparse.api.SparseDtype(np.float64) assert result.dtype == expected - assert result.ftype == 'float64:sparse' + + # GH 26705 - Assert .ftype is deprecated + with tm.assert_produces_warning(FutureWarning): + assert result.ftype == 'float64:sparse' result = pd.concat([Series(dtype='float64').to_sparse(), Series( dtype='object')]) # TODO: release-note: concat sparse dtype expected = pd.core.sparse.api.SparseDtype('object') assert result.dtype == expected - assert result.ftype == 'object:sparse' + + # GH 26705 - Assert .ftype is deprecated + with tm.assert_produces_warning(FutureWarning): + assert result.ftype == 'object:sparse' def test_combine_first_dt64(self): from pandas.core.tools.datetimes import to_datetime diff --git a/pandas/tests/series/test_dtypes.py b/pandas/tests/series/test_dtypes.py index 51334557fa403..392163228398b 100644 --- a/pandas/tests/series/test_dtypes.py +++ b/pandas/tests/series/test_dtypes.py @@ -48,8 +48,14 @@ def test_dtype(self, datetime_series): assert datetime_series.dtype == np.dtype('float64') assert datetime_series.dtypes == np.dtype('float64') - assert datetime_series.ftype == 'float64:dense' - assert datetime_series.ftypes == 'float64:dense' + + # GH 26705 - Assert .ftype is deprecated + with tm.assert_produces_warning(FutureWarning): + assert datetime_series.ftype == 'float64:dense' + + # GH 26705 - Assert .ftypes is deprecated + with tm.assert_produces_warning(FutureWarning): + assert datetime_series.ftypes == 'float64:dense' tm.assert_series_equal(datetime_series.get_dtype_counts(), Series(1, ['float64'])) # GH18243 - Assert .get_ftype_counts is deprecated diff --git a/pandas/tests/sparse/series/test_series.py b/pandas/tests/sparse/series/test_series.py index b8d0fab1debbd..f7c8a84720d0a 100644 --- a/pandas/tests/sparse/series/test_series.py +++ b/pandas/tests/sparse/series/test_series.py @@ -164,7 +164,10 @@ def test_construct_DataFrame_with_sp_series(self): # blocking expected = Series({'col': 'float64:sparse'}) - result = df.ftypes + + # GH 26705 - Assert .ftypes is deprecated + with tm.assert_produces_warning(FutureWarning): + result = df.ftypes tm.assert_series_equal(expected, result) def test_constructor_preserve_attr(self):