]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-40855: Fix ignored mu and xbar parameters (GH-20835) (GH-20863)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sat, 13 Jun 2020 23:57:17 +0000 (16:57 -0700)
committerGitHub <noreply@github.com>
Sat, 13 Jun 2020 23:57:17 +0000 (16:57 -0700)
Lib/statistics.py
Lib/test/test_statistics.py
Misc/NEWS.d/next/Library/2020-06-12-10-44-15.bpo-40855.jSot83.rst [new file with mode: 0644]

index 1e95c0b6639f1703a56bd34ef673b4740505259f..c5c6e47fb3f3eb3fb10a37e52d46f9f43fc7eea8 100644 (file)
@@ -682,8 +682,10 @@ def _ss(data, c=None):
     calculated from ``c`` as given. Use the second case with care, as it can
     lead to garbage results.
     """
-    if c is None:
-        c = mean(data)
+    if c is not None:
+        T, total, count = _sum((x-c)**2 for x in data)
+        return (T, total)
+    c = mean(data)
     T, total, count = _sum((x-c)**2 for x in data)
     # The following sum should mathematically equal zero, but due to rounding
     # error may not.
index a9a427bc8d972ac09a0761be2d99dd1a861b6f53..5b8ad874a909080df5eac2bf58eaabf2692db384 100644 (file)
@@ -2029,6 +2029,10 @@ class TestVariance(VarianceStdevMixin, NumericTestCase, UnivariateTypeMixin):
         self.assertEqual(result, exact)
         self.assertIsInstance(result, Decimal)
 
+    def test_center_not_at_mean(self):
+        data = (1.0, 2.0)
+        self.assertEqual(self.func(data), 0.5)
+        self.assertEqual(self.func(data, xbar=2.0), 1.0)
 
 class TestPStdev(VarianceStdevMixin, NumericTestCase):
     # Tests for population standard deviation.
@@ -2041,6 +2045,11 @@ class TestPStdev(VarianceStdevMixin, NumericTestCase):
         expected = math.sqrt(statistics.pvariance(data))
         self.assertEqual(self.func(data), expected)
 
+    def test_center_not_at_mean(self):
+        # See issue: 40855
+        data = (3, 6, 7, 10)
+        self.assertEqual(self.func(data), 2.5)
+        self.assertEqual(self.func(data, mu=0.5), 6.5)
 
 class TestStdev(VarianceStdevMixin, NumericTestCase):
     # Tests for sample standard deviation.
@@ -2058,6 +2067,9 @@ class TestStdev(VarianceStdevMixin, NumericTestCase):
         expected = math.sqrt(statistics.variance(data))
         self.assertEqual(self.func(data), expected)
 
+    def test_center_not_at_mean(self):
+        data = (1.0, 2.0)
+        self.assertEqual(self.func(data, xbar=2.0), 1.0)
 
 class TestGeometricMean(unittest.TestCase):
 
diff --git a/Misc/NEWS.d/next/Library/2020-06-12-10-44-15.bpo-40855.jSot83.rst b/Misc/NEWS.d/next/Library/2020-06-12-10-44-15.bpo-40855.jSot83.rst
new file mode 100644 (file)
index 0000000..201d510
--- /dev/null
@@ -0,0 +1,2 @@
+The standard deviation and variance functions in the statistics module were
+ignoring their mu and xbar arguments.