Path: blob/master/examples/trepn/Scripts/aggregate_trepn.py
908 views
import csv1import os2import sys3from collections import OrderedDict4from functools import reduce567def list_subdir(a_dir):8"""List immediate subdirectories of a_dir"""9# https://stackoverflow.com/a/80020110return [name for name in os.listdir(a_dir)11if os.path.isdir(os.path.join(a_dir, name))]121314def aggregate_trepn_final(logs_dir):15def add_row(accum, new):16row = {key: value + float(new[key]) for key, value in list(accum.items()) if key not in ['Component', 'count']}17count = accum['count'] + 118return dict(row, **{'count': count})1920runs = []21for run_file in [f for f in os.listdir(logs_dir) if os.path.isfile(os.path.join(logs_dir, f))]:22with open(os.path.join(logs_dir, run_file), 'r') as run:23run_dict = {}24reader = csv.DictReader(run)25column_readers = split_reader(reader)26for k, v in list(column_readers.items()):27init = dict({k: 0}, **{'count': 0})28run_total = reduce(add_row, v, init)29if not run_total['count'] == 0:30run_dict[k] = run_total[k] / run_total['count']31runs.append(run_dict)32init = dict({fn: 0 for fn in list(runs[0].keys())}, **{'count': 0})33runs_total = reduce(add_row, runs, init)34return OrderedDict(35sorted(list({k: v / len(runs) for k, v in list(runs_total.items()) if not k == 'count'}.items()), key=lambda x: x[0]))363738def split_reader(reader):39column_dicts = {fn: [] for fn in reader.fieldnames if not fn.split('[')[0].strip() == 'Time'}40for row in reader:41for k, v in list(row.items()):42if not k.split('[')[0].strip() == 'Time' and not v == '':43column_dicts[k].append({k: v})44return column_dicts454647def aggregate(data_dir):48rows = []49for device in list_subdir(data_dir):50row = OrderedDict({'device': device})51device_dir = os.path.join(data_dir, device)52for subject in list_subdir(device_dir):53row.update({'subject': subject})54subject_dir = os.path.join(device_dir, subject)55if os.path.isdir(os.path.join(subject_dir, 'trepn')):56row.update(aggregate_trepn_final(os.path.join(subject_dir, 'trepn')))57rows.append(row.copy())58else:59for browser in list_subdir(subject_dir):60row.update({'browser': browser})61browser_dir = os.path.join(subject_dir, browser)62if os.path.isdir(os.path.join(browser_dir, 'trepn')):63row.update(aggregate_trepn_final(os.path.join(browser_dir, 'trepn')))64rows.append(row.copy())65return rows666768def write_to_file(filename, rows):69with open(filename, 'w') as f:70writer = csv.DictWriter(f, list(rows[0].keys()))71writer.writeheader()72writer.writerows(rows)737475# noinspection PyUnusedLocal76def main(dummy, data_dir, result_file):77print(('Output file: {}'.format(result_file)))78rows = aggregate(data_dir)79write_to_file(result_file, rows)808182if __name__ == '__main__':83if len(sys.argv) == 3:84# noinspection PyArgumentList85main(None, sys.argv[1], sys.argv[2])868788