Skip to content

test ruff - #1201

Merged
henrydingliu merged 451 commits into
loc_setterfrom
main
Aug 12, 2026
Merged

test ruff#1201
henrydingliu merged 451 commits into
loc_setterfrom
main

Conversation

@henrydingliu

@henrydingliu henrydingliu commented Aug 12, 2026

Copy link
Copy Markdown
Member

Summary of Changes

Related GitHub Issue(s)

Additional Context for Reviewers

Checklist

  • I passed tests locally for both code (uv run pytest) and documentation changes (uv run --directory docs jb build . --builder=custom --custom-builder=doctest)

Note

Medium Risk
Wide changes across Triangle semantics, sparse arrays, and stochastic apriori/Mack math, though heavily covered by new and updated tests. CI-only paths are low risk.

Overview
Adds Ruff in CI (changed-files only) and pre-push hooks (ruff + pytest), plus pytest/doctest workflow tweaks (concurrency, autosummary step, pandas 3 pin).

Triangle / core: drop() gains pandas-style columns/origin (origin drops trim empty dev periods, gh-1055); __iter__ = None so pandas does not iterate triangles in DataFrame cells (gh-142); sparse __array__ densifies; sparse column __setitem__ and arithmetic column-prep fixes; improved development grain for 1D annual/monthly data and ultimate round-trip docs/behavior; disposal_rate_tri weight broadcasting fix.

Adjustments / methods: ParallelogramOLF(cumulative=True) for 1-centric rate levels (gh-922); pct_reported_ / pct_unreported_ on fitted development objects; apriori_sigma sampling uses lognormal (positive aprioris, #1143); Mack recursion/summary backend alignment; WeightedRegression sigma definition adjusted.

Workflow: new public TriangleSelector and VotingChainladder weight/ultimate shape handling; exports TriangleSelector.

Data & docs: consolidates Friedland samples (friedland_us_auto, friedland_uspp, XYZ JSON, GL population); new Friedland chapters 8–10; sparse nanquantile/nanmedian; extensive test updates (sparse/numpy parametrization via set_backend).

Reviewed by Cursor Bugbot for commit 6ca44ed. Bugbot is set up for automated code reviews on this repo. Configure here.

henrydingliu and others added 30 commits June 12, 2026 08:21
setting max sparse version
)

The options refactor added Options._validate_option(), which checks names
against the uppercase attribute keys. The Backends cell in triangle.ipynb
still passed 'auto_sparse' and raised ValueError. (ARRAY_BACKEND was already
corrected on experimental.) Closes #889.
Add Triangle constructor examples and expand _split_ult docstring for round-trip and direct import via options.ULT_VAL. Add test_create_triangle_with_ultimates. Closes #523.

Co-authored-by: Cursor <cursoragent@cursor.com>
The options refactor made set_option validate names against uppercase keys.
After #895 corrected 'auto_sparse' to 'AUTO_SPARSE', the call actually
succeeds and leaves AUTO_SPARSE=False set globally for the rest of the
notebook. Downstream the prism timeit cells reload the sample with no
explicit backend, so they loaded dense and OOM-killed the doctest kernel
(surfacing as the runner shutdown/cancel on Doctest 3.12). Previously the
lowercase name raised ValueError, so the option never actually changed.

