From db405dee5cd4495996e803c8b34d773b1ab161ab Mon Sep 17 00:00:00 2001
From: Tobias Schmidt <tobias.schmidt@unibas.ch>
Date: Thu, 3 Feb 2011 18:14:31 +0100
Subject: [PATCH] fixed median calculation for very small data sets

---
 modules/base/pymod/stutil.py      |  4 ++--
 modules/base/tests/test_stutil.py | 10 ++++++++++
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/modules/base/pymod/stutil.py b/modules/base/pymod/stutil.py
index 1c485127e..e61a1687c 100644
--- a/modules/base/pymod/stutil.py
+++ b/modules/base/pymod/stutil.py
@@ -56,9 +56,9 @@ def Median(xs):
     raise RuntimeError("Can't calculate median of empty sequence")
   sorted_xs=sorted(xs)
   if (len(xs) % 2)==0:
-    return (sorted_xs[len(xs)/2]+sorted_xs[len(xs)/2+1])/2
+    return (sorted_xs[(len(xs)-1)/2]+sorted_xs[(len(xs)-1)/2+1])/2.0
   else:
-    return sorted_xs[len(xs)/2]
+    return sorted_xs[(len(xs)-1)/2]
 
 @FloatValueExtract
 def StdDev(xs):
diff --git a/modules/base/tests/test_stutil.py b/modules/base/tests/test_stutil.py
index 6c64f0e6b..6cc4570b5 100644
--- a/modules/base/tests/test_stutil.py
+++ b/modules/base/tests/test_stutil.py
@@ -7,11 +7,15 @@ class TestStUtils(unittest.TestCase):
     self.data1 = [0,1,2,3,4,5,6,-5,-4,-3,-2,-1,1]
     self.data2 = [1,2,3,4,5,6,7,8,9,10,11,12,13]
     self.data3 = [0.1,0.5,0.7,2.4,0.5,4.1,0.9,-1.1,-0.5,0.7,-1.4,-7.5,8.5]
+    self.data_short = [0,1]
+    self.data_short2 = [0,1,2]
 
     self.mean = 0.5384615385
     self.mean2 = 0.6076923077
     self.median = 1
     self.median2 = 0.5
+    self.median_short = 0.5
+    self.median_short2 = 1.0
     self.stddev = 3.3192998478
     self.stddev2 = 3.4192805223
     self.minimum = -5
@@ -42,6 +46,12 @@ class TestStUtils(unittest.TestCase):
     assert self.isSimilar(stutil.Median(self.data3), self.median2, 0.001), \
            "Median (%f) does not correspond to precalculated median (%f)" % \
            (stutil.Median(self.data3), self.median2)
+    assert self.isSimilar(stutil.Median(self.data_short), self.median_short, 0.001), \
+           "Median (%f) does not correspond to precalculated median (%f)" % \
+           (stutil.Median(self.data_short), self.median_short)
+    assert self.isSimilar(stutil.Median(self.data_short2), self.median_short2, 0.001), \
+           "Median (%f) does not correspond to precalculated median (%f)" % \
+           (stutil.Median(self.data_short2), self.median_short2)
 
   def testStddev(self):
     assert self.isSimilar(stutil.StdDev(self.data1), self.stddev, 0.001), \
-- 
GitLab