Skip to content

Commit 4174f2c

Browse files
authored
Merge pull request #3555 from PrimozGodec/neighbours-domains
Fix: Neighbours: Compare tables with domains that only differ in metas and class_var
2 parents 69f30a9 + e1e5bea commit 4174f2c

File tree

2 files changed

+67
-3
lines changed

2 files changed

+67
-3
lines changed

Orange/widgets/data/owneighbors.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class Warning(OWWidget.Warning):
4444
Msg("Every data instance is same as some reference")
4545

4646
class Error(OWWidget.Error):
47-
diff_domains = Msg("Data and reference have different domains.")
47+
diff_domains = Msg("Data and reference have different features")
4848

4949
n_neighbors = Setting(10)
5050
distance_index = Setting(0)
@@ -115,14 +115,21 @@ def compute_distances(self):
115115
or self.reference is None or len(self.reference) == 0:
116116
self.distances = None
117117
return
118-
if self.reference.domain != self.data.domain:
118+
if set(self.reference.domain.attributes) != \
119+
set(self.data.domain.attributes):
119120
self.Error.diff_domains()
120121
self.distances = None
121122
return
122123

123124
distance = METRICS[self.distance_index][1]
124125
n_ref = len(self.reference)
125-
all_data = Table.concatenate([self.reference, self.data], 0)
126+
127+
# comparing only attributes, no metas and class-vars
128+
new_domain = Domain(self.data.domain.attributes)
129+
reference = self.reference.transform(new_domain)
130+
data = self.data.transform(new_domain)
131+
132+
all_data = Table.concatenate([reference, data], 0)
126133
pp_all_data = Impute()(RemoveNaNColumns()(all_data))
127134
pp_reference, pp_data = pp_all_data[:n_ref], pp_all_data[n_ref:]
128135
self.distances = distance(pp_data, pp_reference).min(axis=1)

Orange/widgets/data/tests/test_owneighbors.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,63 @@ def test_different_domains(self):
396396
self.send_signal(w.Inputs.reference, None)
397397
self.assertFalse(w.Error.diff_domains.is_shown())
398398

399+
def test_different_metas(self):
400+
"""
401+
Test weather widget do not show error when data and a reference have
402+
domain that differ only in metas
403+
"""
404+
w = self.widget
405+
406+
domain = Domain([ContinuousVariable("a"), ContinuousVariable("b")],
407+
metas=[ContinuousVariable("c")])
408+
data = Table(
409+
domain, np.random.rand(2, len(domain.attributes)),
410+
metas=np.random.rand(2, len(domain.metas)))
411+
412+
# same domain with same metas no error
413+
self.send_signal(w.Inputs.data, data)
414+
self.send_signal(w.Inputs.reference, data[:1])
415+
self.assertFalse(w.Error.diff_domains.is_shown())
416+
417+
# same domain with different metas no error
418+
domain_ref = Domain(domain.attributes,
419+
metas=[ContinuousVariable("d")])
420+
reference = Table(
421+
domain_ref, np.random.rand(1, len(domain_ref.attributes)),
422+
metas=np.random.rand(1, len(domain.metas)))
423+
self.send_signal(w.Inputs.data, data)
424+
self.send_signal(w.Inputs.reference, reference)
425+
self.assertFalse(w.Error.diff_domains.is_shown())
426+
427+
# same domain with different order - no error
428+
domain_ref = Domain(domain.attributes[::-1])
429+
reference = Table(
430+
domain_ref, np.random.rand(1, len(domain_ref.attributes)))
431+
self.send_signal(w.Inputs.data, data)
432+
self.send_signal(w.Inputs.reference, reference)
433+
self.assertFalse(w.Error.diff_domains.is_shown())
434+
435+
# same domain with different number of metas no error
436+
domain_ref = Domain(
437+
domain.attributes,
438+
metas=[ContinuousVariable("d"), ContinuousVariable("e")])
439+
reference = Table(
440+
domain_ref, np.random.rand(1, len(domain_ref.attributes)),
441+
metas=np.random.rand(1, len(domain_ref.metas)))
442+
self.send_signal(w.Inputs.data, data)
443+
self.send_signal(w.Inputs.reference, reference)
444+
self.assertFalse(w.Error.diff_domains.is_shown())
445+
446+
# different domain with same metas - error shown
447+
domain_ref = Domain(domain.attributes + (ContinuousVariable("e"),),
448+
metas=[ContinuousVariable("c")])
449+
reference = Table(
450+
domain_ref, np.random.rand(1, len(domain_ref.attributes)),
451+
metas=np.random.rand(1, len(domain_ref.metas)))
452+
self.send_signal(w.Inputs.data, data)
453+
self.send_signal(w.Inputs.reference, reference)
454+
self.assertTrue(w.Error.diff_domains.is_shown())
455+
399456

400457
if __name__ == "__main__":
401458
unittest.main()

0 commit comments

Comments
 (0)