Skip to content

WARN: std and var showing RuntimeWarning for ea dtype with one element #52518

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Apr 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions doc/source/whatsnew/v2.0.1.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ including other versions of pandas.
Fixed regressions
~~~~~~~~~~~~~~~~~
- Fixed regression for subclassed Series when constructing from a dictionary (:issue:`52445`)
- Fixed regression in :meth:`Series.describe` showing ``RuntimeWarning`` for extension dtype :class:`Series` with one element (:issue:`52515`)

.. ---------------------------------------------------------------------------
.. _whatsnew_201.bug_fixes:
Expand Down
17 changes: 11 additions & 6 deletions pandas/core/array_algos/masked_reductions.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
TYPE_CHECKING,
Callable,
)
import warnings

import numpy as np

Expand Down Expand Up @@ -171,9 +172,11 @@ def var(
if not values.size or mask.all():
return libmissing.NA

return _reductions(
np.var, values=values, mask=mask, skipna=skipna, axis=axis, ddof=ddof
)
with warnings.catch_warnings():
warnings.simplefilter("ignore", RuntimeWarning)
return _reductions(
np.var, values=values, mask=mask, skipna=skipna, axis=axis, ddof=ddof
)


def std(
Expand All @@ -187,6 +190,8 @@ def std(
if not values.size or mask.all():
return libmissing.NA

return _reductions(
np.std, values=values, mask=mask, skipna=skipna, axis=axis, ddof=ddof
)
with warnings.catch_warnings():
warnings.simplefilter("ignore", RuntimeWarning)
return _reductions(
np.std, values=values, mask=mask, skipna=skipna, axis=axis, ddof=ddof
)
8 changes: 1 addition & 7 deletions pandas/tests/extension/base/dim2.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
)

import pandas as pd
import pandas._testing as tm
from pandas.core.arrays.integer import INT_STR_TO_DTYPE
from pandas.tests.extension.base.base import BaseExtensionTests

Expand Down Expand Up @@ -200,12 +199,7 @@ def test_reductions_2d_axis0(self, data, method):
kwargs["ddof"] = 0

try:
if method in ["mean", "var", "std"] and hasattr(data, "_mask"):
# Empty slices produced by the mask cause RuntimeWarnings by numpy
with tm.assert_produces_warning(RuntimeWarning, check_stacklevel=False):
result = getattr(arr2d, method)(axis=0, **kwargs)
else:
result = getattr(arr2d, method)(axis=0, **kwargs)
result = getattr(arr2d, method)(axis=0, **kwargs)
except Exception as err:
try:
getattr(data, method)()
Expand Down
4 changes: 1 addition & 3 deletions pandas/tests/frame/methods/test_describe.py
Original file line number Diff line number Diff line change
Expand Up @@ -388,9 +388,7 @@ def test_ea_with_na(self, any_numeric_ea_dtype):
# GH#48778

df = DataFrame({"a": [1, pd.NA, pd.NA], "b": pd.NA}, dtype=any_numeric_ea_dtype)
# Warning from numpy for taking std of single element
with tm.assert_produces_warning(RuntimeWarning, check_stacklevel=False):
result = df.describe()
result = df.describe()
expected = DataFrame(
{"a": [1.0, 1.0, pd.NA] + [1.0] * 5, "b": [0.0] + [pd.NA] * 7},
index=["count", "mean", "std", "min", "25%", "50%", "75%", "max"],
Expand Down
13 changes: 13 additions & 0 deletions pandas/tests/series/methods/test_describe.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
)

from pandas import (
NA,
Period,
Series,
Timedelta,
Expand Down Expand Up @@ -187,3 +188,15 @@ def test_numeric_result_dtype(self, any_numeric_dtype):
dtype=dtype,
)
tm.assert_series_equal(result, expected)

def test_describe_one_element_ea(self):
# GH#52515
ser = Series([0.0], dtype="Float64")
with tm.assert_produces_warning(None):
result = ser.describe()
expected = Series(
[1, 0, NA, 0, 0, 0, 0, 0],
dtype="Float64",
index=["count", "mean", "std", "min", "25%", "50%", "75%", "max"],
)
tm.assert_series_equal(result, expected)