def test_merge(): t = TDigest() t2 = TDigest() t3 = TDigest() a = np.random.uniform(0, 1, N) b = np.random.uniform(2, 3, N) data = np.concatenate([a, b]) t2.update(a) t3.update(b) t2_centroids = t2.centroids() t.merge(t2, t3) assert t.min() == min(t2.min(), t3.min()) assert t.max() == max(t2.max(), t3.max()) assert t.size() == t2.size() + t3.size() # Check no mutation of args assert (t2.centroids() == t2_centroids).all() # *Quantile q = np.array([0.001, 0.01, 0.1, 0.3, 0.5, 0.7, 0.9, 0.99, 0.999]) est = t.quantile(q) q_est = quantiles_to_q(data, est) np.testing.assert_allclose(q, q_est, atol=0.012, rtol=0) # *CDF x = q_to_x(data, q) q_est = t.cdf(x) np.testing.assert_allclose(q, q_est, atol=0.005) with pytest.raises(TypeError): t.merge(t2, 'not a tdigest')
def test_small_w(): eps = np.finfo('f8').eps t = TDigest() t.update(gamma, eps) assert t.size() == 0 assert len(t.centroids()) == 0 t = TDigest() t.add(1, eps) assert t.size() == 0 assert len(t.centroids()) == 0
def test_scale(): t = TDigest() t.update(uniform) for factor in [0.5, 2]: t2 = t.scale(factor) assert t is not t2 assert t.size() * factor == t2.size() assert t.min() == t2.min() assert t.max() == t2.max() a = t.centroids() b = t2.centroids() np.testing.assert_array_equal(a['mean'], b['mean']) np.testing.assert_allclose(a['weight'] * factor, b['weight']) for val in [-0.5, 0, np.nan, np.inf]: with pytest.raises(ValueError): t.scale(val) with pytest.raises(TypeError): t.scale('foobar') # Test scale compacts eps = np.finfo('f8').eps t = TDigest() t.update([1, 2, 3, 4, 5], [1, 1000, 1, 10000, 1]) t2 = t.scale(eps) assert len(t2.centroids()) == 2 # Compacts to 0 t = TDigest() t.update([1, 2, 3, 4, 5]) t2 = t.scale(eps) assert len(t2.centroids()) == 0
def test_empty(): t = TDigest() assert t.size() == 0 assert len(t.centroids()) == 0 assert np.isnan(t.min()) assert np.isnan(t.max()) assert np.isnan(t.quantile(0.5)) assert np.isnan(t.cdf(0.5))