move to class-based module

This commit is contained in:
Andy Eschbacher 2016-11-18 17:46:55 +00:00
parent a8bd122762
commit 2738c1f29c
2 changed files with 151 additions and 167 deletions

View File

@ -10,9 +10,11 @@ CREATE OR REPLACE FUNCTION
id_col TEXT DEFAULT 'cartodb_id') id_col TEXT DEFAULT 'cartodb_id')
RETURNS TABLE (moran NUMERIC, significance NUMERIC) RETURNS TABLE (moran NUMERIC, significance NUMERIC)
AS $$ AS $$
from crankshaft.clustering import moran from crankshaft.clustering import Moran
# TODO: use named parameters or a dictionary # TODO: use named parameters or a dictionary
return moran(subquery, column_name, w_type, num_ngbrs, permutations, geom_col, id_col) moran = Moran()
return moran.global_stat(subquery, column_name, w_type,
num_ngbrs, permutations, geom_col, id_col)
$$ LANGUAGE plpythonu; $$ LANGUAGE plpythonu;
-- Moran's I Local (internal function) -- Moran's I Local (internal function)
@ -27,9 +29,11 @@ CREATE OR REPLACE FUNCTION
id_col TEXT) id_col TEXT)
RETURNS TABLE (moran NUMERIC, quads TEXT, significance NUMERIC, rowid INT, vals NUMERIC) RETURNS TABLE (moran NUMERIC, quads TEXT, significance NUMERIC, rowid INT, vals NUMERIC)
AS $$ AS $$
from crankshaft.clustering import moran_local from crankshaft.clustering import Moran
moran = Moran()
# TODO: use named parameters or a dictionary # TODO: use named parameters or a dictionary
return moran_local(subquery, column_name, w_type, num_ngbrs, permutations, geom_col, id_col) return moran.local_stat(subquery, column_name, w_type,
num_ngbrs, permutations, geom_col, id_col)
$$ LANGUAGE plpythonu; $$ LANGUAGE plpythonu;
-- Moran's I Local (public-facing function) -- Moran's I Local (public-facing function)
@ -120,9 +124,11 @@ CREATE OR REPLACE FUNCTION
id_col TEXT DEFAULT 'cartodb_id') id_col TEXT DEFAULT 'cartodb_id')
RETURNS TABLE (moran FLOAT, significance FLOAT) RETURNS TABLE (moran FLOAT, significance FLOAT)
AS $$ AS $$
from crankshaft.clustering import moran_local from crankshaft.clustering import Moran
moran = Moran()
# TODO: use named parameters or a dictionary # TODO: use named parameters or a dictionary
return moran_rate(subquery, numerator, denominator, w_type, num_ngbrs, permutations, geom_col, id_col) return moran.global_rate_stat(subquery, numerator, denominator, w_type,
num_ngbrs, permutations, geom_col, id_col)
$$ LANGUAGE plpythonu; $$ LANGUAGE plpythonu;
@ -140,9 +146,10 @@ CREATE OR REPLACE FUNCTION
RETURNS RETURNS
TABLE(moran NUMERIC, quads TEXT, significance NUMERIC, rowid INT, vals NUMERIC) TABLE(moran NUMERIC, quads TEXT, significance NUMERIC, rowid INT, vals NUMERIC)
AS $$ AS $$
from crankshaft.clustering import moran_local_rate from crankshaft.clustering import Moran
moran = Moran()
# TODO: use named parameters or a dictionary # TODO: use named parameters or a dictionary
return moran_local_rate(subquery, numerator, denominator, w_type, num_ngbrs, permutations, geom_col, id_col) return moran.local_rate_stat(subquery, numerator, denominator, w_type, num_ngbrs, permutations, geom_col, id_col)
$$ LANGUAGE plpythonu; $$ LANGUAGE plpythonu;
-- Moran's I Local Rate (public-facing function) -- Moran's I Local Rate (public-facing function)

View File

