Source code for distopia.metrics
"""
States Metrics
=================
Defines metrics that summarize the state based on the districts.
"""
from distopia.district.metrics import DistrictAggregateMetric
import numpy as np
__all__ = ('StateMetric', )
[docs]class StateMetric(object):
"""Metrics used across :class:`distopia.district.District`.
"""
name = ''
"""A globally unique metric name that describes the metric.
"""
districts = []
scalar_value = 0
scalar_std = 0
scalar_maximum = 0
scalar_label = ''
data = []
labels = []
def __init__(self, name, districts, **kwargs):
super(StateMetric, self).__init__(**kwargs)
self.name = name
self.districts = districts
def compute(self):
raise NotImplementedError
def get_data(self):
raise NotImplementedError
class MeanStateMetric(StateMetric):
def compute(self):
name = self.name
metrics = [district.metrics[name] for district in self.districts]
assert all((isinstance(m, DistrictAggregateMetric) for m in metrics))
if not metrics:
self.scalar_value = 0
self.scalar_maximum = 0
self.scalar_std = 0
else:
self.scalar_value = sum(
(m.scalar_value for m in metrics)) / float(len(metrics))
self.scalar_std = np.std([m.scalar_value for m in metrics])
self.scalar_maximum = max((m.scalar_maximum for m in metrics))
self.scalar_label = name
def get_data(self):
return {
"name": self.name, "labels": self.labels, "data": self.data,
"scalar_value": self.scalar_value,
"scalar_maximum": self.scalar_maximum,
"scalar_std": self.scalar_std,
"scalar_label": self.scalar_label}