Skip to content

Commit 8e1fea2

Browse files
committed
OWTable: Re-add info box
1 parent 89d49a6 commit 8e1fea2

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

Orange/widgets/data/owtable.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,8 @@ def __init__(self):
441441

442442
self.dist_color = QColor(*self.dist_color_RGB)
443443

444+
info_box = gui.vBox(self.controlArea, "Info")
445+
self.info_text = gui.widgetLabel(info_box)
444446
self._set_input_summary(None)
445447
self._set_output_summary(None)
446448
gui.separator(self.controlArea)
@@ -712,6 +714,67 @@ def format_summary(summary):
712714
details = format_summary_details(slot.table)
713715
self.info.set_input_summary(summary, details)
714716

717+
self.info_text.setText("\n".join(self._info_box_text(slot)))
718+
719+
@staticmethod
720+
def _info_box_text(slot):
721+
def format_part(part):
722+
if isinstance(part, DenseArray):
723+
if not part.nans:
724+
return ""
725+
perc = 100 * part.nans / (part.nans + part.non_nans)
726+
return f" ({perc:.1f} % missing data)"
727+
728+
if isinstance(part, SparseArray):
729+
tag = "sparse"
730+
elif isinstance(part, SparseBoolArray):
731+
tag = "tags"
732+
else: # isinstance(part, NotAvailable)
733+
return ""
734+
dens = 100 * part.non_nans / (part.nans + part.non_nans)
735+
return f" ({tag}, density {dens:.2f} %)"
736+
737+
def desc(n, part):
738+
if n == 0:
739+
return f"No {part}s"
740+
elif n == 1:
741+
return f"One {part}"
742+
else:
743+
return f"{n} {part}s"
744+
745+
if slot is None:
746+
return "No data."
747+
summary = slot.summary
748+
text = []
749+
if isinstance(summary, ApproxSummary):
750+
if summary.len.done():
751+
text.append(f"{summary.len.result()} instances")
752+
else:
753+
text.append(f"~{summary.approx_len} instances")
754+
elif isinstance(summary, Summary):
755+
text.append(f"{summary.len} instances")
756+
if sum(p.nans for p in [summary.X, summary.Y, summary.M]) == 0:
757+
text[-1] += " (no missing data)"
758+
759+
text.append(desc(len(summary.domain.attributes), "feature")
760+
+ format_part(summary.X))
761+
762+
if not summary.domain.class_vars:
763+
text.append("No target variable.")
764+
else:
765+
if len(summary.domain.class_vars) > 1:
766+
c_text = desc(len(summary.domain.class_vars), "outcome")
767+
elif summary.domain.has_continuous_class:
768+
c_text = "Numeric outcome"
769+
else:
770+
c_text = "Target with " \
771+
+ desc(len(summary.domain.class_var.values), "value")
772+
text.append(c_text + format_part(summary.Y))
773+
774+
text.append(desc(len(summary.domain.metas), "meta attribute")
775+
+ format_part(summary.M))
776+
return text
777+
715778
def _set_output_summary(self, output):
716779
summary = len(output) if output else self.info.NoOutput
717780
details = format_summary_details(output) if output else ""

0 commit comments

Comments
 (0)