Пример #1
0
 def visualizeSignal(self):
     # Keep input data in case of modifications
     viz_signal_data = self.input_data.copy()
     if len(self.selected_variables) > 0 : 
         viz_signal_data = viz_signal_data.loc[:,self.selected_variables]
         viz_signal_data = pd.DataFrame(viz_signal_data.values, viz_signal_data.index, self.selected_variables)
         
         # get signal's type
         viz_signal_type = 0 if(len(viz_signal_data.columns) == 1) else 1
         
         viz_signal = Signal(str(self.lineEdit_signal_name.text()), viz_signal_data, viz_signal_type, self.my_data_type)
         viz_signal.plot_signal()
     else :
         mess = QtGui.QMessageBox.warning(self,
                         'Warning Message',
                         "You must define at least one variable to plot.")
         return
Пример #2
0
    def visualizeSignal(self):
        # Keep input data in case of modifications
        viz_signal_data = self.input_data.copy()
        if len(self.selected_variables) > 0:
            viz_signal_data = viz_signal_data.loc[:, self.selected_variables]
            viz_signal_data = pd.DataFrame(viz_signal_data.values,
                                           viz_signal_data.index,
                                           self.selected_variables)

            # get signal's type
            viz_signal_type = 0 if (len(viz_signal_data.columns) == 1) else 1

            viz_signal = Signal(str(self.lineEdit_signal_name.text()),
                                viz_signal_data, viz_signal_type,
                                self.my_data_type)
            viz_signal.plot_signal()
        else:
            mess = QtGui.QMessageBox.warning(
                self, 'Warning Message',
                "You must define at least one variable to plot.")
            return
