From c2337cb359482ff7d97a3ea683a4b44d1c7cfbcb Mon Sep 17 00:00:00 2001 From: janezd Date: Sun, 9 Oct 2016 23:16:59 +0200 Subject: [PATCH 1/2] TreeAdapter (Pythagoras): Change get_instances_in_nodes to accept node ids not TreeNodes --- Orange/widgets/visualize/owpythagorastree.py | 10 ++++++---- Orange/widgets/visualize/owpythagoreanforest.py | 6 ++++-- Orange/widgets/visualize/utils/tree/skltreeadapter.py | 2 +- Orange/widgets/visualize/utils/tree/treeadapter.py | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Orange/widgets/visualize/owpythagorastree.py b/Orange/widgets/visualize/owpythagorastree.py index 7dee4241b84..b2666afe574 100644 --- a/Orange/widgets/visualize/owpythagorastree.py +++ b/Orange/widgets/visualize/owpythagorastree.py @@ -350,7 +350,7 @@ def commit(self): self.scene.selectedItems()) data = self.tree_adapter.get_instances_in_nodes( - self.clf_dataset, [item.tree_node for item in items]) + self.clf_dataset, [item.tree_node.label for item in items]) self.send('Selected Data', data) def send_report(self): @@ -532,7 +532,8 @@ def _color_class_mean(self, adapter, tree_node): # calculate node colors relative to the mean of the node samples min_mean = np.min(self.clf_dataset.Y) max_mean = np.max(self.clf_dataset.Y) - instances = adapter.get_instances_in_nodes(self.clf_dataset, tree_node) + instances = adapter.get_instances_in_nodes(self.clf_dataset, + tree_node.label) mean = np.mean(instances.Y) return self.color_palette[(mean - min_mean) / (max_mean - min_mean)] @@ -541,7 +542,8 @@ def _color_stddev(self, adapter, tree_node): # calculate node colors relative to the standard deviation in the node # samples min_mean, max_mean = 0, np.std(self.clf_dataset.Y) - instances = adapter.get_instances_in_nodes(self.clf_dataset, tree_node) + instances = adapter.get_instances_in_nodes(self.clf_dataset, + tree_node.label) std = np.std(instances.Y) return self.color_palette[(std - min_mean) / (max_mean - min_mean)] @@ -553,7 +555,7 @@ def _regression_get_tooltip(self, node): ratio = samples / total instances = self.tree_adapter.get_instances_in_nodes( - self.clf_dataset, node) + self.clf_dataset, node.label) mean = np.mean(instances.Y) std = np.std(instances.Y) diff --git a/Orange/widgets/visualize/owpythagoreanforest.py b/Orange/widgets/visualize/owpythagoreanforest.py index fd34b944da5..245705c5ce6 100644 --- a/Orange/widgets/visualize/owpythagoreanforest.py +++ b/Orange/widgets/visualize/owpythagoreanforest.py @@ -375,7 +375,8 @@ def _color_class_mean(self, adapter, tree_node): # calculate node colors relative to the mean of the node samples min_mean = np.min(self.clf_dataset.Y) max_mean = np.max(self.clf_dataset.Y) - instances = adapter.get_instances_in_nodes(self.clf_dataset, tree_node) + instances = adapter.get_instances_in_nodes(self.clf_dataset, + tree_node.label) mean = np.mean(instances.Y) return self.color_palette[(mean - min_mean) / (max_mean - min_mean)] @@ -384,7 +385,8 @@ def _color_stddev(self, adapter, tree_node): # calculate node colors relative to the standard deviation in the node # samples min_mean, max_mean = 0, np.std(self.clf_dataset.Y) - instances = adapter.get_instances_in_nodes(self.clf_dataset, tree_node) + instances = adapter.get_instances_in_nodes(self.clf_dataset, + tree_node.label) std = np.std(instances.Y) return self.color_palette[(std - min_mean) / (max_mean - min_mean)] diff --git a/Orange/widgets/visualize/utils/tree/skltreeadapter.py b/Orange/widgets/visualize/utils/tree/skltreeadapter.py index 3aed7f88680..d87ad8080d7 100644 --- a/Orange/widgets/visualize/utils/tree/skltreeadapter.py +++ b/Orange/widgets/visualize/utils/tree/skltreeadapter.py @@ -279,7 +279,7 @@ def get_instances_in_nodes(self, dataset, nodes): if not isinstance(nodes, (list, tuple)): nodes = [nodes] - node_leaves = [self.leaves(n.label) for n in nodes] + node_leaves = [self.leaves(n) for n in nodes] if len(node_leaves) > 0: # get the leaves of the selected tree node node_leaves = np.unique(np.hstack(node_leaves)) diff --git a/Orange/widgets/visualize/utils/tree/treeadapter.py b/Orange/widgets/visualize/utils/tree/treeadapter.py index 8d78b392a27..3bf84353aeb 100644 --- a/Orange/widgets/visualize/utils/tree/treeadapter.py +++ b/Orange/widgets/visualize/utils/tree/treeadapter.py @@ -212,7 +212,7 @@ def get_instances_in_nodes(self, dataset, nodes): ---------- dataset : Table A Orange Table dataset. - nodes : iterable[TreeNode] + nodes : iterable[node] A list of tree nodes for which we want the instances. Returns From 9a77c6039aaf872297ecbe086ddf8315a0034b91 Mon Sep 17 00:00:00 2001 From: janezd Date: Sun, 9 Oct 2016 23:32:51 +0200 Subject: [PATCH 2/2] TreeAdapter (Pythagoras): Change constant ROOT_PARENT from -1 to None --- Orange/widgets/visualize/pythagorastreeviewer.py | 6 ++++-- Orange/widgets/visualize/utils/tree/skltreeadapter.py | 1 - Orange/widgets/visualize/utils/tree/treeadapter.py | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Orange/widgets/visualize/pythagorastreeviewer.py b/Orange/widgets/visualize/pythagorastreeviewer.py index 25de8a588f7..2addbe13fc3 100644 --- a/Orange/widgets/visualize/pythagorastreeviewer.py +++ b/Orange/widgets/visualize/pythagorastreeviewer.py @@ -21,6 +21,8 @@ from PyQt4 import QtCore, QtGui from PyQt4.QtCore import Qt +from Orange.widgets.visualize.utils.tree.treeadapter import TreeAdapter + # z index range, increase if needed Z_STEP = 5000000 @@ -384,7 +386,7 @@ def __init__(self, tree_node, parent=None, **kwargs): self.z_step = Z_STEP # calculate the correct z values based on the parent - if self.tree_node.parent != -1: + if self.tree_node.parent != TreeAdapter.ROOT_PARENT: p = self.tree_node.parent # override root z step num_children = len(p.children) @@ -503,7 +505,7 @@ def _propagate_to_children(self, graphics_item, fnc): def _propagate_to_parents(self, graphics_item, fnc, other_fnc): # propagate function that handles graphics item to appropriate parents - if graphics_item.tree_node.parent != -1: + if graphics_item.tree_node.parent != TreeAdapter.ROOT_PARENT: parent = graphics_item.tree_node.parent.graphics_item # handle the non relevant children nodes for c in parent.tree_node.children: diff --git a/Orange/widgets/visualize/utils/tree/skltreeadapter.py b/Orange/widgets/visualize/utils/tree/skltreeadapter.py index d87ad8080d7..d729a7ec60f 100644 --- a/Orange/widgets/visualize/utils/tree/skltreeadapter.py +++ b/Orange/widgets/visualize/utils/tree/skltreeadapter.py @@ -30,7 +30,6 @@ class SklTreeAdapter(TreeAdapter): """ - ROOT_PARENT = -1 NO_CHILD = -1 FEATURE_UNDEFINED = -2 diff --git a/Orange/widgets/visualize/utils/tree/treeadapter.py b/Orange/widgets/visualize/utils/tree/treeadapter.py index 3bf84353aeb..5a442ad87da 100644 --- a/Orange/widgets/visualize/utils/tree/treeadapter.py +++ b/Orange/widgets/visualize/utils/tree/treeadapter.py @@ -11,7 +11,7 @@ class TreeAdapter(metaclass=ABCMeta): """ - ROOT_PARENT = -1 + ROOT_PARENT = None NO_CHILD = -1 FEATURE_UNDEFINED = -2 @@ -52,7 +52,7 @@ def num_samples(self, node): @abstractmethod def parent(self, node): - """Get the parent of a given node. Return -1 if the node is the root. + """Get the parent of a given node or ROOT_PARENT if the node is the root. Parameters ----------