diff --git a/chainladder/core/correlation.py b/chainladder/core/correlation.py index b00b21b4..dfa88981 100644 --- a/chainladder/core/correlation.py +++ b/chainladder/core/correlation.py @@ -324,10 +324,14 @@ def p_z_lower(z: int, n: int, p: float = 0.5) -> float: T = np.array(T) z_idx, n_idx = z.astype(int), n.astype(int) self.probs = T[z_idx, n_idx] - z_critical = triangle[triangle.valuation > triangle.valuation.min()] - # z_critical = z_critical[z_critical.development > z_critical.development.min()].dev_to_val().sum( - # "origin") * 0 - z_critical = z_critical.dev_to_val().dropna().sum("origin") * 0 + # One column per link-ratio diagonal, labeled by ending valuation. + # Slicing by valuation (rather than dropna) keeps diagonals that are + # entirely NaN, which a triangle missing its earliest diagonals has: + # dropna() removed them while self.probs still carried one entry per + # diagonal, so the two disagreed and the DataFrame below raised + # "Shape of passed values is (1, 10), indices imply (1, 9)" (#320). + z_critical = triangle.dev_to_val().sum("origin") + z_critical = z_critical[z_critical.valuation > triangle.valuation.min()] * 0 z_critical.values = np.array(self.probs) < p_critical z_critical.odims = triangle.odims[0:1] self.z_critical = z_critical diff --git a/chainladder/core/tests/test_correlation.py b/chainladder/core/tests/test_correlation.py index fba8d628..48430089 100644 --- a/chainladder/core/tests/test_correlation.py +++ b/chainladder/core/tests/test_correlation.py @@ -23,3 +23,13 @@ def test_dev_corr(raa: Triangle) -> None: def test_validate_critical(raa: Triangle) -> None: with pytest.raises(ValueError): raa.valuation_correlation(p_critical=1.5, total=True) + + +def test_val_corr_incomplete_triangle(xyz: Triangle) -> None: + # GH #320: a triangle missing its earliest diagonals raised + # "Shape of passed values is (1, 10), indices imply (1, 9)" on repr, + # because z_critical dropped all-NaN diagonals while its values kept + # one entry per link-ratio diagonal. + z_critical = xyz["Paid"].valuation_correlation(p_critical=0.1, total=False).z_critical + assert z_critical.values.shape[-1] == len(z_critical.ddims) + assert repr(z_critical)