Diff of /show_stats_plots.py [000000] .. [1a3ddc]

Switch to side-by-side view

--- a
+++ b/show_stats_plots.py
@@ -0,0 +1,205 @@
+#!/usr/bin/python3
+import numpy as np
+import pandas as pd
+import matplotlib.pyplot as plt
+import scipy.stats as stats
+
+def str_join(a, b, c):
+
+    a = np.array(a)
+    b = np.array(b)
+    c = np.array(c)
+
+    str_array = np.core.defchararray.add(np.core.defchararray.add(a, b), c)
+
+    return str_array
+
+
+def get_sensivities(results_df, detector_name, experiment=None):
+
+    if experiment!=None:
+        tp_col_names = str_join(detector_name+' ', [experiment], ' TP')
+        fp_col_names = str_join(detector_name+' ', [experiment], ' FP')
+        fn_col_names = str_join(detector_name+' ', [experiment], ' FN')
+        tn_col_names = str_join(detector_name+' ', [experiment], ' TN')
+        total_tp = (results_df.loc[:, tp_col_names].values)[:,0]
+        total_fn = (results_df.loc[:, fn_col_names].values)[:,0]
+    else:
+        tp_col_names = detector_name+' '+'TP'
+        fp_col_names = detector_name+' '+'FP'
+        fn_col_names = detector_name+' '+'FN'
+        tn_col_names = detector_name+' '+'TN'      
+        total_tp = results_df.loc[:, tp_col_names].values
+        total_fn = results_df.loc[:, fn_col_names].values
+
+    se = []
+
+    for tp,fn in zip(total_tp,total_fn):
+            if (tp + fn) > 0:
+                s = tp/(tp+fn)*100.0
+                if s > 0:
+                        se.append(s)
+
+    return np.array(se)
+
+
+def get_result(results_df, det_names, experiment=None):
+    
+    m = []
+    s = []
+    for det in det_names:
+        m.append(np.mean(get_sensivities(results_df, det, experiment)))
+        s.append(np.std(get_sensivities(results_df, det, experiment)))
+
+    return np.array(m),np.array(s)
+
+
+
+def compare_det_test(results_df, detector_name1, detector_name2, experiment=None):
+    se1 = get_sensivities(results_df, detector_name1, experiment)
+    if len(se1) < 2:
+            return 0
+    se2 = get_sensivities(results_df, detector_name2, experiment)
+    if len(se2) < 2:
+            return 0
+    l = min(len(se1),len(se2))
+    #print("1:",se1[:l])
+    #print("2:",se2[:l])
+    try:
+        t,p = stats.wilcoxon(se1[:l],se2[:l])
+        return p
+    except:
+        return None
+
+
+def single_plot(data, std, y_label, title = None):
+    fig, ax = plt.subplots()
+    plot_names = ['Elgendi et al', 'Matched Filter', 'Kalidas and Tamil', 'Engzee Mod', 'Christov', 'Hamilton', 'Pan and Tompkins']
+    x_pos = np.arange(len(plot_names))
+
+    fig.set_size_inches(10, 7)
+    rects1 = ax.bar(x_pos, data, yerr=std, width = 0.65, align='center', alpha=0.5, ecolor='black', capsize=10)
+    ax.set_ylim([0,100])
+    ax.set_ylabel(y_label)
+    ax.set_xlabel('Detector')
+    ax.set_xticks(x_pos)
+    ax.set_xticklabels(plot_names)
+
+    if title!=None:
+        ax.set_title(title)
+
+    plt.tight_layout()
+
+    return rects1
+
+
+def double_plot(data1, std1, data2, std2, y_label, legend1, legend2, title=None):
+    fig, ax = plt.subplots()
+    plot_names = ['Elgendi et al', 'Matched Filter', 'Kalidas and Tamil', 'Engzee Mod', 'Christov', 'Hamilton', 'Pan and Tompkins']
+    x_pos = np.arange(len(plot_names))
+
+    fig.set_size_inches(10, 7)
+    width = 0.4
+    rects1 = ax.bar(x_pos, data1, width, yerr=std1, alpha=0.5, ecolor='black', capsize=10)
+    rects2 = ax.bar(x_pos+width, data2, width, yerr=std2, alpha=0.5, ecolor='black', capsize=10)
+    ax.set_ylim([0,100])
+    ax.set_ylabel(y_label)
+    ax.set_xlabel('Detector')
+    ax.set_xticks(x_pos + width / 2)
+    ax.set_xticklabels(plot_names)
+    ax.legend((rects1[0], rects2[0]), (legend1, legend2))
+
+    if title!=None:
+        ax.set_title(title)
+
+    plt.tight_layout()
+
+    return rects1, rects2
+
+
+def print_stat(p):
+    if p == None:
+        print('--- & ',end='')
+        return
+    s = ""
+    if p < 0.05:
+        s = "*"
+    print('{:03.2f}{} & '.format(p,s),end='')
+
+
+# GUDB
+gudb_cs_results = pd.read_csv('results_GUDB_chest_strap.csv', dtype=int, index_col=0)
+gudb_cable_results = pd.read_csv('results_GUDB_loose_cables.csv', dtype=int, index_col=0)
+
+# MITDB
+mitdb_results = pd.read_csv('results_MITDB.csv', dtype=int, index_col=0)
+
+det_names = ['two_average', 'matched_filter', 'swt', 'engzee', 'christov', 'hamilton', 'pan_tompkins']
+plot_names = ['Elgendi et al', 'Matched Filter', 'Kalidas and Tamil', 'Engzee Mod', 'Christov', 'Hamilton', 'Pan and Tompkins']
+experiment_names = ['sitting','maths','walking','hand_bike','jogging']
+output_names = ['TP', 'FP', 'FN', 'TN']
+
+print("MIT")
+for det1 in det_names:
+    for det2 in det_names:
+        p = compare_det_test(mitdb_results, det1, det2)
+        print_stat(p)
+    print("\\\\")
+
+
+print("CHEST STRAP SITTING")
+for det1 in det_names:
+    for det2 in det_names:
+        p = compare_det_test(gudb_cs_results, det1, det2, 'sitting')
+        print_stat(p)
+    print("\\\\")
+
+
+print("CHEST STRAP JOGGING")
+for det1 in det_names:
+    for det2 in det_names:
+        p = compare_det_test(gudb_cs_results, det1, det2, 'jogging')
+        print_stat(p)
+    print("\\\\")
+
+    
+print("LOOSE CABLE SITTING")
+for det1 in det_names:
+    for det2 in det_names:
+        p = compare_det_test(gudb_cable_results, det1, det2, 'sitting')
+        print_stat(p)
+    print("\\\\")
+
+
+print("LOOSE CABLE JOGGING")
+for det1 in det_names:
+    for det2 in det_names:
+        p = compare_det_test(gudb_cable_results, det1, det2, 'jogging')
+        print_stat(p)
+    print("\\\\")
+
+
+# calculating results
+mitdb_avg,mitdb_std = get_result(mitdb_results, det_names)
+print("mitdb:",mitdb_avg)
+gudb_cs_sitting_avg,gudb_cs_sitting_std = get_result(gudb_cs_results, det_names, 'sitting')
+print("chest strap sitting:",gudb_cs_sitting_avg)
+gudb_cable_sitting_avg,gudb_cable_sitting_std = get_result(gudb_cable_results, det_names, 'sitting')
+print("lose cables sitting:",gudb_cable_sitting_avg)
+gudb_cs_jogging_avg,gudb_cs_jogging_std = get_result(gudb_cs_results, det_names, 'jogging')
+gudb_cable_jogging_avg,gudb_cable_jogging_std = get_result(gudb_cable_results, det_names, 'jogging')
+
+# plotting
+single_plot(mitdb_avg, mitdb_std, 'Sensitivity (%)', 'MITDB')
+
+double_plot(gudb_cs_sitting_avg, gudb_cs_sitting_std,
+            gudb_cable_sitting_avg, gudb_cable_sitting_std,
+            'Sensitivity (%)', 'Chest Strap', 'Loose Cables', 'GUDB: cable, sitting')
+
+double_plot(gudb_cs_jogging_avg, gudb_cs_jogging_std,
+            gudb_cable_jogging_avg, gudb_cable_jogging_std,
+            'Sensitivity (%)', 'Chest Strap', 'Loose Cables', 'GUDB: cable, jogging')
+
+
+
+plt.show()