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, )
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, )