@@ -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"1 { 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