Skip to content

Commit f0a8bc7

Browse files
rhettingergpsheadpicnixz
authored
pythongh-140938: Raise ValueError for infinite inputs to stdev/pstdev (pythonGH-141531)
Raise ValueError for infinite inputs to stdev/pstdev --- Co-authored-by: Gregory P. Smith <[email protected]> Co-authored-by: Bénédikt Tran <[email protected]>
1 parent 1281be1 commit f0a8bc7

File tree

3 files changed

+24
-5
lines changed

3 files changed

+24
-5
lines changed

Lib/statistics.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -619,9 +619,14 @@ def stdev(data, xbar=None):
619619
if n < 2:
620620
raise StatisticsError('stdev requires at least two data points')
621621
mss = ss / (n - 1)
622+
try:
623+
mss_numerator = mss.numerator
624+
mss_denominator = mss.denominator
625+
except AttributeError:
626+
raise ValueError('inf or nan encountered in data')
622627
if issubclass(T, Decimal):
623-
return _decimal_sqrt_of_frac(mss.numerator, mss.denominator)
624-
return _float_sqrt_of_frac(mss.numerator, mss.denominator)
628+
return _decimal_sqrt_of_frac(mss_numerator, mss_denominator)
629+
return _float_sqrt_of_frac(mss_numerator, mss_denominator)
625630

626631

627632
def pstdev(data, mu=None):
@@ -637,9 +642,14 @@ def pstdev(data, mu=None):
637642
if n < 1:
638643
raise StatisticsError('pstdev requires at least one data point')
639644
mss = ss / n
645+
try:
646+
mss_numerator = mss.numerator
647+
mss_denominator = mss.denominator
648+
except AttributeError:
649+
raise ValueError('inf or nan encountered in data')
640650
if issubclass(T, Decimal):
641-
return _decimal_sqrt_of_frac(mss.numerator, mss.denominator)
642-
return _float_sqrt_of_frac(mss.numerator, mss.denominator)
651+
return _decimal_sqrt_of_frac(mss_numerator, mss_denominator)
652+
return _float_sqrt_of_frac(mss_numerator, mss_denominator)
643653

644654

645655
## Statistics for relations between two inputs #############################

Lib/test/test_statistics.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2005,7 +2005,6 @@ def test_iter_list_same(self):
20052005
expected = self.func(data)
20062006
self.assertEqual(self.func(iter(data)), expected)
20072007

2008-
20092008
class TestPVariance(VarianceStdevMixin, NumericTestCase, UnivariateTypeMixin):
20102009
# Tests for population variance.
20112010
def setUp(self):
@@ -2113,6 +2112,14 @@ def test_center_not_at_mean(self):
21132112
self.assertEqual(self.func(data), 2.5)
21142113
self.assertEqual(self.func(data, mu=0.5), 6.5)
21152114

2115+
def test_gh_140938(self):
2116+
# Inputs with inf/nan should raise a ValueError
2117+
with self.assertRaises(ValueError):
2118+
self.func([1.0, math.inf])
2119+
with self.assertRaises(ValueError):
2120+
self.func([1.0, math.nan])
2121+
2122+
21162123
class TestSqrtHelpers(unittest.TestCase):
21172124

21182125
def test_integer_sqrt_of_frac_rto(self):
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
The :func:`statistics.stdev` and :func:`statistics.pstdev` functions now raise a
2+
:exc:`ValueError` when the input contains an infinity or a NaN.

0 commit comments

Comments
 (0)