CSIT-1110: Fix dashboard anomaly count range
[csit.git] / resources / tools / presentation / new / generator_tables.py
index 12f1601..735fd21 100644 (file)
@@ -450,24 +450,16 @@ def table_performance_comparison(table, input_data):
                         item.extend([None, None])
             else:
                 item.extend([None, None])
-        if tbl_dict[tst_name]["ref-data"]:
-            data_t = tbl_dict[tst_name]["ref-data"]
-            # TODO: Specify window size.
-            if data_t:
-                item.append(round(mean(data_t) / 1000000, 2))
-                item.append(round(stdev(data_t) / 1000000, 2))
-            else:
-                item.extend([None, None])
+        data_t = tbl_dict[tst_name]["ref-data"]
+        if data_t:
+            item.append(round(mean(data_t) / 1000000, 2))
+            item.append(round(stdev(data_t) / 1000000, 2))
         else:
             item.extend([None, None])
-        if tbl_dict[tst_name]["cmp-data"]:
-            data_t = tbl_dict[tst_name]["cmp-data"]
-            # TODO: Specify window size.
-            if data_t:
-                item.append(round(mean(data_t) / 1000000, 2))
-                item.append(round(stdev(data_t) / 1000000, 2))
-            else:
-                item.extend([None, None])
+        data_t = tbl_dict[tst_name]["cmp-data"]
+        if data_t:
+            item.append(round(mean(data_t) / 1000000, 2))
+            item.append(round(stdev(data_t) / 1000000, 2))
         else:
             item.extend([None, None])
         if item[-4] is not None and item[-2] is not None and item[-4] != 0:
@@ -647,24 +639,16 @@ def table_performance_comparison_mrr(table, input_data):
     tbl_lst = list()
     for tst_name in tbl_dict.keys():
         item = [tbl_dict[tst_name]["name"], ]
-        if tbl_dict[tst_name]["ref-data"]:
-            data_t = tbl_dict[tst_name]["ref-data"]
-            # TODO: Specify window size.
-            if data_t:
-                item.append(round(mean(data_t) / 1000000, 2))
-                item.append(round(stdev(data_t) / 1000000, 2))
-            else:
-                item.extend([None, None])
+        data_t = tbl_dict[tst_name]["ref-data"]
+        if data_t:
+            item.append(round(mean(data_t) / 1000000, 2))
+            item.append(round(stdev(data_t) / 1000000, 2))
         else:
             item.extend([None, None])
-        if tbl_dict[tst_name]["cmp-data"]:
-            data_t = tbl_dict[tst_name]["cmp-data"]
-            # TODO: Specify window size.
-            if data_t:
-                item.append(round(mean(data_t) / 1000000, 2))
-                item.append(round(stdev(data_t) / 1000000, 2))
-            else:
-                item.extend([None, None])
+        data_t = tbl_dict[tst_name]["cmp-data"]
+        if data_t:
+            item.append(round(mean(data_t) / 1000000, 2))
+            item.append(round(stdev(data_t) / 1000000, 2))
         else:
             item.extend([None, None])
         if item[1] is not None and item[3] is not None and item[1] != 0:
@@ -716,7 +700,8 @@ def table_performance_comparison_mrr(table, input_data):
 
 
 def table_performance_trending_dashboard(table, input_data):
-    """Generate the table(s) with algorithm: table_performance_comparison
+    """Generate the table(s) with algorithm:
+    table_performance_trending_dashboard
     specified in the specification file.
 
     :param table: Table to generate.
@@ -739,8 +724,7 @@ def table_performance_trending_dashboard(table, input_data):
               "Short-Term Change [%]",
               "Long-Term Change [%]",
               "Regressions [#]",
-              "Progressions [#]",
-              "Outliers [#]"
+              "Progressions [#]"
               ]
     header_str = ",".join(header) + "\n"
 
@@ -765,59 +749,47 @@ def table_performance_trending_dashboard(table, input_data):
 
     tbl_lst = list()
     for tst_name in tbl_dict.keys():
-        if len(tbl_dict[tst_name]["data"]) < 3:
+        if len(tbl_dict[tst_name]["data"]) < 2:
             continue
 
-        pd_data = pd.Series(tbl_dict[tst_name]["data"])
-        last_key = pd_data.keys()[-1]
-        win_size = min(pd_data.size, table["window"])
-        win_first_idx = pd_data.size - win_size
-        key_14 = pd_data.keys()[win_first_idx]
-        long_win_size = min(pd_data.size, table["long-trend-window"])
-        median_t = pd_data.rolling(window=win_size, min_periods=2).median()
-        median_first_idx = median_t.size - long_win_size
+        data_t = pd.Series(tbl_dict[tst_name]["data"])
+
+        classification_lst, avgs = classify_anomalies(data_t)
+
+        win_size = min(data_t.size, table["window"])
+        long_win_size = min(data_t.size, table["long-trend-window"])
         try:
