source: orange/Orange/OrangeWidgets/Visualize/OWSieveMultigram.py @ 9671:a7b056375472

Revision 9671:a7b056375472, 8.9 KB checked in by anze <anze.staric@…>, 2 years ago (diff)

Moved orange to Orange (part 2)

Line 
1"""
2<name>Sieve multigram</name>
3<description>Sieve multigram.</description>
4<contact>Gregor Leban (gregor.leban@fri.uni-lj.si)</contact>
5<icon>icons/SieveMultigram.png</icon>
6<priority>4300</priority>
7"""
8
9from OWVisWidget import *
10from OWSieveMultigramGraph import *
11import orngVisFuncts
12from orngCI import FeatureByCartesianProduct
13import OWGUI
14from math import sqrt
15from orngScaleData import discretizeDomain
16
17###########################################################################################
18##### WIDGET : Polyviz visualization
19###########################################################################################
20class OWSieveMultigram(OWVisWidget):
21    settingsList = ["graph.lineWidth", "graph.maxPearson", "graph.minPearson", "showAllAttributes"]
22    contextHandlers = {"": DomainContextHandler("", [ContextField("shownAttributes", DomainContextHandler.RequiredList, selected="selectedShown", reservoir="hiddenAttributes")])}
23
24
25    def __init__(self,parent=None, signalManager = None):
26        OWWidget.__init__(self, parent, signalManager, "Sieve Multigram", wantGraph = True, wantStatusBar = True)
27
28        self.inputs = [("Data", ExampleTable, self.setData), ("Features", AttributeList, self.setShownAttributes)]
29        self.outputs = []
30
31        #add a graph widget
32        self.graph = OWSieveMultigramGraph(self.mainArea)
33        self.graph.useAntialiasing = 1
34        self.mainArea.layout().addWidget(self.graph)
35
36        #set default settings
37        self.graphCanvasColor = str(QColor(Qt.white).name())
38        self.data = None
39        self.graph.lineWidth = 3
40        self.graph.minPearson = 2
41        self.graph.maxPearson = 10
42        self.showAllAttributes = 0
43
44        # add a settings dialog and initialize its values
45        self.loadSettings()
46
47        #GUI
48        # add a settings dialog and initialize its values
49        self.tabs = OWGUI.tabWidget(self.controlArea)
50        self.GeneralTab = OWGUI.createTabPage(self.tabs, "Main")
51        self.SettingsTab = OWGUI.createTabPage(self.tabs, "Settings")
52
53        #add controls to self.controlArea widget
54        self.createShowHiddenLists(self.GeneralTab, callback = self.updateGraph)
55
56        OWGUI.button(self.GeneralTab, self, "Find Interesting Attr.", callback = self.interestingSubsetSelection, debuggingEnabled = 0)
57
58        OWGUI.hSlider(self.SettingsTab, self, 'graph.lineWidth', box = 1, label = "Max line width:", minValue=1, maxValue=10, step=1, callback = self.updateGraph)
59        residualBox = OWGUI.widgetBox(self.SettingsTab, "Attribute independence (Pearson residuals)")
60        OWGUI.hSlider(residualBox, self, 'graph.maxPearson', label = "Max residual:", minValue=4, maxValue=12, step=1, callback = self.updateGraph)
61        OWGUI.hSlider(residualBox, self, 'graph.minPearson', label = "Min residual:", minValue=0, maxValue=4, step=1, callback = self.updateGraph, tooltip = "The minimal absolute residual value that will be shown in graph")
62        self.SettingsTab.layout().addStretch(100)
63
64        self.connect(self.graphButton, SIGNAL("clicked()"), self.graph.saveToFile)
65        self.resize(800, 600)
66
67    def sendReport(self):
68        self.reportImage(self.graph.saveToFileDirect, QSize(500,500))
69
70    # receive new data and update all fields
71    def setData(self, data):
72        self.closeContext()
73        self.information(0)
74        self.error([0, 1])
75        self.data = None
76        if data: 
77            data = orange.Preprocessor_dropMissing(data)
78            if len(data) == 0:
79                self.error(0, "No examples without missing values")
80                data = None
81        if not self.isDataWithClass(data):
82            self.error(1, "Data is without class")
83            data = None
84           
85        if data and data.domain.hasContinuousAttributes():
86            data = discretizeDomain(data, 1)
87            self.information(0, "Continuous attributes were discretized using entropy discretization.")
88
89        self.data = data
90        self.computeProbabilities()
91
92        self.setShownAttributeList()
93        self.openContext("", self.data)
94        self.resetAttrManipulation()
95        self.updateGraph()
96
97
98    def sendShownAttributes(self):
99        pass
100
101    def updateGraph(self, *args):
102        self.graph.updateData(self.data, self.getShownAttributeList(), self.probabilities)
103       
104    def interestingSubsetSelection(self):
105        labels = self.getShownAttributeList()
106        interestingList = []
107        data = self.data
108
109        # create a list of interesting attributes
110        for attrXindex in range(len(labels)):
111            attrXName = labels[attrXindex]
112
113            for attrYindex in range(attrXindex+1, len(labels)):
114                attrYName = labels[attrYindex]
115
116                for valXindex in range(len(data.domain[attrXName].values)):
117                    valX = data.domain[attrXName].values[valXindex]
118
119                    for valYindex in range(len(data.domain[attrYName].values)):
120                        valY = data.domain[attrYName].values[valYindex]
121
122                        ((nameX, countX),(nameY, countY), actual, sum) = self.probabilities['%s+%s:%s+%s' %(attrXName, valX, attrYName, valY)]
123                        expected = float(countX*countY)/float(sum)
124                        if actual == expected == 0: continue
125                        elif expected == 0: pearson = actual/sqrt(actual)
126                        else:               pearson = (actual - expected) / sqrt(expected)
127                        if abs(pearson) > self.graph.minPearson and attrXName not in interestingList: interestingList.append(attrXName)
128                        if abs(pearson) > self.graph.minPearson and attrYName not in interestingList: interestingList.append(attrYName)
129
130        # remove attributes that are not in interestingList from visible attribute list
131        self.setShownAttributeList(interestingList)
132        self.updateGraph()
133
134    def computeProbabilities(self):
135        self.probabilities = {}
136        if not self.data: return
137
138        self.setStatusBarText("Please wait. Computing...")
139        total = len(self.data)
140        conts = {}
141        dc = []
142        for i in range(len(self.data.domain)):
143            dc.append(orange.ContingencyAttrAttr(self.data.domain[i], self.data.domain[i], self.data))
144
145        for i in range(len(self.data.domain)):
146            if self.data.domain[i].varType == orange.VarTypes.Continuous: continue      # we can only check discrete attributes
147
148            cont = dc[i]   # distribution of X attribute
149            vals = []
150            # compute contingency of x attribute
151            for key in cont.keys():
152                sum = 0
153                try:
154                    for val in cont[key]: sum += val
155                except: pass
156                vals.append(sum)
157            conts[self.data.domain[i].name] = (cont, vals)
158
159        for attrX in range(len(self.data.domain)):
160            if self.data.domain[attrX].varType == orange.VarTypes.Continuous: continue      # we can only check discrete attributes
161
162            for attrY in range(attrX, len(self.data.domain)):
163                if self.data.domain[attrY].varType == orange.VarTypes.Continuous: continue  # we can only check discrete attributes
164
165                (contX, valsX) = conts[self.data.domain[attrX].name]
166                (contY, valsY) = conts[self.data.domain[attrY].name]
167
168                # create cartesian product of selected attributes and compute contingency
169                (cart, profit) = FeatureByCartesianProduct(self.data, [self.data.domain[attrX], self.data.domain[attrY]])
170                tempData = self.data.select(list(self.data.domain) + [cart])
171                contXY = orange.ContingencyAttrClass(cart, tempData)   # distribution of X attribute
172
173                # compute probabilities
174                for i in range(len(valsX)):
175                    valx = valsX[i]
176                    for j in range(len(valsY)):
177                        valy = valsY[j]
178
179                        actualCount = 0
180                        try:
181                            for val in contXY['%s-%s' %(contX.keys()[i], contY.keys()[j])]: actualCount += val
182                        except: pass
183                        self.probabilities['%s+%s:%s+%s' %(self.data.domain[attrX].name, contX.keys()[i], self.data.domain[attrY].name, contY.keys()[j])] = ((contX.keys()[i], valx), (contY.keys()[j], valy), actualCount, total)
184                        self.probabilities['%s+%s:%s+%s' %(self.data.domain[attrY].name, contY.keys()[j], self.data.domain[attrX].name, contX.keys()[i])] = ((contY.keys()[j], valy), (contX.keys()[i], valx), actualCount, total)
185        self.setStatusBarText("")
186
187    # receive info about which attributes to show
188    def setShownAttributes(self, list):
189        self.setShownAttributeList(list)
190        self.updateGraph()
191   
192
193#test widget appearance
194if __name__=="__main__":
195    a=QApplication(sys.argv)
196    ow=OWSieveMultigram()
197    data = orange.ExampleTable(r"E:\Development\Orange Datasets\UCI\zoo.tab")
198    ow.setData(data)
199    ow.handleNewSignals()
200    ow.show()
201    a.exec_()
202
203    #save settings
204    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.