⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 owselectdata.py

📁 orange源码 数据挖掘技术
💻 PY
📖 第 1 页 / 共 3 页
字号:
        fdList = [[]]
        for cond in conditions:
            if cond.type == "OR":
                fdList.append([])
            elif cond.enabled or not enabledOnly:
                fdList[-1].append(cond.operator.getFilter(domain, cond.varName, cond.val1, cond.val2, cond.negated, cond.caseSensitive))
##        # remove the first list if empty
##        if len(fdList) > 1 and len(fdList[0]) == 0:
##            fdList.pop(0)
        return fdList


    ############################################################################################################################################################
    ## Callback handlers ###################################################################################################################################
    ############################################################################################################################################################

    def lbAttrChange(self):
        """Updates operator listBox and value stack, only if necesarry.
        """
        text = str(self.lbAttr.currentText())
        prevVar = self.currentVar
        if prevVar:
            prevVarType = prevVar.varType
            prevVarName = prevVar.name
        else:
            prevVarType = None
            prevVarName = None
        self.currentVar = text and self.data.domain[text]
        if self.currentVar:
            currVarType = self.currentVar.varType
            currVarName = self.currentVar.name
        else:
            currVarType = None
            currVarName = None
        if currVarType != prevVarType:
            self.updateOperatorStack()
        if currVarName != prevVarName:
            self.updateValuesStack()


    def lbOperatorsChange(self):
        """Updates value stack, only if necessary.
        """
        if self.currentVar:
            varType = self.currentVar.varType
            self.currentOperatorDict[varType] = Operator(self.lbOperatorsDict[varType].currentText(), varType)
            self.updateValuesStack()


    def lbValsChange(self):
        """Updates list of selected discrete values (self.currentVals).
        """
        self.currentVals = []
        for i in range(0, self.lbVals.count()):
            if self.lbVals.isSelected(i):
                self.currentVals.append(str(self.lbVals.text(i)))


    def OnNewCondition(self):
        """Updates conditions and condition table, sends out new data.
        """
        # update self.Conditions
        row = self.criteriaTable.currentRow()
        if row == self.criteriaTable.numRows():
            row -= 1
        cond = self.getCondtionFromSelection()
        self.Conditions.insert(row+1, cond)
        # update self.criteriaTable
        self.insertCriteriaTableRow(cond, row+1)
        self.updateFilteredDataLens()
        # enable Update/Remove buttons
        self.btnUpdate.setEnabled(True)
        self.btnRemove.setEnabled(True)
        # send out new data 
        if self.updateOnChange:
            self.setOutput()
        self.leSelect.clear()


    def OnPurgeChange(self):
        if self.purgeAttributes:
            if not self.purgeClassesCB.isEnabled():
                self.purgeClassesCB.setEnabled(True)
                self.purgeClasses = self.oldPurgeClasses
        else:
            if self.purgeClassesCB.isEnabled():
                self.purgeClassesCB.setEnabled(False)
                self.oldPurgeClasses = self.purgeClasses
                self.purgeClasses = False
                
        if self.updateOnChange:
            self.setOutput()
            
    def OnUpdateCondition(self):
        """Calls remove and insert.
        TODO: sends out data twice - fix that!
        """
        # update self.Conditions
        row = self.criteriaTable.currentRow()
        if row < 0:
            return
        cond = self.getCondtionFromSelection()
        self.Conditions[row] = cond
        # update self.criteriaTable
        self.criteriaTable.clearCellWidget(row, 0)
        self.criteriaTable.clearCell(row, 1)
        self.putContitionToTable(row, cond)
        self.updateFilteredDataLens()
        # send out new data
        if self.updateOnChange:
            self.setOutput()        
        self.leSelect.clear()


    def OnRemoveCondition(self):
        """Removes current condition table row, shifts rows up, updates conditions and sends out new data.
        """
        # update self.Conditions
        currRow = self.criteriaTable.currentRow()
        if currRow < 0:
            return
        self.Conditions.pop(currRow)
        # update self.criteriaTable
        numRows = self.criteriaTable.numRows()
        for r in range(currRow, numRows - 1):
            self.criteriaTable.swapRows(r+1,r)
            self.criteriaTable.updateCell(r, 0)
            self.criteriaTable.updateCell(r, 1)
        for c in range(2):
            self.criteriaTable.clearCellWidget(numRows-1, 0)
            self.criteriaTable.clearCell(numRows-1, 1)
        self.criteriaTable.hideRow(numRows - 1)
        self.criteriaTable.setNumRows(numRows - 1)
        if currRow == numRows - 1:
            self.criteriaTable.setCurrentCell(currRow-1,1)
        else:
            self.criteriaTable.setCurrentCell(currRow,1)
        self.updateFilteredDataLens()
        # disable Update/Remove buttons
        if len(self.Conditions) == 0:
            self.btnUpdate.setEnabled(False)
            self.btnRemove.setEnabled(False)
        # send out new data 
        if self.updateOnChange:
            self.setOutput()        


    def OnDisjunction(self):
        """Updates conditions and condition table, sends out new data.
        """
        # update self.Conditions
        row = self.criteriaTable.currentRow()
        if row == self.criteriaTable.numRows():
            row -= 1
        cond = Condition(True, "OR")
        self.Conditions.insert(row+1, cond)
        # update self.criteriaTable
        self.insertCriteriaTableRow(cond, row+1)
        self.updateFilteredDataLens()
        # enable Update/Remove buttons
        self.btnUpdate.setEnabled(True)
        self.btnRemove.setEnabled(True)
        # send out new data 
        if self.updateOnChange:
            self.setOutput()        
        

    def btnMoveUpClicked(self):
        """Moves the selected condition one row up.
        """
        currRow = self.criteriaTable.currentRow()
        numRows = self.criteriaTable.numRows()
        if currRow < 1 or currRow >= numRows:
            return
        self.Conditions = self.Conditions[:currRow-1] + [self.Conditions[currRow], self.Conditions[currRow-1]] + self.Conditions[currRow+1:]
        self.criteriaTable.swapRows(currRow, currRow-1)
        self.criteriaTable.setCurrentCell(currRow-1,1)
        self.criteriaTable.updateCell(currRow, 0)
        self.criteriaTable.updateCell(currRow, 1)
        self.criteriaTable.updateCell(currRow-1, 0)
        self.criteriaTable.updateCell(currRow-1, 1)
        self.updateFilteredDataLens()
        self.updateMoveButtons()
        # send out new data 
        if self.updateOnChange:
            self.setOutput()        

        
    def btnMoveDownClicked(self):
        """Moves the selected condition one row down.
        """
        currRow = self.criteriaTable.currentRow()
        numRows = self.criteriaTable.numRows()
        if currRow < 0 or currRow >= numRows-1:
            return
        self.Conditions = self.Conditions[:currRow] + [self.Conditions[currRow+1], self.Conditions[currRow]] + self.Conditions[currRow+2:]
        self.criteriaTable.swapRows(currRow, currRow+1)
        self.criteriaTable.setCurrentCell(currRow+1,1)
        self.criteriaTable.updateCell(currRow, 0)
        self.criteriaTable.updateCell(currRow, 1)
        self.criteriaTable.updateCell(currRow+1, 0)
        self.criteriaTable.updateCell(currRow+1, 1)
        self.updateFilteredDataLens()
        self.updateMoveButtons()
        # send out new data 
        if self.updateOnChange:
            self.setOutput()        


    def currentCriteriaChange(self, row, col):
        """Handles current row change in criteria table;
        select attribute and operator, and set values according to the selected condition.
        """
        if row < 0:
            return
        cond = self.Conditions[row]
        if cond.type != "OR":
            # attribute
            lbItem = self.lbAttr.findItem(cond.varName)
            if lbItem:
                self.lbAttr.setCurrentItem(lbItem)
            # not
            self.cbNot.setChecked(cond.negated)
            # operator
            for vt,lb in self.lbOperatorsDict.items():
                if vt == self.name2var[cond.varName].varType:
                    lb.show()
                else:
                    lb.hide()
            lbItem = self.lbOperatorsDict[self.name2var[cond.varName].varType].findItem(str(cond.operator))
            if lbItem:
                self.lbOperatorsDict[self.name2var[cond.varName].varType].setCurrentItem(lbItem)
            # values
            self.valuesStack.raiseWidget(self.name2var[cond.varName].varType)
            if self.name2var[cond.varName].varType == orange.VarTypes.Continuous:
                self.leNum1.setText(str(cond.val1))
                if cond.operator.isInterval:
                    self.leNum2.setText(str(cond.val2))
            elif self.name2var[cond.varName].varType == orange.VarTypes.String:
                self.leStr1.setText(str(cond.val1))
                if cond.operator.isInterval:
                    self.leStr2.setText(str(cond.val2))
                self.cbCaseSensitive.setChecked(cond.caseSensitive)
            elif self.name2var[cond.varName].varType == orange.VarTypes.Discrete:
                for val in cond.val1:
                    lbItem = self.lbVals.findItem(val)
                    if lbItem:
                        self.lbVals.setSelected(lbItem, True)
        self.updateMoveButtons()


    def criteriaActiveChange(self, condition, active):
        """Handles clicks on criteria table checkboxes, send out new data.
        """
        condition.enabled = active
        # update the numbers of examples that matches "OR" filter
        self.updateFilteredDataLens(condition)
        # send out new data
        if self.updateOnChange:
            self.setOutput()        


    ############################################################################################################################################################
    ## Interface state management - updates interface elements based on selection in list boxes ################################################################
    ############################################################################################################################################################

    def updateMoveButtons(self):
        """enable/disable Move Up/Down buttons
        """
        row = self.criteriaTable.currentRow()
        numRows = self.criteriaTable.numRows()
        if row > 0:
            self.btnMoveUp.setEnabled(True)
        else:
            self.btnMoveUp.setEnabled(False)
        if row < numRows-1:
            self.btnMoveDown.setEnabled(True)
        else:
            self.btnMoveDown.setEnabled(False)


    def updateOperatorStack(self):
        """Raises listbox with appropriate operators.
        """
        if self.currentVar:
            varType = self.currentVar.varType
            self.btnNew.setEnabled(True)
        else:
            varType = 0
            self.btnNew.setEnabled(False)
        for vt,lb in self.lbOperatorsDict.items():
            if vt == varType:
                lb.show()
                try:
                    lb.setCurrentItem(self.data.domain.isOptionalMeta(self.currentVar) and lb.count() - 1)
                except:
                    lb.setCurrentItem(0)
            else:
                lb.hide()


    def updateValuesStack(self):
        """Raises appropriate widget for values from stack,
        fills listBox for discrete attributes,
        shows statistics for continuous attributes.
        """
        if self.currentVar:
            varType = self.currentVar.varType
        else:
            varType = 0
        currentOper = self.currentOperatorDict.get(varType,None)
        if currentOper:
            # raise widget
            self.valuesStack.raiseWidget(currentOper.varType)
            if currentOper.varType==orange.VarTypes.Discrete:
                # store selected discrete values, refill values list box, set single/multi selection mode, restore selected item(s)
                selectedItemNames = []
                for i in range(self.lbVals.count()):
                    if self.lbVals.isSelected(i):
                        selectedItemNames.append(str(self.lbVals.item(i).text()))
                self.lbVals.clear()
                curVarValues = []
                for value in self.currentVar:
                    curVarValues.append(str(value))
                curVarValues.sort()
                for value in curVarValues:
                    self.lbVals.insertItem(str(value))
                if currentOper.isInterval:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -