Source code for segregation.local.local_relative_centralization
"""Multigroup Relative Centralization index"""
__author__ = "Renan X. Cortes <renanc@ucr.edu>, Sergio J. Rey <sergio.rey@ucr.edu> and Elijah Knaap <elijah.knaap@ucr.edu>"
import libpysal as lps
import numpy as np
from segregation.singlegroup import RelativeCentralization
from .._base import MultiGroupIndex, SpatialExplicitIndex
np.seterr(divide="ignore", invalid="ignore")
def _local_relative_centralization(data, group_pop_var, total_pop_var, W=None, k=5):
"""
Calculation of Local Relative Centralization index for each unit
Parameters
----------
data : a geopandas DataFrame with a geometry column.
group_pop_var : string
The name of variable in data that contains the population size of the group of interest
total_pop_var : string
The name of variable in data that contains the total population of the unit
k_neigh : integer greater than 0. Default is 5.
Number of assumed neighbors for local context (it uses k-nearest algorithm method)
Returns
-------
statistics : np.array(n)
Local Relative Centralization values for each unit
core_data : a pandas DataFrame
A pandas DataFrame that contains the columns used to perform the estimate.
Notes
-----
Based on Folch, David C., and Sergio J. Rey. "The centralization index: A measure of local spatial segregation." Papers in Regional Science 95.3 (2016): 555-576.
Reference: :cite:`folch2016centralization`.
"""
data = data.copy()
if not W:
W = lps.weights.KNN.from_dataframe(data, k=5)
core_data = data[[group_pop_var, total_pop_var, data.geometry.name]]
c_lons = data.centroid.map(lambda p: p.x)
c_lats = data.centroid.map(lambda p: p.y)
points = list(zip(c_lons, c_lats))
kd = lps.cg.kdtree.KDTree(np.array(points))
local_RCEs = np.empty(len(data))
for i in range(len(data)):
x = list(W.neighbors.values())[i]
x.append(
list(W.neighbors.keys())[i]
) # Append in the end the current unit i inside the local context
local_data = data.iloc[x, :].copy()
# The center is given by the last position (i.e. the current unit i)
local_RCE = RelativeCentralization(
local_data, group_pop_var, total_pop_var, center=len(local_data) - 1
)
local_RCEs[i] = local_RCE.statistic
return local_RCEs, core_data
[docs]
class LocalRelativeCentralization(MultiGroupIndex, SpatialExplicitIndex):
"""Multigroup Local Simpson's Concentration Index.
Parameters
----------
data : pandas.DataFrame or geopandas.GeoDataFrame, required
dataframe or geodataframe if spatial index holding data for location of interest
groups : list, required
list of columns on dataframe holding population totals for each group
w : libpysal.W, optional
lipysal spatial weights object used to define a local neighborhood. If none is passed,
a KNN ojbect with k=5 will be used
network : pandana.Network
pandana Network object representing the study area
distance : int
Maximum distance (in units of geodataframe CRS) to consider the extent of the egohood
decay : str
type of decay function to apply. Options include
precompute : bool
Whether to precompute the pandana Network object
Attributes
----------
statistic : float
Multigroup Dissimilarity Index value
core_data : a pandas DataFrame
DataFrame that contains the columns used to perform the estimate.
Notes
-----
Based on Folch, David C., and Sergio J. Rey. "The centralization index: A measure of local spatial segregation." Papers in Regional Science 95.3 (2016): 555-576.
Reference: :cite:`folch2016centralization`.
"""
[docs]
def __init__(
self,
data,
group_pop_var=None,
total_pop_var=None,
w=None,
network=None,
distance=None,
decay=None,
precompute=None,
groups=None,
):
"""Init."""
MultiGroupIndex.__init__(self, data, groups)
if any([w, network, distance]):
SpatialExplicitIndex.__init__(self)
aux = _local_relative_centralization(
self.data, group_pop_var=group_pop_var, total_pop_var=total_pop_var, W=w
)
self.statistics = aux[0]
self.data = aux[1]
self._function = _local_relative_centralization