longling.ML.toolkit.analyser.select 源代码

# coding: utf-8
# 2019/12/20 @ tongshiwei

from collections import OrderedDict
from longling.lib.candylib import as_list
from longling import PATH_TYPE, loading

__all__ = ["get_max", "get_by_key", "get_best", "get_min"]

from .utils import get_by_key


def get_best(src: (PATH_TYPE, list), *keys, with_keys: (str, None) = None, with_all=False, cmp=lambda x, y: x > y,
             merge=True):
    keys = as_list(keys)

    with_keys = [] if with_keys is None else with_keys.split(";")

    result = {
        key: None for key in keys
    }

    result_appendix = {
        key: None for key in keys
    }

    for data in loading(src):
        for key in result:
            _data = get_by_key(data, parsed_key=key)
            if result[key] is None or cmp(_data, result[key]):
                result[key] = _data
                if with_all:
                    result_appendix[key] = data
                elif with_keys:
                    result_appendix[key] = {_key: get_by_key(data, _key) for _key in with_keys}

    if merge:
        return _merge(result, result_appendix if with_all or with_keys else None)
    else:
        return result, result_appendix if with_all or with_keys else None


[文档]def get_max(src: (PATH_TYPE, list), *keys, with_keys: (str, None) = None, with_all=False, merge=True): """ Examples ------- >>> src = [ ... {"Epoch": 0, "macro avg": {"f1": 0.7}, "loss": 0.04, "accuracy": 0.7}, ... {"Epoch": 1, "macro avg": {"f1": 0.88}, "loss": 0.03, "accuracy": 0.8}, ... {"Epoch": 1, "macro avg": {"f1": 0.7}, "loss": 0.02, "accuracy": 0.66} ... ] >>> result, _ = get_max(src, "accuracy", merge=False) >>> result {'accuracy': 0.8} >>> _, result_appendix = get_max(src, "accuracy", with_all=True, merge=False) >>> result_appendix {'accuracy': {'Epoch': 1, 'macro avg': {'f1': 0.88}, 'loss': 0.03, 'accuracy': 0.8}} >>> result, result_appendix = get_max(src, "accuracy", "macro avg:f1", with_keys="Epoch", merge=False) >>> result {'accuracy': 0.8, 'macro avg:f1': 0.88} >>> result_appendix {'accuracy': {'Epoch': 1}, 'macro avg:f1': {'Epoch': 1}} >>> get_max(src, "accuracy", "macro avg:f1", with_keys="Epoch") {'accuracy': {'Epoch': 1, 'accuracy': 0.8}, 'macro avg:f1': {'Epoch': 1, 'macro avg:f1': 0.88}} """ return get_best( src, *keys, with_keys=with_keys, with_all=with_all, merge=merge )
[文档]def get_min(src: (PATH_TYPE, list), *keys, with_keys: (str, None) = None, with_all=False, merge=True): """ >>> src = [ ... {"Epoch": 0, "macro avg": {"f1": 0.7}, "loss": 0.04, "accuracy": 0.7}, ... {"Epoch": 1, "macro avg": {"f1": 0.88}, "loss": 0.03, "accuracy": 0.8}, ... {"Epoch": 1, "macro avg": {"f1": 0.7}, "loss": 0.02, "accuracy": 0.66} ... ] >>> get_min(src, "loss") {'loss': 0.02} """ return get_best( src, *keys, with_keys=with_keys, with_all=with_all, cmp=lambda x, y: x < y, merge=merge )
def _merge(result: dict, appendix): """ Examples -------- >>> _merge({"accuracy": 0.7}, {"accuracy": {"Epoch": 1, "accuracy": 0.7}}) {'accuracy': {'Epoch': 1, 'accuracy': 0.7}} """ if appendix: for key in appendix: appendix[key][key] = result[key] return appendix else: return result if __name__ == '__main__': src = [ {"Epoch": 0, "macro avg": {"f1": 0.7}, "loss": 0.04, "accuracy": 0.7}, {"Epoch": 1, "macro avg": {"f1": 0.88}, "loss": 0.03, "accuracy": 0.8}, {"Epoch": 1, "macro avg": {"f1": 0.7}, "loss": 0.02, "accuracy": 0.66} ] print(get_max(src, "accuracy", "macro avg:f1", with_keys="Epoch", merge=False))