def test_merge(self): stats = StatCounter([1.0, 2.0, 3.0, 4.0]) stats.merge(5.0) self.assertEqual(stats.count(), 5) self.assertEqual(stats.max(), 5.0) self.assertEqual(stats.mean(), 3.0) self.assertEqual(stats.min(), 1.0) self.assertAlmostEqual(stats.stdev(), 1.414213562373095) self.assertAlmostEqual(stats.sampleStdev(), 1.5811388300841898) self.assertEqual(stats.sum(), 15.0) self.assertAlmostEqual(stats.variance(), 2.0) self.assertAlmostEqual(stats.sampleVariance(), 2.5)
class NAStatCounter: def __init__(self): self.stats = StatCounter() self.missing = long(0) def add(self, x): if x is None: self.missing += 1 else: self.stats.merge(x) return self def mergeStats(self, other): self.stats.mergeStats(other.stats) self.missing += other.missing return self def __repr__(self): return "stats: {0}, NaN: {1}".format(self.stats, self.missing)
def stats(d): s = StatCounter() return s.merge(((d.days * 24 * 3600) + d.seconds))