Source code for abed.results.ranks

"""
Functions for generating fractional ranks

"""

from .models import AbedTable, AbedTableTypes
from ..conf import settings


[docs]def get_ranks(x): """ Get ranks for a vector. This function assumes lower is better, so high numbers get a high rank. You can invert it with: [len(x) - t + 1 for t in ranks] >>> x = [7, 0.1, 0.5, 0.1, 10, 100, 200] >>> get_ranks(x) [4.0, 1.5, 3.0, 1.5, 5.0, 6.0, 7.0] """ l = len(x) r = 1 ranks = [0] * l while not all([k is None for k in x]): m = min([k for k in x if not k is None]) idx = [1 if k == m else 0 for k in x] s = sum(idx) ranks = [r + (s - 1) / 2.0 if idx[k] else ranks[k] for k in range(l)] r += s x = [None if idx[k] else x[k] for k in range(l)] return ranks
[docs]def make_rank_table(table): ranktable = AbedTable() ranktable.headers = table.headers[:] ranktable.higher_better = False ranktable.type = AbedTableTypes.RANKS ranktable.desc = table.desc ranktable.name = table.name ranktable.target = table.target ranktable.is_metric = table.is_metric if settings.TYPE == "ASSESS": ranktable.metricname = table.metricname elif settings.TYPE == "CV_TT": ranktable.trainmetricname = table.trainmetricname ranktable.testmetricname = table.testmetricname for _id, row in table: ranks = get_ranks(row) if table.higher_better: ranks = [len(ranks) - t + 1 for t in ranks] ranktable.add_row(_id, ranks) return ranktable