Skip to content

Commit 31fe38c

Browse files
Compute student t test
1 parent 2e22986 commit 31fe38c

1 file changed

Lines changed: 15 additions & 9 deletions

File tree

.github/scripts/csv_to_md.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import argparse
22
import csv
3+
import math
34
import tabulate as tab
45

56
parser = argparse.ArgumentParser()
7+
parser.add_argument('-r', '--runs', type=int, required=True, help='Number of runs')
68
parser.add_argument('-b', '--baseline', required=True, help='Baseline CSV file')
79
parser.add_argument('-c', '--current', required=True, help='Current CSV file')
810
args = parser.parse_args()
@@ -16,24 +18,28 @@ def get_2d_list(csv_filename):
1618
table_baseline = get_2d_list(args.baseline)
1719
table_current = get_2d_list(args.current)
1820

19-
def get_emoji(d, stdev):
20-
z = 1.96 # 95% confidence interval
21-
if d < -z * stdev:
21+
def student(meanX, stdevX, runsX, meanY, stdevY, runsY):
22+
s2 = ((runsX - 1) * stdevX**2 + (runsY - 1) * stdevY**2) / (runsX + runsY - 2)
23+
return (meanX - meanY) / math.sqrt(s2 / runsX + s2 / runsY) if s2 > 0.0 else 0.0
24+
25+
def get_emoji(t):
26+
quantile = 2.0 # 95% confidence interval
27+
if t < -quantile:
2228
return ':green_circle:'
23-
elif d > z * stdev:
29+
elif t > quantile:
2430
return ':red_circle:'
2531
else:
2632
return ':white_circle:'
2733

2834
table = []
2935
for baseline, current in zip(table_baseline, table_current):
30-
baseline_name, baseline_mean, _ = baseline
36+
baseline_name, baseline_mean, baseline_stdev = baseline
3137
name, mean, stdev = current
3238
assert(baseline_name == name)
3339
diff = baseline_mean - mean
34-
impact = 0.0 if stdev == 0.0 else diff / stdev
35-
emoji = get_emoji(diff, stdev)
36-
table.append([name, int(mean), f'{stdev:.2f}', int(diff), f'{impact:.2f}', emoji])
40+
t = student(baseline_mean, baseline_stdev, args.runs, mean, stdev, args.runs) if args.runs > 2 else 0.0
41+
emoji = get_emoji(t)
42+
table.append([name, int(mean), f'{stdev:.2f}', int(diff), f'{t:.2f}', emoji])
3743

38-
header = ['name', 'mean (\u03BCs)', 'stdev \u03C3', 'diff \u0394', '\u0394 / \u03C3', '']
44+
header = ['name', 'mean (\u03BCs)', 'stdev \u03C3', 'diff \u0394', 't', '']
3945
print(tab.tabulate(table, header, tablefmt="github"))

0 commit comments

Comments
 (0)