Skip to content

Commit 029071f

Browse files
committed
Discrete variable: remove ordered attribute
1 parent afa99a2 commit 029071f

19 files changed

+81
-148
lines changed

Orange/data/io_base.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -288,8 +288,7 @@ def _disc_with_vals_column(data: np.ndarray, col: int,
288288
values="", **_) -> _ColumnProperties:
289289
vals, coltype = _TableBuilder._disc_column(data, col)
290290
return _ColumnProperties(valuemap=Flags.split(values), values=vals,
291-
coltype=coltype, orig_values=vals,
292-
coltype_kwargs={"ordered": True})
291+
coltype=coltype, orig_values=vals)
293292

294293
@staticmethod
295294
def _unknown_column(data: np.ndarray, col: int, **_) -> _ColumnProperties:
@@ -607,8 +606,12 @@ def _vartype(var):
607606
if var.is_continuous or var.is_string:
608607
return var.TYPE_HEADERS[0]
609608
elif var.is_discrete:
610-
return Flags.join(var.values) if var.ordered else \
611-
var.TYPE_HEADERS[0]
609+
# if number of values is 1 order is not important if more
610+
# values write order in file
611+
return (
612+
Flags.join(var.values) if len(var.values) >= 2
613+
else var.TYPE_HEADERS[0]
614+
)
612615
raise NotImplementedError
613616

614617
return ['continuous'] * data.has_weights() + \

Orange/data/pandas_compat.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,9 @@ def _column_to_series(col, vals):
9797
result = ()
9898
if col.is_discrete:
9999
codes = pd.Series(vals).fillna(-1).astype(int)
100-
result = (col.name, pd.Categorical.from_codes(codes=codes, categories=col.values,
101-
ordered=col.ordered))
100+
result = (col.name, pd.Categorical.from_codes(
101+
codes=codes, categories=col.values, ordered=True
102+
))
102103
elif col.is_time:
103104
result = (col.name, pd.to_datetime(vals, unit='s').to_series().reset_index()[0])
104105
elif col.is_continuous:

Orange/data/tests/test_io_base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ def test_column_parts_discrete_values(self):
128128
np.testing.assert_array_equal(column.orig_values,
129129
["red", "red", "green"])
130130
self.assertEqual(column.coltype, DiscreteVariable)
131-
self.assertDictEqual(column.coltype_kwargs, {'ordered': True})
131+
self.assertDictEqual(column.coltype_kwargs, {})
132132

133133
def test_unknown_type_column(self):
134134
data = np.array(self.header0)

Orange/data/tests/test_variable.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -252,21 +252,17 @@ def test_val_from_str_add(self):
252252
self.assertEqual(var.val_from_str_add("F"), 0)
253253
self.assertEqual(var.val_from_str_add("N"), 2)
254254

255-
256255
def test_repr(self):
257256
var = DiscreteVariable.make("a", values=("F", "M"))
258257
self.assertEqual(
259258
repr(var),
260259
"DiscreteVariable(name='a', values=('F', 'M'))")
261-
var.ordered = True
262-
self.assertEqual(
263-
repr(var),
264-
"DiscreteVariable(name='a', values=('F', 'M'), ordered=True)")
265260

266261
var = DiscreteVariable.make("a", values="1234567")
267262
self.assertEqual(
268263
repr(var),
269-
"DiscreteVariable(name='a', values=('1', '2', '3', '4', '5', '6', '7'))")
264+
"DiscreteVariable(name='a', values=('1', '2', '3', '4', '5', '6', '7'))"
265+
)
270266

271267
def test_no_nonstringvalues(self):
272268
self.assertRaises(TypeError, DiscreteVariable, "foo", values=("a", 42))
@@ -467,7 +463,6 @@ def varcls_modified(self, name):
467463
var = super().varcls_modified(name)
468464
var.add_value("A")
469465
var.add_value("B")
470-
var.ordered = True
471466
return var
472467

473468
def test_copy_checks_len_values(self):
@@ -487,6 +482,13 @@ def test_copy_checks_len_values(self):
487482
var2 = var.copy(values=("W", "M"))
488483
self.assertEqual(var2.values, ("W", "M"))
489484

485+
def test_remove_ordered(self):
486+
"""
487+
ordered is deprecated when this test starts to fail remove ordered
488+
parameter. Remove also this test.
489+
"""
490+
self.assertLess(Orange.__version__, "3.28.0")
491+
490492

491493
@variabletest(ContinuousVariable)
492494
class TestContinuousVariable(VariableTest):
@@ -676,10 +678,7 @@ def varcls_modified(self, name):
676678
"PickleDiscreteVariable",
677679
("with_name", lambda: DiscreteVariable(name="Feature 0")),
678680
("with_str_value", lambda: DiscreteVariable(name="Feature 0",
679-
values=("F", "M"))),
680-
("ordered", lambda: DiscreteVariable(name="Feature 0",
681-
values=("F", "M"),
682-
ordered=True)),
681+
values=("F", "M")))
683682
)
684683

685684

@@ -691,7 +690,7 @@ def varcls_modified(self, name):
691690

692691
class VariableTestMakeProxy(unittest.TestCase):
693692
def test_make_proxy_disc(self):
694-
abc = DiscreteVariable("abc", values="abc", ordered=True)
693+
abc = DiscreteVariable("abc", values="abc")
695694
abc1 = abc.make_proxy()
696695
abc2 = abc1.make_proxy()
697696
self.assertEqual(abc, abc1)
@@ -700,7 +699,7 @@ def test_make_proxy_disc(self):
700699
self.assertEqual(hash(abc), hash(abc1))
701700
self.assertEqual(hash(abc1), hash(abc2))
702701

