From 8dc70a6facadc6a76ee3145b50e50ce926601ff7 Mon Sep 17 00:00:00 2001 From: "henrydingliu@gmail.com" Date: Mon, 5 Jan 2026 07:35:16 +0000 Subject: [PATCH 1/3] adding another test for bz --- chainladder/development/tests/test_barnzehn.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/chainladder/development/tests/test_barnzehn.py b/chainladder/development/tests/test_barnzehn.py index 8ec0cbb6..43b6cc4a 100644 --- a/chainladder/development/tests/test_barnzehn.py +++ b/chainladder/development/tests/test_barnzehn.py @@ -26,6 +26,11 @@ def test_drops(): np.around(cl.BarnettZehnwirth(formula='C(development)',drop_valuation='1979').fit(abc).triangle_ml_.values,3) == np.around(cl.BarnettZehnwirth(formula='C(development)',drop = [('1977',36),('1978',24),('1979',12)]).fit(abc).triangle_ml_.values,3) ) + assert np.all( + np.around(cl.BarnettZehnwirth(formula='C(development)',drop_valuation='1979').fit(abc).ldf_.values,3) + == np.around(cl.BarnettZehnwirth(formula='C(development)',drop = [('1977',36),('1978',24),('1979',12)]).fit(abc).ldf_.values,3) + ) + def test_bz_2008(): ''' From 600c2b7481310b182fe7f0f5b9e3d24313109d3e Mon Sep 17 00:00:00 2001 From: "henrydingliu@gmail.com" Date: Sat, 24 Jan 2026 20:13:27 +0000 Subject: [PATCH 2/3] Pandas 3.0 setting pandas dependency to pre-3 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 23e11396..51b15b92 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,7 @@ classifiers = [ ] keywords = ["actuarial", "reserving", "insurance", "chainladder", "IBNR"] dependencies = [ - "pandas>=2.0", + "pandas>=2.0, <=2.3", "scikit-learn>1.4.2", "numba>0.54", "sparse>=0.9", From 67f95ded16d853ab0bbda57f270d4fc16d1c0b2d Mon Sep 17 00:00:00 2001 From: "henrydingliu@gmail.com" Date: Fri, 30 Jan 2026 06:40:51 +0000 Subject: [PATCH 3/3] adding fillzero --- chainladder/core/pandas.py | 20 ++++++++++++++++++++ chainladder/core/tests/test_triangle.py | 6 ++++++ 2 files changed, 26 insertions(+) diff --git a/chainladder/core/pandas.py b/chainladder/core/pandas.py index 50179246..9d51741c 100644 --- a/chainladder/core/pandas.py +++ b/chainladder/core/pandas.py @@ -269,6 +269,26 @@ def fillna(self, value=None, inplace=False): new_obj = self.copy() return new_obj.fillna(value=value, inplace=True) + def fillzero(self, inplace=False): + """Fill nan with 0 by axis. separate function from fillna() because fillna(0) isn't working + Parameters + ---------- + inplace: boolean, default = False + Whether to modify the triangle object directly (True), or + return a new modified triangle (False). + + Returns + ------- + Triangle + """ + if inplace: + xp = self.get_array_module() + self.values = np.where((xp.nan_to_num(self.values) == 0) * (self.nan_triangle == 1), self.nan_triangle * 0, self.values) + return self + else: + new_obj = self.copy() + return new_obj.fillzero(inplace=True) + def drop(self, labels=None, axis=1): """Drop specified labels from rows or columns. diff --git a/chainladder/core/tests/test_triangle.py b/chainladder/core/tests/test_triangle.py index 8ff5d638..8070ee6e 100644 --- a/chainladder/core/tests/test_triangle.py +++ b/chainladder/core/tests/test_triangle.py @@ -923,3 +923,9 @@ def test_OXDX_triangle(): #elif x in [6,3]: #assert np.all(tri.origin.strftime('%Y') == pd.to_datetime(tri.odims).strftime('%Y')) #assert np.all(tri.origin.strftime('%q').values.astype(float) == np.ceil((pd.to_datetime(tri.odims).strftime('%m').values.astype(int) - 0.5) / 3)) + +def test_fillzero(): + raa = cl.load_sample('raa') + zero = raa - raa[raa.origin=='1982'] + filled = zero.fillzero() + assert (filled[filled.origin == '1982'][filled.development == 24].values.flatten()[0]) == 0 \ No newline at end of file