From ba875bc50b985a8712b9339972100ff6dbfe45e7 Mon Sep 17 00:00:00 2001 From: Andy Eschbacher Date: Tue, 27 Feb 2018 13:40:28 -0500 Subject: [PATCH] creates new functions which expose spatial lag --- src/pg/sql/10_moran.sql | 76 +++++++++++++++++-- .../crankshaft/crankshaft/clustering/moran.py | 11 ++- 2 files changed, 80 insertions(+), 7 deletions(-) diff --git a/src/pg/sql/10_moran.sql b/src/pg/sql/10_moran.sql index 840e07b..fd936b8 100644 --- a/src/pg/sql/10_moran.sql +++ b/src/pg/sql/10_moran.sql @@ -27,16 +27,48 @@ CREATE OR REPLACE FUNCTION permutations INT, geom_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, + spatial_lag NUMERIC) AS $$ from crankshaft.clustering import Moran moran = Moran() - # TODO: use named parameters or a dictionary return moran.local_stat(subquery, column_name, w_type, num_ngbrs, permutations, geom_col, id_col) $$ LANGUAGE plpythonu VOLATILE PARALLEL UNSAFE; --- Moran's I Local (public-facing function) + +-- Moran's I Local (public-facing function) - deprecated +CREATE OR REPLACE FUNCTION + CDB_MoransILocal( + subquery TEXT, + column_name TEXT, + w_type TEXT DEFAULT 'knn', + num_ngbrs INT DEFAULT 5, + permutations INT DEFAULT 99, + geom_col TEXT DEFAULT 'the_geom', + id_col TEXT DEFAULT 'cartodb_id') +RETURNS TABLE ( + moran NUMERIC, + quads TEXT, + significance NUMERIC, + rowid INT, + vals NUMERIC, + spatial_lag NUMERIC) +AS $$ + + SELECT moran, quads, significance, rowid, vals, spatial_lag + FROM cdb_crankshaft._CDB_AreasOfInterestLocal( + subquery, column_name, w_type, + num_ngbrs, permutations, geom_col, id_col); + +$$ LANGUAGE SQL VOLATILE PARALLEL UNSAFE; + +-- Moran's I Local (public-facing function) - DEPRECATED CREATE OR REPLACE FUNCTION CDB_AreasOfInterestLocal( subquery TEXT, @@ -144,7 +176,13 @@ CREATE OR REPLACE FUNCTION geom_col TEXT, id_col TEXT) RETURNS -TABLE(moran NUMERIC, quads TEXT, significance NUMERIC, rowid INT, vals NUMERIC) +TABLE( + moran NUMERIC, + quads TEXT, + significance NUMERIC, + rowid INT, + vals NUMERIC, + spatial_lag NUMERIC) AS $$ from crankshaft.clustering import Moran moran = Moran() @@ -152,7 +190,7 @@ AS $$ return moran.local_rate_stat(subquery, numerator, denominator, w_type, num_ngbrs, permutations, geom_col, id_col) $$ LANGUAGE plpythonu VOLATILE PARALLEL UNSAFE; --- Moran's I Local Rate (public-facing function) +-- Moran's I Local Rate (public-facing function) - DEPRECATED CREATE OR REPLACE FUNCTION CDB_AreasOfInterestLocalRate( subquery TEXT, @@ -172,6 +210,34 @@ AS $$ $$ LANGUAGE SQL VOLATILE PARALLEL UNSAFE; +-- Replaces CDB_AreasOfInterestLocalRate +CREATE OR REPLACE FUNCTION + CDB_MoransILocalRate( + subquery TEXT, + numerator TEXT, + denominator TEXT, + w_type TEXT DEFAULT 'knn', + num_ngbrs INT DEFAULT 5, + permutations INT DEFAULT 99, + geom_col TEXT DEFAULT 'the_geom', + id_col TEXT DEFAULT 'cartodb_id') +RETURNS +TABLE( + moran NUMERIC, + quads TEXT, + significance NUMERIC, + rowid INT, + vals NUMERIC, + spatial_lag NUMERIC) +AS $$ + + SELECT moran, quads, significance, rowid, vals, spatial_lag + FROM cdb_crankshaft._CDB_AreasOfInterestLocalRate( + subquery, numerator, denominator, w_type, + num_ngbrs, permutations, geom_col, id_col); + +$$ LANGUAGE SQL VOLATILE PARALLEL UNSAFE; + -- Moran's I Local Rate only for HH and HL (public-facing function) CREATE OR REPLACE FUNCTION CDB_GetSpatialHotspotsRate( diff --git a/src/py/crankshaft/crankshaft/clustering/moran.py b/src/py/crankshaft/crankshaft/clustering/moran.py index 0d5753f..cfd40dd 100644 --- a/src/py/crankshaft/crankshaft/clustering/moran.py +++ b/src/py/crankshaft/crankshaft/clustering/moran.py @@ -78,7 +78,11 @@ class Moran(object): # find quadrants for each geometry quads = quad_position(lisa.q) - return zip(lisa.Is, quads, lisa.p_sim, weight.id_order, lisa.y) + # calculate spatial lag + lag = ps.weights.spatial_lag.lag_spatial(weight, lisa.y) + + return zip(lisa.Is, quads, lisa.p_sim, weight.id_order, + lisa.y, lag) def global_rate_stat(self, subquery, numerator, denominator, w_type, num_ngbrs, permutations, geom_col, id_col): @@ -138,7 +142,10 @@ class Moran(object): # find quadrants for each geometry quads = quad_position(lisa.q) - return zip(lisa.Is, quads, lisa.p_sim, weight.id_order, lisa.y) + # spatial lag + lag = ps.weights.spatial_lag.lag_spatial(weight, lisa.y) + + return zip(lisa.Is, quads, lisa.p_sim, weight.id_order, lisa.y, lag) def local_bivariate_stat(self, subquery, attr1, attr2, permutations, geom_col, id_col,