def compare_params(project_name): excluded_keys = ['param_name', 'job_name', 'save_path', 'project_path'] if request.method == 'POST': param_names = request.get_json()['param_names'] print('param_names:') print(param_names) else: param_names = [] param2val_list = [] for param_name in param_names: param_path = to_param_path(project_name, param_name) with (param_path / 'param2val.yaml').open('r') as f: param2val = yaml.load(f, Loader=yaml.FullLoader) param2val_list.append(param2val) message = '' keys = [k for k in param2val_list[0].keys() if k not in excluded_keys] for key in keys: param_values = [param2val[key] for param2val in param2val_list] if len(set(param_values) ) != 1: # param_values differ between configurations message += '<p><b>{}</b>={}</p>'.format(key, param_values) return message + '<p>(shown in order of configurations selected)</p>'
def plot(project_name): """ is requested in two ways: 1. directly clicking on row in project.html 2. by selecting multiple runs and clicking on "plot" button in case 1, param_names is retrieved from request object. in case 2, param_names is retrieved from session object (because of redirect) check request object first, and only then check session """ param_names = request.args.getlist('param_name') or session.get( 'param_names') # TODO is there a way to plot confidence interval? # TODO if not, then plot all the individual lines, instead of their average? # get all patterns (all possible csv file names) - assume each run has same pattern first_param_path = to_param_path(project_name, param_names[0]) patterns = set([p.name for p in first_param_path.rglob('*.csv')]) if not patterns: raise LudwigVizNoCsvFound(first_param_path) else: print('Detected patterns={}'.format(patterns)) # iterate over unique df file names (e.g. results_a.csv, results_b.csv) json_charts = [] for pattern in patterns: print('pattern="{}"'.format(pattern)) # get data frame where each column represents a mean for a particular param_name try: data = aggregate_data(project_name, param_names, pattern) except ValueError: # empty data frames print(f'WARNING: Failed ot aggregate data for pattern={pattern}') continue # make chart title = pattern.rstrip('.csv').capitalize() column_name = data.columns[0] json_chart = make_json_chart(data, column_name, title) # collect chart json_charts.append(json_chart) # get number of reps for each param_name param_name2n = { param_name: count_replications(project_name, param_name) for param_name in param_names } return render_template( 'plots.html', topbar_dict=topbar_dict, project_name=project_name, param_names=param_names, param_name2n=param_name2n, json_charts=json_charts, )
def count_replications(project_name, param_name): return len(list(to_param_path(project_name, param_name).glob('*[!.yaml]')))