def test_first_hill(self): # typical bimodal distribution data = np.concatenate([self.dist_norm1, self.dist_norm2])[:, np.newaxis] estimator = KernelDensity(kernel='gaussian', bandwidth=0.5) kde = estimator.fit(data) x, y = Analyze.density_func(data, kde, 100) obs_x, obs_y = Analyze.first_hill(x, y) exp_x, exp_y = 1.0971012583068704, 2.5302323352207674 self.assertAlmostEqual(obs_x, exp_x) self.assertAlmostEqual(obs_y, exp_y) # peak larger than valley data = np.negative(data) kde = estimator.fit(data) x, y = Analyze.density_func(data, kde, 100) with self.assertRaises(ValueError) as ctx: Analyze.first_hill(x, y) msg = 'Peak is larger than valley.' self.assertEqual(str(ctx.exception), msg) # unimodal distribution data = self.dist_norm1[:, np.newaxis] kde = estimator.fit(data) x, y = Analyze.density_func(data, kde, 100) with self.assertRaises(ValueError) as ctx: Analyze.first_hill(x, y) msg = 'Cannot identify at least two peaks.' self.assertEqual(str(ctx.exception), msg)
def test_plot_density(self): data = np.concatenate([self.dist_norm1, self.dist_norm2])[:, np.newaxis] estimator = KernelDensity(kernel='gaussian', bandwidth=0.5) kde = estimator.fit(data) x, y = Analyze.density_func(data, kde, 100) peak, valley = Analyze.first_hill(x, y) th = valley - (valley - peak) * 0.5 / 100 fp = join(self.tmpdir, 'tmp.png') Analyze.plot_density(x, y, peak, valley, th, fp) self.assertTrue(isfile(fp)) remove(fp)