Skip to content

Commit 5392f74

Browse files
committed
[FIX] Test & Learn: do not crash on a data with class only nans
1 parent 64f585f commit 5392f74

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

Orange/widgets/evaluate/owtestlearners.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ class Error(OWWidget.Error):
206206
class_inconsistent = Msg("Test and train data sets "
207207
"have different target variables.")
208208
memory_error = Msg("Not enough memory.")
209+
no_class_values = Msg("Target variable has no values.")
209210
only_one_class_var_value = Msg("Target variable has only one value.")
210211

211212
class Warning(OWWidget.Warning):
@@ -356,16 +357,19 @@ def set_train_data(self, data):
356357
self.Error.train_data_empty.clear()
357358
self.Error.class_required.clear()
358359
self.Error.too_many_classes.clear()
360+
self.Error.no_class_values.clear()
359361
self.Error.only_one_class_var_value.clear()
360362
if data is not None and not len(data):
361363
self.Error.train_data_empty()
362364
data = None
363365
if data:
364366
conds = [not data.domain.class_vars,
365367
len(data.domain.class_vars) > 1,
368+
np.isnan(data.Y).all(),
366369
data.domain.has_discrete_class and len(data.domain.class_var.values) == 1]
367370
errors = [self.Error.class_required,
368371
self.Error.too_many_classes,
372+
self.Error.no_class_values,
369373
self.Error.only_one_class_var_value]
370374
for cond, error in zip(conds, errors):
371375
if cond:

Orange/widgets/evaluate/tests/test_owtestlearners.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,21 @@ def test_one_class_value(self):
195195
self.send_signal("Learner", MajorityLearner(), 0, wait=1000)
196196
self.assertTrue(self.widget.Error.only_one_class_var_value.is_shown())
197197

198+
def test_nan_class(self):
199+
"""
200+
Do not crash on a data with only nan class values.
201+
GH-2751
202+
"""
203+
def assertErrorShown(data, is_shown):
204+
self.send_signal("Data", data)
205+
self.assertEqual(is_shown, self.widget.Error.no_class_values.is_shown())
206+
207+
data = Table("iris")[::30]
208+
data.Y[:] = np.nan
209+
210+
for data, is_shown in zip([None, data, Table("iris")[:30]], [False, True, False]):
211+
assertErrorShown(data, is_shown)
212+
198213
def test_addon_scorers(self):
199214
try:
200215
class NewScore(Score):

0 commit comments

Comments
 (0)