-            max_median = max(
-                [x for x in median_t.values[median_first_idx:-win_size]
+            max_long_avg = max(
+                [x for x in avgs[-long_win_size:-win_size]
                  if not isnan(x)])
         except ValueError:
-            max_median = nan
-        try:
-            last_median_t = median_t[last_key]
-        except KeyError:
-            last_median_t = nan
-        try:
-            median_t_14 = median_t[key_14]
-        except KeyError:
-            median_t_14 = nan
+            max_long_avg = nan
+        last_avg = avgs[-1]
+        avg_week_ago = avgs[max(-win_size, -len(avgs))]
 
-        if isnan(last_median_t) or isnan(median_t_14) or median_t_14 == 0.0:
+        if isnan(last_avg) or isnan(avg_week_ago) or avg_week_ago == 0.0:
             rel_change_last = nan
         else:
             rel_change_last = round(
-                ((last_median_t - median_t_14) / median_t_14) * 100, 2)
+                ((last_avg - avg_week_ago) / avg_week_ago) * 100, 2)
 
-        if isnan(max_median) or isnan(last_median_t) or max_median == 0.0:
+        if isnan(max_long_avg) or isnan(last_avg) or max_long_avg == 0.0:
             rel_change_long = nan
         else:
             rel_change_long = round(
-                ((last_median_t - max_median) / max_median) * 100, 2)
-
-        # Classification list:
-        classification_lst, _ = classify_anomalies(pd_data)
+                ((last_avg - max_long_avg) / max_long_avg) * 100, 2)
 
         if classification_lst:
             if isnan(rel_change_last) and isnan(rel_change_long):
                 continue
             tbl_lst.append(
                 [tbl_dict[tst_name]["name"],
-                 '-' if isnan(last_median_t) else
-                 round(last_median_t / 1000000, 2),
+                 '-' if isnan(last_avg) else
+                 round(last_avg / 1000000, 2),
                  '-' if isnan(rel_change_last) else rel_change_last,
                  '-' if isnan(rel_change_long) else rel_change_long,
-                 classification_lst[win_first_idx:].count("regression"),
-                 classification_lst[win_first_idx:].count("progression"),
-                 classification_lst[win_first_idx:].count("outlier")])
+                 classification_lst[-win_size:].count("regression"),
+                 classification_lst[-win_size:].count("progression")])
 
     tbl_lst.sort(key=lambda rel: rel[0])
 
@@ -825,15 +797,13 @@ def table_performance_trending_dashboard(table, input_data):
     for nrr in range(table["window"], -1, -1):
         tbl_reg = [item for item in tbl_lst if item[4] == nrr]
         for nrp in range(table["window"], -1, -1):
-            tbl_pro = [item for item in tbl_reg if item[5] == nrp]
-            for nro in range(table["window"], -1, -1):
-                tbl_out = [item for item in tbl_pro if item[6] == nro]
-                tbl_out.sort(key=lambda rel: rel[2])
-                tbl_sorted.extend(tbl_out)
+            tbl_out = [item for item in tbl_reg if item[5] == nrp]
+            tbl_out.sort(key=lambda rel: rel[2])
+            tbl_sorted.extend(tbl_out)
 
     file_name = "{0}{1}".format(table["output-file"], table["output-file-ext"])
 
-    logging.info("      Writing file: '{0}'".format(file_name))
+    logging.info("    Writing file: '{0}'".format(file_name))
     with open(file_name, "w") as file_handler:
         file_handler.write(header_str)
         for test in tbl_sorted:
@@ -841,7 +811,7 @@ def table_performance_trending_dashboard(table, input_data):
 
     txt_file_name = "{0}.txt".format(table["output-file"])
     txt_table = None
-    logging.info("      Writing file: '{0}'".format(txt_file_name))
+    logging.info("    Writing file: '{0}'".format(txt_file_name))
     with open(file_name, 'rb') as csv_file:
         csv_content = csv.reader(csv_file, delimiter=',', quotechar='"')
         for row in csv_content:
@@ -893,15 +863,12 @@ def table_performance_trending_dashboard_html(table, input_data):
     # Rows:
     colors = {"regression": ("#ffcccc", "#ff9999"),
               "progression": ("#c6ecc6", "#9fdf9f"),
-              "outlier": ("#e6e6e6", "#cccccc"),
               "normal": ("#e9f1fb", "#d4e4f7")}
     for r_idx, row in enumerate(csv_lst[1:]):
         if int(row[4]):
             color = "regression"
         elif int(row[5]):
             color = "progression"
-        elif int(row[6]):
-            color = "outlier"
         else:
             color = "normal"
         background = colors[color][r_idx % 2]
@@ -917,7 +884,13 @@ def table_performance_trending_dashboard_html(table, input_data):
             anchor = "#"
             feature = ""
             if c_idx == 0:
-                if "memif" in item:
+                if "lbdpdk" in item or "lbvpp" in item:
+                    file_name = "link_bonding.html"
+
+                elif "testpmd" in item or "l3fwd" in item:
+                    file_name = "dpdk.html"
+
+                elif "memif" in item:
                     file_name = "container_memif.html"
 
                 elif "srv6" in item:
@@ -980,13 +953,12 @@ def table_performance_trending_dashboard_html(table, input_data):
                 ref = ET.SubElement(td, "a", attrib=dict(href=url))
                 ref.text = item
 
-            if c_idx > 0:
+            else:
                 td.text = item
 
     try:
         with open(table["output-file"], 'w') as html_file:
-            logging.info("      Writing file: '{0}'".
-                         format(table["output-file"]))
+            logging.info("    Writing file: '{0}'".format(table["output-file"]))
             html_file.write(".. raw:: html\n\n\t")
             html_file.write(ET.tostring(dashboard))
             html_file.write("\n\t<p><br><br></p>\n")