prediction_generation/aggregate_table_wide.py (144 lines of code) (raw):
# -*- coding: utf-8 -*-
"""
Script to generate the aggregate table (univariate version)
Author: Refactored by ChatGPT
Original Author: Gertjan van den Burg
Copyright (c) 2020 - The Alan Turing Institute
License: See the LICENSE file.
"""
import argparse
import json
import tabulate
from enum import Enum
class Method(Enum):
amoc = "amoc"
binseg = "binseg"
bocpd = "bocpd"
bocpdms = "bocpdms"
cpnp = "cpnp"
ecp = "ecp"
kcpa = "kcpa"
pelt = "pelt"
prophet = "prophet"
rbocpdms = "rbocpdms"
rfpop = "rfpop"
segneigh = "segneigh"
wbs = "wbs"
zero = "zero"
mongodb = "mongodb"
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument(
"--bcu",
help="Path to json file with results for: best/cover/uni",
required=True,
)
parser.add_argument(
"--bfu",
help="Path to json file with results for: best/f1/uni",
required=True,
)
parser.add_argument(
"--bpu",
help="Path to json file with results for: best/precision/uni",
required=True,
)
parser.add_argument(
"--bru",
help="Path to json file with results for: best/recall/uni",
required=True,
)
parser.add_argument(
"--dcu",
help="Path to json file with results for: default/cover/uni",
required=True,
)
parser.add_argument(
"--dfu",
help="Path to json file with results for: default/f1/uni",
required=True,
)
parser.add_argument(
"--dpu",
help="Path to json file with results for: default/precision/uni",
required=True,
)
parser.add_argument(
"--dru",
help="Path to json file with results for: default/recall/uni",
required=True,
)
return parser.parse_args()
def load_json(filename):
with open(filename, "r") as fp:
return json.load(fp)
def make_table(uni_default_f1, uni_default_cover, uni_default_precision, uni_default_recall,
uni_best_f1, uni_best_cover, uni_best_precision, uni_best_recall, methods):
"""Create part of the aggregate table
"""
tex = []
tex.append("%% This table requires booktabs!")
tex.append("\\begin{tabular}{lrrrr|rrrr}")
superheader = (
" & ".join(
[
"",
"\\multicolumn{4}{c}{Default}",
"\\multicolumn{4}{c}{Best} \\\\",
]
)
+ "\\cmidrule(lr){2-5}\\cmidrule(lr){6-9}"
)
tex.append(superheader)
subheader = (
" & ".join(
[
"",
"F1",
"Cover",
"Precision",
"Recall",
"F1",
"Cover",
"Precision",
"Recall" + "\\\\",
]
)
+ "\\cmidrule(r){1-1}"
+ "\\cmidrule(lr){2-5}"
+ "\\cmidrule(l){6-9}"
)
tex.append(subheader)
table = []
L = max(map(len, methods))
textsc = lambda m: "\\textsc{%s}%s" % (m, (L - len(m)) * " ")
table.append(list(map(textsc, methods)))
all_exps = [uni_default_f1, uni_default_cover, uni_default_precision, uni_default_recall,
uni_best_f1, uni_best_cover, uni_best_precision, uni_best_recall]
for exp in all_exps:
row = []
maxscore = max((exp[m] for m in methods if m in exp))
for m in methods:
if m not in exp:
row.append(5 * " ")
continue
score = exp[m]
scorestr = tabulate._format(
score, tabulate._float_type, ".3f", ""
)
if score == maxscore:
row.append("\\textbf{%s}" % scorestr)
else:
row.append(scorestr)
table.append(row)
transposed = list(zip(*table))
for row in transposed:
tex.append(" & ".join(row) + " \\\\")
tex.append("\\cmidrule(r){1-1}\\cmidrule(lr){2-5}\\cmidrule(l){6-9}")
tex.append("\\end{tabular}")
return tex
def main():
args = parse_args()
bcu = load_json(args.bcu)
bfu = load_json(args.bfu)
bpu = load_json(args.bpu)
bru = load_json(args.bru)
dcu = load_json(args.dcu)
dfu = load_json(args.dfu)
dpu = load_json(args.dpu)
dru = load_json(args.dru)
methods = sorted([m.name for m in Method])
tex = make_table(dfu, dcu, dpu, dru, bfu, bcu, bpu, bru, methods)
print("\n".join(tex))
if __name__ == "__main__":
main()