1import unittest
2import libpysal as ps
3from .. import rank
4import numpy as np
5
6
7class Theta_Tester(unittest.TestCase):
8    def setUp(self):
9        f = ps.io.open(ps.examples.get_path("mexico.csv"))
10        vnames = ["pcgdp%d" % dec for dec in range(1940, 2010, 10)]
11        self.y = np.transpose(np.array([f.by_col[v] for v in vnames]))
12        self.regime = np.array(f.by_col["esquivel99"])
13
14    def test_Theta(self):
15        np.random.seed(10)
16        t = rank.Theta(self.y, self.regime, 999)
17        k = self.y.shape[1]
18        obs = t.theta.tolist()
19        exp = [[0.41538462, 0.28070175, 0.61363636, 0.62222222, 0.33333333, 0.47222222]]
20        for i in range(k - 1):
21            self.assertAlmostEqual(exp[0][i], obs[0][i])
22        obs = t.pvalue_left.tolist()
23        exp = [0.307, 0.077, 0.823, 0.552, 0.045, 0.735]
24        for i in range(k - 1):
25            self.assertAlmostEqual(exp[i], obs[i])
26        obs = t.total.tolist()
27        exp = [130.0, 114.0, 88.0, 90.0, 90.0, 72.0]
28        for i in range(k - 1):
29            self.assertAlmostEqual(exp[i], obs[i])
30        self.assertEqual(t.max_total, 512)
31
32
33class SpatialTau_Tester(unittest.TestCase):
34    def setUp(self):
35        f = ps.io.open(ps.examples.get_path("mexico.csv"))
36        vnames = ["pcgdp%d" % dec for dec in range(1940, 2010, 10)]
37        self.y = np.transpose(np.array([f.by_col[v] for v in vnames]))
38        regime = np.array(f.by_col["esquivel99"])
39        self.w = ps.weights.block_weights(regime)
40
41    def test_SpatialTau(self):
42        np.random.seed(12345)
43        k = self.y.shape[1]
44        obs = [
45            rank.SpatialTau(self.y[:, i], self.y[:, i + 1], self.w, 99)
46            for i in range(k - 1)
47        ]
48        tau_s = [0.397, 0.492, 0.651, 0.714, 0.683, 0.810]
49        ev_tau_s = [0.659, 0.706, 0.772, 0.752, 0.705, 0.819]
50        p_vals = [0.010, 0.010, 0.020, 0.210, 0.270, 0.280]
51        for i in range(k - 1):
52            self.assertAlmostEqual(tau_s[i], obs[i].tau_spatial, 3)
53            self.assertAlmostEqual(ev_tau_s[i], obs[i].taus.mean(), 3)
54            self.assertAlmostEqual(p_vals[i], obs[i].tau_spatial_psim, 3)
55        st12 = rank.SpatialTau(self.y[:, 1], self.y[:, 2], self.w)
56        st21 = rank.SpatialTau(self.y[:, 2], self.y[:, 1], self.w)
57        self.assertEqual(st12.tau_spatial, st21.tau_spatial)
58
59
60class Tau_Tester(unittest.TestCase):
61    def test_Tau(self):
62        x1 = [12, 2, 1, 12, 2]
63        x2 = [1, 4, 7, 1, 0]
64        kt = rank.Tau(x1, x2)
65        self.assertAlmostEqual(kt.tau, -0.47140452079103173, 5)
66        self.assertAlmostEqual(kt.tau_p, 0.24821309157521476, 5)
67        x1 = [0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1]
68        x2 = [1, 4, 7, 1, 1, 3, 1, 6, 7, 7, 3, 6, 2, 7, 2, 8]
69        kt12 = rank.Tau(x1, x2)
70        kt21 = rank.Tau(x2, x1)
71        self.assertEqual(kt12.tau, kt21.tau)
72        self.assertAlmostEqual(kt12.tau, 0.15494494670022804)
73
74
75suite = unittest.TestSuite()
76test_classes = [Theta_Tester, SpatialTau_Tester, Tau_Tester]
77for i in test_classes:
78    a = unittest.TestLoader().loadTestsFromTestCase(i)
79    suite.addTest(a)
80
81if __name__ == "__main__":
82    runner = unittest.TextTestRunner()
83    runner.run(suite)
84