Skip to content

Commit

Permalink
Backport PR #52518 on branch 2.0.x (WARN: std and var showing Runtime…
Browse files Browse the repository at this point in the history
…Warning for ea dtype with one element (#52539)

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

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

* Filter warnings

* Fix test

(cherry picked from commit 4d6ca9d)
  • Loading branch information
phofl committed Apr 8, 2023
1 parent 18fda97 commit 67294b9
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 16 deletions.
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 @@ -5,6 +5,7 @@
from __future__ import annotations

from typing import Callable
import warnings

import numpy as np

Expand Down Expand Up @@ -166,9 +167,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 @@ -182,6 +185,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)

0 comments on commit 67294b9

Please sign in to comment.