def get_disaggregated_stats(self, metrics, top_splitters,
lang=UNSPECIFIED_TRANSLATION, limit=100):
parent = super(NumField, self)
stats = parent.get_disaggregated_stats(metrics, top_splitters, lang,
limit)
substats = {}
# transpose the metrics data structure to look like
# {splitter1: [x, y, z], splitter2...}}
inversed_metrics = defaultdict(list)
for val, counter in metrics.items():
if val is None:
continue
for splitter, count in counter.items():
inversed_metrics[splitter].extend([val] * count)
for splitter, values in inversed_metrics.items():
val_stats = substats[splitter] = {
'median': '*',
'mean': '*',
'mode': '*',
'stdev': '*'
}
try:
# require a non empty dataset
val_stats['mean'] = statistics.mean(values)
val_stats['median'] = statistics.median(values)
# requires at least 2 values in the dataset
val_stats['stdev'] = statistics.stdev(values,
xbar=val_stats['mean'])
# requires a non empty dataset and a unique mode
val_stats['mode'] = statistics.mode(values)
except statistics.StatisticsError:
pass
stats.update({
'values': tuple(substats.items())[:limit]
})
return stats
评论列表
文章目录