Ignore:
Timestamp:
09/03/13 14:55:39 (8 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Rank widget code style fixes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeWidgets/Data/OWRank.py

    r11684 r11685  
    1515 
    1616import OWGUI 
    17 import orange 
    18  
    19 from Orange.regression.earth import ScoreEarthImportance 
    20 from orngSVM import MeasureAttribute_SVMWeights 
    21 from orngEnsemble import MeasureAttribute_randomForests 
    22  
    23  
    24 def _toPyObject(variant): 
    25     val = variant.toPyObject() 
    26     if isinstance(val, type(NotImplemented)): 
    27         # PyQt 4.4 converts python int, floats ... to C types and 
    28         # cannot convert them back again and returns an exception instance. 
    29         qtype = variant.type() 
    30         if qtype == QVariant.Double: 
    31             val, ok = variant.toDouble() 
    32         elif qtype == QVariant.Int: 
    33             val, ok = variant.toInt() 
    34         elif qtype == QVariant.LongLong: 
    35             val, ok = variant.toLongLong() 
    36         elif qtype == QVariant.String: 
    37             val = variant.toString() 
    38     return val 
     17 
     18import Orange 
     19from Orange.feature import scoring 
     20from Orange.regression import earth 
     21from Orange.classification import svm 
     22from Orange.ensemble import forest 
     23 
     24 
     25def is_discrete(var): 
     26    return isinstance(var, Orange.feature.Discrete) 
     27 
     28 
     29def is_continuous(var): 
     30    return isinstance(var, Orange.feature.Continuous) 
     31 
    3932 
    4033def is_class_discrete(data): 
    41     return isinstance(data.domain.classVar, orange.EnumVariable) 
     34    return is_discrete(data.domain.class_var) 
     35 
    4236 
    4337def is_class_continuous(data): 
    44     return isinstance(data.domain.classVar, orange.FloatVariable) 
     38    return is_continuous(data.domain.class_var) 
     39 
    4540 
    4641def table(shape, fill=None): 
     
    5146 
    5247MEASURE_PARAMS = { 
    53     ScoreEarthImportance: [ 
     48    earth.ScoreEarthImportance: [ 
    5449        {"name": "t", 
    5550         "type": int, 
     
    7166         "doc": "Maximum degree of terms included in the model."} 
    7267    ], 
    73     orange.MeasureAttribute_relief: [ 
     68    scoring.Relief: [ 
    7469        {"name": "k", 
    7570         "type": int, 
     
    8580         "doc": ""} 
    8681        ], 
    87     MeasureAttribute_randomForests: [ 
     82    forest.ScoreFeature: [ 
    8883        {"name": "trees", 
    8984         "type": int, 
     
    124119SCORES = [ 
    125120    score_meta( 
    126         "ReliefF", "ReliefF", orange.MeasureAttribute_relief, 
    127         params=MEASURE_PARAMS[orange.MeasureAttribute_relief], 
     121        "ReliefF", "ReliefF", scoring.Relief, 
     122        params=MEASURE_PARAMS[scoring.Relief], 
    128123        handles_continuous=True, 
    129124        handles_discrete=True), 
    130125    score_meta( 
    131         "Information Gain", "Inf. gain", orange.MeasureAttribute_info, 
     126        "Information Gain", "Inf. gain", scoring.InfoGain, 
    132127        params=None, 
    133128        supports_regression=False, 
     
    136131        handles_discrete=True), 
    137132    score_meta( 
    138         "Gain Ratio", "Gain Ratio", orange.MeasureAttribute_gainRatio, 
     133        "Gain Ratio", "Gain Ratio", scoring.GainRatio, 
    139134        params=None, 
    140135        supports_regression=False, 
     
    142137        handles_discrete=True), 
    143138    score_meta( 
    144         "Gini Gain", "Gini", orange.MeasureAttribute_gini, 
     139        "Gini Gain", "Gini", scoring.Gini, 
    145140        params=None, 
    146141        supports_regression=False, 
     
    148143        handles_continuous=False), 
    149144    score_meta( 
    150         "Log Odds Ratio", "log OR", orange.MeasureAttribute_logOddsRatio, 
     145        "Log Odds Ratio", "log OR", Orange.core.MeasureAttribute_logOddsRatio, 
    151146        params=None, 
    152147        supports_regression=False, 
    153148        handles_continuous=False), 
    154149    score_meta( 
    155         "MSE", "MSE", orange.MeasureAttribute_MSE, 
     150        "MSE", "MSE", scoring.MSE, 
    156151        params=None, 
    157152        supports_classification=False, 
    158153        handles_continuous=False), 
    159154    score_meta( 
    160         "Linear SVM Weights", "SVM weight", MeasureAttribute_SVMWeights, 
     155        "Linear SVM Weights", "SVM weight", svm.ScoreSVMWeights, 
    161156        params=None), 
    162157    score_meta( 
    163         "Random Forests", "RF", MeasureAttribute_randomForests, 
    164         params=MEASURE_PARAMS[MeasureAttribute_randomForests]), 
     158        "Random Forests", "RF", forest.ScoreFeature, 
     159        params=MEASURE_PARAMS[forest.ScoreFeature]), 
    165160    score_meta( 
    166         "Earth Importance", "Earth imp.", ScoreEarthImportance, 
    167         params=MEASURE_PARAMS[ScoreEarthImportance], 
     161        "Earth Importance", "Earth imp.", earth.ScoreEarthImportance, 
     162        params=MEASURE_PARAMS[earth.ScoreEarthImportance], 
    168163    ) 
    169164] 
     
    311306                               tooltip=param.doc, 
    312307                               callback=partial( 
    313                                     self.measureParamChanged, measure, param), 
     308                                   self.measureParamChanged, measure, param), 
    314309                               callbackOnReturn=True) 
    315310 
     
    330325                measure_control(continuousBox, measure) 
    331326 
    332         OWGUI.comboBox(discreteBox, self, "sortBy", label = "Sort by"+"  ", 
    333                        items = ["No Sorting", "Attribute Name", "Number of Values"] + \ 
    334                                [m.name for m in self.discMeasures], 
    335                        orientation=0, valueType = int, 
    336                        callback=self.sortingChanged) 
    337          
    338         OWGUI.comboBox(continuousBox, self, "sortBy", label = "Sort by"+"  ", 
    339                        items = ["No Sorting", "Attribute Name", "Number of Values"] + \ 
    340                                [m.name for m in self.contMeasures], 
    341                        orientation=0, valueType = int, 
    342                        callback=self.sortingChanged) 
     327        OWGUI.comboBox( 
     328            discreteBox, self, "sortBy", label="Sort by  ", 
     329            items=["No Sorting", "Attribute Name", "Number of Values"] + 
     330                  [m.name for m in self.discMeasures], 
     331            orientation=0, valueType=int, 
     332            callback=self.sortingChanged) 
     333 
     334        OWGUI.comboBox( 
     335            continuousBox, self, "sortBy", label="Sort by  ", 
     336            items=["No Sorting", "Attribute Name", "Number of Values"] + 
     337                  [m.name for m in self.contMeasures], 
     338            orientation=0, valueType=int, 
     339            callback=self.sortingChanged) 
    343340 
    344341        box = OWGUI.widgetBox(self.controlArea, "Discretization", 
     
    347344                   label="Intervals: ", 
    348345                   orientation=0, 
    349                    tooltip="Disctetization for measures which cannot score continuous attributes.", 
     346                   tooltip="Disctetization for measures which cannot score " 
     347                           "continuous attributes.", 
    350348                   callback=self.discretizationChanged, 
    351349                   callbackOnReturn=True) 
     
    357355        box = OWGUI.widgetBox(self.controlArea, "Score bars", 
    358356                              orientation="horizontal", addSpace=True) 
    359         self.cbShowDistributions = OWGUI.checkBox(box, self, "showDistributions", 
    360                                     'Enable', callback = self.cbShowDistributions) 
    361 #        colBox = OWGUI.indentedBox(box, orientation = "horizontal") 
     357        self.cbShowDistributions = OWGUI.checkBox( 
     358            box, self, "showDistributions", 'Enable', 
     359            callback=self.showDistributionsChanged 
     360        ) 
     361 
    362362        OWGUI.rubber(box) 
    363363        box = OWGUI.widgetBox(box, orientation="horizontal") 
    364364        wl = OWGUI.widgetLabel(box, "Color: ") 
    365365        OWGUI.separator(box) 
    366         self.colButton = OWGUI.toolButton(box, self, callback=self.changeColor, width=20, height=20, debuggingEnabled = 0) 
     366        self.colButton = OWGUI.toolButton( 
     367            box, self, callback=self.changeColor, width=20, height=20, 
     368            debuggingEnabled=0) 
     369 
    367370        self.cbShowDistributions.disables.extend([wl, self.colButton]) 
    368371        self.cbShowDistributions.makeConsistent() 
    369 #        OWGUI.rubber(box) 
    370  
    371          
    372         selMethBox = OWGUI.widgetBox(self.controlArea, "Select attributes", addSpace=True) 
    373         self.clearButton = OWGUI.button(selMethBox, self, "Clear", callback=self.clearSelection) 
     372 
     373        selMethBox = OWGUI.widgetBox(self.controlArea, "Select attributes", 
     374                                     addSpace=True) 
     375        self.clearButton = OWGUI.button(selMethBox, self, "Clear", 
     376                                        callback=self.clearSelection) 
    374377        self.clearButton.setDisabled(True) 
    375          
     378 
    376379        buttonGrid = QGridLayout() 
    377         selMethRadio = OWGUI.radioButtonsInBox(selMethBox, self, "selectMethod", [], callback=self.selectMethodChanged) 
    378         b1 = OWGUI.appendRadioButton(selMethRadio, self, "selectMethod", "All", insertInto=selMethRadio, callback=self.selectMethodChanged, addToLayout=False) 
    379         b2 = OWGUI.appendRadioButton(selMethRadio, self, "selectMethod", "Manual", insertInto=selMethRadio, callback=self.selectMethodChanged, addToLayout=False) 
    380         b3 = OWGUI.appendRadioButton(selMethRadio, self, "selectMethod", "Best ranked", insertInto=selMethRadio, callback=self.selectMethodChanged, addToLayout=False) 
    381 #        brBox = OWGUI.widgetBox(selMethBox, orientation="horizontal", margin=0) 
    382 #        OWGUI.appendRadioButton(selMethRadio, self, "selectMethod", "Best ranked", insertInto=brBox, callback=self.selectMethodChanged) 
    383         spin = OWGUI.spin(OWGUI.widgetBox(selMethRadio, addToLayout=False), self, "nSelected", 1, 100, orientation=0, callback=self.nSelectedChanged) 
     380        selMethRadio = OWGUI.radioButtonsInBox( 
     381            selMethBox, self, "selectMethod", [], 
     382            callback=self.selectMethodChanged) 
     383 
     384        b1 = OWGUI.appendRadioButton( 
     385            selMethRadio, self, "selectMethod", "All", 
     386            insertInto=selMethRadio, 
     387            callback=self.selectMethodChanged, 
     388            addToLayout=False) 
     389 
     390        b2 = OWGUI.appendRadioButton( 
     391            selMethRadio, self, "selectMethod", "Manual", 
     392            insertInto=selMethRadio, 
     393            callback=self.selectMethodChanged, 
     394            addToLayout=False) 
     395 
     396        b3 = OWGUI.appendRadioButton( 
     397            selMethRadio, self, "selectMethod", "Best ranked", 
     398            insertInto=selMethRadio, 
     399            callback=self.selectMethodChanged, 
     400            addToLayout=False) 
     401 
     402        spin = OWGUI.spin(OWGUI.widgetBox(selMethRadio, addToLayout=False), 
     403                          self, "nSelected", 1, 100, orientation=0, 
     404                          callback=self.nSelectedChanged) 
    384405        buttonGrid.addWidget(b1, 0, 0) 
    385406        buttonGrid.addWidget(b2, 1, 0) 
     
    389410        OWGUI.separator(selMethBox) 
    390411 
    391         applyButton = OWGUI.button(selMethBox, self, "Commit", callback = self.apply, default=True) 
    392         autoApplyCB = OWGUI.checkBox(selMethBox, self, "autoApply", "Commit automatically") 
    393         OWGUI.setStopper(self, applyButton, autoApplyCB, "dataChanged", self.apply) 
     412        applyButton = OWGUI.button( 
     413            selMethBox, self, "Commit", callback=self.apply, default=True) 
     414        autoApplyCB = OWGUI.checkBox( 
     415            selMethBox, self, "autoApply", "Commit automatically") 
     416        OWGUI.setStopper( 
     417            self, applyButton, autoApplyCB, "dataChanged", self.apply) 
    394418 
    395419        OWGUI.rubber(self.controlArea) 
    396          
     420 
    397421        # Discrete and continuous table views are stacked 
    398422        self.ranksViewStack = QStackedLayout() 
    399423        self.mainArea.layout().addLayout(self.ranksViewStack) 
    400          
     424 
    401425        self.discRanksView = QTableView() 
    402426        self.ranksViewStack.addWidget(self.discRanksView) 
     
    404428        self.discRanksView.setSelectionMode(QTableView.MultiSelection) 
    405429        self.discRanksView.setSortingEnabled(True) 
    406 #        self.discRanksView.horizontalHeader().restoreState(self.discRanksHeaderState) 
    407          
     430 
    408431        self.discRanksModel = QStandardItemModel(self) 
    409432        self.discRanksModel.setHorizontalHeaderLabels( 
    410433            ["Attribute", "#"] + [m.shortname for m in self.discMeasures] 
    411434        ) 
     435 
    412436        self.discRanksProxyModel = MySortProxyModel(self) 
    413437        self.discRanksProxyModel.setSourceModel(self.discRanksModel) 
    414438        self.discRanksView.setModel(self.discRanksProxyModel) 
    415 #        self.discRanksView.verticalHeader().setResizeMode(QHeaderView.ResizeToContents) 
     439 
    416440        self.discRanksView.setColumnWidth(1, 20) 
    417441        self.discRanksView.sortByColumn(2, Qt.DescendingOrder) 
     
    425449                     SIGNAL("sectionClicked(int)"), 
    426450                     self.headerClick) 
    427          
     451 
    428452        self.contRanksView = QTableView() 
    429453        self.ranksViewStack.addWidget(self.contRanksView) 
     
    431455        self.contRanksView.setSelectionMode(QTableView.MultiSelection) 
    432456        self.contRanksView.setSortingEnabled(True) 
    433 #        self.contRanksView.setItemDelegate(OWGUI.ColoredBarItemDelegate()) 
    434 #        self.contRanksView.horizontalHeader().restoreState(self.contRanksHeaderState) 
    435          
     457 
    436458        self.contRanksModel = QStandardItemModel(self) 
    437459        self.contRanksModel.setHorizontalHeaderLabels( 
    438460            ["Attribute", "#"] + [m.shortname for m in self.contMeasures] 
    439461        ) 
     462 
    440463        self.contRanksProxyModel = MySortProxyModel(self) 
    441464        self.contRanksProxyModel.setSourceModel(self.contRanksModel) 
    442465        self.contRanksView.setModel(self.contRanksProxyModel) 
    443 #        self.contRanksView.verticalHeader().setResizeMode(QHeaderView.ResizeToContents) 
     466 
    444467        self.discRanksView.setColumnWidth(1, 20) 
    445468        self.contRanksView.sortByColumn(2, Qt.DescendingOrder) 
     
    453476                     SIGNAL("sectionClicked(int)"), 
    454477                     self.headerClick) 
    455          
     478 
    456479        # Switch the current view to Discrete 
    457480        self.switchRanksMode(0) 
     
    460483        self.updateVisibleScoreColumns() 
    461484 
    462 #        self.connect(self.table.horizontalHeader(), SIGNAL("sectionClicked(int)"), self.headerClick) 
    463          
    464         self.resize(690,500) 
     485        self.resize(690, 500) 
    465486        self.updateColor() 
    466          
     487 
    467488        self.measure_scores = table((len(self.measures), 0), None) 
    468489 
    469490    def switchRanksMode(self, index): 
    470         """ Switch between discrete/continuous mode 
     491        """ 
     492        Switch between discrete/continuous mode 
    471493        """ 
    472494        self.ranksViewStack.setCurrentIndex(index) 
     
    485507 
    486508        self.updateVisibleScoreColumns() 
    487              
     509 
    488510    def setData(self, data): 
    489511        self.error(0) 
     
    492514        if self.data: 
    493515            attrs = self.data.domain.attributes 
    494             self.usefulAttributes = filter(lambda x:x.varType in [orange.VarTypes.Discrete, orange.VarTypes.Continuous], 
    495                                            attrs) 
     516            self.usefulAttributes = \ 
     517                [attr for attr in attrs 
     518                 if is_discrete(attr) or is_continuous(attr)] 
     519 
    496520            if is_class_continuous(self.data): 
    497521                self.switchRanksMode(1) 
    498522            elif is_class_discrete(self.data): 
    499523                self.switchRanksMode(0) 
    500             else: # String or other. 
    501                 self.error(0, "Cannot handle class variable type") 
    502              
    503 #            self.ranksView.setSortingEnabled(False) 
     524            else: 
     525                # String or other. 
     526                self.error(0, "Cannot handle class variable type %r" % 
     527                           type(self.data.domain.class_var).__name__) 
     528 
    504529            self.ranksModel.setRowCount(len(attrs)) 
    505530            for i, a in enumerate(attrs): 
    506                 if isinstance(a, orange.EnumVariable): 
     531                if is_discrete(a): 
    507532                    v = len(a.values) 
    508533                else: 
     
    514539                item.setData(QVariant(i), OWGUI.SortOrderRole) 
    515540                self.ranksModel.setItem(i, 0, item) 
    516                  
     541 
    517542            self.ranksView.resizeColumnToContents(1) 
    518              
     543 
    519544            self.measure_scores = table((len(self.measures), 
    520545                                         len(attrs)), None) 
     
    523548                self.setLogORTitle() 
    524549            self.ranksView.setSortingEnabled(self.sortBy > 0) 
    525              
     550 
    526551        self.applyIf() 
    527552 
    528553    def updateScores(self, measuresMask=None): 
    529         """ Update the current computed measures. If measuresMask is given 
    530         it must be an list of bool values indicating what measures should be  
    531         computed. 
    532          
    533         """  
     554        """ 
     555        Update the current computed scores. 
     556 
     557        If `measuresMask` is given it must be an list of bool values 
     558        indicating what measures should be recomputed. 
     559 
     560        """ 
    534561        if not self.data: 
    535562            return 
    536          
    537 #         estimators = self.estimators 
     563 
    538564        measures = self.measures 
    539 #         handlesContinous = self.handlesContinuous 
    540565        # Invalidate all warnings 
    541566        self.warning(range(max(len(self.discMeasures), 
     
    573598                        s = estimator(attr, data) 
    574599                    except Exception, ex: 
    575                         self.warning(measure_index, "Error evaluating %r: %r" % (meas.name, str(ex))) 
    576                         # TODO: store exception message (for widget info or item tooltip) 
     600                        self.warning(measure_index, "Error evaluating %r: %r" % 
     601                                     (meas.name, str(ex))) 
    577602                    if meas.name == "Log Odds Ratio" and s is not None: 
     603                        # Hardcoded values returned by log odds measure 
    578604                        if s == -999999: 
    579605                            attr = u"-\u221E" 
     
    585611                attr_scores.append(s) 
    586612            self.measure_scores[measure_index] = attr_scores 
    587          
     613 
    588614        self.updateRankModel(measuresMask) 
    589615        self.ranksProxyModel.invalidate() 
    590          
     616 
    591617        if self.selectMethod in [0, 2]: 
    592618            self.autoSelection() 
    593      
     619 
    594620    def updateRankModel(self, measuresMask=None): 
    595         """ Update the rankModel. 
     621        """ 
     622        Update the rankModel. 
    596623        """ 
    597624        values = [] 
     
    606633                if not item: 
    607634                    item = PyStandardItem() 
    608                     self.ranksModel.setItem(j ,i + 2, item) 
     635                    self.ranksModel.setItem(j, i + 2, item) 
    609636                item.setData(QVariant(s), Qt.DisplayRole) 
    610637            values.append(values_one) 
    611          
     638 
    612639        for i, vals in enumerate(values): 
    613640            valid_vals = [v for v in vals if v is not None] 
     
    618645                        # Set the bar ratio role for i-th measure. 
    619646                        ratio = float((v - vmin) / ((vmax - vmin) or 1)) 
     647                        item = self.ranksModel.item(j, i + 2) 
    620648                        if self.showDistributions: 
    621                             self.ranksModel.item(j, i + 2).setData(QVariant(ratio), OWGUI.BarRatioRole) 
     649                            item.setData(QVariant(ratio), OWGUI.BarRatioRole) 
    622650                        else: 
    623                             self.ranksModel.item(j, i + 2).setData(QVariant(), OWGUI.BarRatioRole) 
    624                          
     651                            item.setData(QVariant(), OWGUI.BarRatioRole) 
     652 
    625653        self.ranksView.resizeColumnsToContents() 
    626654        self.ranksView.setColumnWidth(1, 20) 
    627655        self.ranksView.resizeRowsToContents() 
    628              
    629     def cbShowDistributions(self): 
     656 
     657    def showDistributionsChanged(self): 
    630658        # This should be handled by the delegates only (must always set the BarRatioRole 
    631659        self.updateRankModel() 
     
    641669    def updateColor(self): 
    642670        self.distColor = QColor(*self.distColorRgb) 
    643         w = self.colButton.width()-8 
    644         h = self.colButton.height()-8 
     671        w = self.colButton.width() - 8 
     672        h = self.colButton.height() - 8 
    645673        pixmap = QPixmap(w, h) 
    646674        painter = QPainter() 
    647675        painter.begin(pixmap) 
    648         painter.fillRect(0,0,w,h, QBrush(self.distColor)) 
     676        painter.fillRect(0, 0, w, h, QBrush(self.distColor)) 
    649677        painter.end() 
    650678        self.colButton.setIcon(QIcon(pixmap)) 
     
    663691 
    664692    def onSelectionChanged(self, *args): 
    665         """ Called when the ranks view selection changes. 
     693        """ 
     694        Called when the ranks view selection changes. 
    666695        """ 
    667696        selected = self.selectedAttrs() 
    668697        self.clearButton.setEnabled(bool(selected)) 
    669698        self.applyIf() 
    670          
     699 
    671700    def onSelectItem(self, index): 
    672         """ Called when the user selects/unselects an item in the table view. 
    673         """ 
    674         self.selectMethod = 1 # Manual 
     701        """ 
     702        Called when the user selects/unselects an item in the table view. 
     703        """ 
     704        self.selectMethod = 1  # Manual 
    675705        self.clearButton.setEnabled(bool(self.selectedAttrs())) 
    676706        self.applyIf() 
     
    689719    def getDiscretizedData(self): 
    690720        if not self.discretizedData: 
    691             discretizer = orange.EquiNDiscretization(numberOfIntervals=self.nIntervals) 
    692             contAttrs = filter(lambda attr: attr.varType == orange.VarTypes.Continuous, self.data.domain.attributes) 
     721            discretizer = Orange.feature.discretization.EqualFreq( 
     722                numberOfIntervals=self.nIntervals) 
     723            contAttrs = [attr for attr in self.data.domain.attributes 
     724                         if is_continuous(attr)] 
    693725            at = [] 
    694726            attrDict = {} 
     
    700732                except: 
    701733                    pass 
    702             self.discretizedData = self.data.select(orange.Domain(at, self.data.domain.classVar)) 
     734            domain = Orange.data.Domain(at, self.data.domain.class_var) 
     735            self.discretizedData = self.data.translate(domain) 
    703736            self.discretizedData.setattr("attrDict", attrDict) 
    704737        return self.discretizedData 
     
    713746        mask = [i == index for i, _ in enumerate(self.measures)] 
    714747        self.updateScores(mask) 
    715      
     748 
    716749    def loadMeasureDefaults(self, measure): 
    717 #         index = self.measures.index(measure) 
    718 #         measure = self.estimators[index] 
    719750        params = measure_parameters(measure) 
    720751        for i, p in enumerate(params): 
    721752            setattr(self, param_attr_name(measure.score, p), p.default) 
    722753        self.measureParamChanged(measure) 
    723          
     754 
    724755    def autoSelection(self): 
    725756        selModel = self.ranksView.selectionModel() 
     
    728759        model = self.ranksProxyModel 
    729760        if self.selectMethod == 0: 
    730              
    731             selection = QItemSelection(model.index(0, 0), 
    732                                        model.index(rowCount - 1, 
    733                                        columnCount -1)) 
     761            selection = QItemSelection( 
     762                model.index(0, 0), 
     763                model.index(rowCount - 1, columnCount - 1) 
     764            ) 
    734765            selModel.select(selection, QItemSelectionModel.ClearAndSelect) 
    735766        if self.selectMethod == 2: 
    736767            nSelected = min(self.nSelected, rowCount) 
    737             selection = QItemSelection(model.index(0, 0), 
    738                                        model.index(nSelected - 1, 
    739                                        columnCount - 1)) 
     768            selection = QItemSelection( 
     769                model.index(0, 0), 
     770                model.index(nSelected - 1, columnCount - 1) 
     771            ) 
    740772            selModel.select(selection, QItemSelectionModel.ClearAndSelect) 
    741773 
     
    745777            # The sorting is disabled ("No sorting|" selected by user) 
    746778            self.sortingChanged() 
    747              
     779 
    748780        if index > 1 and self.selectMethod == 2: 
    749781            # Reselect the top ranked attributes 
     
    753785 
    754786    def sortingChanged(self): 
    755         """ Sorting was changed by user (through the Sort By combo box.) 
     787        """ 
     788        Sorting was changed by user (through the Sort By combo box.) 
    756789        """ 
    757790        self.updateSorting() 
    758791        self.autoSelection() 
    759          
     792 
    760793    def updateSorting(self): 
    761         """ Update the sorting of the model/view. 
     794        """ 
     795        Update the sorting of the model/view. 
    762796        """ 
    763797        self.ranksProxyModel.invalidate() 
     
    766800            self.ranksProxyModel.sort(0, Qt.DescendingOrder) 
    767801            self.ranksView.setSortingEnabled(False) 
    768              
     802 
    769803        else: 
    770804            self.ranksProxyModel.setSortRole(Qt.DisplayRole) 
     
    778812        else: 
    779813            title = "log OR" 
    780 #         if "Log Odds Ratio" in self.discEstimators: 
    781 #             index = self.discMeasures.index("Log Odds Ratio") 
     814 
    782815        index = [m.name for m in self.discMeasures].index("Log Odds Ratio") 
    783816 
     
    800833                measuresMask = [False] * len(self.measures) 
    801834        self.updateScores(measuresMask) 
    802          
     835 
    803836        self.updateVisibleScoreColumns() 
    804              
     837 
    805838    def updateVisibleScoreColumns(self): 
    806         """ Update the visible columns of the scores view. 
     839        """ 
     840        Update the visible columns of the scores view. 
    807841        """ 
    808842        for i, measure in enumerate(self.measures): 
     
    814848            self.sortBy = 1 + col 
    815849        else: 
    816             self.sortBy = 3 + self.selectedMeasures[col-2] 
     850            self.sortBy = 3 + self.selectedMeasures[col - 2] 
    817851        self.sortingChanged() 
    818852 
     
    820854        self.updateDelegates() 
    821855        self.ranksView.resizeColumnsToContents() 
    822          
     856 
    823857    def updateDelegates(self): 
    824         self.contRanksView.setItemDelegate(OWGUI.ColoredBarItemDelegate(self, 
    825                             decimals=self.nDecimals, 
    826                             color=self.distColor)) 
    827         self.discRanksView.setItemDelegate(OWGUI.ColoredBarItemDelegate(self, 
    828                             decimals=self.nDecimals, 
    829                             color=self.distColor)) 
    830          
     858        self.contRanksView.setItemDelegate( 
     859            OWGUI.ColoredBarItemDelegate( 
     860                self, 
     861                decimals=self.nDecimals, 
     862                color=self.distColor) 
     863        ) 
     864 
     865        self.discRanksView.setItemDelegate( 
     866            OWGUI.ColoredBarItemDelegate( 
     867                self, 
     868                decimals=self.nDecimals, 
     869                color=self.distColor) 
     870        ) 
     871 
    831872    def sendReport(self): 
    832873        self.reportData(self.data) 
     
    844885            self.send("Reduced Data", None) 
    845886        else: 
    846             domain = orange.Domain(selected, self.data.domain.classVar) 
     887            domain = Orange.data.Domain(selected, self.data.domain.classVar) 
    847888            domain.addmetas(self.data.domain.getmetas()) 
    848             data = orange.ExampleTable(domain, self.data) 
     889            data = Orange.data.Table(domain, self.data) 
    849890            self.send("Reduced Data", data) 
    850891        self.dataChanged = False 
    851          
     892 
    852893    def selectedAttrs(self): 
    853894        if self.data: 
     
    858899            return [self.data.domain.attributes[i] for i in inds] 
    859900        else: 
    860             return []     
     901            return [] 
    861902 
    862903 
    863904class PyStandardItem(QStandardItem): 
    864     """ A StandardItem subclass for python objects. 
     905    """A StandardItem subclass for python objects. 
    865906    """ 
    866907    def __init__(self, *args): 
    867908        QStandardItem.__init__(self, *args) 
    868         self.setFlags(Qt.ItemIsSelectable| Qt.ItemIsEnabled) 
    869          
     909        self.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) 
     910 
    870911    def __lt__(self, other): 
    871912        my = self.data(Qt.DisplayRole).toPyObject() 
     
    875916        return my < other 
    876917 
     918 
    877919class MySortProxyModel(QSortFilterProxyModel): 
    878920    def headerData(self, section, orientation, role): 
     
    881923        source = self.sourceModel() 
    882924        return source.headerData(section, orientation, role) 
    883      
     925 
    884926    def lessThan(self, left, right): 
    885927        role = self.sortRole() 
     
    888930        return left < right 
    889931 
    890 if __name__=="__main__": 
    891     a=QApplication(sys.argv) 
    892     ow=OWRank() 
    893     ow.setData(orange.ExampleTable("wine.tab")) 
    894     ow.setData(orange.ExampleTable("zoo.tab")) 
    895     ow.setData(orange.ExampleTable("servo.tab")) 
    896     ow.setData(orange.ExampleTable("iris.tab")) 
     932 
     933if __name__ == "__main__": 
     934    a = QApplication(sys.argv) 
     935    ow = OWRank() 
     936    ow.setData(Orange.data.Table("wine.tab")) 
     937    ow.setData(Orange.data.Table("zoo.tab")) 
     938    ow.setData(Orange.data.Table("servo.tab")) 
     939    ow.setData(Orange.data.Table("iris.tab")) 
    897940#    ow.setData(orange.ExampleTable("auto-mpg.tab")) 
    898941    ow.show() 
    899942    a.exec_() 
    900943    ow.saveSettings() 
    901  
Note: See TracChangeset for help on using the changeset viewer.