def __init__(self, gdf, values, spatial_weights, unique_id, rng=None, verbose=True): try: from inequality.gini import Gini except ImportError: raise ImportError("The 'inequality' package is required.") self.gdf = gdf self.sw = spatial_weights self.id = gdf[unique_id] self.rng = rng data = gdf.copy() if values is not None: if not isinstance(values, str): data["mm_v"] = values values = "mm_v" self.values = data[values] if self.values.min() < 0: raise ValueError( "Values contain negative numbers. Normalise data before" "using momepy.Gini.") data = data.set_index(unique_id)[values] if rng: from momepy import limit_range results_list = [] for index in tqdm(data.index, total=data.shape[0], disable=not verbose): if index in spatial_weights.neighbors.keys(): neighbours = spatial_weights.neighbors[index].copy() if neighbours: neighbours.append(index) values_list = data.loc[neighbours].values if rng: values_list = limit_range(values_list, rng=rng) results_list.append(Gini(values_list).g) else: results_list.append(0) else: results_list.append(np.nan) self.series = pd.Series(results_list, index=gdf.index)
def test_Gini(self): g = Gini(self.y) np.testing.assert_almost_equal(g.g, 0.35372371173452849)