Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
S2-group
GitHub Repository: S2-group/android-runner
Path: blob/master/examples/trepn/Scripts/aggregate_trepn.py
908 views
1
import csv
2
import os
3
import sys
4
from collections import OrderedDict
5
from functools import reduce
6
7
8
def list_subdir(a_dir):
9
"""List immediate subdirectories of a_dir"""
10
# https://stackoverflow.com/a/800201
11
return [name for name in os.listdir(a_dir)
12
if os.path.isdir(os.path.join(a_dir, name))]
13
14
15
def aggregate_trepn_final(logs_dir):
16
def add_row(accum, new):
17
row = {key: value + float(new[key]) for key, value in list(accum.items()) if key not in ['Component', 'count']}
18
count = accum['count'] + 1
19
return dict(row, **{'count': count})
20
21
runs = []
22
for run_file in [f for f in os.listdir(logs_dir) if os.path.isfile(os.path.join(logs_dir, f))]:
23
with open(os.path.join(logs_dir, run_file), 'r') as run:
24
run_dict = {}
25
reader = csv.DictReader(run)
26
column_readers = split_reader(reader)
27
for k, v in list(column_readers.items()):
28
init = dict({k: 0}, **{'count': 0})
29
run_total = reduce(add_row, v, init)
30
if not run_total['count'] == 0:
31
run_dict[k] = run_total[k] / run_total['count']
32
runs.append(run_dict)
33
init = dict({fn: 0 for fn in list(runs[0].keys())}, **{'count': 0})
34
runs_total = reduce(add_row, runs, init)
35
return OrderedDict(
36
sorted(list({k: v / len(runs) for k, v in list(runs_total.items()) if not k == 'count'}.items()), key=lambda x: x[0]))
37
38
39
def split_reader(reader):
40
column_dicts = {fn: [] for fn in reader.fieldnames if not fn.split('[')[0].strip() == 'Time'}
41
for row in reader:
42
for k, v in list(row.items()):
43
if not k.split('[')[0].strip() == 'Time' and not v == '':
44
column_dicts[k].append({k: v})
45
return column_dicts
46
47
48
def aggregate(data_dir):
49
rows = []
50
for device in list_subdir(data_dir):
51
row = OrderedDict({'device': device})
52
device_dir = os.path.join(data_dir, device)
53
for subject in list_subdir(device_dir):
54
row.update({'subject': subject})
55
subject_dir = os.path.join(device_dir, subject)
56
if os.path.isdir(os.path.join(subject_dir, 'trepn')):
57
row.update(aggregate_trepn_final(os.path.join(subject_dir, 'trepn')))
58
rows.append(row.copy())
59
else:
60
for browser in list_subdir(subject_dir):
61
row.update({'browser': browser})
62
browser_dir = os.path.join(subject_dir, browser)
63
if os.path.isdir(os.path.join(browser_dir, 'trepn')):
64
row.update(aggregate_trepn_final(os.path.join(browser_dir, 'trepn')))
65
rows.append(row.copy())
66
return rows
67
68
69
def write_to_file(filename, rows):
70
with open(filename, 'w') as f:
71
writer = csv.DictWriter(f, list(rows[0].keys()))
72
writer.writeheader()
73
writer.writerows(rows)
74
75
76
# noinspection PyUnusedLocal
77
def main(dummy, data_dir, result_file):
78
print(('Output file: {}'.format(result_file)))
79
rows = aggregate(data_dir)
80
write_to_file(result_file, rows)
81
82
83
if __name__ == '__main__':
84
if len(sys.argv) == 3:
85
# noinspection PyArgumentList
86
main(None, sys.argv[1], sys.argv[2])
87
88