Skip to content

Commit 30a33ab

Browse files
authored
Merge pull request #3458 from VesnaT/fix_rank
[FIX] Rank: Fix crash on dataset with missing values
2 parents 8e166fb + fbc0494 commit 30a33ab

File tree

3 files changed

+23
-3
lines changed

3 files changed

+23
-3
lines changed

Orange/preprocess/fss.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import Orange
99
from Orange.util import Reprable
1010
from Orange.preprocess.preprocess import Preprocess
11-
from Orange.preprocess.score import ANOVA, GainRatio, UnivariateLinearRegression
1211

1312
__all__ = ["SelectBestFeatures", "RemoveNaNColumns", "SelectRandomFeatures"]
1413

@@ -57,6 +56,10 @@ def __call__(self, data):
5756
discr_ratio = (sum(a.is_discrete
5857
for a in data.domain.attributes)
5958
/ len(data.domain.attributes))
59+
60+
from Orange.preprocess.score import ANOVA, GainRatio, \
61+
UnivariateLinearRegression
62+
6063
if data.domain.has_discrete_class:
6164
if discr_ratio >= 0.5:
6265
method = GainRatio()

Orange/preprocess/score.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from Orange.data import Domain, Variable, DiscreteVariable, ContinuousVariable
99
from Orange.data.filter import HasClass
1010
from Orange.misc.wrapper_meta import WrapperMeta
11+
from Orange.preprocess.fss import RemoveNaNColumns
1112
from Orange.preprocess.preprocess import Discretize, SklImpute
1213
from Orange.preprocess.util import _RefuseDataInConstructor
1314
from Orange.statistics import contingency, distribution
@@ -66,6 +67,7 @@ def __call__(self, data, feature=None):
6667
f = data.domain[feature]
6768
data = data.transform(Domain([f], data.domain.class_vars))
6869

70+
orig_domain = data.domain
6971
for pp in self.preprocessors:
7072
data = pp(data)
7173

@@ -76,7 +78,14 @@ def __call__(self, data, feature=None):
7678
.format(self.friendly_name,
7779
self._friendly_vartype_name(type(var))))
7880

79-
return self.score_data(data, feature)
81+
if feature is not None:
82+
return self.score_data(data, feature)
83+
84+
scores = np.full(len(orig_domain.attributes), np.nan)
85+
names = [a.name for a in data.domain.attributes]
86+
mask = np.array([a.name in names for a in orig_domain.attributes])
87+
scores[mask] = self.score_data(data, feature)
88+
return scores
8089

8190
def score_data(self, data, feature):
8291
raise NotImplementedError
@@ -340,6 +349,7 @@ class ReliefF(Scorer):
340349
class_type = DiscreteVariable
341350
supports_sparse_data = False
342351
friendly_name = "ReliefF"
352+
preprocessors = Scorer.preprocessors + [RemoveNaNColumns()]
343353

344354
def __init__(self, n_iterations=50, k_nearest=10, random_state=None):
345355
self.n_iterations = n_iterations
@@ -374,6 +384,7 @@ class RReliefF(Scorer):
374384
class_type = ContinuousVariable
375385
supports_sparse_data = False
376386
friendly_name = "RReliefF"
387+
preprocessors = Scorer.preprocessors + [RemoveNaNColumns()]
377388

378389
def __init__(self, n_iterations=50, k_nearest=50, random_state=None):
379390
self.n_iterations = n_iterations

Orange/widgets/data/tests/test_owrank.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from Orange.regression import LinearRegressionLearner
1111
from Orange.projection import PCA
1212
from Orange.widgets.data.owrank import OWRank, ProblemType, CLS_SCORES, REG_SCORES
13-
from Orange.widgets.tests.base import WidgetTest
13+
from Orange.widgets.tests.base import WidgetTest, datasets
1414
from Orange.widgets.widget import AttributeList
1515

1616

@@ -347,3 +347,9 @@ def test_no_attributes(self):
347347
self.assertTrue(self.widget.Error.no_attributes.is_shown())
348348
self.send_signal(self.widget.Inputs.data, data)
349349
self.assertFalse(self.widget.Error.no_attributes.is_shown())
350+
351+
def test_dataset(self):
352+
for method in CLS_SCORES + REG_SCORES:
353+
self._get_checkbox(method.shortname).setChecked(True)
354+
for ds in datasets.datasets():
355+
self.send_signal(self.widget.Inputs.data, ds)

0 commit comments

Comments
 (0)