if n < 2:
raise StatisticsError('stdev requires at least two data points')
mss = ss / (n - 1)
+ try:
+ mss_numerator = mss.numerator
+ mss_denominator = mss.denominator
+ except AttributeError:
+ raise ValueError('inf or nan encountered in data')
if issubclass(T, Decimal):
- return _decimal_sqrt_of_frac(mss.numerator, mss.denominator)
- return _float_sqrt_of_frac(mss.numerator, mss.denominator)
+ return _decimal_sqrt_of_frac(mss_numerator, mss_denominator)
+ return _float_sqrt_of_frac(mss_numerator, mss_denominator)
def pstdev(data, mu=None):
if n < 1:
raise StatisticsError('pstdev requires at least one data point')
mss = ss / n
+ try:
+ mss_numerator = mss.numerator
+ mss_denominator = mss.denominator
+ except AttributeError:
+ raise ValueError('inf or nan encountered in data')
if issubclass(T, Decimal):
- return _decimal_sqrt_of_frac(mss.numerator, mss.denominator)
- return _float_sqrt_of_frac(mss.numerator, mss.denominator)
+ return _decimal_sqrt_of_frac(mss_numerator, mss_denominator)
+ return _float_sqrt_of_frac(mss_numerator, mss_denominator)
def _mean_stdev(data):
self.assertEqual(self.func(data), 2.5)
self.assertEqual(self.func(data, mu=0.5), 6.5)
+ def test_gh_140938(self):
+ # Inputs with inf/nan should raise a ValueError
+ with self.assertRaises(ValueError):
+ self.func([1.0, math.inf])
+ with self.assertRaises(ValueError):
+ self.func([1.0, math.nan])
+
+
class TestSqrtHelpers(unittest.TestCase):
def test_integer_sqrt_of_frac_rto(self):
data = (1.0, 2.0)
self.assertEqual(self.func(data, xbar=2.0), 1.0)
+ def test_gh_140938(self):
+ # Inputs with inf/nan should raise a ValueError
+ with self.assertRaises(ValueError):
+ self.func([1.0, math.inf])
+ with self.assertRaises(ValueError):
+ self.func([1.0, math.nan])
+
+
class TestGeometricMean(unittest.TestCase):
def test_basics(self):