From fc9135d0d12d2880a04d26165a801a075f7936d9 Mon Sep 17 00:00:00 2001 From: connor dietrich Date: Mon, 6 Jan 2025 07:57:00 -0800 Subject: [PATCH 1/2] add additional berquist sherman test --- .../adjustments/tests/test_berqsherm.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/chainladder/adjustments/tests/test_berqsherm.py b/chainladder/adjustments/tests/test_berqsherm.py index 28374fe6..e42bd6c9 100644 --- a/chainladder/adjustments/tests/test_berqsherm.py +++ b/chainladder/adjustments/tests/test_berqsherm.py @@ -17,3 +17,27 @@ def test_preserve_diagonal(): == 0 ) assert berq_triangle != triangle + +def test_adjusted_values(): + triangle = cl.load_sample("berqsherm").loc["MedMal"] + xp = triangle.get_array_module() + berq = cl.BerquistSherman( + paid_amount="Paid", + incurred_amount="Incurred", + reported_count="Reported", + closed_count="Closed", + trend=0.15, + ) + berq_triangle = berq.fit_transform(triangle) + + assert np.allclose( + triangle["Reported"].values, berq_triangle["Reported"].values, equal_nan=True + ) + + # Ensure that the incurred, paid, and closed count columns are as expected + berq_triangle.values[np.isnan(berq_triangle.values)] = 0 + assert np.isclose( + berq_triangle["Incurred"].values.sum(), 1126985253.661, atol=1e-2 + ) + assert np.isclose(berq_triangle["Paid"].values.sum(), 182046766.054, atol=1e-2) + assert np.isclose(berq_triangle["Closed"].values.sum(), 8798.982, atol=1e-2) \ No newline at end of file From d0cc331508c0d9fa0af36860299213f5e697ece8 Mon Sep 17 00:00:00 2001 From: connor dietrich Date: Mon, 6 Jan 2025 07:57:39 -0800 Subject: [PATCH 2/2] #537 --- chainladder/adjustments/berqsherm.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/chainladder/adjustments/berqsherm.py b/chainladder/adjustments/berqsherm.py index 031d1d64..2ce1598a 100644 --- a/chainladder/adjustments/berqsherm.py +++ b/chainladder/adjustments/berqsherm.py @@ -140,6 +140,12 @@ def fit(self, X, y=None, sample_weight=None): ) - 1 ) + + # Don't allow lookup values beyond the final value. + n = min(lookup.shape[-1], lookup.shape[-2]) + for j in range(n - 1): + lookup[:, :, j, :] = np.clip(lookup[:, :, j, :], 0, n - j - 2) + a = ( xp.concatenate( [