Skip to content

Commit b693037

Browse files
gpsheadrhettingerpicnixz
authored
[3.13] pythongh-140938: Raise ValueError for infinite inputs to stdev/pstdev (pythonGH-141531) (python#141584)
pythongh-140938: Raise ValueError for infinite inputs to stdev/pstdev (pythonGH-141531) Raise ValueError for infinite inputs to stdev/pstdev --- (cherry picked from commit f0a8bc7) Co-authored-by: Raymond Hettinger <[email protected]> Co-authored-by: Bénédikt Tran <[email protected]>
1 parent 7e1a0db commit b693037

File tree

3 files changed

+32
-4
lines changed

3 files changed

+32
-4
lines changed

Lib/statistics.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,9 +1206,14 @@ def stdev(data, xbar=None):
12061206
if n < 2:
12071207
raise StatisticsError('stdev requires at least two data points')
12081208
mss = ss / (n - 1)
1209+
try:
1210+
mss_numerator = mss.numerator
1211+
mss_denominator = mss.denominator
1212+
except AttributeError:
1213+
raise ValueError('inf or nan encountered in data')
12091214
if issubclass(T, Decimal):
1210-
return _decimal_sqrt_of_frac(mss.numerator, mss.denominator)
1211-
return _float_sqrt_of_frac(mss.numerator, mss.denominator)
1215+
return _decimal_sqrt_of_frac(mss_numerator, mss_denominator)
1216+
return _float_sqrt_of_frac(mss_numerator, mss_denominator)
12121217

12131218

12141219
def pstdev(data, mu=None):
@@ -1224,9 +1229,14 @@ def pstdev(data, mu=None):
12241229
if n < 1:
12251230
raise StatisticsError('pstdev requires at least one data point')
12261231
mss = ss / n
1232+
try:
1233+
mss_numerator = mss.numerator
1234+
mss_denominator = mss.denominator
1235+
except AttributeError:
1236+
raise ValueError('inf or nan encountered in data')
12271237
if issubclass(T, Decimal):
1228-
return _decimal_sqrt_of_frac(mss.numerator, mss.denominator)
1229-
return _float_sqrt_of_frac(mss.numerator, mss.denominator)
1238+
return _decimal_sqrt_of_frac(mss_numerator, mss_denominator)
1239+
return _float_sqrt_of_frac(mss_numerator, mss_denominator)
12301240

12311241

12321242
def _mean_stdev(data):

Lib/test/test_statistics.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2122,6 +2122,14 @@ def test_center_not_at_mean(self):
21222122
self.assertEqual(self.func(data), 2.5)
21232123
self.assertEqual(self.func(data, mu=0.5), 6.5)
21242124

2125+
def test_gh_140938(self):
2126+
# Inputs with inf/nan should raise a ValueError
2127+
with self.assertRaises(ValueError):
2128+
self.func([1.0, math.inf])
2129+
with self.assertRaises(ValueError):
2130+
self.func([1.0, math.nan])
2131+
2132+
21252133
class TestSqrtHelpers(unittest.TestCase):
21262134

21272135
def test_integer_sqrt_of_frac_rto(self):
@@ -2240,6 +2248,14 @@ def test_center_not_at_mean(self):
22402248
data = (1.0, 2.0)
22412249
self.assertEqual(self.func(data, xbar=2.0), 1.0)
22422250

2251+
def test_gh_140938(self):
2252+
# Inputs with inf/nan should raise a ValueError
2253+
with self.assertRaises(ValueError):
2254+
self.func([1.0, math.inf])
2255+
with self.assertRaises(ValueError):
2256+
self.func([1.0, math.nan])
2257+
2258+
22432259
class TestGeometricMean(unittest.TestCase):
22442260

22452261
def test_basics(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)