move to class-based module
This commit is contained in:
parent
a8bd122762
commit
2738c1f29c
@ -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)
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user