Project_Carmignac/repair.ipynb

2432 lines
1.3 MiB
Plaintext
Raw Normal View History

2026-03-10 18:45:51 +01:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "29f7e620-7b04-45f6-ac87-f17505f140c3",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import plotly.graph_objects as go\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "a48ad016-e4f2-40d9-a607-344a316f5f02",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_3758/242871890.py:1: DtypeWarning: Columns (1,2,3,4) have mixed types. Specify dtype option on import or set low_memory=False.\n",
" stocks = pd.read_csv(\"stocks.csv\")\n",
"/tmp/ipykernel_3758/242871890.py:2: DtypeWarning: Columns (1,2,3,4) have mixed types. Specify dtype option on import or set low_memory=False.\n",
" flows = pd.read_csv(\"flows.csv\")\n"
]
}
],
"source": [
"stocks = pd.read_csv(\"stocks.csv\")\n",
"flows = pd.read_csv(\"flows.csv\")\n",
"\n",
"stocks[\"Centralisation Date\"] = pd.to_datetime(stocks[\"Centralisation Date\"])\n",
"flows[\"Centralisation Date\"] = pd.to_datetime(flows[\"Centralisation Date\"])"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "3c6d9d05-b203-49ae-869f-7f85ead2c69e",
"metadata": {},
"outputs": [],
"source": [
"keys = [\n",
" \"Registrar Account - ID\",\n",
" \"Product - Isin\",\n",
" \"Centralisation Date\"\n",
"]\n",
"\n",
"stocks = stocks[keys + [\"Quantity - AUM\"]]\n",
"\n",
"flows = flows[keys + [\"Quantity - NetFlows\"]]\n",
"\n",
"flows = (\n",
" flows\n",
" .groupby(keys, as_index=False)\n",
" .sum()\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "d30c2235-281b-41a6-828b-abb6fcfc4183",
"metadata": {},
"outputs": [],
"source": [
"df = stocks.merge(flows, on=keys, how=\"left\")\n",
"\n",
"df[\"Quantity - NetFlows\"] = df[\"Quantity - NetFlows\"].fillna(0)\n",
"\n",
"df = df.sort_values(keys)\n",
"\n",
"\n",
"\n",
"# REBUILD ACCOUNTING IDENTITY\n",
"\n",
"\n",
"df[\"prev_aum\"] = df.groupby(\n",
" [\"Registrar Account - ID\",\"Product - Isin\"]\n",
")[\"Quantity - AUM\"].shift(1)\n",
"\n",
"df[\"prev_flow\"] = df.groupby(\n",
" [\"Registrar Account - ID\",\"Product - Isin\"]\n",
")[\"Quantity - NetFlows\"].shift(1).fillna(0)\n",
"\n",
"df[\"expected_aum\"] = df[\"prev_aum\"] + df[\"prev_flow\"]\n",
"\n",
"\n",
"\n",
"# GAP ANALYSIS\n",
"\n",
"\n",
"df[\"gap\"] = df[\"Quantity - AUM\"] - df[\"expected_aum\"]\n",
"df[\"gap_abs\"] = df[\"gap\"].abs()\n",
"\n",
"EPS = 10\n",
"\n",
"df[\"rupture_flag\"] = (\n",
" df[\"prev_aum\"].notna()\n",
" & (df[\"gap_abs\"] > EPS)\n",
")\n",
"\n",
"\n",
"\n",
"# PARAMETERS\n",
"\n",
"\n",
"GAP_TOL = 1e-6\n",
"REL_GAP_THR = 0.05\n",
"MIN_PERSISTENCE = 3\n",
"\n",
"\n",
"\n",
"# SORT DATA\n",
"\n",
"\n",
"df = df.sort_values(\n",
" [\"Registrar Account - ID\", \"Product - Isin\", \"Centralisation Date\"]\n",
")\n",
"\n",
"df[\"corrected_aum\"] = df[\"Quantity - AUM\"]\n",
"df[\"repair_flag\"] = False\n",
"\n",
"\n",
"# REBUILD EXPECTED AUM BEFORE REPAIR\n",
"\n",
"\n",
"df = df.sort_values(\n",
" [\"Registrar Account - ID\", \"Product - Isin\", \"Centralisation Date\"]\n",
")\n",
"\n",
"df[\"prev_aum\"] = (\n",
" df.groupby([\"Registrar Account - ID\",\"Product - Isin\"])\n",
" [\"Quantity - AUM\"]\n",
" .shift(1)\n",
")\n",
"\n",
"df[\"prev_flow\"] = (\n",
" df.groupby([\"Registrar Account - ID\",\"Product - Isin\"])\n",
" [\"Quantity - NetFlows\"]\n",
" .shift(1)\n",
" .fillna(0)\n",
")\n",
"\n",
"df[\"expected_stock\"] = df[\"prev_aum\"] + df[\"prev_flow\"]\n",
"\n",
"#delete negative AUM\n",
"df = df[df[\"Quantity - AUM\"] >= 0]"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "efd374d0-6393-45f2-926e-2c29249cd078",
"metadata": {},
"outputs": [],
"source": [
"def repair_group(g):\n",
"\n",
" g = g.copy()\n",
"\n",
" obs = g[\"Quantity - AUM\"].values\n",
" flows = g[\"Quantity - NetFlows\"].values\n",
"\n",
" corrected = obs.copy()\n",
"\n",
" \n",
" # Build expected AUM path\n",
" \n",
"\n",
" expected = np.empty_like(obs)\n",
" expected[0] = np.nan\n",
"\n",
" for t in range(1, len(obs)):\n",
" expected[t] = corrected[t-1] + flows[t-1]\n",
"\n",
" gap = obs - expected\n",
"\n",
" rel_gap = np.abs(gap) / np.maximum(np.abs(expected), 1.0)\n",
"\n",
" idx = None\n",
"\n",
" \n",
" # Detect persistent shift\n",
" \n",
"\n",
" for i in range(1, len(obs) - MIN_PERSISTENCE):\n",
"\n",
" if (\n",
" rel_gap[i] > REL_GAP_THR\n",
" and np.all(np.abs(gap[i:i+MIN_PERSISTENCE] - gap[i]) < GAP_TOL)\n",
" and np.all(np.abs(np.diff(flows[i:i+MIN_PERSISTENCE])) < GAP_TOL)\n",
" ):\n",
" idx = i\n",
" break\n",
"\n",
" if idx is None:\n",
" return g\n",
"\n",
" \n",
" # Compute shift\n",
" \n",
"\n",
" shift = gap[idx]\n",
"\n",
" candidate = obs[idx:] - shift\n",
"\n",
" \n",
" # SAFETY CHECKS\n",
" \n",
"\n",
" # 1. do not allow negative AUM\n",
" # refuse repair if it creates NEW negative AUM\n",
" if ((candidate < 0) & (obs[idx:] >= 0)).any():\n",
" return g\n",
"\n",
" # 2. avoid extreme corrections\n",
" if abs(shift) > 2 * np.nanmax(np.abs(obs)):\n",
" return g\n",
"\n",
" \n",
" # Apply correction\n",
" \n",
"\n",
" corrected[idx:] = candidate\n",
"\n",
" g.loc[g.index[idx]:, \"repair_flag\"] = True\n",
"\n",
" \n",
" # Rebuild expected path after repair\n",
" \n",
"\n",
" expected_corr = np.empty_like(obs)\n",
" expected_corr[0] = np.nan\n",
"\n",
" for t in range(1, len(obs)):\n",
" expected_corr[t] = corrected[t-1] + flows[t-1]\n",
"\n",
" g[\"corrected_aum\"] = corrected\n",
" g[\"expected_stock_corr\"] = expected_corr\n",
"\n",
" return g"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "fe1f869c-0a00-47e0-9355-3705b23561c7",
"metadata": {},
"outputs": [],
"source": [
"def repair_group(g):\n",
"\n",
" g = g.copy()\n",
"\n",
" obs = g[\"Quantity - AUM\"].values\n",
" flows = g[\"Quantity - NetFlows\"].values\n",
"\n",
" corrected = obs.copy()\n",
"\n",
" # Build expected AUM path\n",
" expected = np.empty_like(obs)\n",
" expected[0] = np.nan\n",
"\n",
" for t in range(1, len(obs)):\n",
" expected[t] = corrected[t-1] + flows[t-1]\n",
"\n",
" gap = obs - expected\n",
" rel_gap = np.abs(gap) / np.maximum(np.abs(expected), 1.0)\n",
"\n",
" idx = None\n",
" shift = None\n",
"\n",
" for i in range(1, len(obs) - MIN_PERSISTENCE - 1):\n",
"\n",
" # ------------------------------------------------\n",
" # CASE 1 — standard persistent shift (original algo)\n",
" # ------------------------------------------------\n",
" if (\n",
" rel_gap[i] > REL_GAP_THR\n",
" and np.all(np.abs(gap[i:i+MIN_PERSISTENCE] - gap[i]) < GAP_TOL)\n",
" and np.all(np.abs(np.diff(flows[i:i+MIN_PERSISTENCE])) < GAP_TOL)\n",
" ):\n",
" idx = i\n",
" shift = gap[i]\n",
" break\n",
"\n",
" # ------------------------------------------------\n",
" # CASE 2 — double shift\n",
" # ------------------------------------------------\n",
" if (\n",
" rel_gap[i] > REL_GAP_THR\n",
" and rel_gap[i+1] > REL_GAP_THR\n",
" and np.all(np.abs(gap[i+1:i+1+MIN_PERSISTENCE] - gap[i+1]) < GAP_TOL)\n",
" and np.all(np.abs(np.diff(flows[i+1:i+1+MIN_PERSISTENCE])) < GAP_TOL)\n",
" ):\n",
" idx = i\n",
" shift = gap[i+1]\n",
" break\n",
"\n",
" if idx is None:\n",
" return g\n",
"\n",
" # Apply shift\n",
" candidate = obs[idx:] - shift\n",
"\n",
" # Safety checks\n",
"\n",
" # avoid creating new negative AUM\n",
" if ((candidate < 0) & (obs[idx:] >= 0)).any():\n",
" return g\n",
"\n",
" # avoid extreme corrections\n",
" if abs(shift) > 2 * np.nanmax(np.abs(obs)):\n",
" return g\n",
"\n",
" corrected[idx:] = candidate\n",
"\n",
" g.loc[g.index[idx]:, \"repair_flag\"] = True\n",
"\n",
" # rebuild expected path after repair\n",
" expected_corr = np.empty_like(obs)\n",
" expected_corr[0] = np.nan\n",
"\n",
" for t in range(1, len(obs)):\n",
" expected_corr[t] = corrected[t-1] + flows[t-1]\n",
"\n",
" g[\"corrected_aum\"] = corrected\n",
" g[\"expected_stock_corr\"] = expected_corr\n",
"\n",
" return g"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "f94f07b4-e053-4828-bbb1-3697f9a11751",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_3758/3656779442.py:4: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n",
" .apply(repair_group)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Before repair After repair Repaired points\n",
"0 749673 7672 6401\n",
"\n",
"NUMBER OF MODIFIED OBSERVATIONS: 2408073\n",
"Share modified: 26.67 %\n",
"\n",
"TOTAL AUM\n",
"Raw total : 82015854859.97653\n",
"Repaired total : 82055800782.67682\n"
]
}
],
"source": [
"df = (\n",
" df\n",
" .groupby([\"Registrar Account - ID\", \"Product - Isin\"], group_keys=False)\n",
" .apply(repair_group)\n",
")\n",
"\n",
"# VALIDATION BEFORE / AFTER\n",
"\n",
"df[\"prev_aum\"] = (\n",
" df.groupby([\"Registrar Account - ID\",\"Product - Isin\"])\n",
" [\"Quantity - AUM\"]\n",
" .shift(1)\n",
")\n",
"\n",
"df[\"prev_flow\"] = (\n",
" df.groupby([\"Registrar Account - ID\",\"Product - Isin\"])\n",
" [\"Quantity - NetFlows\"]\n",
" .shift(1)\n",
" .fillna(0)\n",
")\n",
"\n",
"df[\"expected_stock\"] = df[\"prev_aum\"] + df[\"prev_flow\"]\n",
"df[\"gap_before\"] = df[\"Quantity - AUM\"] - df[\"expected_stock\"]\n",
"\n",
"df[\"gap_after\"] = df[\"corrected_aum\"] - df[\"expected_stock_corr\"]\n",
"\n",
"df[\"rupture_before\"] = df[\"gap_before\"].abs() > GAP_TOL\n",
"\n",
"df[\"rupture_after\"] = df[\"gap_after\"].abs() > GAP_TOL\n",
"\n",
"\n",
"\n",
"# SUMMARY\n",
"\n",
"\n",
"summary = pd.DataFrame({\n",
" \"Before repair\": [df[\"rupture_before\"].sum()],\n",
" \"After repair\": [df[\"rupture_after\"].sum()],\n",
" \"Repaired points\": [df[\"repair_flag\"].sum()]\n",
"})\n",
"\n",
"print(summary)\n",
"\n",
"\n",
"\n",
"# BUILD REPAIRED DATASET\n",
"\n",
"\n",
"stocks_repaired = stocks.copy()\n",
"\n",
"repair_map = df[[\n",
" \"Registrar Account - ID\",\n",
" \"Product - Isin\",\n",
" \"Centralisation Date\",\n",
" \"corrected_aum\",\n",
" \"repair_flag\"\n",
"]]\n",
"\n",
"stocks_repaired = stocks_repaired.merge(\n",
" repair_map,\n",
" on=keys,\n",
" how=\"left\"\n",
")\n",
"\n",
"stocks_repaired[\"Quantity - AUM\"] = np.where(\n",
" stocks_repaired[\"repair_flag\"] == True,\n",
" stocks_repaired[\"corrected_aum\"],\n",
" stocks_repaired[\"Quantity - AUM\"]\n",
")\n",
"\n",
"stocks_repaired.to_csv(\"stock_repaired.csv\", index=False)\n",
"\n",
"\n",
"\n",
"# COMPARISON RAW VS REPAIRED\n",
"\n",
"\n",
"df_compare = stocks.merge(\n",
" stocks_repaired,\n",
" on=keys,\n",
" how=\"inner\",\n",
" suffixes=(\"_raw\",\"_repaired\")\n",
")\n",
"\n",
"df_compare[\"aum_diff\"] = (\n",
" df_compare[\"Quantity - AUM_repaired\"]\n",
" - df_compare[\"Quantity - AUM_raw\"]\n",
")\n",
"\n",
"print(\"\\nNUMBER OF MODIFIED OBSERVATIONS:\",\n",
" (df_compare[\"aum_diff\"] != 0).sum())\n",
"\n",
"print(\"Share modified:\",\n",
" round((df_compare[\"aum_diff\"] != 0).mean()*100,2), \"%\")\n",
"\n",
"print(\"\\nTOTAL AUM\")\n",
"\n",
"print(\"Raw total :\", df_compare[\"Quantity - AUM_raw\"].sum())\n",
"print(\"Repaired total :\", df_compare[\"Quantity - AUM_repaired\"].sum())\n",
"\n",
"\n",
"\n",
"# RUPTURE DISTRIBUTION BEFORE / AFTER\n",
"\n",
"\n",
"def rupture_distribution(df, flag):\n",
"\n",
" rupture_summary = (\n",
" df.groupby([\"Registrar Account - ID\",\"Product - Isin\"])\n",
" .agg(\n",
" n_ruptures=(flag,\"sum\"),\n",
" total_obs=(flag,\"count\"),\n",
" rupture_ratio=(flag,\"mean\")\n",
" )\n",
" .reset_index()\n",
" )\n",
"\n",
" rs = rupture_summary.copy()\n",
"\n",
" bins = [0,0.01,0.10,0.30,1.01]\n",
"\n",
" labels = [\n",
" \"Clean / quasi-clean (≤1%)\",\n",
" \"Moderate (110%)\",\n",
" \"High (1030%)\",\n",
" \"Severe (>30%)\"\n",
" ]\n",
"\n",
" rs[\"rupture_class\"] = pd.cut(\n",
" rs[\"rupture_ratio\"],\n",
" bins=bins,\n",
" labels=labels,\n",
" include_lowest=True\n",
" )\n",
"\n",
" dist = (\n",
" rs[\"rupture_class\"]\n",
" .value_counts(normalize=True)\n",
" .sort_index()\n",
" * 100\n",
" ).round(1)\n",
"\n",
" return dist\n",
"\n",
"\n",
"dist_before = rupture_distribution(df,\"rupture_before\")\n",
"dist_after = rupture_distribution(df,\"rupture_after\")"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "54491736-58b3-4ef7-b6c4-5534ec796bce",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.plotly.v1+json": {
"config": {
"plotlyServerURL": "https://plot.ly"
},
"data": [
{
"domain": {
"x": [
0,
0.48
]
},
"hole": 0.45,
"labels": [
"Clean / quasi-clean (≤1%)",
"Moderate (110%)",
"High (1030%)",
"Severe (>30%)"
],
"name": "Before repair",
"textinfo": "percent",
"type": "pie",
"values": {
"bdata": "mpmZmZmZREBmZmZmZmY6QAAAAAAAADBAzczMzMxMMEA=",
"dtype": "f8"
}
},
{
"domain": {
"x": [
0.52,
1
]
},
"hole": 0.45,
"labels": [
"Clean / quasi-clean (≤1%)",
"Moderate (110%)",
"High (1030%)",
"Severe (>30%)"
],
"name": "After repair",
"textinfo": "percent",
"type": "pie",
"values": {
"bdata": "mpmZmZn5WEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
"dtype": "f8"
}
}
],
"layout": {
"annotations": [
{
"showarrow": false,
"text": "Before repair",
"x": 0.22,
"y": 0.5
},
{
"showarrow": false,
"text": "After repair",
"x": 0.78,
"y": 0.5
}
],
"template": {
"data": {
"bar": [
{
"error_x": {
"color": "#2a3f5f"
},
"error_y": {
"color": "#2a3f5f"
},
"marker": {
"line": {
"color": "#E5ECF6",
"width": 0.5
},
"pattern": {
"fillmode": "overlay",
"size": 10,
"solidity": 0.2
}
},
"type": "bar"
}
],
"barpolar": [
{
"marker": {
"line": {
"color": "#E5ECF6",
"width": 0.5
},
"pattern": {
"fillmode": "overlay",
"size": 10,
"solidity": 0.2
}
},
"type": "barpolar"
}
],
"carpet": [
{
"aaxis": {
"endlinecolor": "#2a3f5f",
"gridcolor": "white",
"linecolor": "white",
"minorgridcolor": "white",
"startlinecolor": "#2a3f5f"
},
"baxis": {
"endlinecolor": "#2a3f5f",
"gridcolor": "white",
"linecolor": "white",
"minorgridcolor": "white",
"startlinecolor": "#2a3f5f"
},
"type": "carpet"
}
],
"choropleth": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"type": "choropleth"
}
],
"contour": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "contour"
}
],
"contourcarpet": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"type": "contourcarpet"
}
],
"heatmap": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "heatmap"
}
],
"histogram": [
{
"marker": {
"pattern": {
"fillmode": "overlay",
"size": 10,
"solidity": 0.2
}
},
"type": "histogram"
}
],
"histogram2d": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "histogram2d"
}
],
"histogram2dcontour": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "histogram2dcontour"
}
],
"mesh3d": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"type": "mesh3d"
}
],
"parcoords": [
{
"line": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "parcoords"
}
],
"pie": [
{
"automargin": true,
"type": "pie"
}
],
"scatter": [
{
"fillpattern": {
"fillmode": "overlay",
"size": 10,
"solidity": 0.2
},
"type": "scatter"
}
],
"scatter3d": [
{
"line": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatter3d"
}
],
"scattercarpet": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattercarpet"
}
],
"scattergeo": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattergeo"
}
],
"scattergl": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattergl"
}
],
"scattermap": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattermap"
}
],
"scattermapbox": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattermapbox"
}
],
"scatterpolar": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatterpolar"
}
],
"scatterpolargl": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatterpolargl"
}
],
"scatterternary": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatterternary"
}
],
"surface": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "surface"
}
],
"table": [
{
"cells": {
"fill": {
"color": "#EBF0F8"
},
"line": {
"color": "white"
}
},
"header": {
"fill": {
"color": "#C8D4E3"
},
"line": {
"color": "white"
}
},
"type": "table"
}
]
},
"layout": {
"annotationdefaults": {
"arrowcolor": "#2a3f5f",
"arrowhead": 0,
"arrowwidth": 1
},
"autotypenumbers": "strict",
"coloraxis": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"colorscale": {
"diverging": [
[
0,
"#8e0152"
],
[
0.1,
"#c51b7d"
],
[
0.2,
"#de77ae"
],
[
0.3,
"#f1b6da"
],
[
0.4,
"#fde0ef"
],
[
0.5,
"#f7f7f7"
],
[
0.6,
"#e6f5d0"
],
[
0.7,
"#b8e186"
],
[
0.8,
"#7fbc41"
],
[
0.9,
"#4d9221"
],
[
1,
"#276419"
]
],
"sequential": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"sequentialminus": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
]
},
"colorway": [
"#636efa",
"#EF553B",
"#00cc96",
"#ab63fa",
"#FFA15A",
"#19d3f3",
"#FF6692",
"#B6E880",
"#FF97FF",
"#FECB52"
],
"font": {
"color": "#2a3f5f"
},
"geo": {
"bgcolor": "white",
"lakecolor": "white",
"landcolor": "#E5ECF6",
"showlakes": true,
"showland": true,
"subunitcolor": "white"
},
"hoverlabel": {
"align": "left"
},
"hovermode": "closest",
"mapbox": {
"style": "light"
},
"paper_bgcolor": "white",
"plot_bgcolor": "#E5ECF6",
"polar": {
"angularaxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
},
"bgcolor": "#E5ECF6",
"radialaxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
}
},
"scene": {
"xaxis": {
"backgroundcolor": "#E5ECF6",
"gridcolor": "white",
"gridwidth": 2,
"linecolor": "white",
"showbackground": true,
"ticks": "",
"zerolinecolor": "white"
},
"yaxis": {
"backgroundcolor": "#E5ECF6",
"gridcolor": "white",
"gridwidth": 2,
"linecolor": "white",
"showbackground": true,
"ticks": "",
"zerolinecolor": "white"
},
"zaxis": {
"backgroundcolor": "#E5ECF6",
"gridcolor": "white",
"gridwidth": 2,
"linecolor": "white",
"showbackground": true,
"ticks": "",
"zerolinecolor": "white"
}
},
"shapedefaults": {
"line": {
"color": "#2a3f5f"
}
},
"ternary": {
"aaxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
},
"baxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
},
"bgcolor": "#E5ECF6",
"caxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
}
},
"title": {
"x": 0.05
},
"xaxis": {
"automargin": true,
"gridcolor": "white",
"linecolor": "white",
"ticks": "",
"title": {
"standoff": 15
},
"zerolinecolor": "white",
"zerolinewidth": 2
},
"yaxis": {
"automargin": true,
"gridcolor": "white",
"linecolor": "white",
"ticks": "",
"title": {
"standoff": 15
},
"zerolinecolor": "white",
"zerolinewidth": 2
}
}
},
"title": {
"text": "Rupture intensity distribution (Before vs After repair)"
}
}
},
"image/png": "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
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# DONUT CHART BEFORE / AFTER\n",
"\n",
"fig = go.Figure()\n",
"\n",
"fig.add_trace(go.Pie(\n",
" labels=dist_before.index,\n",
" values=dist_before.values,\n",
" hole=0.45,\n",
" name=\"Before repair\",\n",
" domain=dict(x=[0,0.48]),\n",
" textinfo=\"percent\"\n",
"))\n",
"\n",
"fig.add_trace(go.Pie(\n",
" labels=dist_after.index,\n",
" values=dist_after.values,\n",
" hole=0.45,\n",
" name=\"After repair\",\n",
" domain=dict(x=[0.52,1]),\n",
" textinfo=\"percent\"\n",
"))\n",
"\n",
"fig.update_layout(\n",
" title=\"Rupture intensity distribution (Before vs After repair)\",\n",
" annotations=[\n",
" dict(text=\"Before repair\", x=0.22, y=0.5, showarrow=False),\n",
" dict(text=\"After repair\", x=0.78, y=0.5, showarrow=False)\n",
" ]\n",
")\n",
"\n",
"fig.show()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "d844f6f0-c0f4-4f71-8280-1fd39ced83b7",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_3758/2801066674.py:3: DtypeWarning:\n",
"\n",
"Columns (0,5) have mixed types. Specify dtype option on import or set low_memory=False.\n",
"\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Dataset size: (5510007, 6)\n",
"\n",
"ACCOUNTING GAP DISTRIBUTION\n",
"count 5.430291e+06\n",
"mean 1.194749e+03\n",
"std 4.328850e+04\n",
"min 0.000000e+00\n",
"25% 0.000000e+00\n",
"50% 0.000000e+00\n",
"75% 0.000000e+00\n",
"max 4.254300e+07\n",
"Name: gap_abs, dtype: float64\n",
"\n",
"Relative gap quantiles\n",
"0.90 0.022116\n",
"0.95 0.522948\n",
"0.99 33.740225\n",
"Name: gap_rel, dtype: float64\n",
"\n",
"NEGATIVE AUM: 15988\n",
"\n",
"REPAIR RATE\n",
"0.006888661112106498\n",
"\n",
"AUM JUMP QUANTILES\n",
"0.90 1.005954\n",
"0.95 1.125084\n",
"0.99 11.417808\n",
"Name: aum_jump, dtype: float64\n"
]
}
],
"source": [
"# LOAD DATA\n",
"\n",
"aum = pd.read_csv(\"stock_repaired.csv\")\n",
"\n",
"aum[\"Centralisation Date\"] = pd.to_datetime(aum[\"Centralisation Date\"])\n",
"\n",
"\n",
"# KEEP USEFUL COLUMNS\n",
"\n",
"aum = aum[[\n",
" \"Registrar Account - ID\",\n",
" \"Product - Isin\",\n",
" \"Centralisation Date\",\n",
" \"Quantity - AUM\",\n",
" \"repair_flag\"\n",
"]]\n",
"\n",
"flows = flows[[\n",
" \"Registrar Account - ID\",\n",
" \"Product - Isin\",\n",
" \"Centralisation Date\",\n",
" \"Quantity - NetFlows\"\n",
"]]\n",
"\n",
"\n",
"\n",
"# AGGREGATE FLOWS\n",
"\n",
"flows = (\n",
" flows\n",
" .groupby(\n",
" [\"Registrar Account - ID\",\"Product - Isin\",\"Centralisation Date\"],\n",
" as_index=False\n",
" )[\"Quantity - NetFlows\"]\n",
" .sum()\n",
")\n",
"\n",
"\n",
"\n",
"# MERGE DATASETS\n",
"\n",
"df = aum.merge(\n",
" flows,\n",
" on=[\"Registrar Account - ID\",\"Product - Isin\",\"Centralisation Date\"],\n",
" how=\"left\"\n",
")\n",
"\n",
"df[\"Quantity - NetFlows\"] = df[\"Quantity - NetFlows\"].fillna(0)\n",
"\n",
"print(\"Dataset size:\", df.shape)\n",
"\n",
"\n",
"\n",
"# SORT DATA\n",
"\n",
"df = df.sort_values(\n",
" [\"Registrar Account - ID\",\"Product - Isin\",\"Centralisation Date\"]\n",
")\n",
"\n",
"\n",
"\n",
"# REBUILD ACCOUNTING IDENTITY\n",
"\n",
"df[\"prev_aum\"] = (\n",
" df.groupby([\"Registrar Account - ID\",\"Product - Isin\"])\n",
" [\"Quantity - AUM\"]\n",
" .shift(1)\n",
")\n",
"\n",
"df[\"prev_flow\"] = (\n",
" df.groupby([\"Registrar Account - ID\",\"Product - Isin\"])\n",
" [\"Quantity - NetFlows\"]\n",
" .shift(1)\n",
" .fillna(0)\n",
")\n",
"\n",
"df[\"expected_aum\"] = df[\"prev_aum\"] + df[\"prev_flow\"]\n",
"\n",
"\n",
"\n",
"# GAPS\n",
"\n",
"df[\"gap\"] = df[\"Quantity - AUM\"] - df[\"expected_aum\"]\n",
"\n",
"df[\"gap_abs\"] = df[\"gap\"].abs()\n",
"\n",
"df[\"gap_rel\"] = (\n",
" df[\"gap_abs\"] /\n",
" df[\"expected_aum\"].abs().clip(lower=1)\n",
")\n",
"\n",
"\n",
"\n",
"# ACCOUNTING CONSISTENCY\n",
"\n",
"print(\"\\nACCOUNTING GAP DISTRIBUTION\")\n",
"\n",
"print(df[\"gap_abs\"].describe())\n",
"\n",
"print(\"\\nRelative gap quantiles\")\n",
"\n",
"print(df[\"gap_rel\"].quantile([0.90,0.95,0.99]))\n",
"\n",
"\n",
"\n",
"# NEGATIVE AUM\n",
"\n",
"neg = (df[\"Quantity - AUM\"] < 0).sum()\n",
"\n",
"print(\"\\nNEGATIVE AUM:\", neg)\n",
"\n",
"\n",
"\n",
"# REPAIR RATE\n",
"\n",
"print(\"\\nREPAIR RATE\")\n",
"\n",
"print(df[\"repair_flag\"].mean())\n",
"\n",
"\n",
"\n",
"# AUM JUMPS\n",
"\n",
"\n",
"df[\"prev_obs\"] = (\n",
" df.groupby([\"Registrar Account - ID\",\"Product - Isin\"])\n",
" [\"Quantity - AUM\"]\n",
" .shift(1)\n",
")\n",
"\n",
"df[\"aum_jump\"] = (\n",
" df[\"Quantity - AUM\"] /\n",
" df[\"prev_obs\"].replace(0,np.nan)\n",
")\n",
"\n",
"print(\"\\nAUM JUMP QUANTILES\")\n",
"\n",
"print(df[\"aum_jump\"].quantile([0.90,0.95,0.99]))\n",
"\n",
"\n",
"\n",
"# VISUAL CHECK\n",
"\n",
"\n",
"def plot_series(account, isin):\n",
"\n",
" sub = df[\n",
" (df[\"Registrar Account - ID\"] == account) &\n",
" (df[\"Product - Isin\"] == isin)\n",
" ]\n",
"\n",
" plt.figure(figsize=(8,3))\n",
"\n",
" plt.plot(\n",
" sub[\"Centralisation Date\"],\n",
" sub[\"Quantity - AUM\"],\n",
" label=\"AUM\"\n",
" )\n",
"\n",
" plt.plot(\n",
" sub[\"Centralisation Date\"],\n",
" sub[\"expected_aum\"],\n",
" linestyle=\"--\",\n",
" label=\"Expected AUM\"\n",
" )\n",
"\n",
" plt.legend()\n",
" plt.title(f\"Account {account} — ISIN {isin}\")\n",
"\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "f7d759f7-64be-4d82-a79c-98cda407cfec",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAmQAAAJwCAYAAAAnVn0xAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAU95JREFUeJzt3Xd8VGW+x/HvpMykkUYSkkCA0EFapKkrTZEii2JXUIGr7OoFXVbdq1z3iririG2xoa66YMEuKHZZNYCIBVZEiggYQJQSIKSTNs/9g80sQxJImeSZJJ/36zUvM2eec+Z3nsyYL+c85zwOY4wRAAAArAmwXQAAAEBzRyADAACwjEAGAABgGYEMAADAMgIZAACAZQQyAAAAywhkAAAAlhHIAAAALCOQAQAAWEYgA5qpYcOGadiwYbbLwL/t2LFDDodDCxcutF1KtSxcuFAOh0M7duywXUqDSU9Pl8PhUHp6uu1S0AQRyABJ8+fPl8Ph0KBBgyp9vfyP5QMPPFDp6w888ECFP07Dhg2Tw+FQ586dK11n2bJlcjgccjgceuONN6pd60UXXaRzzz23ytfL/2hU9rj88sur/T4NbfPmzXI4HAoJCdHhw4dtl1NvXnrpJc2bN892GV6O/8y4XC61atVKw4YN0z333KPMzEzbJTao+fPnN5pgjKYjyHYBgD9YtGiR2rdvr6+//lrbtm1Tp06dfLLdkJAQbdu2TV9//bUGDhxY4T1DQkJ05MiRam+vpKREy5Yt05w5c07a9sYbb9SAAQO8lrVv377a79XQXnzxRSUmJiorK0tvvPGGrr32Wtsl1YuXXnpJGzZs0IwZM7yWt2vXToWFhQoODrZTmP7zmSkrK1NmZqa++OILzZo1Sw899JBee+01nXXWWZ62V111lS6//HK5XC5r9daX+fPnKy4uTpMnT/ZaPmTIEBUWFsrpdNopDE0agQzNXkZGhr744gstXrxYv//977Vo0SLNmjXLJ9vu2LGjSktL9fLLL3sFsiNHjmjJkiUaO3as3nzzzWpvb+XKlcrNzdXYsWNP2nbw4MG6+OKLa1V3QzPG6KWXXtKECROUkZGhRYsWNdlAVpXyo4M2VfaZ+e677zRy5EhddNFF2rRpk5KSkiRJgYGBCgwMtFGmNQEBAdZ/R2i6OGWJZm/RokWKiYnR2LFjdfHFF2vRokU+3f4VV1yhV199VW6327PsnXfeUUFBgS699NIabeu9995Tjx496u1I1/79+3XNNdeoVatWCgkJUZ8+ffTcc895tTn11FN14YUXei3r1auXHA6H1q9f71n26quvyuFwaPPmzSd931WrVmnHjh26/PLLdfnll2vFihXavXt3hXZut1sPP/ywevXqpZCQEMXHx2v06NFas2aNV7sXX3xRAwcOVFhYmGJiYjRkyBB9/PHHXm3mz5+vU045RS6XS8nJyZo2bVqFU6Xt27evcJREqjj+rvyU32uvvaa7775bbdq0UUhIiM4++2xt27bNa7333ntPO3fu9JweLP9dVjaGbPLkyYqIiNAvv/yi8ePHKyIiQvHx8brllltUVlbmVdPBgwd11VVXKTIyUtHR0Zo0aZK+++67Oo9L69Onj+bNm6fDhw/rscce8yyvbAzZ22+/rbFjxyo5OVkul0sdO3bUX/7ylwq1StLjjz+uDh06KDQ0VAMHDtTKlStr3a/lXn/9dfXr10+hoaGKi4vTlVdeqV9++cWrzd69ezVlyhS1adNGLpdLSUlJOv/88z370b59e23cuFHLly/3/I7Ka6pqDNlXX32lc889VzExMQoPD1fv3r318MMP16yj0ewRyNDsLVq0SBdeeKGcTqeuuOIKbd26Vd98843Ptj9hwgTt2bPH63/iL730ks4++2wlJCTUaFvvv//+CcePHSs3N1cHDhzwehwbCo9XWFioYcOG6YUXXtDEiRN1//33KyoqSpMnT/b64zJ48GB9/vnnnueHDh3Sxo0bFRAQoJUrV3qWr1y5UvHx8erevftJa120aJE6duyoAQMGaNy4cQoLC9PLL79cod0111yjGTNmKCUlRXPnztVtt92mkJAQffnll542s2fP1lVXXaXg4GDdddddmj17tlJSUvTpp5962tx5552aNm2akpOT9eCDD+qiiy7SU089pZEjR6qkpOSk9Vbl3nvv1ZIlS3TLLbdo5syZ+vLLLzVx4kTP67fffrv69u2ruLg4vfDCC3rhhRdOOp6srKxMo0aNUsuWLfXAAw9o6NChevDBB/X3v//d08btdmvcuHF6+eWXNWnSJN19993as2ePJk2aVOt9OdbFF1+s0NDQCqH2eAsXLlRERIRuuukmPfzww+rXr5/uuOMO3XbbbV7tnnjiCU2fPl1t2rTRfffdp8GDB2v8+PGVhnDp5P1a/t6XXnqpAgMDNWfOHE2dOlWLFy/WmWee6RW0L7roIi1ZskRTpkzR/PnzdeONNyo3N1e7du2SJM2bN09t2rRRt27dPL+j22+/vcp9XrZsmYYMGaJNmzbpD3/4gx588EENHz5c77777gn7CqjAAM3YmjVrjCSzbNkyY4wxbrfbtGnTxvzhD3/wapeRkWEkmfvvv7/S7dx///1GksnIyPAsGzp0qDnllFOMMcb079/fXHPNNcYYY7KysozT6TTPPfec+eyzz4wk8/rrr5+01p9++slIMp999tkJ25Vvs7LH8fUNHTrU83zevHlGknnxxRc9y4qLi83pp59uIiIiTE5OjjHGmNdff91IMps2bTLGGLN06VLjcrnMeeedZy677DLPur179zYXXHDBSferuLjYtGzZ0tx+++2eZRMmTDB9+vTxavfpp58aSebGG2+ssA23222MMWbr1q0mICDAXHDBBaasrKzSNvv37zdOp9OMHDnSq81jjz1mJJl//OMfnmXt2rUzkyZNqvB+x/ddeZ93797dFBUVeZY//PDDRpL5/vvvPcvGjh1r2rVrV2Gb5Z+xBQsWeJZNmjTJSDJ33XWXV9u0tDTTr18/z/M333zTSDLz5s3zLCsrKzNnnXVWhW1Wpjqfwz59+piYmBjP8wULFlT4TBUUFFRY7/e//70JCwszR44cMcYYU1RUZFq2bGkGDBhgSkpKPO0WLlxoJNWqX4uLi01CQoLp2bOnKSws9LR79913jSRzxx13GGOOfvdO9D0ud8opp3jVcXw95d/B0tJSk5qaatq1a2eysrK82pZ/3oDq4ggZmrVFixapVatWGj58uKSj43guu+wyvfLKK5WeZqmtCRMmaPHixSouLtYbb7yhwMBAXXDBBTXaxnvvvaeoqCideeaZ1Wp/xx13aNmyZV6PxMTEKtu///77SkxM1BVXXOFZFhwcrBtvvFF5eXlavny5pKNHyCRpxYoVko4eCRswYIDOOecczxGyw4cPa8OGDZ62J/LBBx/o4MGDXu97xRVX6LvvvtPGjRs9y9588005HI5Kx/c5HA5J0ltvvSW326077rhDAQEBlbb55z//qeLiYs2YMcOrzdSpUxUZGan33nvvpDVXZcqUKV4Dvsv3/6effqr1NiXpuuuu83o+ePBgr21++OGHCg4O1tSpUz3LAgICNG3atDq977EiIiKUm5t7wjahoaGen8uP0A4ePFgFBQX64YcfJElr1qzRwYMHNXXqVAUF/WcY88SJExUTE1Ppdk/Wr2vWrNH+/fv13//9315jvMaOHatu3bp5fqehoaFyOp1KT09XVlZWTXa/Ut9++60yMjI0Y8YMRUdHe71W/nkDqqtZBrIVK1Zo3LhxSk5OlsPh0FtvvVXjbRhj9MADD6hLly5yuVxq3bq17r77bt8Xi3pTVlamV155RcOHD1dGRoa2bdumbdu2adCgQdq3b58++eSTGm+zqv8JX3755crOztYHH3ygRYsW6be//a1atGhRo22/9957GjlypNcfsRPp1auXRowY4fU40YDknTt3qnPnzhWCTPkpx507d0qSWrVqpc6dO3vC18qVKzV48GANGTJEv/76q3766SetWrVKbre7WoHsxRdfVGpqqlwul+d30LFjR4WFhXmN59u+fbuSk5MVGxtb5ba2b9+
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# COMPUTE AUM CHANGE\n",
"\n",
"df[\"prev_aum\"] = (\n",
" df.groupby([\"Registrar Account - ID\",\"Product - Isin\"])\n",
" [\"Quantity - AUM\"]\n",
" .shift(1)\n",
")\n",
"\n",
"df[\"delta_aum\"] = df[\"Quantity - AUM\"] - df[\"prev_aum\"]\n",
"\n",
"df[\"flow_lag\"] = (\n",
" df.groupby([\"Registrar Account - ID\",\"Product - Isin\"])\n",
" [\"Quantity - NetFlows\"]\n",
" .shift(1)\n",
")\n",
"\n",
"\n",
"\n",
"# FILTER VALID OBSERVATIONS\n",
"\n",
"\n",
"diag = df[\n",
" df[\"prev_aum\"].notna() &\n",
" df[\"flow_lag\"].notna()\n",
"]\n",
"\n",
"\n",
"\n",
"# SAMPLE FOR PLOTTING (dataset is large)\n",
"\n",
"\n",
"sample = diag.sample(20000, random_state=1)\n",
"\n",
"\n",
"\n",
"# SCATTER PLOT\n",
"\n",
"\n",
"plt.figure(figsize=(7,7))\n",
"\n",
"plt.scatter(\n",
" sample[\"flow_lag\"],\n",
" sample[\"delta_aum\"],\n",
" alpha=0.3,\n",
" s=5\n",
")\n",
"\n",
"# perfect accounting identity\n",
"x = np.linspace(\n",
" sample[\"flow_lag\"].min(),\n",
" sample[\"flow_lag\"].max(),\n",
" 100\n",
")\n",
"\n",
"plt.plot(x, x, color=\"red\", label=\"Perfect identity\")\n",
"\n",
"plt.xlabel(\"Flow (t-1)\")\n",
"plt.ylabel(\"Δ AUM\")\n",
"\n",
"plt.title(\"AUM / Flow Accounting Diagnostic\")\n",
"\n",
"plt.legend()\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "d0a959c9-cfff-44cb-a1df-6c7275ec5b43",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.50 0.000000\n",
"0.90 0.010919\n",
"0.95 0.162490\n",
"0.99 11.549363\n",
"Name: implied_return, dtype: float64\n"
]
}
],
"source": [
"df[\"implied_return\"] = (\n",
" df[\"Quantity - AUM\"] - df[\"prev_aum\"] - df[\"flow_lag\"]\n",
") / df[\"prev_aum\"].replace(0, np.nan)\n",
"\n",
"print(df[\"implied_return\"].quantile([0.5,0.9,0.95,0.99]))"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "15111e8a-7d87-4c37-8122-daafe90a1ad5",
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"==============================\n",
"ADDITIONAL DATA QUALITY CHECKS\n",
"==============================\n",
"\n",
"SERIES STILL WITH LARGE ACCOUNTING GAPS: 43361\n",
"\n",
"ACCOUNTING GAP DISTRIBUTION\n",
"0.50 0.000\n",
"0.90 38.337\n",
"0.95 425.000\n",
"0.99 10045.450\n",
"Name: gap_abs, dtype: float64\n",
"\n",
"IMPLIED RETURN DISTRIBUTION\n",
"0.50 0.000000\n",
"0.90 0.010919\n",
"0.95 0.162490\n",
"0.99 11.549363\n",
"Name: implied_return, dtype: float64\n",
"\n",
"OBSERVATIONS WITH EXTREME IMPLIED RETURNS (>200%): 46293\n",
"\n",
"CORRELATION ΔAUM vs FLOW: 0.0024198477347909093\n",
"\n",
"LARGE AUM JUMPS (>5x): 31368\n",
"\n",
"SERIES WITH >20% ACCOUNTING GAPS: 13496\n",
"\n",
"TOTAL AUM RAW: 82015854859.97653\n",
"TOTAL AUM REPAIRED: 82055800782.67682\n",
"RELATIVE CHANGE: 0.00048705122647914193\n",
"\n",
"SERIES WITH AT LEAST ONE REPAIR: 0.0005151077328977951\n",
"\n",
"WORST SERIES AFTER REPAIR\n",
"Registrar Account - ID Product - Isin\n",
"OFF DISTRIBUTION GB00BQXJRP97 4.254300e+07\n",
" GB00BMGLBK75 1.814960e+07\n",
" GB00BK1W2N12 1.229293e+07\n",
" GB00BJHPHX25 1.214229e+07\n",
" GB00BJHPHY32 1.195531e+07\n",
"200127603 GB00BJHPXB21 1.150315e+07\n",
" GB00BJHPXB21 1.143209e+07\n",
"200131794 GB00BJHPXB21 1.083414e+07\n",
"200130818 GB00BNDQ7P95 1.070134e+07\n",
"OFF DISTRIBUTION GB00BJHPHZ49 8.774239e+06\n",
"Name: gap_abs, dtype: float64\n"
]
}
],
"source": [
"# ============================================================\n",
"# ADDITIONAL DATASET VALIDATION CHECKS (ROBUST VERSION)\n",
"# ============================================================\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"\n",
"print(\"\\n==============================\")\n",
"print(\"ADDITIONAL DATA QUALITY CHECKS\")\n",
"print(\"==============================\")\n",
"\n",
"# ------------------------------------------------------------\n",
"# RECOMPUTE KEY VARIABLES IF NEEDED\n",
"# ------------------------------------------------------------\n",
"\n",
"df = df.sort_values([\"Registrar Account - ID\",\"Product - Isin\",\"Centralisation Date\"])\n",
"\n",
"df[\"prev_aum\"] = (\n",
" df.groupby([\"Registrar Account - ID\",\"Product - Isin\"])\n",
" [\"Quantity - AUM\"]\n",
" .shift(1)\n",
")\n",
"\n",
"df[\"flow_lag\"] = (\n",
" df.groupby([\"Registrar Account - ID\",\"Product - Isin\"])\n",
" [\"Quantity - NetFlows\"]\n",
" .shift(1)\n",
")\n",
"\n",
"df[\"flow_lag\"] = df[\"flow_lag\"].fillna(0)\n",
"\n",
"df[\"expected_aum\"] = df[\"prev_aum\"] + df[\"flow_lag\"]\n",
"\n",
"df[\"gap\"] = df[\"Quantity - AUM\"] - df[\"expected_aum\"]\n",
"df[\"gap_abs\"] = df[\"gap\"].abs()\n",
"\n",
"df[\"delta_aum\"] = df[\"Quantity - AUM\"] - df[\"prev_aum\"]\n",
"\n",
"df[\"implied_return\"] = (\n",
" df[\"Quantity - AUM\"] - df[\"prev_aum\"] - df[\"flow_lag\"]\n",
") / df[\"prev_aum\"].replace(0,np.nan)\n",
"\n",
"df[\"aum_jump\"] = (\n",
" df[\"Quantity - AUM\"] /\n",
" df[\"prev_aum\"].replace(0,np.nan)\n",
")\n",
"\n",
"\n",
"# ------------------------------------------------------------\n",
"# 1. CHECK SERIES WHERE GAP IS STILL LARGE\n",
"# ------------------------------------------------------------\n",
"\n",
"remaining_gaps = df[df[\"gap_abs\"] > 10]\n",
"\n",
"series_remaining = (\n",
" remaining_gaps\n",
" .groupby([\"Registrar Account - ID\",\"Product - Isin\"])\n",
" .size()\n",
")\n",
"\n",
"print(\"\\nSERIES STILL WITH LARGE ACCOUNTING GAPS:\", len(series_remaining))\n",
"\n",
"\n",
"# ------------------------------------------------------------\n",
"# 2. GAP DISTRIBUTION\n",
"# ------------------------------------------------------------\n",
"\n",
"print(\"\\nACCOUNTING GAP DISTRIBUTION\")\n",
"print(df[\"gap_abs\"].quantile([0.5,0.9,0.95,0.99]))\n",
"\n",
"\n",
"# ------------------------------------------------------------\n",
"# 3. IMPLIED RETURNS DISTRIBUTION\n",
"# ------------------------------------------------------------\n",
"\n",
"print(\"\\nIMPLIED RETURN DISTRIBUTION\")\n",
"print(df[\"implied_return\"].quantile([0.5,0.9,0.95,0.99]))\n",
"\n",
"\n",
"# ------------------------------------------------------------\n",
"# 4. EXTREME RETURNS\n",
"# ------------------------------------------------------------\n",
"\n",
"extreme_returns = df[df[\"implied_return\"].abs() > 2]\n",
"\n",
"print(\"\\nOBSERVATIONS WITH EXTREME IMPLIED RETURNS (>200%):\",\n",
" len(extreme_returns))\n",
"\n",
"\n",
"# ------------------------------------------------------------\n",
"# 5. FLOW / AUM ACCOUNTING CORRELATION\n",
"# ------------------------------------------------------------\n",
"\n",
"valid = df[\n",
" df[\"prev_aum\"].notna() &\n",
" df[\"flow_lag\"].notna()\n",
"]\n",
"\n",
"corr = valid[\"delta_aum\"].corr(valid[\"flow_lag\"])\n",
"\n",
"print(\"\\nCORRELATION ΔAUM vs FLOW:\", corr)\n",
"\n",
"\n",
"# ------------------------------------------------------------\n",
"# 6. LARGE AUM JUMPS\n",
"# ------------------------------------------------------------\n",
"\n",
"large_jumps = df[df[\"aum_jump\"].abs() > 5]\n",
"\n",
"print(\"\\nLARGE AUM JUMPS (>5x):\", len(large_jumps))\n",
"\n",
"\n",
"# ------------------------------------------------------------\n",
"# 7. SERIES WITH HIGH GAP RATE\n",
"# ------------------------------------------------------------\n",
"\n",
"series_gap_rate = (\n",
" (df[\"gap_abs\"] > 10)\n",
" .groupby([df[\"Registrar Account - ID\"], df[\"Product - Isin\"]])\n",
" .mean()\n",
")\n",
"\n",
"problem_series = series_gap_rate[series_gap_rate > 0.2]\n",
"\n",
"print(\"\\nSERIES WITH >20% ACCOUNTING GAPS:\", len(problem_series))\n",
"\n",
"\n",
"# ------------------------------------------------------------\n",
"# 8. TOTAL AUM STABILITY\n",
"# ------------------------------------------------------------\n",
"\n",
"if \"df_compare\" in globals():\n",
"\n",
" raw_total = df_compare[\"Quantity - AUM_raw\"].sum()\n",
" repaired_total = df_compare[\"Quantity - AUM_repaired\"].sum()\n",
"\n",
" print(\"\\nTOTAL AUM RAW:\", raw_total)\n",
" print(\"TOTAL AUM REPAIRED:\", repaired_total)\n",
"\n",
" print(\"RELATIVE CHANGE:\",\n",
" (repaired_total - raw_total) / raw_total)\n",
"\n",
"\n",
"# ------------------------------------------------------------\n",
"# 9. PROPORTION OF SERIES REPAIRED\n",
"# ------------------------------------------------------------\n",
"\n",
"if \"repair_flag\" in df.columns:\n",
"\n",
" series_repaired = (\n",
" df.groupby([\"Registrar Account - ID\",\"Product - Isin\"])\n",
" [\"repair_flag\"]\n",
" .max()\n",
" )\n",
"\n",
" print(\"\\nSERIES WITH AT LEAST ONE REPAIR:\",\n",
" series_repaired.mean())\n",
"\n",
"\n",
"# ------------------------------------------------------------\n",
"# 10. WORST SERIES (MANUAL CHECK)\n",
"# ------------------------------------------------------------\n",
"\n",
"worst_series = (\n",
" df.groupby([\"Registrar Account - ID\",\"Product - Isin\"])\n",
" [\"gap_abs\"]\n",
" .max()\n",
" .sort_values(ascending=False)\n",
" .head(10)\n",
")\n",
"\n",
"print(\"\\nWORST SERIES AFTER REPAIR\")\n",
"print(worst_series)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "f9a4fd91-bb8b-4172-a267-cbe7f2e4fae7",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RUPTURES BEFORE: 749673\n",
"RUPTURES AFTER : 7672\n",
"REDUCTION RATE : 0.9897662047319298\n"
]
}
],
"source": [
"print(\"RUPTURES BEFORE:\", summary[\"Before repair\"].iloc[0])\n",
"print(\"RUPTURES AFTER :\", summary[\"After repair\"].iloc[0])\n",
"print(\"REDUCTION RATE :\", 1 - summary[\"After repair\"].iloc[0] /\n",
" summary[\"Before repair\"].iloc[0])"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "68596521-a10a-479a-a6cd-36b6be3c55b9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Negative series BEFORE repair: 1399\n",
"Negative series AFTER repair: 1397\n",
"\n",
"Number of series where repair created negatives: 0\n"
]
}
],
"source": [
"# CHECK IF REPAIR CREATED NEW NEGATIVE AUM\n",
"\n",
"df_compare = stocks.merge(\n",
" stocks_repaired,\n",
" on=[\"Registrar Account - ID\",\"Product - Isin\",\"Centralisation Date\"],\n",
" how=\"inner\",\n",
" suffixes=(\"_raw\",\"_repaired\")\n",
")\n",
"\n",
"neg_raw = (\n",
" df_compare[df_compare[\"Quantity - AUM_raw\"] < 0]\n",
" .groupby([\"Registrar Account - ID\",\"Product - Isin\"])\n",
" .size()\n",
")\n",
"\n",
"neg_rep = (\n",
" df_compare[df_compare[\"Quantity - AUM_repaired\"] < 0]\n",
" .groupby([\"Registrar Account - ID\",\"Product - Isin\"])\n",
" .size()\n",
")\n",
"\n",
"print(\"Negative series BEFORE repair:\", len(neg_raw))\n",
"print(\"Negative series AFTER repair:\", len(neg_rep))\n",
"\n",
"created_neg = set(neg_rep.index) - set(neg_raw.index)\n",
"\n",
"print(\"\\nNumber of series where repair created negatives:\", len(created_neg))\n",
"\n",
"if len(created_neg) > 0:\n",
" print(\"\\nSeries concerned:\")\n",
" print(created_neg)\n",
"\n",
"\n",
"\n",
"for acc, isin in created_neg:\n",
"\n",
" sub = df_compare[\n",
" (df_compare[\"Registrar Account - ID\"] == acc) &\n",
" (df_compare[\"Product - Isin\"] == isin)\n",
" ].sort_values(\"Centralisation Date\").reset_index(drop=True)\n",
"\n",
" # indices where repaired AUM becomes negative\n",
" neg_idx = sub.index[sub[\"Quantity - AUM_repaired\"] < 0]\n",
"\n",
" print(\"\\n======================================\")\n",
" print(\"Account:\", acc, \"ISIN:\", isin)\n",
"\n",
" for i in neg_idx:\n",
"\n",
" start = max(0, i-3)\n",
" end = min(len(sub), i+3)\n",
"\n",
" print(\"\\nContext around created negative:\")\n",
" print(\n",
" sub.loc[start:end, [\n",
" \"Centralisation Date\",\n",
" \"Quantity - AUM_raw\",\n",
" \"Quantity - AUM_repaired\"\n",
" ]]\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "203797d1-c380-406d-ac6e-78c4e1228966",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Registrar Account - ID Product - Isin\n",
"OFF DISTRIBUTION GB00BQXJRP97 4.254300e+07\n",
" GB00BMGLBK75 1.814960e+07\n",
" GB00BK1W2N12 1.229293e+07\n",
" GB00BJHPHX25 1.214229e+07\n",
" GB00BJHPHY32 1.195531e+07\n",
"200127603 GB00BJHPXB21 1.150315e+07\n",
" GB00BJHPXB21 1.143209e+07\n",
"200131794 GB00BJHPXB21 1.083414e+07\n",
"200130818 GB00BNDQ7P95 1.070134e+07\n",
"OFF DISTRIBUTION GB00BJHPHZ49 8.774239e+06\n",
"200128473 GB00BQXJRP97 7.018014e+06\n",
"200130462 GB00BJHPXB21 6.526734e+06\n",
" GB00BJHPXB21 6.276585e+06\n",
"200127607 GB00BJHPXB21 6.022617e+06\n",
"OFF DISTRIBUTION LU0992627611 5.257530e+06\n",
"200130818 GB00BJHPXB21 4.348621e+06\n",
"OFF DISTRIBUTION LU0992630599 3.535858e+06\n",
"200126545 GB00BJHPXB21 3.483929e+06\n",
"200130722 GB00BJHPJ035 3.441918e+06\n",
"200064217 MAPFRECG0001 3.142004e+06\n",
"Name: gap_abs, dtype: float64\n"
]
}
],
"source": [
"# top N worst series\n",
"N = 20\n",
"\n",
"worst_series = (\n",
" df.groupby([\"Registrar Account - ID\",\"Product - Isin\"])[\"gap_abs\"]\n",
" .max()\n",
" .sort_values(ascending=False)\n",
" .head(N)\n",
")\n",
"\n",
"print(worst_series)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "17c6be03-3b76-41e7-906f-d86472bda274",
"metadata": {},
"outputs": [],
"source": [
"def plot_account_series(account, isin):\n",
"\n",
" sub = df[\n",
" (df[\"Registrar Account - ID\"] == account) &\n",
" (df[\"Product - Isin\"] == isin)\n",
" ].sort_values(\"Centralisation Date\")\n",
"\n",
" plt.figure(figsize=(10,4))\n",
"\n",
" plt.plot(\n",
" sub[\"Centralisation Date\"],\n",
" sub[\"Quantity - AUM\"],\n",
" label=\"AUM\",\n",
" linewidth=2\n",
" )\n",
"\n",
" plt.plot(\n",
" sub[\"Centralisation Date\"],\n",
" sub[\"expected_aum\"],\n",
" linestyle=\"--\",\n",
" label=\"Expected AUM\"\n",
" )\n",
"\n",
" # highlight large gaps\n",
" ruptures = sub[sub[\"gap_abs\"] > 10]\n",
"\n",
" plt.scatter(\n",
" ruptures[\"Centralisation Date\"],\n",
" ruptures[\"Quantity - AUM\"],\n",
" color=\"red\",\n",
" label=\"Rupture\",\n",
" s=40\n",
" )\n",
"\n",
" plt.title(f\"Account {account} | ISIN {isin}\")\n",
" plt.legend()\n",
" plt.grid(alpha=0.3)\n",
"\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "02a22e9a-a71c-4212-8f0a-f33c18e4b530",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAy0AAAF2CAYAAABjxncbAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAa9hJREFUeJzt3Xd4U2X7B/DvSds0HXRBCy1dbARkiLIUAUEEBMUXRRGkgIgoKMhQcbBUQFEQcct6kSq+iIDjJwooQ4Ygsqrs3dLSQvduc57fHyEhITmlaZue0/b7ua5c7Tl5cs6Tu6dJ7jxLEkIIEBERERERaZRO7QoQERERERGVhEkLERERERFpGpMWIiIiIiLSNCYtRERERESkaUxaiIiIiIhI05i0EBERERGRpjFpISIiIiIiTWPSQkREREREmsakhYiIiIiINI1JCxER1SjR0dGYOXOm2tUgIiInMGkhcoGPP/4YkiShY8eOalfFpebMmYP169c79ZirV69i6tSpaNasGQwGA4KCgnDffffhxx9/tCt77tw5SJLk8NapUydLuREjRiiW27hxY4n1iY6OtpTV6XQICAjArbfeijFjxuDPP/90+BhJkjB+/HibfSkpKZgwYQKaN28OLy8vhISEoEOHDnjppZeQnZ2NrVu3KtbxxhsArFixwmafu7s76tevjxEjRiAhIcGuTt27d0erVq0Un5skSTAYDGjSpAmmTp2K1NRUm7IjRoyAr6+vYpx8fX0xYsQIh8dVuq1YsUIxXkDZr4W1a9fa3T9z5kxIkoQrV64oPgdnKR3zhx9+QLdu3RASEgJvb280bNgQgwcPtrnWzPV99913Lfusr4H9+/fbne9mf4MbHT58GCNHjkSDBg1gMBjg6+uLtm3b4sUXX8SZM2fsjn3j9RQREYHHHnsM//77r92xZVnGO++8Yzl269at8fXXXzusx9GjR9GnTx/4+voiKCgITzzxBFJSUmzKOLr+g4KC0KlTJ8TGxjo8blFRET744APccccdqFWrFnx9fXHHHXdg8eLFKC4utin777//Qq/XY+TIkXbHSU9PR2hoKDp27AhZlgE4/tveGCNPT080bdoU06dPR35+vt1xrcvqdDqEhYWhd+/e2Lp1q93zmDVrFho2bAhPT080bNgQb775pt1zKOl1TJIkh//3RDWJu9oVIKqOYmNjER0djb179+LUqVNo3Lix2lVyiTlz5uDhhx/GwIEDS1X++PHj6NmzJ1JSUjBy5EjcfvvtSE9PR2xsLAYMGIApU6Zg/vz5do8bMmQI+vXrZ7MvODjYZtvT0xNLliyxe2ybNm1uWq+2bdti8uTJAICsrCwcPXoUa9aswRdffIEXXngBCxYsKPHxqampuP3225GZmYlRo0ahefPmuHr1Kg4fPoxPPvkEzzzzDG655RZ8+eWXNo+bNm0afH198eqrryoee/bs2WjQoAHy8/OxZ88erFixAn/88Qfi4uJgMBicem75+fnYv38/3n//fWzbtg179+696eMdef/995GdnW3Z/r//+z98/fXXWLhwIerUqWPZ36VLF8VjlPVaAEwx+c9//mNJ8CrTu+++i6lTp6Jbt26YNm0avL29cerUKWzevBmrV69Gnz59SnWcmTNn4ocffihzPb744gs888wzqFOnDoYOHYrmzZujuLgYcXFxWLlyJd5//33k5eXBzc3N8hjr/5Hi4mKcPn0an376KTZu3Ih///0XYWFhlrKvvvoq5s2bh6eeegp33HEHNmzYgMcffxySJOGxxx6zlIuPj8fdd98Nf39/zJkzB9nZ2Xj33Xdx5MgR7N27F3q93qbezz//PO644w4ApqT1m2++wbBhw5Ceno5x48ZZyuXk5OD+++/Htm3b0L9/f4wYMQI6nQ4bN27E888/j/Xr1+OHH36At7c3AKBFixaYOnUq5syZgxEjRqBbt26WY7388stISUnBzz//DJ2u5O9qrWOUkZGBDRs24I033sDp06cdJlf33nsvhg8fDiEEzp49i48//hj33HMPfvrpJ/Tt2xcAMGzYMKxZswajRo3C7bffjj179uD111/HhQsX8Pnnn1uO9fTTT6NXr142xxdCYOzYsYiOjkb9+vVLrDtRtSeIqEKdOXNGABDfffedCA4OFjNnzlS7Si7j4+MjYmJiSlW2sLBQtGrVSnh7e4s9e/bY3FdcXCweffRRAUCsXr3asv/s2bMCgJg/f36Jx46JiRE+Pj5O118IIaKiosT9999vtz83N1cMHDhQABAff/yxzX0AxLhx4yzb77zzjgAgdu7caXecjIwMkZeX5/DcLVu2FN26dXN43/LlywUAsW/fPpv9L730kgAgvvnmG5v93bp1Ey1btizVc5syZYoAIE6cOGHZd7MYlvS3nj9/vgAgzp496/D+G+NVnmuhbdu2AoBYu3atzeNmzJghAIiUlBTF52AWFRUlZsyYcdNyNx6zqKhI+Pn5iXvvvddh+cuXL9vV1/ra/f33322ew/79+20eX9rreOfOncLNzU3cfffdIjMz0+7+vLw88dprr4ni4uKbHvvHH38UAMTnn39u2RcfHy88PDxs/mayLIuuXbuK8PBwm+M+88wzwsvLS5w/f96yb9OmTQKA+Oyzz+ye+5o1a2zOX1BQIOrXry+6dOlis3/MmDECgFi8eLFdnT/88EMBQDz77LN2z7tRo0aiWbNmoqCgQAghxK5du4QkSWLSpEk2ZR1dL45iJMuy6NSpk5AkSSQlJdncd+N1LYQQhw8fFgBE7969hRBC7N27VwAQr7/+uk25yZMnC0mSxKFDh+yen7UdO3YIAOKtt94qsRxRTcDuYUQVLDY2FoGBgbj//vvx8MMPK3Z9SE9PxwsvvIDo6Gh4enoiPDwcw4cPt+mukJ+fj5kzZ6Jp06YwGAwIDQ3Ff/7zH5w+fdpSJicnB5MnT0ZERAQ8PT3RrFkzvPvuuxBCWMqYu6qYu+tYkyTJpn+/udvEqVOnMGLECAQEBMDf3x8jR45Ebm6uzeNycnLw3//+19J9wdx9yJG1a9ciLi4OL7/8sl23OTc3N3z22WcICAjQzFgDLy8vfPnllwgKCsJbb71lE88bnT59Gm5ubjZd1sz8/PxK1SJSWl27drWcs6zq1asHAHB3V6exvTzXwmOPPYamTZti9uzZJf5NXOHKlSvIzMzEnXfe6fD+kJCQUh3nueeeQ2BgYJmv9VmzZkGSJMTGxqJWrVp29xsMBrzxxhs2rSxKHF0LGzZsQFFREZ599lnLPkmS8MwzzyA+Ph67d++27F+7di369++PyMhIy75evXqhadOm+N///nfT8+v1egQGBtqcPz4+HkuXLsU999zjsFvhuHHj0KNHD3z++ec2XaYMBgM++eQTHD9+HHPnzkVRURHGjBmDiIgIzJ49+6Z1cUSSJNx1110QQth1uXPk1ltvRZ06dXD27FkAwI4dOwDApnXKvC2EwDfffFPi8b766itIkoTHH3+8TPUnqk6YtBBVsNjYWPznP/+BXq/HkCFDcPLkSezbt8+mTHZ2Nrp27YrFixejd+/eWLRoEcaOHYtjx44hPj4eAGA0GtG/f3/MmjUL7du3x3vvvYcJEyYgIyMDcXFxAExdBx544AEsXLgQffr0wYIFC9CsWTNMnToVkyZNKtfzGDx4MLKysjB37lwMHjwYK1aswKxZsyz3f/nll/D09ETXrl3x5Zdf4ssvv8TTTz+teDxzV5jhw4c7vN/f3x8PPvggjh07hlOnTtncl5ubiytXrtjcioqK7I5xY5mMjIyyPHULX19fPPTQQ0hISHDY798sKioKRqPRrvuXK5w7dw4AEBgYWKryRUVFlnjEx8fjhx9+wIIFC3D33XejQYMGLqypsvJcC25ubnjttddw6NAhrFu3zuV1tRYSEgIvLy/88MMPdmOCnOHn54cXXngBP/zwA/7++2+nHpubm4vffvsN3bt3R3h4uNPnNl8Lly9fxu7du/HCCy+gdu3a6N+/v6XMgQMH4OPjg1tuucXmsR06dLDcDwAJCQlITk7G7bffbneeDh06WMpZy8rKstThxIkTmDlzJuLi4hA
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA0QAAAF2CAYAAABONFihAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAgg9JREFUeJzt3Xd4U+XbB/DvSdIk3dDd0gJlFZlFkIqKgBYKIj9xsAQpKPCqoGABBUGgOFCRpYKgjKKCICqgqCiCgEgBQYYomwKCXazupk3Oef8ISRsy2rRN2rTfz3XlSnLOnZPn5EnS3H2WIEmSBCIiIiIiojpIVt0FICIiIiIiqi5MiIiIiIiIqM5iQkRERERERHUWEyIiIiIiIqqzmBAREREREVGdxYSIiIiIiIjqLCZERERERERUZzEhIiIiIiKiOosJERERERER1VlMiIiIiKpA48aNMWvWrOouBhER2YkJEZELWbJkCQRBQExMTHUXxaHeeustbNq0ya7HXLt2DZMnT0ZUVBTUajX8/PwQFxeHLVu2mMVeuHABgiBYvNx9993GuBEjRliN27p1q83yNG7c2Bgrk8lQr149tG3bFmPGjMH+/fstPkYQBIwbN85kW2ZmJsaPH4+WLVvC3d0dQUFB6Ny5M1555RXk5uZi586dVst4+wUAkpKSTLYpFAo0aNAAI0aMwJUrV8zK1L17d7Rp08bquQmCALVajebNm2Py5Mm4fv26SeyIESPg5eVl9XXy8vLCiBEjLB7X2iUpKcnq6wVU/L3w9ddfm+2fNWsWBEHA1atXrZ6Dvawd87vvvkO3bt0QFBQEDw8PNGnSBAMHDjR5rxnK+9577xm3lX4PHDp0yOz5yqqD2x07dgwjR45EZGQk1Go1vLy8EB0djZdffhnnz583O/bt76eIiAgMHjwY//zzj9mxRVHEu+++azx2u3bt8MUXX1gsx4kTJ9C7d294eXnBz88PTz31FDIzM01iLL3//fz8cPfdd2PNmjVmx2zcuDEefvhhk23W3kdAyefl4MGDxm2G+jNcPDw80KpVK0yfPh3Z2dk2H1va7Z+tf/75B0qlEiNHjjSLvXnzJkJDQxETEwNRFAEA27dvx9NPP40WLVoY3y+jRo1Camqqxeey9Fnq3bu3xbIR1TWK6i4AEZXfmjVr0LhxYxw4cABnz55Fs2bNqrtIDvHWW2/hiSeeQP/+/csVf+rUKTz44IPIzMzEyJEj0alTJ9y8eRNr1qxBv379MGnSJMydO9fscUOGDMFDDz1ksi0wMNDkvkqlwvLly80e2759+zLLFR0djYkTJwIAcnJycOLECWzYsAGffPIJXnrpJcyfP9/m469fv45OnTohOzsbTz/9NFq2bIlr167h2LFj+Oijj/Dcc8/hjjvuwGeffWbyuKlTp8LLywvTpk2zeuzZs2cjMjIShYWF2LdvH5KSkrBnzx4cP34carXarnMrLCzEoUOHsHDhQuzatQsHDhwo8/GWLFy4ELm5ucb7P/zwA7744gssWLAAAQEBxu333HOP1WNU9L0A6F+Txx57zJg8OtN7772HyZMno1u3bpg6dSo8PDxw9uxZ/PLLL1i3bl25f7jOmjUL3333XYXL8cknn+C5555DQEAAhg4dipYtW0Kr1eL48eP49NNPsXDhQhQUFEAulxsfU/ozotVqce7cOSxduhRbt27FP//8g7CwMGPstGnT8Pbbb2P06NG46667sHnzZjz55JMQBAGDBw82xl2+fBn3338/fH198dZbbyE3Nxfvvfce/vrrLxw4cABKpdKk3C+++CLuuusuAPqEeP369Rg2bBhu3ryJsWPHVvj1sOWjjz6Cl5cXcnNz8fPPP+PNN9/Ejh078Pvvv1foPdSqVStMnjwZb731FkaMGIFu3boZ902ZMgWZmZn48ccfIZPp/5f9yiuv4Pr16xgwYACaN2+O8+fP48MPP8SWLVtw5MgRhISEmBw/PDwcc+bMMdlWum6I6jSJiFzC+fPnJQDSN998IwUGBkqzZs2q7iI5jKenpxQfH1+u2KKiIqlNmzaSh4eHtG/fPpN9Wq1WGjRokARAWrdunXF7SkqKBECaO3euzWPHx8dLnp6edpdfkiSpUaNGUt++fc225+fnS/3795cASEuWLDHZB0AaO3as8f67774rAZB+//13s+NkZWVJBQUFFp+7devWUrdu3SzuW7VqlQRA+uOPP0y2v/LKKxIAaf369Sbbu3XrJrVu3bpc5zZp0iQJgHT69GnjtrJeQ1t1PXfuXAmAlJKSYnH/7a9XZd4L0dHREgDp66+/NnnczJkzJQBSZmam1XMwaNSokTRz5swy424/ZnFxseTj4yP17NnTYnx6erpZeUu/d3/99VeTczh06JDJ48v7Pv79998luVwu3X///VJ2drbZ/oKCAmn69OmSVqst89hbtmyRAEgff/yxcdvly5clNzc3kzoTRVHq2rWrFB4ebnLc5557TnJ3d5cuXrxo3LZt2zYJgLRs2TKzc9+wYYPJ82s0GqlBgwbSPffcY7Ld0nv39vdRaZY+L9beE4899pgEQNq7d6/Vx5Zm6bNVUFAgNW3aVIqKipI0Go0kSZK0d+9eSRAEKSEhwSR2165dkk6nM9sGQJo2bVqZz0VEJdhljshFrFmzBvXr10ffvn3xxBNPWOwOAui7Vrz00kto3LgxVCoVwsPDMXz4cJPuOYWFhZg1axZatGgBtVqN0NBQPPbYYzh37pwxJi8vDxMnTkRERARUKhWioqLw3nvvQZIkY4yh+46hC1NpgiCYjKcwdDM5e/YsRowYgXr16sHX1xcjR45Efn6+yePy8vKwevVqY7cOQ5cqS77++mscP34cU6ZMMetKKJfLsWzZMtSrV6/GjO1wd3fHZ599Bj8/P7z55psmr+ftzp07B7lcbtKNz8DHx6dcLTnl1bVrV+NzVpThP9IKRfV0PqjMe2Hw4MFo0aIFZs+ebbNOHOHq1avIzs7Gvffea3F/UFBQuY7zwgsvoH79+hV+rycmJkIQBKxZswbe3t5m+9VqNV5//XWT1iFrLL0XNm/ejOLiYjz//PPGbYIg4LnnnsPly5eRnJxs3P7111/j4YcfRsOGDY3bYmNj0aJFC3z55ZdlPr9SqUT9+vWd+l584IEHAAApKSkVPoZarcZHH32EU6dOYc6cOSguLsaYMWMQERGB2bNnm8Tef//9xtai0tv8/Pxw4sQJi8fXarUmrbBEpMeEiMhFrFmzBo899hiUSiWGDBmCM2fO4I8//jCJyc3NRdeuXfHBBx+gV69eWLRoEZ599lmcPHkSly9fBgDodDo8/PDDSExMRMeOHTFv3jyMHz8eWVlZOH78OABAkiT873//w4IFC9C7d2/Mnz8fUVFRmDx5MhISEip1HgMHDkROTg7mzJmDgQMHIikpCYmJicb9n332GVQqFbp27YrPPvsMn332Gf7v//7P6vEM3YOGDx9ucb+vry8eeeQRnDx5EmfPnjXZl5+fj6tXr5pciouLzY5xe0xWVlZFTt3Iy8sLjz76KK5cuWJxnIVBo0aNoNPpzLrEOcKFCxcAAPXr1y9XfHFxsfH1uHz5Mr777jvMnz8f999/PyIjIx1YUusq816Qy+WYPn06jh49io0bNzq8rKUFBQXB3d0d3333ndkYLHv4+PjgpZdewnfffYc///zTrsfm5+djx44d6N69O8LDw+1+bsN7IT09HcnJyXjppZfg7+9vMl7n8OHD8PT0xB133GHy2M6dOxv3A8CVK1eQkZGBTp06mT1P586djXGl5eTkGMtw+vRpzJo1C8ePH0d8fHy5yl9YWGj2Ob969apdyYPhnwn+/v4m27Oysiwe29J3DQD07NkTQ4YMwZw5czBu3DgcP34cH3zwATw9PcssQ25uLnJzc026mBqcPn0anp6e8Pb2RkhICF577TWrZSCqaziGiMgFHDp0CCdPnsQHH3wAALjvvvsQHh6ONWvWGPvNA8DcuXNx/PhxfPPNN3j00UeN26dPn278r/enn36K7du3Y/78+XjppZeMMVOmTDHGfPvtt9ixYwfeeOMN4ziUsWPHYsC
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA0QAAAF2CAYAAABONFihAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAfEtJREFUeJzt3Xd4U+XbB/DvSdok3YxuKFBWEZAWQYaKgFSGiKLIRgqKvCL4A8tQFBkuVGSpICijDhBEGU5UkOFAEGQqe4hIF6O7Tduc5/0j5NA0o03bpE37/VxXribn3DnnOX2SNHefJQkhBIiIiIiIiGogVWUXgIiIiIiIqLIwISIiIiIiohqLCREREREREdVYTIiIiIiIiKjGYkJEREREREQ1FhMiIiIiIiKqsZgQERERERFRjcWEiIiIiIiIaiwmREREREREVGMxISIiIqogjRo1wuzZsyu7GERE5AAmRERuZunSpZAkCR07dqzsojjVa6+9hs2bNzv0nKtXr2Lq1KmIioqCTqdDnTp10KtXL3z99dcWsRcuXIAkSVZvnTp1UuJGjRplM27r1q12y9OoUSMlVqVSoVatWrj11lsxduxY7N271+pzJEnChAkTzLalpqZi4sSJaNGiBby8vBAcHIwOHTrg2WefRVZWFnbu3GmzjMVvAJCQkGC2zcPDA/Xq1cOoUaPw33//WZSpW7duaN26tc1rkyQJOp0OzZo1w9SpU3Ht2jWz2FGjRsHX19fm78nX1xejRo2yelxbt4SEBJu/L6Dsr4UvvvjCYv/s2bMhSRKuXLli8xocZeuYX331Fbp27Yrg4GB4e3ujcePGGDRokNlrzVTet956S9lW9DVw4MABi/OVVAfFHTlyBKNHj0ZkZCR0Oh18fX0RExODadOm4dy5cxbHLv56ioiIwJAhQ/D3339bHFuWZbz55pvKsdu0aYNPP/3UajmOHz+O3r17w9fXF3Xq1MGjjz6K1NRUsxhrr/86deqgU6dOWLNmjcUxGzVqhPvvv99sm63XEXDz/bJ//35lm6n+TDdvb2+0bNkSM2bMQEZGht3nFlX0vbVnzx6oVCpMnz7dauwbb7wBSZLwzTffAAA++OADdO3aFSEhIdBqtYiMjMTo0aNx4cIFs+f9+++/mDNnDjp06IDatWsjMDAQ3bp1w7Zt26yeh6gm8qjsAhCRY9asWYNGjRph3759OHPmDJo2bVrZRXKK1157DY888gj69+9fqviTJ0+iR48eSE1NxejRo9G+fXukpaVhzZo16NevH6ZMmYJ58+ZZPG/o0KG47777zLYFBQWZPdZqtVixYoXFc6Ojo0ssV0xMDCZPngwAyMzMxPHjx7FhwwZ88MEHeOaZZ7BgwQK7z7927Rrat2+PjIwMPPbYY2jRogWuXr2KI0eO4L333sO4ceNwyy234OOPPzZ73vTp0+Hr64sXXnjB5rFfeuklREZGIi8vD7///jsSEhLwyy+/4NixY9DpdA5dW15eHg4cOIBFixZh165d2LdvX4nPt2bRokXIyspSHn/77bf49NNPsXDhQgQGBirb77jjDpvHKOtrATD+Th5++GEleXSlt956C1OnTkXXrl0xffp0eHt748yZM9i2bRvWrVuH3r17l+o4s2fPxldffVXmcnzwwQcYN24cAgMDMXz4cLRo0QKFhYU4duwYPvroIyxatAi5ublQq9XKc4q+RwoLC3H27FksW7YMW7duxd9//43w8HAl9oUXXsDrr7+OJ554Arfffju2bNmCYcOGQZIkDBkyRIm7dOkS7r77bgQEBOC1115DVlYW3nrrLRw9ehT79u2DRqMxK/f//vc/3H777QCMCfH69esxYsQIpKWlYfz48WX+fdjz3nvvwdfXF1lZWfjhhx/w6quv4qeffsKvv/7q8Guoc+fO+L//+z/Mnz8fI0aMQKtWrZR9//zzD1566SUMHDgQffv2BQAcPHgQkZGReOCBB1C7dm2cP38eH3zwAb7++mscPnxY+Z1v2bIFb7zxBvr374+4uDgUFhbio48+wr333otVq1Zh9OjRFfcLIXJXgojcxrlz5wQAsXHjRhEUFCRmz55d2UVyGh8fHxEXF1eq2Pz8fNG6dWvh7e0tfv/9d7N9hYWFYvDgwQKAWLdunbL9/PnzAoCYN2+e3WPHxcUJHx8fh8svhBANGzYUffv2tdiek5Mj+vfvLwCIpUuXmu0DIMaPH688fvPNNwUA8euvv1ocJz09XeTm5lo9d6tWrUTXrl2t7lu9erUAIP744w+z7c8++6wAINavX2+2vWvXrqJVq1alurYpU6YIAOLUqVPKtpJ+h/bqet68eQKAOH/+vNX9xX9f5XktxMTECADiiy++MHverFmzBACRmppq8xpMGjZsKGbNmlViXPFjFhQUCH9/f3HvvfdajU9OTrYob9HX7o4dO8yu4cCBA2bPL+3r+NdffxVqtVrcfffdIiMjw2J/bm6umDFjhigsLCzx2F9//bUAIN5//31l26VLl4Snp6dZncmyLLp06SLq169vdtxx48YJLy8v8c8//yjbfvzxRwFALF++3OLaN2zYYHZ+vV4v6tWrJ+644w6z7dZeu8VfR0VZe7/Yek08/PDDAoD47bffbD63qOLvrbS0NBEWFibuvPNOIcuysr1fv34iICBAXL582epxTPbv3y8AiLlz5yrbjh07ZlHOvLw80aJFC1G/fn27xyOqKdhljsiNrFmzBrVr10bfvn3xyCOPWO0OAgBpaWl45pln0KhRI2i1WtSvXx8jR440656Tl5eH2bNno3nz5tDpdAgLC8PDDz+Ms2fPKjHZ2dmYPHkyIiIioNVqERUVhbfeegtCCCXG1H3H1IWpKEmSzMZTmLqZnDlzBqNGjUKtWrUQEBCA0aNHIycnx+x52dnZ+PDDD5UuKaYuVdZ88cUXOHbsGJ577jmLroRqtRrLly9HrVq1qszYDi8vL3z88ceoU6cOXn31VbPfZ3Fnz56FWq0268Zn4u/vX6qWnNLq0qWLcs6yCg0NBQB4eFROB4TyvBaGDBmC5s2b46WXXrJbJ85w5coVZGRk4M4777S6Pzg4uFTHefrpp1G7du0yv9bnzJkDSZKwZs0a+Pn5WezX6XR4+eWXzVqHbLH2WtiyZQsKCgrw1FNPKdskScK4ceNw6dIl7NmzR9n+xRdf4P7770eDBg2UbbGxsWjevDk+++yzEs+v0WhQu3Ztl74W77nnHgDA+fPny/T8gIAALF68GL/++qvS4rZp0yZ89dVXeP311xEWFmb3+Y0aNQJg/Btg0qpVK7PWVcDYonfffffh0qVLyMzMLFNZiaoTJkREbmTNmjV4+OGHodFoMHToUJw+fRp//PGHWUxWVha6dOmCd955Bz179sTixYvx5JNP4sSJE7h06RIAwGAw4P7778ecOXPQrl07zJ8/HxMnTkR6ejqOHTsGABBC4IEHHsDChQvRu3dvLFiwAFFRUZg6dSri4+PLdR2DBg1CZmYm5s6di0GDBiEhIQFz5sxR9n/88cfQarXo0qULPv74Y3z88cf4v//7P5vHM3UPGjlypNX9AQEBePDBB3HixAmcOXPGbF9OTg6uXLlidisoKLA4RvGY9PT0sly6wtfXFw899BD+++8/q+MsTBo2bAiDwWDRJc4ZTGMPateuXar4goIC5fdx6dIlfPXVV1iwYAHuvvtuREZGOrGktpXntaBWqzFjxgwcPnwYmzZtcnpZiwoODoaXlxe++uorizFYjvD398czzzyDr776Cn/++adDz83JycFPP/2Ebt26oX79+g6f2/RaSE5Oxp49e/DMM8+gbt26ZuN1Dh48CB8fH9xyyy1mz+3QoYOyHwD+++8/pKSkoH379hbn6dChgxJXVGZmplKGU6dOYfbs2Th27Bji4uJKVf68vDyL9/mVK1fMunCWxPTPhLp165ptT09Pt3psa581pm5xzz77LM6dO4eJEyfijjvusPkZePXqVaSkpGD//v1K97cePXqUWNakpCR4e3vD29u71NdHVF1xDBGRmzhw4ABOnDiBd955BwBw1113oX79+lizZo3Sbx4A5s2bh2P
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAzoAAAF2CAYAAACmtO2KAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAArNNJREFUeJzs3Xd4U9UbwPHvTUe694ZCy95bBBHZS4YoLkDZIioIoqggKig/URHEgThYorhwgOJEFFBEkQ2yoexO6N5N7u+P26YNbWnTpk3H+3me+6R3nzSnad6cc96jqKqqIoQQQgghhBA1iM7WBRBCCCGEEEIIa5NARwghhBBCCFHjSKAjhBBCCCGEqHEk0BFCCCGEEELUOBLoCCGEEEIIIWocCXSEEEIIIYQQNY4EOkIIIYQQQogaRwIdIYQQQgghRI0jgY4QQgghhBCixpFARwghRLWxZs0aFEWxdTGEEEJUAxLoCCEAeOedd1AUhRtvvNHWRalQL730Ehs2bCjVsRcuXGD+/Pl07twZb29v/Pz86NmzJ7/++muRxyckJDB58mT8/f1xdXWlV69e7N27t8hjv/32Wzp06ICTkxP16tXj+eefJycnx+yYyMhInn76aXr16oW7uzuKorB169ZC10pLS2PZsmX079+f4OBg3N3dad++PcuXL8dgMJgdO2/ePBRFKXbZsWOH2fFGo5Hly5fTrl07nJ2d8fX1pXfv3hw4cKDQca+++irh4eE4OTnRpk0bPv3000Jl/eCDD+jRoweBgYHo9XrCw8MZP348Z8+eLfL3VB6KojB16lSzbbGxsUyfPp1mzZrh7OxMQEAAnTt35qmnniIlJcV03Lhx43BzczM7t2fPniiKwtChQwvd6+zZsyiKwmuvvVaqsmVmZvLWW29x88034+3tjaOjIyEhIQwbNoxPP/3U7HXLu3bBxcPDg3bt2vH2228Xeo0Bjh49ysCBA3Fzc8PHx4f777+f2NjYQseV9nXLe+55i6OjI+Hh4UyePJkLFy6YHZsXjO7evdu0La/excXFFfn7CAsLY8iQIWbbCt5Pp9MREhJC//79zf4Gjhw5gqOjI+PHjy90zYSEBIKDg7nxxhsxGo1m5Sh43eDgYIYMGcLff/9tdr4lf/+l/VsVQlQue1sXQAhRNaxbt46wsDB27drFqVOnaNSoka2LVCFeeukl7rzzToYPH17isRs3buSVV15h+PDhjB07lpycHNauXUu/fv1YtWqV2Ycro9HI4MGDOXDgALNmzcLPz4933nmHnj17smfPHho3bmw69scff2T48OH07NmTt956i0OHDrFgwQJiYmJYvny56bjjx4/zyiuv0LhxY1q3bs3OnTuLLOeZM2eYNm0affr0YebMmXh4ePDzzz/z8MMP8/fff/Phhx+ajr3jjjuKfG3nzJlDSkoKN9xwg9n2CRMmsG7dOsaMGcPUqVNJTU1l3759xMTEmB33zDPP8PLLL/PAAw9www03sHHjRkaNGoWiKNx7772m4/bt20d4eDjDhg3D29ubiIgIPvjgAzZt2sSBAwcICQkp8XUpq6tXr9KpUyeSkpKYMGECzZo148qVKxw8eJDly5fz0EMPFQpuirJp0yb27NlDx44dy1SO2NhYBg0axJ49exgwYABz587Fx8eHqKgofv31V0aNGsWpU6d49tlnzc4bOXIkt956KwCJiYn88MMPTJs2jXPnzrFo0SLTcRcvXuSWW27B09OTl156iZSUFF577TUOHTrErl27cHR0NB1b2tcNoG7duixcuBCArKwsjhw5wrvvvsvPP//M0aNHcXFxKdPv43r69evHmDFjUFWViIgI3nnnHXr37s3333/PoEGDaNGiBbNmzeKll15i3Lhx9OjRw3Tu008/TWxsLD/++CM6nfn3usuXL8fNzQ2j0ciFCxf44IMPuOWWW9i1axft2rUDLPv7L+3fqhCikqlCiFrvzJkzKqB+/fXXqr+/vzpv3jxbF6nCuLq6qmPHji3VsYcPH1ZjY2PNtmVkZKjNmjVT69ata7b9888/VwF1/fr1pm0xMTGql5eXOnLkSLNjW7RoobZt21bNzs42bXvmmWdURVHUo0ePmrYlJSWpV65cUVVVVdevX68C6u+//16onLGxserhw4cLbR8/frwKqCdPnrzu8zx//ryqKIr6wAMPFPmcvv766+uef/HiRdXBwUF95JFHTNuMRqPavXt3tW7dumpOTs51z9+9e7cKqAsXLrzucaqqqqtXr1ZL+68LMCvTq6++qgLqjh07Ch2bmJiopqenm9bHjh2rurq6mh3To0cPtV69eqq3t7c6dOhQs30REREqoC5atKjEcg0YMEDV6XTqV199VeT+f//9V/34449LvLbRaFRvuOEGNSQkxGz7Qw89pDo7O6vnzp0zbdu8ebMKqO+9955pmyWvW48ePdSWLVsWKuvbb7+tAuovv/xi2pb3Gv3777+mbc8//7wKFPp7ylO/fn118ODBZtuuff1UVVUPHjyoAmr//v1N29LT09WGDRuqTZs2VTMzM1VVVdW//vpLVRRFnTlzptn5xZXj8OHDKqDOmTPHbFtp//5L+7cqhKhc0nVNCMG6devw9vZm8ODB3Hnnnaxbt67I4xISEnjssccICwtDr9dTt25dxowZY9YdJSMjg3nz5tGkSROcnJwIDg7mjjvu4PTp06ZjUlNTefzxxwkNDUWv19O0aVNee+01VFU1HZPXXWfNmjWFyqEoCvPmzTOt53VHOXXqFOPGjcPLywtPT0/Gjx9PWlqa2Xmpqal8+OGHpq4r48aNK/b30rJlS/z8/My26fV6br31Vi5evEhycrJp+5dffklgYCB33HGHaZu/vz933303GzduJDMzE9C62hw5coTJkydjb5/fqP7www+jqipffvmlaZu7uzs+Pj7Fli+Pn58fLVu2LLT99ttvB7RuTNfz6aefoqoqo0ePNtu+ZMkSOnfuzO23347RaCQ1NbXI8zdu3Eh2djYPP/ywaZuiKDz00ENcvHixxG+3w8LCAK1+VaTTp09jZ2dHly5dCu3z8PDAycmpxGu4u7vz2GOP8d133xXbLfF6du7cyc8//8zkyZPN6kpBnTp1KvRaFEVRFAIDA83qEcBXX33FkCFDqFevnmlb3759adKkCV988YVpW3lfN4CgoCCAQmWoKK1bt8bPz4+IiAjTNicnJ5YvX87x48dZuHAh2dnZTJ48mdDQUF544YVSXbeo52HJ339p/1aFEJVLAh0hBOvWreOOO+7A0dGRkSNHcvLkSf7991+zY1JSUujevTtvvfUW/fv354033mDKlCkcO3aMixcvAmAwGBgyZAjz58+nY8eOLF68mOnTp5OYmMjhw4cBUFWVYcOG8frrrzNw4ECWLFlC06ZNmTVrFjNnzizX87j77rtJTk5m4cKF3H333axZs4b58+eb9n/00Ufo9Xq6d+/ORx99xEcffcSDDz5o8X2ioqJwcXEx66qzb98+OnToUKiLTOfOnUlLS+PEiROm40D7MFtQSEgIdevWNe23hqioKIBCH9autW7dOkJDQ7nllltM25KSkti1axc33HADc+bMwdPTEzc3Nxo0aGD2YRm05+Tq6krz5s3Ntnfu3Nm0/1pXrlwhJiaG3bt3m7oA9enTx/InaYH69etjMBj46KOPynWd6dOn4+3tbRZsl9Z3330HwH333WfxuWlpacTFxREXF8eZM2dYtmwZP/30E2PHjjUdc+nSJWJiYgrVL9Bej4KvhaWvm8FgMN0/MjKS3377jeeff55GjRrRrVu3Uj2Hq1evmq5RcMkbQ1OS+Ph44uPj8fX1Ndver18/Ro4cycKFC5k6dSqHDx/mrbfewtXV9brliImJYd++fTzwwAM4OTlx9913l1iGov7+hRBVlG0blIQQtpbXbWjz5s2qqmpdV+rWratOnz7d7Ljnnnuu2G5MRqNRVVVVXbVqlQqoS5YsKfaYDRs2qIC6YMECs/133nmnqiiKeurUKVVV87vrrF69utC1APX55583red1R5kwYYLZcbfffrvq6+trts2SrmtFOXnypOrk5KTef//9ha5
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA0YAAAF2CAYAAABKwYicAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAlLtJREFUeJzs3Xd809X+x/HXN7N7QUvZe7kQUXGhKKioOK4oolwFRblexYV6xb1Fxb2vP4YL9br16tUr4lauKCqKIiqiqIwWSneTJvl+f3+EhIbuJqVN+n4+Hnkk+eZ8T05OkzafnnM+x7Asy0JERERERKQDs7V1A0RERERERNqaAiMREREREenwFBiJiIiIiEiHp8BIREREREQ6PAVGIiIiIiLS4SkwEhERERGRDk+BkYiIiIiIdHgKjEREREREpMNTYCQiIiIiIh2eAiMREUlIjz32GIZhtHUzREQkTigwEpFme+ihhzAMg5EjR7Z1U1rVLbfcwiuvvNKksr///jvXX389e++9N9nZ2XTu3JnRo0fzzjvv1Fm+uLiY6dOnk5ubS2pqKgcffDBffvllnWVfe+019thjD5KSkujVqxfXXnstfr8/osz69euZNWsWBx98MOnp6RiGwfvvv1/v69pnn33Izc0lKSmJgQMHcuGFF1JYWFir7M0338wxxxxDly5dMAyD6667rs46+/Tpg2EYdV4GDhwYUXbjxo2cfvrp5OXlkZyczB577MHzzz9fZ701HXrooRiGwYwZMxot21x11VtYWMgFF1zAkCFDSE5OJi8vj7333pvLLruM8vLycLmpU6eSlpYWce7o0aMxDIOjjz661nP9+uuvGIbBHXfc0aS2eb1e7r//fg444ACys7NxuVx069aNY445hmeeeYZAIFCr7pqXjIwMdt99dx544IGIsiErV65k3LhxpKWlkZOTw6mnnlrne8E0TW6//Xb69u1LUlISu+22G88880ytcqHXHrq4XC769u3L9OnT+f333yPKhoLXL774InzsuuuuwzAMNm3aVGd/9OnTh/Hjx0ccq/l8NpuNbt26cdhhh0V8Br7//ntcLhenn356rTqLi4vp2rUrI0eOxDTNiHbUrLdr166MHz+e//3vfxHnN+fz35zPqojsWI62boCIxJ+FCxfSp08fli5dys8//8yAAQPaukmt4pZbbuGEE07guOOOa7Tsq6++ym233cZxxx3HlClT8Pv9PPHEExx66KHMnz8/4suYaZocddRRLF++nEsvvZTOnTvz0EMPMXr0aJYtWxYRSLz55pscd9xxjB49mvvvv59vv/2Wm266iYKCAh5++OFwuVWrVnHbbbcxcOBAdt11V5YsWVJvW5ctW8buu+/OpEmTSE9PZ+XKlfzf//0fb7zxBl9//TWpqanhsldddRX5+fkMHz6c//73v/XWec8990QECwC//fYbV111FYcddlj4WGlpKQcccAAbN27kggsuID8/n+eee46JEyeycOFCTjnllDrrf+mllxp8TbFWVFTEnnvuSWlpKWeccQZDhgxh8+bNfPPNNzz88MP8/e9/rxUM1eX1119n2bJljBgxokXtKCws5IgjjmDZsmUcfvjhXHXVVeTk5LBhwwbeeecdTjnlFH7++WeuvvrqiPNOPvlkjjzySABKSkr4z3/+w3nnncdvv/3GnDlzwuX++OMPDjzwQDIzM7nlllsoLy/njjvu4Ntvv2Xp0qW4XK5w2SuvvJJbb72Vs846i7322otXX32VU045BcMwmDRpUsTz9+jRg9mzZwNQXV3N999/zyOPPMJ///tfVq5cSUpKSov6oyGHHnoop512GpZlsWbNGh566CEOOeQQ3njjDY444gh22mknLr30Um655RamTp3KQQcdFD531qxZFBYW8uabb2KzRf7P+OGHHyYtLQ3TNPn999/5v//7Pw488ECWLl3K7rvvDjTv89+cz6qI7GCWiEgz/PLLLxZgvfTSS1Zubq513XXXtXWTWk1qaqo1ZcqUJpVdsWKFVVhYGHHM4/FYQ4YMsXr06BFx/F//+pcFWM8//3z4WEFBgZWVlWWdfPLJEWV32mkna9iwYZbP5wsfu/LKKy3DMKyVK1eGj5WWllqbN2+2LMuynn/+eQuw3nvvvSa13bIs64UXXrAA65lnnok4vmbNGsuyLKuwsNACrGuvvbbJdd54440WYH3yySfhY7fffrsFWIsXLw4fCwQC1l577WXl5+dbXq+3Vj1VVVVWnz59rBtuuMECrHPPPbdJz79gwQKrqX/mtq831M6abQ8pKSmxqqqqwvenTJlipaamRpQ56KCDrF69elnZ2dnW0UcfHfHYmjVrLMCaM2dOo+06/PDDLZvNZr344ot1Pv75559bTz31VKN1m6Zp7bXXXla3bt0ijv/973+3kpOTrd9++y18bNGiRRZg/fOf/wwf++OPPyyn0xnRR6ZpWqNGjbJ69Ohh+f3+iNe+884712rrAw88YAHW22+/HT4W+hl9/vnn4WPXXnutBdT6PIX07t3bOuqooyKO1fW++OabbyzAOuyww8LHqqqqrP79+1uDBw8Ov9c+/fRTyzAMa+bMmRHn19eOFStWWIB1xRVXRBxr6uc/2s+qiLQeTaUTkWZZuHAh2dnZHHXUUZxwwgksXLiwznLFxcVcdNFF9OnTB7fbTY8ePTjttNMipsd4PB6uu+46Bg0aRFJSEl27duX4449n9erV4TIVFRVcfPHF9OzZE7fbzeDBg7njjjuwLCtcJjR96LHHHqvVju2nf4Wmx/z8889MnTqVrKwsMjMzOf3006msrIw4r6Kigscffzw8lWbq1Kn19svOO+9M586dI4653W6OPPJI/vjjD8rKysLHX3jhBbp06cLxxx8fPpabm8vEiRN59dVX8Xq9QHDqz/fff8/06dNxOLYN8J9zzjlYlsULL7wQPpaenk5OTk697WtMnz59gODPra7jLfH000/Tt29f9ttvv/Cxjz76iNzcXA455JDwMZvNxsSJE9mwYQMffPBBrXpuv/12TNPkkksuaXFbmmv16tXY7Xb22WefWo9lZGSQlJTUaB3p6elcdNFF/Pvf/653mmRDlixZwn//+1+mT58e8V6pac8992Ty5MmN1mUYBl26dIl4HwG8+OKLjB8/nl69eoWPjR07lkGDBvHcc8+Fj7366qv4fD7OOeeciDr//ve/88cffzRp1CM/Px+gVhtay6677krnzp1Zs2ZN+FhSUhIPP/wwq1atYvbs2fh8PqZPn07Pnj254YYbmlRvXa+jOZ//aD+rItJ6FBiJSLMsXLiQ448/HpfLxcknn8xPP/3E559/HlGmvLycUaNGcf/993PYYYdx7733cvbZZ/PDDz/wxx9/ABAIBBg/fjzXX389I0aM4M477+SCCy6gpKSEFStWAGBZFscccwx3330348aN46677mLw4MFceumlzJw5M6rXMXHiRMrKypg9ezYTJ07kscce4/rrrw8//uSTT+J2uxk1ahRPPvkkTz75JH/729+a/TwbNmwgJSUlYurQV199xR577FFrys7ee+9NZWUlP/74Y7gcBL/81tStWzd69OgRfrwlLMti06ZNbNiwgY8++ojzzz8fu93O6NGjW1xnTV999RUrV66sNTXO6/WSnJxcq3yof5YtWxZxfO3atdx6663cdtttdZ7XWnr37k0gEODJJ5+Mqp4LLriA7OzsetdmNeTf//43AH/961+bfW5lZSWbNm1i06ZN/PLLLzz44IO89dZbTJkyJVzmzz//pKCgoNb7C4LvxZrvr6+++orU1FSGDh1aq1zo8ZoCgUD4+devX8+7777Ltddey4ABA9h///2b9BqKiorCddS8hNYANWbLli1s2bKFTp06RRw/9NBDOfnkk5k9ezYzZsxgxYoV3H///RFTSOtqR0FBAV999RVnnXUWSUlJTJw4sdE21PX5F5H2S2uMRKTJli1bxg8//MD9998PwAEHHECPHj1YuHAhe+21V7jcnDlzWLFiBS+99BJ/+ctfwsevuuqq8EjPE088weLFi7nrrru46KKLwmVmzZoVLvPaa6/x7rvvctN
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAy0AAAF2CAYAAABjxncbAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAjSNJREFUeJzs3Xd4U2X7B/DvSdOkew9aWmjZsvdSFBQRFBDFwZIyFAcoyquvCwcO0NeFPweiskVQQURRQVARFZC9ZO/VRekeaZPz/P44TZp0p017kvT7ua5cOTnn6Tl38qRt7jxLEkIIEBEREREROSmN2gEQERERERFVhkkLERERERE5NSYtRERERETk1Ji0EBERERGRU2PSQkRERERETo1JCxEREREROTUmLURERERE5NSYtBARERERkVNj0kJERERERE6NSQsREdW7xYsXQ5IktcMgIiIXwaSFyM18/PHHkCQJvXr1UjuUOjV79mx899131Sp74cIFzJo1Cz179kRwcDDCwsLQv39/bNq0qdzyGRkZmDJlCsLDw+Hr64sBAwZgz5495Zb9/vvv0bVrV3h5eaFJkyZ46aWXYDQabcokJibimWeewYABA+Dv7w9JkrB58+Yy58rLy8NHH32EQYMGISoqCv7+/ujSpQvmzZsHk8lUpnxiYiKmTJmC+Ph4eHt7o3nz5pgxYwbS0tIqfC2KiorQtm1bSJKEt99+2+bYyy+/DEmSKrz9/ffflrKfffYZbrjhBkRGRkKv1yM+Ph4TJ07E2bNnK7x2TUmShGnTptnsS01NxfTp09GmTRt4e3sjIiICPXv2xNNPP42cnBxLuQkTJsDPz8/mZ/v37w9JkjBs2LAy1zp79my5r01FDAYDPvjgA1x33XUIDg6GTqdDdHQ0hg8fjhUrVtjUm/nc1reAgAB07twZH374Ybl1fOTIEQwePBh+fn4ICQnBfffdh9TU1DLlZFnG//73P8THx8PLywsdO3bEihUrypQzP3fzTafTIT4+HlOmTMGFCxfKfY7//vsvxo0bh8aNG0Ov1yM6Ohrjxo3D4cOHy5QdN24cvLy8cPz48TLH3njjDUiShHXr1ln2la7b0q+RRqNBSEgIhgwZgm3btpU5Z+n3rI+PD9q2bYuZM2ciKyvLpuzu3bsxePBgBAQEwN/fH4MGDcK+fftsypRXR9a3Bx54oNzXiIjqnlbtAIjIsZYvX464uDjs2LEDJ0+eRIsWLdQOqU7Mnj0bd911F0aMGFFl2bVr1+LNN9/EiBEjkJCQAKPRiKVLl+Lmm2/GwoULMXHiREtZWZZx2223Yf/+/XjqqacQFhaGjz/+GP3798fu3bvRsmVLS9mff/4ZI0aMQP/+/fHBBx/g4MGDeO2115CSkoJ58+ZZyh07dgxvvvkmWrZsiQ4dOpT74QsATp8+jUcffRQ33XQTZsyYgYCAAGzYsAGPPPIItm/fjiVLlljK5uTkoE+fPsjNzcUjjzyC2NhY7N+/Hx9++CF+//137N69GxpN2e+lPvjgA5w/f77c6995553lvl+ee+455OTkoEePHpZ9e/fuRXx8PIYPH47g4GCcOXMGn332GdatW4f9+/cjOjq6khqpnatXr6J79+7IysrCpEmT0KZNG6SlpeHAgQOYN28eHn744TKJSnnWrVuH3bt3o1u3bjWKIzU1FUOGDMHu3btxyy23YObMmQgJCUFSUhI2bdqEMWPG4OTJk3jhhRdsfm706NG49dZbAQCZmZn46aef8Oijj+LcuXN46623LOUuXryI66+/HoGBgZg9ezZycnLw9ttv4+DBg9ixYwd0Op2l7PPPP4833ngDDzzwAHr06IG1a9dizJgxkCQJo0aNsrl+TEwM5syZAwAoLCzE4cOH8cknn2DDhg04cuQIfHx8LGW//fZbjB49GiEhIZg8eTLi4+Nx9uxZLFiwAKtWrcJXX32F22+/3VL+3XffxU8//YSHHnoIv/32m2X/mTNn8Morr2DkyJEYOnRola+t+TUymUw4fvw4Pv74YwwYMAA7d+5Ehw4dypSfN28e/Pz8kJOTg19++QWvv/46fvvtN/z999+QJAl79uzBddddh9jYWLz00kuQZRkff/wxbrjhBuzYsQOtW7cGAISHh2PZsmVlzr9+/XosX74cgwYNqjJ2IqojgojcxunTpwUA8e2334rw8HDx8ssvqx1SnfH19RUJCQnVKnvo0CGRmppqs6+goEC0adNGxMTE2Oz/6quvBADxzTffWPalpKSIoKAgMXr0aJuybdu2FZ06dRJFRUWWfc8//7yQJEkcOXLEsi8rK0ukpaUJIYT45ptvBADx+++/l4kzNTVVHDp0qMz+iRMnCgDixIkTln3Lly8XAMS6detsyr744osCgNizZ0+Z8yQnJ4vAwEDxyiuvCADirbfeKlOmtPPnzwtJksQDDzxQZdldu3YJAGLOnDlVll20aJGo7r8gAGLq1KmWx//73/8EAPH333+XKZuZmSny8/MtjxMSEoSvr69NmRtuuEE0adJEBAcHi2HDhtkcO3PmTLVfm1tuuUVoNBqxevXqco/v3LlTfPHFF1WeW5Zl0aNHDxEdHW2z/+GHHxbe3t7i3Llzln0bN24UAMT8+fMt+y5evCg8PT1tXiNZlkW/fv1ETEyMMBqNNs+9Xbt2ZWL98MMPBQDxyy+/WPadPHlS+Pj4iDZt2oiUlBSb8qmpqaJNmzbCz89PnD592ubYp59+KgCIxYsXW/YNHjxYBAQEiIsXL9qULV23Fb1GP//8swAgHn74YZv9L730kgBQ5vf7zjvvFADE1q1bhRBC3HrrrSI4OFhcuXLFUuby5cvCz89P3HnnnWVej9JuuukmERAQYPPeIqL6xe5hRG5k+fLlCA4Oxm233Ya77roLy5cvL7dcRkYGnnjiCcTFxUGv1yMmJgbjx4/HlStXLGUKCgrw8ssvo1WrVvDy8kJUVBTuvPNOnDp1ylImNzcX//nPfxAbGwu9Xo/WrVvj7bffhhDCUsbc3WLx4sVl4pAkCS+//LLlsbmrx8mTJzFhwgQEBQUhMDAQEydORF5ens3P5ebmYsmSJZZuGxMmTKjwdWnXrh3CwsJs9un1etx66624ePEisrOzLftXrVqFyMhI3HnnnZZ94eHhuOeee7B27VoYDAYAwOHDh3H48GFMmTIFWm1Jo/UjjzwCIQRWrVpl2efv74+QkJAK4zMLCwtDu3btyuy/4447AChdhczMXV8iIyNtykZFRQEAvL29y5znmWeeQevWrTFu3LgqYzFbsWIFhBAYO3ZslWXj4uIAKO+vunTq1Cl4eHigd+/eZY4FBATAy8urynP4+/vjiSeewA8//FBh17/KbNu2DRs2bMCUKVNs3ivWunfvXq3XTZIkREZG2ryPAGD16tUYOnQomjRpYtk3cOBAtGrVCl9//bVl39q1a1FUVIRHHnnE5pwPP/wwLl68WGHLnrVGjRoBgE0Mb731FvLy8vDpp58iPDzcpnxYWBjmz5+PnJwcm9YhALj//vtx7bXX4sknn0RaWhpWrlyJ9evX47XXXkPjxo2rjKU8/fr1AwCbvz+VufHGGwEoLTwA8Oeff2LgwIEIDQ21lImKisINN9yAdevW2XQpLC0xMRG///477rzzzmq9t4iobjBpIXIjy5cvx5133gmdTofRo0fjxIkT2Llzp02ZnJwc9OvXDx988AEGDRqE999/Hw899BCOHj2KixcvAgBMJhOGDh2KWbNmoVu3bnjnnXcwffp0ZGZm4tChQwAAIQSGDx+O9957D4MHD8a7776L1q1b46mnnsKMGTNq9TzuueceZGdnY86cObjnnnuwePFizJo1y3J82bJl0Ov16NevH5YtW4Zly5bhwQcftPs6SUlJ8PHxsekOs3fvXnTt2rVM16qePXsiLy/P0ld/7969AJQPptaio6MRExNjOe4ISUlJAGCTeF1//fXQaDSYPn06tm/fjosXL+Knn37C66+/jhEjRqBNmzY259ixYweWLFmCuXPn2jUAfvny5YiNjcX1119f7vG0tDSkpKRg165dlm52N910k71P0S5NmzaFyWQ
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA0AAAAF2CAYAAABH3/jbAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAhcZJREFUeJzt3Xd4FFXbx/Hv7G46JKEkoQVCb0oRFEERUKqAYhdQiiKPCAoivIqiyCOPqCiIiqJ0FcUuCgoiClhQlCZIh9AhCS0JkLo77x9LNixJIJu2Cfl9rmuv3Zk9M3PPcmfJnXPmjGGapomIiIiIiEgpYPF2ACIiIiIiIkVFBZCIiIiIiJQaKoBERERERKTUUAEkIiIiIiKlhgogEREREREpNVQAiYiIiIhIqaECSERERERESg0VQCIiIiIiUmqoABIRERERkVJDBZCIiJQIc+fOxTAMb4chIiIlnAogEeHtt9/GMAxatWrl7VAK1YsvvsjXX3+dq7YHDhxg/PjxXHPNNZQrV46KFSvSvn17fvzxx2zbnzp1isGDBxMWFkZQUBAdOnRg3bp12bb95ptvuOqqq/D396d69eqMGzeO9PR0tzZHjhzhqaeeokOHDpQtWxbDMFixYkWO53XttdcSFhaGv78/devWZcSIEcTFxWVp63A4eOWVV6hZsyb+/v40adKEjz/++KKfRVpaGo0aNcIwDF599dVs2+zevZs+ffoQHh5OQEAAdevW5ZlnnnE77ty5c7nllluIjIwkKCiIK664ggkTJpCcnHzR4+eFYRgMGzbMbV1cXBzDhw+nQYMGBAQEEB4ezjXXXMOTTz7J6dOnXe0GDBhAmTJl3LZt3749hmHQs2fPLMfau3fvRT+bC6WkpPDmm29y/fXXU65cOXx9falSpQq33HILH3/8MXa7Pcu+z38EBwfTrFkz3nrrLbe2GbZu3UrXrl0pU6YM5cuX5/77789XLmSce8bD19eXmjVrMnjwYA4cOODWNqNI/fvvv13rnn/+eQzD4NixY9l+HlFRUfTo0cNt3fnHs1gsVKlShc6dO7v9DGzZsgVfX18GDhyYZZ+nTp2icuXKtGrVCofD4RbH+futXLkyPXr04I8//nDb3pOff09+VkWkeLB5OwAR8b758+cTFRXFmjVr2LVrF3Xq1PF2SIXixRdf5M4776RXr16XbLtw4UJefvllevXqRf/+/UlPT+f999+nU6dOzJ492+2XLofDQffu3dm4cSOjR4+mYsWKvP3227Rv3561a9dSt25dV9vvv/+eXr160b59e9588002bdrEhAkTiI2N5Z133nG12759Oy+//DJ169blyiuvZPXq1TnGunbtWpo1a8a9995L2bJl2bp1KzNmzGDx4sVs2LCBoKAgV9tnnnmGl156iYceeoirr76ahQsX0qdPHwzD4N577812/2+++Sb79+/P8fgbNmygffv2VK1alSeeeIIKFSqwf/9+t1+Oz549y8CBA7n22mt5+OGHCQ8PZ/Xq1YwbN47ly5fz008/FWrvzokTJ2jZsiUJCQk88MADNGjQgOPHj/PPP//wzjvvMGTIkCxFT3YWLVrE2rVradGiRZ7iiIuLo1u3bqxdu5YuXbowduxYypcvz9GjR/nxxx/p06cPu3bt4tlnn3Xbrnfv3tx8880AxMfH89133/Hoo4+yb98+Jk2a5Gp38OBBbrjhBkJCQnjxxRc5ffo0r776Kps2bWLNmjX4+vq62nqSC9WqVWPixIkApKamsmXLFqZPn87SpUvZunUrgYGBefo8LqZTp07069cP0zSJjo7m7bff5sYbb2Tx4sV069aNRo0aMXr0aF588UUGDBhAu3btXNs+9dRTxMXF8f3332OxuP+t95133qFMmTI4HA4OHDjAjBkzuOGGG1izZg3NmjUDPPv59+RnVUSKCVNESrU9e/aYgPnll1+aYWFh5vPPP+/tkApNUFCQ2b9//1y13bx5sxkXF+e2Ljk52WzQoIFZrVo1t/WffPKJCZifffaZa11sbKwZGhpq9u7d261to0aNzKZNm5ppaWmudc8884xpGIa5detW17qEhATz+PHjpmma5meffWYC5s8//5yr2E3TND///HMTMD/++GPXuoMHD5o+Pj7m0KFDXescDofZtm1bs1q1amZ6enqW/cTExJghISHmf//7XxMwJ02a5Pa+3W43r7jiCrNVq1bm2bNnc4wnJSXF/O2337KsHz9+vAmYy5Ytu+Q5zZkzx8ztf1uA23m+8sorJpBtDPHx8WZSUpJruX///mZQUJBbm3bt2pnVq1c3y5UrZ/bs2dPtvejo6Gw/m+x06dLFtFgs5hdffJHt+3/99Zf54YcfXnLfDofDvPrqq80qVaq4rR8yZIgZEBBg7tu3z7Vu2bJlJmC+++67rnWe5EK7du3Mxo0bZ4n1rbfeMgHzhx9+cK3L+Df666+/XOvGjRtnAll+njLUqFHD7N69u9u6C//9TNM0//nnHxMwO3fu7FqXlJRk1q5d26xfv76ZkpJimqZp/v7776ZhGObIkSPdts8pjs2bN5uA+fTTT7uty+3Pf35/VkWk6GkInEgpN3/+fMqVK0f37t258847mT9/frbtTp06xeOPP05UVBR+fn5Uq1aNfv36uQ1rSU5O5vnnn6devXr4+/tTuXJlbr/9dnbv3u1qc+bMGZ544gkiIyPx8/Ojfv36vPrqq5im6WqTMexn7ty5WeIwDIPnn3/etZwxrGXXrl0MGDCA0NBQQkJCGDhwIGfPnnXb7syZM8ybN881BGbAgAE5fi6NGzemYsWKbuv8/Py4+eabOXjwIImJia71n3/+OREREdx+++2udWFhYdx9990sXLiQlJQUwDlkZ8uWLQwePBibLbMD/pFHHsE0TT7//HPXurJly1K+fPkc47uUqKgowPnvlmHhwoWkpaXxyCOPuNYZhsGQIUM4ePBgtn+5fuqpp6hfvz733Xdftsf54Ycf2Lx5M+PGjSMgIICzZ89mOyzL19eXNm3aZFl/2223Ac5hW4Vp9+7dWK1Wrr322izvBQcH4+/vf8l9lC1blscff5xvv/02x+GNF7N69WqWLl3K4MGD3XLlfC1btqRv376X3JdhGERERLjlEcAXX3xBjx49qF69umtdx44dqVevHp9++qlrXV5y4UKVKlUCyBJDYbnyyiupWLEi0dHRrnX+/v688847bN++nYkTJ5KWlsbgwYOJjIzkv//9b672m915ePLzn9+fVREpeiqAREq5+fPnc/vtt+Pr60vv3r3ZuXMnf/31l1ub06dP07ZtW9588006d+7M1KlTefjhh9m2bRsHDx4EwG6306NHD8aPH0+LFi147bXXGD58OPHx8WzevBkA0zS55ZZbmDJlCl27dmXy5MnUr1+f0aNHM3LkyHydx913301iYiITJ07k7rvvZu7cuYwfP971/gcffICfnx9t27blgw8+4IMPPuA///mPx8c5evQogYGBbkN+1q9fz1VXXZVlqM0111zD2bNn2bFjh6sdOH/JPV+VKlWoVq2a6/28ME2TY8eOcfToUX755Rcee+wxrFYr7du3d4szKCiIhg0bZonz/PgyrFmzhnnz5vH666/nODwt45oIPz8/WrZsSVBQEIGBgdx7772cOHHiknEfPXoUIMsvmwWtRo0a2O12Pvjgg3ztZ/jw4ZQrV86tCM+tb7/9FiDHYvJizp49y7Fjxzh27Bh79uxh2rRpLFmyhP79+7vaHDp0iNjY2Cz5Bc5/4/P/fT3NBbvd7jr+kSNH+Omnnxg3bhx16tThuuuuy9U5nDhxwrWP8x8Z1+hcysmTJzl58iQVKlRwW9+pUyd69+7NxIkTGTZsGJs3b+bNN990G/qZXRyxsbGsX7+ehx56CH9/f+6+++5LxpDdz7+IlDy6BkikFFu7di3btm3jzTffBOD666+nWrVqzJ8/n6uvvtrVbtKkSWzevJkvv/zS9Rd7gLFjx7p6bt5//32WL1/O5MmTefzxx11tnnrqKVebb775hp9++okJEya4LpAfOnQod911F1OnTmXYsGHUrl07T+fSvHlzZs2a5Vo
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAzoAAAF2CAYAAACmtO2KAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAmqFJREFUeJzs3Xd8U9X/x/HXzeimiw42lC3IUFRwoKgIKKB83YIyBHGAoigqogLqT9wbRQXEgVtxbxRxoCgIioCsAspoGR10p8n9/ZE2NLSlSZuUFt7PxyOPJDfnnnsSTks+Ped8jmGapomIiIiIiMhhxHKoGyAiIiIiIhJoCnREREREROSwo0BHREREREQOOwp0RERERETksKNAR0REREREDjsKdERERERE5LCjQEdERERERA47CnREREREROSwo0BHREREREQOOwp0RESkXpg3bx6GYRzqZoiISD2hQEdEePbZZzEMg549ex7qpgTV/fffzwcffOBT2X///Zfp06dzwgknEBcXR0JCAn369OGbb76psHxmZiZjx44lMTGRyMhITj/9dJYvX15h2Y8++ohjjz2WsLAwWrRowdSpUykuLvYqs2PHDm6//XZOP/10GjRogGEYLFq0qNL31atXLxITEwkLC6Ndu3bceOON7Nq1q1xZl8vFQw89REpKCmFhYXTt2pU33njjoJ+Fw+GgU6dOGIbBI488UmGZjRs3MnToUJKSkggPD6ddu3ZMmTLF67rz5s3j3HPPpXnz5kRGRnL00Udz3333UVBQcNDrV4dhGIwfP97r2K5du5gwYQIdO3YkPDycpKQkTjjhBG677TZycnI85UaOHElUVJTXuX369MEwDAYPHlzuWps3bz7oZ3OgwsJCnn76aU455RTi4uIICQmhSZMmnHvuubzxxhs4nc5ydZe9RUdH0717d5555hmvsqXWrFnDgAEDiIqKIj4+niuuuKJGfaH0vZfeQkJCSElJYezYsfz7779eZUuD0d9//91zbNq0aRiGwe7duyv8PFq1asWgQYO8jpW9nsVioUmTJvTr18/rZ2D16tWEhIQwatSocnVmZmbSuHFjevbsicvl8mpH2XobN27MoEGD+OWXX7zO9+fn35+fVRGpXbZD3QAROfTmz59Pq1atWLp0KRs2bKBt27aHuklBcf/993PhhRcyZMiQKst++OGHPPjggwwZMoQRI0ZQXFzMK6+8wllnncXcuXO9vly5XC4GDhzIypUrmTRpEgkJCTz77LP06dOHZcuW0a5dO0/Zzz//nCFDhtCnTx+efvpp/vrrL+677z7S09N57rnnPOX++ecfHnzwQdq1a0eXLl1YsmRJpW1dtmwZ3bt359JLL6VBgwasWbOGF198kU8//ZQVK1YQGRnpKTtlyhQeeOABrrrqKo4//ng+/PBDhg4dimEYXHrppRXW//TTT7N169ZKr79ixQr69OlD06ZNufnmm2nYsCFbt271+hKcl5fHqFGj6NWrF9dccw1JSUksWbKEqVOnsnDhQr799tugjtbs3buX4447juzsbK688ko6duzInj17+PPPP3nuuee49tprywU3Ffnkk09YtmwZPXr0qFY7du3axdlnn82yZcvo378/d955J/Hx8ezcuZNvvvmGoUOHsmHDBu666y6v8y677DLOOeccALKysvjss8+4/vrr2bJlCw8//LCn3H///cepp55KTEwM999/Pzk5OTzyyCP89ddfLF26lJCQEE9Zf/pCs2bNmDFjBgBFRUWsXr2aWbNm8eWXX7JmzRoiIiKq9XkczFlnncXw4cMxTZPU1FSeffZZzjjjDD799FPOPvtsOnXqxKRJk7j//vsZOXIkp512mufc22+/nV27dvH5559jsXj/Tfe5554jKioKl8vFv//+y4svvsipp57K0qVL6d69O+Dfz78/P6siUstMETmibdq0yQTM999/30xMTDSnTZt2qJsUNJGRkeaIESN8Krtq1Spz165dXscKCgrMjh07ms2aNfM6/tZbb5mA+c4773iOpaenm7GxseZll13mVbZTp05mt27dTIfD4Tk2ZcoU0zAMc82aNZ5j2dnZ5p49e0zTNM133nnHBMzvvvvOp7abpmm+++67JmC+8cYbnmP//fefabfbzXHjxnmOuVwus3fv3mazZs3M4uLicvWkpaWZMTEx5j333GMC5sMPP+z1utPpNI8++mizZ8+eZl5eXqXtKSwsNH/66adyx6dPn24C5tdff13le3rppZdMX//bArze50MPPWQCFbYhKyvLzM/P9zwfMWKEGRkZ6VXmtNNOM1u0aGHGxcWZgwcP9notNTW1ws+mIv379zctFov53nvvVfj6b7/9Zr722mtV1u1yuczjjz/ebNKkidfxa6+91gwPDze3bNniOfb111+bgPn88897jvnTF0477TSzc+fO5dr6zDPPmID51VdfeY6V/hv99ttvnmNTp041gXI/T6VatmxpDhw40OvYgf9+pmmaf/75pwmY/fr18xzLz88327RpY3bo0MEsLCw0TdM0f/75Z9MwDHPixIle51fWjlWrVpmAeccdd3gd8/Xnv6Y/qyISPJq6JnKEmz9/PnFxcQwcOJALL7yQ+fPnV1guMzOTm266iVatWhEaGkqzZs0YPny413SUgoICpk2bRvv27QkLC6Nx48acf/75bNy40VMmNzeXm2++mebNmxMaGkqHDh145JFHME3TU6Z0us68efPKtcMwDKZNm+Z5XjodZcOGDYwcOZLY2FhiYmIYNWoUeXl5Xufl5uby8ssve6aujBw5stLPpXPnziQkJHgdCw0N5ZxzzuG///5j3759nuPvvvsuycnJnH/++Z5jiYmJXHzxxXz44YcUFhYC7qk2q1evZuzYsdhs+wfUr7vuOkzT5N133/Uca9CgAfHx8ZW2ryqtWrUC3P9upT788EMcDgfXXXed55hhGFx77bX8999/Ff4l+vbbb6dDhw5cfvnlFV7nq6++YtWqVUydOpXw8HDy8vIqnE4VEhLCSSedVO74//73P8A93SqYNm7ciNVqpVevXuVei46OJiwsrMo6GjRowE033cTHH39c6bTEg1myZAlffvklY8eO9eorZR133HEMGzasyroMwyA5OdmrHwG89957DBo0iBYtWniO9e3bl/bt2/P22297jlWnLxyoUaNGAOXaECxdunQhISGB1NRUz7GwsDCee+45/vnnH2bMmIHD4WDs2LE0b96ce+65x6d6K3of/vz81/RnVUSCR4GOyBFu/vz5nH/++YSEhHDZZZexfv16fvvtN68yOTk59O7dm6effpp+/frx5JNPcs0117B27Vr+++8/AJxOJ4MGDWL69On06NGDRx99lAkTJpCVlcWqVasAME2Tc889l8cff5wBAwbw2GOP0aFDByZNmsTEiRNr9D4uvvhi9u3bx4wZM7j44ouZN28e06dP97z+6quvEhoaSu/evXn11Vd59dVXufrqq/2+zs6dO4mIiPCaqvPHH39w7LHHlpsic8IJJ5CXl8e6des85cD9ZbasJk2a0KxZM8/r1WGaJrt372bnzp388MMP3HDDDVitVvr06ePVzsjISI466qhy7SzbvlJLly7l5Zdf5oknnqh0WlnpmoXQ0FCOO+44IiMjiYiI4NJLL2Xv3r1Vtnvnzp0A5b5UBlrLli1xOp28+uqrNapnwoQJxMXFeQXbvvr4448BKg0aDyYvL4/du3eze/duNm3axMyZM/niiy8YMWKEp8y2bdtIT08v17/A/W9c9t/X377gdDo919+xYwfffvstU6dOpW3btpx88sk+vYe9e/d66ih7K11DU5WMjAwyMjJo2LCh1/GzzjqLyy67jBkzZjB+/HhWrVrF008/7TVls6J2pKen88cff3DVVVcRFhbGxRdfXGUbKvr5F5G6S2t0RI5gy5YtY+3atTz99NMAnHLKKTRr1oz58+dz/PHHe8o9/PDDrFq1ivfff9/zF3iAO++80zMS88orr7Bw4UIee+wxbrrpJk+Z22+/3VPmo48+4ttvv+W+++7zLFQfN24cF110EU8++STjx4+nTZs21Xo
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAy0AAAF2CAYAAABjxncbAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAkK9JREFUeJzs3Xd4U2X7B/DvyWi6B92lpRQoe4rIUAQUEQeKIsgSVBD9ASqioLwOwAEqLtwoCKgovA5e3IgIKoqCyBABmWV2UbpnkvP8/jhNmpCkdJ/T9Pu5rlxJTp4kd+6mbe48SxJCCBAREREREWmUTu0AiIiIiIiIKsOihYiIiIiINI1FCxERERERaRqLFiIiIiIi0jQWLUREREREpGksWoiIiIiISNNYtBARERERkaaxaCEiIiIiIk1j0UJERERERJrGooWIiBrcvHnz0LJlS7XDICKiRoJFC5GXefPNNyFJEnr37q12KPVqwYIF+N///leltidPnsT8+fNxySWXICwsDBERERg4cCB++OEHt+1zcnIwZcoUREZGIiAgAIMGDcJff/3ltu0XX3yBiy66CL6+vmjRogXmzp0Li8Xi1CY1NRWPPPIIBg0ahKCgIEiShM2bN7s8VlFREd544w0MGTIEsbGxCAoKQo8ePfDWW2/BarU6tZ03bx4kSfJ4+vXXX53ay7KMt956C927d4efnx/Cw8NxxRVXYPfu3S7tnn/+eSQlJcHX1xddu3bFxx9/7BJrZc991VVXuc1VTaSkpECSJLzwwgsux++44w60bt0avr6+iImJweWXX465c+c6tRs4cCA6d+7sdKxly5aQJAn33nuvy/Nt3rwZkiTh008/rVJ8eXl5eOaZZ3DxxRcjJCQEJpMJiYmJuPXWW/H111+7fWzHU7NmzdCnTx+sWrXK7eP/9ttvuOyyy+Dv74+YmBjcd999KCgocGlXWlqKhx9+GHFxcfDz80Pv3r2xYcMGl3a21247+fr6Ijk5GbNmzcK5c+ec2treY2fPnrUfu/322xEYGOgxH5IkYfr06fbrtp+f7aTX69GiRQvcdNNN2LVrl73dhg0bIEkS5s+f7/KYx44dg7+/P2655RanOBwf12AwICEhAaNHj8a+ffuc7n/gwAHMnj0b3bt3R1BQEGJjY3Hdddfhzz//dHmuf//9Fw888AD69esHX19fSJKElJQUj6+XiBqOQe0AiKhurVq1Ci1btsS2bdtw+PBhtGnTRu2Q6sWCBQtwyy23YPjw4Rdsu27dOjz33HMYPnw4Jk6cCIvFgvfffx9XXXUV3nvvPdxxxx32trIs47rrrsPu3bsxa9YsRERE4M0338TAgQOxY8cOJCcn29t+++23GD58OAYOHIjXXnsNf//9N55++mlkZGTgrbfesrf7999/8dxzzyE5ORldunTB1q1b3cZ59OhR3Hvvvbjyyisxc+ZMBAcHY/369Zg6dSp+//13rFy50t725ptvdvuz/c9//oOCggL06tXL6fidd96JVatWYcKECZg+fToKCwuxc+dOZGRkOLV79NFH8eyzz+Kuu+5Cr169sG7dOowdOxaSJGH06NH2dh988IHLc//5559YvHgxhgwZ4ulHUScOHz6MXr16wc/PD3feeSdatmyJ1NRU/PXXX3juuefcfvB1591338WcOXMQFxdX4ziuvvpqHD9+HDfddBMmTJiAwMBAnDx5Et988w2uv/56vP/++7jtttuc7nfffffZfz5ZWVlYs2YNxo8fj5ycHEybNs3ebteuXbjyyivRoUMHvPTSSzh16hReeOEFHDp0CN9++63TY95+++349NNPMWPGDCQnJ2PFihW49tprsWnTJlx22WVObbt3744HH3wQAFBSUoIdO3bglVdewU8//YRt27bVKBcXMmbMGFx77bWwWq3Yv38/3nrrLXz77bf4/fff0b17d1x11VUYO3YsFi5ciDFjxqBt27b2+06dOhVGoxGvvvqq02OaTCYsXboUAGCxWHDkyBG8/fbb+O6777Bv3z77z3Xp0qVYtmwZRowYgalTpyI3NxdLlixBnz598N1332Hw4MH2x9y6dSteffVVdOzYER06dHAqrIhIZYKIvMbRo0cFAPH555+LyMhIMW/ePLVDqjcBAQFi4sSJVWq7d+9ekZmZ6XSspKREtG/fXsTHxzsdX7NmjQAgPvnkE/uxjIwMERoaKsaMGePUtmPHjqJbt27CbDbbjz366KNCkiSxf/9++7G8vDyRlZUlhBDik08+EQDEpk2bXOLMzMwUe/fudTl+xx13CADi0KFDlb7OEydOCEmSxF133eX2NX3++eeV3v/UqVPCaDSKadOm2Y/Jsiz69+8v4uPjhcViqfT+kyZNEpIkiZMnT1baTggh5s6dKxITEy/Y7tixYwKAWLRokf3Y1KlThcFgECkpKS7t09PTna4PGDBAdOrUyelYYmKi6NSpkzAYDOLee+91um3Tpk0uP393zGaz6Ny5swgICBBbtmxx22b9+vXim2++ueBjl5aWiubNm4t+/fo5Hb/mmmtEbGysyM3NtR979913BQCxfv16+7E//vjDJUfFxcWidevWom/fvi6v/brrrnOJ9aGHHhIAxMGDB+3H5s6dKwA4/e5MnDhRBAQEuH29QggBwOn94+7nJ4QQX3zxhQAgpkyZYj+Wnp4uwsLCxKBBg+zHPv74YwFAvPrqq0739xTHV199JQCId955x37szz//FPn5+U7tzp49KyIjI8Wll17qdDwrK0vk5eUJIYRYtGiRACCOHTvm8fUSUcPh8DAiL7Jq1SqEhYXhuuuuwy233OJxyElOTg4eeOABtGzZEiaTCfHx8ZgwYYLTMJCSkhLMmzcPbdu2ha+vL2JjY3HzzTfjyJEj9jaFhYV48MEHkZCQAJPJhHbt2uGFF16AEMLexjY8ZMWKFS5xSJKEefPm2a/bhqMcPnwYt99+O0JDQxESEoI77rgDRUVFTvcrLCzEypUr7cNDbr/9do956dSpEyIiIpyOmUwmXHvttTh16hTy8/Ptxz/99FNER0fj5ptvth+LjIzEqFGjsG7dOpSWlgIA9u3bh3379mHKlCkwGCo6radOnQohhNPwoqCgIDRr1sxjfDYRERHo1KmTy/GbbroJALB///5K7//xxx9DCIFx48Y5HX/ppZdwySWX4KabboIsyygsLHR7/3Xr1sFsNmPq1Kn2Y5Ik4f/+7/9w6tQpjz1EgDI86bPPPsOAAQMQHx9faZy1deTIEcTHxyMxMdHltqioqCo9RsuWLTFhwgS8++67OHPmTLVj+OSTT7B37148/vjjuPTSS922GTJkCK655poLPpaPjw/CwsKc3kd5eXnYsGEDxo8fj+DgYPtxW2/Of//7X/uxTz/9FHq9HlOmTLEf8/X1xaRJk7B161acPHnygjHExMQAgFMM9emKK64AoAz9somKisJzzz2HTZs2YeXKlfa/U7169XLqgaqMu9fRs2dPlyFt4eHh6N+/v8vvVLNmzRAUFFSj10RE9YtFC5EXWbVqFW6++Wb4+PhgzJgxOHToELZv3+7UpqCgAP3798drr72GIUOGYPHixbjnnntw4MABnDp1CgBgtVpx/fXXY/78+ejZsydefPFF3H///cjNzcXevXsBAEII3HDDDXj55ZcxdOhQvPTSS2jXrh1mzZqFmTNn1up1jBo1Cvn5+Vi4cCFGjRqFFStWOA35+eCDD2AymdC/f3988MEH+OCDD3D33XdX+3nS0tLg7+8Pf39/+7GdO3fioosugk7n/OfxkksuQVFREQ4ePGhvBwAXX3yxU7u4uDjEx8fbb68LaWlpAOBSeJ1v1apVSEhIwOWXX24/lpeXh23btqFXr174z3/+g5CQEAQGBqJVq1ZOH3wB5TUFBASgQ4cOTscvueQS++2efPPNN8jJyXEpmOpDYmIiTp48iR9//LFWj/Poo4/CYrHg2WefrfZ9v/zySwDA+PHjq33f/Px8nD17FmfPnsXBgwcxb9487N27FxMnTrS3+fvvv2GxWFzeXz4+PujevbvTz2Lnzp1o27atU3EDVPzczh/iZDab7c9/6tQ
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAy0AAAF2CAYAAABjxncbAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzsnXeY1MTfwD/Jtut3cNzRe+8gSBMEaVIVRZAmIKCiYANRsYIFK3ZFBYSfCoKKBdAXRQREBUGkiPTeOer1u91N8v6R3SR7u3uFrsznee653clkMslOkvnOt0mapmkIBAKBQCAQCAQCwWWKfKk7IBAIBAKBQCAQCAT5IYQWgUAgEAgEAoFAcFkjhBaBQCAQCAQCgUBwWSOEFoFAIBAIBAKBQHBZI4QWgUAgEAgEAoFAcFkjhBaBQCAQCAQCgUBwWSOEFoFAIBAIBAKBQHBZI4QWgUAgEAgEAoFAcFkjhBaBQCAQCAQCgUBwWSOEFoFAIBBckVSqVIkJEyZc6m4IBAKBoBAIoUUguIC89957SJJE8+bNL3VXLiiTJk3im2++KdI+J0+eZNy4cdSsWZOIiAiKFy/O9ddfz8KFC4Pq7t27F0mSQv61aNHCqDd06NCw9RYtWpRvfypVqmTUlWWZhIQE6tevz5133skff/wRch9Jkhg9enRA2fHjx7n//vupVasWkZGRJCcn06xZMx555BEyMjJYtmxZ2D7m/QOYOXNmQJndbqds2bIMHTqUQ4cOBfWpXbt21KtXL+y5SZJEREQE1atXZ9y4cZw6dSqg7tChQ4mJiQl7nWJiYhg6dGjIdsP9zZw5M+z1grMfC/PmzQvaPmHCBCRJ4sSJE2HPoaiEa3PBggW0bduW5ORkoqKiqFKlCn379g0Ya/7+vvrqq0aZdQysXbs26HgF/QYF9Svvcb788suQ20ePHm2MMyu///47rVu3JioqilKlSnHfffeRkZERVG/t2rV06dKFuLg4YmNj6dy5M+vXrw+q5/F4mDhxIlWqVMHlclGlShWee+45vF5vQL01a9YwevRo6tatS3R0NBUqVKBv375s3749ZP9VVWXKlCk0atSIyMhIEhMTad++PRs2bDDqbN26lYcffphGjRoRGxtL6dKl6d69O3/++WdQe/mN5+rVqwfVP3bsGHfddRdly5YlIiKCSpUqMXz48IA627Zt48EHH6RVq1ZEREQgSRJ79+4NeT5z585l0KBBVK9eHUmSaNeuXch6AsGViv1Sd0Ag+C8za9YsKlWqxOrVq9m5cyfVqlW71F26IEyaNIlbbrmFXr16Far+tm3b6NChA8ePH+f222+nadOmnDlzhlmzZtGzZ08eeughXnnllaD9+vfvT7du3QLKkpKSAr67XC6mTZsWtG/Dhg0L7FejRo0YO3YsAOnp6WzZsoUvvviCqVOn8uCDD/Laa6/lu/+pU6do2rQpaWlpDBs2jFq1anHy5Ek2btzIlClTuPvuu6lduzaffPJJwH7jx48nJiaGxx9/PGzbzzzzDJUrVyYnJ4dVq1Yxc+ZMfv31VzZt2kRERESRzi0nJ4e1a9fyxhtvsHz5clavXl3g/qF44403Aiaz33//PZ999hmvv/46JUqUMMpbtWoVto2zHQugX5Obb7455MT7QvPqq68ybtw42rZty/jx44mKimLnzp389NNPzJkzhy5duhSqnQkTJrBgwYIL3NvCs379ejp06EDt2rV57bXXOHjwIK+++io7duzg//7v/4x6f/31F61bt6Z8+fI8/fTTqKrKe++9R9u2bVm9ejU1a9Y06g4aNIgvvviCYcOG0bRpU1atWsWTTz7J/v37+fDDD416L730Er/99ht9+vShQYMGHD16lHfeeYerrrqKVatWBQnjw4YNY9asWQwePJjRo0eTmZnJunXrSElJMepMmzaN6dOn07t3b+655x5SU1P54IMPaNGiBYsWLaJjx45G3bzjGWDfvn088cQTdO7cOaD8wIEDXHPNNQCMHDmSsmXLcvjw4aB7aeXKlbz11lvUqVOH2rVrhxTq/EyZMoW1a9dy9dVXc/LkybD1BIIrFk0gEFwQdu/erQHaV199pSUlJWkTJky41F26YERHR2tDhgwpVF23263Vq1dPi4qK0latWhWwzev1arfeeqsGaHPmzDHK9+zZowHaK6+8km/bQ4YM0aKjo4vcf03TtIoVK2rdu3cPKs/KytJ69eqlAdp7770XsA3QRo0aZXx/+eWXNUD77bffgtpJTU3VsrOzQx67bt26Wtu2bUNumzFjhgZoa9asCSh/5JFHNECbO3duQHnbtm21unXrFurcHnroIQ3Qtm/fbpQVdA3z+61feeUVDdD27NkTcnve63UuY6FRo0YaoM2bNy9gv6effloDtOPHj4c9Bz8VK1bUnn766QLr5W3T4/FocXFxWqdOnULWP3bsWFB/rWN36dKlAeewdu3agP0LO44LOlf/cb744ouQ20eNGqXlnQZ07dpVK126tJaammqUTZ06VQO0H374wSjr1q2bVqxYMe3EiRNG2eHDh7WYmBjt5ptvNspWr16tAdqTTz4ZcJyxY8dqkiRpGzZsMMp+++03LTc3N6De9u3bNZfLpQ0cODCgfO7cucbzNT/+/PNPLT09PaDsxIkTWlJSknbNNdfku6+madqzzz4b8p7u2rWrVrly5YDzD8XJkye1tLQ0TdMKvj/279+vKYqiaVr+zwSB4EpFmIcJBBeIWbNmUaxYMbp3784tt9zCrFmzQtY7c+YMDz74IJUqVcLlclGuXDkGDx4cYPKRk5PDhAkTqFGjBhEREZQuXZqbb76ZXbt2GXUyMzMZO3Ys5cuXx+VyUbNmTV599VU0TTPq+E1V/OY6ViRJCrDv95ue7Ny5k6FDh5KQkEB8fDy33347WVlZAftlZmbyv//9zzCl8JsPhWLevHls2rSJRx99NMhszmaz8cEHH5CQkHDZ+BpERkbyySefULx4cZ5//vmA65mXXbt2YbPZAkzW/MTFxRVKI1JY2rRpYxzzbClVqhQAdvulUbqfy1jo168fNWrU4Jlnnsn3N7kQnDhxgrS0NGOlPS/JycmFaufee++lWLFil81YT0tLY/HixQwaNIi4uDijfPDgwcTExPD5558bZStWrKBjx44kJiYaZaVLl6Zt27YsXLjQ0FisWLEC0H8vK/369UPTNObOnWuUtWrVCqfTGVCvevXq1K1bly1btgSUv/baazRr1oybbroJVVXJzMwMeU5NmjQJMrVLTEykTZs2QW2GYvbs2VSuXDlAW7h161b+7//+j3HjxpGYmEhOTg4ejyfk/sWLFyc2NrbA4wCUL18eWRbTMoEgHOLuEAguELNmzeLmm2/G6XTSv39/duzYwZo1awLqZGRk0KZNG95++206d+7Mm2++yciRI9m6dSsHDx4EQFEUevTowcSJE2nSpAmTJ0/m/vvvJzU1lU2bNgGgaRo33HADr7/+Ol26dOG1116jZs2ajBs3jjFjxpzTefTt25f09HReeOEF+vbty8yZM5k4caKx/ZNPPsHlctGmTRs++eQTPvnkE+66666w7flNYQYPHhxye3x8PDfeeCNbt25l586dAduysrI4ceJEwF+oyULeOqmpqWdz6gYxMTHcdNNNHDp0iM2bN4etV7FiRRRFCTL/uhD47eKLFStWqPoej8e4HgcPHmTBggW89tprXHvttVSuXPkC9jQ85zIWbDYbTzzxBBs2bODrr7++4H21kpycTGRkJAsWLAjyCSoKcXFxPPjggyxYsIC//vrrPPbw7Pj777/xer00bdo0oNzpdNKoUSPWrVtnlOXm5hIZGRnURlRUFG6323g25ebmAgTVjYqKAgjp02NF0zSOHTsWYG6YlpbG6tWrufrqq3nssceIj48nJiaGKlWqBAhW+XH06NGANkOxbt06tmzZwoABAwLKf/rpJwBKlixJhw4diIyMJDIykq5du4b1VxEIBOeOEFoEggvA2rVr2bp1q7G62Lp1a8qVKxekbXnllVfYtGkTX3zxBR9++CEjR47kiSeeYPXq1YYPxscff8ySJUt47bXX+Oyzzxg
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAzoAAAF2CAYAAACmtO2KAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAexJJREFUeJzt3Xd4FOXax/HvbnohoaRD6L0FBCkKAkqVqiiKBUSRg4qCqMcu6lHx6BFU7K8IiigIKqAoiiiigiK9d5CWRktCIG133j/WLFmTQAIJM0l+n+vaa3dnn529d+7dZO6dZ57HZhiGgYiIiIiISDliNzsAERERERGRkqZCR0REREREyh0VOiIiIiIiUu6o0BERERERkXJHhY6IiIiIiJQ7KnRERERERKTcUaEjIiIiIiLljgodEREREREpd1ToiIiIiIhIuaNCR0REyoTp06djs9nMDkNERMoIFToiwltvvYXNZqN9+/Zmh1KqXnjhBebNm1ektgcOHOCZZ56hXbt2VKlShbCwMLp27coPP/xQYPsTJ04watQowsPDCQoKolu3bqxZs6bAtgsWLOCSSy7B39+fmjVrMmHCBHJycjzaxMfH88gjj9CtWzcqVaqEzWZj6dKlhb6vDh06EB4ejr+/Pw0aNGDcuHEkJyfna+t0OnnppZeoU6cO/v7+tGzZkk8//bTA9X722Wd06NCBypUrU61aNbp06cLChQvztXv++ecZMGAAkZGR2Gw2nn766QLXB/DDDz/QrVs3wsLCqFy5Mu3atWPGjBmFtj9fNpuNMWPGeCxLTk5m7NixNG7cmICAACIiImjXrh0PP/wwJ0+edLe77bbbCA4O9nhu165dsdls9O/fP99r7du3D5vNxv/+978ixZaZmcmUKVPo1KkTVapUwdfXl5iYGAYMGMCnn36Kw+HIt+68l5CQEFq1asUbb7zh0TbX1q1b6d27N8HBwVStWpVbb731gj4Lue899+Lr60udOnUYNWoUBw4c8GibW4yuWrXKvezpp5/GZrNx5MiRArdH7dq16devn8eyvK9nt9uJiYmhZ8+eHt+BLVu24Ovry4gRI/Kt88SJE0RHR9O+fXucTqdHHHnXGx0dTb9+/fj99989nl+c739xvqsicnGp0BERZs6cSe3atVm5ciW7du0yO5xSU5xCZ/78+fz3v/+lfv36PPfcczz55JOkpaXRo0cPpk2b5tHW6XTSt29fPvnkE8aMGcNLL71EUlISXbt2ZefOnR5tv/32WwYNGkTlypWZMmUKgwYN4rnnnuPee+/1aLd9+3b++9//cujQIVq0aHHWWFevXk2rVq14/PHHefPNNxk4cCDTpk3jsssuIz093aPt448/zsMPP0yPHj2YMmUKNWvW5KabbmLWrFke7aZMmcINN9xAWFgYL774Ik8++SQpKSn069ePL774wqPtE088wZ9//knr1q3PGueCBQvo2bMnWVlZPP300zz//PMEBAQwbNgwJk+efNbnXqhjx47Rtm1bPvroI/r27cvrr7/O+PHjqV+/Pm+//XahO+H/9PXXX7N69erzjiM5OZnLL7+c++67j+DgYJ544gneffdd7r33XtLT07npppt44YUX8j1v6NChzJgxgxkzZjBx4kSqV6/OvffeyyOPPOLR7uDBg1xxxRXs2rWLF154gQcffJCFCxfSo0cPsrKyPNoW9bMAUKNGDffrv/POOwwePJhPPvmETp06cerUqfPeHmfTo0cPZsyYwYcffsjo0aPZsGEDV155Jd9++y0ATZs25aGHHmL69On8/PPPHs995JFHSE5O5t1338Vu99zVefvtt5kxYwbTp09nzJgxbNq0iSuuuIJ169a52xTn+1+c76qIXGSGiFRoe/bsMQDjiy++MMLDw42nn37a7JBKTVBQkDF8+PAitd20aZORnJzssSwjI8No3LixUaNGDY/ls2fPNgBjzpw57mVJSUlG5cqVjaFDh3q0bdq0qREXF2dkZ2e7lz3++OOGzWYztm7d6l6WmppqHD161DAMw5gzZ44BGD/99FORYjcMw5g7d64BGJ9++ql72cGDBw0fHx/jnnvucS9zOp1G586djRo1ahg5OTnu5Q0aNDAuvfRSw+l0upelpKQYwcHBxoABAzxea+/evYZhGEZycrIBGBMmTCgwph49ehgxMTFGRkaGe1l2drZRr149o2XLlud8T9OmTTOK+m8L8HifL730kgEYv/32W762KSkpxunTp933hw8fbgQFBXm06dKli1GzZk2jSpUqRv/+/T0e27t3rwEYL7/88jnj6tWrl2G3243PP/+8wMf//PNP4+OPPz7nup1Op3HppZcaMTExHsvvuusuIyAgwPjrr7/cyxYvXmwAxrvvvuteVpzPQpcuXYxmzZrli/WNN94wAOP77793L8vN0Z9//uleNmHCBAPI933KVatWLaNv374ey/6ZP8MwjA0bNhiA0bNnT/ey06dPG/Xq1TMaNWpkZGZmGoZhGMuXLzdsNpsxfvx4j+cXFsemTZsMwHjsscc8lhX1+3+h31URKT06oiNSwc2cOZMqVarQt29frrvuOmbOnFlguxMnTnD//fdTu3Zt/Pz8qFGjBsOGDfP4JTwjI4Onn36ahg0b4u/vT3R0NNdeey27d+92t0lPT+eBBx4gNjYWPz8/GjVqxP/+9z8Mw3C3ye2uM3369Hxx/LNrVG53lF27dnHbbbdRuXJlQkNDGTFihMcvzTabjfT0dD788EN315Xbbrut0O3SrFkzwsLCPJb5+flx9dVXc/DgQdLS0tzL586dS2RkJNdee617WXh4OEOGDGH+/PlkZmYCrq42W7ZsYdSoUXh7e7vb3n333RiGwdy5c93LKlWqRNWqVQuN71xq164NuPKWa/78+WRnZ3P33Xe7l9lsNu666y4OHjzIihUr3MtTU1OJiIjwOCcmJCSE4OBgAgICCnytc0lNTaVKlSr4+fm5l3l7exMWFpZvnSVt9+7deHl50aFDh3yPhYSE4O/vf851VKpUifvvv5+vvvqq0G6JZ7NixQq+++47Ro0a5fFZyatt27bcfPPN51yXzWYjMjLS43ME8Pnnn9OvXz9q1qzpXta9e3caNmzIZ5995l5WnM9CYaKiogDyxVBaWrRoQVhYGHv37nUv8/f35+2332b79u1MnDiR7OxsRo0aRWxsLM8++2yR1lvQ+yjO9/9Cv6siUnpU6IhUcDNnzuTaa6/F19eXoUOHsnPnTv7880+PNidPnqRz585MmTKFnj178tprrzF69Gi2bdvGwYMHAXA4HPTr149nnnmGNm3a8MorrzB27FhSUlLYtGkTAIZhMGDAACZPnkzv3r2ZNGkSjRo14qGHHmL8+PEX9D6GDBlCWloaEydOZMiQIUyfPp1nnnnG/fiMGTPw8/Ojc+fO7i44//rXv4r9OgkJCQQGBhIYGOhetnbtWi655JJ8XWTatWvHqVOn2LFjh7sduHZm84qJiaFGjRrux8+HYRgcOXKEhIQEfvnlF+677z68vLzo2rWrR5xBQUE0adIkX5x54wPXeRmLFi1iypQp7Nu3j23btnHPPfeQkpLC2LFjzyvGrl27snnzZp588kl27drF7t27+c9//sOqVav497//fV7rLKpatWrhcDgu+HygsWPHUqVKlbOeh1SYr776CoBbbrml2M89deoUR44c4ciRI+zZs4c333yTRYsWMXz4cHebQ4cOkZSUlO/zBa4c581vcT4L4Pp+575+fHw8P/74IxMmTKB+/fpcfvnlRXoPx44dc68j7yX3HJpzOX78OMePH6datWoey3v06MHQoUOZOHGiuyvalClTCAoKOmscSUlJrF27ljvvvBN/f3+GDBlyzhgK+v6LiIWZe0BJRMy0atUqAzAWL15sGIar60qNGjWMsWPHerR76qmn3N3b/im3a9MHH3xgAMakSZMKbTNv3jwDMJ577jmPx6+77jrDZrMZu3btMgzjTHedadOm5VsX/+galdsd5fbbb/dod8011xjVqlXzWFacrmsF2blzp+Hv72/ceuut+db7z9c3DMNYuHChARiLFi0yDMMwXn7
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAzoAAAF2CAYAAACmtO2KAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3Xd8FMX7wPHP7pUEEpJQEnqVKiBVBERRmiCgqDQBAQX96hesyE+xd6woNmwURRAFBbF8FUQpUgSRqoJ0VEpoSQgpd7s7vz/ubu8udxcIVeF5v155eTc7Ozd7t8R7MjPPaEophRBCCCGEEEKcRfQz3QEhhBBCCCGEONkk0BFCCCGEEEKcdSTQEUIIIYQQQpx1JNARQgghhBBCnHUk0BFCCCGEEEKcdSTQEUIIIYQQQpx1JNARQgghhBBCnHUk0BFCCCGEEEKcdSTQEUIIIYQQQpx1JNARQgghjlG1atV47LHHznQ3hBBCHAMJdIT4h3nzzTfRNI2LLrroTHfllHrmmWeYNWtWkc45cOAAI0eOpE6dOsTHx1OqVCmuuOIKvvzyy4i627dvR9O0qD8tW7a06w0ePDhmvW+++abQ/lSrVs2uq+s6KSkpNGzYkFtuuYWffvop6jmapjF8+PCwsn379nHnnXdSt25dihUrRlpaGi1atOC+++4jOzub+fPnx+xjwR+ASZMmhZU5nU4qVqzI4MGD+fvvvyP6dNlll9GgQYOY16ZpGvHx8dSqVYuRI0dy8ODBsLqDBw8mMTEx5vuUmJjI4MGDo7Yb62fSpEkx3y84/nvh008/jTj+2GOPoWka+/fvj3kNRRWrzS+++IK2bduSlpZG8eLFqVGjBr179w671wL9ffHFF+2y0Htg5cqVEa93tM/gaP0q+DozZsyIenz48OH2fRZqyZIltGnThuLFi1OuXDnuuOMOsrOzI+qtXLmSzp07k5SURIkSJejUqROrV6+OqOf1enn88cepUaMGcXFx1KhRg6eeegrDMMLqrVixguHDh1O/fn0SEhKoUqUKvXv35o8//ojaf8uyGDduHI0bN6ZYsWKULl2adu3asWbNGrvOrl27GDBgAHXq1KFEiRKkpKTQokUL3n//fZRSEW3+/fff9O7dm5SUFJKSkrj66qvZunVrRL1Y9/qzzz4bUXfatGk0bdqU+Ph4UlNTGTJkSNTPbO/evdx4442kpaVRrFgxmjZtyvTp06NeuxDnIueZ7oAQItyUKVOoVq0ay5cvZ/PmzdSsWfNMd+mUeOaZZ+jZsyc9evQ4pvobN26kffv27Nu3jxtvvJHmzZuTkZHBlClT6N69O/feey8vvPBCxHnXX389V155ZVhZampq2PO4uDjee++9iHMbNWp01H41btyYESNGAHD48GF+//13pk+fzrvvvsvdd9/NmDFjCj3/4MGDNG/enKysLG666Sbq1q3LgQMHWLt2LePGjeO2226jXr16TJ48Oey8UaNGkZiYyIMPPhiz7SeeeILq1auTl5fHsmXLmDRpEj/++CPr168nPj6+SNeWl5fHypUreeWVV1iwYAHLly8/6vnRvPLKK2FfgL/++ms++ugjXn75ZcqUKWOXt27dOmYbx3svgO89ufbaa6N+WT/VXnzxRUaOHEnbtm0ZNWoUxYsXZ/PmzXz33XdMmzaNzp07H1M7jz32GF988cUp7u2xW716Ne3bt6devXqMGTOGv/76ixdffJFNmzbxv//9z673yy+/0KZNGypXrsyjjz6KZVm8+eabtG3bluXLl1OnTh277oABA5g+fTo33XQTzZs3Z9myZTz88MPs3LmTd955x6733HPPsXjxYnr16sUFF1zAnj17eP3112natCnLli2LCOBvuukmpkyZwsCBAxk+fDhHjhxh1apVpKen23X279/PX3/9Rc+ePalSpQper5e5c+cyePBgNm7cyDPPPGPXzc7O5vLLLyczM5MHHngAl8vFyy+/TNu2bVm9ejWlS5cOe/2OHTsycODAsLImTZqEPR83bhz//e9/ad++vf1+jh07lp9//pmffvrJ/reblZVFmzZt2Lt3L3feeSflypXjk08+oXfv3kyZMoV+/foV9aMU4uyjhBD/GFu3blWA+uyzz1Rqaqp67LHHznSXTpmEhAQ1aNCgY6rr8XhUgwYNVPHixdWyZcvCjhmGofr06aMANW3aNLt827ZtClAvvPBCoW0PGjRIJSQkFLn/SilVtWpV1bVr14jynJwc1aNHDwWoN998M+wYoIYNG2Y/f/755xWgFi9eHNFOZmamys3Njfra9evXV23bto16bOLEiQpQK1asCCu/7777FKA+/vjjsPK2bduq+vXrH9O13XvvvQpQf/zxh112tPewsM/6hRdeUIDatm1b1OMF368TuRcaN26sAPXpp5+Gnffoo48qQO3bty/mNQRUrVpVPfroo0etV7BNr9erkpKSVMeOHaPW37t3b0R/Q+/dH374IewaVq5cGXb+sd7HR7vWwOtMnz496vFhw4apgl8dunTposqXL68yMzPtsnfffVcB6ttvv7XLrrzySlWyZEm1f/9+u2zXrl0qMTFRXXvttXbZ8uXLFaAefvjhsNcZMWKE0jRNrVmzxi5bvHixys/PD6v3xx9/qLi4ONW/f/+w8o8//tj+/Xo8unXrphISEpRhGHbZc889pwC1fPlyu+z3339XDodDjRo1Kuz8gvdyNPn5+SolJUVdeumlyrIsu/yLL75QgHr11VftssDvjnnz5tllpmmqCy+8UJUrVy7ifRHiXCRT14T4B5kyZQolS5aka9eu9OzZkylTpkStl5GRwd133021atWIi4ujUqVKDBw4MGxqQ15eHo899hi1a9cmPj6e8uXLc+2117Jlyxa7zpEjRxgxYgSVK1cmLi6OOnXq8OKLL4ZNzwhMowlMJQqlaVrYeoXAtJjNmzczePBgUlJSSE5O5sYbbyQnJyfsvCNHjvD+++/b0zcCU5ui+fTTT1m/fj33339/xJQ+h8PB22+/TUpKyj9m7USxYsWYPHkypUqV4umnn4463SVgy5YtOByOsOl0AUlJScc08nKsLrnkEvs1j1e5cuUAcDrPzISAE7kX+vbtS+3atXniiScK/UxOhf3795OVlcXFF18c9XhaWtoxtXP77bdTsmTJf8y9npWVxdy5cxkwYABJSUl2+cCBA0lMTOSTTz6xyxYtWkSHDh3CRjnKly9P27Zt+fLLL+2RvkWLFgG+zytU3759UUrx8ccf22WtW7fG7XaH1atVqxb169fn999/DysfM2YMLVq04JprrsGyLI4cOVKka61WrRo5OTl4PB67bMaMGVx44YVceOGFdlndunVp37592LWHys3NJS8vL+qx9evXk5GRQZ8+fcJGHbt160ZiYiLTpk2zyxYtWkRqairt2rWzy3Rdp3fv3uzZs4cFCxYU6fqEOBtJoCPEP8iUKVO49tprcbvdXH/99WzatIkVK1aE1cnOzuaSSy7htddeo1OnTowdO5Zbb72VDRs28NdffwFgmibdunXj8ccfp1mzZrz00kvceeedZGZmsn79egCUUlx11VW8/PLLdO7cmTFjxlCnTh1GjhzJPffcc0LX0bt3bw4fPszo0aPp3bs3kyZN4vHHH7ePT548mbi4OC655BImT57M5MmT+c9//hOzvcA0nYJTPgKSk5O5+uqr2bBhA5s3bw47lpOTw/79+8N+vF5vRBsF62RmZh7PpdsSExO55ppr+Pvvv/ntt99i1qtatSqmaUZMTTsVtm/fDkDJkiWPqb7X67Xfj7/++osvvviCMWPGcOmll1K9evVT2NPYTuRecDgcPPTQQ6xZs4aZM2ee8r6GCqyh+OKLLyLWOBVFUlISd999N1988QW//PLLSezh8Vm3bh2GYdC8efOwcrfbTePGjVm1apVdlp+fT7FixSLaKF68OB6Px/7dlJ+fDxBRt3jx4gBR1yiFUkqxd+/esKmQWVlZLF++nAsvvJAHHniA5ORkEhMTqVGjRqEByf79+9m+fTvvv/8+EydOpFWrVna/LMti7dq1EdcO0KJFC7Zs2cLhw4fDyidNmkR
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAzoAAAF2CAYAAACmtO2KAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAivxJREFUeJzt3Xd8U+XbBvDrJGnTvZu20LKhLJkqFGUpewiKqAiCCqKvoCCKP3EBoqAiIgoKypIlCgo4kSEICqLsWfammzbdK+d5/0ibNrRpk5LTpO31/ZBPk5PnnPPk7knI3WdJQggBIiIiIiKiakTl6AoQERERERHZGxMdIiIiIiKqdpjoEBERERFRtcNEh4iIiIiIqh0mOkREREREVO0w0SEiIiIiomqHiQ4REREREVU7THSIiIiIiKjaYaJDRERERETVDhMdIiKqknbu3AlJknDp0iVHV4WIiJwQEx0iKuHzzz+HJEno0KGDo6uiqJkzZ2Ljxo1Wlb169SqmT5+Ou+++G/7+/ggKCkK3bt2wbdu2UsunpKRg7NixCA4OhqenJ7p3746DBw+WWvbHH39Eu3bt4Obmhjp16mDq1KnIz883KxMTE4PXXnsN3bt3h7e3NyRJws6dOy2+ro4dOyI4OBhubm5o3LgxJk6ciISEhBJlZVnGhx9+iPr168PNzQ2tWrXCN998U6KcJEkWbz179jSVi46Oxquvvoo2bdrA29sbYWFh6N+/P/bv31/imD/88AMeffRRNGjQAB4eHoiMjMTLL7+MlJSUUl/X7ahXrx4GDBhgti09PR1Tp05Fy5Yt4enpicDAQLRp0wYTJkzAjRs3TOWmTZsGSZKQmJho2vbkk09CkiS0atUKQogS55MkCePHj7eqbrIsY8WKFejZsyeCgoLg4uICnU6HXr164csvv0ROTk6JYxe/eXp6onnz5nj33XeRmZlZ4vjXr1/HI488Aj8/P/j4+GDQoEG4cOFCqXVZsmQJmjVrZrpuPvvssxJlCl974U2j0SAiIgKPPfYYTp48aVa2MBldv369advy5cshSVKp1wQAdOvWDS1btjTbVq9ePbNz6nQ6dO7cGRs2bCh3XwDYs2cP7r33Xnh4eCA0NBQvvvgi0tPTzcqcOHECQ4cONV2PQUFB6NKlC3766adyY1B4a9q0aamviYgcQ+PoChCR81m9ejXq1auHf//9F+fOnUOjRo0cXSVFzJw5Ew8//DAGDx5cbtlNmzbhgw8+wODBgzFq1Cjk5+ebvpwuXboUTz31lKmsLMvo378/jhw5gsmTJyMoKAiff/45unXrhgMHDqBx48amsr/99hsGDx6Mbt264bPPPsOxY8fw7rvvIj4+Hl988YWp3OnTp/HBBx+gcePGuOOOO7B3716LdT1w4ADatGmDxx57DN7e3jh16hS++uor/PLLLzh8+DA8PT1NZd944w28//77eOaZZ3DXXXdh06ZNePzxxyFJEh577DFTuZUrV5Y4z/79+zFv3jz06tXLtG3x4sVYsmQJhgwZgueffx56vR6LFi1Cx44dsXnzZvTo0cNUduzYsahVqxZGjBiBOnXq4NixY5g/fz5+/fVXHDx4EO7u7uX+XioqLy8PXbp0QXR0NEaNGoUXXngB6enpOHHiBNasWYMHH3wQtWrVKvc4x44dww8//IAhQ4ZUqB5ZWVl48MEH8fvvv6NTp0545ZVXEBISgps3b+LPP//E888/j3379mHJkiVm+/Xs2RMjR44EYEzYdu/ejbfeegtHjhzBunXrTOXS09PRvXt36PV6vP7663BxccHcuXPRtWtXHD58GIGBgaayixYtwnPPPYchQ4Zg0qRJ2L17N1588UVkZmbif//7n9n5tVotFi9eDADIz8/H+fPnsXDhQmzevBknT560Kna2atOmDV5++WUAwI0bN7Bo0SI89NBD+OKLL/Dcc89Z3O/w4cO4//770axZM3z88ce4du0aPvroI5w9exa//fabqdzly5eRlpaGUaNGoVatWsjMzMT333+PBx54AIsWLcLYsWMtxqCQr6+vHV8xEd02QURUzIULFwQA8cMPP4jg4GAxbdo0R1dJMZ6enmLUqFFWlT1+/LhISEgw25adnS2aNm0qwsPDzbZ/++23AoBYt26daVt8fLzw8/MTw4YNMyvbvHlz0bp1a5GXl2fa9sYbbwhJksSpU6dM21JTU0VSUpIQQoh169YJAGLHjh1W1V0IIdavXy8AiG+++ca07dq1a8LFxUWMGzfOtE2WZdG5c2cRHh4u8vPzyzzm6NGjhSRJ4urVq6Zt+/fvF2lpaWblEhMTRXBwsLjnnnvMtpdW/6+//loAEF999VW5r2nHjh0CgLh48WK5ZevWrSv69+9vevzdd98JAGL16tUlymZlZQm9Xm96PHXqVAHA7Pc/atQo4e7uLpo0aSJatWolZFk2OwYAs7ha8uyzzwoA4pNPPin1+TNnzogFCxZYdeyHH35YqFQqkZWVZdr2wQcfCADi33//NW07deqUUKvVYsqUKaZtmZmZIjAw0CxGQggxfPhw4enpKW7evGn22j09PUuc/+effxYAxJdffmnaVvg7Kv5eWLZsmQAg/vvvv1Jfc9euXUWLFi3Mtt36+xNCiJiYGOHp6SmaNGlS5r59+/YVYWFhZr/Tr776SgAQv//+e6l1KJSfny9at24tIiMjzbZbigERORd2XSMiM6tXr4a/vz/69++Phx9+GKtXry61XEpKCl566SXUq1cPWq0W4eHhGDlypFn3nuzsbEybNg1NmjSBm5sbwsLC8NBDD+H8+fOmMhkZGXj55ZcREREBrVaLyMhIfPTRR2bdgS5dugRJkrB8+fIS9ZAkCdOmTTM9LuxmdO7cOTz55JPw8/ODr68vnnrqKbNuPZIkISMjA19//bWp28mTTz5pMS4tWrRAUFCQ2TatVot+/frh2rVrSEtLM21fv349QkJC8NBDD5m2BQcH45FHHsGmTZtMXZFOnjyJkydPYuzYsdBoihrYn3/+eQghzLr7eHt7IyAgwGL9ylOvXj0AMOsWtmnTJuTl5eH55583bZMkCf/3f/+Ha9euldlqlJOTg++//x5du3ZFeHi4aXv79u3h5eVlVjYwMBCdO3fGqVOnzLZ369atxHEffPBBAChR1t4Kr8F77rmnxHNubm7w8fEp9xgqlQpvvvkmjh49WqILlTWuXr2KxYsXo0+fPpgwYUKpZRo3bmz2+ylLaGioqStZofXr1+Ouu+7CXXfdZdrWtGlT3H///fjuu+9M23bs2IGkpKQS5xo3bhwyMjLwyy+/WHV+AGbnV1JoaCiaNWuGixcvWiyTmpqKrVu3YsSIEWa/05EjR8LLy8ssBqVRq9WIiIiw2J3SYDAgNTW1QvUnIuUx0SEiM6tXr8ZDDz0EV1dXDBs2DGfPnsV///1nViY9PR2dO3fGZ599hl69emHevHl47rnnEB0djWvXrgEwfgEYMGAApk+fjvbt22POnDmYMGEC9Ho9jh8/DgAQQuCBBx7A3Llz0adPH3z88ceIjIzE5MmTMWnSpNt6HY888gjS0tIwa9YsPPLII1i+fDmmT59uen7lypXQarXo3LkzVq5ciZUrV+LZZ5+1+TyxsbHw8PCAh4eHaduhQ4fQrl07qFTmH7F33303MjMzcebMGVM5ALjzzjvNytWqVQvh4eGm5ytCCIHExETExsaauiCp1Wqz5OLQoUPw9PREs2bNStSzeP1K8+uvvyIlJQXDhw+3qj6xsbElEkVL5QBYVfZ21K1bFwCwYsWKUsfYWOvxxx9H48aN8c4779h8nN9++w0GgwEjRoyw+bzZ2dlITExEYmIiLl++jDVr1uDrr7/G448/bko0ZFnG0aNHS1xfgPF3fP78eVOCbulabN++PVQqVanXQuH54+LisHfvXrz00ksIDAwsMRbKEr1ebzpG8VteXp5V++fl5eHq1atm3e9udezYMeTn55d4Xa6urmjTpk2prysjIwOJiYk4f/485s6di99++w33339/iXKZmZnw8fGBr68vAgICMG7cuBLjfojIsThGh4hMDhw4gOjoaNMA5HvvvRf
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAy0AAAF2CAYAAABjxncbAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAoztJREFUeJzs3Xd4U9UbwPHvTdKmk+5BoUDZGxkyBGUIyFSUoWwExAEo4MTBUH9uVFRANoggiIjgQhFBxMGUJbLasqEFCm3pzLi/P26bJl20QJuO9/M8eZJ778nNyWna5r3nnPcoqqqqCCGEEEIIIUQJpXN2BYQQQgghhBAiPxK0CCGEEEIIIUo0CVqEEEIIIYQQJZoELUIIIYQQQogSTYIWIYQQQgghRIkmQYsQQgghhBCiRJOgRQghhBBCCFGiSdAihBBCCCGEKNEkaBFCCCGEEEKUaBK0CCGEKDbTpk2jWrVqzq6GEEKIUkaCFiHKiNmzZ6MoCq1atXJ2VYrUG2+8wTfffFOgsqdPn2b69Om0bNkSPz8/AgMD6dChA7/88kuu5a9evcqYMWMICgrC09OTjh07smfPnlzLrl+/nmbNmuHm5kaVKlWYOnUqZrP5ps6ZmJjIc889R0REBEajkUqVKtGvXz+Sk5PzfI+PPPIIiqLQq1cvh/2XL1/m3Xff5a677iIoKAhfX19at27NqlWrcpzj2rVrTJ06lW7duuHv74+iKCxZsiTX11MUJc9bly5d8qxnYZ04cQJFUXjvvfdy7H/44YepUaMGbm5uhIaGctdddzF16lSHch06dKBhw4YO+6pVq4aiKIwfPz7H623ZsgVFUfjqq68KVC9FUXj99ddzLTN48GAURcHLyyvP87Rs2RJFUZgzZ06ux5csWeLQtm5ubtSuXZtx48YRExOTo9653R566CGH9rA/5u7uTuPGjfnwww+xWq15vsfcbm+99VaO+q5du5bu3bsTGBiIq6srYWFhDBgwgF9//TVH2djYWF544QUaNWqEl5cXbm5u1KxZk4cffpht27blKJ+Wlsbzzz9PWFgY7u7utGrVio0bN+babn/++Sft2rXDw8OD0NBQnnzySa5du3bD5/z5558ZNWoUDRs2RK/XS8AthBMZnF0BIcStsXz5cqpVq8aOHTs4fvw4NWvWdHaVisQbb7xBv3796NOnz3XLrlu3jrfffps+ffowfPhwzGYzn332GV26dGHRokU8/PDDtrJWq5WePXuyb98+nn32WQIDA5k9ezYdOnRg9+7d1KpVy1b2xx9/pE+fPnTo0IGPP/6YAwcO8PrrrxMbG+vwJbQw54yPj6d9+/acOXOGMWPGULNmTS5evMjvv/9OWloaHh4eOd7frl27WLJkCW5ubjmO/fXXX7z00kv06NGDl19+GYPBwJo1a3jooYc4dOgQ06dPt5W9dOkSr776KlWqVKFJkyZs2bIlzzZdtmxZrvWYOXMmXbt2zfuHcQscP36c22+/HXd3d0aOHEm1atU4f/48e/bs4e2333Z4T/mZP38+kydPJiws7Ibr4ubmxhdffMHLL7/ssD8pKYl169bl+jPJdOzYMXbu3Em1atVYvnw5jz/+eJ5lX331VSIiIkhNTWXbtm3MmTOHH374gYMHDzp8Jp588kluv/12h+dm/4JduXJl3nzzTUD7ma9YsYKJEydy8eJF/ve//+V47YEDB9KjR48c+5s2bWp7rKoqI0eOZMmSJTRt2pRJkyYRGhrK+fPnWbt2LXfffTd//PEHd9xxBwA7duygZ8+eJCYm8tBDD/HYY49hNBqJjo7mm2++YcmSJfz222/cddddttcYMWIEX331FRMmTKBWrVosWbKEHj16sHnzZtq1a2crt3fvXu6++27q1avH+++/z5kzZ3jvvfc4duwYP/74o8N7KOg5V6xYwapVq2jWrNlNfV6EELeAKoQo9aKiolRA/frrr9WgoCB12rRpzq5SkfH09FSHDx9eoLIHDx5UL1686LAvNTVVrVu3rlq5cmWH/atWrVIBdfXq1bZ9sbGxqq+vrzpw4ECHsvXr11ebNGmimkwm276XXnpJVRRF/e+//27onI8//rjq6+urRkVFFei9Wa1WtU2bNurIkSPVqlWrqj179nQ4HhUVpZ44cSLHczp16qQajUb12rVrDm1y/vx5VVVVdefOnSqgLl68uED1UFVVHTVqlKooinr69Onrlp06dapatWrV65aLjo5WAfXdd9+17XviiSdUg8GQ432pqqrGxMQ4bLdv315t0KCBw76qVauqDRo0UA0Ggzp+/HiHY5s3b87xs8qvXg888IAKqHv37nU4vnz5ctXFxUXt3bu36unpmes5pkyZogYHB6tr1qxRFUVRo6Ojc5RZvHixCqg7d+502D9p0iQVUFesWFGoeufWHikpKWrVqlVVb29v1Ww253iP9m2fl3fffVcF1AkTJqhWqzXH8c8++0zdvn27qqqqGhcXp1asWFENDQ11+D3JZLVa1RUrVqg7duyw7du+fXuOuqSkpKg1atRQ27Rp4/D87t27qxUrVlTj4+Nt++bPn68C6k8//XRD5zx79qyanp6uqqqq9uzZs0CfXSFE0ZDhYUKUAcuXL8fPz4+ePXvSr18/li9fnmu5q1evMnHiRKpVq4bRaKRy5coMGzaMS5cu2cqkpqYybdo0ateujZubGxUrVuSBBx4gMjLSViYpKYmnn36a8PBwjEYjderU4b333kNVVVuZzCEmuQ0zUhSFadOm2banTZuGoigcP36cESNG4Ovri4+PDw8//LDD0ChFUUhKSmLp0qW2oSojRozIs10aNGhAYGCgwz6j0UiPHj04c+YMiYmJtv1fffUVISEhPPDAA7Z9QUFBDBgwgHXr1pGWlgbAoUOHOHToEGPGjMFgyOqsfuKJJ1BV1WF4UUHPefXqVRYvXsyYMWOIiIggPT3ddiwvy5Yt4+DBg7leIQeIiIigatWqDvsURaFPnz6kpaURFRXl0CahoaH5vl5e0tLSWLNmDe3bt6dy5co3dI6CioyMpHLlyjneF0BwcHCBzlGtWjWGDRvG/PnzOXfu3A3XpU2bNkRERLBixQqH/cuXL7cNs8vLihUr6NevH7169cLHxyfHOfLTqVMnAKKjo2+s4nbc3Ny4/fbbSUxMJDY2ttDPT0lJ4c0336Ru3bq89957KIqSo8zQoUNp2bIlAJ9++innz5/nww8/pG7dujnKKorCwIEDHXqMvvrqK/R6PWPGjHGo96hRo/jrr784ffo0AAkJCWzcuJEhQ4ZQoUIFW9lhw4bh5eXFl19+WehzAoSFheHi4lLothFC3HoStAhRBixfvpwHHngAV1dXBg4caBt+Yu/atWvceeedfPzxx3Tt2pWZM2fy2GOPcfjwYc6cOQOAxWKhV69eTJ8+nebNmzNjxgyeeuop4uPjOXjwIKANB7n33nv54IMP6NatG++//z516tTh2WefZdKkSTf1PgYMGEBiYiJvvvkmAwYMYMmSJQ5DfpYtW4bRaOTOO+9k2bJlLFu2jEcffbTQr3PhwgU8PDwchtf8888/NGvWDJ3O8c9iy5YtSU5O5ujRo7ZyAC1atHAoFxYWRuXKlW3HC3PObdu2kZqaSs2aNenXrx8eHh64u7vTtm1b9u7dm6P+iYmJPP/887z44ouFDjYuXLgAkCOYu1E//PADV69eZfDgwbfkfPmpWrUqp0+fznWeRGG89NJLmM3mXOdmFMbAgQNZuXKlLVi/dOkSP//8M4MGDcrzOdu3b+f48eMMHDgQV1dXHnjggTwvMuQm8+JBQECAw/7ExEQuXbrkcMs+VyU3mRcXfH19cxxLTk7Occ5Lly7Z5m5t27aNuLg4Bg0ahF6vv+5rffvtt7i7uzsE8dfzzz//ULt2bYdABLAFQpm/HwcOHMBsNuf4vXR1deW2227L8XtZkHMKIUoWCVqEKOV2797N4cOHbZNu27VrR+XKlXN8EXr33Xc5ePAgq1evZt68eTz22GO8/PLL7NixgyZNmgDw2WefsWnTJt5//32++OILxo4dywsvvMCmTZu49957AW0C+q+//sprr73G/Pn
"text/plain": [
"<Figure size 1000x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"for acc, isin in worst_series.index:\n",
" plot_account_series(acc, isin)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3afac335-0bb1-4f79-bcea-9fe19093ca7d",
"metadata": {},
"outputs": [],
"source": []
}
],
"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.13.11"
}
},
"nbformat": 4,
"nbformat_minor": 5
}