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)
## Statistics for relations between two inputs #############################
expected = self.func(data)
self.assertEqual(self.func(iter(data)), expected)
-
class TestPVariance(VarianceStdevMixin, NumericTestCase, UnivariateTypeMixin):
# Tests for population variance.
def setUp(self):
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):