{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "9c725d7f",
      "metadata": {},
      "source": [
        "# Model Onboarding\n",
        "\n",
        "Use this notebook for the exposure initial upload and risk dataset creation of a set of factor exposures using daily CSV files.\n",
        "\n",
        "The notebook contains a section that obtains coverage statistics of the created risk dataset against the uploaded exposures."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "d0882a15",
      "metadata": {},
      "outputs": [],
      "source": [
        "import datetime as dt\n",
        "import itertools as it\n",
        "import shutil\n",
        "import tempfile\n",
        "\n",
        "from pathlib import Path\n",
        "\n",
        "import polars as pl\n",
        "from tqdm import tqdm\n",
        "\n",
        "from bayesline.apiclient import BayeslineApiClient\n",
        "from bayesline.api.equity import (\n",
        "    CategoricalExposureGroupSettings,\n",
        "    ContinuousExposureGroupSettings,\n",
        "    ExposureSettings, \n",
        "    DerivedRiskDatasetSettings,\n",
        "    RiskDatasetReferencedExposureSettings,\n",
        "    RiskDatasetUploadedExposureSettings,\n",
        "    UniverseSettings,\n",
        ")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "9f9fa62a",
      "metadata": {
        "tags": [
          "skip-execution"
        ]
      },
      "outputs": [],
      "source": [
        "bln = BayeslineApiClient.new_client(\n",
        "    endpoint=\"https://[ENDPOINT]\",\n",
        "    api_key=\"[API-KEY]\",\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "df38a716",
      "metadata": {},
      "source": [
        "## Exposure Upload"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "a7043537",
      "metadata": {
        "tags": [
          "skip-execution"
        ]
      },
      "outputs": [],
      "source": [
        "exposure_dir = Path(\"/PATH/TO/EXPOSURES\")\n",
        "assert exposure_dir.exists()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "a34785f4",
      "metadata": {},
      "outputs": [],
      "source": [
        "exposure_dataset_name = \"My-Exposures\""
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5f2fbf16",
      "metadata": {},
      "source": [
        "Below creates a new exposure uploader for the chosen dataset name `My-Exposures`. See the [Uploaders Tutorial](https://docs.bayesline.com/0.14.0/notebooks/tutorial_uploaders.html) for a deep dive into the `Uploaders API`."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "e82496f3",
      "metadata": {},
      "outputs": [],
      "source": [
        "exposure_uploader = bln.equity.uploaders.get_data_type(\"exposures\")\n",
        "uploader = exposure_uploader.create_or_replace_dataset(exposure_dataset_name)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "79af5aba",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Found 31 files.\n",
            "Years: 2025\n"
          ]
        }
      ],
      "source": [
        "# list all csv files and group them by year\n",
        "# expects file pattern \"*_YYYY-MM-DD.csv\"\n",
        "\n",
        "all_files = sorted(exposure_dir.glob(\"*.csv\"))\n",
        "existing_files = uploader.get_staging_results().keys()\n",
        "\n",
        "files_by_year = {\n",
        "    k: list(v) \n",
        "    for k, v in \n",
        "    it.groupby(all_files, lambda x: int(x.name.split(\"_\")[1].split(\".\")[0].split(\"-\")[0]))\n",
        "}\n",
        "files_by_year.keys()\n",
        "\n",
        "print(f\"Found {len(all_files)} files.\")\n",
        "print(\"Years:\", \", \".join(map(str, files_by_year)))"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "824abe31",
      "metadata": {},
      "source": [
        "Below we batch the daily CSV files into annual Parquet files. Creating batched Parquet files is recommended as it will be much faster to upload and process compared to individually uploading daily files."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "b10d732c",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Created temp directory: /tmp/tmpdqjj1m6k\n"
          ]
        }
      ],
      "source": [
        "temp_dir = Path(tempfile.mkdtemp())\n",
        "print(f\"Created temp directory: {temp_dir}\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "ea121a3f",
      "metadata": {
        "tags": [
          "remove-output"
        ]
      },
      "outputs": [
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "\r",
            "  0%|          | 0/1 [00:00<?, ?it/s]"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "\r",
            "100%|██████████| 1/1 [00:00<00:00,  1.70it/s]"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "\r",
            "100%|██████████| 1/1 [00:00<00:00,  1.69it/s]"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "\n"
          ]
        }
      ],
      "source": [
        "for year, files in tqdm(files_by_year.items()):\n",
        "    parquet_path = temp_dir / f\"exposures_{year}.parquet\"\n",
        "    df = pl.scan_csv(files, try_parse_dates=True)\n",
        "    df.sink_parquet(parquet_path)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "id": "df6cb0ba",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div><style>\n",
              ".dataframe > thead > tr,\n",
              ".dataframe > tbody > tr {\n",
              "  text-align: right;\n",
              "  white-space: pre-wrap;\n",
              "}\n",
              "</style>\n",
              "<small>shape: (5, 11)</small><table border=\"1\" class=\"dataframe\"><thead><tr><th>date</th><th>asset_id</th><th>market^Market</th><th>style^Size</th><th>style^Value</th><th>style^Growth</th><th>style^Volatility</th><th>style^Momentum</th><th>style^Dividend</th><th>style^Leverage</th><th>asset_id_type</th></tr><tr><td>date</td><td>str</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>f64</td><td>str</td></tr></thead><tbody><tr><td>2025-05-01</td><td>&quot;IC000B1557&quot;</td><td>1.0</td><td>0.470459</td><td>1.3535156</td><td>-0.217041</td><td>-0.161893</td><td>0.6529541</td><td>0.066101</td><td>0.4144516</td><td>&quot;bayesid&quot;</td></tr><tr><td>2025-05-01</td><td>&quot;IC0010CEFE&quot;</td><td>1.0</td><td>-1.489746</td><td>-0.119995</td><td>-0.66748</td><td>2.1402996</td><td>-0.570312</td><td>0.029068</td><td>-0.318726</td><td>&quot;bayesid&quot;</td></tr><tr><td>2025-05-01</td><td>&quot;IC0021AFB7&quot;</td><td>1.0</td><td>-0.437744</td><td>-0.035828</td><td>-0.196411</td><td>-0.998698</td><td>0.69751</td><td>0.221924</td><td>-0.07859</td><td>&quot;bayesid&quot;</td></tr><tr><td>2025-05-01</td><td>&quot;IC002CE8B9&quot;</td><td>1.0</td><td>0.147491</td><td>0.7685547</td><td>-0.57666</td><td>1.3333334</td><td>-0.302246</td><td>0.21106</td><td>0.202637</td><td>&quot;bayesid&quot;</td></tr><tr><td>2025-05-01</td><td>&quot;IC002DC646&quot;</td><td>1.0</td><td>0.188354</td><td>0.014297</td><td>0.083984</td><td>-0.636719</td><td>-0.506348</td><td>0.33667</td><td>0.064331</td><td>&quot;bayesid&quot;</td></tr></tbody></table></div>"
            ],
            "text/plain": [
              "shape: (5, 11)\n",
              "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n",
              "│ date      ┆ asset_id  ┆ market^Ma ┆ style^Siz ┆ … ┆ style^Mom ┆ style^Div ┆ style^Lev ┆ asset_id │\n",
              "│ ---       ┆ ---       ┆ rket      ┆ e         ┆   ┆ entum     ┆ idend     ┆ erage     ┆ _type    │\n",
              "│ date      ┆ str       ┆ ---       ┆ ---       ┆   ┆ ---       ┆ ---       ┆ ---       ┆ ---      │\n",
              "│           ┆           ┆ f64       ┆ f64       ┆   ┆ f64       ┆ f64       ┆ f64       ┆ str      │\n",
              "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n",
              "│ 2025-05-0 ┆ IC000B155 ┆ 1.0       ┆ 0.470459  ┆ … ┆ 0.6529541 ┆ 0.066101  ┆ 0.4144516 ┆ bayesid  │\n",
              "│ 1         ┆ 7         ┆           ┆           ┆   ┆           ┆           ┆           ┆          │\n",
              "│ 2025-05-0 ┆ IC0010CEF ┆ 1.0       ┆ -1.489746 ┆ … ┆ -0.570312 ┆ 0.029068  ┆ -0.318726 ┆ bayesid  │\n",
              "│ 1         ┆ E         ┆           ┆           ┆   ┆           ┆           ┆           ┆          │\n",
              "│ 2025-05-0 ┆ IC0021AFB ┆ 1.0       ┆ -0.437744 ┆ … ┆ 0.69751   ┆ 0.221924  ┆ -0.07859  ┆ bayesid  │\n",
              "│ 1         ┆ 7         ┆           ┆           ┆   ┆           ┆           ┆           ┆          │\n",
              "│ 2025-05-0 ┆ IC002CE8B ┆ 1.0       ┆ 0.147491  ┆ … ┆ -0.302246 ┆ 0.21106   ┆ 0.202637  ┆ bayesid  │\n",
              "│ 1         ┆ 9         ┆           ┆           ┆   ┆           ┆           ┆           ┆          │\n",
              "│ 2025-05-0 ┆ IC002DC64 ┆ 1.0       ┆ 0.188354  ┆ … ┆ -0.506348 ┆ 0.33667   ┆ 0.064331  ┆ bayesid  │\n",
              "│ 1         ┆ 6         ┆           ┆           ┆   ┆           ┆           ┆           ┆          │\n",
              "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘"
            ]
          },
          "execution_count": 10,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "df.head().collect()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2ab29421",
      "metadata": {},
      "source": [
        "As a next step we iterate over the annual Parquet files and stage them in the uploader. See the [Uploaders Tutorial](https://docs.bayesline.com/0.14.0/notebooks/tutorial_uploaders.html#staging-data) for more details on the *staging* and *commit* concepts."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "id": "d61c8807",
      "metadata": {},
      "outputs": [],
      "source": [
        "for year in files_by_year.keys():\n",
        "    parquet = temp_dir / f\"exposures_{year}.parquet\"\n",
        "    result = uploader.stage_file(parquet)\n",
        "    assert result.success"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "id": "ac87d070",
      "metadata": {},
      "outputs": [],
      "source": [
        "shutil.rmtree(temp_dir)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9a829958",
      "metadata": {},
      "source": [
        "### Data Commit\n",
        "\n",
        "Next up we commit the data into versioned storage."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "id": "e42aebfe",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "UploadCommitResult(version=1, committed_names=['exposures_2025'])"
            ]
          },
          "execution_count": 13,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "uploader.commit(mode=\"append\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "95146afb",
      "metadata": {},
      "source": [
        "## Risk Dataset Creation\n",
        "\n",
        "Below creates a new *Risk Dataset* using above uploaded exposures. See the [Risk Datasets Tutorial](https://docs.bayesline.com/0.14.0/notebooks/tutorial_datasets.html) for a deep dive into the `Risk Datasets API`."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "id": "fa66001d",
      "metadata": {},
      "outputs": [],
      "source": [
        "risk_datasets = bln.equity.riskdatasets"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "id": "38f6622e",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "{'bayesline/Bayesline-US-500-1y': 'ready',\n",
              " 'bayesline/Bayesline-US-All-1y': 'ready'}"
            ]
          },
          "execution_count": 15,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# exisint datasets which can be used as reference datasets\n",
        "risk_datasets.get_dataset_names()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "id": "23471830",
      "metadata": {},
      "outputs": [],
      "source": [
        "risk_dataset_name = \"My-Risk-Dataset\""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "id": "e8252771",
      "metadata": {},
      "outputs": [],
      "source": [
        "risk_datasets.delete_dataset_if_exists(risk_dataset_name)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ff82c48a",
      "metadata": {},
      "source": [
        "We need to specify an assignment of which exposures are *style*, *region*, etc. Below lists those *factor groups* as they were extracted from the uploaded exposures."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "id": "8bfe11fd",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div><style>\n",
              ".dataframe > thead > tr,\n",
              ".dataframe > tbody > tr {\n",
              "  text-align: right;\n",
              "  white-space: pre-wrap;\n",
              "}\n",
              "</style>\n",
              "<small>shape: (2, 1)</small><table border=\"1\" class=\"dataframe\"><thead><tr><th>factor_group</th></tr><tr><td>str</td></tr></thead><tbody><tr><td>&quot;market&quot;</td></tr><tr><td>&quot;style&quot;</td></tr></tbody></table></div>"
            ],
            "text/plain": [
              "shape: (2, 1)\n",
              "┌──────────────┐\n",
              "│ factor_group │\n",
              "│ ---          │\n",
              "│ str          │\n",
              "╞══════════════╡\n",
              "│ market       │\n",
              "│ style        │\n",
              "└──────────────┘"
            ]
          },
          "execution_count": 18,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "uploader.get_data(columns=[\"factor_group\"], unique=True).collect()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "10203509",
      "metadata": {},
      "source": [
        "See API docs for [`DerivedRiskDatasetSettings`](https://docs.bayesline.com/0.14.0/_autosummary/bayesline.api.equity.DerivedRiskDatasetSettings.html) and [`RiskDatasetUploadedExposureSettings`](https://docs.bayesline.com/0.14.0/_autosummary/bayesline.api.equity.RiskDatasetUploadedExposureSettings.html) for other potential settings.\n",
        "\n",
        "In this recipe we pass through the industry hierarchy from the reference risk dataset, choose that our uploaded exposures make up the estimation universe and that we take the union of all assets across all of our exposures as the overall asset filter."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 19,
      "id": "794515b7",
      "metadata": {},
      "outputs": [],
      "source": [
        "settings = DerivedRiskDatasetSettings(\n",
        "    reference_dataset=\"bayesline/Bayesline-US-All-1y\",\n",
        "    exposures=[\n",
        "        RiskDatasetReferencedExposureSettings(\n",
        "            categorical_factor_groups=[\"trbc\"],\n",
        "            continuous_factor_groups=[],\n",
        "        ),\n",
        "        RiskDatasetUploadedExposureSettings(\n",
        "            exposure_source=exposure_dataset_name,\n",
        "            continuous_factor_groups=[\"market\", \"style\"],\n",
        "            categorical_factor_groups=[],\n",
        "        ),\n",
        "    ],\n",
        "    trim_start_date=dt.date(2025, 5, 1),\n",
        "    trim_assets=\"asset_union\",\n",
        ")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 20,
      "id": "27fb20d1",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div><style>\n",
              ".dataframe > thead > tr,\n",
              ".dataframe > tbody > tr {\n",
              "  text-align: right;\n",
              "  white-space: pre-wrap;\n",
              "}\n",
              "</style>\n",
              "<small>shape: (3_308_424, 23)</small><table border=\"1\" class=\"dataframe\"><thead><tr><th>date</th><th>bayesid</th><th>market.Market</th><th>style.Size</th><th>style.Value</th><th>style.Growth</th><th>style.Volatility</th><th>style.Momentum</th><th>style.Dividend</th><th>style.Leverage</th><th>trbc.Energy</th><th>trbc.Basic Materials</th><th>trbc.Industrials</th><th>trbc.Consumer Cyclicals</th><th>trbc.Consumer Non-Cyclicals</th><th>trbc.Financials</th><th>trbc.Healthcare</th><th>trbc.Technology</th><th>trbc.Utilities</th><th>trbc.Real Estate</th><th>trbc.Institutions, Associations &amp; Organizations</th><th>trbc.Government Activity</th><th>trbc.Academic &amp; Educational Services</th></tr><tr><td>date</td><td>str</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td></tr></thead><tbody><tr><td>2025-03-31</td><td>&quot;IC000B1557&quot;</td><td>1.0</td><td>0.4478</td><td>1.698971</td><td>0.089872</td><td>-0.039851</td><td>0.800677</td><td>0.28382</td><td>0.545074</td><td>1.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td></tr><tr><td>2025-03-31</td><td>&quot;IC0010CEFE&quot;</td><td>1.0</td><td>-1.285839</td><td>-1.222433</td><td>-0.329952</td><td>-1.720335</td><td>-0.308083</td><td>-0.722759</td><td>0.065942</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>1.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td></tr><tr><td>2025-03-31</td><td>&quot;IC0021AFB7&quot;</td><td>1.0</td><td>-0.051292</td><td>0.32115</td><td>0.089333</td><td>-1.19551</td><td>1.170225</td><td>0.043881</td><td>-0.063537</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>1.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td></tr><tr><td>2025-03-31</td><td>&quot;IC002CE8B9&quot;</td><td>1.0</td><td>0.182563</td><td>1.148245</td><td>-0.346659</td><td>1.208164</td><td>0.840697</td><td>0.036426</td><td>0.270647</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>1.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td></tr><tr><td>2025-03-31</td><td>&quot;IC002DC646&quot;</td><td>1.0</td><td>0.243023</td><td>0.433831</td><td>0.404471</td><td>-0.636615</td><td>-0.351917</td><td>0.312706</td><td>0.092901</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>1.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td></tr><tr><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td></tr><tr><td>2026-03-31</td><td>&quot;ICFFE60191&quot;</td><td>1.0</td><td>-0.273989</td><td>-0.719099</td><td>-0.455453</td><td>0.093599</td><td>0.41578</td><td>-0.023262</td><td>0.792578</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>1.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td></tr><tr><td>2026-03-31</td><td>&quot;ICFFE938FD&quot;</td><td>1.0</td><td>0.937859</td><td>0.453033</td><td>-1.984274</td><td>-0.396667</td><td>0.218596</td><td>1.212203</td><td>0.890377</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>1.0</td><td>0.0</td><td>0.0</td><td>0.0</td></tr><tr><td>2026-03-31</td><td>&quot;ICFFE94AED&quot;</td><td>1.0</td><td>0.172092</td><td>0.888173</td><td>0.230857</td><td>-1.064806</td><td>1.195682</td><td>1.02299</td><td>0.981633</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>1.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td></tr><tr><td>2026-03-31</td><td>&quot;ICFFEBBB38&quot;</td><td>1.0</td><td>0.594618</td><td>0.442887</td><td>0.610477</td><td>-0.939575</td><td>0.750127</td><td>0.424111</td><td>0.202413</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>1.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td></tr><tr><td>2026-03-31</td><td>&quot;ICFFF2F5AD&quot;</td><td>1.0</td><td>-0.719509</td><td>-0.759684</td><td>-2.317359</td><td>1.000015</td><td>-0.129688</td><td>-0.071235</td><td>-1.38441</td><td>0.0</td><td>1.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td><td>0.0</td></tr></tbody></table></div>"
            ],
            "text/plain": [
              "shape: (3_308_424, 23)\n",
              "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n",
              "│ date      ┆ bayesid   ┆ market.Ma ┆ style.Siz ┆ … ┆ trbc.Real ┆ trbc.Inst ┆ trbc.Gove ┆ trbc.Aca │\n",
              "│ ---       ┆ ---       ┆ rket      ┆ e         ┆   ┆ Estate    ┆ itutions, ┆ rnment    ┆ demic &  │\n",
              "│ date      ┆ str       ┆ ---       ┆ ---       ┆   ┆ ---       ┆ Associati ┆ Activity  ┆ Educatio │\n",
              "│           ┆           ┆ f32       ┆ f32       ┆   ┆ f32       ┆ on…       ┆ ---       ┆ nal Se…  │\n",
              "│           ┆           ┆           ┆           ┆   ┆           ┆ ---       ┆ f32       ┆ ---      │\n",
              "│           ┆           ┆           ┆           ┆   ┆           ┆ f32       ┆           ┆ f32      │\n",
              "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n",
              "│ 2025-03-3 ┆ IC000B155 ┆ 1.0       ┆ 0.4478    ┆ … ┆ 0.0       ┆ 0.0       ┆ 0.0       ┆ 0.0      │\n",
              "│ 1         ┆ 7         ┆           ┆           ┆   ┆           ┆           ┆           ┆          │\n",
              "│ 2025-03-3 ┆ IC0010CEF ┆ 1.0       ┆ -1.285839 ┆ … ┆ 0.0       ┆ 0.0       ┆ 0.0       ┆ 0.0      │\n",
              "│ 1         ┆ E         ┆           ┆           ┆   ┆           ┆           ┆           ┆          │\n",
              "│ 2025-03-3 ┆ IC0021AFB ┆ 1.0       ┆ -0.051292 ┆ … ┆ 0.0       ┆ 0.0       ┆ 0.0       ┆ 0.0      │\n",
              "│ 1         ┆ 7         ┆           ┆           ┆   ┆           ┆           ┆           ┆          │\n",
              "│ 2025-03-3 ┆ IC002CE8B ┆ 1.0       ┆ 0.182563  ┆ … ┆ 0.0       ┆ 0.0       ┆ 0.0       ┆ 0.0      │\n",
              "│ 1         ┆ 9         ┆           ┆           ┆   ┆           ┆           ┆           ┆          │\n",
              "│ 2025-03-3 ┆ IC002DC64 ┆ 1.0       ┆ 0.243023  ┆ … ┆ 0.0       ┆ 0.0       ┆ 0.0       ┆ 0.0      │\n",
              "│ 1         ┆ 6         ┆           ┆           ┆   ┆           ┆           ┆           ┆          │\n",
              "│ …         ┆ …         ┆ …         ┆ …         ┆ … ┆ …         ┆ …         ┆ …         ┆ …        │\n",
              "│ 2026-03-3 ┆ ICFFE6019 ┆ 1.0       ┆ -0.273989 ┆ … ┆ 0.0       ┆ 0.0       ┆ 0.0       ┆ 0.0      │\n",
              "│ 1         ┆ 1         ┆           ┆           ┆   ┆           ┆           ┆           ┆          │\n",
              "│ 2026-03-3 ┆ ICFFE938F ┆ 1.0       ┆ 0.937859  ┆ … ┆ 1.0       ┆ 0.0       ┆ 0.0       ┆ 0.0      │\n",
              "│ 1         ┆ D         ┆           ┆           ┆   ┆           ┆           ┆           ┆          │\n",
              "│ 2026-03-3 ┆ ICFFE94AE ┆ 1.0       ┆ 0.172092  ┆ … ┆ 0.0       ┆ 0.0       ┆ 0.0       ┆ 0.0      │\n",
              "│ 1         ┆ D         ┆           ┆           ┆   ┆           ┆           ┆           ┆          │\n",
              "│ 2026-03-3 ┆ ICFFEBBB3 ┆ 1.0       ┆ 0.594618  ┆ … ┆ 0.0       ┆ 0.0       ┆ 0.0       ┆ 0.0      │\n",
              "│ 1         ┆ 8         ┆           ┆           ┆   ┆           ┆           ┆           ┆          │\n",
              "│ 2026-03-3 ┆ ICFFF2F5A ┆ 1.0       ┆ -0.719509 ┆ … ┆ 0.0       ┆ 0.0       ┆ 0.0       ┆ 0.0      │\n",
              "│ 1         ┆ D         ┆           ┆           ┆   ┆           ┆           ┆           ┆          │\n",
              "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘"
            ]
          },
          "execution_count": 20,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "exposures_api = bln.equity.exposures.load(\n",
        "    ExposureSettings(\n",
        "        exposures=[\n",
        "            ContinuousExposureGroupSettings(hierarchy=\"market\"),\n",
        "            ContinuousExposureGroupSettings(hierarchy=\"style\", standardize_method=\"equal_weighted\"),\n",
        "            CategoricalExposureGroupSettings(hierarchy=\"trbc\"),\n",
        "        ],\n",
        "    ).with_dataset(\"bayesline/Bayesline-US-All-1y\")\n",
        ")\n",
        "exposures_api.get(\n",
        "    UniverseSettings(), \n",
        "    standardize_universe=None\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "dbaedfe5",
      "metadata": {},
      "source": [
        "Lastly we create the new dataset followed by describing its properties after creation."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 21,
      "id": "e0b32ff4",
      "metadata": {},
      "outputs": [],
      "source": [
        "my_risk_dataset = risk_datasets.create_dataset(risk_dataset_name, settings)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "00906c97",
      "metadata": {},
      "source": [
        "### Data Coverage\n",
        "\n",
        "As a first step after the risk dataset creation we cross check the asset coverage compared to our raw exposure upload."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 22,
      "id": "ff76f6d2",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div><style>\n",
              ".dataframe > thead > tr,\n",
              ".dataframe > tbody > tr {\n",
              "  text-align: right;\n",
              "  white-space: pre-wrap;\n",
              "}\n",
              "</style>\n",
              "<small>shape: (5, 6)</small><table border=\"1\" class=\"dataframe\"><thead><tr><th>date</th><th>n_assets</th><th>min_exposure</th><th>max_exposure</th><th>mean_exposure</th><th>std_exposure</th></tr><tr><td>date</td><td>i64</td><td>f32</td><td>f32</td><td>f64</td><td>f64</td></tr></thead><tbody><tr><td>2025-05-01</td><td>9108</td><td>-3.0</td><td>3.0</td><td>0.07378</td><td>0.871145</td></tr><tr><td>2025-05-02</td><td>9107</td><td>-3.0</td><td>3.0</td><td>0.075814</td><td>0.869677</td></tr><tr><td>2025-05-03</td><td>9106</td><td>-3.0</td><td>3.0</td><td>0.075695</td><td>0.869591</td></tr><tr><td>2025-05-04</td><td>9106</td><td>-3.0</td><td>3.0</td><td>0.075698</td><td>0.869592</td></tr><tr><td>2025-05-05</td><td>9107</td><td>-3.0</td><td>3.0</td><td>0.080996</td><td>0.868992</td></tr></tbody></table></div>"
            ],
            "text/plain": [
              "shape: (5, 6)\n",
              "┌────────────┬──────────┬──────────────┬──────────────┬───────────────┬──────────────┐\n",
              "│ date       ┆ n_assets ┆ min_exposure ┆ max_exposure ┆ mean_exposure ┆ std_exposure │\n",
              "│ ---        ┆ ---      ┆ ---          ┆ ---          ┆ ---           ┆ ---          │\n",
              "│ date       ┆ i64      ┆ f32          ┆ f32          ┆ f64           ┆ f64          │\n",
              "╞════════════╪══════════╪══════════════╪══════════════╪═══════════════╪══════════════╡\n",
              "│ 2025-05-01 ┆ 9108     ┆ -3.0         ┆ 3.0          ┆ 0.07378       ┆ 0.871145     │\n",
              "│ 2025-05-02 ┆ 9107     ┆ -3.0         ┆ 3.0          ┆ 0.075814      ┆ 0.869677     │\n",
              "│ 2025-05-03 ┆ 9106     ┆ -3.0         ┆ 3.0          ┆ 0.075695      ┆ 0.869591     │\n",
              "│ 2025-05-04 ┆ 9106     ┆ -3.0         ┆ 3.0          ┆ 0.075698      ┆ 0.869592     │\n",
              "│ 2025-05-05 ┆ 9107     ┆ -3.0         ┆ 3.0          ┆ 0.080996      ┆ 0.868992     │\n",
              "└────────────┴──────────┴──────────────┴──────────────┴───────────────┴──────────────┘"
            ]
          },
          "execution_count": 22,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "upload_stats_df = uploader.get_data_detail_summary()\n",
        "upload_stats_df.head()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 23,
      "id": "892c5776",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div><style>\n",
              ".dataframe > thead > tr,\n",
              ".dataframe > tbody > tr {\n",
              "  text-align: right;\n",
              "  white-space: pre-wrap;\n",
              "}\n",
              "</style>\n",
              "<small>shape: (2_258_896, 6)</small><table border=\"1\" class=\"dataframe\"><thead><tr><th>date</th><th>asset_id</th><th>asset_id_type</th><th>factor_group</th><th>factor</th><th>exposure</th></tr><tr><td>date</td><td>str</td><td>str</td><td>str</td><td>str</td><td>f32</td></tr></thead><tbody><tr><td>2025-05-29</td><td>&quot;ICAA2EFD35&quot;</td><td>&quot;bayesid&quot;</td><td>&quot;style&quot;</td><td>&quot;Dividend&quot;</td><td>-0.183716</td></tr><tr><td>2025-05-29</td><td>&quot;ICAA3A3F2F&quot;</td><td>&quot;bayesid&quot;</td><td>&quot;style&quot;</td><td>&quot;Dividend&quot;</td><td>-0.183716</td></tr><tr><td>2025-05-29</td><td>&quot;ICAA3BE3DD&quot;</td><td>&quot;bayesid&quot;</td><td>&quot;style&quot;</td><td>&quot;Dividend&quot;</td><td>0.151978</td></tr><tr><td>2025-05-29</td><td>&quot;ICAA3C9D8A&quot;</td><td>&quot;bayesid&quot;</td><td>&quot;style&quot;</td><td>&quot;Dividend&quot;</td><td>0.083496</td></tr><tr><td>2025-05-29</td><td>&quot;ICAA683694&quot;</td><td>&quot;bayesid&quot;</td><td>&quot;style&quot;</td><td>&quot;Dividend&quot;</td><td>-0.183716</td></tr><tr><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td><td>&hellip;</td></tr><tr><td>2025-05-31</td><td>&quot;IC95A06496&quot;</td><td>&quot;bayesid&quot;</td><td>&quot;style&quot;</td><td>&quot;Value&quot;</td><td>-0.117798</td></tr><tr><td>2025-05-31</td><td>&quot;IC95AC841D&quot;</td><td>&quot;bayesid&quot;</td><td>&quot;style&quot;</td><td>&quot;Value&quot;</td><td>0.391357</td></tr><tr><td>2025-05-31</td><td>&quot;IC95AD394E&quot;</td><td>&quot;bayesid&quot;</td><td>&quot;style&quot;</td><td>&quot;Value&quot;</td><td>0.486816</td></tr><tr><td>2025-05-31</td><td>&quot;IC95AED504&quot;</td><td>&quot;bayesid&quot;</td><td>&quot;style&quot;</td><td>&quot;Value&quot;</td><td>-1.547852</td></tr><tr><td>2025-05-31</td><td>&quot;IC95AEEB70&quot;</td><td>&quot;bayesid&quot;</td><td>&quot;style&quot;</td><td>&quot;Value&quot;</td><td>0.044647</td></tr></tbody></table></div>"
            ],
            "text/plain": [
              "shape: (2_258_896, 6)\n",
              "┌────────────┬────────────┬───────────────┬──────────────┬──────────┬───────────┐\n",
              "│ date       ┆ asset_id   ┆ asset_id_type ┆ factor_group ┆ factor   ┆ exposure  │\n",
              "│ ---        ┆ ---        ┆ ---           ┆ ---          ┆ ---      ┆ ---       │\n",
              "│ date       ┆ str        ┆ str           ┆ str          ┆ str      ┆ f32       │\n",
              "╞════════════╪════════════╪═══════════════╪══════════════╪══════════╪═══════════╡\n",
              "│ 2025-05-29 ┆ ICAA2EFD35 ┆ bayesid       ┆ style        ┆ Dividend ┆ -0.183716 │\n",
              "│ 2025-05-29 ┆ ICAA3A3F2F ┆ bayesid       ┆ style        ┆ Dividend ┆ -0.183716 │\n",
              "│ 2025-05-29 ┆ ICAA3BE3DD ┆ bayesid       ┆ style        ┆ Dividend ┆ 0.151978  │\n",
              "│ 2025-05-29 ┆ ICAA3C9D8A ┆ bayesid       ┆ style        ┆ Dividend ┆ 0.083496  │\n",
              "│ 2025-05-29 ┆ ICAA683694 ┆ bayesid       ┆ style        ┆ Dividend ┆ -0.183716 │\n",
              "│ …          ┆ …          ┆ …             ┆ …            ┆ …        ┆ …         │\n",
              "│ 2025-05-31 ┆ IC95A06496 ┆ bayesid       ┆ style        ┆ Value    ┆ -0.117798 │\n",
              "│ 2025-05-31 ┆ IC95AC841D ┆ bayesid       ┆ style        ┆ Value    ┆ 0.391357  │\n",
              "│ 2025-05-31 ┆ IC95AD394E ┆ bayesid       ┆ style        ┆ Value    ┆ 0.486816  │\n",
              "│ 2025-05-31 ┆ IC95AED504 ┆ bayesid       ┆ style        ┆ Value    ┆ -1.547852 │\n",
              "│ 2025-05-31 ┆ IC95AEEB70 ┆ bayesid       ┆ style        ┆ Value    ┆ 0.044647  │\n",
              "└────────────┴────────────┴───────────────┴──────────────┴──────────┴───────────┘"
            ]
          },
          "execution_count": 23,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "uploader.get_data().collect()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 24,
      "id": "c8af1724",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Categorical Hierarchies ['trbc']\n"
          ]
        }
      ],
      "source": [
        "# note that the industry and region hierarchy names tie out with the factor groups we specified above\n",
        "print(f\"Categorical Hierarchies {list(my_risk_dataset.describe().universe_settings_menu.categorical_hierarchies.keys())}\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 25,
      "id": "26d940e0",
      "metadata": {},
      "outputs": [],
      "source": [
        "universe_settings = UniverseSettings()\n",
        "\n",
        "universe_api = bln.equity.universes.load(\n",
        "    universe_settings.with_dataset(risk_dataset_name)\n",
        ")\n",
        "universe_counts = universe_api.counts()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 26,
      "id": "9e85f763",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Axes: xlabel='date'>"
            ]
          },
          "execution_count": 26,
          "metadata": {},
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "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g88++wyTJk2CEAJBQUFYunQpxowZY4qSiIiIqIYx+jg5NQnHySEiIqp5zDZODhEREVF1wJBDREREssSQQ0RERLLEkENERESyxJBDREREssSQQ0RERLLEkENERESyxJBDREREssSQQ0RERLLEkENERESyxJBDREREssSQQ0RERLLEkENERESyxJBDREREssSQQ0RERLLEkENERESyxJBDREREssSQQ0RERLLEkENERESyxJBDREREssSQQ0RERLLEkENERESyxJBDREREssSQQ0RERLLEkENERESyxJBDREREssSQQ0RERLJkkpCTm5uLqKgoNGjQAEqlEh07dsSRI0f087///nv07NkTHh4eUCgUOHHixH3bKCoqwoQJE+Dh4QEnJycMHDgQmZmZBsukpqaib9++cHBwgKenJ6ZOnYrS0lJTlEREREQ1jElCzujRoxEfH4+YmBgkJyejZ8+eiIyMxI0bNwAA+fn5iIiIwIcffljhNiZNmoSffvoJW7duxf79+5GWlobnnntOP1+r1aJv374oLi7Gr7/+irVr12LNmjWYPXu2KUoiIiKiGkYhhBDG3GBhYSGcnZ2xfft29O3bVz89JCQEvXv3xvz58/XTrly5goCAABw/fhxt2rTRT1epVKhbty42bNiA559/HgBw7tw5NGvWDAkJCQgLC8P//vc/9OvXD2lpafDy8gIArFixAtOnT8fNmzdha2v7r21Vq9VwdXWFSqWCi4uLkX4CREREZEqV/fw2ek9OaWkptFot7O3tDaYrlUocOnSoUts4evQoSkpKEBkZqZ/WtGlT1K9fHwkJCQCAhIQEtGzZUh9wAKBXr15Qq9U4ffp0udvVaDRQq9UGLyIiIpIno4ccZ2dnhIeHIzo6GmlpadBqtVi/fj0SEhKQnp5eqW1kZGTA1tYWbm5uBtO9vLyQkZGhX+begFM2v2xeeRYuXAhXV1f9y9/f/wGrIyIioprCJNfkxMTEQAgBPz8/2NnZYfny5RgyZAisrMx7M9eMGTOgUqn0r2vXrpm1PURERGQ6JkkdgYGB2L9/P/Ly8nDt2jUkJSWhpKQEjRo1qtT63t7eKC4uRk5OjsH0zMxMeHt765f5+91WZe/Llvk7Ozs7uLi4GLyIiIhInkzateLo6AgfHx9kZ2cjLi4O/fv3r9R6ISEhsLGxwe7du/XTzp8/j9TUVISH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A7y8vIxbRRVg3aybdbNuudUNWG7tllq3pXngkFOeiIgIjBkzBsOHD4dOpwMAWFlZ4dKlSzh69CgSExPRunVrDB8+/JEbXJ2wbtbNulm33OoGLLd2S61b1h71fNfly5eFl5eXwTnJey/QkivWzbpZt3xZat1CWG7tllq33D30ODnibgfQoUOH4OTkpD8nOXfuXLz11lvIysoyTgqrZlg36wZYN+uWH0ut3VLrthQP/YDOsgGTkpKSMHDgQMTHx2Ps2LEoKChATEwMPD09jdbI6oR1s27WzbrlyFJrt9S6LcajdAMVFhaKoKAgoVAohJ2dnfjggw8etWepRmDdrNsSsG7LqlsIy63dUuu2BI984fGTTz6Jxo0bY+nSpbC3tzdW9qr2WDfrtgSs27LqBiy3dkutW+4eOeRotVpYW1sbqz01Buu2LKzbslhq3YDl1m6pdcudUW4hJyIiIqpujPYUciIiIqLqhCGHiIiIZIkhh4iIiGSJIYeIiIhkiSGHiIiIZIkhh4iIiGSJIYeIaqRu3bohKirK3M0gomqMIYeIZG/fvn1QKBTIyckxd1OIqAox5BAREZEsMeQQUbWXn5+PYcOGwcnJCT4+PliyZInB/JiYGDz++ONwdnaGt7c3XnrpJWRlZQEArly5gu7duwMAateuDYVCgREjRgAAdDodFi5ciICAACiVSrRu3RrffvttldZGRKbDkENE1d7UqVOxf/9+bN++Hbt27cK+fftw7Ngx/fySkhJER0fj5MmT+OGHH3DlyhV9kPH398d3330HADh//jzS09OxbNkyAMDChQuxbt06rFixAqdPn8akSZPwyiuvYP/+/VVeIxEZH59dRUTVWl5eHjw8PLB+/Xq88MILAIA7d+6gXr16GDt2LD7++OP71vn999/Rvn175ObmwsnJCfv27UP37t2RnZ0NNzc3AIBGo4G7uzt++eUXhIeH69cdPXo0CgoKsGHDhqooj4hMqJa5G0BE9E8uX76M4uJihIaG6qe5u7sjODhY//7o0aN47733cPLkSWRnZ0On0wEAUlNT0bx583K3e+nSJRQUFODJJ580mF5cXIy2bduaoBIiqmoMOURUo+Xn56NXr17o1asXvvnmG9StWxepqano1asXiouLK1wvLy8PALBz5074+fkZzLOzszNpm4moajDkEFG1FhgYCBsbGyQmJqJ+/foAgOzsbFy4cAFdu3bFuXPncPv2bXzwwQfw9/cHIJ2uupetrS0AQKvV6qc1b94cdnZ2SE1NRdeuXauoGiKqSgw5RFStOTk5YdSoUZg6dSo8PDzg6emJd999F1ZW0n0T9evXh62tLT755BO8/vrrOHXqFKKjow220aBBAygUCuzYsQN9+vSBUqmEs7Mz3n77bUyaNAk6nQ4RERFQqVQ4fPgwXFxcMHz4cHOUS0RGxLuriKjaW7x4MTp37oynn34akZGRiIiIQEhICACgbt26WLNmDbZu3YrmzZvjgw8+wP/93/8ZrO/n54e5c+finXfegZeXF9544w0AQHR0NGbNmoWFCxeiWbNmeOqpp7Bz504EBARUeY1EZHy8u4qIiIhkiT05REREJEsMOURERCRLDDlEREQkSww5REREJEsMOURERCRLDDlEREQkSww5REREJEsMOURERCRLDDlEREQkSww5REREJEsMOURERCRL/w/iLyQnzsD6kwAAAABJRU5ErkJggg==",
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "(\n",
        "    universe_counts\n",
        "    .join(\n",
        "        upload_stats_df.select(\"date\", \"n_assets\").rename({\"n_assets\": \"Uploaded\"}),\n",
        "        on=\"date\",\n",
        "        how=\"left\",\n",
        "    )\n",
        "    .sort(\"date\")\n",
        "    .to_pandas()\n",
        "    .set_index(\"date\")\n",
        "    .plot()\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "64b27e8e",
      "metadata": {},
      "source": [
        "We can pull some exposures from the new risk dataset to verify."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 27,
      "id": "31b87572",
      "metadata": {},
      "outputs": [],
      "source": [
        "exposures_api = bln.equity.exposures.load(\n",
        "    ExposureSettings(\n",
        "        exposures=[\n",
        "            ContinuousExposureGroupSettings(hierarchy=\"market\"),\n",
        "            ContinuousExposureGroupSettings(hierarchy=\"style\", standardize_method=\"equal_weighted\"),\n",
        "        ],\n",
        "    ).with_dataset(risk_dataset_name)\n",
        ")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 28,
      "id": "0b5f08d7",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div><style>\n",
              ".dataframe > thead > tr,\n",
              ".dataframe > tbody > tr {\n",
              "  text-align: right;\n",
              "  white-space: pre-wrap;\n",
              "}\n",
              "</style>\n",
              "<small>shape: (5, 10)</small><table border=\"1\" class=\"dataframe\"><thead><tr><th>date</th><th>bayesid</th><th>market.Market</th><th>style.Dividend</th><th>style.Growth</th><th>style.Leverage</th><th>style.Momentum</th><th>style.Size</th><th>style.Value</th><th>style.Volatility</th></tr><tr><td>date</td><td>str</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td><td>f32</td></tr></thead><tbody><tr><td>2025-05-31</td><td>&quot;ICFFE54368&quot;</td><td>1.0</td><td>-0.844152</td><td>-0.702781</td><td>0.094035</td><td>-1.14596</td><td>0.962314</td><td>-2.420384</td><td>0.370091</td></tr><tr><td>2025-05-31</td><td>&quot;ICFFE60191&quot;</td><td>1.0</td><td>-0.107817</td><td>-0.069119</td><td>-0.164538</td><td>0.38831</td><td>-0.501507</td><td>0.246586</td><td>0.64925</td></tr><tr><td>2025-05-31</td><td>&quot;ICFFE94AED&quot;</td><td>1.0</td><td>1.232723</td><td>0.386306</td><td>1.141383</td><td>0.702094</td><td>0.179885</td><td>1.009319</td><td>-1.267412</td></tr><tr><td>2025-05-31</td><td>&quot;ICFFEBBB38&quot;</td><td>1.0</td><td>0.400454</td><td>0.678276</td><td>0.293858</td><td>0.704019</td><td>0.635378</td><td>0.376627</td><td>-1.352522</td></tr><tr><td>2025-05-31</td><td>&quot;ICFFF2F5AD&quot;</td><td>1.0</td><td>-0.116423</td><td>-0.081757</td><td>-0.172153</td><td>-0.798808</td><td>-0.521222</td><td>0.244388</td><td>0.196752</td></tr></tbody></table></div>"
            ],
            "text/plain": [
              "shape: (5, 10)\n",
              "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n",
              "│ date      ┆ bayesid   ┆ market.Ma ┆ style.Div ┆ … ┆ style.Mom ┆ style.Siz ┆ style.Val ┆ style.Vo │\n",
              "│ ---       ┆ ---       ┆ rket      ┆ idend     ┆   ┆ entum     ┆ e         ┆ ue        ┆ latility │\n",
              "│ date      ┆ str       ┆ ---       ┆ ---       ┆   ┆ ---       ┆ ---       ┆ ---       ┆ ---      │\n",
              "│           ┆           ┆ f32       ┆ f32       ┆   ┆ f32       ┆ f32       ┆ f32       ┆ f32      │\n",
              "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n",
              "│ 2025-05-3 ┆ ICFFE5436 ┆ 1.0       ┆ -0.844152 ┆ … ┆ -1.14596  ┆ 0.962314  ┆ -2.420384 ┆ 0.370091 │\n",
              "│ 1         ┆ 8         ┆           ┆           ┆   ┆           ┆           ┆           ┆          │\n",
              "│ 2025-05-3 ┆ ICFFE6019 ┆ 1.0       ┆ -0.107817 ┆ … ┆ 0.38831   ┆ -0.501507 ┆ 0.246586  ┆ 0.64925  │\n",
              "│ 1         ┆ 1         ┆           ┆           ┆   ┆           ┆           ┆           ┆          │\n",
              "│ 2025-05-3 ┆ ICFFE94AE ┆ 1.0       ┆ 1.232723  ┆ … ┆ 0.702094  ┆ 0.179885  ┆ 1.009319  ┆ -1.26741 │\n",
              "│ 1         ┆ D         ┆           ┆           ┆   ┆           ┆           ┆           ┆ 2        │\n",
              "│ 2025-05-3 ┆ ICFFEBBB3 ┆ 1.0       ┆ 0.400454  ┆ … ┆ 0.704019  ┆ 0.635378  ┆ 0.376627  ┆ -1.35252 │\n",
              "│ 1         ┆ 8         ┆           ┆           ┆   ┆           ┆           ┆           ┆ 2        │\n",
              "│ 2025-05-3 ┆ ICFFF2F5A ┆ 1.0       ┆ -0.116423 ┆ … ┆ -0.798808 ┆ -0.521222 ┆ 0.244388  ┆ 0.196752 │\n",
              "│ 1         ┆ D         ┆           ┆           ┆   ┆           ┆           ┆           ┆          │\n",
              "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘"
            ]
          },
          "execution_count": 28,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "df = exposures_api.get(universe_settings, standardize_universe=None)\n",
        "\n",
        "df.tail()"
      ]
    }
  ],
  "metadata": {
    "jupytext": {
      "text_representation": {
        "extension": ".py",
        "format_name": "percent",
        "format_version": "1.3",
        "jupytext_version": "1.19.3"
      }
    },
    "kernelspec": {
      "display_name": ".venv",
      "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.11.15"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}