703-
abcx = DiscreteVariable("abc", values="abc", ordered=True)
702+
abcx = DiscreteVariable("abc", values="abc")
704703
self.assertEqual(abc, abcx)
705704
self.assertIsNot(abc, abcx)
706705

Orange/data/variable.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -632,21 +632,16 @@ class DiscreteVariable(Variable):
632632
.. attribute:: values
633633
634634
A list of variable's values.
635-
636-
.. attribute:: ordered
637-
638-
Some algorithms (and, in particular, visualizations) may
639-
sometime reorder the values of the variable, e.g. alphabetically.
640-
This flag hints that the given order of values is "natural"
641-
(e.g. "small", "middle", "large") and should not be changed.
642635
"""
643636

644637
TYPE_HEADERS = ('discrete', 'd', 'categorical')
645638

646639
presorted_values = []
647640

648-
def __init__(self, name="", values=(), ordered=False, compute_value=None,
649-
*, sparse=False):
641+
def __init__(
642+
self, name="", values=(), compute_value=None, sparse=False,
643+
**kwargs
644+
):
650645
""" Construct a discrete variable descriptor with the given values. """
651646
values = TupleList(values) # some people (including me) pass a generator
652647
if not all(isinstance(value, str) for value in values):
@@ -655,7 +650,13 @@ def __init__(self, name="", values=(), ordered=False, compute_value=None,
655650
super().__init__(name, compute_value, sparse=sparse)
656651
self._values = values
657652
self._value_index = {value: i for i, value in enumerate(values)}
658-
self.ordered = ordered
653+
654+
if "ordered" in kwargs:
655+
warnings.warn(
656+
"ordered is deprecated and does not have effect. It will be "
657+
"removed in future version.",
658+
OrangeDeprecationWarning
659+
)
659660

660661
@property
661662
def values(self):
@@ -822,17 +823,19 @@ def __reduce__(self):
822823
raise PickleError("Variables without names cannot be pickled")
823824
__dict__ = dict(self.__dict__)
824825
__dict__.pop("_values")
825-
return make_variable, (self.__class__, self._compute_value, self.name,
826-
self.values, self.ordered), \
826+
return (
827+
make_variable,
828+
(self.__class__, self._compute_value, self.name, self.values),
827829
__dict__
830+
)
828831

829832
def copy(self, compute_value=None, *, name=None, values=None, **_):
830833
# pylint: disable=arguments-differ
831834
if values is not None and len(values) != len(self.values):
832835
raise ValueError(
833836
"number of values must match the number of original values")
834837
return super().copy(compute_value=compute_value, name=name,
835-
values=values or self.values, ordered=self.ordered)
838+
values=values or self.values)
836839

837840

838841
class StringVariable(Variable):

Orange/preprocess/remove.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,6 @@ def merge_transforms(exp):
169169
new_var = DiscreteVariable(
170170
exp.var.name,
171171
values=exp.var.values,
172-
ordered=exp.var.ordered,
173172
compute_value=merge_lookup(A, B),
174173
sparse=exp.var.sparse,
175174
)

Orange/statistics/distribution.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,12 +217,10 @@ def sample(self, size=None, replace=True):
217217
return data.Value(self.variable, value_indices)
218218

219219
def min(self):
220-
if self.variable.ordered:
221-
return self.variable.values[0]
220+
return None
222221

223222
def max(self):
224-
if self.variable.ordered:
225-
return self.variable.values[-1]
223+
return None
226224

227225
def sum(self, *args, **kwargs):
228226
res = super().sum(*args, **kwargs)

Orange/tests/test_distribution.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def setUp(self):
3232
data.Domain(
3333
attributes=[
3434
data.DiscreteVariable('rgb', values=('r', 'g', 'b', 'a')),
35-
data.DiscreteVariable('num', values=('1', '2', '3'), ordered=True),
35+
data.DiscreteVariable('num', values=('1', '2', '3')),
3636
]
3737
),
3838
X=np.array([
@@ -201,8 +201,8 @@ def test_min_max(self):
201201
self.assertEqual(self.rgb.min(), None)
202202
self.assertEqual(self.rgb.max(), None)
203203
# Min and max should work for ordinal variables
204-
self.assertEqual(self.num.min(), '1')
205-
self.assertEqual(self.num.max(), '3')
204+
self.assertEqual(self.num.min(), None)
205+
self.assertEqual(self.num.max(), None)
206206

207207
def test_array_with_unknowns(self):
208208
d = data.Table("zoo")

Orange/tests/test_filter.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,8 @@ def test_reprs(self):
444444
flid = IsDefined(negate=True)
445445
flhc = HasClass()
446446
flr = Random()
447-
fld = FilterDiscrete(self.attr_disc, None)
447+
fld = \
448+
(self.attr_disc, None)
448449
flsv = SameValue(self.attr_disc, self.value_disc, negate=True)
449450
flc = FilterContinuous(self.vs[0], FilterContinuous.Less, 5)
450451
flc2 = FilterContinuous(self.vs[1], FilterContinuous.Greater, 3)

Orange/tests/test_io.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,3 +196,7 @@ def test_pickle_version(self):
196196
self.assertGreaterEqual(PICKLE_PROTOCOL, pickle.DEFAULT_PROTOCOL)
197197
# we should not use a version that is not supported
198198
self.assertLessEqual(PICKLE_PROTOCOL, pickle.HIGHEST_PROTOCOL)
199+
200+
201+
if __name__ == "__main__":
202+
unittest.main()

0 commit comments

Comments
 (0)