source: orange/orange/OrangeWidgets/Data/OWOutliers.py @ 9546:2b6cc6f397fe

Revision 9546:2b6cc6f397fe, 5.3 KB checked in by ales_erjavec <ales.erjavec@…>, 2 years ago (diff)

Renamed widget channel names in line with the new naming rules/convention.
Added backwards compatibility in orngDoc loadDocument to enable loading of schemas saved before the change.

Line 
1"""
2<name>Outliers</name>
3<description>Indentification of outliers</description>
4<icon>icons/Outliers.png</icon>
5<contact>Marko Toplak (marko.toplak(@at@)gmail.com)</contact> 
6<priority>2150</priority>
7"""
8
9from OWWidget import *
10import OWGUI, orange
11import orngOutlier
12from exceptions import Exception
13
14##############################################################################
15
16class OWOutliers(OWWidget):
17    settingsList = ["zscore", "metric", "k"]
18   
19    def __init__(self, parent=None, signalManager = None, name='Outlier'):
20        OWWidget.__init__(self, parent, signalManager, name, wantMainArea = 0)
21
22        self.inputs = [("Data", ExampleTable, self.cdata),("Distances", orange.SymMatrix, self.cdistance)]
23        self.outputs = [("Outliers", ExampleTable), ("Inliers", ExampleTable), ("Examples with Z-scores", ExampleTable)]
24               
25        # Settings
26        self.zscore = '4.0'
27        self.k = 1
28        self.metric = 0
29        self.loadSettings()
30       
31        self.haveInput = 0
32        self.data = None                    # input data set
33        self.dataInput = None
34        self.distanceMatrix = None
35       
36        kernelSizeValid = QDoubleValidator(self.controlArea)
37
38
39        self.metrics = [("Euclidean", orange.ExamplesDistanceConstructor_Euclidean),
40                        ("Manhattan", orange.ExamplesDistanceConstructor_Manhattan),
41                        ("Hamming", orange.ExamplesDistanceConstructor_Hamming),
42                        ("Relief", orange.ExamplesDistanceConstructor_Relief)]
43
44        self.ks = [("All",0), ("1", 1), ("2",2), ("3",3), ("5",5), ("10",10), ("15",15)]
45        items = [x[0] for x in self.metrics]
46        itemsk = [x[0] for x in self.ks]
47       
48        OWGUI.comboBox(self.controlArea, self, "metric", box="Distance Metrics", items=items,
49                       tooltip="Metrics to measure pairwise distance between data instances.",
50                       callback=self.dataChange)
51
52        OWGUI.separator(self.controlArea)
53        OWGUI.comboBox(self.controlArea, self, "k", box="Nearest Neighbours", items=itemsk,
54                       tooltip="Neighbours considered when computing the distance.",
55                       callback=self.applySettings)
56
57        OWGUI.separator(self.controlArea)
58        box = OWGUI.widgetBox(self.controlArea, "Outliers")
59        OWGUI.lineEdit(box, self, 'zscore',
60                       label = 'Outlier Z:', labelWidth=80,
61                       orientation='horizontal', # box=None,
62                       validator = kernelSizeValid,
63                       tooltip="Minimum Z-score of an outlier.",
64                       callback=self.applySettings)
65
66        OWGUI.rubber(self.controlArea)
67       
68        self.loadSettings()
69     
70        self.resize(100,100)
71        self.applySettings()
72
73    def activateLoadedSettings(self):
74        self.applySettings()
75
76    def applySettings(self):             
77        """use the setting from the widget, identify the outliers"""
78        if self.haveInput == 1:
79            outlier = self.outlier
80            outlier.setKNN(self.ks[self.k][1])
81       
82            newdomain = orange.Domain(self.data.domain)
83            newdomain.addmeta(orange.newmetaid(), orange.FloatVariable("Z score"))
84           
85            self.newdata = orange.ExampleTable(newdomain, self.data)
86
87            zv = outlier.zValues()
88            for i, el in enumerate(zv):
89                self.newdata[i]["Z score"] = el           
90
91            self.send("Examples with Z-scores", self.newdata)
92           
93            filterout = orange.Filter_values(domain=self.newdata.domain)
94            filterout["Z score"] = (orange.Filter_values.Greater, eval(self.zscore))
95            outliers = filterout(self.newdata)
96
97            filterin = orange.Filter_values(domain=self.newdata.domain)
98            filterin["Z score"] = (orange.Filter_values.LessEqual, eval(self.zscore))
99            inliers = filterin(self.newdata)
100           
101            self.send("Outliers", outliers)
102            self.send("Inliers", inliers)
103        else:
104            self.send("Examples with Z-scores", None)
105            self.send("Outliers", None)
106            self.send("Inliers", None)
107 
108    def cdata(self, data):
109        """handles examples input signal"""
110        self.dataInput = data
111        self.dataChange()
112
113    def cdistance(self, distances):
114        """handles distance matrix input signal"""
115        self.distanceMatrix = distances
116        self.dataChange()
117       
118    def dataChange(self):
119        self.haveInput = 0       
120        outlier = orngOutlier.OutlierDetection()
121       
122        if self.distanceMatrix is not None:
123            outlier.setDistanceMatrix(self.distanceMatrix) 
124            self.data=getattr(self.distanceMatrix, "items")
125            self.haveInput = 1     
126        elif self.dataInput is not None:
127            self.data = self.dataInput
128            outlier.setExamples(self.data, self.metrics[self.metric][1](self.data))       
129            self.haveInput = 1
130        else:
131            self.data = None
132        self.outlier = outlier
133        self.applySettings()
134
135##############################################################################
136# Test the widget, run from DOS prompt
137
138if __name__=="__main__":
139    a=QApplication(sys.argv)
140    ow=OWOutliers()
141    a.setMainWidget(ow)
142
143    ow.show()
144    a.exec_loop()
145    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.