Skip to content

Commit c06cda3

Browse files
authored
Merge pull request #3549 from AndrejaKovacic/keep_data_owtransform
[ENH] OWTransform: add option to keep original data #3526
2 parents cd5a48c + 1d7851c commit c06cda3

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

Orange/widgets/data/owtransform.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
from Orange.data import Table
1+
import numpy as np
2+
3+
from Orange.data import Table, Domain
24
from Orange.preprocess.preprocess import Preprocess, Discretize
35
from Orange.widgets import gui
6+
from Orange.widgets.settings import Setting
47
from Orange.widgets.utils.sql import check_sql_input
58
from Orange.widgets.utils.widgetpreview import WidgetPreview
69
from Orange.widgets.widget import OWWidget, Input, Output, Msg
@@ -13,6 +16,8 @@ class OWTransform(OWWidget):
1316
priority = 2110
1417
keywords = []
1518

19+
retain_all_data = Setting(False)
20+
1621
class Inputs:
1722
data = Input("Data", Table, default=True)
1823
preprocessor = Input("Preprocessor", Preprocess)
@@ -39,6 +44,11 @@ def __init__(self):
3944
self.set_input_label_text()
4045
self.set_preprocessor_label_text()
4146

47+
self.retain_all_data_cb = gui.checkBox(
48+
self.controlArea, self, "retain_all_data", label="Retain all data",
49+
callback=self.apply
50+
)
51+
4252
def set_input_label_text(self):
4353
text = "No data on input."
4454
if self.data is not None:
@@ -83,11 +93,30 @@ def apply(self):
8393
self.transformed_data = self.preprocessor(self.data)
8494
except Exception as ex: # pylint: disable=broad-except
8595
self.Error.pp_error(ex)
86-
self.Outputs.transformed_data.send(self.transformed_data)
96+
97+
if self.retain_all_data:
98+
self.Outputs.transformed_data.send(self.merge_data())
99+
else:
100+
self.Outputs.transformed_data.send(self.transformed_data)
87101

88102
self.set_preprocessor_label_text()
89103
self.set_output_label_text()
90104

105+
def merge_data(self):
106+
attributes = getattr(self.data.domain, 'attributes')
107+
cls_vars = getattr(self.data.domain, 'class_vars')
108+
metas_v = getattr(self.data.domain, 'metas')\
109+
+ getattr(self.transformed_data.domain, 'attributes')
110+
domain = Domain(attributes, cls_vars, metas_v)
111+
X = self.data.X
112+
Y = self.data.Y
113+
metas = np.hstack((self.data.metas, self.transformed_data.X))
114+
table = Table.from_numpy(domain, X, Y, metas)
115+
table.name = getattr(self.data, 'name', '')
116+
table.attributes = getattr(self.data, 'attributes', {})
117+
table.ids = self.data.ids
118+
return table
119+
91120
def send_report(self):
92121
if self.preprocessor is not None:
93122
self.report_items("Settings",

Orange/widgets/data/tests/test_owtransform.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,14 @@ def test_input_pca_preprocessor(self):
7676
self.assertIsInstance(output, Table)
7777
self.assertEqual(output.X.shape, (len(self.data), 2))
7878

79+
# test retain data functionality
80+
self.widget.retain_all_data = True
81+
self.widget.apply()
82+
output = self.get_output(self.widget.Outputs.transformed_data)
83+
self.assertIsInstance(output, Table)
84+
self.assertEqual(output.X.shape, (len(self.data), 4))
85+
self.assertEqual(output.metas.shape, (len(self.data), 2))
86+
7987
def test_error_transforming(self):
8088
self.send_signal(self.widget.Inputs.data, self.data)
8189
self.send_signal(self.widget.Inputs.preprocessor, Preprocess())

0 commit comments

Comments
 (0)