Exemple #1
0
def show_experiments(all_experiments,
                     pager=True,
                     no_timestamp=False,
                     show_csv=False,
                     **kwargs):
    from funcy.seqs import flatten as flatten_list

    include_metrics = _parse_filter_list(kwargs.pop("include_metrics", []))
    exclude_metrics = _parse_filter_list(kwargs.pop("exclude_metrics", []))
    include_params = _parse_filter_list(kwargs.pop("include_params", []))
    exclude_params = _parse_filter_list(kwargs.pop("exclude_params", []))

    metric_names, param_names = _collect_names(
        all_experiments,
        include_metrics=include_metrics,
        exclude_metrics=exclude_metrics,
        include_params=include_params,
        exclude_params=exclude_params,
    )

    headers = [
        "Experiment",
        "rev",
        "typ",
        "Created",
        "parent",
        "State",
        "Executor",
    ]

    names = {**metric_names, **param_names}
    counter = Counter(flatten_list([list(a.keys()) for a in names.values()]))
    counter.update(headers)
    metric_headers = _normalize_headers(metric_names, counter)
    param_headers = _normalize_headers(param_names, counter)

    td = experiments_table(
        all_experiments,
        headers,
        metric_headers,
        metric_names,
        param_headers,
        param_names,
        kwargs.get("sort_by"),
        kwargs.get("sort_order"),
        kwargs.get("precision"),
        kwargs.get("fill_value"),
        kwargs.get("iso"),
    )

    if no_timestamp:
        td.drop("Created")

    for col in ("State", "Executor"):
        if td.is_empty(col):
            td.drop(col)

    row_styles = lmap(baseline_styler, td.column("typ"))

    if not show_csv:
        merge_headers = ["Experiment", "rev", "typ", "parent"]
        td.column("Experiment")[:] = map(prepare_exp_id,
                                         td.as_dict(merge_headers))
        td.drop(*merge_headers[1:])

    headers = {"metrics": metric_headers, "params": param_headers}
    styles = {
        "Experiment": {
            "no_wrap": True,
            "header_style": "black on grey93"
        },
        "Created": {
            "header_style": "black on grey93"
        },
        "State": {
            "header_style": "black on grey93"
        },
        "Executor": {
            "header_style": "black on grey93"
        },
    }
    header_bg_colors = {"metrics": "cornsilk1", "params": "light_cyan1"}
    styles.update({
        header: {
            "justify": "right" if typ == "metrics" else "left",
            "header_style": f"black on {header_bg_colors[typ]}",
            "collapse": idx != 0,
            "no_wrap": typ == "metrics",
        }
        for typ, hs in headers.items() for idx, header in enumerate(hs)
    })

    td.render(
        pager=pager,
        borders=True,
        rich_table=True,
        header_styles=styles,
        row_styles=row_styles,
        show_csv=show_csv,
    )
Exemple #2
0
def show_experiments(
    all_experiments,
    keep=None,
    drop=None,
    pager=True,
    csv=False,
    markdown=False,
    pcp=False,
    **kwargs,
):
    from funcy.seqs import flatten as flatten_list

    metric_names, param_names, deps_names = _collect_names(all_experiments)

    headers = [
        "Experiment",
        "rev",
        "typ",
        "Created",
        "parent",
        "State",
        "Executor",
    ]

    names = {**metric_names, **param_names}
    counter = Counter(flatten_list([list(a.keys()) for a in names.values()]))
    counter.update(headers)
    metric_headers = _normalize_headers(metric_names, counter)
    param_headers = _normalize_headers(param_names, counter)

    td = experiments_table(
        all_experiments,
        headers,
        metric_headers,
        metric_names,
        param_headers,
        param_names,
        deps_names,
        kwargs.get("sort_by"),
        kwargs.get("sort_order"),
        kwargs.get("precision"),
        kwargs.get("fill_value"),
        kwargs.get("iso"),
    )
    if keep:
        for col in td.keys():
            if re.match(keep, col):
                td.protect(col)

    for col in ("State", "Executor"):
        if td.is_empty(col):
            td.drop(col)

    row_styles = lmap(baseline_styler, td.column("typ"))

    if not csv:
        merge_headers = ["Experiment", "rev", "typ", "parent"]
        td.column("Experiment")[:] = map(
            prepare_exp_id, td.as_dict(merge_headers)
        )
        td.drop(*merge_headers[1:])

    headers = {
        "metrics": metric_headers,
        "params": param_headers,
        "deps": deps_names,
    }
    styles = {
        "Experiment": {"no_wrap": True, "header_style": "black on grey93"},
        "Created": {"header_style": "black on grey93"},
        "State": {"header_style": "black on grey93"},
        "Executor": {"header_style": "black on grey93"},
    }
    header_bg_colors = {
        "metrics": "cornsilk1",
        "params": "light_cyan1",
        "deps": "plum2",
    }
    styles.update(
        {
            header: {
                "justify": "right" if typ == "metrics" else "left",
                "header_style": f"black on {header_bg_colors[typ]}",
                "collapse": idx != 0,
                "no_wrap": typ == "metrics",
            }
            for typ, hs in headers.items()
            for idx, header in enumerate(hs)
        }
    )

    if kwargs.get("only_changed", False) or pcp:
        td.drop_duplicates("cols", ignore_empty=False)

    cols_to_drop = set()
    if drop is not None:
        cols_to_drop = {col for col in td.keys() if re.match(drop, col)}
    if pcp:
        cols_to_drop.add("Created")
    td.drop(*cols_to_drop)

    if pcp:
        subset = {x for x in td.keys() if x != "Experiment"}
        td.dropna(
            "rows",
            how="all",
            subset=subset,
        )
        td.drop_duplicates("rows", subset=subset)
        td.column("Experiment")[:] = [
            # remove tree characters
            str(x).encode("ascii", "ignore").strip().decode()
            for x in td.column("Experiment")
        ]
        out = kwargs.get("out") or "dvc_plots"
        ui.write(
            td.to_parallel_coordinates(
                output_path=os.path.abspath(out),
                color_by=kwargs.get("sort_by") or "Experiment",
            )
        )
        if kwargs.get("open"):
            return ui.open_browser(os.path.join(out, "index.html"))

    else:
        td.render(
            pager=pager,
            borders="horizontals",
            rich_table=True,
            header_styles=styles,
            row_styles=row_styles,
            csv=csv,
            markdown=markdown,
        )