Skip to content

Commit 3dc0726

Browse files
committed
OWTranspose: Add a new widget
1 parent 92dbfef commit 3dc0726

File tree

3 files changed

+403
-0
lines changed

3 files changed

+403
-0
lines changed
Lines changed: 257 additions & 0 deletions
Loading

Orange/widgets/data/owtranspose.py

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
from AnyQt.QtCore import Qt
2+
3+
from Orange.data import Table, StringVariable
4+
from Orange.widgets.settings import (Setting, ContextSetting,
5+
PerfectDomainContextHandler)
6+
from Orange.widgets.utils.itemmodels import DomainModel
7+
from Orange.widgets.widget import OWWidget, Msg
8+
from Orange.widgets import gui
9+
10+
11+
class OWTranspose(OWWidget):
12+
name = "Transpose"
13+
description = "Transpose data table."
14+
icon = "icons/Transpose.svg"
15+
priority = 2000
16+
17+
inputs = [("Data", Table, "set_data")]
18+
outputs = [("Data", Table)]
19+
20+
resizing_enabled = False
21+
want_main_area = False
22+
23+
settingsHandler = PerfectDomainContextHandler(metas_in_res=True)
24+
feature_type = ContextSetting(0)
25+
feature_names_column = ContextSetting("")
26+
auto_apply = Setting(True)
27+
28+
class Error(OWWidget.Error):
29+
value_error = Msg("{}")
30+
31+
def __init__(self):
32+
super().__init__()
33+
self.data = None
34+
35+
# GUI
36+
box = gui.vBox(self.controlArea, "Feature names")
37+
self.feature_radio = gui.radioButtonsInBox(
38+
box, self, "feature_type", callback=self._feature_type_changed,
39+
btnLabels=["Generic", "From meta attributes"])
40+
41+
self.feature_model = DomainModel(
42+
order=DomainModel.METAS, valid_types=StringVariable,
43+
alphabetical=True)
44+
self.feature_combo = gui.comboBox(
45+
box, self, "feature_names_column", orientation=Qt.Horizontal,
46+
labelWidth=100, sendSelectedValue=True, callback=self.apply,
47+
contentsLength=12, enabled=self.feature_type)
48+
self.feature_combo.setModel(self.feature_model)
49+
50+
self.apply_button = gui.auto_commit(
51+
self.controlArea, self, "auto_apply", "&Apply",
52+
box=False, commit=self.apply)
53+
54+
def _feature_type_changed(self):
55+
self.feature_combo.setEnabled(self.feature_type)
56+
self.apply()
57+
58+
def set_data(self, data):
59+
self.closeContext()
60+
self.data = data
61+
self.update_controls()
62+
self.openContext(data)
63+
self.feature_combo.setEnabled(self.feature_type)
64+
self.apply()
65+
66+
def update_controls(self):
67+
self.feature_model.set_domain(None)
68+
if self.data:
69+
self.feature_model.set_domain(self.data.domain)
70+
if len(self.feature_model):
71+
_names = [m.name for m in self.data.domain.metas if m.is_string]
72+
self.feature_names_column = _names[0]
73+
self.feature_radio.buttons[1].setEnabled(len(self.feature_model))
74+
self.feature_type = int(bool(len(self.feature_model)))
75+
76+
def apply(self):
77+
self.clear_messages()
78+
transposed = None
79+
if self.data:
80+
options = dict()
81+
if self.feature_type:
82+
options["feature_names_column"] = self.feature_names_column
83+
84+
try:
85+
transposed = Table.transpose(self.data, **options)
86+
except ValueError as e:
87+
self.Error.value_error(e)
88+
self.send("Data", transposed)
89+
90+
def send_report(self):
91+
text = "from meta attribute: {}".format(self.feature_names_column) \
92+
if self.feature_type else "generic"
93+
self.report_items("", [("Feature names", text)])
94+
if self.data:
95+
self.report_data("Data", self.data)
96+
97+
98+
if __name__ == "__main__":
99+
from AnyQt.QtWidgets import QApplication
100+
101+
app = QApplication([])
102+
ow = OWTranspose()
103+
d = Table("zoo")
104+
ow.set_data(d)
105+
ow.show()
106+
app.exec_()
107+
ow.saveSettings()

0 commit comments

Comments
 (0)