source: orange/orange/OrangeWidgets/Associate/OWItemsetsExplorer.py @ 8042:ffcb93bc9028

Revision 8042:ffcb93bc9028, 9.4 KB checked in by markotoplak, 3 years ago (diff)

Hierarchical clustering: also catch RuntimeError when importing matplotlib (or the documentation could not be built on server).

Line 
1"""
2<name>Itemsets Explorer</name>
3<description>Itemsets explorer.</description>
4<icon>icons/ItemsetsExplorer.png</icon>
5<contact>Janez Demsar (janez.demsar(@at@)fri.uni-lj.si)</contact>
6<priority>1100</priority>
7"""
8from OWWidget import *
9import OWGUI, OWTools, orngMisc
10import sys, re
11from OWItemsets import Itemsets
12
13class OWItemsetsExplorer(OWWidget):
14    settingsList = ["treeDepth", "showWholeItemsets", "autoSend", "purgeAttributes", "purgeClasses"]
15
16    def __init__(self,parent=None, signalManager = None):
17        OWWidget.__init__(self, parent, signalManager, "Itemsets explorer")
18
19        self.inputs = [("Itemsets", Itemsets, self.setItemsets)]
20        self.outputs = [("Itemsets", Itemsets), ("Examples", ExampleTable)]
21
22        self.showWholeItemsets = 1
23        self.treeDepth = 2
24        self.autoSend = True
25        self.dataChanged = False
26        self.purgeAttributes = True
27        self.purgeClasses = True
28
29        self.nItemsets = self.nSelectedItemsets = self.nSelectedExamples = ""
30        self.loadSettings()
31
32        self.treeItemsets = QTreeWidget(self.mainArea)
33        self.mainArea.layout().addWidget(self.treeItemsets)
34        self.treeItemsets.setSelectionMode (QTreeWidget.ExtendedSelection)
35        self.treeItemsets.setHeaderLabels(["Itemsets", "Examples"])
36        self.treeItemsets.setAllColumnsShowFocus ( 1)
37        self.treeItemsets.setAlternatingRowColors(1) 
38        self.treeItemsets.setColumnCount(2) 
39        self.connect(self.treeItemsets,SIGNAL("itemSelectionChanged()"),self. selectionChanged)
40
41        box = OWGUI.widgetBox(self.controlArea, "Info", addSpace = True)
42        OWGUI.label(box, self, "Number of itemsets: %(nItemsets)s")
43        OWGUI.label(box, self, "Selected itemsets: %(nSelectedItemsets)s")
44        OWGUI.label(box, self, "Selected examples: %(nSelectedExamples)s")
45
46        box = OWGUI.widgetBox(self.controlArea, "Tree", addSpace = True)
47        OWGUI.spin(box, self, "treeDepth", label = "Tree depth", min = 1, max = 10, step = 1, callback = self.populateTree, callbackOnReturn = True)
48        OWGUI.checkBox(box, self, "showWholeItemsets", "Display whole itemsets", callback = self.setWholeItemsets)
49        OWGUI.button(box, self, "Expand All", callback = lambda: self.treeItemsets.expandAll())
50        OWGUI.button(box, self, "Collapse", callback = lambda: self.treeItemsets.collapseAll())
51
52        OWGUI.rubber(self.controlArea)
53
54        boxSettings = OWGUI.widgetBox(self.controlArea, 'Send selection')
55        OWGUI.checkBox(boxSettings, self, "purgeAttributes", "Purge attribute values/attributes", box=None, callback=self.purgeChanged)
56        self.purgeClassesCB = OWGUI.checkBox(OWGUI.indentedBox(boxSettings), self, "purgeClasses", "Purge class attribute", callback=self.purgeChanged)
57        if not self.purgeAttributes:
58            self.purgeClassesCB.setEnabled(False)
59            self.oldPurgeClasses = False
60
61        cbSendAuto = OWGUI.checkBox(boxSettings, self, "autoSend", "Send immediately", box=None)
62        btnUpdate = OWGUI.button(boxSettings, self, "Send", self.sendData, default=True)
63        OWGUI.setStopper(self, btnUpdate, cbSendAuto, "dataChanged", self.sendData)
64
65        self.itemsets= None
66
67    def sendReport(self):
68        import OWReport
69        self.reportSettings("Itemset statistics",
70                            [("Number of itemsets", self.nItemsets),
71                             ("Selected itemsets", self.nSelectedItemsets),
72                             ("Covered examples", self.nSelectedExamples),
73                             ])
74        self.reportSection("Itemsets")
75        self.reportRaw(OWReport.reportTree(self.treeItemsets))
76
77    def setWholeItemsets(self, node = None):
78        if not node:
79            for i in range(self.treeItemsets.topLevelItemCount()):
80                self.setWholeItemsets(self.treeItemsets.topLevelItem(i))
81        else:
82            t = getattr(node, self.showWholeItemsets and "allItems" or "remainder", "")
83            if t:
84                node.setText(0, t)
85            for i in range(node.childCount()):
86                self.setWholeItemsets(node.child(i))
87
88    def resizeEvent(self, *a):
89        self.treeItemsets.setColumnWidth(0,self.treeItemsets.width()-60)
90        OWWidget.resizeEvent(self, *a)
91
92    def showEvent(self, *a):
93        self.treeItemsets.setColumnWidth(0,self.treeItemsets.width()-60)
94        OWWidget.showEvent(self, *a)
95
96    def populateTree(self):
97        self.treeItemsets.clear()
98        if not self.itemsets:
99            return
100       
101        itemset2Node = {}
102        for itemset, examples, id in self.itemsets:
103            if len(itemset) == 1:
104                node = QTreeWidgetItem(self.treeItemsets, [itemset[0], str(len(examples))])
105                node.itemsetId = id
106                itemset2Node[itemset] = node
107       
108        treeDepth = self.treeDepth
109        for depth in range(2, 1+treeDepth):
110            newItemset2Node = {}
111            for itemset, examples, id in self.itemsets:
112                if len(itemset) == depth:
113                    for itout in range(depth):
114                        parentitemset = itemset[:itout]+itemset[itout+1:]
115                        node = QTreeWidgetItem(itemset2Node[parentitemset], [itemset[itout], str(len(examples))])
116                        node.itemsetId = id
117                        newItemset2Node[itemset] = node
118            itemset2Node = newItemset2Node
119                       
120        showWhole = self.showWholeItemsets
121        for itemset, examples, id in sorted((i for i in self.itemsets if len(i[0]) > treeDepth), cmp = lambda x,y:cmp(len(x[0]), len(y[0]))):
122            for itout in orngMisc.MofNCounter(treeDepth, len(itemset)):
123                parentitemset = tuple([itemset[i] for i in itout])
124                node.allItems = " ".join(itemset)
125                node.remainder = " ".join(item for i, item in enumerate(itemset) if i not in itout)
126                node = QTreeWidgetItem(itemset2Node[parentitemset], [showWhole and node.allItems or node.remainder, str(len(examples))])
127                node.itemsetId = id
128
129             
130    def gatherItemsets(self, node, ids):
131        if hasattr(node, "itemsetId"):
132            ids.add(node.itemsetId)
133        for i in range(node.childCount()):
134            self.gatherItemsets(node.child(i), ids)
135
136    def purgeChanged(self):
137        if self.purgeAttributes:
138            if not self.purgeClassesCB.isEnabled():
139                self.purgeClassesCB.setEnabled(True)
140                self.purgeClasses = self.oldPurgeClasses
141        else:
142            if self.purgeClassesCB.isEnabled():
143                self.purgeClassesCB.setEnabled(False)
144                self.oldPurgeClasses = self.purgeClasses
145                self.purgeClasses = False
146   
147    def selectionChanged(self):
148        ids = set()
149        for node in self.treeItemsets.selectedItems():
150            self.gatherItemsets(node, ids)
151        self.selectedItemsets = [self.itemsets[i] for i in ids]
152        exampleids = set()
153        for itemset in self.selectedItemsets:
154            exampleids.update(itemset[1])
155        self.exampleids = list(exampleids)
156        self.setInfo()
157        self.sendIf()
158
159    def sendIf(self):
160        if self.autoSend:
161            self.sendData()
162        else:
163            self.dataChanged = True
164           
165    def sendData(self):
166        self.dataChanged = False
167        self.send("Itemsets", (self.dataset, self.selectedItemsets))
168        if self.selectedItemsets:
169            examples = self.dataset.getitemsref(self.exampleids)
170            if self.purgeAttributes or self.purgeClasses:
171                examples = OWTools.domainPurger(examples, self.purgeClasses)
172        else:
173            examples = None
174
175        self.send("Examples", examples)
176       
177
178    def setInfo(self):
179        if self.itemsets:
180            self.nItemsets = len(self.itemsets)
181            if self.selectedItemsets:
182                self.nSelectedItemsets = len(self.selectedItemsets)
183                self.nSelectedExamples = len(self.exampleids)
184            else:
185                self.nSelectedItemsets = self.nSelectedExamples = ""
186        else:
187            self.nItemsets = self.nSelectedItemsets = self.nSelectedExamples = ""
188           
189    def setItemsets(self, data):
190        if not data:
191            self.dataset = self.origItemsets = itemsets = dataset = None
192        else:
193            self.dataset, self.origItemsets = data
194            dataset, itemsets = self.dataset, self.origItemsets
195        if itemsets:
196            if isinstance(itemsets[0][0][0], tuple):
197                vars = dataset.domain.variables
198                self.itemsets = [(tuple(["%s=%s" % (vars[i].name, vars[i].values[j]) for i, j in itemset]),
199                                  examples,
200                                  i) for i, (itemset, examples) in enumerate(itemsets)]
201            else:
202                domain = dataset.domain
203                self.itemsets = [(tuple([domain[i].name for i in itemset]),
204                                  examples,
205                                  i) for i, (itemset, examples) in enumerate(itemsets)]
206        else:
207            self.dataset = self.itemsets = None
208        self.populateTree()
209        self.selectionChanged()
210
211if __name__=="__main__":
212    a=QApplication(sys.argv)
213    ow=OWItemsetsExplorer()
214
215    #dataset = orange.ExampleTable('..\\..\\doc\\datasets\\car.tab')
216    dataset = orange.ExampleTable(r"E:\Development\Orange Datasets\UCI\zoo.tab")
217    rules=orange.AssociationRulesInducer(dataset, support = 0.5, maxItemSets=10000)
218    ow.arules(rules)
219
220    ow.show()
221    a.exec_()
222    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.