Path: blob/master/examples/android/Scripts/aggregate_android.py
907 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_android_final(logs_dir):15def add_row(accum, new):16row = {k: v + float(new[k]) for k, v in list(accum.items()) if k 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:23reader = csv.DictReader(run)24init = dict({fn: 0 for fn in reader.fieldnames if fn != 'datetime'}, **{'count': 0})25run_total = reduce(add_row, reader, init)26runs.append({k: v / run_total['count'] for k, v in list(run_total.items()) if k != 'count'})27runs_total = reduce(lambda x, y: {k: v + y[k] for k, v in list(x.items())}, runs)28return OrderedDict(29sorted(list({'android_' + k: v / len(runs) for k, v in list(runs_total.items())}.items()), key=lambda x: x[0]))303132def aggregate(data_dir):33rows = []34for device in list_subdir(data_dir):35row = OrderedDict({'device': device})36device_dir = os.path.join(data_dir, device)37for subject in list_subdir(device_dir):38row.update({'subject': subject})39subject_dir = os.path.join(device_dir, subject)40if os.path.isdir(os.path.join(subject_dir, 'android')):41row.update(aggregate_android_final(os.path.join(subject_dir, 'android')))42rows.append(row.copy())43else:44for browser in list_subdir(subject_dir):45row.update({'browser': browser})46browser_dir = os.path.join(subject_dir, browser)47if os.path.isdir(os.path.join(browser_dir, 'android')):48row.update(aggregate_android_final(os.path.join(browser_dir, 'android')))49rows.append(row.copy())50return rows515253def write_to_file(filename, rows):54with open(filename, 'w') as f:55writer = csv.DictWriter(f, list(rows[0].keys()))56writer.writeheader()57writer.writerows(rows)585960# noinspection PyUnusedLocal61def main(dummy, data_dir, result_file):62print(('Output file: {}'.format(result_file)))63rows = aggregate(data_dir)64write_to_file(result_file, rows)656667if __name__ == '__main__':68if len(sys.argv) == 3:69# noinspection PyArgumentList70main(None, sys.argv[1], sys.argv[2])717273