Skip to content

Commit aebe793

Browse files
normalize: set number_of_decimals=3 when centering data
1 parent 4de95cb commit aebe793

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

Orange/data/variable.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,12 @@ def repr_val(self, val):
586586
and abs(round(val, self._number_of_decimals) - val) \
587587
> self._max_round_diff:
588588
return f"{val:.{self._number_of_decimals + 2}f}"
589+
590+
# Sometimes, -1e-16 will be rounded to 0, and displayed as -0.00. This
591+
# ensures that there are never negative signs in front of zeros
592+
if float(self._format_str % val) == 0:
593+
val = 0.0
594+
589595
return self._format_str % val
590596

591597
str_val = repr_val
@@ -602,6 +608,7 @@ def copy(self, compute_value=None, *, name=None, **kwargs):
602608
var._max_round_diff = self._max_round_diff
603609
var.adjust_decimals = self.adjust_decimals
604610
var.format_str = self._format_str
611+
605612
return var
606613

607614

Orange/preprocess/normalize.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import numpy as np
22

3-
from Orange.data import Domain
3+
from Orange.data import Domain, ContinuousVariable
44
from Orange.statistics import distribution
55
from Orange.util import Reprable
66
from .preprocess import Normalize
@@ -42,26 +42,30 @@ def normalize(self, dist, var):
4242
var = self.normalize_by_sd(dist, var)
4343
elif self.norm_type == Normalize.NormalizeBySpan:
4444
var = self.normalize_by_span(dist, var)
45-
var.number_of_decimals = None
4645
return var
4746

48-
def normalize_by_sd(self, dist, var):
47+
def normalize_by_sd(self, dist, var: ContinuousVariable) -> ContinuousVariable:
4948
avg, sd = (dist.mean(), dist.standard_deviation()) if dist.size else (0, 1)
5049
if sd == 0:
5150
sd = 1
5251
if self.center:
5352
compute_val = Norm(var, avg, 1 / sd)
53+
num_decimals = 3
5454
else:
5555
compute_val = Norm(var, 0, 1 / sd)
56-
return var.copy(compute_value=compute_val)
56+
num_decimals = None
57+
num_decimals += int(-np.floor(np.log10(sd)))
58+
return var.copy(compute_value=compute_val, number_of_decimals=num_decimals)
5759

58-
def normalize_by_span(self, dist, var):
60+
def normalize_by_span(self, dist, var: ContinuousVariable) -> ContinuousVariable:
5961
dma, dmi = (dist.max(), dist.min()) if dist.shape[1] else (np.nan, np.nan)
6062
diff = dma - dmi
6163
if diff < 1e-15:
6264
diff = 1
6365
if self.zero_based:
6466
compute_val = Norm(var, dmi, 1 / diff)
67+
num_decimals = 3
6568
else:
6669
compute_val = Norm(var, (dma + dmi) / 2, 2 / diff)
67-
return var.copy(compute_value=compute_val)
70+
num_decimals = None
71+
return var.copy(compute_value=compute_val, number_of_decimals=num_decimals)

0 commit comments

Comments
 (0)