Пример #3
0
class EditSignalWindow(QtGui.QMainWindow, Ui_EditSignalWindow):
    
    signalEdited = QtCore.pyqtSignal() #signal emitted when the signal is ready to send
    
    def __init__(self, signals_dict, selected_signal_name):
        self.signals_dict = signals_dict
        self.my_signal_name = selected_signal_name
        #Make a copy of the original signal
        self.my_signal = Signal(selected_signal_name,
                                self.signals_dict[selected_signal_name]._signal_data.copy(),
                                self.signals_dict[selected_signal_name]._signal_type,
                                self.signals_dict[selected_signal_name]._signal_data_type)
        
        super(EditSignalWindow, self).__init__()
        self.setupUi(self)
        self.initUI()
        
        
    def initUI(self):
        #Define slots
        self.radioButton_select_all_variables.toggled.connect(self.selectAllVariables)
        self.tableWidget_signal_preview.itemSelectionChanged.connect(self.updateVariableSelection)
        self.pushButton_rename_signal.clicked.connect(self.renameSignal)
        self.pushButton_resample_signal.clicked.connect(self.resampleSignal)
        self.pushButton_interpolate_signal.clicked.connect(self.interpolateSignal)
        self.pushButton_cut_signal.clicked.connect(self.cutSignal)
        self.pushButton_rename_variable.clicked.connect(self.renameVariable)
        self.pushButton_remove_variable.clicked.connect(self.removeVariable)
        self.pushButton_normalize_variable.clicked.connect(self.normalizeVariable)
        self.pushButton_convertIntoBinary.clicked.connect(self.convertVariableIntoBinary)
        self.pushButton_visualize.clicked.connect(self.visualizeSignal)
        self.pushButton_apply_changes.clicked.connect(self.applyChanges)
        
        # Display the name of the selected signal for edition
        self.label_selected_signal_name.setFont(large_font)
        self.label_selected_signal_name.setText(self.my_signal._signal_name)
        
        # Display signal preview
        self.displaySignalPreview()
        
        #Enabled buttons
        self.pushButton_rename_variable.setEnabled(False)
        self.pushButton_remove_variable.setEnabled(False)
        self.pushButton_normalize_variable.setEnabled(False)
        self.pushButton_convertIntoBinary.setEnabled(False)
        
        # Display the window
        self.show()
    
    
    def displaySignalPreview(self):
        self.tableWidget_signal_preview.setSelectionBehavior(QtGui.QAbstractItemView.SelectColumns)
        
        #Display a signal preview in table widget
        self.tableWidget_signal_preview.setColumnCount(1 + len(self.my_signal._signal_data.columns));
        self.tableWidget_signal_preview.setRowCount(10);
        
        #Display signal columns names
        Qcol_list = QtCore.QStringList()
        Qcol_list.append(self.my_signal._signal_data.index.name)
        for col_name in self.my_signal._signal_data.columns.values :
            Qcol_list.append(col_name)
        self.tableWidget_signal_preview.setHorizontalHeaderLabels(Qcol_list)
        
        # Display the 10 first lines of the signal
        for row_idx in range(10):
            item=QtGui.QTableWidgetItem()
            item.setText(QtCore.QString(str(self.my_signal._signal_data.index[row_idx])))
            self.tableWidget_signal_preview.setItem(row_idx, 0, item)
            col_idx = 1
            for value in self.my_signal._signal_data.iloc[row_idx,:] :
                item=QtGui.QTableWidgetItem()
                item.setText(QtCore.QString.number(value))
                self.tableWidget_signal_preview.setItem(row_idx, col_idx, item)
                col_idx += 1
                
        self.tableWidget_signal_preview.resizeColumnsToContents()

    
    def selectAllVariables(self, checked):
        if checked:
            self.tableWidget_signal_preview.selectAll()
        else:
            self.tableWidget_signal_preview.clearSelection()
    
    
    def updateVariableSelection(self):
        # Get selected variable in preview Tab widget
        selected_var_idx = [self.tableWidget_signal_preview.selectedIndexes()[i].column()
                            for i in range(len(self.tableWidget_signal_preview.selectedIndexes()))]
        selected_var_idx = sorted(set(selected_var_idx))

        if len(selected_var_idx) == 0:
            self.pushButton_rename_variable.setEnabled(False)
            self.pushButton_remove_variable.setEnabled(False)
            self.pushButton_normalize_variable.setEnabled(False)
            self.pushButton_convertIntoBinary.setEnabled(False)
        else:
            self.pushButton_rename_variable.setEnabled(True)
            self.pushButton_remove_variable.setEnabled(True)
            self.pushButton_normalize_variable.setEnabled(True)
            self.pushButton_convertIntoBinary.setEnabled(True)
       
        if len(selected_var_idx) >= len(self.my_signal._signal_data.columns):
            self.pushButton_remove_variable.setEnabled(False)
        
    
    def renameSignal(self):
        new_name, ok = QtGui.QInputDialog.getText(self, 'Rename Signal', 
            "Enter the new signal's name for " + self.my_signal._signal_name + " :")
        
        if ok:
            if str(new_name) in self.signals_dict.keys():
                mess = QtGui.QMessageBox.warning(self,
                                                'Warning Message',
                                                "This signal's name already exist.")
            else :
                self.my_signal._signal_name = str(new_name).strip()
                self.label_selected_signal_name.setFont(large_font)
                self.label_selected_signal_name.setText(self.my_signal._signal_name)

    
    
    def resampleSignal(self):
        rule, ok = QtGui.QInputDialog.getText(self, 'Resample Signal', 
            "Give a rule for the resampling (ex: 100ms) :")
        if ok : 
            self.my_signal._signal_data = self.signals_dict[self.my_signal_name]._signal_data.resample(rule=str(rule))
            self.displaySignalPreview()

    
    def interpolateSignal(self):
        limit, ok = QtGui.QInputDialog.getInt(self, 'Interpolate Signal', 
            "Give a maximal number of consecutive NaN values to fill :", value = 0, min = 0) 
        
        if ok :
            self.my_signal._signal_data = self.my_signal._signal_data.interpolate(limit=limit, inplace = False)
            self.displaySignalPreview()
    
    
    def cutSignal(self):
        index_begin, ok = QtGui.QInputDialog.getInt(self, 'Cut Signal', 
            "Give the first index of the cut signal :", value = 0, min = 0)
        
        if ok :
            index_end, ok2 = QtGui.QInputDialog.getInt(self, 'Cut Signal', 
            "Give the last index of the cut signal :", value = index_begin + 1, min = index_begin + 1)
            
            if ok2 :
                if index_end >= len(self.my_signal._signal_data.index) : 
                    reply = QtGui.QMessageBox.information(self, 'Info',
                                "The given last index is higher than the length of the signal. \n" +
                                "The cut will go up to the signal's end ")
                    index_end = len(self.my_signal._signal_data.index) - 1
                self.my_signal._signal_data = self.my_signal._signal_data[index_begin : index_end]
                self.displaySignalPreview()
            
            
    def renameVariable(self):
        # Get selected variable in preview Tab widget
        selected_var_idx = [self.tableWidget_signal_preview.selectedIndexes()[i].column()
                            for i in range(len(self.tableWidget_signal_preview.selectedIndexes()))]
        selected_var_idx = sorted(set(selected_var_idx))
        
        selected_variables = []
        for i in selected_var_idx:
            if i != 0: #ignore if TimeIndex is selected
                selected_variable = self.my_signal._signal_data.columns.values[i-1]
        
                new_name, ok = QtGui.QInputDialog.getText(self, 'Rename Variable ', 
                    "Enter the new variable's name for " + selected_variable + " :")
                if ok:
                    self.my_signal._signal_data.rename(columns={selected_variable : str(new_name).strip()}, inplace = True)
                    self.displaySignalPreview()
        
    
    def removeVariable(self):
        # Get selected variable in preview Tab widget
        selected_var_idx = [self.tableWidget_signal_preview.selectedIndexes()[i].column()
                            for i in range(len(self.tableWidget_signal_preview.selectedIndexes()))]
        selected_var_idx = sorted(set(selected_var_idx))
        
        selected_variables = []
        for i in selected_var_idx:
            if i != 0: #ignore if TimeIndex is selected
                selected_variable = self.my_signal._signal_data.columns.values[i-1]
        
                reply = QtGui.QMessageBox.question(self, 'Message',
                    "Do you want to remove "+ selected_variable +" variable?",
                    QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.Yes)
                
                if reply == QtGui.QMessageBox.Yes:
                    old_signal_type = self.my_signal._signal_type
                    old_signal_data_type = self.my_signal._signal_data_type
                    self.my_signal._signal_data.drop(selected_variable, axis=1, inplace=True)
                    
                    # Update signal type
                    new_signal_type = 0 if(len(self.my_signal._signal_data.columns) == 1) else 1
                    if old_signal_type != new_signal_type :
                        self.my_signal._signal_type = new_signal_type
                        reply = QtGui.QMessageBox.information(self, 'Info',
                                self.my_signal._signal_name + " is now a Univariate signal. ")
                        
                    #Update signal data type
                    self.updateSignalDataType(old_signal_data_type)                                       
        self.displaySignalPreview()
        
        
    def normalizeVariable(self):
        # Get selected variable in preview Tab widget
        selected_var_idx = [self.tableWidget_signal_preview.selectedIndexes()[i].column()
                            for i in range(len(self.tableWidget_signal_preview.selectedIndexes()))]
        selected_var_idx = sorted(set(selected_var_idx))
        
        selected_variables = []
        for i in selected_var_idx:
            if i != 0: #ignore if TimeIndex is selected
                selected_variable = self.my_signal._signal_data.columns.values[i-1]
                
                min_value, min_ok = QtGui.QInputDialog.getInt(self, 'Normalize Variable', 
                "Give a minimal value for the normalization of " + selected_variable + " :", value = 0)
                if min_ok:
                    max_value, max_ok = QtGui.QInputDialog.getInt(self, 'Normalize Variable', 
                    "Give a maximal value for the normalization of " + selected_variable + " :", value = min_value + 1)
                    if max_ok:
                        self.my_signal._signal_data[selected_variable] = Normalize.Normalize(
                                            pd.DataFrame(self.my_signal._signal_data[selected_variable]),
                                            min_value, max_value)
                        self.displaySignalPreview()
    
    
    def convertVariableIntoBinary(self):
        # Get selected variable in preview Tab widget
        selected_var_idx = [self.tableWidget_signal_preview.selectedIndexes()[i].column()
                            for i in range(len(self.tableWidget_signal_preview.selectedIndexes()))]
        selected_var_idx = sorted(set(selected_var_idx))
        
        selected_variables = []
        for i in selected_var_idx:
            if i != 0: #ignore if TimeIndex is selected
                selected_variable = self.my_signal._signal_data.columns.values[i-1]
                
                mean_data = np.mean(self.my_signal._signal_data[selected_variable].values)
                thresh, ok = QtGui.QInputDialog.getDouble(self, 'Convert Variable into Binary', 
                    "Give a threshold for the conversion into binary of " + selected_variable + " :", value = mean_data)
                if ok:
                    reply = QtGui.QMessageBox.question(self, 'Message',
                            "Do you want to maximize " + selected_variable + " ?",
                            QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.Yes)
                    if reply == QtGui.QMessageBox.Yes:
                        maximize = True
                    else:
                        maximize = False
                    
                    old_signal_data_type = self.my_signal._signal_data_type
                    self.my_signal._signal_data[selected_variable] = ConvertContinueToBinary.ConvertContinueToBinary(
                                            pd.DataFrame(self.my_signal._signal_data[selected_variable]),
                                            thresh, maximize)
                    
                    #Update signal data type
                    self.updateSignalDataType(old_signal_data_type)
                    self.displaySignalPreview()


    def updateSignalDataType(self, old_signal_data_type):
        # update signal data type
        is_categorical = True
        col_idx = 0
        while is_categorical and col_idx < len(self.my_signal._signal_data.columns) :
            number_val = len(sorted(set(self.my_signal._signal_data.iloc[:,col_idx])))
            if number_val > 2:
                is_categorical = False
            col_idx += 1;
        new_signal_data_type = 1 if(is_categorical) else 0
        
        if old_signal_data_type != new_signal_data_type :
            self.my_signal._signal_data_type = new_signal_data_type
            str_my_data_type = "Continuous" if(new_signal_data_type==0) else "Categorical"
            reply = QtGui.QMessageBox.information(self, 'Info',
                    self.my_signal._signal_name + " is now a " + str_my_data_type +" signal. ")
                        
        
    def visualizeSignal(self):
        # Get selected variable in preview Tab widget
        selected_var_idx = [self.tableWidget_signal_preview.selectedIndexes()[i].column()
                            for i in range(len(self.tableWidget_signal_preview.selectedIndexes()))]
        selected_var_idx = sorted(set(selected_var_idx))

        selected_variables = []
        for i in selected_var_idx:
            if i != 0: #ignore if TimeIndex is selected
                selected_variables.append(self.my_signal._signal_data.columns.values[i-1])
        if len(selected_variables) == 0 : 
            selected_variables = self.my_signal._signal_data.columns   
        self.my_signal.plot_signal(selected_variables)


    def applyChanges(self):
        self.close()
        
    def closeEvent(self, event):
        reply = QtGui.QMessageBox.question(self, 'Message',
            "Do you want to apply changes to "+ self.my_signal_name +" signal?",
            QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.Yes)

        if reply == QtGui.QMessageBox.Yes:
            self.signalEdited.emit()
            event.accept() # let the window close
        else:
            event.accept() # let the window close