Skip to content

Commit 441777c

Browse files
Merge pull request #408 from Crunch-io/bug-on-scale-means-diff-188552693
Bug on scale means diff 188552693
2 parents 77fa191 + b602c0b commit 441777c

File tree

3 files changed

+39
-18
lines changed

3 files changed

+39
-18
lines changed

src/cr/cube/matrix/measure.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2906,15 +2906,22 @@ def is_defined(self):
29062906
@lazyproperty
29072907
def _proportions(self):
29082908
"""List of 2 ndarray matrixes of the relevant proportion blocks"""
2909+
count_blocks = self._second_order_measures.weighted_counts.blocks
29092910
if self.orientation == MO.ROWS:
29102911
# --- Use *row* proportions ---
2911-
props = self._second_order_measures.row_proportions.blocks
2912+
weighted_base_blocks = self._second_order_measures.row_weighted_bases.blocks
29122913
# --- Get base values & *row* subtotals
2913-
return [props[0][0], props[1][0]]
2914+
with np.errstate(divide="ignore", invalid="ignore"):
2915+
base_values = count_blocks[0][0] / weighted_base_blocks[0][0]
2916+
row_subtotals = count_blocks[1][0] / weighted_base_blocks[1][0]
2917+
return [base_values, row_subtotals]
29142918
# --- Use *column* proportions ---
2915-
props = self._second_order_measures.column_proportions.blocks
2916-
# --- Get base values & *column* subtotals
2917-
return [props[0][0], props[0][1]]
2919+
weighted_base_blocks = self._second_order_measures.column_weighted_bases.blocks
2920+
with np.errstate(divide="ignore", invalid="ignore"):
2921+
base_values = count_blocks[0][0] / weighted_base_blocks[0][0]
2922+
col_subtotals = count_blocks[0][1] / weighted_base_blocks[0][1]
2923+
# --- Get base values & *column* subtotals
2924+
return [base_values, col_subtotals]
29182925

29192926
@staticmethod
29202927
def _weighted_mean(proportions, values):

tests/integration/test_headers_and_subtotals.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2980,6 +2980,12 @@ def test_it_computes_diff_for_cat_x_cat_date_with_subdiffs_on_both(self):
29802980
nan_ok=True,
29812981
rel=1e-4,
29822982
)
2983+
assert slice_.columns_scale_mean == pytest.approx(
2984+
np.array(
2985+
[np.nan, 2.26559356, 2.43811395, 2.08453608, 1.9968254, 1.81967213]
2986+
),
2987+
nan_ok=True,
2988+
)
29832989

29842990
def test_it_computes_diff_for_cat_date_x_cat_with_subdiffs_on_both(self):
29852991
slice_ = Cube(
@@ -3083,6 +3089,10 @@ def test_it_computes_diff_for_cat_date_x_cat_with_subdiffs_on_both(self):
30833089
),
30843090
nan_ok=True,
30853091
)
3092+
assert slice_.rows_scale_mean == pytest.approx(
3093+
np.array([np.nan, 1.625, 1.4675835, 1.78818737, 1.68138801, 1.46994536]),
3094+
nan_ok=True,
3095+
)
30863096

30873097
def test_it_computes_diff_for_cat_date_x_cat_with_subdiffs_on_rows(self):
30883098
insertions = [

tests/unit/matrix/test_measure.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2758,30 +2758,34 @@ def test_it_can_tell_if_it_is_defined(self, request, values, expected):
27582758
assert mean.is_defined == expected
27592759

27602760
def test_it_gets_the_right_proportions_for_rows(self, request):
2761-
row_proportions_ = instance_mock(
2762-
request, _RowProportions, blocks=[["a", "b"], ["c", "d"]]
2763-
)
2764-
second_order_measures_ = instance_mock(
2765-
request, SecondOrderMeasures, row_proportions=row_proportions_
2761+
second_order_measures_ = instance_mock(request, SecondOrderMeasures)
2762+
counts_ = instance_mock(request, _WeightedCounts, blocks=[[1, 2], [3, 4]])
2763+
bases_ = instance_mock(
2764+
request,
2765+
_RowWeightedBases,
2766+
blocks=[[11, 12], [13, 14]],
27662767
)
2768+
second_order_measures_.weighted_counts = counts_
2769+
second_order_measures_.row_weighted_bases = bases_
27672770

27682771
mean = _ScaleMean(None, second_order_measures_, None, MO.ROWS)
27692772

2770-
assert mean._proportions == ["a", "c"]
2773+
assert mean._proportions == [0.09090909090909091, 0.23076923076923078]
27712774

27722775
def test_it_gets_the_right_counts_for_columns(self, request):
2773-
column_proportions_ = instance_mock(
2774-
request, _ColumnProportions, blocks=[["a", "b"], ["c", "d"]]
2775-
)
2776-
second_order_measures_ = instance_mock(
2776+
second_order_measures_ = instance_mock(request, SecondOrderMeasures)
2777+
counts_ = instance_mock(request, _WeightedCounts, blocks=[[1, 2], [3, 4]])
2778+
bases_ = instance_mock(
27772779
request,
2778-
SecondOrderMeasures,
2779-
column_proportions=column_proportions_,
2780+
_ColumnWeightedBases,
2781+
blocks=[[11, 12], [13, 14]],
27802782
)
2783+
second_order_measures_.weighted_counts = counts_
2784+
second_order_measures_.column_weighted_bases = bases_
27812785

27822786
mean = _ScaleMean(None, second_order_measures_, None, MO.COLUMNS)
27832787

2784-
assert mean._proportions == ["a", "b"]
2788+
assert mean._proportions == [0.09090909090909091, 0.16666666666666666]
27852789

27862790
@pytest.mark.parametrize(
27872791
"proportions, values, expected",

0 commit comments

Comments
 (0)