diff --git a/Orange/preprocess/impute.py b/Orange/preprocess/impute.py index ee9e4fc5009..d774247f21c 100644 --- a/Orange/preprocess/impute.py +++ b/Orange/preprocess/impute.py @@ -160,19 +160,20 @@ def __init__(self, variable, model): def __call__(self, data): if isinstance(data, Orange.data.Instance): - column = np.array([float(data[self.variable])]) - else: - column = np.array(data.get_column_view(self.variable)[0], - copy=True) + data = Orange.data.Table.from_list(data.domain, [data]) + domain = data.domain + column = np.array(data.get_column_view(self.variable)[0], copy=True) mask = np.isnan(column) if not np.any(mask): return column - if isinstance(data, Orange.data.Instance): - predicted = self.model(data) - else: - predicted = self.model(data[mask]) + if domain.class_vars: + # cannot have class var in domain (due to backmappers in model) + data = data.transform( + Orange.data.Domain(domain.attributes, None, domain.metas) + ) + predicted = self.model(data[mask]) column[mask] = predicted return column diff --git a/Orange/tests/test_impute.py b/Orange/tests/test_impute.py index 4dd6ff1d528..3b3ec9be3fa 100644 --- a/Orange/tests/test_impute.py +++ b/Orange/tests/test_impute.py @@ -229,9 +229,12 @@ def test_replacement(self): domain = data.Domain( (data.DiscreteVariable("A", values=("0", "1", "2")), data.ContinuousVariable("B"), - data.ContinuousVariable("C")) + data.ContinuousVariable("C")), + # the class is here to ensure the backmapper in model does not + # run and raise exception + data.DiscreteVariable("Z", values=("P", "M")) ) - table = data.Table.from_numpy(domain, np.array(X)) + table = data.Table.from_numpy(domain, np.array(X), [0,] * 3) v = impute.Model(MajorityLearner())(table, domain[0]) self.assertTrue(np.all(np.isfinite(v.compute_value(table))))