Skip to content
Snippets Groups Projects
Select Git revision
  • 2e736028d1cbb742f901757c5da94ed6182a8bb3
  • master default protected
  • test-error_interval
3 results

gsrp_smart_util.py

Blame
  • ExportResults.py 6.49 KiB
    #!/usr/bin/env python
    
    """ Library: Functions to export results to CSV or plots """
    
    # Import built-in modules
    import os                               # for iteration throug directories
    import string                           # to generate a range of letters
    
    # Import 3rd party modules
    import pandas as pd                     # for Series and DataFrames
    import numpy as np                      # for Numpy Arrays
    import matplotlib.pyplot as plt         # for Plots
    from scipy.interpolate import interp1d  # to Interpolate Data
    from matplotlib.offsetbox import AnchoredOffsetbox, TextArea, HPacker # to generate the Annotations in plot
    
    # Import own modules
    
    # Author-Info
    __author__ 	= "Nikolas Huelsmann"
    __status__ 	= "Prototype"           # Production, Development, Prototype
    __date__	= 2016-03-25
    
    #### Export Features to CSV
    def exportPandasToCSV(pandasSorDF, dir, filename):
            file = dir + filename
        
            if os.path.isfile(file + ".csv"):
                    for i in range(1,20):
                            testFileName = filename  + "-" + str(i) + ".csv"
                            if os.path.isfile(dir + testFileName)!=True:
                                    pandasSorDF.to_csv(dir + testFileName, sep=';')
                                    break
    
            else:
                    pandasSorDF.to_csv(file + ".csv", sep=';')
    
    
    def exportNumpyToCSV(numpyArray, dir, filename, format):
            file = dir + filename
        
            if os.path.isfile(file + ".csv"):
                    for i in range(1,20):
                            testFileName = filename  + "-" + str(i) + ".csv"
                            if os.path.isfile(dir + testFileName )!=True:
                                    np.savetxt(dir + testFileName, numpyArray, delimiter=";", fmt=format)
                                    break
    
            else:
                    np.savetxt(file + ".csv", numpyArray, delimiter=";", fmt=format)
    		
    		
    #### Rendering of results
    
    ### Rendering of Score and Time
    def showScoreTime(dir, filename, store, resScore, resTime, rangeX, parameter, feat_desc, cl_desc, fig_desc, y_desc1, y_desc2):
            # Determine interpolated functions
            f_score_interp = interp1d(rangeX, resScore, kind='quadratic')
            f_time_interp  = interp1d(rangeX, resTime, kind='quadratic')
            
            # Figure1 with subplot
            fig, ax1 = plt.subplots()
            
            #plt.plot(x, y, type of line)
            # Generating X-Axis
            xnew = np.linspace(0, max(rangeX), num=100, endpoint=True)
            
            # First Axis for Score (left)
            ax1.plot(rangeX, resScore, 'bo', rangeX, f_score_interp(rangeX), 'b-')
            ax1.set_xlabel(parameter, fontsize=16)
            ax1.set_ylabel(y_desc1, color='b', fontsize=16)
            for tl in ax1.get_yticklabels():
                tl.set_color('b')
            
            # First Axis for Time (right)
            ax2 = ax1.twinx()
            ax2.plot(rangeX, resTime, 'ro', rangeX, f_time_interp(rangeX), 'r-')
            ax2.set_ylabel(y_desc2, color='r', fontsize=16)
            for tl in ax2.get_yticklabels():
                tl.set_color('r')
            
            
            letters = string.lowercase[0:len(rangeX)]
            legend = ""
            for act_x, act_score, act_time, act_feat_desc, letter, act_cl_desc in zip(rangeX, resScore, resTime, feat_desc,letters,cl_desc):
                    # Add a letter (a,b,c,..) to each DataPoint
                    ax1.annotate(letter, xy=(act_x, act_score), xytext=(act_x, act_score))
                    ax2.annotate(letter, xy=(act_x, act_time), xytext=(act_x, act_time))
                    # Creates a legend with description of feature and classificator of each datapoint
                    legend = legend + letter + ": " + act_feat_desc + " Classf: " + act_cl_desc + "\n"
                    
            # Remove last \n
            legend = legend[:-1]
            
            box1  = TextArea(legend, textprops=dict(color="k"))
            box = HPacker(children=[box1],
                          align="center",
                          pad=0, sep=5)
                          
            anchored_box = AnchoredOffsetbox(loc=3,
                                             child=box, pad=0.2,
                                             frameon=True,
                                             bbox_to_anchor=(0., 1.02),
                                             bbox_transform=ax1.transAxes,
                                             borderpad=1.5,
                                             )
            ax1.add_artist(anchored_box)
            fig.subplots_adjust(top=0.7)
    
            ax1.legend(['Score Data', 'Score Interpolated'], loc='upper left')
            ax2.legend(['Time Data', 'Time Interpolated'], loc='lower right')
            
            plt.title(fig_desc, fontsize=18)
            
            if(store):
                    file = dir + filename
                    
                    if os.path.isfile(file + ".png"):
                            for i in range(1,20):
                                    testFileName = filename  + "-" + str(i) + ".png"
                                    if os.path.isfile(dir + testFileName )!=True:
                                            plt.savefig(dir + testFileName)
                                            break
    
                    else:
                            plt.savefig(file)
            else: 
                    plt.show()
                
    
    ### Result comparision per class
    def calcScorePerClass(np_labels, np_output):
    
            pd_label_test = pd.Series(np_labels)
            pd_output = pd.Series(np_output)
            score = []
    
            for i in pd_label_test.unique():
                    matches = sum(pd_label_test[pd_label_test == i] == pd_output[pd_label_test[pd_label_test == i].index])
                    count = float(len(pd_label_test[pd_label_test == i]))
                    score.append(matches / count)
    
            score = np.array(score)
            return score
    	
    ### Bar-Plot for score
    
    def showResults(dir, filename, db, feat, score):
            plt.bar(range(0,len(score)), score*100,1)
            plt.xlabel('ClassLabels')
            plt.ylabel('Score in %')
            plt.title('Results of ' + feat + '-Classification\n for ' + db + ' Database')
            plt.axis([0, len(score), 0, 100])
            plt.xticks(range(0,len(score),5))
            
            file = dir + filename
        
            if os.path.isfile(file + ".png"):
                    for i in range(1,20):
                            testFileName = filename  + "-" + str(i) + ".png"
                            if os.path.isfile(dir + testFileName )!=True:
                                    plt.savefig(dir + testFileName)
                                    break
    
            else:
                    plt.savefig(file)
            
            
            
            
            
            #instead of saving - decomment plt.show()
            #plt.show()