Reset AUTO_SPARSE immediately after the demo, mirroring the cupy cell's
reset_option(), so the sample loads sparse and the build completes.
docs: fix lowercase option names after options refactor (#889)
The Ultimates section sets ULT_VAL to 2050 to demonstrate the option but
never restores it. The mutated global then propagates to later cells, and
the Complete Triangles run-off cell raises:

    ValueError: Could not convert object to NumPy timedelta

Add a reset_option('ULT_VAL') cell immediately after the demo so the global
returns to its default and downstream cells execute cleanly.
docs: reset ULT_VAL after demo in methods notebook
The new Pandas3 doctest job on experimental surfaced two notebook
import/exec errors that do not appear in the pandas 2 build:

- user_guide/development.ipynb raised
  TypeError: Cannot interpret '<StringDtype(...)>' as a data type
  from patsy 1.0.1, which calls np.issubdtype on pandas 3's new default
  str dtype. patsy 1.0.2 handles it.

- getting_started/tutorials/stochastic-tutorial.ipynb raised
  TypeError: deprecate_kwarg() missing 1 required positional argument
  at 'import statsmodels.api'. statsmodels 0.14.5 re-exports pandas'
  deprecate_kwarg with the old signature; pandas 3 changed it.
  statsmodels 0.14.6 wraps it in a compat shim.

Both are dependency-floor issues, not chainladder or notebook-content
bugs. Refresh uv.lock so the Pandas3 job resolves the fixed versions.

The remaining plot_munich.ipynb error (YearBegin period frequency) is a
genuine pandas 3 plotting regression and is left for a separate fix.
build: floor patsy>=1.0.2 and statsmodels>=0.14.6 for pandas 3 (#889)
Add: inherited-members: to class_inherited autosummary template and remove the Inherited Methods autosummary table that only showed one-line summaries. Fixes #970.
Co-authored-by: Cursor <cursoragent@cursor.com>
docs: show full inherited method docstrings on Triangle API page (#970)
Part 1 of #970 method docstring follow-up. Properties deferred per reviewer guidance. Refs #970.

Co-authored-by: Cursor <cursoragent@cursor.com>
docs: add docstrings for Triangle broadcast_axis, copy, reindex (#970)
Part 3 of #970 method docstring follow-up. Refs #970.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Part 4 of #970 method docstring follow-up. Refs #970.

Co-authored-by: Cursor <cursoragent@cursor.com>
genedan and others added 21 commits August 6, 2026 19:29
* Add See Also links to core reserving methods

* [DOCS] Group See Also links by model type
…shift

test: rename duplicate test_shift function (fixes #1199)
Add Ruff and pre-commit checks
Friedland Recreation Chapter 8
@henrydingliu
henrydingliu merged commit 82519ee into loc_setter Aug 12, 2026
43 of 45 checks passed
@github-actions

Copy link
Copy Markdown

Pyright Type Completeness

View the full pyright --verifytypes output for this commit

Project (full chainladder package, at this PR's head): 15.1% of exported symbols fully typed (201 / 1328)

Known Ambiguous Unknown Total
Project (head) 201 111 1016 1328

Other symbols referenced but not exported by chainladder: 13

Known Ambiguous Unknown Total
Other (head) 3 1 9 13

Symbols without documentation:

  • Functions without docstring: 321
  • Functions without default param: 0
  • Classes without docstring: 10

Patch (exported symbols added or changed by this PR): 21.9% fully typed (16 / 73); 3 no longer exported

Known Ambiguous Unknown Total
Patch 16 6 51 73
Patch symbol details
Symbol Status Change
chainladder.adjustments.parallelogram.ParallelogramOLF.cumulative ⚠️ ambiguous new
chainladder.adjustments.tests.test_disposal.test_full_disposal_rate_tri ❌ unknown new
chainladder.adjustments.tests.test_disposal.test_weighted_disposal_rate_tri ❌ unknown new
chainladder.adjustments.tests.test_parallelogram.test_cumulative_duplicate_date_last_wins ❌ unknown new
chainladder.adjustments.tests.test_parallelogram.test_cumulative_factor_predates_window ❌ unknown new
chainladder.adjustments.tests.test_parallelogram.test_cumulative_matches_incremental ❌ unknown new
chainladder.adjustments.tests.test_parallelogram.test_cumulative_rejects_non_positive ❌ unknown new
chainladder.adjustments.tests.test_parallelogram.test_cumulative_tort_reform ❌ unknown new
chainladder.core.common.Common.pct_reported_ ❌ unknown new
chainladder.core.common.Common.pct_unreported_ ❌ unknown new
chainladder.core.dunders.TriangleDunders.__iter__ ✅ known new
chainladder.core.tests.test_display.test_triangle_in_dataframe_cell_display ❌ unknown new
chainladder.core.tests.test_display.test_triangle_not_iterable ❌ unknown new
chainladder.core.tests.test_triangle.origin_tri ✅ known new
chainladder.core.tests.test_triangle.test_1d_annual_valuation_date ✅ known new
chainladder.core.tests.test_triangle.test_1d_monthly_valuation_date ✅ known new
chainladder.core.tests.test_triangle.test_1d_monthly_valuation_date_expanded_dev_date ✅ known new
chainladder.core.tests.test_triangle.test_create_triangle_with_ultimates ❌ unknown new
chainladder.core.tests.test_triangle.test_drop_column_integer_axis ❌ unknown new
chainladder.core.tests.test_triangle.test_drop_column_string_axis ❌ unknown new
chainladder.core.tests.test_triangle.test_drop_columns_alternative ❌ unknown new
chainladder.core.tests.test_triangle.test_drop_columns_alternative_index_like ❌ unknown new
chainladder.core.tests.test_triangle.test_drop_columns_alternative_list ❌ unknown new
chainladder.core.tests.test_triangle.test_drop_index_origin_development_alternatives_raise ❌ unknown new
chainladder.core.tests.test_triangle.test_drop_integer_label_routes_to_axis ❌ unknown new
chainladder.core.tests.test_triangle.test_drop_invalid_axis_raises ❌ unknown new
chainladder.core.tests.test_triangle.test_drop_labels_and_alternative_raises ❌ unknown new
chainladder.core.tests.test_triangle.test_drop_non_column_axis_raises ❌ unknown new
chainladder.core.tests.test_triangle.test_drop_origin_axis_equivalents ❌ unknown new
chainladder.core.tests.test_triangle.test_drop_origin_first ❌ unknown new
chainladder.core.tests.test_triangle.test_drop_origin_interior_raises ❌ unknown new
chainladder.core.tests.test_triangle.test_drop_origin_keeps_populated_development ❌ unknown new
chainladder.core.tests.test_triangle.test_drop_origin_last ❌ unknown new
chainladder.core.tests.test_triangle.test_drop_origin_missing_raises ❌ unknown new
chainladder.core.tests.test_triangle.test_drop_origin_period_label ❌ unknown new
chainladder.core.tests.test_triangle.test_drop_origin_single_dev_period ❌ unknown new
chainladder.core.tests.test_triangle.test_drop_origin_trims_empty_development ❌ unknown new
chainladder.core.tests.test_triangle.test_fillna_none_raises ❌ unknown new
chainladder.core.tests.test_triangle.test_friedland_gl_self_insurer_grain ✅ known new
chainladder.core.tests.test_triangle.test_transpose_property ❌ unknown new
chainladder.core.tests.test_triangle.test_valuation_shift ❌ unknown new
chainladder.development.tests.test_development.test_pct_reported_and_unreported ❌ unknown new
chainladder.development.tests.test_development.test_pct_reported_requires_ldf ❌ unknown new
chainladder.methods.tests.test_benktander.test_bf_apriori_sigma_is_lognormal ❌ unknown new
chainladder.methods.tests.test_benktander.test_capecod_apriori_sigma_is_positive ❌ unknown new
chainladder.methods.tests.test_mack.test_mack1994_hardcode ❌ unknown new
chainladder.methods.tests.test_mack.test_mack1999_hardcode ❌ unknown new
chainladder.utils.sparse.nanmedian ❌ unknown new
chainladder.utils.sparse.nanquantile ❌ unknown new
chainladder.utils.tests.test_sparse.test_1D_nanquantile ✅ known new
chainladder.utils.tests.test_sparse.test_keepdims_nanquantile ✅ known new
chainladder.utils.tests.test_utilities.test_maximum_2 ❌ unknown new
chainladder.utils.tests.test_utilities.test_maximum_minimum_1 ❌ unknown new
chainladder.utils.tests.test_utilities.test_minimum_2 ❌ unknown new
chainladder.utils.weighted_regression.WeightedRegression.__init__ ✅ known changed (was ❌ unknown)
chainladder.utils.weighted_regression.WeightedRegression.average ✅ known changed (was ❌ unknown)
chainladder.utils.weighted_regression.WeightedRegression.axis ✅ known changed (was ❌ unknown)
chainladder.utils.weighted_regression.WeightedRegression.exponent_ ⚠️ ambiguous changed (was ❌ unknown)
chainladder.utils.weighted_regression.WeightedRegression.sigma_ ⚠️ ambiguous changed (was ❌ unknown)
chainladder.utils.weighted_regression.WeightedRegression.std_err_ ⚠️ ambiguous changed (was ❌ unknown)
chainladder.utils.weighted_regression.WeightedRegression.thru_orig ✅ known changed (was ⚠️ ambiguous)
chainladder.utils.weighted_regression.WeightedRegression.w ⚠️ ambiguous changed (was ❌ unknown)
chainladder.utils.weighted_regression.WeightedRegression.x ⚠️ ambiguous changed (was ❌ unknown)
chainladder.utils.weighted_regression.WeightedRegression.xp ✅ known changed (was ❌ unknown)
chainladder.utils.weighted_regression.WeightedRegression.y ✅ known changed (was ❌ unknown)
chainladder.workflow.TriangleSelector ❌ unknown new
chainladder.workflow.tests.test_voting.test_mismatching_tri_sel ❌ unknown new
chainladder.workflow.tests.test_voting.test_tri_sel ❌ unknown new
chainladder.workflow.voting.TriangleSelector ❌ unknown new
chainladder.workflow.voting.TriangleSelector.__init__ ✅ known new
chainladder.workflow.voting.TriangleSelector.col ✅ known new
chainladder.workflow.voting.TriangleSelector.fit ❌ unknown new
chainladder.workflow.voting.TriangleSelector.transform ❌ unknown new
chainladder.development.tests.test_development.test_sigma1 no longer exported (was ❌ unknown)
chainladder.utils.tests.test_utilities.test_maximum no longer exported (was ❌ unknown)
chainladder.utils.tests.test_utilities.test_minimum no longer exported (was ❌ unknown)

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want reviews to match your repository better? Bugbot Learning can learn team-specific rules from PR activity. A team admin can enable Learning in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 6ca44ed. Configure here.

@@ -0,0 +1,221 @@
Accident Year,Calendar Year,Paid Claims,Reported Claims,Earned Premium,Scenario

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sample CSV has UTF-8 BOM

High Severity

friedland_uspp.csv begins with a UTF-8 BOM, so pd.read_csv in load_sample names the first column \ufeffAccident Year instead of Accident Year. That no longer matches the manifest, so cl.load_sample("friedland_uspp") fails and docs that load this sample break.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 6ca44ed. Configure here.

@codecov

codecov Bot commented Aug 12, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 99.41860% with 1 line in your changes missing coverage. Please review.
✅ Project coverage is 91.48%. Comparing base (6c9ce99) to head (6ca44ed).
⚠️ Report is 462 commits behind head on loc_setter.

Files with missing lines Patch % Lines
chainladder/utils/sparse.py 96.96% 0 Missing and 1 partial ⚠️
Additional details and impacted files
@@              Coverage Diff               @@
##           loc_setter    #1201      +/-   ##
==============================================
+ Coverage       90.48%   91.48%   +0.99%     
==============================================
  Files              91       91              
  Lines            5289     5552     +263     
  Branches          671      736      +65     
==============================================
+ Hits             4786     5079     +293     
+ Misses            359      338      -21     
+ Partials          144      135       -9     
Flag Coverage Δ
unittests 91.48% <99.41%> (+0.99%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants