Skip to content

Commit

Permalink
Merge pull request #5527 from VesnaT/fix_pivot
Browse files Browse the repository at this point in the history
[FIX] Pivot: Handle empty data, metas only
  • Loading branch information
ajdapretnar authored Jul 15, 2021
2 parents 543f271 + 646b4a2 commit a780239
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 7 deletions.
31 changes: 24 additions & 7 deletions Orange/widgets/data/owpivot.py
Original file line number Diff line number Diff line change
Expand Up @@ -744,6 +744,7 @@ class Warning(OWWidget.Warning):
renamed_vars = Msg("Some variables have been renamed in some tables"
"to avoid duplicates.\n{}")
too_many_values = Msg("Selected variable has too many values.")
no_variables = Msg("At least 1 primitive variable is required.")

settingsHandler = DomainContextHandler()
row_feature = ContextSetting(None)
Expand Down Expand Up @@ -854,20 +855,29 @@ def no_col_feature(self):
def skipped_aggs(self):
def add(fun):
data, var = self.data, self.val_feature
primitive_funcs = Pivot.ContVarFunctions + Pivot.DiscVarFunctions
return data and not var and fun not in Pivot.AutonomousFunctions \
or var and var.is_discrete and fun in Pivot.ContVarFunctions \
or var and var.is_continuous and fun in Pivot.DiscVarFunctions
or var and var.is_continuous and fun in Pivot.DiscVarFunctions \
or var and not var.is_primitive() and fun in primitive_funcs
skipped = [str(fun) for fun in self.sel_agg_functions if add(fun)]
return ", ".join(sorted(skipped))

@property
def data_has_primitives(self):
if not self.data:
return False
domain = self.data.domain
return any(v.is_primitive() for v in domain.variables + domain.metas)

def __feature_changed(self):
self.selection = set()
self.pivot = None
self.commit()

def __val_feature_changed(self):
self.selection = set()
if self.no_col_feature:
if self.no_col_feature or not self.pivot:
return
self.pivot.update_pivot_table(self.val_feature)
self.commit()
Expand Down Expand Up @@ -896,7 +906,8 @@ def set_data(self, data):
self.pivot = None
self.check_data()
self.init_attr_values()
self.openContext(self.data)
if self.data_has_primitives:
self.openContext(self.data)
self.unconditional_commit()

def check_data(self):
Expand All @@ -912,8 +923,8 @@ def init_attr_values(self):
self.row_feature = model[0]
model = self.controls.val_feature.model()
if model and len(model) > 2:
self.val_feature = domain.variables[0] \
if domain.variables[0] in model else model[2]
allvars = domain.variables + domain.metas
self.val_feature = allvars[0] if allvars[0] in model else model[2]

def commit(self):
def send_outputs(pivot_table, filtered_data, grouped_data):
Expand All @@ -933,9 +944,16 @@ def send_outputs(pivot_table, filtered_data, grouped_data):
self.Warning.cannot_aggregate.clear()
self.Warning.no_col_feature.clear()

self.table_view.clear()

if self.pivot is None:
if self.data:
if not self.data_has_primitives:
self.Warning.no_variables()
send_outputs(None, None, None)
return

if self.no_col_feature:
self.table_view.clear()
self.Warning.no_col_feature()
send_outputs(None, None, None)
return
Expand Down Expand Up @@ -965,7 +983,6 @@ def send_outputs(pivot_table, filtered_data, grouped_data):
self.Warning.renamed_vars(self.pivot.renamed)

def _update_graph(self):
self.table_view.clear()
if self.pivot.pivot_table:
col_feature = self.col_feature or self.row_feature
self.table_view.update_table(col_feature.name,
Expand Down
26 changes: 26 additions & 0 deletions Orange/widgets/data/tests/test_owpivot.py
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,32 @@ def test_table_values(self):
self.assertEqual(model.data(model.index(4, 4)), "114.0")
self.assertEqual(model.data(model.index(5, 4)), "reversable defect")

def test_only_metas_table(self):
self.send_signal(self.widget.Inputs.data, self.zoo[:, 17:])
self.assertTrue(self.widget.Warning.no_variables.is_shown())

data = self.zoo.transform(Domain([], metas=self.zoo.domain.attributes))
self.send_signal(self.widget.Inputs.data, data)
self.assertFalse(self.widget.Warning.no_variables.is_shown())

def test_empty_table(self):
data = self.heart_disease[:, :0]
self.send_signal(self.widget.Inputs.data, data)
self.assertTrue(self.widget.Warning.no_variables.is_shown())
self.send_signal(self.widget.Inputs.data, None)
self.assertFalse(self.widget.Warning.no_variables.is_shown())

data = self.heart_disease
self.send_signal(self.widget.Inputs.data, data)

zoo_domain = self.zoo.domain
data = self.zoo.transform(Domain([], metas=zoo_domain.metas))
self.send_signal(self.widget.Inputs.data, data)

domain = Domain([], zoo_domain.class_vars, metas=zoo_domain.metas)
data = self.zoo.transform(domain)
self.send_signal(self.widget.Inputs.data, data)


class TestAggregationFunctionsEnum(unittest.TestCase):
def test_pickle(self):
Expand Down

0 comments on commit a780239

Please sign in to comment.