From 729b2d659837562a1f9ed06a3a17f1f23fb1ca6e Mon Sep 17 00:00:00 2001 From: Gene Dan Date: Thu, 14 Aug 2025 20:46:14 -0500 Subject: [PATCH 1/3] FIX: Fix errors in friedland_uspp_auto_increasing_claim.csv. --- .../utils/data/friedland_uspp_auto_increasing_claim.csv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chainladder/utils/data/friedland_uspp_auto_increasing_claim.csv b/chainladder/utils/data/friedland_uspp_auto_increasing_claim.csv index 44990d12..2a3ebfb7 100644 --- a/chainladder/utils/data/friedland_uspp_auto_increasing_claim.csv +++ b/chainladder/utils/data/friedland_uspp_auto_increasing_claim.csv @@ -3,7 +3,7 @@ Accident Year,Calendar Year,Paid Claims,Reported Claims 1999,2000,497000,630000 1999,2001,588000,665000 1999,2002,644000,686000 -1999,2003,672000,698000 +1999,2003,672000,693000 1999,2004,686000,693000 1999,2005,693000,700000 1999,2006,693000,700000 @@ -32,7 +32,7 @@ Accident Year,Calendar Year,Paid Claims,Reported Claims 2002,2005,745511,794131 2002,2006,777924,802234 2002,2007,794131,802234 -2002,2008,802234,810338 +2002,2008,802234,810838 2003,2003,357359,655158 2003,2004,604107,765769 2003,2005,714718,808312 From 4f90122be2dccd85c67fc740e95525a010bdb38e Mon Sep 17 00:00:00 2001 From: Gene Dan Date: Thu, 22 Jan 2026 08:19:53 -0600 Subject: [PATCH 2/3] FEAT: Add validation to TrianglePandas.rename. Also add tests to ensure cascading of rename to triangle.columns_label. --- chainladder/core/pandas.py | 24 +++++++++++++++++++----- chainladder/core/tests/test_triangle.py | 12 ++++++++++++ chainladder/core/triangle.py | 5 ++++- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/chainladder/core/pandas.py b/chainladder/core/pandas.py index 26a9e6ee..8c90e090 100644 --- a/chainladder/core/pandas.py +++ b/chainladder/core/pandas.py @@ -20,7 +20,11 @@ from collections.abc import Callable from numpy.typing import ArrayLike from types import ModuleType - from typing import Type + from typing import ( + Literal, + Self, + Type + ) @@ -308,7 +312,11 @@ def append(self, other): return concat((self, other), 0) - def rename(self, axis, value): + def rename( + self, + axis: Literal['index', 'columns', 'origin', 'development'] | int, + value: list | str + ) -> Self: """Alter axes labels. Parameters @@ -328,12 +336,18 @@ def rename(self, axis, value): value = [value] if type(value) is str else value if axis == "index" or axis == 0: self.index = value - if axis == "columns" or axis == 1: + elif axis == "columns" or axis == 1: self.columns = value - if axis == "origin" or axis == 2: + elif axis == "origin" or axis == 2: self.origin = value - if axis == "development" or axis == 3: + elif axis == "development" or axis == 3: self.development = value + else: + raise ValueError( + "Invalid value provided to the 'axis' parameter. Accepted values are a string of 'index', " + "'columns', 'origin', or 'development', or an integer in the interval [0, 4] specifying the" + " axis to be modified." + ) return self def astype(self, dtype, inplace=True): diff --git a/chainladder/core/tests/test_triangle.py b/chainladder/core/tests/test_triangle.py index 47cc59df..93a3c978 100644 --- a/chainladder/core/tests/test_triangle.py +++ b/chainladder/core/tests/test_triangle.py @@ -89,6 +89,18 @@ def test_append(raa): raa.append(raa2).sum() == raa * 2 assert raa.append(raa2).sum() == 2 * raa +def test_rename_columns(genins, clrd) -> None: + """ + Test the renaming of triangle columns. + """ + # Scalar case - single column triangle. + genins.rename('columns', 'foo') + + assert genins.columns.to_list() == ['foo'] + + # Test the cascading of rename to triangle.columns_label. + assert genins.columns_label == ['foo'] + def test_assign_existing_col(qtr): out = qtr.copy() diff --git a/chainladder/core/triangle.py b/chainladder/core/triangle.py index 041f9111..09a3361b 100644 --- a/chainladder/core/triangle.py +++ b/chainladder/core/triangle.py @@ -149,7 +149,6 @@ def __init__( ) # Store dimension metadata. - self.columns_label: list = columns self.origin_label: list = origin # Handle any ultimate vectors in triangles separately. @@ -401,6 +400,10 @@ def columns(self, value): self.vdims = np.array(self.vdims) self._set_slicers() + @property + def columns_label(self) -> list: + return self.columns.to_list() + @property def origin(self): if self.is_pattern and len(self.odims) == 1: From 08b7a95996a45ef33d0e075c97f4b16ca1dcbc5b Mon Sep 17 00:00:00 2001 From: Gene Dan Date: Thu, 22 Jan 2026 09:19:37 -0600 Subject: [PATCH 3/3] FEAT; Add test for exception handling in TrianglePandas.rename. --- chainladder/core/tests/test_triangle.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/chainladder/core/tests/test_triangle.py b/chainladder/core/tests/test_triangle.py index 93a3c978..8ff5d638 100644 --- a/chainladder/core/tests/test_triangle.py +++ b/chainladder/core/tests/test_triangle.py @@ -101,6 +101,18 @@ def test_rename_columns(genins, clrd) -> None: # Test the cascading of rename to triangle.columns_label. assert genins.columns_label == ['foo'] +def test_rename_exception(genins, clrd) -> None: + # Test incorrect axis argument - misspelling of string. + with pytest.raises(ValueError): + genins.rename('colunms', 'foo') + + # Test incorrect axis integer. + with pytest.raises(ValueError): + genins.rename(4, 'foo') + + # Test incorrect number of columns. + with pytest.raises(ValueError): + clrd.rename('columns', ['foo']) def test_assign_existing_col(qtr): out = qtr.copy()