diff --git a/docs/getting_started/online_sandbox/sandbox_workbook_blank.ipynb b/docs/getting_started/online_sandbox/sandbox_workbook_blank.ipynb index f95a6f46..c63c08b9 100644 --- a/docs/getting_started/online_sandbox/sandbox_workbook_blank.ipynb +++ b/docs/getting_started/online_sandbox/sandbox_workbook_blank.ipynb @@ -1,845 +1,846 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "0f0e5e3b-ac37-4865-8c51-ded927ea9b46", - "metadata": {}, - "source": [ - "# Online Sandbox Tutorial\n", - "\n", - "Welcome! If you've come here to explore the capabilities of the `chainladder-python` package, you've landed in the perfect spot. This online sandbox tutorial is designed to provide you with a glimpse of the package's functionalities. \n", - "\n", - "We recommend setting aside about **one hour** to complete it.\n", - "\n", - "Got Stuck? Click [here](https://nbviewer.org/github/casact/chainladder-python/blob/master/docs/getting_started/online_sandbox/sandbox_workbook_filled.ipynb) for the filled in workbook. Have questions? Join the [discussion](https://github.com/casact/chainladder-python/discussions) on GitHub." - ] - }, - { - "cell_type": "markdown", - "id": "d8f38e79-5010-4190-b38c-cbc1d85bde47", - "metadata": { - "tags": [] - }, - "source": [ - "# Setting Up\n", - "We will first need to install the package, as Google Colab's default environment doesn't have the chainladder package pre-installed. \n", - "\n", - "Simply execute `pip install chainladder`, Colab is smart enough to know that this is not a piece of python code, but to execute it in shell. FYI, `pip` stands for \"Package Installer for Python\". You will need to run this step using your terminal instead of using a python notebook when you are ready to install the package on your machine." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "be51a379-5efe-420e-b689-3bf93b96ebc8", - "metadata": {}, - "outputs": [], - "source": [ - "pip install __fill_in_code__" - ] - }, - { - "cell_type": "markdown", - "id": "3d2bde34-d9e8-436d-8819-675e2ece7bc9", - "metadata": {}, - "source": [ - "`%load_ext lab_black` is a linter, it makes code prettier, you may ignore this line." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "882cc191-5849-471e-8e13-65fdf3e01419", - "metadata": {}, - "outputs": [], - "source": [ - "%load_ext lab_black" - ] - }, - { - "cell_type": "markdown", - "id": "011ee825-ca6d-4efc-b782-5e6f2a14bead", - "metadata": {}, - "source": [ - "Other commonly used packages, such as `numpy`, `pandas`, and `matplotlib` are already pre-installed, we just need to load them into our environment." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "03fdf8fd-ecd1-4df4-b9cf-a4bf01d978f0", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "import chainladder as cl\n", - "\n", - "print(\"chainladder\", cl.__version__)" - ] - }, - { - "cell_type": "markdown", - "id": "42e0f37f-6d82-46ed-9f80-647cc7233046", - "metadata": {}, - "source": [ - "# Your Journey Begins" - ] - }, - { - "cell_type": "markdown", - "id": "c9a3a636-979a-4205-9762-469e8afb7e46", - "metadata": {}, - "source": [ - "Let's begin by looking at a sample dataset, called `xyz`, which is hosted on https://raw.githubusercontent.com/casact/chainladder-python/master/chainladder/utils/data/xyz.csv.\n", - "\n", - "Let's load the dataset into the memory with `pandas`, then inspect its \"`head`\"." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "aa2c95b8-86b4-4846-b950-12c402477ec1", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "xyz_df = pd.read_csv(\n", - " __fill_in_code__\n", - ")\n", - "xyz_df.head()" - ] - }, - { - "cell_type": "markdown", - "id": "996795b6-9361-4b5c-a00d-d9b6391b115f", - "metadata": {}, - "source": [ - "Can you list all of the unique accident years?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4c11052c-291e-439f-ac0f-6736bb2b0b68", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_df[__fill_in_code__].unique()" - ] - }, - { - "cell_type": "markdown", - "id": "3d5be56c-1432-4ba2-85bc-16412fee1d66", - "metadata": {}, - "source": [ - "How many are there?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cfeca5a6-366f-4abb-b3e9-51c91e7b9336", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_df[__fill_in_code__].nunique()" - ] - }, - { - "cell_type": "markdown", - "id": "8f870f4f-117c-467d-b3d7-d2941f964f23", - "metadata": {}, - "source": [ - "# Triangle Basics" - ] - }, - { - "cell_type": "markdown", - "id": "4d4ebbf6-bcdc-4c4f-be8c-168c4e7883ea", - "metadata": {}, - "source": [ - "Let's load the data into the chainladder triangle format. And let's call it `xyz_tri`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2b51e0b6-c1d3-4976-8866-4800b15d27ec", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_tri = cl.Triangle(\n", - " data=__fill_in_code__,\n", - " origin=\"AccidentYear\",\n", - " development=\"DevelopmentYear\",\n", - " columns=[\"Incurred\", \"Paid\", \"Reported\", \"Closed\", \"Premium\"],\n", - " cumulative=True,\n", - ")\n", - "xyz_tri" - ] - }, - { - "cell_type": "markdown", - "id": "2c404d26-4418-43b8-8687-58be1b6423f1", - "metadata": {}, - "source": [ - "What does the incurred triangle look like?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fe9309fe-2744-4e4d-beff-0a36c1182386", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_tri[__fill_in_code__]" - ] - }, - { - "cell_type": "markdown", - "id": "ed9811e6-5761-4258-9942-19a620540361", - "metadata": {}, - "source": [ - "How about paid?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "278856cf-6d84-4fa6-ac57-4f57755580b8", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_tri[__fill_in_code__]" - ] - }, - { - "cell_type": "markdown", - "id": "04114ff8-107a-4c56-ab9a-8c36f53553df", - "metadata": {}, - "source": [ - "# Pandas-like Operations" - ] - }, - { - "cell_type": "markdown", - "id": "433b8ae8-1968-4dfc-a176-c8a8c93c5f97", - "metadata": {}, - "source": [ - "Let's see how `.iloc[...]` and `.loc[...]` similarly to pandas. They take 4 parameters: [index, column, origin, valuation]." - ] - }, - { - "cell_type": "markdown", - "id": "f0452527-796d-4185-929a-97241329b377", - "metadata": {}, - "source": [ - "What if we want the row from AY 1998 Incurred data?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a13a157b-3fe9-4254-bc72-11d4e1705f29", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_tri.iloc[__fill_in_code__, __fill_in_code__, __fill_in_code__, __fill_in_code__]" - ] - }, - { - "cell_type": "markdown", - "id": "08b8557c-66fe-4a25-a8bf-5413ca1c1fbb", - "metadata": {}, - "source": [ - "What if you only want the valuation at age 60 of AY 1998?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fb20eda1-4e4a-431d-8c8a-21cc87b8c472", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_tri.iloc[__fill_in_code__, __fill_in_code__, __fill_in_code__, __fill_in_code__]" - ] - }, - { - "cell_type": "markdown", - "id": "56683ffb-01ef-4e18-ba27-1b8ab31b9ae7", - "metadata": {}, - "source": [ - "Let's use `.loc[...]` to get the incurred triangle." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b8116ded-c788-483c-b2af-fde45b72ee4a", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_tri.loc[__fill_in_code__, __fill_in_code__, __fill_in_code__, __fill_in_code__]" - ] - }, - { - "cell_type": "markdown", - "id": "c9d515b7-c9a3-4045-ad79-78af1574be8a", - "metadata": {}, - "source": [ - "How do we get the latest Incurred diagonal only?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5bce08b8-bf34-418e-ac3b-db253db44898", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_tri[\"Incurred\"].__fill_in_code__" - ] - }, - { - "cell_type": "markdown", - "id": "31b56210-cbcd-4bbb-af9f-063a3788867a", - "metadata": {}, - "source": [ - "Very often, we want incremental triangles instead. Let's convert the Incurred triangle to the incremental form." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b2766e7b-b1e6-4574-bfa7-fd70ccd556d7", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_tri[\"Incurred\"].__fill_in_code__" - ] - }, - { - "cell_type": "markdown", - "id": "6235668f-9025-4108-b987-f867f93c8ce6", - "metadata": {}, - "source": [ - "We can also convert the triangle to the valuation format, what we often see on Schedule Ps." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "72487c9a-4438-4ab7-8a24-245485d4c637", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_tri[\"Incurred\"].__fill_in_code__" - ] - }, - { - "cell_type": "markdown", - "id": "6e404747-8e22-42c0-a1b5-45c95d702730", - "metadata": {}, - "source": [ - "Another function that is often useful is the `.heatmap()` method. Let's inspect the incurred amount and see if there are trends." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f20ed887-e5b1-40f7-81b5-14bd840cca23", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_tri[\"Incurred\"].__fill_in_code__" - ] - }, - { - "cell_type": "markdown", - "id": "27d110d2-ee73-4bb5-a411-3d27c0dd7673", - "metadata": {}, - "source": [ - "# Development" - ] - }, - { - "cell_type": "markdown", - "id": "a0d0950f-bec7-406d-b253-4cf1bfd925dd", - "metadata": {}, - "source": [ - "How can we get the incurred link ratios?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ec16d0fd-ac17-4280-aabf-ad5795114d5f", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_tri[\"Incurred\"].__fill_in_code__" - ] - }, - { - "cell_type": "markdown", - "id": "c74c5352-a95b-4403-8322-962ded312e39", - "metadata": {}, - "source": [ - "We can also apply a `.heatmap()` to make it too, to help us visulize the highs and lows." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "172c70be-2324-472f-b89c-29963695179a", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_tri[\"Incurred\"].__fill_in_code__.__fill_in_code__" - ] - }, - { - "cell_type": "markdown", - "id": "f5f212b0-3769-49cd-b7cc-b484f2877aa2", - "metadata": {}, - "source": [ - "Let's get a volume-weighted average LDFs for our Incurred triangle." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ba0b96cb-77eb-472c-84fd-c5c8c5c11e10", - "metadata": {}, - "outputs": [], - "source": [ - "cl.Development(average=\"volume\").fit(__fill_in_code__).ldf_" - ] - }, - { - "cell_type": "markdown", - "id": "0c4baafd-e141-4566-a4ae-2f0a44ef828e", - "metadata": {}, - "source": [ - "How about the CDFs?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b156f84b-dd0d-49d6-8eec-070d0143f40c", - "metadata": {}, - "outputs": [], - "source": [ - "cl.Development(average=\"volume\").fit(__fill_in_code__).__fill_in_code__" - ] - }, - { - "cell_type": "markdown", - "id": "d51e5664-3106-41d1-b77f-8afa9ee94ff7", - "metadata": {}, - "source": [ - "We can also use only the latest 3 periods in the calculation of CDFs." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "de88fdad-5d89-4cc2-adb0-bbeb7c77bbcb", - "metadata": {}, - "outputs": [], - "source": [ - "cl.Development(average=\"volume\", n_periods=__fill_in_code__).fit(xyz_tri[\"Incurred\"]).cdf_" - ] - }, - { - "cell_type": "markdown", - "id": "b018bae9-6070-4795-8af6-b5e196aa1af1", - "metadata": {}, - "source": [ - "# Deterministic Models" - ] - }, - { - "cell_type": "markdown", - "id": "e7c7b88e-205d-45c8-b9e6-4586f29041a4", - "metadata": {}, - "source": [ - "Before we can build any models, we need to use `fit_transform()`, so that the object is actually modified with our selected development pattern(s).\n", - "\n", - "Set the development of the triangle to use only 3 periods." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9e5136d2-0c3c-44da-8440-57ca3cfbbb9d", - "metadata": {}, - "outputs": [], - "source": [ - "cl.Development(__fill_in_code__).fit_transform(__fill_in_code__)" - ] - }, - { - "cell_type": "markdown", - "id": "1bd89481-e5c7-4a84-b2cc-a2e386ccdb15", - "metadata": {}, - "source": [ - "Let's fit a chainladder model to our Incurred triangle." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "022e22e9-92a8-427c-bf5c-cf352df1437c", - "metadata": {}, - "outputs": [], - "source": [ - "cl_mod = cl.Chainladder().fit(__fill_in_code__)\n", - "cl_mod" - ] - }, - { - "cell_type": "markdown", - "id": "7b710342-5f86-408e-bf7e-76382b37f2d1", - "metadata": {}, - "source": [ - "How can we get the model's ultimate estimate?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "69f18923-73b1-4b80-9148-60a7bab5b118", - "metadata": {}, - "outputs": [], - "source": [ - "cl_mod.__fill_in_code__" - ] - }, - { - "cell_type": "markdown", - "id": "b416a404-8d0f-46fc-a3e7-f5b5b884b4b4", - "metadata": {}, - "source": [ - "How about just the IBNR?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5fad3aa0-03bc-4f84-a8b7-1a00dbdebe8d", - "metadata": {}, - "outputs": [], - "source": [ - "cl_mod.__fill_in_code__" - ] - }, - { - "cell_type": "markdown", - "id": "70d8c018-21ca-4f2c-a764-433e310bb44a", - "metadata": {}, - "source": [ - "Let's fit an Expected Loss model, with an aprior of 90% on Premium, and get its ultimates." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "22eba9fa-1890-4f6f-8a10-281142d2d58d", - "metadata": {}, - "outputs": [], - "source": [ - "cl.ExpectedLoss(apriori=0.90).fit(\n", - " __fill_in_code__, sample_weight=xyz_tri[\"Premium\"].latest_diagonal\n", - ").ultimate_" - ] - }, - { - "cell_type": "markdown", - "id": "eb20b72a-4e49-4eaa-b8e8-d3801833e2d3", - "metadata": {}, - "source": [ - "Try it on the Paid triangle, do you get the same ultimate?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "411f48b0-8b86-4175-80f2-f5f4a19e6c46", - "metadata": {}, - "outputs": [], - "source": [ - "cl.ExpectedLoss(apriori=0.90).fit(\n", - " __fill_in_code__, sample_weight=__fill_in_code__\n", - ").ultimate_" - ] - }, - { - "cell_type": "markdown", - "id": "fb1d7eda-f4c6-4990-9488-47235492001a", - "metadata": {}, - "source": [ - "How about a Bornhuetter-Ferguson model?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d66c7c9a-71eb-4d56-beea-f275da062fc0", - "metadata": {}, - "outputs": [], - "source": [ - "cl.BornhuetterFerguson(apriori=0.90).fit(\n", - " __fill_in_code__, sample_weight=__fill_in_code__\n", - ").ultimate_" - ] - }, - { - "cell_type": "markdown", - "id": "5564ead9-d059-4d2c-839a-f988238e50ee", - "metadata": {}, - "source": [ - "How about Benktander, with 1 iteration, which is the same as BF?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d504e48d-1f5d-4fd6-975b-155235ffb577", - "metadata": {}, - "outputs": [], - "source": [ - "cl.Benktander(apriori=0.90, n_iters=__fill_in_code__).fit(\n", - " __fill_in_code__, sample_weight=__fill_in_code__\n", - ").ultimate_" - ] - }, - { - "cell_type": "markdown", - "id": "002a76c2-7989-46ba-954b-d84c09b4675a", - "metadata": {}, - "source": [ - "How about Cape Cod?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7089ea42-ad28-4edc-9e83-723a7bc25443", - "metadata": {}, - "outputs": [], - "source": [ - "cl.CapeCod().fit(\n", - " __fill_in_code__, sample_weight=__fill_in_code__\n", - ").ultimate_" - ] - }, - { - "cell_type": "markdown", - "id": "5a0d73a2-0e05-4be2-91f0-9ef1ef56a7be", - "metadata": {}, - "source": [ - "Let's store the Cape Cod model as `cc_result`. We can also use `.to_frame()` to leave `chainladder` and go to a `DataFrame`. Let's make a bar chart over origin years to see what they look like." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f2cd9f8c-454d-4b9f-b936-a2f39e8fefde", - "metadata": {}, - "outputs": [], - "source": [ - "cc_result = (\n", - " cl.CapeCod()\n", - " .fit(xyz_tri[\"Incurred\"], sample_weight=xyz_tri[\"Premium\"].latest_diagonal)\n", - " .ultimate_\n", - ")\n", - "plt.plot(\n", - " __fill_in_code__, \n", - " __fill_in_code__,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "3f9e62f8-225b-4046-8847-a6e8d971e14d", - "metadata": {}, - "source": [ - "# Stochastic Models" - ] - }, - { - "cell_type": "markdown", - "id": "36105614-e317-4a87-a42d-282f59b1d339", - "metadata": {}, - "source": [ - "The Mack's Chainladder model is available. Let's use it on the Incurred triangle." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e008ebdb-243d-4ed0-9256-86331df1070a", - "metadata": {}, - "outputs": [], - "source": [ - "mcl_mod = cl.MackChainladder().fit(__fill_in_code__)\n", - "mcl_mod" - ] - }, - { - "cell_type": "markdown", - "id": "3298c63c-5356-4d69-afa3-058b68daf777", - "metadata": {}, - "source": [ - "There are many attributes that are available, such as `full_std_err_`, `total_process_risk_`, `total_parameter_risk_`, `mack_std_err_` and `total_mack_std_err_`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "67f5d99b-7a5e-4640-a6e0-f8b654e6ce27", - "metadata": {}, - "outputs": [], - "source": [ - "__fill_in_code__.full_std_err_" - ] - }, - { - "cell_type": "markdown", - "id": "bdb08c81-5921-4c41-ad63-96168ffd48b7", - "metadata": {}, - "source": [ - "MackChainladder also has a `summary_` attribute." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "81fc38c1-d5b7-4262-94ae-bce5c7ac17e1", - "metadata": {}, - "outputs": [], - "source": [ - "__fill_in_code__.summary_" - ] - }, - { - "cell_type": "markdown", - "id": "0e285585-62b6-48e4-8b1d-c5824ae5df46", - "metadata": {}, - "source": [ - "Let's make a graph, that shows the Reported and IBNR as stacked bars, and error bars showing Mack Standard Errors." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e615b86e-a907-4445-9e95-645090719f76", - "metadata": {}, - "outputs": [], - "source": [ - "plt.bar(\n", - " mcl_mod.summary_.to_frame(origin_as_datetime=True).index.year,\n", - " mcl_mod.summary_.to_frame(origin_as_datetime=True)[__fill_in_code__],\n", - " label=\"Reported\",\n", - ")\n", - "plt.bar(\n", - " mcl_mod.summary_.to_frame(origin_as_datetime=True).index.year,\n", - " mcl_mod.summary_.to_frame(origin_as_datetime=True)[__fill_in_code__],\n", - " bottom=mcl_mod.summary_.to_frame(origin_as_datetime=True)[__fill_in_code__],\n", - " yerr=mcl_mod.summary_.to_frame(origin_as_datetime=True)[__fill_in_code__],\n", - " label=\"IBNR\",\n", - ")\n", - "plt.legend(loc=\"upper left\")" - ] - }, - { - "cell_type": "markdown", - "id": "785120ad-03cf-48a7-90d8-d1d56a75ef88", - "metadata": {}, - "source": [ - "ODP Bootstrap is also available. Let's build sample 10,000 Incurred triangles." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "859e19f3-d526-435c-a845-4845a7a3956d", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_tri_sampled = (\n", - " cl.BootstrapODPSample(n_sims=__fill_in_code__).fit(__fill_in_code__).resampled_triangles_\n", - ")\n", - "xyz_tri_sampled" - ] - }, - { - "cell_type": "markdown", - "id": "4391f730-5309-49b2-9c19-0801e3e66c7c", - "metadata": {}, - "source": [ - "We can fit a basic chainladder to all sampled triangles. We now have 10,000 simulated chainladder models, all (most) with unique LDFs." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fe6dbe70-1b2a-4fb0-aa6b-56380534704f", - "metadata": {}, - "outputs": [], - "source": [ - "cl_mod_bootstrapped = cl.Chainladder().fit(xyz_tri_sampled)\n", - "cl_mod_bootstrapped" - ] - }, - { - "cell_type": "markdown", - "id": "bb3d7c32-9e75-4ae4-ab23-0ca3f2a436b5", - "metadata": {}, - "source": [ - "Let's make another graph." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "edeba1db-97e6-43df-b1c0-590c2d7cd098", - "metadata": {}, - "outputs": [], - "source": [ - "plt.bar(\n", - " cl_mod_bootstrapped.ultimate_.mean().to_frame(origin_as_datetime=True).index.year,\n", - " cl_mod_bootstrapped.ultimate_.mean().to_frame(origin_as_datetime=True)[\"2261\"],\n", - " yerr=cl_mod_bootstrapped.ultimate_.std().to_frame(origin_as_datetime=True)[\"2261\"],\n", - ")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.17" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + "cells": [ + { + "cell_type": "markdown", + "id": "0f0e5e3b-ac37-4865-8c51-ded927ea9b46", + "metadata": {}, + "source": [ + "# Online Sandbox Tutorial\n", + "\n", + "Welcome! If you've come here to explore the capabilities of the `chainladder-python` package, you've landed in the perfect spot. This online sandbox tutorial is designed to provide you with a glimpse of the package's functionalities. \n", + "\n", + "We recommend setting aside about **one hour** to complete it.\n", + "\n", + "Got Stuck? Click [here](https://nbviewer.org/github/casact/chainladder-python/blob/master/docs/getting_started/online_sandbox/sandbox_workbook_filled.ipynb) for the filled in workbook. Have questions? Join the [discussion](https://github.com/casact/chainladder-python/discussions) on GitHub." + ] + }, + { + "cell_type": "markdown", + "id": "d8f38e79-5010-4190-b38c-cbc1d85bde47", + "metadata": { + "tags": [] + }, + "source": [ + "# Setting Up\n", + "We will first need to install the package, as Google Colab's default environment doesn't have the chainladder package pre-installed. \n", + "\n", + "Simply execute `pip install chainladder`, Colab is smart enough to know that this is not a piece of python code, but to execute it in shell. FYI, `pip` stands for \"Package Installer for Python\". You will need to run this step using your terminal instead of using a python notebook when you are ready to install the package on your machine." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "be51a379-5efe-420e-b689-3bf93b96ebc8", + "metadata": {}, + "outputs": [], + "source": [ + "pip install __fill_in_code__" + ] + }, + { + "cell_type": "markdown", + "id": "3d2bde34-d9e8-436d-8819-675e2ece7bc9", + "metadata": {}, + "source": [ + "`%load_ext lab_black` is a linter, it makes code prettier, you may ignore this line." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "882cc191-5849-471e-8e13-65fdf3e01419", + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext lab_black" + ] + }, + { + "cell_type": "markdown", + "id": "011ee825-ca6d-4efc-b782-5e6f2a14bead", + "metadata": {}, + "source": [ + "Other commonly used packages, such as `numpy`, `pandas`, and `matplotlib` are already pre-installed, we just need to load them into our environment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "03fdf8fd-ecd1-4df4-b9cf-a4bf01d978f0", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import chainladder as cl\n", + "\n", + "print(\"chainladder\", cl.__version__)" + ] + }, + { + "cell_type": "markdown", + "id": "42e0f37f-6d82-46ed-9f80-647cc7233046", + "metadata": {}, + "source": [ + "# Your Journey Begins" + ] + }, + { + "cell_type": "markdown", + "id": "c9a3a636-979a-4205-9762-469e8afb7e46", + "metadata": {}, + "source": [ + "Let's begin by looking at a sample dataset, called `xyz`, which is hosted on https://raw.githubusercontent.com/casact/chainladder-python/master/chainladder/utils/data/xyz.csv.\n", + "\n", + "Let's load the dataset into the memory with `pandas`, then inspect its \"`head`\"." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aa2c95b8-86b4-4846-b950-12c402477ec1", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "xyz_df = pd.read_csv(\n", + " __fill_in_code__\n", + ")\n", + "xyz_df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "996795b6-9361-4b5c-a00d-d9b6391b115f", + "metadata": {}, + "source": [ + "Can you list all of the unique accident years?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4c11052c-291e-439f-ac0f-6736bb2b0b68", + "metadata": {}, + "outputs": [], + "source": [ + "xyz_df[__fill_in_code__].unique()" + ] + }, + { + "cell_type": "markdown", + "id": "3d5be56c-1432-4ba2-85bc-16412fee1d66", + "metadata": {}, + "source": [ + "How many are there?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cfeca5a6-366f-4abb-b3e9-51c91e7b9336", + "metadata": {}, + "outputs": [], + "source": [ + "xyz_df[__fill_in_code__].nunique()" + ] + }, + { + "cell_type": "markdown", + "id": "8f870f4f-117c-467d-b3d7-d2941f964f23", + "metadata": {}, + "source": [ + "# Triangle Basics" + ] + }, + { + "cell_type": "markdown", + "id": "4d4ebbf6-bcdc-4c4f-be8c-168c4e7883ea", + "metadata": {}, + "source": [ + "Let's load the data into the chainladder triangle format. And let's call it `xyz_tri`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2b51e0b6-c1d3-4976-8866-4800b15d27ec", + "metadata": {}, + "outputs": [], + "source": [ + "xyz_tri = cl.Triangle(\n", + " data=__fill_in_code__,\n", + " origin=\"AccidentYear\",\n", + " development=\"DevelopmentYear\",\n", + " columns=[\"Incurred\", \"Paid\", \"Reported\", \"Closed\", \"Premium\"],\n", + " cumulative=True,\n", + ")\n", + "xyz_tri" + ] + }, + { + "cell_type": "markdown", + "id": "2c404d26-4418-43b8-8687-58be1b6423f1", + "metadata": {}, + "source": [ + "What does the incurred triangle look like?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fe9309fe-2744-4e4d-beff-0a36c1182386", + "metadata": {}, + "outputs": [], + "source": [ + "xyz_tri[__fill_in_code__]" + ] + }, + { + "cell_type": "markdown", + "id": "ed9811e6-5761-4258-9942-19a620540361", + "metadata": {}, + "source": [ + "How about paid?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "278856cf-6d84-4fa6-ac57-4f57755580b8", + "metadata": {}, + "outputs": [], + "source": [ + "xyz_tri[__fill_in_code__]" + ] + }, + { + "cell_type": "markdown", + "id": "04114ff8-107a-4c56-ab9a-8c36f53553df", + "metadata": {}, + "source": [ + "# Pandas-like Operations" + ] + }, + { + "cell_type": "markdown", + "id": "433b8ae8-1968-4dfc-a176-c8a8c93c5f97", + "metadata": {}, + "source": [ + "Let's see how `.iloc[...]` and `.loc[...]` similarly to pandas. They take 4 parameters: [index, column, origin, valuation]." + ] + }, + { + "cell_type": "markdown", + "id": "f0452527-796d-4185-929a-97241329b377", + "metadata": {}, + "source": [ + "What if we want the row from AY 1998 Incurred data?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a13a157b-3fe9-4254-bc72-11d4e1705f29", + "metadata": {}, + "outputs": [], + "source": [ + "xyz_tri.iloc[__fill_in_code__, __fill_in_code__, __fill_in_code__, __fill_in_code__]" + ] + }, + { + "cell_type": "markdown", + "id": "08b8557c-66fe-4a25-a8bf-5413ca1c1fbb", + "metadata": {}, + "source": [ + "What if you only want the valuation at age 60 of AY 1998?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fb20eda1-4e4a-431d-8c8a-21cc87b8c472", + "metadata": {}, + "outputs": [], + "source": [ + "xyz_tri.iloc[__fill_in_code__, __fill_in_code__, __fill_in_code__, __fill_in_code__]" + ] + }, + { + "cell_type": "markdown", + "id": "56683ffb-01ef-4e18-ba27-1b8ab31b9ae7", + "metadata": {}, + "source": [ + "Let's use `.loc[...]` to get the incurred triangle." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b8116ded-c788-483c-b2af-fde45b72ee4a", + "metadata": {}, + "outputs": [], + "source": [ + "xyz_tri.loc[__fill_in_code__, __fill_in_code__, __fill_in_code__, __fill_in_code__]" + ] + }, + { + "cell_type": "markdown", + "id": "c9d515b7-c9a3-4045-ad79-78af1574be8a", + "metadata": {}, + "source": [ + "How do we get the latest Incurred diagonal only?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5bce08b8-bf34-418e-ac3b-db253db44898", + "metadata": {}, + "outputs": [], + "source": [ + "xyz_tri[\"Incurred\"].__fill_in_code__" + ] + }, + { + "cell_type": "markdown", + "id": "31b56210-cbcd-4bbb-af9f-063a3788867a", + "metadata": {}, + "source": [ + "Very often, we want incremental triangles instead. Let's convert the Incurred triangle to the incremental form." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b2766e7b-b1e6-4574-bfa7-fd70ccd556d7", + "metadata": {}, + "outputs": [], + "source": [ + "xyz_tri[\"Incurred\"].__fill_in_code__" + ] + }, + { + "cell_type": "markdown", + "id": "6235668f-9025-4108-b987-f867f93c8ce6", + "metadata": {}, + "source": [ + "We can also convert the triangle to the valuation format, what we often see on Schedule Ps." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "72487c9a-4438-4ab7-8a24-245485d4c637", + "metadata": {}, + "outputs": [], + "source": [ + "xyz_tri[\"Incurred\"].__fill_in_code__" + ] + }, + { + "cell_type": "markdown", + "id": "6e404747-8e22-42c0-a1b5-45c95d702730", + "metadata": {}, + "source": [ + "Another function that is often useful is the `.heatmap()` method. Let's inspect the incurred amount and see if there are trends." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f20ed887-e5b1-40f7-81b5-14bd840cca23", + "metadata": {}, + "outputs": [], + "source": [ + "xyz_tri[\"Incurred\"].__fill_in_code__" + ] + }, + { + "cell_type": "markdown", + "id": "27d110d2-ee73-4bb5-a411-3d27c0dd7673", + "metadata": {}, + "source": [ + "# Development" + ] + }, + { + "cell_type": "markdown", + "id": "a0d0950f-bec7-406d-b253-4cf1bfd925dd", + "metadata": {}, + "source": [ + "How can we get the incurred link ratios?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ec16d0fd-ac17-4280-aabf-ad5795114d5f", + "metadata": {}, + "outputs": [], + "source": [ + "xyz_tri[\"Incurred\"].__fill_in_code__" + ] + }, + { + "cell_type": "markdown", + "id": "c74c5352-a95b-4403-8322-962ded312e39", + "metadata": {}, + "source": [ + "We can also apply a `.heatmap()` to make it too, to help us visulize the highs and lows." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "172c70be-2324-472f-b89c-29963695179a", + "metadata": {}, + "outputs": [], + "source": [ + "xyz_tri[\"Incurred\"].__fill_in_code__.__fill_in_code__" + ] + }, + { + "cell_type": "markdown", + "id": "f5f212b0-3769-49cd-b7cc-b484f2877aa2", + "metadata": {}, + "source": [ + "Let's get a volume-weighted average LDFs for our Incurred triangle." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba0b96cb-77eb-472c-84fd-c5c8c5c11e10", + "metadata": {}, + "outputs": [], + "source": [ + "cl.Development(average=\"volume\").fit(__fill_in_code__).ldf_" + ] + }, + { + "cell_type": "markdown", + "id": "0c4baafd-e141-4566-a4ae-2f0a44ef828e", + "metadata": {}, + "source": [ + "How about the CDFs?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b156f84b-dd0d-49d6-8eec-070d0143f40c", + "metadata": {}, + "outputs": [], + "source": [ + "cl.Development(average=\"volume\").fit(__fill_in_code__).__fill_in_code__" + ] + }, + { + "cell_type": "markdown", + "id": "d51e5664-3106-41d1-b77f-8afa9ee94ff7", + "metadata": {}, + "source": [ + "We can also use only the latest 3 periods in the calculation of CDFs." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "de88fdad-5d89-4cc2-adb0-bbeb7c77bbcb", + "metadata": {}, + "outputs": [], + "source": [ + "cl.Development(average=\"volume\", n_periods=__fill_in_code__).fit(xyz_tri[\"Incurred\"]).cdf_" + ] + }, + { + "cell_type": "markdown", + "id": "b018bae9-6070-4795-8af6-b5e196aa1af1", + "metadata": {}, + "source": [ + "# Deterministic Models" + ] + }, + { + "cell_type": "markdown", + "id": "e7c7b88e-205d-45c8-b9e6-4586f29041a4", + "metadata": {}, + "source": [ + "Before we can build any models, we need to use `fit_transform()`, so that the object is actually modified with our selected development pattern(s).\n", + "\n", + "Set the development of the triangle to use only 3 periods." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9e5136d2-0c3c-44da-8440-57ca3cfbbb9d", + "metadata": {}, + "outputs": [], + "source": [ + "cl.Development(average=__fill_in_code__, n_periods=__fill_in_code__).fit_transform(__fill_in_code__)" + ] + }, + { + "cell_type": "markdown", + "id": "1bd89481-e5c7-4a84-b2cc-a2e386ccdb15", + "metadata": {}, + "source": [ + "Let's fit a chainladder model to our Incurred triangle." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "022e22e9-92a8-427c-bf5c-cf352df1437c", + "metadata": {}, + "outputs": [], + "source": [ + "cl_mod = cl.Chainladder().fit(__fill_in_code__)\n", + "cl_mod" + ] + }, + { + "cell_type": "markdown", + "id": "7b710342-5f86-408e-bf7e-76382b37f2d1", + "metadata": {}, + "source": [ + "How can we get the model's ultimate estimate?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69f18923-73b1-4b80-9148-60a7bab5b118", + "metadata": {}, + "outputs": [], + "source": [ + "cl_mod.__fill_in_code__" + ] + }, + { + "cell_type": "markdown", + "id": "b416a404-8d0f-46fc-a3e7-f5b5b884b4b4", + "metadata": {}, + "source": [ + "How about just the IBNR?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5fad3aa0-03bc-4f84-a8b7-1a00dbdebe8d", + "metadata": {}, + "outputs": [], + "source": [ + "cl_mod.__fill_in_code__" + ] + }, + { + "cell_type": "markdown", + "id": "70d8c018-21ca-4f2c-a764-433e310bb44a", + "metadata": {}, + "source": [ + "Let's fit an Expected Loss model, with an aprior of 90% on Premium, and get its ultimates." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22eba9fa-1890-4f6f-8a10-281142d2d58d", + "metadata": {}, + "outputs": [], + "source": [ + "cl.ExpectedLoss(apriori=__fill_in_code__).fit(\n", + " xyz_tri[\"Incurred\"], sample_weight=xyz_tri[\"Premium\"].latest_diagonal\n", + ").ultimate_" + ] + }, + { + "cell_type": "markdown", + "id": "eb20b72a-4e49-4eaa-b8e8-d3801833e2d3", + "metadata": {}, + "source": [ + "Try it on the Paid triangle, do you get the same ultimate?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "411f48b0-8b86-4175-80f2-f5f4a19e6c46", + "metadata": {}, + "outputs": [], + "source": [ + "cl.ExpectedLoss(apriori=0.90).fit(\n", + " xyz_tri[\"Paid\"], sample_weight=__fill_in_code__\n", + ").ultimate_" + ] + }, + { + "cell_type": "markdown", + "id": "fb1d7eda-f4c6-4990-9488-47235492001a", + "metadata": {}, + "source": [ + "How about a Bornhuetter-Ferguson model?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d66c7c9a-71eb-4d56-beea-f275da062fc0", + "metadata": {}, + "outputs": [], + "source": [ + "cl.__fill_in_code__(apriori=0.90).fit(\n", + " xyz_tri[\"Incurred\"], sample_weight=xyz_tri[\"Premium\"].latest_diagonal\n", + ").ultimate_" + ] + }, + { + "cell_type": "markdown", + "id": "5564ead9-d059-4d2c-839a-f988238e50ee", + "metadata": {}, + "source": [ + "How about Benktander, with 1 iteration, which is the same as BF?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d504e48d-1f5d-4fd6-975b-155235ffb577", + "metadata": {}, + "outputs": [], + "source": [ + "cl.__fill_in_code__(apriori=0.90, n_iters=__fill_in_code__).fit(\n", + " xyz_tri[\"Incurred\"], sample_weight=xyz_tri[\"Premium\"].latest_diagonal\n", + ").ultimate_" + ] + }, + { + "cell_type": "markdown", + "id": "002a76c2-7989-46ba-954b-d84c09b4675a", + "metadata": {}, + "source": [ + "How about Cape Cod?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7089ea42-ad28-4edc-9e83-723a7bc25443", + "metadata": {}, + "outputs": [], + "source": [ + "cl.__fill_in_code__().fit(\n", + " xyz_tri[\"Incurred\"], sample_weight=xyz_tri[\"Premium\"].latest_diagonal\n", + ").ultimate_" + ] + }, + { + "cell_type": "markdown", + "id": "5a0d73a2-0e05-4be2-91f0-9ef1ef56a7be", + "metadata": {}, + "source": [ + "Let's store the Cape Cod model as `cc_result`. We can also use `.to_frame()` to leave `chainladder` and go to a `DataFrame`. Let's make a bar chart over origin years to see what they look like." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f2cd9f8c-454d-4b9f-b936-a2f39e8fefde", + "metadata": {}, + "outputs": [], + "source": [ + "cc_result = (\n", + " cl.CapeCod()\n", + " .fit(xyz_tri[\"Incurred\"], sample_weight=xyz_tri[\"Premium\"].latest_diagonal)\n", + " .ultimate_\n", + ").to_frame()\n", + "\n", + "plt.plot(\n", + " cc_result.index.year,\n", + " cc_result[__fill_in_code__]\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "3f9e62f8-225b-4046-8847-a6e8d971e14d", + "metadata": {}, + "source": [ + "# Stochastic Models" + ] + }, + { + "cell_type": "markdown", + "id": "36105614-e317-4a87-a42d-282f59b1d339", + "metadata": {}, + "source": [ + "The Mack's Chainladder model is available. Let's use it on the Incurred triangle." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e008ebdb-243d-4ed0-9256-86331df1070a", + "metadata": {}, + "outputs": [], + "source": [ + "mcl_mod = cl.__fill_in_code__().fit(__fill_in_code__)\n", + "mcl_mod" + ] + }, + { + "cell_type": "markdown", + "id": "3298c63c-5356-4d69-afa3-058b68daf777", + "metadata": {}, + "source": [ + "There are many attributes that are available, such as `full_std_err_`, `total_process_risk_`, `total_parameter_risk_`, `mack_std_err_` and `total_mack_std_err_`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "67f5d99b-7a5e-4640-a6e0-f8b654e6ce27", + "metadata": {}, + "outputs": [], + "source": [ + "__fill_in_code__.full_std_err_" + ] + }, + { + "cell_type": "markdown", + "id": "bdb08c81-5921-4c41-ad63-96168ffd48b7", + "metadata": {}, + "source": [ + "MackChainladder also has a `summary_` attribute." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "81fc38c1-d5b7-4262-94ae-bce5c7ac17e1", + "metadata": {}, + "outputs": [], + "source": [ + "__fill_in_code__.summary_" + ] + }, + { + "cell_type": "markdown", + "id": "0e285585-62b6-48e4-8b1d-c5824ae5df46", + "metadata": {}, + "source": [ + "Let's make a graph, that shows the Reported and IBNR as stacked bars, and error bars showing Mack Standard Errors." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e615b86e-a907-4445-9e95-645090719f76", + "metadata": {}, + "outputs": [], + "source": [ + "plt.bar(\n", + " mcl_mod.summary_.to_frame(origin_as_datetime=True).index.year,\n", + " mcl_mod.summary_.to_frame(origin_as_datetime=True)[__fill_in_code__],\n", + " label=\"Reported\",\n", + ")\n", + "plt.bar(\n", + " mcl_mod.summary_.to_frame(origin_as_datetime=True).index.year,\n", + " mcl_mod.summary_.to_frame(origin_as_datetime=True)[__fill_in_code__],\n", + " bottom=mcl_mod.summary_.to_frame(origin_as_datetime=True)[__fill_in_code__],\n", + " yerr=mcl_mod.summary_.to_frame(origin_as_datetime=True)[__fill_in_code__],\n", + " label=\"IBNR\",\n", + ")\n", + "plt.legend(loc=\"upper left\")" + ] + }, + { + "cell_type": "markdown", + "id": "785120ad-03cf-48a7-90d8-d1d56a75ef88", + "metadata": {}, + "source": [ + "ODP Bootstrap is also available. Let's build sample 10,000 Incurred triangles." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "859e19f3-d526-435c-a845-4845a7a3956d", + "metadata": {}, + "outputs": [], + "source": [ + "xyz_tri_sampled = (\n", + " cl.BootstrapODPSample(n_sims=__fill_in_code__).fit(__fill_in_code__).resampled_triangles_\n", + ")\n", + "xyz_tri_sampled" + ] + }, + { + "cell_type": "markdown", + "id": "4391f730-5309-49b2-9c19-0801e3e66c7c", + "metadata": {}, + "source": [ + "We can fit a basic chainladder to all sampled triangles. We now have 10,000 simulated chainladder models, all (most) with unique LDFs." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fe6dbe70-1b2a-4fb0-aa6b-56380534704f", + "metadata": {}, + "outputs": [], + "source": [ + "cl_mod_bootstrapped = cl.Chainladder().fit(xyz_tri_sampled)\n", + "cl_mod_bootstrapped" + ] + }, + { + "cell_type": "markdown", + "id": "bb3d7c32-9e75-4ae4-ab23-0ca3f2a436b5", + "metadata": {}, + "source": [ + "Let's make another graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "edeba1db-97e6-43df-b1c0-590c2d7cd098", + "metadata": {}, + "outputs": [], + "source": [ + "plt.bar(\n", + " cl_mod_bootstrapped.ultimate_.__fill_in_code__.to_frame(origin_as_datetime=True).index.year,\n", + " cl_mod_bootstrapped.ultimate_.__fill_in_code__.to_frame(origin_as_datetime=True)[\"2261\"],\n", + " yerr=cl_mod_bootstrapped.ultimate_.__fill_in_code__.to_frame(origin_as_datetime=True)[\"2261\"],\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.17" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/getting_started/online_sandbox/sandbox_workbook_filled.ipynb b/docs/getting_started/online_sandbox/sandbox_workbook_filled.ipynb index 13f7f16f..bee7f7e0 100644 --- a/docs/getting_started/online_sandbox/sandbox_workbook_filled.ipynb +++ b/docs/getting_started/online_sandbox/sandbox_workbook_filled.ipynb @@ -23,7 +23,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "be51a379-5efe-420e-b689-3bf93b96ebc8", "metadata": {}, "outputs": [ @@ -53,13 +53,9 @@ "Requirement already satisfied: packaging>=20.0 in /Users/kennethhsu/opt/anaconda3/lib/python3.9/site-packages (from matplotlib->chainladder) (23.1)\n", "Requirement already satisfied: pillow>=6.2.0 in /Users/kennethhsu/opt/anaconda3/lib/python3.9/site-packages (from matplotlib->chainladder) (9.3.0)\n", "Requirement already satisfied: pyparsing>=2.2.1 in /Users/kennethhsu/opt/anaconda3/lib/python3.9/site-packages (from matplotlib->chainladder) (3.0.9)\n", -<<<<<<< HEAD - "Requirement already satisfied: six in /Users/kennethhsu/opt/anaconda3/lib/python3.9/site-packages (from patsy->chainladder) (1.16.0)\n" -======= "Requirement already satisfied: six in /Users/kennethhsu/opt/anaconda3/lib/python3.9/site-packages (from patsy->chainladder) (1.16.0)\n", "\u001b[33mDEPRECATION: nb-black 1.0.7 has a non-standard dependency specifier black>='19.3'; python_version >= \"3.6\". pip 23.3 will enforce this behaviour change. A possible replacement is to upgrade to a newer version of nb-black or contact the author to suggest that they release a version with a conforming dependency specifiers. Discussion can be found at https://github.com/pypa/pip/issues/12063\u001b[0m\u001b[33m\n", "\u001b[0mNote: you may need to restart the kernel to use updated packages.\n" ->>>>>>> c23481473ff4beacbcca9e4b5243e2f78b4b5b08 ] } ], @@ -77,7 +73,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "882cc191-5849-471e-8e13-65fdf3e01419", "metadata": {}, "outputs": [], @@ -95,12 +91,9 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "03fdf8fd-ecd1-4df4-b9cf-a4bf01d978f0", "metadata": {}, -<<<<<<< HEAD - "outputs": [], -======= "outputs": [ { "name": "stdout", @@ -112,7 +105,6 @@ ] } ], ->>>>>>> c23481473ff4beacbcca9e4b5243e2f78b4b5b08 "source": [ "import numpy as np\n", "import pandas as pd\n", @@ -142,12 +134,111 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "aa2c95b8-86b4-4846-b950-12c402477ec1", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AccidentYearDevelopmentYearIncurredPaidReportedClosedPremium
020022002128112318134220361183
12003200396511743137318169175
220042004169952221193223599322
3200520052867430432067295138151
4200620062706635311473307107578
\n", + "
" + ], + "text/plain": [ + " AccidentYear DevelopmentYear Incurred Paid Reported Closed Premium\n", + "0 2002 2002 12811 2318 1342 203 61183\n", + "1 2003 2003 9651 1743 1373 181 69175\n", + "2 2004 2004 16995 2221 1932 235 99322\n", + "3 2005 2005 28674 3043 2067 295 138151\n", + "4 2006 2006 27066 3531 1473 307 107578" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "xyz_df = pd.read_csv(\n", " \"https://raw.githubusercontent.com/casact/chainladder-python/master/chainladder/utils/data/xyz.csv\"\n", @@ -165,10 +256,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "4c11052c-291e-439f-ac0f-6736bb2b0b68", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([2002, 2003, 2004, 2005, 2006, 2007, 2008, 1998, 1999, 2000, 2001])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "xyz_df[\"AccidentYear\"].unique()" ] @@ -183,10 +285,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "cfeca5a6-366f-4abb-b3e9-51c91e7b9336", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "11" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "xyz_df[\"AccidentYear\"].nunique()" ] @@ -209,10 +322,58 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "2b51e0b6-c1d3-4976-8866-4800b15d27ec", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Triangle Summary
Valuation:2008-12
Grain:OYDY
Shape:(1, 5, 11, 11)
Index:[Total]
Columns:[Incurred, Paid, Reported, Closed, Premium]
" + ], + "text/plain": [ + " Triangle Summary\n", + "Valuation: 2008-12\n", + "Grain: OYDY\n", + "Shape: (1, 5, 11, 11)\n", + "Index: [Total]\n", + "Columns: [Incurred, Paid, Reported, Closed, Premium]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "xyz_tri = cl.Triangle(\n", " data=xyz_df,\n", @@ -234,102 +395,9 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "fe9309fe-2744-4e4d-beff-0a36c1182386", "metadata": {}, - "outputs": [], - "source": [ - "xyz_tri[\"Incurred\"]" - ] - }, - { - "cell_type": "markdown", - "id": "ed9811e6-5761-4258-9942-19a620540361", - "metadata": {}, - "source": [ - "How about paid?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "278856cf-6d84-4fa6-ac57-4f57755580b8", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_tri[\"Paid\"]" - ] - }, - { - "cell_type": "markdown", - "id": "04114ff8-107a-4c56-ab9a-8c36f53553df", - "metadata": {}, - "source": [ - "# Pandas-like Operations" - ] - }, - { - "cell_type": "markdown", - "id": "433b8ae8-1968-4dfc-a176-c8a8c93c5f97", - "metadata": {}, - "source": [ - "Let's see how `.iloc[...]` and `.loc[...]` similarly to pandas. They take 4 parameters: [index, column, origin, valuation]." - ] - }, - { - "cell_type": "markdown", - "id": "f0452527-796d-4185-929a-97241329b377", - "metadata": {}, - "source": [ - "What if we want the row from AY 1998 Incurred data?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a13a157b-3fe9-4254-bc72-11d4e1705f29", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_tri.iloc[:, 0, 0, :]" - ] - }, - { - "cell_type": "markdown", - "id": "08b8557c-66fe-4a25-a8bf-5413ca1c1fbb", - "metadata": {}, - "source": [ - "What if you only want the valuation at age 60 of AY 1998?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fb20eda1-4e4a-431d-8c8a-21cc87b8c472", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_tri.iloc[:, 0, 0, 4]" - ] - }, - { - "cell_type": "markdown", - "id": "56683ffb-01ef-4e18-ba27-1b8ab31b9ae7", - "metadata": {}, - "source": [ - "Let's use `.loc[...]` to get the incurred triangle." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b8116ded-c788-483c-b2af-fde45b72ee4a", - "metadata": { - "tags": [] - }, -<<<<<<< HEAD - "outputs": [], -======= "outputs": [ { "data": { @@ -524,280 +592,128 @@ "2008 18632.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN" ] }, - "execution_count": 12, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], ->>>>>>> c23481473ff4beacbcca9e4b5243e2f78b4b5b08 - "source": [ - "xyz_tri.loc[:, \"Incurred\", :, :]" - ] - }, - { - "cell_type": "markdown", - "id": "c9d515b7-c9a3-4045-ad79-78af1574be8a", - "metadata": {}, - "source": [ - "How do we get the latest Incurred diagonal only?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5bce08b8-bf34-418e-ac3b-db253db44898", - "metadata": {}, - "outputs": [], "source": [ - "xyz_tri[\"Incurred\"].latest_diagonal" - ] - }, - { - "cell_type": "markdown", - "id": "31b56210-cbcd-4bbb-af9f-063a3788867a", - "metadata": {}, - "source": [ - "Very often, we want incremental triangles instead. Let's convert the Incurred triangle to the incremental form." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b2766e7b-b1e6-4574-bfa7-fd70ccd556d7", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_tri[\"Incurred\"].cum_to_incr()" - ] - }, - { - "cell_type": "markdown", - "id": "6235668f-9025-4108-b987-f867f93c8ce6", - "metadata": {}, - "source": [ - "We can also convert the triangle to the valuation format, what we often see on Schedule Ps." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "72487c9a-4438-4ab7-8a24-245485d4c637", - "metadata": {}, - "outputs": [], - "source": [ - "xyz_tri[\"Incurred\"].dev_to_val()" + "xyz_tri[\"Incurred\"]" ] }, { "cell_type": "markdown", - "id": "6e404747-8e22-42c0-a1b5-45c95d702730", + "id": "ed9811e6-5761-4258-9942-19a620540361", "metadata": {}, "source": [ - "Another function that is often useful is the `.heatmap()` method. Let's inspect the incurred amount and see if there are trends." + "How about paid?" ] }, { "cell_type": "code", - "execution_count": null, - "id": "f20ed887-e5b1-40f7-81b5-14bd840cca23", + "execution_count": 9, + "id": "278856cf-6d84-4fa6-ac57-4f57755580b8", "metadata": {}, -<<<<<<< HEAD - "outputs": [], -======= "outputs": [ { "data": { "text/html": [ - "\n", - "\n", + "
\n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -805,12 +721,12 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -819,11 +735,11 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -833,10 +749,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -847,9 +763,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -861,8 +777,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -875,259 +791,2016 @@ " \n", " \n", " \n", - "
 1224364860728496108120132
1224364860728496108120132
1998199811,17112,38013,21614,06714,68816,36616,16315,83515,8226,3098,52110,08211,62013,24214,41915,31115,76415,822
1999199913,25516,40519,63922,47323,76425,09424,79525,07125,1074,6669,86113,97118,12722,03223,51124,14624,59224,817
200015,67618,74921,90027,14429,48834,45836,94937,50537,24620001,3026,51312,13917,82824,03028,85333,22235,90236,782
200111,82716,00421,02226,57834,20537,13638,54138,79820011,5395,95212,31918,60924,38731,09037,07038,519
200212,81120,37026,65637,66744,41448,70148,16920022,3187,93213,82222,09531,94540,62944,437
20039,65116,99530,35440,59444,23144,37320031,7436,24012,68322,89234,50539,320
200416,99540,18058,86671,70770,28820042,2219,89825,95043,43952,811
200528,67447,43270,34070,65520053,04312,21927,07340,026
200627,06646,78348,80420063,53111,77822,819
200719,47731,73220073,52911,865
200818,63220083,409
\n" + "" ], "text/plain": [ - "" + " 12 24 36 48 60 72 84 96 108 120 132\n", + "1998 NaN NaN 6309.0 8521.0 10082.0 11620.0 13242.0 14419.0 15311.0 15764.0 15822.0\n", + "1999 NaN 4666.0 9861.0 13971.0 18127.0 22032.0 23511.0 24146.0 24592.0 24817.0 NaN\n", + "2000 1302.0 6513.0 12139.0 17828.0 24030.0 28853.0 33222.0 35902.0 36782.0 NaN NaN\n", + "2001 1539.0 5952.0 12319.0 18609.0 24387.0 31090.0 37070.0 38519.0 NaN NaN NaN\n", + "2002 2318.0 7932.0 13822.0 22095.0 31945.0 40629.0 44437.0 NaN NaN NaN NaN\n", + "2003 1743.0 6240.0 12683.0 22892.0 34505.0 39320.0 NaN NaN NaN NaN NaN\n", + "2004 2221.0 9898.0 25950.0 43439.0 52811.0 NaN NaN NaN NaN NaN NaN\n", + "2005 3043.0 12219.0 27073.0 40026.0 NaN NaN NaN NaN NaN NaN NaN\n", + "2006 3531.0 11778.0 22819.0 NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2007 3529.0 11865.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2008 3409.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN" ] }, - "execution_count": 16, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], ->>>>>>> c23481473ff4beacbcca9e4b5243e2f78b4b5b08 "source": [ - "xyz_tri[\"Incurred\"].heatmap()" + "xyz_tri[\"Paid\"]" ] }, { "cell_type": "markdown", - "id": "27d110d2-ee73-4bb5-a411-3d27c0dd7673", + "id": "04114ff8-107a-4c56-ab9a-8c36f53553df", "metadata": {}, "source": [ - "# Development" + "# Pandas-like Operations" ] }, { "cell_type": "markdown", - "id": "a0d0950f-bec7-406d-b253-4cf1bfd925dd", + "id": "433b8ae8-1968-4dfc-a176-c8a8c93c5f97", "metadata": {}, "source": [ - "How can we get the incurred link ratios?" + "Let's see how `.iloc[...]` and `.loc[...]` similarly to pandas. They take 4 parameters: [index, column, origin, valuation]." + ] + }, + { + "cell_type": "markdown", + "id": "f0452527-796d-4185-929a-97241329b377", + "metadata": {}, + "source": [ + "What if we want the row from AY 1998 Incurred data?" ] }, { "cell_type": "code", - "execution_count": null, - "id": "ec16d0fd-ac17-4280-aabf-ad5795114d5f", + "execution_count": 10, + "id": "a13a157b-3fe9-4254-bc72-11d4e1705f29", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496108120132
199811,17112,38013,21614,06714,68816,36616,16315,83515,822
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96 108 120 132\n", + "1998 NaN NaN 11171.0 12380.0 13216.0 14067.0 14688.0 16366.0 16163.0 15835.0 15822.0" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "xyz_tri[\"Incurred\"].link_ratio" + "xyz_tri.iloc[:, 0, 0, :]" ] }, { "cell_type": "markdown", - "id": "c74c5352-a95b-4403-8322-962ded312e39", + "id": "08b8557c-66fe-4a25-a8bf-5413ca1c1fbb", "metadata": {}, "source": [ - "We can also apply a `.heatmap()` to make it too, to help us visulize the highs and lows." + "What if you only want the valuation at age 60 of AY 1998?" ] }, { "cell_type": "code", - "execution_count": null, - "id": "172c70be-2324-472f-b89c-29963695179a", + "execution_count": 11, + "id": "fb20eda1-4e4a-431d-8c8a-21cc87b8c472", "metadata": {}, -<<<<<<< HEAD - "outputs": [], -======= "outputs": [ { "data": { "text/html": [ - "\n", - "\n", + "
\n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + "
 12-2424-3636-4848-6060-7272-8484-9696-108108-120120-132
60
19981.10821.06751.06441.04411.11420.98760.97970.9992
19991.23761.19711.14431.05741.05600.98811.01111.0014
20001.19601.16811.23951.08641.16851.07231.01500.9931
20011.35321.31351.26431.28701.08571.03781.0067
20021.59001.30861.41311.17911.09650.9891
20031.76101.78611.33741.08961.0032199813,216
20042.36421.46511.21810.9802
" + ], + "text/plain": [ + " 60\n", + "1998 13216.0" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "xyz_tri.iloc[:, 0, 0, 4]" + ] + }, + { + "cell_type": "markdown", + "id": "56683ffb-01ef-4e18-ba27-1b8ab31b9ae7", + "metadata": {}, + "source": [ + "Let's use `.loc[...]` to get the incurred triangle." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "b8116ded-c788-483c-b2af-fde45b72ee4a", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496108120132
199811,17112,38013,21614,06714,68816,36616,16315,83515,822
199913,25516,40519,63922,47323,76425,09424,79525,07125,107
200015,67618,74921,90027,14429,48834,45836,94937,50537,246
200111,82716,00421,02226,57834,20537,13638,54138,798
200212,81120,37026,65637,66744,41448,70148,169
20039,65116,99530,35440,59444,23144,373
200416,99540,18058,86671,70770,288
200528,67447,43270,34070,655
200627,06646,78348,804
200719,47731,732
200818,632
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96 108 120 132\n", + "1998 NaN NaN 11171.0 12380.0 13216.0 14067.0 14688.0 16366.0 16163.0 15835.0 15822.0\n", + "1999 NaN 13255.0 16405.0 19639.0 22473.0 23764.0 25094.0 24795.0 25071.0 25107.0 NaN\n", + "2000 15676.0 18749.0 21900.0 27144.0 29488.0 34458.0 36949.0 37505.0 37246.0 NaN NaN\n", + "2001 11827.0 16004.0 21022.0 26578.0 34205.0 37136.0 38541.0 38798.0 NaN NaN NaN\n", + "2002 12811.0 20370.0 26656.0 37667.0 44414.0 48701.0 48169.0 NaN NaN NaN NaN\n", + "2003 9651.0 16995.0 30354.0 40594.0 44231.0 44373.0 NaN NaN NaN NaN NaN\n", + "2004 16995.0 40180.0 58866.0 71707.0 70288.0 NaN NaN NaN NaN NaN NaN\n", + "2005 28674.0 47432.0 70340.0 70655.0 NaN NaN NaN NaN NaN NaN NaN\n", + "2006 27066.0 46783.0 48804.0 NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2007 19477.0 31732.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2008 18632.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "xyz_tri.loc[:, \"Incurred\", :, :]" + ] + }, + { + "cell_type": "markdown", + "id": "c9d515b7-c9a3-4045-ad79-78af1574be8a", + "metadata": {}, + "source": [ + "How do we get the latest Incurred diagonal only?" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "5bce08b8-bf34-418e-ac3b-db253db44898", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
2008
199815,822
199925,107
200037,246
200138,798
200248,169
200344,373
200470,288
200570,655
200648,804
200731,732
200818,632
" + ], + "text/plain": [ + " 2008\n", + "1998 15822.0\n", + "1999 25107.0\n", + "2000 37246.0\n", + "2001 38798.0\n", + "2002 48169.0\n", + "2003 44373.0\n", + "2004 70288.0\n", + "2005 70655.0\n", + "2006 48804.0\n", + "2007 31732.0\n", + "2008 18632.0" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "xyz_tri[\"Incurred\"].latest_diagonal" + ] + }, + { + "cell_type": "markdown", + "id": "31b56210-cbcd-4bbb-af9f-063a3788867a", + "metadata": {}, + "source": [ + "Very often, we want incremental triangles instead. Let's convert the Incurred triangle to the incremental form." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "b2766e7b-b1e6-4574-bfa7-fd70ccd556d7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496108120132
199811,1711,2098368516211,678-203-328-13
199913,2553,1503,2342,8341,2911,330-29927636
200015,6763,0733,1515,2442,3444,9702,491556-259
200111,8274,1775,0185,5567,6272,9311,405257
200212,8117,5596,28611,0116,7474,287-532
20039,6517,34413,35910,2403,637142
200416,99523,18518,68612,841-1,419
200528,67418,75822,908315
200627,06619,7172,021
200719,47712,255
200818,632
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96 108 120 132\n", + "1998 NaN NaN 11171.0 1209.0 836.0 851.0 621.0 1678.0 -203.0 -328.0 -13.0\n", + "1999 NaN 13255.0 3150.0 3234.0 2834.0 1291.0 1330.0 -299.0 276.0 36.0 NaN\n", + "2000 15676.0 3073.0 3151.0 5244.0 2344.0 4970.0 2491.0 556.0 -259.0 NaN NaN\n", + "2001 11827.0 4177.0 5018.0 5556.0 7627.0 2931.0 1405.0 257.0 NaN NaN NaN\n", + "2002 12811.0 7559.0 6286.0 11011.0 6747.0 4287.0 -532.0 NaN NaN NaN NaN\n", + "2003 9651.0 7344.0 13359.0 10240.0 3637.0 142.0 NaN NaN NaN NaN NaN\n", + "2004 16995.0 23185.0 18686.0 12841.0 -1419.0 NaN NaN NaN NaN NaN NaN\n", + "2005 28674.0 18758.0 22908.0 315.0 NaN NaN NaN NaN NaN NaN NaN\n", + "2006 27066.0 19717.0 2021.0 NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2007 19477.0 12255.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2008 18632.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "xyz_tri[\"Incurred\"].cum_to_incr()" + ] + }, + { + "cell_type": "markdown", + "id": "6235668f-9025-4108-b987-f867f93c8ce6", + "metadata": {}, + "source": [ + "We can also convert the triangle to the valuation format, what we often see on Schedule Ps." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "72487c9a-4438-4ab7-8a24-245485d4c637", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
19981999200020012002200320042005200620072008
199811,17112,38013,21614,06714,68816,36616,16315,83515,822
199913,25516,40519,63922,47323,76425,09424,79525,07125,107
200015,67618,74921,90027,14429,48834,45836,94937,50537,246
200111,82716,00421,02226,57834,20537,13638,54138,798
200212,81120,37026,65637,66744,41448,70148,169
20039,65116,99530,35440,59444,23144,373
200416,99540,18058,86671,70770,288
200528,67447,43270,34070,655
200627,06646,78348,804
200719,47731,732
200818,632
" + ], + "text/plain": [ + " 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008\n", + "1998 NaN NaN 11171.0 12380.0 13216.0 14067.0 14688.0 16366.0 16163.0 15835.0 15822.0\n", + "1999 NaN NaN 13255.0 16405.0 19639.0 22473.0 23764.0 25094.0 24795.0 25071.0 25107.0\n", + "2000 NaN NaN 15676.0 18749.0 21900.0 27144.0 29488.0 34458.0 36949.0 37505.0 37246.0\n", + "2001 NaN NaN NaN 11827.0 16004.0 21022.0 26578.0 34205.0 37136.0 38541.0 38798.0\n", + "2002 NaN NaN NaN NaN 12811.0 20370.0 26656.0 37667.0 44414.0 48701.0 48169.0\n", + "2003 NaN NaN NaN NaN NaN 9651.0 16995.0 30354.0 40594.0 44231.0 44373.0\n", + "2004 NaN NaN NaN NaN NaN NaN 16995.0 40180.0 58866.0 71707.0 70288.0\n", + "2005 NaN NaN NaN NaN NaN NaN NaN 28674.0 47432.0 70340.0 70655.0\n", + "2006 NaN NaN NaN NaN NaN NaN NaN NaN 27066.0 46783.0 48804.0\n", + "2007 NaN NaN NaN NaN NaN NaN NaN NaN NaN 19477.0 31732.0\n", + "2008 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 18632.0" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "xyz_tri[\"Incurred\"].dev_to_val()" + ] + }, + { + "cell_type": "markdown", + "id": "6e404747-8e22-42c0-a1b5-45c95d702730", + "metadata": {}, + "source": [ + "Another function that is often useful is the `.heatmap()` method. Let's inspect the incurred amount and see if there are trends." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "f20ed887-e5b1-40f7-81b5-14bd840cca23", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 1224364860728496108120132
199811,17112,38013,21614,06714,68816,36616,16315,83515,822
199913,25516,40519,63922,47323,76425,09424,79525,07125,107
200015,67618,74921,90027,14429,48834,45836,94937,50537,246
200111,82716,00421,02226,57834,20537,13638,54138,798
200212,81120,37026,65637,66744,41448,70148,169
20039,65116,99530,35440,59444,23144,373
200416,99540,18058,86671,70770,288
200528,67447,43270,34070,655
200627,06646,78348,804
200719,47731,732
200818,632
\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "xyz_tri[\"Incurred\"].heatmap()" + ] + }, + { + "cell_type": "markdown", + "id": "27d110d2-ee73-4bb5-a411-3d27c0dd7673", + "metadata": {}, + "source": [ + "# Development" + ] + }, + { + "cell_type": "markdown", + "id": "a0d0950f-bec7-406d-b253-4cf1bfd925dd", + "metadata": {}, + "source": [ + "How can we get the incurred link ratios?" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "ec16d0fd-ac17-4280-aabf-ad5795114d5f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120120-132
19981.10821.06751.06441.04411.11420.98760.97970.9992
19991.23761.19711.14431.05741.05600.98811.01111.0014
20001.19601.16811.23951.08641.16851.07231.01500.9931
20011.35321.31351.26431.28701.08571.03781.0067
20021.59001.30861.41311.17911.09650.9891
20031.76101.78611.33741.08961.0032
20042.36421.46511.21810.9802
20051.65421.48301.0045
20061.72851.0432
20071.6292
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120 120-132\n", + "1998 NaN NaN 1.108227 1.067528 1.064392 1.044146 1.114243 0.987596 0.979707 0.999179\n", + "1999 NaN 1.237646 1.197135 1.144305 1.057447 1.055967 0.988085 1.011131 1.001436 NaN\n", + "2000 1.196032 1.168062 1.239452 1.086354 1.168543 1.072291 1.015048 0.993094 NaN NaN\n", + "2001 1.353175 1.313547 1.264295 1.286967 1.085689 1.037834 1.006668 NaN NaN NaN\n", + "2002 1.590040 1.308591 1.413078 1.179122 1.096524 0.989076 NaN NaN NaN NaN\n", + "2003 1.760957 1.786055 1.337353 1.089595 1.003210 NaN NaN NaN NaN NaN\n", + "2004 2.364225 1.465057 1.218140 0.980211 NaN NaN NaN NaN NaN NaN\n", + "2005 1.654181 1.482965 1.004478 NaN NaN NaN NaN NaN NaN NaN\n", + "2006 1.728479 1.043199 NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2007 1.629204 NaN NaN NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "xyz_tri[\"Incurred\"].link_ratio" + ] + }, + { + "cell_type": "markdown", + "id": "c74c5352-a95b-4403-8322-962ded312e39", + "metadata": {}, + "source": [ + "We can also apply a `.heatmap()` to make it too, to help us visulize the highs and lows." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "172c70be-2324-472f-b89c-29963695179a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 12-2424-3636-4848-6060-7272-8484-9696-108108-120120-132
19981.10821.06751.06441.04411.11420.98760.97970.9992
19991.23761.19711.14431.05741.05600.98811.01111.0014
20001.19601.16811.23951.08641.16851.07231.01500.9931
20011.35321.31351.26431.28701.08571.03781.0067
20021.59001.30861.41311.17911.09650.9891
20031.76101.78611.33741.08961.0032
20042.36421.46511.21810.9802
20051.65421.48301.0045
20061.72851.0432
20071.6292
\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "xyz_tri[\"Incurred\"].link_ratio.heatmap()" + ] + }, + { + "cell_type": "markdown", + "id": "f5f212b0-3769-49cd-b7cc-b484f2877aa2", + "metadata": {}, + "source": [ + "Let's get a volume-weighted average LDFs for our Incurred triangle." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "ba0b96cb-77eb-472c-84fd-c5c8c5c11e10", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120120-132
(All)1.67571.33941.19341.09591.07701.03361.01900.99760.99290.9992
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120 120-132\n", + "(All) 1.675693 1.339353 1.193406 1.095906 1.076968 1.033612 1.019016 0.997636 0.992918 0.999179" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cl.Development(average=\"volume\").fit(xyz_tri[\"Incurred\"]).ldf_" + ] + }, + { + "cell_type": "markdown", + "id": "0c4baafd-e141-4566-a4ae-2f0a44ef828e", + "metadata": {}, + "source": [ + "How about the CDFs?" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "b156f84b-dd0d-49d6-8eec-070d0143f40c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-Ult24-Ult36-Ult48-Ult60-Ult72-Ult84-Ult96-Ult108-Ult120-Ult
(All)3.29551.96661.46841.23041.12271.04251.00860.98980.99210.9992
" + ], + "text/plain": [ + " 12-Ult 24-Ult 36-Ult 48-Ult 60-Ult 72-Ult 84-Ult 96-Ult 108-Ult 120-Ult\n", + "(All) 3.295501 1.96665 1.468358 1.230392 1.122717 1.042479 1.008579 0.989758 0.992103 0.999179" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cl.Development(average=\"volume\").fit(xyz_tri[\"Incurred\"]).cdf_" + ] + }, + { + "cell_type": "markdown", + "id": "d51e5664-3106-41d1-b77f-8afa9ee94ff7", + "metadata": {}, + "source": [ + "We can also use only the latest 3 periods in the calculation of CDFs." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "de88fdad-5d89-4cc2-adb0-bbeb7c77bbcb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-Ult24-Ult36-Ult48-Ult60-Ult72-Ult84-Ult96-Ult108-Ult120-Ult
(All)2.92121.74461.31711.14871.08391.02260.99480.98980.99210.9992
" + ], + "text/plain": [ + " 12-Ult 24-Ult 36-Ult 48-Ult 60-Ult 72-Ult 84-Ult 96-Ult 108-Ult 120-Ult\n", + "(All) 2.921198 1.744573 1.317128 1.148697 1.083902 1.022635 0.994815 0.989758 0.992103 0.999179" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cl.Development(average=\"volume\", n_periods=3).fit(xyz_tri[\"Incurred\"]).cdf_" + ] + }, + { + "cell_type": "markdown", + "id": "b018bae9-6070-4795-8af6-b5e196aa1af1", + "metadata": {}, + "source": [ + "# Deterministic Models" + ] + }, + { + "cell_type": "markdown", + "id": "e7c7b88e-205d-45c8-b9e6-4586f29041a4", + "metadata": {}, + "source": [ + "Before we can build any models, we need to use `fit_transform()`, so that the object is actually modified with our selected development pattern(s).\n", + "\n", + "Set the development of the triangle to use only 3 periods." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "9e5136d2-0c3c-44da-8440-57ca3cfbbb9d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1137,9 +2810,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1150,8 +2824,9 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1163,102 +2838,30 @@ " \n", " \n", " \n", - "
1224364860728496108120132
199811,17112,38013,21614,06714,68816,36616,16315,83515,822
199913,25516,40519,63922,47323,76425,09424,79525,07125,107
200015,67618,74921,90027,14429,48834,45836,94937,50537,246
200111,82716,00421,02226,57834,20537,13638,54138,798
200212,81120,37026,65637,66744,41448,70148,169
20039,65116,99530,35440,59444,23144,373
200416,99540,18058,86671,70770,288
200528,67447,43270,34070,655
20051.65421.48301.0045200627,06646,78348,804
20061.72851.0432200719,47731,732
20071.6292200818,632
\n" + "" ], "text/plain": [ - "" + " 12 24 36 48 60 72 84 96 108 120 132\n", + "1998 NaN NaN 11171.0 12380.0 13216.0 14067.0 14688.0 16366.0 16163.0 15835.0 15822.0\n", + "1999 NaN 13255.0 16405.0 19639.0 22473.0 23764.0 25094.0 24795.0 25071.0 25107.0 NaN\n", + "2000 15676.0 18749.0 21900.0 27144.0 29488.0 34458.0 36949.0 37505.0 37246.0 NaN NaN\n", + "2001 11827.0 16004.0 21022.0 26578.0 34205.0 37136.0 38541.0 38798.0 NaN NaN NaN\n", + "2002 12811.0 20370.0 26656.0 37667.0 44414.0 48701.0 48169.0 NaN NaN NaN NaN\n", + "2003 9651.0 16995.0 30354.0 40594.0 44231.0 44373.0 NaN NaN NaN NaN NaN\n", + "2004 16995.0 40180.0 58866.0 71707.0 70288.0 NaN NaN NaN NaN NaN NaN\n", + "2005 28674.0 47432.0 70340.0 70655.0 NaN NaN NaN NaN NaN NaN NaN\n", + "2006 27066.0 46783.0 48804.0 NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2007 19477.0 31732.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2008 18632.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN" ] }, - "execution_count": 18, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], ->>>>>>> c23481473ff4beacbcca9e4b5243e2f78b4b5b08 - "source": [ - "xyz_tri[\"Incurred\"].link_ratio.heatmap()" - ] - }, - { - "cell_type": "markdown", - "id": "f5f212b0-3769-49cd-b7cc-b484f2877aa2", - "metadata": {}, - "source": [ - "Let's get a volume-weighted average LDFs for our Incurred triangle." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ba0b96cb-77eb-472c-84fd-c5c8c5c11e10", - "metadata": {}, - "outputs": [], - "source": [ - "cl.Development(average=\"volume\").fit(xyz_tri[\"Incurred\"]).ldf_" - ] - }, - { - "cell_type": "markdown", - "id": "0c4baafd-e141-4566-a4ae-2f0a44ef828e", - "metadata": {}, - "source": [ - "How about the CDFs?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b156f84b-dd0d-49d6-8eec-070d0143f40c", - "metadata": {}, - "outputs": [], - "source": [ - "cl.Development(average=\"volume\").fit(xyz_tri[\"Incurred\"]).cdf_" - ] - }, - { - "cell_type": "markdown", - "id": "d51e5664-3106-41d1-b77f-8afa9ee94ff7", - "metadata": {}, - "source": [ - "We can also use only the latest 3 periods in the calculation of CDFs." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "de88fdad-5d89-4cc2-adb0-bbeb7c77bbcb", - "metadata": {}, - "outputs": [], - "source": [ - "cl.Development(average=\"volume\", n_periods=3).fit(xyz_tri[\"Incurred\"]).cdf_" - ] - }, - { - "cell_type": "markdown", - "id": "b018bae9-6070-4795-8af6-b5e196aa1af1", - "metadata": {}, - "source": [ - "# Deterministic Models" - ] - }, - { - "cell_type": "markdown", - "id": "e7c7b88e-205d-45c8-b9e6-4586f29041a4", - "metadata": {}, - "source": [ - "Before we can build any models, we need to use `fit_transform()`, so that the object is actually modified with our selected development pattern(s).\n", - "\n", - "Set the development of the triangle to use only 3 periods." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9e5136d2-0c3c-44da-8440-57ca3cfbbb9d", - "metadata": {}, - "outputs": [], "source": [ - "cl.Development(n_periods=3).fit_transform(xyz_tri[\"Incurred\"])" + "cl.Development(average=\"volume\", n_periods=3).fit_transform(xyz_tri[\"Incurred\"])" ] }, { @@ -1271,10 +2874,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "id": "022e22e9-92a8-427c-bf5c-cf352df1437c", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
Chainladder()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ], + "text/plain": [ + "Chainladder()" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "cl_mod = cl.Chainladder().fit(xyz_tri[\"Incurred\"])\n", "cl_mod" @@ -1290,10 +2907,88 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "id": "69f18923-73b1-4b80-9148-60a7bab5b118", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
2261
199815,822
199925,086
200036,952
200138,401
200248,582
200346,258
200478,914
200586,933
200671,662
200762,406
200861,402
" + ], + "text/plain": [ + " 2261\n", + "1998 15822.000000\n", + "1999 25086.388001\n", + "2000 36951.879990\n", + "2001 38400.613702\n", + "2002 48582.226476\n", + "2003 46257.941381\n", + "2004 78913.510138\n", + "2005 86933.374265\n", + "2006 71661.720703\n", + "2007 62405.722716\n", + "2008 61401.770743" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "cl_mod.ultimate_" ] @@ -1308,10 +3003,88 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "id": "5fad3aa0-03bc-4f84-a8b7-1a00dbdebe8d", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
2261
1998
1999-21
2000-294
2001-397
2002413
20031,885
20048,626
200516,278
200622,858
200730,674
200842,770
" + ], + "text/plain": [ + " 2261\n", + "1998 NaN\n", + "1999 -20.611999\n", + "2000 -294.120010\n", + "2001 -397.386298\n", + "2002 413.226476\n", + "2003 1884.941381\n", + "2004 8625.510138\n", + "2005 16278.374265\n", + "2006 22857.720703\n", + "2007 30673.722716\n", + "2008 42769.770743" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "cl_mod.ibnr_" ] @@ -1326,10 +3099,88 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "id": "22eba9fa-1890-4f6f-8a10-281142d2d58d", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
2261
199818,000
199928,350
200040,500
200145,000
200255,065
200362,258
200489,390
2005124,336
200696,820
200756,194
200843,017
" + ], + "text/plain": [ + " 2261\n", + "1998 18000.0\n", + "1999 28350.0\n", + "2000 40500.0\n", + "2001 45000.0\n", + "2002 55064.7\n", + "2003 62257.5\n", + "2004 89389.8\n", + "2005 124335.9\n", + "2006 96820.2\n", + "2007 56194.2\n", + "2008 43017.3" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "cl.ExpectedLoss(apriori=0.90).fit(\n", " xyz_tri[\"Incurred\"], sample_weight=xyz_tri[\"Premium\"].latest_diagonal\n", @@ -1346,10 +3197,88 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "id": "411f48b0-8b86-4175-80f2-f5f4a19e6c46", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
2261
199818,000
199928,350
200040,500
200145,000
200255,065
200362,258
200489,390
2005124,336
200696,820
200756,194
200843,017
" + ], + "text/plain": [ + " 2261\n", + "1998 18000.0\n", + "1999 28350.0\n", + "2000 40500.0\n", + "2001 45000.0\n", + "2002 55064.7\n", + "2003 62257.5\n", + "2004 89389.8\n", + "2005 124335.9\n", + "2006 96820.2\n", + "2007 56194.2\n", + "2008 43017.3" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "cl.ExpectedLoss(apriori=0.90).fit(\n", " xyz_tri[\"Paid\"], sample_weight=xyz_tri[\"Premium\"].latest_diagonal\n", @@ -1366,10 +3295,88 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "id": "d66c7c9a-71eb-4d56-beea-f275da062fc0", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
2261
199815,822
199925,084
200036,924
200138,332
200248,637
200346,910
200480,059
200593,937
200679,686
200759,353
200848,596
" + ], + "text/plain": [ + " 2261\n", + "1998 15822.000000\n", + "1999 25083.706485\n", + "2000 36923.638582\n", + "2001 38332.320375\n", + "2002 48637.364535\n", + "2003 46909.899276\n", + "2004 80058.603599\n", + "2005 93937.040205\n", + "2006 79686.444188\n", + "2007 59352.628911\n", + "2008 48595.957663" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "cl.BornhuetterFerguson(apriori=0.90).fit(\n", " xyz_tri[\"Incurred\"], sample_weight=xyz_tri[\"Premium\"].latest_diagonal\n", @@ -1386,10 +3393,88 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "id": "d504e48d-1f5d-4fd6-975b-155235ffb577", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
2261
199815,822
199925,084
200036,924
200138,332
200248,637
200346,910
200480,059
200593,937
200679,686
200759,353
200848,596
" + ], + "text/plain": [ + " 2261\n", + "1998 15822.000000\n", + "1999 25083.706485\n", + "2000 36923.638582\n", + "2001 38332.320375\n", + "2002 48637.364535\n", + "2003 46909.899276\n", + "2004 80058.603599\n", + "2005 93937.040205\n", + "2006 79686.444188\n", + "2007 59352.628911\n", + "2008 48595.957663" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "cl.Benktander(apriori=0.90, n_iters=1).fit(\n", " xyz_tri[\"Incurred\"], sample_weight=xyz_tri[\"Premium\"].latest_diagonal\n", @@ -1406,10 +3491,88 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "id": "7089ea42-ad28-4edc-9e83-723a7bc25443", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
2261
199815,822
199925,087
200036,975
200138,407
200248,562
200346,504
200478,496
200590,214
200674,748
200754,936
200843,804
" + ], + "text/plain": [ + " 2261\n", + "1998 15822.000000\n", + "1999 25087.431508\n", + "2000 36975.189569\n", + "2001 38406.790341\n", + "2002 48562.465206\n", + "2003 46504.206620\n", + "2004 78496.120544\n", + "2005 90213.852284\n", + "2006 74747.824455\n", + "2007 54935.628037\n", + "2008 43804.219299" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "cl.CapeCod().fit(\n", " xyz_tri[\"Incurred\"], sample_weight=xyz_tri[\"Premium\"].latest_diagonal\n", @@ -1426,20 +3589,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "id": "f2cd9f8c-454d-4b9f-b936-a2f39e8fefde", "metadata": {}, -<<<<<<< HEAD - "outputs": [], -======= "outputs": [ { "data": { "text/plain": [ - "[]" + "[]" ] }, - "execution_count": 31, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" }, @@ -1454,16 +3614,16 @@ "output_type": "display_data" } ], ->>>>>>> c23481473ff4beacbcca9e4b5243e2f78b4b5b08 "source": [ "cc_result = (\n", " cl.CapeCod()\n", " .fit(xyz_tri[\"Incurred\"], sample_weight=xyz_tri[\"Premium\"].latest_diagonal)\n", " .ultimate_\n", - ")\n", + ").to_frame()\n", + "\n", "plt.plot(\n", - " cc_result.to_frame().index.year,\n", - " cc_result.to_frame()[\"2261\"],\n", + " cc_result.index.year, \n", + " cc_result[\"2261\"]\n", ")" ] }, @@ -1485,10 +3645,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "id": "e008ebdb-243d-4ed0-9256-86331df1070a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
MackChainladder()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ], + "text/plain": [ + "MackChainladder()" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "mcl_mod = cl.MackChainladder().fit(xyz_tri[\"Incurred\"])\n", "mcl_mod" @@ -1504,10 +3678,208 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "id": "67f5d99b-7a5e-4640-a6e0-f8b654e6ce27", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496108120132
19980.00000.00000.24500.17410.08860.05370.06090.01460.01690.01100.0000
19990.00000.30440.20220.13820.06790.04130.04660.01180.01360.00870.0000
20000.32430.25590.17500.11760.05930.03430.03840.00960.01120.00720.0000
20010.37340.27700.17860.11880.05500.03300.03760.00950.01090.00700.0000
20020.35870.24550.15860.09980.04830.02890.03370.00840.00970.00630.0000
20030.41330.26880.14870.09610.04840.03020.03450.00860.01000.00640.0000
20040.31150.17480.10670.07230.03840.02310.02640.00660.00760.00490.0000
20050.23980.16090.09770.07290.03660.02210.02520.00630.00730.00470.0000
20060.24680.16200.11720.08030.04030.02430.02770.00690.00800.00520.0000
20070.29090.19670.12560.08600.04320.02600.02970.00740.00860.00550.0000
20080.29750.19830.12670.08670.04350.02620.02990.00750.00870.00560.0000
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96 108 120 132\n", + "1998 0.000000 0.000000 0.245040 0.174079 0.088551 0.053698 0.060944 0.014560 0.016943 0.010981 0.0\n", + "1999 0.000000 0.304387 0.202207 0.138212 0.067907 0.041314 0.046626 0.011829 0.013604 0.008721 0.0\n", + "2000 0.324294 0.255933 0.175009 0.117563 0.059282 0.034309 0.038425 0.009618 0.011162 0.007186 0.0\n", + "2001 0.373352 0.277014 0.178627 0.118808 0.055043 0.033049 0.037623 0.009456 0.010949 0.007049 0.0\n", + "2002 0.358728 0.245539 0.158630 0.099799 0.048304 0.028859 0.033653 0.008407 0.009734 0.006267 0.0\n", + "2003 0.413305 0.268816 0.148654 0.096134 0.048404 0.030234 0.034488 0.008616 0.009976 0.006422 0.0\n", + "2004 0.311455 0.174828 0.106746 0.072331 0.038398 0.023148 0.026405 0.006597 0.007638 0.004917 0.0\n", + "2005 0.239780 0.160909 0.097652 0.072868 0.036584 0.022054 0.025158 0.006285 0.007277 0.004685 0.0\n", + "2006 0.246799 0.162021 0.117235 0.080257 0.040294 0.024291 0.027709 0.006922 0.008015 0.005160 0.0\n", + "2007 0.290935 0.196728 0.125628 0.086003 0.043178 0.026030 0.029693 0.007418 0.008589 0.005529 0.0\n", + "2008 0.297459 0.198330 0.126651 0.086704 0.043530 0.026242 0.029935 0.007478 0.008659 0.005574 0.0" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "mcl_mod.full_std_err_" ] @@ -1522,10 +3894,124 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "id": "81fc38c1-d5b7-4262-94ae-bce5c7ac17e1", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
LatestIBNRUltimateMack Std Err
199815,82215,822
199925,107-2125,086352
200037,246-29436,952751
200138,798-39738,401893
200248,16941348,5822,190
200344,3731,88546,2582,614
200470,2888,62678,9145,004
200570,65516,27886,9338,487
200648,80422,85871,66210,738
200731,73230,67462,40613,925
200818,63242,77061,40218,019
" + ], + "text/plain": [ + " Latest IBNR Ultimate Mack Std Err\n", + "1998 15822.0 NaN 15822.000000 NaN\n", + "1999 25107.0 -20.611999 25086.388001 352.069939\n", + "2000 37246.0 -294.120010 36951.879990 750.954565\n", + "2001 38798.0 -397.386298 38400.613702 892.719893\n", + "2002 48169.0 413.226476 48582.226476 2190.044383\n", + "2003 44373.0 1884.941381 46257.941381 2613.888360\n", + "2004 70288.0 8625.510138 78913.510138 5004.358291\n", + "2005 70655.0 16278.374265 86933.374265 8486.846704\n", + "2006 48804.0 22857.720703 71661.720703 10738.482249\n", + "2007 31732.0 30673.722716 62405.722716 13925.203501\n", + "2008 18632.0 42769.770743 61401.770743 18019.072745" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "mcl_mod.summary_" ] @@ -1540,17 +4026,14 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "id": "e615b86e-a907-4445-9e95-645090719f76", "metadata": {}, -<<<<<<< HEAD - "outputs": [], -======= "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 35, @@ -1559,7 +4042,7 @@ }, { "data": { - "image/png": "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MJPQcPG7AwB741MAAADYFkEIP9hHH30kh8Oh06dPX7Vm6dKlat68ea21CQCAquAaoRrQ/sm1tXq8w7OG/OBtRo0apWXLlkmSmjRpotjYWA0fPlzPPPOMwsLCrrlt7969lZ+fL5fLVaX2AgBQXxCEbGzw4MFasmSJysvL9cknn+hXv/qVSktL9corr1xzu+DgYOu5cgAANGScGrMxp9Mpt9ut2NhYpaSkaOTIkXr33Xe1YsUKde/eXeHh4XK73UpJSbEeVitd+dTY0qVL1bZtWzVt2lQ/+9nP9PXXX9dBjwAA+GEIQrCEhoaqvLxcPp9Pzz33nD777DO9++67OnTokEaNGnXV7bZt26aHH35Y48aNU25urvr376/f//73tddwAACqiFNjkCRt375dK1eu1IABA/Twww9byzt06KCXXnpJP/nJT1RSUqJmzZpV2vYPf/iDBg0apCeffFKSdNNNN2nLli3KzMystfYDqDulpaXWvw0lJSXfeZ0hUJ8wI2Rja9asUbNmzRQSEqLExETdeeedWrBggXbt2qV7771X7dq1U3h4uPr16ydJOnr06BX388UXXygxMdFv2eXvAQCojwhCNta/f3/l5uZq//79On/+vN555x2FhYUpKSlJzZo104oVK7Rjxw6tXr1a0jffpH0lPLcXANBQcWrMxsLCwnTjjTf6Lfvyyy/1n//8R7NmzVJsbKwk6dNPP73mfrp06aKtW7f6Lbv8PQAA9REzQvDTtm1bBQcHa8GCBfrqq6/03nvv6bnnnrvmNmlpacrMzNTs2bN14MABLVy4kOuDAAANAkEIfm644QYtXbpUb731lrp06aJZs2Zpzpw519ymV69eeu2117RgwQLdeuutysrK0tNPP11LLQYAoOochgs8rqm4uFgul0ter1cRERF+686fP69Dhw4pLi6OJ5c3UPwOgevHXWOoj671+f1tzAgBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADb4unzNSHdVcvH8/7gTUaNGqVly5ZJkgIDA+XxeDRkyBDNmDFDLVq0qO4WAgBQLzEjZGODBw9Wfn6+Dh8+rNdee03vv/++xo0bVydtKS8vr5PjAgDsjSBkY06nU263W23atFFSUpIeeOABZWVlWeuXLFmizp07KyQkRDfffLNefvlla53P59P48ePVqlUrhYSEqH379po5c6a13uv1auzYsYqOjlZERITuuusuffbZZ9b69PR03XrrrfrTn/6kDh06yOl0atGiRWrdurUqKir82jls2DA99NBD1vv3339fCQkJCgkJUYcOHfTMM8/owoULfvtu27atnE6nPB6P0tLSqnXcAACNB6fGIEn66quvlJmZqaCgIEnS4sWLNW3aNC1cuFC33Xabdu3apTFjxigsLEwPPfSQXnrpJb333nv661//qrZt2yovL095eXmSJGOMhgwZosjISK1bt04ul0uLFi3SgAEDdODAAUVGRkqS/vWvf+mvf/2rVq1apcDAQLVu3VppaWnauHGjBgwYIEkqKirSBx98oPfff1+S9MEHH+iXv/ylXnrpJd1xxx06ePCgxo4dK0maNm2a3n77bc2fP18ZGRn60Y9+pIKCAr8ABgDAtxGEbGzNmjVq1qyZLl68qPPnz0uS5s2bJ0l67rnnNHfuXA0fPlySFBcXp3379mnRokV66KGHdPToUXXs2FG33367HA6H2rVrZ+1348aN2r17twoLC+V0OiVJc+bM0bvvvqu3337bCi4+n0/Lly/XDTfcYG07ePBgrVy50gpCb731liIjI63306dP15NPPmnNEHXo0EHPPfecHn/8cU2bNk1Hjx6V2+3WwIEDFRQUpLZt2+onP/lJTQ4jAKAB49SYjfXv31+5ubnatm2bJkyYoEGDBmnChAk6efKk8vLyNHr0aDVr1sx6/f73v9fBgwclfXOxdW5urjp16qS0tDS/U2o5OTkqKSlRy5Yt/bY/dOiQtb0ktWvXzi8ESdLIkSO1atUqlZWVSZLeeOMN/eIXv1BgYKC172effdZvv2PGjFF+fr7Onj2r+++/X+fOnVOHDh00ZswYrV692u+0GQAA38aMkI2FhYXpxhtvlCS99NJL6t+/v5555hmNHz9e0jenx3r27Om3zaVA0q1bNx06dEh///vftWHDBo0YMUIDBw7U22+/rYqKCrVq1UofffRRpWM2b97c7/iXGzp0qCoqKrR27Vr16NFDn3zyiTVLJUkVFRV65plnrJmqbwsJCVFsbKz279+v9evXa8OGDRo3bpxeeOEFbdq0yTrtBwDAJQQhWKZNm6Z77rlHv/71r9W6dWt99dVXGjly5FXrIyIi9MADD+iBBx7Qz3/+cw0ePFinTp1St27dVFBQoCZNmqh9+/Y/qA2hoaEaPny43njjDf3rX//STTfdpISEBGt9t27dtH//fivAXW0fw4YN07Bhw/TYY4/p5ptv1u7du9WtW7cf1BYAQONHEIKlX79++tGPfqQZM2YoPT1daWlpioiI0D333KOysjJ9+umnKioq0qRJkzR//ny1atVKt956qwICAvTWW2/J7XarefPmGjhwoBITE3Xffffp+eefV6dOnfTvf/9b69at03333afu3btfsx0jR47U0KFDtXfvXv3yl7/0W/e///u/Sk5OVmxsrO6//34FBATo888/1+7du/X73/9eS5cu1cWLF9WzZ081bdpUy5cvV2hoqN81TAAAXMI1QvAzadIkLV68WIMGDdJrr72mpUuXqmvXrurbt6+WLl2quLg4SVKzZs30/PPPq3v37urRo4cOHz6sdevWKSAgQA6HQ+vWrdOdd96phx9+WDfddJN+8Ytf6PDhw4qJifnONtx1112KjIzU/v37lZKS4rdu0KBBWrNmjdavX68ePXqoV69emjdvnhV0mjdvrsWLF6tPnz665ZZb9I9//EPvv/++WrZsWf2DBQBo8BzGGFPXjajPiouL5XK55PV6FRER4bfu/PnzOnTokOLi4hQSElJHLcT14HcIXL/S0lI1a9ZMklRSUnLF6/+A2natz+9vY0YIAADYFkEIAADYFkEIAADYFkEIAADYFrfPAwC+ke6q2na+b91zM72VFOy4jjZ4q74tUAXMCFUDbrxruPjdAYC9EYSuw6VHNpw9e7aOW4KquvS74/EbAGBPnBq7DoGBgWrevLkKCwslSU2bNpXDcR1Twqg1xhidPXtWhYWFat68ufUMNQCAvRCErpPb7ZYkKwyhYWnevLn1OwQA2A9B6Do5HA61atVK0dHRKi8vr+vm4AcICgpiJggAbI4gVE0CAwP5UAUAoIHhYmkAAGBbBCEAAGBbBCEAAGBbBCEAAGBbBCEAqMdKS0vlcDjkcDhUWlpa180BGh2CEAAAsC2CEAAAsC2CEAAAsC2CEAAAsC2CEADAFrjwHFdCEAIAALZFEAIAALZFEAIAALZFEAIAALZV7UHowoULevrppxUXF6fQ0FB16NBBzz77rCoqKqwaY4zS09Pl8XgUGhqqfv36ae/evX77KSsr04QJExQVFaWwsDANGzZMx44d86spKipSamqqXC6XXC6XUlNTdfr0ab+ao0ePaujQoQoLC1NUVJTS0tLk8/mqu9sAAKABqvYg9Pzzz+uPf/yjFi5cqC+++EKzZ8/WCy+8oAULFlg1s2fP1rx587Rw4ULt2LFDbrdbd999t86cOWPVTJw4UatXr1ZGRoY2b96skpISJScn6+LFi1ZNSkqKcnNzlZmZqczMTOXm5io1NdVaf/HiRQ0ZMkSlpaXavHmzMjIytGrVKk2ePLm6uw0AABqgJtW9w+zsbN17770aMmSIJKl9+/Z688039emnn0r6ZjboxRdf1FNPPaXhw4dLkpYtW6aYmBitXLlSjzzyiLxer15//XUtX75cAwcOlCStWLFCsbGx2rBhgwYNGqQvvvhCmZmZ2rp1q3r27ClJWrx4sRITE7V//3516tRJWVlZ2rdvn/Ly8uTxeCRJc+fO1ahRozR9+nRFRERUd/cBAEADUu0zQrfffrv+8Y9/6MCBA5Kkzz77TJs3b9ZPf/pTSdKhQ4dUUFCgpKQkaxun06m+fftqy5YtkqScnByVl5f71Xg8HsXHx1s12dnZcrlcVgiSpF69esnlcvnVxMfHWyFIkgYNGqSysjLl5ORcsf1lZWUqLi72ewEAgMap2meEnnjiCXm9Xt18880KDAzUxYsXNX36dD344IOSpIKCAklSTEyM33YxMTE6cuSIVRMcHKwWLVpUqrm0fUFBgaKjoysdPzo62q/m8uO0aNFCwcHBVs3lZs6cqWeeeeaHdhsAADRA1T4j9Je//EUrVqzQypUrtXPnTi1btkxz5szRsmXL/OocDoffe2NMpWWXu7zmSvVVqfm2qVOnyuv1Wq+8vLxrtgkAADRc1R6Efve73+nJJ5/UL37xC3Xt2lWpqan67W9/q5kzZ0qS3G63JFWakSksLLRmb9xut3w+n4qKiq5Zc+LEiUrHP3nypF/N5ccpKipSeXl5pZmiS5xOpyIiIvxeAADAX2N5ZEm1B6GzZ88qIMB/t4GBgdbt83FxcXK73Vq/fr213ufzadOmTerdu7ckKSEhQUFBQX41+fn52rNnj1WTmJgor9er7du3WzXbtm2T1+v1q9mzZ4/y8/OtmqysLDmdTiUkJFRzzwEAQENT7dcIDR06VNOnT1fbtm31ox/9SLt27dK8efP08MMPS/rmVNXEiRM1Y8YMdezYUR07dtSMGTPUtGlTpaSkSJJcLpdGjx6tyZMnq2XLloqMjNSUKVPUtWtX6y6yzp07a/DgwRozZowWLVokSRo7dqySk5PVqVMnSVJSUpK6dOmi1NRUvfDCCzp16pSmTJmiMWPGMNMDoPaku6q+rc/838/TW0nB176E4Opt8Fa9DUAjVu1BaMGCBfqf//kfjRs3ToWFhfJ4PHrkkUf0v//7v1bN448/rnPnzmncuHEqKipSz549lZWVpfDwcKtm/vz5atKkiUaMGKFz585pwIABWrp0qQIDA62aN954Q2lpadbdZcOGDdPChQut9YGBgVq7dq3GjRunPn36KDQ0VCkpKZozZ051dxsAADRADmOM+e4y+youLpbL5ZLX62UWCUDVXMeMUKnPqNnMb75stmRquMJqckboemauqksNzlyVlpaqWbNmkqSSkhKFhYXV2LHsoL6P5/f9/OZZYwAAwLYIQgAAwLYIQgAAwLYIQgAAwLYIQgAAwLYIQgAAwLYIQgAAwLYIQgAA1CON5RleDQVBCAAA2BZBCAAA2BZBCAAA2BZBCAAA2BZBCAAA2BZBCAAA2BZBCAAA2BZBCAAA2FaTum4AAODqwoIdMtMi6roZQKPFjBAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtvkcIANCwpLuqtp3P/N/P01tJwY7raIO36tuiXmFGCAAA2BZBCAAA2BZBCAAA2BbXCAEAJEntz6+s6ybocF03ALZDEAKAGkbAAOovTo0BAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbIggBAADbalLXDQAAoNFJd1V9W5/5v5+nt5KCHdfRDm/Vt7UJZoQAAIBtEYQAAIBtEYQAAIBtcY0QAAB2VR+uZarj65hqZEbo+PHj+uUvf6mWLVuqadOmuvXWW5WTk2OtN8YoPT1dHo9HoaGh6tevn/bu3eu3j7KyMk2YMEFRUVEKCwvTsGHDdOzYMb+aoqIipaamyuVyyeVyKTU1VadPn/arOXr0qIYOHaqw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KCjIZGRkWDXHjx83AQEBJjMz0xhjzL59+4wks3XrVqsmOzvbSDJffvllbXSt1tXUWF7J7NmzTVxcXA31pH6o6fFct26dufnmm83evXsbXRC6XE2NZXl5uWndurV57bXXarE3da+mxrM+fw5xaqweKysrkySFhIRYywIDAxUcHKzNmzdbNQ6Hw+/LrEJCQhQQEGDVtGzZUp07d9af//xnlZaW6sKFC1q0aJFiYmKUkJBQiz2qXV6vV5IUGRkpSTp06JAKCgqUlJRk1TidTvXt21dbtmyRJOXk5Ki8vNyvxuPxKD4+3qrJzs6Wy+VSz549rZpevXrJ5XJZNY1NTY3l1Y516TiNVU2O54kTJzRmzBgtX75cTZs2rY3u1KmaGsudO3fq+PHjCggI0G233aZWrVrpnnvuqXRKqLGpqfGsz59DBKF67Oabb1a7du00depUFRUVyefzadasWSooKFB+fr6kbz6Aw8LC9MQTT+js2bMqLS3V7373O1VUVFg1DodD69ev165duxQeHq6QkBDNnz9fmZmZ9f6BslVljNGkSZN0++23Kz4+XpKsh+9e/sDdmJgYa11BQYGCg4PVokWLa9ZER0dXOmZ0dHSlB/w2BjU5lpc7ePCgFixY0KgfgVOT42mM0ahRo/Too4+qe/fuNd2VOleTY/nVV19JktLT0/X0009rzZo1atGihfr27atTp07VaL/qSk2OZ33+HCII1WNBQUFatWqVDhw4oMjISDVt2lQfffSR7rnnHgUGBkqSbrjhBr311lt6//331axZM7lcLnm9XnXr1s2qMcZo3Lhxio6O1ieffKLt27fr3nvvVXJyshWWGpvx48fr888/15tvvllpncPh8HtvjKm07HKX11yp/vvspyGq6bG85N///rcGDx6s+++/X7/61a+ur9H1WE2O54IFC1RcXKypU6dWX4PrsZocy4qKCknSU089pf/+7/9WQkKClixZIofDobfeequaelC/1OR41ufPIYJQPZeQkKDc3FydPn1a+fn5yszM1Ndff624uDirJikpSQcPHlRhYaH+85//aPny5Tp+/LhV8+GHH2rNmjXKyMhQnz591K1bN7388ssKDQ3VsmXL6qprNWbChAl67733tHHjRrVp08Za7na7JanSbERhYaH1vx232y2fz6eioqJr1lx+V54knTx5stL/mhq6mh7LS/7973+rf//+1oORG6uaHs8PP/xQW7duldPpVJMmTXTjjTdKkrp3766HHnqoxvpVF2p6LFu1aiVJ6tKli7Xe6XSqQ4cOOnr0aPV3qI7Vxt9mff0cIgg1EC6XSzfccIP++c9/6tNPP9W9995bqSYqKkrNmzfXhx9+qMLCQg0bNkySdPbsWUlSQID/rzsgIMD6X09jYIzR+PHj9c477+jDDz/0C4uSFBcXJ7fbrfXr11vLfD6fNm3apN69e0v6JngGBQX51eTn52vPnj1WTWJiorxer7Zv327VbNu2TV6v16pp6GprLCXp+PHj6tevn7p166YlS5ZU+jttDGprPF966SV99tlnys3NVW5urtatWydJ+stf/qLp06fXdDdrRW2NZUJCgpxOp9+t5OXl5Tp8+HCjeGj3JbU1nvX6c6j2rsvGlZw5c8bs2rXL7Nq1y0gy8+bNM7t27TJHjhwxxhjz17/+1WzcuNEcPHjQvPvuu6Zdu3Zm+PDhfvv405/+ZLKzs82//vUvs3z5chMZGWkmTZpkrT958qRp2bKlGT58uMnNzTX79+83U6ZMMUFBQSY3N7dW+1uTfv3rXxuXy2U++ugjk5+fb73Onj1r1cyaNcu4XC7zzjvvmN27d5sHH3zwireBtmnTxmzYsMHs3LnT3HXXXVe8ff6WW24x2dnZJjs723Tt2rVR3T5fW2N5/Phxc+ONN5q77rrLHDt2zO9YjUlt/m1+26FDhxrdXWO1OZa/+c1vTOvWrc0HH3xgvvzySzN69GgTHR1tTp06Vat9rkm1NZ71+XOIIFTHNm7caCRVej300EPGGGP+8Ic/mDZt2pigoCDTtm1b8/TTT5uysjK/fTzxxBMmJibGBAUFmY4dO5q5c+eaiooKv5odO3aYpKQkExkZacLDw02vXr3MunXraqubteJK4yjJLFmyxKqpqKgw06ZNM2632zidTnPnnXea3bt3++3n3LlzZvz48SYyMtKEhoaa5ORkc/ToUb+ar7/+2owcOdKEh4eb8PBwM3LkSFNUVFQLvawdtTWWS5YsueqxGpPa/Nv8tsYYhGpzLH0+n5k8ebKJjo424eHhZuDAgX5fZ9IY1OZ41tfPIYcxxtTMXBMAAED91vhOxgMAAHxPBCEAAGBbBCEAAGBbBCEAAGBbBCEAAGBbBCEAAGBbBCEAAGBbBCEAAGBbBCEAAGBbBCEAAGBbBCEAAGBbBCEAAGBb/x/sGAzX8CJcawAAAABJRU5ErkJggg==", + "image/png": "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x/r6es2dO9eapfqi0NBQXen5wTzyBABwNVwsDcucOXO0aNEi1dXVqXPnzvrkk0/UvXt3nyUpKclnn23btlk/X7x4UcXFxbrxxhslSb1799bWrVt9AsrWrVsVERGhzp07X7UtwcHBqqur81l322236eDBgw3a1L17dwUEBKh37946evSoPv30U2ufoqKiRo8HAKD9Y0YIliFDhuimm25STk6OsrOzNWXKFEVGRmrkyJGqra3VX//6V1VWVmratGnWPv/xH/+hHj16qFevXnr66adVWVmpn/zkJ5KkzMxMLVmyRFlZWZo8ebIOHjyoOXPmaNq0aV/5WItu3brpz3/+swYNGiSn06moqCg98cQTSk9PV2Jion74wx8qICBAH3zwgfbs2aN/+7d/09ChQ9WzZ0/9+Mc/1uLFi1VVVaXZs2c36ZgBANo2ZoTgY9q0aVqxYoWGDx+uF154QatWrVKfPn00ePBgrVq1qsGM0IIFC/Sb3/xGt9xyi95//3394Q9/UExMjCSpc+fO2rhxo3bs2KFbbrlFjzzyiCZOnKjHH3/8K9uxePFiFRYWKjExUX379pUkDR8+XBs2bFBhYaFuv/12DRgwQLm5ubr++uslff7MsPXr16u2tlbf/va39dOf/tTneiIAAC7nMFe6sAKWqqoquVwueTweRUZG+mw7f/68Dh06pKSkJNs9tfzw4cNKSkrS7t27deutt7Z0c66JnX+PgD9w1xhao6u9f38RM0IAAMC2CEIAAMC2uFgajdKtW7cr3q4OAEBbwowQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLYIQAACwLb5HqClku5r5fJ5vvMuECRN0+vRpvf7665owYYJWr15tbYuOjtbtt9+uhQsX6uabb7bWOxwOOZ1OHTx40Hq+lyTde++96tixo1atWmUd+9LxAgMDlZCQoFGjRiknJ0dRUVGN7CQAAP7HjBAkSSNGjFBZWZnKysr05z//WUFBQUpPT29Q53A49MQTT3zt4x0+fFgvvPCC3njjDWVmZjZF0wEAaDSCECRJTqdTbrdbbrdbt956q2bOnKnS0lKdPHnSpy4rK0tr1qzRnj17vtbxunTporS0NN1///0qKChoyi4AAPCNEYTQQHV1tV5++WV1795dnTp18tk2cOBApaena9asWV/7eJ988ony8/MVHBzs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MVq2bJm1PTAwUG+++aYyMzM1aNAghYWFady4cVq0aFHzdRa4XLarcft5zf/9PC9eCrn6NXVXb4On8fsCQDvSLEHo3Xff9XntcDiUnZ2t7OzsL90nNDRUS5cu1dKlS7+0Jjo6WmvWrLnqubt27aoNGzZ8k+YCAACbaJEZIcDOup1f26j96r3nJf2TJKnX+ZUKqP/yuzK/yuFG7wkA7QsPXQUAALZFEALEHVkAYFd8NAa0EQEhobp+Jte7AYA/EYTQfjT2bizJf3dkcTcWALQpBCG0G429CFny34XIhxvdAgBAS+AaIQAAYFsEIQAAYFt8NAaIC5EBwK6YEQIAALZFEAIAALZFEAIAALZFEAIAALZFEAIAALZFEAIAALZFEAIAALZFEAIAALZFEAIAALZFEAIAALZFEAIAALZFEAIAALZFEAIAALZFEAIAALZFEAIAALYV1NINAACgvel2fm1LN0GSdLilG9AGMCMEAABsiyAEAABsiyAEAABsiyAEAABsiyAEAABsiyAEAABsiyAEAABsiyAEAABsiyAEAABsiyAEAABsiyAEAABsiyAEAABsiyAEAABsiyAEAABsiyAEAABsiyAEAABsiyAEAABsiyAEAABsiyAEAABsiyAEAABsiyAEAABsiyAEAABsiyCEJlVTUyOHwyGHw6GampqWbg4AAD4IQgAAwLaCWroBaP26PfZmo/et9563fu71r/kKCAlt9LEOLxjV6H0BALgSghCaVEBIqK6fuaGlmwEAwBXx0RgAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtghAAALAtvweh+fPn6/bbb1dERIRiY2N177336uDBgz41xhhlZ2crISFBYWFhGjJkiPbt2+dTU1tbq6ysLMXExCg8PFxjxozRsWPHfGoqKyuVkZEhl8sll8uljIwMnT592qfm6NGjGj16tMLDwxUTE6MpU6bI6/X6u9sAAKAN8nsQ2rx5s37+859r27ZtKiws1MWLF5WWlqaamhqrZuHChcrNzdWyZcu0c+dOud1uDRs2TGfOnLFqpk6dqvXr1ysvL09btmxRdXW10tPTVVdXZ9WMGzdOJSUlys/PV35+vkpKSpSRkWFtr6ur06hRo1RTU6MtW7YoLy9P69at0/Tp0/3d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ofvvv1+fffaZnnzySZWVlSk5OVkbN27U9ddf39JNu2ZOp1Nz5sxp8FEeGofx9B/G0r8YT/9hLP2rPYynw5ivuq8MAACgfWrX1wgBAABcDUEIAADYFkEIAADYFkEIAADYFkGohb333nsaPXq0EhIS5HA49Prrr/tsP3HihCZMmKCEhAR16NBBI0aM0N///nefmo8//ljf//739a1vfUuRkZG67777dOLECZ+ajz76SPfcc49iYmIUGRmpQYMG6Z133mnq7jWr+fPn6/bbb1dERIRiY2N177336uDBgz41xhhlZ2crISFBYWFhGjJkiPbt2+dTU1tbq6ysLMXExCg8PFxjxozRsWPHfGoqKyuVkZEhl8sll8uljIwMnT59uqm72GyaaywPHz6siRMnKikpSWFhYfqHf/gHzZkzR16vt1n62Vya82/zi7W33nqrHA6HSkpKmqprza65x/LNN99U//79FRYWppiYGI0dO7ZJ+9fcmnM8W+370LU+zwvXZuPGjWb27Nlm3bp1RpJZv369ta2+vt4MGDDA3HHHHWbHjh3mww8/NA899JDp2rWrqa6uNsYYU11dbW644Qbz/e9/33zwwQfmgw8+MPfcc4+5/fbbTV1dnXWs7t27m+9973vmb3/7m/noo49MZmam6dChgykrK2vuLjeZ4cOHm5UrV5q9e/eakpISM2rUKJ+xMsaYBQsWmIiICLNu3TqzZ88ec//995v4+HhTVVVl1TzyyCOmc+fOprCw0Ozatcvcdddd5pZbbjEXL160akaMGGGSk5PN1q1bzdatW01ycrJJT09v1v42peYayz/96U9mwoQJ5q233jIff/yx+cMf/mBiY2PN9OnTm73PTak5/zYvmTJlihk5cqSRZHbv3t0c3WwWzTmW//3f/22ioqLM8uXLzcGDB82HH35oXn311Wbtb1NrzvFsre9DBKFW5PIgdPDgQSPJ7N2711p38eJFEx0dbVasWGGMMeatt94yAQEBxuPxWDWnTp0ykkxhYaExxpiTJ08aSea9996zaqqqqowks2nTpibuVcupqKgwkszmzZuNMZ8HS7fbbRYsWGDVnD9/3rhcLvPb3/7WGGPM6dOnTXBwsMnLy7Nqjh8/bgICAkx+fr4xxpj9+/cbSWbbtm1WTVFRkZFkPvzww+boWrNrqrG8koULF5qkpKQm6knr0NTjuXHjRnPjjTeaffv2tbsgdLmmGssLFy6Yzp07mxdeeKEZe9Pymmo8W/P7EB+NtWK1tbWSpNDQUGtdYGCgQkJCtGXLFqvG4XD4fJlVaGioAgICrJpOnTqpV69e+t3vfqeamhpdvHhRzz33nOLi4pSSktKMPWpeHo9HkhQdHS1JOnTokMrLy5WWlmbVOJ1ODR48WFu3bpUkFRcX68KFCz41CQkJSk5OtmqKiorkcrnUv39/q2bAgAFyuVxWTXvTVGP5Zee6dJ72qinH88SJE5o0aZJeeukldejQoTm606Kaaix37dql48ePKyAgQH379lV8fLxGjhzZ4COh9qapxrM1vw8RhFqxG2+8Uddff71mzZqlyspKeb1eLViwQOXl5SorK5P0+RtweHi4Zs6cqbNnz6qmpka/+tWvVF9fb9U4HA4VFhZq9+7dioiIUGhoqJ5++mnl5+e3+gfKNpYxRtOmTdN3vvMdJScnS5L18N3LH7gbFxdnbSsvL1dISIiioqKuWhMbG9vgnLGxsQ0e8NseNOVYXu7jjz/W0qVL2/UjcJpyPI0xmjBhgh555BH169evqbvS4ppyLD/55BNJUnZ2th5//HFt2LBBUVFRGjx4sE6dOtWk/WopTTmerfl9iCDUigUHB2vdunX66KOPFB0drQ4dOujdd9/VyJEjFRgYKEn61re+pVdffVVvvPGGrrvuOrlcLnk8Ht12221WjTFGmZmZio2N1fvvv68dO3bonnvuUXp6uhWW2pvJkyfrgw8+0CuvvNJgm8Ph8HltjGmw7nKX11yp/uscpy1q6rG85NNPP9WIESP0wx/+UD/96U+vrdGtWFOO59KlS1VVVaVZs2b5r8GtWFOOZX19vSRp9uzZ+sEPfqCUlBStXLlSDodDr776qp960Lo05Xi25vchglArl5KSopKSEp0+fVplZWXKz8/XZ599pqSkJKsmLS1NH3/8sSoqKvS///u/eumll3T8+HGr5u2339aGDRuUl5enQYMG6bbbbtOzzz6rsLAwrV69uqW61mSysrL0xz/+Ue+88466dOlirXe73ZLUYDaioqLC+m/H7XbL6/WqsrLyqjWX35UnSSdPnmzwX1Nb19Rjecmnn36qu+66y3owcnvV1OP59ttva9u2bXI6nQoKClL37t0lSf369dODDz7YZP1qCU09lvHx8ZKk3r17W9udTqduuOEGHT161P8damHN8bfZWt+HCEJthMvl0re+9S39/e9/11//+lfdc889DWpiYmLUsWNHvf3226qoqNCYMWMkSWfPnpUkBQT4/roDAgKs/3raA2OMJk+erNdee01vv/22T1iUpKSkJLndbhUWFlrrvF6vNm/erIEDB0r6PHgGBwf71JSVlWnv3r1WTWpqqjwej3bs2GHVbN++XR6Px6pp65prLCXp+PHjGjJkiG677TatXLmywd9pe9Bc4/nMM8/ob3/7m0pKSlRSUqKNGzdKkn7/+99r3rx5Td3NZtFcY5mSkiKn0+lzK/mFCxd0+PDhdvHQ7kuaazxb9ftQ812XjSs5c+aM2b17t9m9e7eRZHJzc83u3bvNkSNHjDHG/Nd//Zd55513zMcff2xef/11c/3115uxY8f6HOM///M/TVFRkfmf//kf89JLL5no6Ggzbdo0a/vJkydNp06dzNixY01JSYk5ePCgmTFjhgkODjYlJSXN2t+m9LOf/cy4XC7z7rvvmrKyMms5e/asVbNgwQLjcrnMa6+9Zvbs2WMeeOCBK94G2qVLF7Np0yaza9cu893vfveKt8/ffPPNpqioyBQVFZk+ffq0q9vnm2ssjx8/brp3726++93vmmPHjvmcqz1pzr/NLzp06FC7u2usOcfyF7/4hencubN56623zIcffmgmTpxoYmNjzalTp5q1z02pucazNb8PEYRa2DvvvGMkNVgefPBBY4wx//7v/266dOligoODTdeuXc3jjz9uamtrfY4xc+ZMExcXZ4KDg02PHj3M4sWLTX19vU/Nzp07TVpamomOjjYRERFmwIABZuPGjc3VzWZxpXGUZFauXGnV1NfXmzlz5hi3222cTqe58847zZ49e3yOc+7cOTN58mQTHR1twsLCTHp6ujl69KhPzWeffWbGjx9vIiIiTEREhBk/fryprKxshl42j+Yay5UrV37pudqT5vzb/KL2GISacyy9Xq+ZPn26iY2NNREREWbo0KE+X2fSHjTneLbW9yGHMcY0zVwTAABA69b+PowHAAD4mghCAADAtghCAADAtghCAADAtghCAADAtghCAADAtghCAADAtghCAADAtghCAADAtghCAADAtghCAADAtghCAADAtv4fP3L5EBIVu4oAAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -1568,7 +4051,6 @@ "output_type": "display_data" } ], ->>>>>>> c23481473ff4beacbcca9e4b5243e2f78b4b5b08 "source": [ "plt.bar(\n", " mcl_mod.summary_.to_frame(origin_as_datetime=True).index.year,\n", @@ -1595,10 +4077,58 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "id": "859e19f3-d526-435c-a845-4845a7a3956d", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Triangle Summary
Valuation:2008-12
Grain:OYDY
Shape:(10000, 1, 11, 11)
Index:[Total]
Columns:[Incurred]
" + ], + "text/plain": [ + " Triangle Summary\n", + "Valuation: 2008-12\n", + "Grain: OYDY\n", + "Shape: (10000, 1, 11, 11)\n", + "Index: [Total]\n", + "Columns: [Incurred]" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "xyz_tri_sampled = (\n", " cl.BootstrapODPSample(n_sims=10000).fit(xyz_tri[\"Incurred\"]).resampled_triangles_\n", @@ -1616,12 +4146,9 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "id": "fe6dbe70-1b2a-4fb0-aa6b-56380534704f", "metadata": {}, -<<<<<<< HEAD - "outputs": [], -======= "outputs": [ { "name": "stderr", @@ -1629,6 +4156,8 @@ "text": [ "/Users/kennethhsu/opt/anaconda3/lib/python3.9/site-packages/chainladder/utils/weighted_regression.py:76: RuntimeWarning: invalid value encountered in sqrt\n", " residual = (y - fitted_value) * xp.sqrt(w)\n", + "/Users/kennethhsu/opt/anaconda3/lib/python3.9/site-packages/chainladder/utils/weighted_regression.py:81: RuntimeWarning: invalid value encountered in sqrt\n", + " std_err = xp.sqrt(mse / d)\n", "/Users/kennethhsu/opt/anaconda3/lib/python3.9/site-packages/chainladder/development/development.py:159: RuntimeWarning: invalid value encountered in sqrt\n", " / xp.swapaxes(xp.sqrt(x ** (2 - exponent))[..., 0:1, :], -1, -2)\n", "/Users/kennethhsu/opt/anaconda3/lib/python3.9/site-packages/chainladder/development/development.py:167: RuntimeWarning: invalid value encountered in sqrt\n", @@ -1657,7 +4186,6 @@ "output_type": "execute_result" } ], ->>>>>>> c23481473ff4beacbcca9e4b5243e2f78b4b5b08 "source": [ "cl_mod_bootstrapped = cl.Chainladder().fit(xyz_tri_sampled)\n", "cl_mod_bootstrapped" @@ -1673,14 +4201,11 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "id": "edeba1db-97e6-43df-b1c0-590c2d7cd098", "metadata": { "tags": [] }, -<<<<<<< HEAD - "outputs": [], -======= "outputs": [ { "data": { @@ -1694,7 +4219,7 @@ }, { "data": { - "image/png": "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", + "image/png": "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evrpp7V+/XqNGTNGkrRhwwalpaVp+/btGjdunN555x0VFxdrz549GjZsmCRpzZo1yszM1JEjRzRo0CCVlJTo8OHDqq6uls/nkyQtX75c06ZN08KFC5WQkBDu7gMAgB4k7DNCN998s1599VW99957kqS33npLZWVl+tGPfiRJOnr0qGpra5WVleXs43a7NWrUKO3atUuSVF5erubm5pAan8+n9PR0p2b37t3yeDxOCJKk4cOHy+PxhNSkp6c7IUiSxo0bp8bGRpWXl1+w/Y2Njaqvrw9ZAABA7xT2GaF7771XgUBA1113nSIjI9XS0qKFCxfq5z//uSSptrZWkpSamhqyX2pqqj788EOnJjo6WomJiW1qzu1fW1urlJSUNudPSUkJqTn/PImJiYqOjnZqzrd48WL95je/+abdBgAAPVDYZ4Sef/55bdiwQRs3btSbb76pdevWadmyZVq3bl1IncvlCnlvjGmz7nzn11yovj01XzR//nwFAgFnqa6uvmibAABAzxX2GaFf//rXuu+++/SP//iPkqShQ4fqww8/1OLFi3XHHXfI6/VK+ny25vLLL3f2q6urc2ZvvF6vmpqa5Pf7Q2aF6urqNGLECKfmxIkTbc5/8uTJkOPs3bs3ZLvf71dzc3ObmaJz3G633G53e7sPAAB6kLAHoU8++UQREaETTZGRkc7j8wMGDJDX61Vpaamuv/56SVJTU5N27typhx9+WJKUkZGhqKgolZaWasqUKZKkmpoaVVZWaunSpZKkzMxMBQIB7du3T3//938vSdq7d68CgYATljIzM7Vw4ULV1NQ4oaukpERut1sZGRnh7joAXNDV921t976tTZ86rwc/UKyI6Jh2HeeDJRPa3QagNwt7EJo4caIWLlyoq666Sn/3d3+nAwcOaMWKFfqnf/onSZ9/VJWfn69FixZp4MCBGjhwoBYtWqS+ffsqJydHkuTxeDR9+nQVFBSoX79+SkpK0rx58zR06FDnKbLBgwdr/PjxysvL05NPPilJuvPOO5Wdna1BgwZJkrKysjRkyBDl5ubqkUce0alTpzRv3jzl5eXxxBgAAAh/EFq1apUeeOABzZw5U3V1dfL5fJoxY4b+9V//1am55557dPbsWc2cOVN+v1/Dhg1TSUmJ4uPjnZpHH31Uffr00ZQpU3T27FndeuuteuaZZxQZGenUPPvss5ozZ47zdNmkSZO0evVqZ3tkZKS2bt2qmTNnauTIkYqNjVVOTo6WLVsW7m4DAIAeyGWMMV3diO6svr5eHo9HgUCAWSQA7fJtPxqrfvT/SZLS/uX3HfrRWHvbGa42Sh37EV4wGNQll1wiSWpoaFBcXFyHnevboJ3h8XWv3/zWGAAAsBZBCAAAWIsgBAAArEUQAgAA1iIIAQAAaxGEAACAtQhCAADAWgQhAABgLYIQAACwFkEIAABYiyAEAACsRRACAADWIggBAABrEYQAAIC1CEIAAMBaBCEAAGAtghAAALAWQQgAAFiLIAQAAKzVp6sbAADAN3H1fVvbtV9r06fO68EPFCsiOqbdbfhgyYR274vuhRkhAABgLYIQAACwFkEIAABYiyAEAACsRRACAADWIggBAABrEYQAAIC1CEIAAMBaBCEAAGAtghAAALAWQQgAAFiLIAQAAKxFEAIAANYiCAEAAGsRhAAAgLUIQgAAwFoEIQAAYC2CEAAAsBZBCAAAWIsgBCCsgsGgXC6XXC6XgsFgVzcHAC6KIAQAAKxFEAIAANYiCAEAAGsRhAAAgLUIQgAAwFp9uroBAICeLSI6Rv3v3dLVzQDahRkhAABgLWaEAAAIs6vv29rufVubPnVeD36gWBHRMe0+1gdLJrR7X1sQhAAAsFR3CGxdHdb4aAwAAFiLIAQAAKxFEAJgJX4TDYBEEAIAABbrkCB0/Phx/eIXv1C/fv3Ut29ffe9731N5ebmz3RijwsJC+Xw+xcbGavTo0Tp06FDIMRobGzV79mwlJycrLi5OkyZN0rFjx0Jq/H6/cnNz5fF45PF4lJubq9OnT4fUVFVVaeLEiYqLi1NycrLmzJmjpqamjug2AADoYcIehPx+v0aOHKmoqCj98Y9/1OHDh7V8+XJdeumlTs3SpUu1YsUKrV69Wvv375fX69XYsWN15swZpyY/P1+bN29WUVGRysrK1NDQoOzsbLW0tDg1OTk5qqioUHFxsYqLi1VRUaHc3Fxne0tLiyZMmKBgMKiysjIVFRVp06ZNKigoCHe3AQBADxT2x+cffvhhpaWlae3atc66q6++2nltjNHKlSu1YMECTZ48WZK0bt06paamauPGjZoxY4YCgYCefvpprV+/XmPGjJEkbdiwQWlpadq+fbvGjRund955R8XFxdqzZ4+GDRsmSVqzZo0yMzN15MgRDRo0SCUlJTp8+LCqq6vl8/kkScuXL9e0adO0cOFCJSQkhLv7AACgBwn7jNDLL7+sG2+8UT/96U+VkpKi66+/XmvWrHG2Hz16VLW1tcrKynLWud1ujRo1Srt27ZIklZeXq7m5OaTG5/MpPT3dqdm9e7c8Ho8TgiRp+PDh8ng8ITXp6elOCJKkcePGqbGxMeSjui9qbGxUfX19yAIAAHqnsAehv/71r3r88cc1cOBAvfLKK7rrrrs0Z84c/e53v5Mk1dbWSpJSU1ND9ktNTXW21dbWKjo6WomJiRetSUlJaXP+lJSUkJrzz5OYmKjo6Gin5nyLFy927jnyeDxKS0v7pkMAAAB6iLAHodbWVt1www1atGiRrr/+es2YMUN5eXl6/PHHQ+pcLlfIe2NMm3XnO7/mQvXtqfmi+fPnKxAIOEt1dfVF2wQAAHqusAehyy+/XEOGDAlZN3jwYFVVVUmSvF6vJLWZkamrq3Nmb7xer5qamuT3+y9ac+LEiTbnP3nyZEjN+efx+/1qbm5uM1N0jtvtVkJCQsgCAAB6p7AHoZEjR+rIkSMh69577z31799fkjRgwAB5vV6VlpY625uamrRz506NGDFCkpSRkaGoqKiQmpqaGlVWVjo1mZmZCgQC2rdvn1Ozd+9eBQKBkJrKykrV1NQ4NSUlJXK73crIyAhzzwEAQE8T9qfG/uVf/kUjRozQokWLNGXKFO3bt09PPfWUnnrqKUmff1SVn5+vRYsWaeDAgRo4cKAWLVqkvn37KicnR5Lk8Xg0ffp0FRQUqF+/fkpKStK8efM0dOhQ5ymywYMHa/z48crLy9OTTz4pSbrzzjuVnZ2tQYMGSZKysrI0ZMgQ5ebm6pFHHtGpU6c0b9485eXlMdMDAADCH4Ruuukmbd68WfPnz9dDDz2kAQMGaOXKlZo6dapTc8899+js2bOaOXOm/H6/hg0bppKSEsXHxzs1jz76qPr06aMpU6bo7NmzuvXWW/XMM88oMjLSqXn22Wc1Z84c5+mySZMmafXq1c72yMhIbd26VTNnztTIkSMVGxurnJwcLVu2LNzdBgAAPVDYg5AkZWdnKzs7+0u3u1wuFRYWqrCw8EtrYmJitGrVKq1atepLa5KSkrRhw4aLtuWqq67Sli1bvrLNAADAPvzWGAAAsBZBCAAAWIsgBAAArEUQAgAA1iIIAQAAaxGEAACAtQhCAADAWgQhAABgLYIQAACwVod8szQAIDwiomPU/16+HR/oKMwIAQAAaxGEAACAtQhCAADAWgQhAABgLYIQAACwFkEI6CGCwaBcLpdcLpeCwWBXNwcAegWCEAAAsBZBCAAAWIsgBAAArEUQAgAA1iIIAQAAaxGEAACAtQhCAADAWgQhQHxHDwDYiiAEAACsRRACAADWIggBAABrEYQAAIC1+nR1AwB0T1fft7Vd+7U2feq8HvxAsSKiY9rdhg+WTGj3vgDwdTAjBAAArEUQAgAA1iIIAQAAaxGEAACAtQhCAADAWgQhAABgLYIQAACwFt8jBKDHau93HUl83xGAzzEjBAAArEUQAgAA1uKjMQCAFSKiY9T/3i1d3Qx0M8wIAQAAaxGEAACAtQhCAADAWgQhAABgLYIQAACwFkEIAABYiyAEAACsRRACAADWIggBAABrEYQAAIC1CEIAAMBaBCEAAGCtDg9CixcvlsvlUn5+vrPOGKPCwkL5fD7FxsZq9OjROnToUMh+jY2Nmj17tpKTkxUXF6dJkybp2LFjITV+v1+5ubnyeDzyeDzKzc3V6dOnQ2qqqqo0ceJExcXFKTk5WXPmzFFTU1NHdRcAAPQgHRqE9u/fr6eeekrf+c53QtYvXbpUK1as0OrVq7V//355vV6NHTtWZ86ccWry8/O1efNmFRUVqaysTA0NDcrOzlZLS4tTk5OTo4qKChUXF6u4uFgVFRXKzc11tre0tGjChAkKBoMqKytTUVGRNm3apIKCgo7sNgAA6CH6dNSBGxoaNHXqVK1Zs0b/9m//5qw3xmjlypVasGCBJk+eLElat26dUlNTtXHjRs2YMUOBQEBPP/201q9frzFjxkiSNmzYoLS0NG3fvl3jxo3TO++8o+LiYu3Zs0fDhg2TJK1Zs0aZmZk6cuSIBg0apJKSEh0+fFjV1dXy+XySpOXLl2vatGlauHChEhISOqr7AAC0S0R0jPrfu6Wrm2GNDpsRuvvuuzVhwgQnyJxz9OhR1dbWKisry1nndrs1atQo7dq1S5JUXl6u5ubmkBqfz6f09HSnZvfu3fJ4PE4IkqThw4fL4/GE1KSnpzshSJLGjRunxsZGlZeXX7DdjY2Nqq+vD1kAAEDv1CEzQkVFRXrzzTe1f//+Nttqa2slSampqSHrU1NT9eGHHzo10dHRSkxMbFNzbv/a2lqlpKS0OX5KSkpIzfnnSUxMVHR0tFNzvsWLF+s3v/nN1+kmAADo4cI+I1RdXa1f/epX2rBhg2JiYr60zuVyhbw3xrRZd77zay5U356aL5o/f74CgYCzVFdXX7RNAACg5wp7ECovL1ddXZ0yMjLUp08f9enTRzt37tRvf/tb9enTx5mhOX9Gpq6uztnm9XrV1NQkv99/0ZoTJ060Of/JkydDas4/j9/vV3Nzc5uZonPcbrcSEhJCFgAA0DuFPQjdeuutOnjwoCoqKpzlxhtv1NSpU1VRUaFrrrlGXq9XpaWlzj5NTU3auXOnRowYIUnKyMhQVFRUSE1NTY0qKyudmszMTAUCAe3bt8+p2bt3rwKBQEhNZWWlampqnJqSkhK53W5lZGSEu+sAAFjj3E3d/e/doojoL/8EqLsL+z1C8fHxSk9PD1kXFxenfv36Oevz8/O1aNEiDRw4UAMHDtSiRYvUt29f5eTkSJI8Ho+mT5+ugoIC9evXT0lJSZo3b56GDh3q3Hw9ePBgjR8/Xnl5eXryySclSXfeeaeys7M1aNAgSVJWVpaGDBmi3NxcPfLIIzp16pTmzZunvLw8ZnrQZa6+b2u79mtt+tR5PfiB4m/1P54Plkxo974A0Jt02OPzF3PPPffo7Nmzmjlzpvx+v4YNG6aSkhLFx8c7NY8++qj69OmjKVOm6OzZs7r11lv1zDPPKDIy0ql59tlnNWfOHOfpskmTJmn16tXO9sjISG3dulUzZ87UyJEjFRsbq5ycHC1btqzzOgsAALqtTglCr7/+esh7l8ulwsJCFRYWfuk+MTExWrVqlVatWvWlNUlJSdqwYcNFz33VVVdpyxa+jwEAALTFb40BAABrEYQAAIC1uuQeIaAjtPcmZCl8NyJzEzIA9CzMCAEAAGsRhAAAgLUIQuhQwWBQLpdLLpdLwWCwq5sDAEAIghAAALAWQQgAAFiLIAQAAKxFEAIAANYiCAEAAGsRhAAAgLUIQgAAwFoEIQAAYC2CEAAAsBZBCAAAWIsgBAAArEUQAgAA1urT1Q0A0LtERMeo/71buroZAPC1MCMEAACsRRACAADWIggBAABrcY8QACtxLxMAiRkhAABgMYIQAACwFkEIAABYiyAEAACsRRACAADWIggBAABrEYQAAIC1CEIAAMBaBCEAAGAtghAAALAWQQgAAFiLIAQAAKxFEAIAANYiCAEAAGsRhAAAgLUIQgAAwFoEIQAAYK0+Xd0AdH9X37e13fu2Nn3qvB78QLEiomPafawPlkxo974AAFwIM0IAAMBaBCEAAGAtPhoDeoiI6Bj1v3dLVzcDAHoVghAgQgYA2IqPxgAAgLUIQgAAwFoEIQAAYC2CEAAAsBZBqIcKBoNyuVxyuVwKBoNd3RwAAHokghAAALAWQQgAAFgr7EFo8eLFuummmxQfH6+UlBT9+Mc/1pEjR0JqjDEqLCyUz+dTbGysRo8erUOHDoXUNDY2avbs2UpOTlZcXJwmTZqkY8eOhdT4/X7l5ubK4/HI4/EoNzdXp0+fDqmpqqrSxIkTFRcXp+TkZM2ZM0dNTU3h7jYAAOiBwh6Edu7cqbvvvlt79uxRaWmpPvvsM2VlZYXcx7J06VKtWLFCq1ev1v79++X1ejV27FidOXPGqcnPz9fmzZtVVFSksrIyNTQ0KDs7Wy0tLU5NTk6OKioqVFxcrOLiYlVUVCg3N9fZ3tLSogkTJigYDKqsrExFRUXatGmTCgoKwt1tAADQA4X9m6WLi4tD3q9du1YpKSkqLy/X97//fRljtHLlSi1YsECTJ0+WJK1bt06pqanauHGjZsyYoUAgoKefflrr16/XmDFjJEkbNmxQWlqatm/frnHjxumdd95RcXGx9uzZo2HDhkmS1qxZo8zMTB05ckSDBg1SSUmJDh8+rOrqavl8PknS8uXLNW3aNC1cuFAJCQnh7j4AAOhBOvweoUAgIElKSkqSJB09elS1tbXKyspyatxut0aNGqVdu3ZJksrLy9Xc3BxS4/P5lJ6e7tTs3r1bHo/HCUGSNHz4cHk8npCa9PR0JwRJ0rhx49TY2Kjy8vILtrexsVH19fUhCwAA6J06NAgZYzR37lzdfPPNSk9PlyTV1tZKklJTU0NqU1NTnW21tbWKjo5WYmLiRWtSUlLanDMlJSWk5vzzJCYmKjo62qk53+LFi517jjwej9LS0r5ptwEAQA/RoUFo1qxZevvtt/Xcc8+12eZyuULeG2ParDvf+TUXqm9PzRfNnz9fgUDAWaqrqy/aJgAA0HN1WBCaPXu2Xn75Ze3YsUNXXnmls97r9UpSmxmZuro6Z/bG6/WqqalJfr//ojUnTpxoc96TJ0+G1Jx/Hr/fr+bm5jYzRee43W4lJCSELAAAoHcKexAyxmjWrFl68cUX9dprr2nAgAEh2wcMGCCv16vS0lJnXVNTk3bu3KkRI0ZIkjIyMhQVFRVSU1NTo8rKSqcmMzNTgUBA+/btc2r27t2rQCAQUlNZWamamhqnpqSkRG63WxkZGeHuOgAA6GHC/tTY3XffrY0bN+oPf/iD4uPjnRkZj8ej2NhYuVwu5efna9GiRRo4cKAGDhyoRYsWqW/fvsrJyXFqp0+froKCAvXr109JSUmaN2+ehg4d6jxFNnjwYI0fP155eXl68sknJUl33nmnsrOzNWjQIElSVlaWhgwZotzcXD3yyCM6deqU5s2bp7y8PGZ6AABA+IPQ448/LkkaPXp0yPq1a9dq2rRpkqR77rlHZ8+e1cyZM+X3+zVs2DCVlJQoPj7eqX/00UfVp08fTZkyRWfPntWtt96qZ555RpGRkU7Ns88+qzlz5jhPl02aNEmrV692tkdGRmrr1q2aOXOmRo4cqdjYWOXk5GjZsmXh7jYAAOiBwh6EjDFfWeNyuVRYWKjCwsIvrYmJidGqVau0atWqL61JSkrShg0bLnquq666Slu2bPnKNgEAAPvwW2MAAMBaBCEAAGAtghAAALAWQQgAAFiLIAQAAKxFEAIAANYK++Pz+Gauvm9ru/ZrbfrUeT34gWJFRMe0uw0fLJnQ7n0BAOjJmBECAADWIggBAABrEYQAAIC1CEIAAMBaBCEAAGAtnhpDh4qIjlH/e/nRWwBA98SMEAAAsBZBCAAAWIsgBAAArEUQAgAA1iIIAQAAaxGEAACAtQhCAADAWgQhAABgLYIQAACwFkEIAABYiyAEAACsRRACAADWIggBAABr8evzPRS/6g4AwLfHjBAAALAWQQgAAFiLIAQAAKxFEAIAANYiCAEAAGsRhAAAgLUIQgAAwFoEIQAAYC2CEAAAsBZBCAAAWIsgBAAArEUQAgAA1iIIAQAAaxGEAACAtQhCAADAWgQhAABgLYIQAACwFkEIAABYiyAEAACsRRACAADWIggBAABrEYQAAIC1CEIAAMBaBCEAAGAtghAAALCWFUHoscce04ABAxQTE6OMjAz96U9/6uomAQCAbqDXB6Hnn39e+fn5WrBggQ4cOKBbbrlFt912m6qqqrq6aQAAoIv1+iC0YsUKTZ8+Xb/85S81ePBgrVy5UmlpaXr88ce7umkAAKCL9enqBnSkpqYmlZeX67777gtZn5WVpV27dl1wn8bGRjU2NjrvA4GAJKm+vr5D2tja+EmHHPeb+Kq+dYc2Sj2jnV/n74R2fn094b+51DPa2Vv+m0s9o53doY1Sz2hnR11fzx3XGHPxQtOLHT9+3Egy//M//xOyfuHCheZv//ZvL7jPgw8+aCSxsLCwsLCw9IKlurr6olmhV88IneNyuULeG2ParDtn/vz5mjt3rvO+tbVVp06dUr9+/b50n65SX1+vtLQ0VVdXKyEhoaub0+MxnuHDWIYX4xk+jGV4defxNMbozJkz8vl8F63r1UEoOTlZkZGRqq2tDVlfV1en1NTUC+7jdrvldrtD1l166aUd1cSwSEhI6HZ/gD0Z4xk+jGV4MZ7hw1iGV3cdT4/H85U1vfpm6ejoaGVkZKi0tDRkfWlpqUaMGNFFrQIAAN1Fr54RkqS5c+cqNzdXN954ozIzM/XUU0+pqqpKd911V1c3DQAAdLFeH4R+9rOf6eOPP9ZDDz2kmpoapaena9u2berfv39XN+1bc7vdevDBB9t8lIf2YTzDh7EML8YzfBjL8OoN4+ky5queKwMAAOidevU9QgAAABdDEAIAANYiCAEAAGsRhAAAgLUIQl3sjTfe0MSJE+Xz+eRyufTSSy+FbD9x4oSmTZsmn8+nvn37avz48frLX/4SUvP+++/rJz/5iS677DIlJCRoypQpOnHiREjNe++9p9tvv13JyclKSEjQyJEjtWPHjo7uXqdavHixbrrpJsXHxyslJUU//vGPdeTIkZAaY4wKCwvl8/kUGxur0aNH69ChQyE1jY2Nmj17tpKTkxUXF6dJkybp2LFjITV+v1+5ubnyeDzyeDzKzc3V6dOnO7qLnaazxvKDDz7Q9OnTNWDAAMXGxupv/uZv9OCDD6qpqalT+tlZOvNv84u13/ve9+RyuVRRUdFRXet0nT2WW7du1bBhwxQbG6vk5GRNnjy5Q/vX2TpzPLvtdejb/p4Xvp1t27aZBQsWmE2bNhlJZvPmzc621tZWM3z4cHPLLbeYffv2mXfffdfceeed5qqrrjINDQ3GGGMaGhrMNddcY37yk5+Yt99+27z99tvm9ttvNzfddJNpaWlxjnXttdeaH/3oR+att94y7733npk5c6bp27evqamp6ewud5hx48aZtWvXmsrKSlNRUWEmTJgQMlbGGLNkyRITHx9vNm3aZA4ePGh+9rOfmcsvv9zU19c7NXfddZe54oorTGlpqXnzzTfND37wA/Pd737XfPbZZ07N+PHjTXp6utm1a5fZtWuXSU9PN9nZ2Z3a347UWWP5xz/+0UybNs288sor5v333zd/+MMfTEpKiikoKOj0PnekzvzbPGfOnDnmtttuM5LMgQMHOqObnaIzx/L3v/+9SUxMNI8//rg5cuSIeffdd80LL7zQqf3taJ05nt31OkQQ6kbOD0JHjhwxkkxlZaWz7rPPPjNJSUlmzZo1xhhjXnnlFRMREWECgYBTc+rUKSPJlJaWGmOMOXnypJFk3njjDaemvr7eSDLbt2/v4F51nbq6OiPJ7Ny50xjzebD0er1myZIlTs2nn35qPB6PeeKJJ4wxxpw+fdpERUWZoqIip+b48eMmIiLCFBcXG2OMOXz4sJFk9uzZ49Ts3r3bSDLvvvtuZ3St03XUWF7I0qVLzYABAzqoJ91DR4/ntm3bzHXXXWcOHTrU64LQ+TpqLJubm80VV1xh/uM//qMTe9P1Omo8u/N1iI/GurHGxkZJUkxMjLMuMjJS0dHRKisrc2pcLlfIl1nFxMQoIiLCqenXr58GDx6s3/3udwoGg/rss8/05JNPKjU1VRkZGZ3Yo84VCAQkSUlJSZKko0ePqra2VllZWU6N2+3WqFGjtGvXLklSeXm5mpubQ2p8Pp/S09Odmt27d8vj8WjYsGFOzfDhw+XxeJya3qajxvLLznXuPL1VR47niRMnlJeXp/Xr16tv376d0Z0u1VFj+eabb+r48eOKiIjQ9ddfr8svv1y33XZbm4+EepuOGs/ufB0iCHVj1113nfr376/58+fL7/erqalJS5YsUW1trWpqaiR9fgGOi4vTvffeq08++UTBYFC//vWv1dra6tS4XC6VlpbqwIEDio+PV0xMjB599FEVFxd3+x+UbS9jjObOnaubb75Z6enpkuT8+O75P7ibmprqbKutrVV0dLQSExMvWpOSktLmnCkpKW1+4Lc36MixPN/777+vVatW9eqfwOnI8TTGaNq0abrrrrt04403dnRXulxHjuVf//pXSVJhYaHuv/9+bdmyRYmJiRo1apROnTrVof3qKh05nt35OkQQ6saioqK0adMmvffee0pKSlLfvn31+uuv67bbblNkZKQk6bLLLtMLL7yg//7v/9Yll1wij8ejQCCgG264wakxxmjmzJlKSUnRn/70J+3bt0+33367srOznbDU28yaNUtvv/22nnvuuTbbXC5XyHtjTJt15zu/5kL1X+c4PVFHj+U5H330kcaPH6+f/vSn+uUvf/ntGt2NdeR4rlq1SvX19Zo/f374GtyNdeRYtra2SpIWLFigf/iHf1BGRobWrl0rl8ulF154IUw96F46cjy783WIINTNZWRkqKKiQqdPn1ZNTY2Ki4v18ccfa8CAAU5NVlaW3n//fdXV1en//u//tH79eh0/ftypee2117RlyxYVFRVp5MiRuuGGG/TYY48pNjZW69at66qudZjZs2fr5Zdf1o4dO3TllVc6671eryS1mY2oq6tz/rXj9XrV1NQkv99/0Zrzn8qTpJMnT7b5V1NP19Fjec5HH32kH/zgB84PI/dWHT2er732mvbs2SO3260+ffro2muvlSTdeOONuuOOOzqsX12ho8fy8ssvlyQNGTLE2e52u3XNNdeoqqoq/B3qYp3xt9ldr0MEoR7C4/Hosssu01/+8hf9+c9/1u23396mJjk5WZdeeqlee+011dXVadKkSZKkTz75RJIUERH6nzsiIsL5V09vYIzRrFmz9OKLL+q1114LCYuSNGDAAHm9XpWWljrrmpqatHPnTo0YMULS58EzKioqpKampkaVlZVOTWZmpgKBgPbt2+fU7N27V4FAwKnp6TprLCXp+PHjGj16tG644QatXbu2zd9pb9BZ4/nb3/5Wb731lioqKlRRUaFt27ZJkp5//nktXLiwo7vZKTprLDMyMuR2u0MeJW9ubtYHH3zQK360+5zOGs9ufR3qvPuycSFnzpwxBw4cMAcOHDCSzIoVK8yBAwfMhx9+aIwx5r/+67/Mjh07zPvvv29eeukl079/fzN58uSQY/znf/6n2b17t/nf//1fs379epOUlGTmzp3rbD958qTp16+fmTx5sqmoqDBHjhwx8+bNM1FRUaaioqJT+9uR/vmf/9l4PB7z+uuvm5qaGmf55JNPnJolS5YYj8djXnzxRXPw4EHz85///IKPgV555ZVm+/bt5s033zQ//OEPL/j4/He+8x2ze/dus3v3bjN06NBe9fh8Z43l8ePHzbXXXmt++MMfmmPHjoWcqzfpzL/NLzp69Give2qsM8fyV7/6lbniiivMK6+8Yt59910zffp0k5KSYk6dOtWpfe5InTWe3fk6RBDqYjt27DCS2ix33HGHMcaYf//3fzdXXnmliYqKMldddZW5//77TWNjY8gx7r33XpOammqioqLMwIEDzfLly01ra2tIzf79+01WVpZJSkoy8fHxZvjw4Wbbtm2d1c1OcaFxlGTWrl3r1LS2tpoHH3zQeL1e43a7zfe//31z8ODBkOOcPXvWzJo1yyQlJZnY2FiTnZ1tqqqqQmo+/vhjM3XqVBMfH2/i4+PN1KlTjd/v74Redo7OGsu1a9d+6bl6k8782/yi3hiEOnMsm5qaTEFBgUlJSTHx8fFmzJgxIV9n0ht05nh21+uQyxhjOmauCQAAoHvrfR/GAwAAfE0EIQAAYC2CEAAAsBZBCAAAWIsgBAAArEUQAgAA1iIIAQAAaxGEAACAtQhCAADAWgQhAABgLYIQAACwFkEIAABY6/8D60xhLS+XklYAAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -1703,7 +4228,6 @@ "output_type": "display_data" } ], ->>>>>>> c23481473ff4beacbcca9e4b5243e2f78b4b5b08 "source": [ "plt.bar(\n", " cl_mod_bootstrapped.ultimate_.mean().to_frame(origin_as_datetime=True).index.year,\n",