From 2ea3c1de30b05e407bb45bb4818865edae558f64 Mon Sep 17 00:00:00 2001 From: Connor Dietrich <84365498+cdietrich215@users.noreply.github.com> Date: Tue, 14 Jan 2025 10:01:47 -0800 Subject: [PATCH] #537 (#546) * add additional berquist sherman test * #537 --------- Co-authored-by: connor dietrich --- chainladder/adjustments/berqsherm.py | 6 +++++ .../adjustments/tests/test_berqsherm.py | 24 +++++++++++++++++++ 2 files changed, 30 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( [ 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