@ -15,7 +15,23 @@ import crankshaft.pysal_utils as pu
# High level interface --------------------------------------- # High level interface ---------------------------------------
def moran(subquery, attr_name, class QueryRunner:
def get_result(self, query):
try:
data = plpy.execute(query)
except plpy.SPIError, err:
plpy.error("k-means (spatial) cluster analysis failed: %s" % err)
return data
class Moran:
def __init__(self, query_runner=None):
if query_runner is None:
self.query_runner = QueryRunner()
else:
self.query_runner = query_runner
def global_stat(self, subquery, attr_name,
w_type, num_ngbrs, permutations, geom_col, id_col): w_type, num_ngbrs, permutations, geom_col, id_col):
""" """
Moran's I (global) Moran's I (global)
@ -31,14 +47,7 @@ def moran(subquery, attr_name,
query = pu.construct_neighbor_query(w_type, qvals) query = pu.construct_neighbor_query(w_type, qvals)
try: result = self.query_runner.get_result(query)
result = plpy.execute(query)
# if there are no neighbors, exit
if len(result) == 0:
return pu.empty_zipped_array(2)
except plpy.SPIError, e:
plpy.error('Analysis failed: %s' % e)
return pu.empty_zipped_array(2)
# collect attributes # collect attributes
attr_vals = pu.get_attributes(result) attr_vals = pu.get_attributes(result)
@ -52,8 +61,7 @@ def moran(subquery, attr_name,
return zip([moran_global.I], [moran_global.EI]) return zip([moran_global.I], [moran_global.EI])
def local_stat(self, subquery, attr,
def moran_local(subquery, attr,
w_type, num_ngbrs, permutations, geom_col, id_col): w_type, num_ngbrs, permutations, geom_col, id_col):
""" """
Moran's I implementation for PL/Python Moran's I implementation for PL/Python
@ -71,14 +79,7 @@ def moran_local(subquery, attr,
query = pu.construct_neighbor_query(w_type, qvals) query = pu.construct_neighbor_query(w_type, qvals)
try: result = self.query_runner.get_result(query)
result = plpy.execute(query)
# if there are no neighbors, exit
if len(result) == 0:
return pu.empty_zipped_array(5)
except plpy.SPIError, e:
plpy.error('Analysis failed: %s' % e)
return pu.empty_zipped_array(5)
attr_vals = pu.get_attributes(result) attr_vals = pu.get_attributes(result)
weight = pu.get_weight(result, w_type, num_ngbrs) weight = pu.get_weight(result, w_type, num_ngbrs)
@ -92,8 +93,7 @@ def moran_local(subquery, attr,
return zip(lisa.Is, quads, lisa.p_sim, weight.id_order, lisa.y) return zip(lisa.Is, quads, lisa.p_sim, weight.id_order, lisa.y)
def global_rate_stat(self, subquery, numerator, denominator,
def moran_rate(subquery, numerator, denominator,
w_type, num_ngbrs, permutations, geom_col, id_col): w_type, num_ngbrs, permutations, geom_col, id_col):
""" """
Moran's I Rate (global) Moran's I Rate (global)
@ -108,14 +108,7 @@ def moran_rate(subquery, numerator, denominator,
query = pu.construct_neighbor_query(w_type, qvals) query = pu.construct_neighbor_query(w_type, qvals)
try: result = self.query_runner.get_result(query)
result = plpy.execute(query)
# if there are no neighbors, exit
if len(result) == 0:
return pu.empty_zipped_array(2)
except plpy.SPIError, e:
plpy.error('Analysis failed: %s' % e)
return pu.empty_zipped_array(2)
# collect attributes # collect attributes
numer = pu.get_attributes(result, 1) numer = pu.get_attributes(result, 1)
@ -129,8 +122,7 @@ def moran_rate(subquery, numerator, denominator,
return zip([lisa_rate.I], [lisa_rate.EI]) return zip([lisa_rate.I], [lisa_rate.EI])
def local_rate_stat(self, subquery, numerator, denominator,
def moran_local_rate(subquery, numerator, denominator,
w_type, num_ngbrs, permutations, geom_col, id_col): w_type, num_ngbrs, permutations, geom_col, id_col):
""" """
Moran's I Local Rate Moran's I Local Rate
@ -148,14 +140,7 @@ def moran_local_rate(subquery, numerator, denominator,
query = pu.construct_neighbor_query(w_type, qvals) query = pu.construct_neighbor_query(w_type, qvals)
try: result = self.query_runner.get_result(query)
result = plpy.execute(query)
# if there are no neighbors, exit
if len(result) == 0:
return pu.empty_zipped_array(5)
except plpy.SPIError, e:
plpy.error('Analysis failed: %s' % e)
return pu.empty_zipped_array(5)
# collect attributes # collect attributes
numer = pu.get_attributes(result, 1) numer = pu.get_attributes(result, 1)
@ -172,9 +157,9 @@ def moran_local_rate(subquery, numerator, denominator,
return zip(lisa.Is, quads, lisa.p_sim, weight.id_order, lisa.y) return zip(lisa.Is, quads, lisa.p_sim, weight.id_order, lisa.y)
def local_bivariate_stat(self, subquery, attr1, attr2,
def moran_local_bv(subquery, attr1, attr2, permutations, geom_col, id_col,
permutations, geom_col, id_col, w_type, num_ngbrs): w_type, num_ngbrs):
""" """
Moran's I (local) Bivariate (untested) Moran's I (local) Bivariate (untested)
""" """
@ -188,15 +173,7 @@ def moran_local_bv(subquery, attr1, attr2,
query = pu.construct_neighbor_query(w_type, qvals) query = pu.construct_neighbor_query(w_type, qvals)
try: result = self.query_runner.get_result(query)
result = plpy.execute(query)
# if there are no neighbors, exit
if len(result) == 0:
return pu.empty_zipped_array(4)
except plpy.SPIError:
plpy.error("Error: areas of interest query failed, "
"check input parameters")
return pu.empty_zipped_array(4)
# collect attributes # collect attributes
attr1_vals = pu.get_attributes(result, 1) attr1_vals = pu.get_attributes(result, 1)