Skip to content

Commit 3b2ee7d

Browse files
committed
review by @martinfleis: prep for tests and benchmarking
1 parent b9f6161 commit 3b2ee7d

File tree

3 files changed

+70
-81
lines changed

3 files changed

+70
-81
lines changed

esda/crand.py

+2-14
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,9 @@
88
import numpy as np
99

1010
try:
11-
from numba import boolean, jit, njit, prange
11+
from numba import boolean, njit, prange
1212
except (ImportError, ModuleNotFoundError):
13-
14-
def jit(*dec_args, **dec_kwargs):
15-
"""
16-
decorator mimicking numba.jit
17-
"""
18-
19-
def intercepted_function(f, *f_args, **f_kwargs):
20-
return f
21-
22-
return intercepted_function
23-
24-
njit = jit
25-
13+
from libpysal.common import jit as njit
2614
prange = range
2715
boolean = bool
2816

esda/significance.py

+1-67
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,7 @@
44
try:
55
from numba import njit
66
except (ImportError, ModuleNotFoundError):
7-
8-
def jit(*dec_args, **dec_kwargs):
9-
"""
10-
decorator mimicking numba.jit
11-
"""
12-
13-
def intercepted_function(f, *f_args, **f_kwargs):
14-
return f
15-
16-
return intercepted_function
17-
18-
njit = jit
19-
7+
from libpysal.common import jit as njit
208

219

2210
def calculate_significance(test_stat, reference_distribution, alternative="two-sided"):
@@ -108,57 +96,3 @@ def _permutation_significance(test_stat, reference_distribution, alternative='tw
10896
return p_value
10997

11098

111-
if __name__ == "__main__":
112-
import numpy
113-
import esda
114-
import pandas
115-
from libpysal.weights import Voronoi
116-
117-
coordinates = numpy.random.random(size=(2000, 2))
118-
x = numpy.random.normal(size=(2000,))
119-
w = Voronoi(coordinates, clip="bbox")
120-
w.transform = "r"
121-
stat = esda.Moran_Local(x, w)
122-
123-
ts = calculate_significance(stat.Is, stat.rlisas, method="two-sided")
124-
di = calculate_significance(stat.Is, stat.rlisas, method="directed")
125-
lt = calculate_significance(stat.Is, stat.rlisas, method="lesser")
126-
gt = calculate_significance(stat.Is, stat.rlisas, method="greater")
127-
fo = calculate_significance(stat.Is, stat.rlisas, method="folded")
128-
129-
numpy.testing.assert_array_equal(
130-
numpy.minimum(lt, gt), di
131-
) # di is just the minimum of the two tests
132-
133-
print(
134-
f"directed * 2 is the same as two-sided {(di*2 == ts).mean()*100}% of the time"
135-
)
136-
137-
print(
138-
pandas.DataFrame(
139-
numpy.column_stack((ts, di, fo, lt, gt)),
140-
columns=["two-sided", "directed", "folded", "lt", "gt"],
141-
).corr()
142-
)
143-
144-
answer = input("run big simulation? [y/n]")
145-
if answer.lower().startswith("y"):
146-
all_correlations = []
147-
for i in range(1000):
148-
x = numpy.random.normal(size=(2000,))
149-
stat = esda.Moran_Local(x, w)
150-
ts = calculate_significance(stat.Is, stat.rlisas, method="two-sided")
151-
di = calculate_significance(stat.Is, stat.rlisas, method="directed")
152-
lt = calculate_significance(stat.Is, stat.rlisas, method="lesser")
153-
gt = calculate_significance(stat.Is, stat.rlisas, method="greater")
154-
fo = calculate_significance(stat.Is, stat.rlisas, method="folded")
155-
corrs = (
156-
pandas.DataFrame(
157-
numpy.column_stack((ts, di, fo, lt, gt)),
158-
columns=["two-sided", "directed", "folded", "lt", "gt"],
159-
)
160-
.corr()
161-
.assign(repno=i)
162-
)
163-
all_correlations.append(corrs)
164-
all_correlations = pandas.concat(all_correlations)

esda/tests/test_significance.py

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import numpy
2+
import esda
3+
import pandas
4+
from libpysal.weights import Voronoi
5+
6+
#this was more a validation exercise than a test.
7+
#Set tests to check:
8+
#1. the results of the two sided are always greater than the directed
9+
#2. the results of the directed are equal to either the lesser or greater
10+
#3. the folded variant is close to the two-sided variant in a normal problem,
11+
# but is similar to the one-sided test in a very skewed problem
12+
#4. all p-values are between 0 and 1, with some p-values near 1
13+
#5. no directed p-value will be bigger than .5
14+
15+
def test_significance():
16+
raise NotImplementedError()
17+
18+
"""
19+
coordinates = numpy.random.random(size=(2000, 2))
20+
x = numpy.random.normal(size=(2000,))
21+
w = Voronoi(coordinates, clip="bbox")
22+
w.transform = "r"
23+
stat = esda.Moran_Local(x, w)
24+
25+
ts = calculate_significance(stat.Is, stat.rlisas, method="two-sided")
26+
di = calculate_significance(stat.Is, stat.rlisas, method="directed")
27+
lt = calculate_significance(stat.Is, stat.rlisas, method="lesser")
28+
gt = calculate_significance(stat.Is, stat.rlisas, method="greater")
29+
fo = calculate_significance(stat.Is, stat.rlisas, method="folded")
30+
31+
numpy.testing.assert_array_equal(
32+
numpy.minimum(lt, gt), di
33+
) # di is just the minimum of the two tests
34+
35+
print(
36+
f"directed * 2 is the same as two-sided {(di*2 == ts).mean()*100}% of the time"
37+
)
38+
39+
print(
40+
pandas.DataFrame(
41+
numpy.column_stack((ts, di, fo, lt, gt)),
42+
columns=["two-sided", "directed", "folded", "lt", "gt"],
43+
).corr()
44+
)
45+
46+
answer = input("run big simulation? [y/n]")
47+
if answer.lower().startswith("y"):
48+
all_correlations = []
49+
for i in range(1000):
50+
x = numpy.random.normal(size=(2000,))
51+
stat = esda.Moran_Local(x, w)
52+
ts = calculate_significance(stat.Is, stat.rlisas, method="two-sided")
53+
di = calculate_significance(stat.Is, stat.rlisas, method="directed")
54+
lt = calculate_significance(stat.Is, stat.rlisas, method="lesser")
55+
gt = calculate_significance(stat.Is, stat.rlisas, method="greater")
56+
fo = calculate_significance(stat.Is, stat.rlisas, method="folded")
57+
corrs = (
58+
pandas.DataFrame(
59+
numpy.column_stack((ts, di, fo, lt, gt)),
60+
columns=["two-sided", "directed", "folded", "lt", "gt"],
61+
)
62+
.corr()
63+
.assign(repno=i)
64+
)
65+
all_correlations.append(corrs)
66+
all_correlations = pandas.concat(all_correlations)
67+
"""

0 commit comments

Comments
 (0)