Skip to content

Commit 8576ec1

Browse files
committed
OWTranspose: Add a new widget
1 parent d45f507 commit 8576ec1

File tree

3 files changed

+404
-0
lines changed

3 files changed

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

Orange/widgets/data/owtranspose.py

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
from AnyQt.QtCore import Qt
2+
3+
from Orange.data import Table, StringVariable
4+
from Orange.widgets.settings import (Setting, ContextSetting,
5+
DomainContextHandler)
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 = DomainContextHandler(metas_in_res=True)
24+
feature_type = ContextSetting(0)
25+
feature_names_column = ContextSetting(None)
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.apply,
39+
btnLabels=["Generic", "From meta attribute:"])
40+
41+
self.feature_model = DomainModel(
42+
order=DomainModel.METAS, valid_types=StringVariable,
43+
alphabetical=True)
44+
self.feature_combo = gui.comboBox(
45+
gui.indentedBox(
46+
box, gui.checkButtonOffsetHint(self.feature_radio.buttons[0])),
47+
self, "feature_names_column", callback=self._feature_combo_changed,
48+
model=self.feature_model, sendSelectedValue=True,
49+
labelWidth=100, contentsLength=12, orientation=Qt.Horizontal)
50+
51+
self.apply_button = gui.auto_commit(
52+
self.controlArea, self, "auto_apply", "&Apply",
53+
box=False, commit=self.apply)
54+
55+
def _feature_combo_changed(self):
56+
self.feature_type = 1
57+
self.apply()
58+
59+
def set_data(self, data):
60+
self.closeContext()
61+
self.data = data
62+
self.update_controls()
63+
self.openContext(data)
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+
enabled = bool(len(self.feature_model))
74+
self.feature_radio.buttons[1].setEnabled(enabled)
75+
self.feature_combo.setEnabled(enabled)
76+
self.feature_type = int(enabled)
77+
78+
def apply(self):
79+
self.clear_messages()
80+
transposed = None
81+
if self.data:
82+
options = dict()
83+
if self.feature_type:
84+
options["feature_names_column"] = self.feature_names_column
85+
try:
86+
transposed = Table.transpose(self.data, **options)
87+
except ValueError as e:
88+
self.Error.value_error(e)
89+
self.send("Data", transposed)
90+
91+
def send_report(self):
92+
text = "from meta attribute: {}".format(self.feature_names_column) \
93+
if self.feature_type else "generic"
94+
self.report_items("", [("Feature names", text)])
95+
if self.data:
96+
self.report_data("Data", self.data)
97+
98+
99+
if __name__ == "__main__":
100+
from AnyQt.QtWidgets import QApplication
101+
102+
app = QApplication([])
103+
ow = OWTranspose()
104+
d = Table("zoo")
105+
ow.set_data(d)
106+
ow.show()
107+
app.exec_()
108+
ow.saveSettings()

0 commit comments

Comments
 (0)