aboutsummaryrefslogtreecommitdiff
path: root/analysis/scripts/aggregate_table_wide.py
diff options
context:
space:
mode:
authorGertjan van den Burg <gertjanvandenburg@gmail.com>2020-03-12 14:33:57 +0000
committerGertjan van den Burg <gertjanvandenburg@gmail.com>2020-03-12 14:33:57 +0000
commit7ef8f6e58990fc069cccc71ed6564e8c639ea4fc (patch)
tree9e7662a34b7d0c1f1c5d9faf6d7d6ea8672f6410 /analysis/scripts/aggregate_table_wide.py
downloadTCPDBench-7ef8f6e58990fc069cccc71ed6564e8c639ea4fc.tar.gz
TCPDBench-7ef8f6e58990fc069cccc71ed6564e8c639ea4fc.zip
initial commit
Diffstat (limited to 'analysis/scripts/aggregate_table_wide.py')
-rw-r--r--analysis/scripts/aggregate_table_wide.py222
1 files changed, 222 insertions, 0 deletions
diff --git a/analysis/scripts/aggregate_table_wide.py b/analysis/scripts/aggregate_table_wide.py
new file mode 100644
index 00000000..712a6a4a
--- /dev/null
+++ b/analysis/scripts/aggregate_table_wide.py
@@ -0,0 +1,222 @@
+# -*- coding: utf-8 -*-
+
+"""
+Script to generate the aggregate table (wide version)
+
+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"
+
+
+# Methods that support multidimensional datasets
+MULTIMETHODS = [
+ Method.bocpd,
+ Method.bocpdms,
+ Method.ecp,
+ Method.kcpa,
+ Method.rbocpdms,
+]
+
+
+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(
+ "--bcm",
+ help="Path to json file with results for: best/cover/multi",
+ required=True,
+ )
+ parser.add_argument(
+ "--bfu",
+ help="Path to json file with results for: best/f1/uni",
+ required=True,
+ )
+ parser.add_argument(
+ "--bfm",
+ help="Path to json file with results for: best/f1/multi",
+ required=True,
+ )
+ parser.add_argument(
+ "--dcu",
+ help="Path to json file with results for: default/cover/uni",
+ required=True,
+ )
+ parser.add_argument(
+ "--dcm",
+ help="Path to json file with results for: default/cover/multi",
+ required=True,
+ )
+ parser.add_argument(
+ "--dfu",
+ help="Path to json file with results for: default/f1/uni",
+ required=True,
+ )
+ parser.add_argument(
+ "--dfm",
+ help="Path to json file with results for: default/f1/multi",
+ required=True,
+ )
+ return parser.parse_args()
+
+
+def load_json(filename):
+ with open(filename, "r") as fp:
+ return json.load(fp)
+
+
+def make_table(
+ label,
+ uni_default_cover,
+ uni_default_f1,
+ uni_best_cover,
+ uni_best_f1,
+ multi_default_cover,
+ multi_default_f1,
+ multi_best_cover,
+ multi_best_f1,
+ methods,
+):
+ """Create part of the aggregate table
+ """
+ tex = []
+ tex.append("%% This table requires booktabs!")
+
+ tex.append("\\begin{tabular}{lrr|rrrr|rr}")
+ superheader = (
+ " & ".join(
+ [
+ "",
+ "\\multicolumn{4}{c}{Univariate}",
+ "\\multicolumn{4}{c}{Multivariate} \\\\",
+ ]
+ )
+ + "\\cmidrule(lr){2-5}\\cmidrule(lr){6-9}"
+ )
+ tex.append(superheader)
+ header = (
+ " & ".join(
+ [
+ "",
+ "\\multicolumn{2}{c}{Default}",
+ "\\multicolumn{2}{c}{Best}",
+ "\\multicolumn{2}{c}{Default}",
+ "\\multicolumn{2}{c}{Best} \\\\",
+ ]
+ )
+ + "\\cmidrule(lr){2-3}"
+ + "\\cmidrule(lr){4-5}"
+ + "\\cmidrule(lr){6-7}"
+ + "\\cmidrule(lr){8-9}"
+ )
+ tex.append(header)
+ subheader = (
+ " & ".join(
+ [
+ "",
+ "Cover",
+ "F1",
+ "Cover",
+ "F1",
+ "Cover",
+ "F1",
+ "Cover",
+ "F1" + "\\\\",
+ ]
+ )
+ + "\\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_cover, uni_default_f1, uni_best_cover, uni_best_f1],
+ [
+ multi_default_cover,
+ multi_default_f1,
+ multi_best_cover,
+ multi_best_f1,
+ ],
+ ]
+
+ for exps in all_exps:
+ for exp in exps:
+ row = []
+ maxscore = max((exp[m] for m in methods if m in exp))
+ for m in methods:
+ if not m 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)
+ bcm = load_json(args.bcm)
+ bfu = load_json(args.bfu)
+ bfm = load_json(args.bfm)
+ dcu = load_json(args.dcu)
+ dcm = load_json(args.dcm)
+ dfu = load_json(args.dfu)
+ dfm = load_json(args.dfm)
+
+ methods = sorted([m.name for m in Method])
+ tex = make_table("Wide", dcu, dfu, bcu, bfu, dcm, dfm, bcm, bfm, methods)
+
+ print("\n".join(tex))
+
+
+if __name__ == "__main__":
+ main()