79 lines
2.5 KiB
Python
79 lines
2.5 KiB
Python
import unittest
|
|
import numpy as np
|
|
|
|
from helper import fixture_file
|
|
|
|
from crankshaft.clustering import Getis
|
|
import crankshaft.pysal_utils as pu
|
|
from crankshaft import random_seeds
|
|
import json
|
|
from crankshaft.analysis_data_provider import AnalysisDataProvider
|
|
|
|
# Fixture files produced as follows
|
|
#
|
|
# import pysal as ps
|
|
# import numpy as np
|
|
# import random
|
|
#
|
|
# # setup variables
|
|
# f = ps.open(ps.examples.get_path("stl_hom.dbf"))
|
|
# y = np.array(f.by_col['HR8893'])
|
|
# w_queen = ps.queen_from_shapefile(ps.examples.get_path("stl_hom.shp"))
|
|
#
|
|
# out_queen = [{"id": index + 1,
|
|
# "neighbors": [x+1 for x in w_queen.neighbors[index]],
|
|
# "value": val} for index, val in enumerate(y)]
|
|
#
|
|
# with open('neighbors_queen_getis.json', 'w') as f:
|
|
# f.write(str(out_queen))
|
|
#
|
|
# random.seed(1234)
|
|
# np.random.seed(1234)
|
|
# lgstar_queen = ps.esda.getisord.G_Local(y, w_queen, star=True,
|
|
# permutations=999)
|
|
#
|
|
# with open('getis_queen.json', 'w') as f:
|
|
# f.write(str(zip(lgstar_queen.z_sim,
|
|
# lgstar_queen.p_sim, lgstar_queen.p_z_sim)))
|
|
|
|
|
|
class FakeDataProvider(AnalysisDataProvider):
|
|
def __init__(self, mock_data):
|
|
self.mock_result = mock_data
|
|
|
|
def get_getis(self, w_type, param):
|
|
return self.mock_result
|
|
|
|
|
|
class GetisTest(unittest.TestCase):
|
|
"""Testing class for Getis-Ord's G* funtion
|
|
This test replicates the work done in PySAL documentation:
|
|
https://pysal.readthedocs.io/en/v1.11.0/users/tutorials/autocorrelation.html#local-g-and-g
|
|
"""
|
|
|
|
def setUp(self):
|
|
# load raw data for analysis
|
|
self.neighbors_data = json.loads(
|
|
open(fixture_file('neighbors_getis.json')).read())
|
|
|
|
# load pre-computed/known values
|
|
self.getis_data = json.loads(
|
|
open(fixture_file('getis.json')).read())
|
|
|
|
def test_getis_ord(self):
|
|
"""Test Getis-Ord's G*"""
|
|
data = [{'id': d['id'],
|
|
'attr1': d['value'],
|
|
'neighbors': d['neighbors']} for d in self.neighbors_data]
|
|
|
|
random_seeds.set_random_seeds(1234)
|
|
getis = Getis(FakeDataProvider(data))
|
|
|
|
result = getis.getis_ord('subquery', 'value',
|
|
'queen', None, 999, 'the_geom',
|
|
'cartodb_id')
|
|
result = [(row[0], row[1]) for row in result]
|
|
expected = np.array(self.getis_data)[:, 0:2]
|
|
for ([res_z, res_p], [exp_z, exp_p]) in zip(result, expected):
|
|
self.assertAlmostEqual(res_z, exp_z, delta=1e-2)
|