6777 lines
762 KiB
Plaintext
6777 lines
762 KiB
Plaintext
|
|
{
|
|||
|
|
"cells": [
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 1,
|
|||
|
|
"id": "2ef771e3-f905-4c82-97ab-7f879551824c",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"# MEETING 11 MARS\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 2,
|
|||
|
|
"id": "f645c749-321e-46c4-ae5e-0ba2c1967f81",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"Requirement already satisfied: networkx in /opt/python/lib/python3.13/site-packages (3.6.1)\n",
|
|||
|
|
"Note: you may need to restart the kernel to use updated packages.\n"
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"pip install networkx"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 3,
|
|||
|
|
"id": "38108d9e-a00c-4026-afd8-706b7131566e",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"import warnings\n",
|
|||
|
|
"warnings.filterwarnings(\"ignore\")\n",
|
|||
|
|
"\n",
|
|||
|
|
"import numpy as np\n",
|
|||
|
|
"import pandas as pd\n",
|
|||
|
|
"import matplotlib.pyplot as plt\n",
|
|||
|
|
"import seaborn as sns\n",
|
|||
|
|
"\n",
|
|||
|
|
"from sklearn.preprocessing import StandardScaler, RobustScaler\n",
|
|||
|
|
"from sklearn.cluster import KMeans\n",
|
|||
|
|
"from sklearn.mixture import GaussianMixture\n",
|
|||
|
|
"from sklearn.metrics import silhouette_score, davies_bouldin_score, pairwise_distances\n",
|
|||
|
|
"from sklearn.linear_model import LinearRegression\n",
|
|||
|
|
"from sklearn.neighbors import kneighbors_graph\n",
|
|||
|
|
"from sklearn.manifold import MDS\n",
|
|||
|
|
"\n",
|
|||
|
|
"import networkx as nx\n",
|
|||
|
|
"\n",
|
|||
|
|
"sns.set_style(\"whitegrid\")\n",
|
|||
|
|
"pd.set_option(\"display.max_columns\", 200)\n",
|
|||
|
|
"pd.set_option(\"display.max_rows\", 200)\n",
|
|||
|
|
"\n",
|
|||
|
|
"EPS = 1e-9\n",
|
|||
|
|
"RANDOM_STATE = 42"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 4,
|
|||
|
|
"id": "558c8d6d-9a8d-4c82-9765-620f7ce8d116",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>Unnamed: 0</th>\n",
|
|||
|
|
" <th>Agreement - Code</th>\n",
|
|||
|
|
" <th>Company - Id</th>\n",
|
|||
|
|
" <th>Company - Ultimate Parent Id</th>\n",
|
|||
|
|
" <th>Registrar Account - ID</th>\n",
|
|||
|
|
" <th>Registrar Account - Region</th>\n",
|
|||
|
|
" <th>RegistrarAccount - Country</th>\n",
|
|||
|
|
" <th>Product - Asset Type</th>\n",
|
|||
|
|
" <th>Product - Strategy</th>\n",
|
|||
|
|
" <th>Product - Legal Status</th>\n",
|
|||
|
|
" <th>Product - Is Dedie ?</th>\n",
|
|||
|
|
" <th>Product - Fund</th>\n",
|
|||
|
|
" <th>Product - Shareclass Type</th>\n",
|
|||
|
|
" <th>Product - Shareclass Currency</th>\n",
|
|||
|
|
" <th>Product - Isin</th>\n",
|
|||
|
|
" <th>Centralisation Date</th>\n",
|
|||
|
|
" <th>Quantity - Subscription</th>\n",
|
|||
|
|
" <th>Quantity - Redemption</th>\n",
|
|||
|
|
" <th>Quantity - NetFlows</th>\n",
|
|||
|
|
" <th>Value Ccy - Subscription</th>\n",
|
|||
|
|
" <th>Value Ccy - Redemption</th>\n",
|
|||
|
|
" <th>Value Ccy - NetFlows</th>\n",
|
|||
|
|
" <th>Value € - Subscription</th>\n",
|
|||
|
|
" <th>Value € - Redemption</th>\n",
|
|||
|
|
" <th>Value € - NetFlows</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>003</td>\n",
|
|||
|
|
" <td>166</td>\n",
|
|||
|
|
" <td>166</td>\n",
|
|||
|
|
" <td>200127202</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>EQUITY</td>\n",
|
|||
|
|
" <td>INVESTISSEMENT</td>\n",
|
|||
|
|
" <td>SICAV</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC PORTFOLIO INVESTISSEMENT</td>\n",
|
|||
|
|
" <td>F</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>LU0992625839</td>\n",
|
|||
|
|
" <td>2020-11-05</td>\n",
|
|||
|
|
" <td>1636.000</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" <td>1636.000</td>\n",
|
|||
|
|
" <td>280983.00</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>280983.00</td>\n",
|
|||
|
|
" <td>280983.00</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>280983.00</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>003</td>\n",
|
|||
|
|
" <td>166</td>\n",
|
|||
|
|
" <td>166</td>\n",
|
|||
|
|
" <td>406533</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>DIVERSIFIED</td>\n",
|
|||
|
|
" <td>PATRIMOINE</td>\n",
|
|||
|
|
" <td>FCP</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC PATRIMOINE</td>\n",
|
|||
|
|
" <td>A</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>FR0010135103</td>\n",
|
|||
|
|
" <td>2015-03-09</td>\n",
|
|||
|
|
" <td>144.690</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" <td>144.690</td>\n",
|
|||
|
|
" <td>99985.13</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>99985.13</td>\n",
|
|||
|
|
" <td>99985.13</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>99985.13</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2</th>\n",
|
|||
|
|
" <td>2</td>\n",
|
|||
|
|
" <td>003</td>\n",
|
|||
|
|
" <td>166</td>\n",
|
|||
|
|
" <td>166</td>\n",
|
|||
|
|
" <td>406533</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>EQUITY</td>\n",
|
|||
|
|
" <td>INVESTISSEMENT</td>\n",
|
|||
|
|
" <td>FCP</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC INVESTISSEMENT</td>\n",
|
|||
|
|
" <td>A</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>FR0010148981</td>\n",
|
|||
|
|
" <td>2016-10-26</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" <td>-8.321</td>\n",
|
|||
|
|
" <td>-8.321</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>-9384.76</td>\n",
|
|||
|
|
" <td>-9384.76</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>-9384.76</td>\n",
|
|||
|
|
" <td>-9384.76</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3</th>\n",
|
|||
|
|
" <td>3</td>\n",
|
|||
|
|
" <td>003</td>\n",
|
|||
|
|
" <td>166</td>\n",
|
|||
|
|
" <td>166</td>\n",
|
|||
|
|
" <td>406533</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>EQUITY</td>\n",
|
|||
|
|
" <td>INVESTISSEMENT</td>\n",
|
|||
|
|
" <td>FCP</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC INVESTISSEMENT</td>\n",
|
|||
|
|
" <td>A</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>FR0010148981</td>\n",
|
|||
|
|
" <td>2018-10-18</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" <td>-22.083</td>\n",
|
|||
|
|
" <td>-22.083</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>-25227.40</td>\n",
|
|||
|
|
" <td>-25227.40</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>-25227.40</td>\n",
|
|||
|
|
" <td>-25227.40</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4</th>\n",
|
|||
|
|
" <td>4</td>\n",
|
|||
|
|
" <td>003</td>\n",
|
|||
|
|
" <td>166</td>\n",
|
|||
|
|
" <td>166</td>\n",
|
|||
|
|
" <td>406533</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>EQUITY</td>\n",
|
|||
|
|
" <td>INVESTISSEMENT</td>\n",
|
|||
|
|
" <td>FCP</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC INVESTISSEMENT</td>\n",
|
|||
|
|
" <td>A</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>FR0010148981</td>\n",
|
|||
|
|
" <td>2019-04-08</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" <td>-465.992</td>\n",
|
|||
|
|
" <td>-465.992</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>-563775.76</td>\n",
|
|||
|
|
" <td>-563775.76</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>-563775.76</td>\n",
|
|||
|
|
" <td>-563775.76</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>...</th>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2574456</th>\n",
|
|||
|
|
" <td>2574456</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>FIXED INCOME</td>\n",
|
|||
|
|
" <td>SÉCURITÉ</td>\n",
|
|||
|
|
" <td>FCP</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC SÉCURITÉ</td>\n",
|
|||
|
|
" <td>AW & AW-R</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>FR0010149120</td>\n",
|
|||
|
|
" <td>2015-06-12</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" <td>-20.000</td>\n",
|
|||
|
|
" <td>-20.000</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>-34294.40</td>\n",
|
|||
|
|
" <td>-34294.40</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>-34294.40</td>\n",
|
|||
|
|
" <td>-34294.40</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2574457</th>\n",
|
|||
|
|
" <td>2574457</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>FIXED INCOME</td>\n",
|
|||
|
|
" <td>SÉCURITÉ</td>\n",
|
|||
|
|
" <td>FCP</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC SÉCURITÉ</td>\n",
|
|||
|
|
" <td>AW & AW-R</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>FR0010149120</td>\n",
|
|||
|
|
" <td>2015-09-18</td>\n",
|
|||
|
|
" <td>328.726</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" <td>328.726</td>\n",
|
|||
|
|
" <td>564028.07</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>564028.07</td>\n",
|
|||
|
|
" <td>564028.07</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>564028.07</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2574458</th>\n",
|
|||
|
|
" <td>2574458</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>FIXED INCOME</td>\n",
|
|||
|
|
" <td>SÉCURITÉ</td>\n",
|
|||
|
|
" <td>FCP</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC SÉCURITÉ</td>\n",
|
|||
|
|
" <td>AW & AW-R</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>FR0010149120</td>\n",
|
|||
|
|
" <td>2015-09-25</td>\n",
|
|||
|
|
" <td>4.443</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" <td>4.443</td>\n",
|
|||
|
|
" <td>7603.66</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>7603.66</td>\n",
|
|||
|
|
" <td>7603.66</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>7603.66</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2574459</th>\n",
|
|||
|
|
" <td>2574459</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>FIXED INCOME</td>\n",
|
|||
|
|
" <td>SÉCURITÉ</td>\n",
|
|||
|
|
" <td>FCP</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC SÉCURITÉ</td>\n",
|
|||
|
|
" <td>AW & AW-R</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>FR0010149120</td>\n",
|
|||
|
|
" <td>2015-11-09</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" <td>-440.000</td>\n",
|
|||
|
|
" <td>-440.000</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>-754696.80</td>\n",
|
|||
|
|
" <td>-754696.80</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>-754696.80</td>\n",
|
|||
|
|
" <td>-754696.80</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2574460</th>\n",
|
|||
|
|
" <td>2574460</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>FIXED INCOME</td>\n",
|
|||
|
|
" <td>SÉCURITÉ</td>\n",
|
|||
|
|
" <td>SICAV</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC PORTFOLIO SÉCURITÉ</td>\n",
|
|||
|
|
" <td>AW & AW-R</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>LU1299306321</td>\n",
|
|||
|
|
" <td>2016-01-11</td>\n",
|
|||
|
|
" <td>3595.000</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" <td>3595.000</td>\n",
|
|||
|
|
" <td>358385.55</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>358385.55</td>\n",
|
|||
|
|
" <td>358385.55</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>358385.55</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"<p>2574461 rows × 25 columns</p>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" Unnamed: 0 Agreement - Code Company - Id \\\n",
|
|||
|
|
"0 0 003 166 \n",
|
|||
|
|
"1 1 003 166 \n",
|
|||
|
|
"2 2 003 166 \n",
|
|||
|
|
"3 3 003 166 \n",
|
|||
|
|
"4 4 003 166 \n",
|
|||
|
|
"... ... ... ... \n",
|
|||
|
|
"2574456 2574456 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"2574457 2574457 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"2574458 2574458 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"2574459 2574459 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"2574460 2574460 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"\n",
|
|||
|
|
" Company - Ultimate Parent Id Registrar Account - ID \\\n",
|
|||
|
|
"0 166 200127202 \n",
|
|||
|
|
"1 166 406533 \n",
|
|||
|
|
"2 166 406533 \n",
|
|||
|
|
"3 166 406533 \n",
|
|||
|
|
"4 166 406533 \n",
|
|||
|
|
"... ... ... \n",
|
|||
|
|
"2574456 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"2574457 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"2574458 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"2574459 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"2574460 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"\n",
|
|||
|
|
" Registrar Account - Region RegistrarAccount - Country \\\n",
|
|||
|
|
"0 FRANCE FRANCE \n",
|
|||
|
|
"1 FRANCE FRANCE \n",
|
|||
|
|
"2 FRANCE FRANCE \n",
|
|||
|
|
"3 FRANCE FRANCE \n",
|
|||
|
|
"4 FRANCE FRANCE \n",
|
|||
|
|
"... ... ... \n",
|
|||
|
|
"2574456 LUXEMBOURG LUXEMBOURG \n",
|
|||
|
|
"2574457 LUXEMBOURG LUXEMBOURG \n",
|
|||
|
|
"2574458 LUXEMBOURG LUXEMBOURG \n",
|
|||
|
|
"2574459 LUXEMBOURG LUXEMBOURG \n",
|
|||
|
|
"2574460 LUXEMBOURG LUXEMBOURG \n",
|
|||
|
|
"\n",
|
|||
|
|
" Product - Asset Type Product - Strategy Product - Legal Status \\\n",
|
|||
|
|
"0 EQUITY INVESTISSEMENT SICAV \n",
|
|||
|
|
"1 DIVERSIFIED PATRIMOINE FCP \n",
|
|||
|
|
"2 EQUITY INVESTISSEMENT FCP \n",
|
|||
|
|
"3 EQUITY INVESTISSEMENT FCP \n",
|
|||
|
|
"4 EQUITY INVESTISSEMENT FCP \n",
|
|||
|
|
"... ... ... ... \n",
|
|||
|
|
"2574456 FIXED INCOME SÉCURITÉ FCP \n",
|
|||
|
|
"2574457 FIXED INCOME SÉCURITÉ FCP \n",
|
|||
|
|
"2574458 FIXED INCOME SÉCURITÉ FCP \n",
|
|||
|
|
"2574459 FIXED INCOME SÉCURITÉ FCP \n",
|
|||
|
|
"2574460 FIXED INCOME SÉCURITÉ SICAV \n",
|
|||
|
|
"\n",
|
|||
|
|
" Product - Is Dedie ? Product - Fund \\\n",
|
|||
|
|
"0 NO CARMIGNAC PORTFOLIO INVESTISSEMENT \n",
|
|||
|
|
"1 NO CARMIGNAC PATRIMOINE \n",
|
|||
|
|
"2 NO CARMIGNAC INVESTISSEMENT \n",
|
|||
|
|
"3 NO CARMIGNAC INVESTISSEMENT \n",
|
|||
|
|
"4 NO CARMIGNAC INVESTISSEMENT \n",
|
|||
|
|
"... ... ... \n",
|
|||
|
|
"2574456 NO CARMIGNAC SÉCURITÉ \n",
|
|||
|
|
"2574457 NO CARMIGNAC SÉCURITÉ \n",
|
|||
|
|
"2574458 NO CARMIGNAC SÉCURITÉ \n",
|
|||
|
|
"2574459 NO CARMIGNAC SÉCURITÉ \n",
|
|||
|
|
"2574460 NO CARMIGNAC PORTFOLIO SÉCURITÉ \n",
|
|||
|
|
"\n",
|
|||
|
|
" Product - Shareclass Type Product - Shareclass Currency \\\n",
|
|||
|
|
"0 F EUR \n",
|
|||
|
|
"1 A EUR \n",
|
|||
|
|
"2 A EUR \n",
|
|||
|
|
"3 A EUR \n",
|
|||
|
|
"4 A EUR \n",
|
|||
|
|
"... ... ... \n",
|
|||
|
|
"2574456 AW & AW-R EUR \n",
|
|||
|
|
"2574457 AW & AW-R EUR \n",
|
|||
|
|
"2574458 AW & AW-R EUR \n",
|
|||
|
|
"2574459 AW & AW-R EUR \n",
|
|||
|
|
"2574460 AW & AW-R EUR \n",
|
|||
|
|
"\n",
|
|||
|
|
" Product - Isin Centralisation Date Quantity - Subscription \\\n",
|
|||
|
|
"0 LU0992625839 2020-11-05 1636.000 \n",
|
|||
|
|
"1 FR0010135103 2015-03-09 144.690 \n",
|
|||
|
|
"2 FR0010148981 2016-10-26 0.000 \n",
|
|||
|
|
"3 FR0010148981 2018-10-18 0.000 \n",
|
|||
|
|
"4 FR0010148981 2019-04-08 0.000 \n",
|
|||
|
|
"... ... ... ... \n",
|
|||
|
|
"2574456 FR0010149120 2015-06-12 0.000 \n",
|
|||
|
|
"2574457 FR0010149120 2015-09-18 328.726 \n",
|
|||
|
|
"2574458 FR0010149120 2015-09-25 4.443 \n",
|
|||
|
|
"2574459 FR0010149120 2015-11-09 0.000 \n",
|
|||
|
|
"2574460 LU1299306321 2016-01-11 3595.000 \n",
|
|||
|
|
"\n",
|
|||
|
|
" Quantity - Redemption Quantity - NetFlows Value Ccy - Subscription \\\n",
|
|||
|
|
"0 0.000 1636.000 280983.00 \n",
|
|||
|
|
"1 0.000 144.690 99985.13 \n",
|
|||
|
|
"2 -8.321 -8.321 0.00 \n",
|
|||
|
|
"3 -22.083 -22.083 0.00 \n",
|
|||
|
|
"4 -465.992 -465.992 0.00 \n",
|
|||
|
|
"... ... ... ... \n",
|
|||
|
|
"2574456 -20.000 -20.000 0.00 \n",
|
|||
|
|
"2574457 0.000 328.726 564028.07 \n",
|
|||
|
|
"2574458 0.000 4.443 7603.66 \n",
|
|||
|
|
"2574459 -440.000 -440.000 0.00 \n",
|
|||
|
|
"2574460 0.000 3595.000 358385.55 \n",
|
|||
|
|
"\n",
|
|||
|
|
" Value Ccy - Redemption Value Ccy - NetFlows Value € - Subscription \\\n",
|
|||
|
|
"0 0.00 280983.00 280983.00 \n",
|
|||
|
|
"1 0.00 99985.13 99985.13 \n",
|
|||
|
|
"2 -9384.76 -9384.76 0.00 \n",
|
|||
|
|
"3 -25227.40 -25227.40 0.00 \n",
|
|||
|
|
"4 -563775.76 -563775.76 0.00 \n",
|
|||
|
|
"... ... ... ... \n",
|
|||
|
|
"2574456 -34294.40 -34294.40 0.00 \n",
|
|||
|
|
"2574457 0.00 564028.07 564028.07 \n",
|
|||
|
|
"2574458 0.00 7603.66 7603.66 \n",
|
|||
|
|
"2574459 -754696.80 -754696.80 0.00 \n",
|
|||
|
|
"2574460 0.00 358385.55 358385.55 \n",
|
|||
|
|
"\n",
|
|||
|
|
" Value € - Redemption Value € - NetFlows \n",
|
|||
|
|
"0 0.00 280983.00 \n",
|
|||
|
|
"1 0.00 99985.13 \n",
|
|||
|
|
"2 -9384.76 -9384.76 \n",
|
|||
|
|
"3 -25227.40 -25227.40 \n",
|
|||
|
|
"4 -563775.76 -563775.76 \n",
|
|||
|
|
"... ... ... \n",
|
|||
|
|
"2574456 -34294.40 -34294.40 \n",
|
|||
|
|
"2574457 0.00 564028.07 \n",
|
|||
|
|
"2574458 0.00 7603.66 \n",
|
|||
|
|
"2574459 -754696.80 -754696.80 \n",
|
|||
|
|
"2574460 0.00 358385.55 \n",
|
|||
|
|
"\n",
|
|||
|
|
"[2574461 rows x 25 columns]"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 4,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"import pandas as pd \n",
|
|||
|
|
"df_flows = pd.read_csv(\"flows.csv\")\n",
|
|||
|
|
"df_flows"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 5,
|
|||
|
|
"id": "b1b88d12-7909-435b-b5a8-7814d5ad09af",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>Unnamed: 0.1</th>\n",
|
|||
|
|
" <th>Unnamed: 0</th>\n",
|
|||
|
|
" <th>Agreement - Code</th>\n",
|
|||
|
|
" <th>Company - Id</th>\n",
|
|||
|
|
" <th>Company - Ultimate Parent Id</th>\n",
|
|||
|
|
" <th>Registrar Account - ID</th>\n",
|
|||
|
|
" <th>Registrar Account - Region</th>\n",
|
|||
|
|
" <th>RegistrarAccount - Country</th>\n",
|
|||
|
|
" <th>Product - Asset Type</th>\n",
|
|||
|
|
" <th>Product - Strategy</th>\n",
|
|||
|
|
" <th>Product - Legal Status</th>\n",
|
|||
|
|
" <th>Product - Is Dedie ?</th>\n",
|
|||
|
|
" <th>Product - Fund</th>\n",
|
|||
|
|
" <th>Product - Shareclass Type</th>\n",
|
|||
|
|
" <th>Product - Shareclass Currency</th>\n",
|
|||
|
|
" <th>Product - Isin</th>\n",
|
|||
|
|
" <th>Centralisation Date</th>\n",
|
|||
|
|
" <th>Quantity - AUM</th>\n",
|
|||
|
|
" <th>Value - AUM CCY</th>\n",
|
|||
|
|
" <th>Value - AUM €</th>\n",
|
|||
|
|
" <th>repair_flag</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>3</td>\n",
|
|||
|
|
" <td>166.0</td>\n",
|
|||
|
|
" <td>166.0</td>\n",
|
|||
|
|
" <td>200000647</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>DIVERSIFIED</td>\n",
|
|||
|
|
" <td>PATRIMOINE</td>\n",
|
|||
|
|
" <td>FCP</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC PATRIMOINE</td>\n",
|
|||
|
|
" <td>A</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>FR0010135103</td>\n",
|
|||
|
|
" <td>2015-03-31</td>\n",
|
|||
|
|
" <td>35.368</td>\n",
|
|||
|
|
" <td>24648.6666</td>\n",
|
|||
|
|
" <td>24648.6666</td>\n",
|
|||
|
|
" <td>False</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>3</td>\n",
|
|||
|
|
" <td>166.0</td>\n",
|
|||
|
|
" <td>166.0</td>\n",
|
|||
|
|
" <td>200000647</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>DIVERSIFIED</td>\n",
|
|||
|
|
" <td>PATRIMOINE</td>\n",
|
|||
|
|
" <td>FCP</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC PATRIMOINE</td>\n",
|
|||
|
|
" <td>A</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>FR0010135103</td>\n",
|
|||
|
|
" <td>2015-11-30</td>\n",
|
|||
|
|
" <td>35.368</td>\n",
|
|||
|
|
" <td>22413.0553</td>\n",
|
|||
|
|
" <td>22413.0553</td>\n",
|
|||
|
|
" <td>False</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2</th>\n",
|
|||
|
|
" <td>2</td>\n",
|
|||
|
|
" <td>2</td>\n",
|
|||
|
|
" <td>3</td>\n",
|
|||
|
|
" <td>166.0</td>\n",
|
|||
|
|
" <td>166.0</td>\n",
|
|||
|
|
" <td>200000647</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>DIVERSIFIED</td>\n",
|
|||
|
|
" <td>PATRIMOINE</td>\n",
|
|||
|
|
" <td>FCP</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC PATRIMOINE</td>\n",
|
|||
|
|
" <td>A</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>FR0010135103</td>\n",
|
|||
|
|
" <td>2015-12-31</td>\n",
|
|||
|
|
" <td>35.368</td>\n",
|
|||
|
|
" <td>22051.2406</td>\n",
|
|||
|
|
" <td>22051.2406</td>\n",
|
|||
|
|
" <td>False</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3</th>\n",
|
|||
|
|
" <td>3</td>\n",
|
|||
|
|
" <td>3</td>\n",
|
|||
|
|
" <td>3</td>\n",
|
|||
|
|
" <td>166.0</td>\n",
|
|||
|
|
" <td>166.0</td>\n",
|
|||
|
|
" <td>200000647</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>DIVERSIFIED</td>\n",
|
|||
|
|
" <td>PATRIMOINE</td>\n",
|
|||
|
|
" <td>FCP</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC PATRIMOINE</td>\n",
|
|||
|
|
" <td>A</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>FR0010135103</td>\n",
|
|||
|
|
" <td>2016-03-31</td>\n",
|
|||
|
|
" <td>35.368</td>\n",
|
|||
|
|
" <td>21626.1173</td>\n",
|
|||
|
|
" <td>21626.1173</td>\n",
|
|||
|
|
" <td>False</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4</th>\n",
|
|||
|
|
" <td>4</td>\n",
|
|||
|
|
" <td>4</td>\n",
|
|||
|
|
" <td>3</td>\n",
|
|||
|
|
" <td>166.0</td>\n",
|
|||
|
|
" <td>166.0</td>\n",
|
|||
|
|
" <td>200000647</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>DIVERSIFIED</td>\n",
|
|||
|
|
" <td>PATRIMOINE</td>\n",
|
|||
|
|
" <td>FCP</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC PATRIMOINE</td>\n",
|
|||
|
|
" <td>A</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>FR0010135103</td>\n",
|
|||
|
|
" <td>2016-11-30</td>\n",
|
|||
|
|
" <td>35.368</td>\n",
|
|||
|
|
" <td>22489.4502</td>\n",
|
|||
|
|
" <td>22489.4502</td>\n",
|
|||
|
|
" <td>False</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>...</th>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>5516128</th>\n",
|
|||
|
|
" <td>5516128</td>\n",
|
|||
|
|
" <td>4880294</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>FIXED INCOME</td>\n",
|
|||
|
|
" <td>SÉCURITÉ</td>\n",
|
|||
|
|
" <td>SICAV</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC PORTFOLIO SÉCURITÉ</td>\n",
|
|||
|
|
" <td>AW & AW-R</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>LU1299306321</td>\n",
|
|||
|
|
" <td>2020-10-31</td>\n",
|
|||
|
|
" <td>3099.000</td>\n",
|
|||
|
|
" <td>318422.2500</td>\n",
|
|||
|
|
" <td>318422.2500</td>\n",
|
|||
|
|
" <td>False</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>5516129</th>\n",
|
|||
|
|
" <td>5516129</td>\n",
|
|||
|
|
" <td>4880294</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>FIXED INCOME</td>\n",
|
|||
|
|
" <td>SÉCURITÉ</td>\n",
|
|||
|
|
" <td>SICAV</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC PORTFOLIO SÉCURITÉ</td>\n",
|
|||
|
|
" <td>AW & AW-R</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>LU1299306321</td>\n",
|
|||
|
|
" <td>2020-10-31</td>\n",
|
|||
|
|
" <td>3099.000</td>\n",
|
|||
|
|
" <td>318422.2500</td>\n",
|
|||
|
|
" <td>318422.2500</td>\n",
|
|||
|
|
" <td>False</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>5516130</th>\n",
|
|||
|
|
" <td>5516130</td>\n",
|
|||
|
|
" <td>4880295</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>FIXED INCOME</td>\n",
|
|||
|
|
" <td>SÉCURITÉ</td>\n",
|
|||
|
|
" <td>SICAV</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC PORTFOLIO SÉCURITÉ</td>\n",
|
|||
|
|
" <td>AW & AW-R</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>LU1299306321</td>\n",
|
|||
|
|
" <td>2021-07-31</td>\n",
|
|||
|
|
" <td>2835.000</td>\n",
|
|||
|
|
" <td>297618.3000</td>\n",
|
|||
|
|
" <td>297618.3000</td>\n",
|
|||
|
|
" <td>False</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>5516131</th>\n",
|
|||
|
|
" <td>5516131</td>\n",
|
|||
|
|
" <td>4880295</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>FIXED INCOME</td>\n",
|
|||
|
|
" <td>SÉCURITÉ</td>\n",
|
|||
|
|
" <td>SICAV</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC PORTFOLIO SÉCURITÉ</td>\n",
|
|||
|
|
" <td>AW & AW-R</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>LU1299306321</td>\n",
|
|||
|
|
" <td>2021-07-31</td>\n",
|
|||
|
|
" <td>2835.000</td>\n",
|
|||
|
|
" <td>297618.3000</td>\n",
|
|||
|
|
" <td>297618.3000</td>\n",
|
|||
|
|
" <td>False</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>5516132</th>\n",
|
|||
|
|
" <td>5516132</td>\n",
|
|||
|
|
" <td>4880296</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>FIXED INCOME</td>\n",
|
|||
|
|
" <td>SÉCURITÉ</td>\n",
|
|||
|
|
" <td>SICAV</td>\n",
|
|||
|
|
" <td>NO</td>\n",
|
|||
|
|
" <td>CARMIGNAC PORTFOLIO SÉCURITÉ</td>\n",
|
|||
|
|
" <td>FW & FW-R</td>\n",
|
|||
|
|
" <td>EUR</td>\n",
|
|||
|
|
" <td>LU1792391911</td>\n",
|
|||
|
|
" <td>2020-07-31</td>\n",
|
|||
|
|
" <td>2916.394</td>\n",
|
|||
|
|
" <td>287410.6287</td>\n",
|
|||
|
|
" <td>287410.6287</td>\n",
|
|||
|
|
" <td>False</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"<p>5516133 rows × 21 columns</p>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" Unnamed: 0.1 Unnamed: 0 Agreement - Code Company - Id \\\n",
|
|||
|
|
"0 0 0 3 166.0 \n",
|
|||
|
|
"1 1 1 3 166.0 \n",
|
|||
|
|
"2 2 2 3 166.0 \n",
|
|||
|
|
"3 3 3 3 166.0 \n",
|
|||
|
|
"4 4 4 3 166.0 \n",
|
|||
|
|
"... ... ... ... ... \n",
|
|||
|
|
"5516128 5516128 4880294 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"5516129 5516129 4880294 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"5516130 5516130 4880295 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"5516131 5516131 4880295 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"5516132 5516132 4880296 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"\n",
|
|||
|
|
" Company - Ultimate Parent Id Registrar Account - ID \\\n",
|
|||
|
|
"0 166.0 200000647 \n",
|
|||
|
|
"1 166.0 200000647 \n",
|
|||
|
|
"2 166.0 200000647 \n",
|
|||
|
|
"3 166.0 200000647 \n",
|
|||
|
|
"4 166.0 200000647 \n",
|
|||
|
|
"... ... ... \n",
|
|||
|
|
"5516128 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"5516129 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"5516130 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"5516131 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"5516132 PRIVATE CLIENT PRIVATE CLIENT \n",
|
|||
|
|
"\n",
|
|||
|
|
" Registrar Account - Region RegistrarAccount - Country \\\n",
|
|||
|
|
"0 FRANCE FRANCE \n",
|
|||
|
|
"1 FRANCE FRANCE \n",
|
|||
|
|
"2 FRANCE FRANCE \n",
|
|||
|
|
"3 FRANCE FRANCE \n",
|
|||
|
|
"4 FRANCE FRANCE \n",
|
|||
|
|
"... ... ... \n",
|
|||
|
|
"5516128 SWITZERLAND SWITZERLAND \n",
|
|||
|
|
"5516129 SWITZERLAND SWITZERLAND \n",
|
|||
|
|
"5516130 SWITZERLAND SWITZERLAND \n",
|
|||
|
|
"5516131 SWITZERLAND SWITZERLAND \n",
|
|||
|
|
"5516132 SWITZERLAND SWITZERLAND \n",
|
|||
|
|
"\n",
|
|||
|
|
" Product - Asset Type Product - Strategy Product - Legal Status \\\n",
|
|||
|
|
"0 DIVERSIFIED PATRIMOINE FCP \n",
|
|||
|
|
"1 DIVERSIFIED PATRIMOINE FCP \n",
|
|||
|
|
"2 DIVERSIFIED PATRIMOINE FCP \n",
|
|||
|
|
"3 DIVERSIFIED PATRIMOINE FCP \n",
|
|||
|
|
"4 DIVERSIFIED PATRIMOINE FCP \n",
|
|||
|
|
"... ... ... ... \n",
|
|||
|
|
"5516128 FIXED INCOME SÉCURITÉ SICAV \n",
|
|||
|
|
"5516129 FIXED INCOME SÉCURITÉ SICAV \n",
|
|||
|
|
"5516130 FIXED INCOME SÉCURITÉ SICAV \n",
|
|||
|
|
"5516131 FIXED INCOME SÉCURITÉ SICAV \n",
|
|||
|
|
"5516132 FIXED INCOME SÉCURITÉ SICAV \n",
|
|||
|
|
"\n",
|
|||
|
|
" Product - Is Dedie ? Product - Fund \\\n",
|
|||
|
|
"0 NO CARMIGNAC PATRIMOINE \n",
|
|||
|
|
"1 NO CARMIGNAC PATRIMOINE \n",
|
|||
|
|
"2 NO CARMIGNAC PATRIMOINE \n",
|
|||
|
|
"3 NO CARMIGNAC PATRIMOINE \n",
|
|||
|
|
"4 NO CARMIGNAC PATRIMOINE \n",
|
|||
|
|
"... ... ... \n",
|
|||
|
|
"5516128 NO CARMIGNAC PORTFOLIO SÉCURITÉ \n",
|
|||
|
|
"5516129 NO CARMIGNAC PORTFOLIO SÉCURITÉ \n",
|
|||
|
|
"5516130 NO CARMIGNAC PORTFOLIO SÉCURITÉ \n",
|
|||
|
|
"5516131 NO CARMIGNAC PORTFOLIO SÉCURITÉ \n",
|
|||
|
|
"5516132 NO CARMIGNAC PORTFOLIO SÉCURITÉ \n",
|
|||
|
|
"\n",
|
|||
|
|
" Product - Shareclass Type Product - Shareclass Currency \\\n",
|
|||
|
|
"0 A EUR \n",
|
|||
|
|
"1 A EUR \n",
|
|||
|
|
"2 A EUR \n",
|
|||
|
|
"3 A EUR \n",
|
|||
|
|
"4 A EUR \n",
|
|||
|
|
"... ... ... \n",
|
|||
|
|
"5516128 AW & AW-R EUR \n",
|
|||
|
|
"5516129 AW & AW-R EUR \n",
|
|||
|
|
"5516130 AW & AW-R EUR \n",
|
|||
|
|
"5516131 AW & AW-R EUR \n",
|
|||
|
|
"5516132 FW & FW-R EUR \n",
|
|||
|
|
"\n",
|
|||
|
|
" Product - Isin Centralisation Date Quantity - AUM Value - AUM CCY \\\n",
|
|||
|
|
"0 FR0010135103 2015-03-31 35.368 24648.6666 \n",
|
|||
|
|
"1 FR0010135103 2015-11-30 35.368 22413.0553 \n",
|
|||
|
|
"2 FR0010135103 2015-12-31 35.368 22051.2406 \n",
|
|||
|
|
"3 FR0010135103 2016-03-31 35.368 21626.1173 \n",
|
|||
|
|
"4 FR0010135103 2016-11-30 35.368 22489.4502 \n",
|
|||
|
|
"... ... ... ... ... \n",
|
|||
|
|
"5516128 LU1299306321 2020-10-31 3099.000 318422.2500 \n",
|
|||
|
|
"5516129 LU1299306321 2020-10-31 3099.000 318422.2500 \n",
|
|||
|
|
"5516130 LU1299306321 2021-07-31 2835.000 297618.3000 \n",
|
|||
|
|
"5516131 LU1299306321 2021-07-31 2835.000 297618.3000 \n",
|
|||
|
|
"5516132 LU1792391911 2020-07-31 2916.394 287410.6287 \n",
|
|||
|
|
"\n",
|
|||
|
|
" Value - AUM € repair_flag \n",
|
|||
|
|
"0 24648.6666 False \n",
|
|||
|
|
"1 22413.0553 False \n",
|
|||
|
|
"2 22051.2406 False \n",
|
|||
|
|
"3 21626.1173 False \n",
|
|||
|
|
"4 22489.4502 False \n",
|
|||
|
|
"... ... ... \n",
|
|||
|
|
"5516128 318422.2500 False \n",
|
|||
|
|
"5516129 318422.2500 False \n",
|
|||
|
|
"5516130 297618.3000 False \n",
|
|||
|
|
"5516131 297618.3000 False \n",
|
|||
|
|
"5516132 287410.6287 False \n",
|
|||
|
|
"\n",
|
|||
|
|
"[5516133 rows x 21 columns]"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 5,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"df_aum = pd.read_csv(\"AUM_repaired.csv\")\n",
|
|||
|
|
"df_aum"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 26,
|
|||
|
|
"id": "4c799ab2-b16e-4cbe-85ee-818002c758c4",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/plain": [
|
|||
|
|
"array(['CARMIGNAC PATRIMOINE', 'CARMIGNAC INVESTISSEMENT',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO INVESTISSEMENT',\n",
|
|||
|
|
" 'CARMIGNAC EURO-INVESTISSEMENT', 'CARMIGNAC INNOVATION',\n",
|
|||
|
|
" 'CARMIGNAC ABSOLUTE RETURN EUROPE',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO CLIMATE TRANSITION',\n",
|
|||
|
|
" 'CARMIGNAC EURO-ENTREPRENEURS', 'CARMIGNAC EMERGENTS',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO EMERGING PATRIMOINE',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO GRANDE EUROPE',\n",
|
|||
|
|
" 'CARMIGNAC INVESTISSEMENT LATITUDE', 'CARMIGNAC COURT TERME',\n",
|
|||
|
|
" 'CARMIGNAC SÉCURITÉ', 'CARMIGNAC MULTI EXPERTISE',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO INFOTECH', 'CARMIGNAC PROFIL RÉACTIF 100',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO GLOBAL BOND', 'CARMIGNAC PROFIL RÉACTIF 75',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO PATRIMOINE EUROPE', 'CARMIGNAC CREDIT 2027',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO ASIA DISCOVERY',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO TECH SOLUTIONS',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO FLEXIBLE BOND', 'CARMIGNAC PORTFOLIO CREDIT',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO MARKET NEUTRAL',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO EM DEBT',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO LONG-SHORT EUROPEAN EQUITIES',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO LONG-SHORT GLOBAL EQUITIES',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO PATRIMOINE',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO EURO-ENTREPRENEURS',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO GRANDCHILDREN',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO INVESTISSEMENT LATITUDE',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO EMERGENTS', 'CARMIGNAC PORTFOLIO SÉCURITÉ',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO INFLATION SOLUTION', 'CARMIGNAC CREDIT 2029',\n",
|
|||
|
|
" 'CARMIGNAC CREDIT 2031', 'CARMIGNAC PORTFOLIO CAPITAL CUBE',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO CHINA NEW ECONOMY', 'CARMIGNAC CREDIT 2025',\n",
|
|||
|
|
" 'CARMIGNAC EPARGNE ACTIONS MONDE ISR',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO FAMILY GOVERNED',\n",
|
|||
|
|
" 'CARMIGNAC S.A. SICAV - PART II UCI PRIVATE EVERGREEN',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO HUMAN XPERIENCE',\n",
|
|||
|
|
" 'CARMIGNAC CHINA NEW ECONOMY', 'CARMIGNAC PORTFOLIO CHINA',\n",
|
|||
|
|
" 'CARMIGNAC ALTS ICAV CARMIGNAC CREDIT OPPORTUNITIES',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO MERGER ARBITRAGE PLUS',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO ABSOLUTE RETURN EUROPE',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO FLEXIBLE ALLOCATION 2024',\n",
|
|||
|
|
" 'FP CARMIGNAC EUROPEAN LEADERS',\n",
|
|||
|
|
" 'FP CARMIGNAC GLOBAL EQUITY COMPOUNDERS',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO MERGER ARBITRAGE',\n",
|
|||
|
|
" 'SOLYS - CARMIGNAC EQUITY SELECTION',\n",
|
|||
|
|
" 'FP CARMIGNAC EMERGING MARKETS', 'MAPFRE CARMIGNAC F.P.',\n",
|
|||
|
|
" 'FP CARMIGNAC GLOBAL BOND',\n",
|
|||
|
|
" 'CARMIGNAC ALTS ICAV EUROPEAN LONG SHORT',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO ACTIVE RISK ALLOCATION',\n",
|
|||
|
|
" 'FP CARMIGNAC EMERGING PATRIMOINE', 'FP CARMIGNAC PATRIMOINE',\n",
|
|||
|
|
" 'FP CARMIGNAC EMERGING DISCOVERY',\n",
|
|||
|
|
" 'CREDIT SUISSE CARMIGNAC EMERGING MARKETS MULTI-ASSET FUND',\n",
|
|||
|
|
" 'FONDITALIA CARMIGNAC ACTIVE ALLOCATION',\n",
|
|||
|
|
" 'CARMIGNAC GLOBAL ACTIVE',\n",
|
|||
|
|
" 'LUX IM - CARMIGNAC EMERGING FLEXIBLE BOND',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO EVOLUTION', 'UFF GRANDE EUROPE 0-100',\n",
|
|||
|
|
" 'CFP 1', 'CARMIGNAC PORTFOLIO SUSTAINABLE BOND',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO CROSS ASSET OPPORTUNITIES',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO ALPHA THEMES',\n",
|
|||
|
|
" 'CARMIGNAC PORTFOLIO GLOBAL MARKET NEUTRAL'], dtype=object)"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 26,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"df_aum['Product - Fund'].unique()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 6,
|
|||
|
|
"id": "09068a72-80a4-4239-947a-a73f6de10a57",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>Registrar Account - ID</th>\n",
|
|||
|
|
" <th>n_days</th>\n",
|
|||
|
|
" <th>n_transactions</th>\n",
|
|||
|
|
" <th>total_netflows</th>\n",
|
|||
|
|
" <th>mean_flow</th>\n",
|
|||
|
|
" <th>std_flow</th>\n",
|
|||
|
|
" <th>total_subscription</th>\n",
|
|||
|
|
" <th>total_redemption</th>\n",
|
|||
|
|
" <th>churn_ratio</th>\n",
|
|||
|
|
" <th>churn_flag</th>\n",
|
|||
|
|
" <th>activity_score</th>\n",
|
|||
|
|
" <th>flow_volatility</th>\n",
|
|||
|
|
" <th>inertia_ratio</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>100000028</td>\n",
|
|||
|
|
" <td>3</td>\n",
|
|||
|
|
" <td>3</td>\n",
|
|||
|
|
" <td>-1.092380e+02</td>\n",
|
|||
|
|
" <td>-36.412667</td>\n",
|
|||
|
|
" <td>49.280511</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>-1.092380e+02</td>\n",
|
|||
|
|
" <td>-1.092380e+08</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>1.386294</td>\n",
|
|||
|
|
" <td>49.280511</td>\n",
|
|||
|
|
" <td>0.998921</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>100000042</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>-6.601150e+02</td>\n",
|
|||
|
|
" <td>-660.115000</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>-6.601150e+02</td>\n",
|
|||
|
|
" <td>-6.601150e+08</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.693147</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.999640</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2</th>\n",
|
|||
|
|
" <td>100000065</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>-1.746460e+02</td>\n",
|
|||
|
|
" <td>-174.646000</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>-1.746460e+02</td>\n",
|
|||
|
|
" <td>-1.746460e+08</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.693147</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.999640</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3</th>\n",
|
|||
|
|
" <td>100000069</td>\n",
|
|||
|
|
" <td>65</td>\n",
|
|||
|
|
" <td>73</td>\n",
|
|||
|
|
" <td>-7.479755e+03</td>\n",
|
|||
|
|
" <td>-102.462397</td>\n",
|
|||
|
|
" <td>2168.971331</td>\n",
|
|||
|
|
" <td>3.332040e+04</td>\n",
|
|||
|
|
" <td>-4.080016e+04</td>\n",
|
|||
|
|
" <td>-1.224480e+00</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>4.304065</td>\n",
|
|||
|
|
" <td>2168.971331</td>\n",
|
|||
|
|
" <td>0.976619</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4</th>\n",
|
|||
|
|
" <td>100000073</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>-1.334020e+02</td>\n",
|
|||
|
|
" <td>-133.402000</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>-1.334020e+02</td>\n",
|
|||
|
|
" <td>-1.334020e+08</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.693147</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.999640</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>...</th>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>6837</th>\n",
|
|||
|
|
" <td>422905</td>\n",
|
|||
|
|
" <td>208</td>\n",
|
|||
|
|
" <td>212</td>\n",
|
|||
|
|
" <td>-4.329218e+03</td>\n",
|
|||
|
|
" <td>-20.420840</td>\n",
|
|||
|
|
" <td>331.677297</td>\n",
|
|||
|
|
" <td>9.699140e+03</td>\n",
|
|||
|
|
" <td>-1.402836e+04</td>\n",
|
|||
|
|
" <td>-1.446351e+00</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>5.361292</td>\n",
|
|||
|
|
" <td>331.677297</td>\n",
|
|||
|
|
" <td>0.925180</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>6838</th>\n",
|
|||
|
|
" <td>422906</td>\n",
|
|||
|
|
" <td>1146</td>\n",
|
|||
|
|
" <td>1556</td>\n",
|
|||
|
|
" <td>4.455099e+03</td>\n",
|
|||
|
|
" <td>2.863174</td>\n",
|
|||
|
|
" <td>201.071555</td>\n",
|
|||
|
|
" <td>6.078686e+04</td>\n",
|
|||
|
|
" <td>-5.633177e+04</td>\n",
|
|||
|
|
" <td>-9.267095e-01</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>7.350516</td>\n",
|
|||
|
|
" <td>201.071555</td>\n",
|
|||
|
|
" <td>0.587770</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>6839</th>\n",
|
|||
|
|
" <td>8307</td>\n",
|
|||
|
|
" <td>204</td>\n",
|
|||
|
|
" <td>221</td>\n",
|
|||
|
|
" <td>2.168303e+04</td>\n",
|
|||
|
|
" <td>98.113249</td>\n",
|
|||
|
|
" <td>2217.940406</td>\n",
|
|||
|
|
" <td>1.204399e+05</td>\n",
|
|||
|
|
" <td>-9.875688e+04</td>\n",
|
|||
|
|
" <td>-8.199681e-01</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>5.402677</td>\n",
|
|||
|
|
" <td>2217.940406</td>\n",
|
|||
|
|
" <td>0.926619</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>6840</th>\n",
|
|||
|
|
" <td>OFF DISTRIBUTION</td>\n",
|
|||
|
|
" <td>2656</td>\n",
|
|||
|
|
" <td>27679</td>\n",
|
|||
|
|
" <td>1.319043e+08</td>\n",
|
|||
|
|
" <td>4765.499704</td>\n",
|
|||
|
|
" <td>391347.475503</td>\n",
|
|||
|
|
" <td>3.388942e+08</td>\n",
|
|||
|
|
" <td>-2.069900e+08</td>\n",
|
|||
|
|
" <td>-6.107804e-01</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>10.228465</td>\n",
|
|||
|
|
" <td>391347.475503</td>\n",
|
|||
|
|
" <td>0.044604</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>6841</th>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>2690</td>\n",
|
|||
|
|
" <td>32363</td>\n",
|
|||
|
|
" <td>-4.181221e+05</td>\n",
|
|||
|
|
" <td>-12.919758</td>\n",
|
|||
|
|
" <td>7572.830139</td>\n",
|
|||
|
|
" <td>1.354277e+07</td>\n",
|
|||
|
|
" <td>-1.396089e+07</td>\n",
|
|||
|
|
" <td>-1.030874e+00</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>10.384802</td>\n",
|
|||
|
|
" <td>7572.830139</td>\n",
|
|||
|
|
" <td>0.032374</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"<p>6842 rows × 13 columns</p>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" Registrar Account - ID n_days n_transactions total_netflows \\\n",
|
|||
|
|
"0 100000028 3 3 -1.092380e+02 \n",
|
|||
|
|
"1 100000042 1 1 -6.601150e+02 \n",
|
|||
|
|
"2 100000065 1 1 -1.746460e+02 \n",
|
|||
|
|
"3 100000069 65 73 -7.479755e+03 \n",
|
|||
|
|
"4 100000073 1 1 -1.334020e+02 \n",
|
|||
|
|
"... ... ... ... ... \n",
|
|||
|
|
"6837 422905 208 212 -4.329218e+03 \n",
|
|||
|
|
"6838 422906 1146 1556 4.455099e+03 \n",
|
|||
|
|
"6839 8307 204 221 2.168303e+04 \n",
|
|||
|
|
"6840 OFF DISTRIBUTION 2656 27679 1.319043e+08 \n",
|
|||
|
|
"6841 PRIVATE CLIENT 2690 32363 -4.181221e+05 \n",
|
|||
|
|
"\n",
|
|||
|
|
" mean_flow std_flow total_subscription total_redemption \\\n",
|
|||
|
|
"0 -36.412667 49.280511 0.000000e+00 -1.092380e+02 \n",
|
|||
|
|
"1 -660.115000 NaN 0.000000e+00 -6.601150e+02 \n",
|
|||
|
|
"2 -174.646000 NaN 0.000000e+00 -1.746460e+02 \n",
|
|||
|
|
"3 -102.462397 2168.971331 3.332040e+04 -4.080016e+04 \n",
|
|||
|
|
"4 -133.402000 NaN 0.000000e+00 -1.334020e+02 \n",
|
|||
|
|
"... ... ... ... ... \n",
|
|||
|
|
"6837 -20.420840 331.677297 9.699140e+03 -1.402836e+04 \n",
|
|||
|
|
"6838 2.863174 201.071555 6.078686e+04 -5.633177e+04 \n",
|
|||
|
|
"6839 98.113249 2217.940406 1.204399e+05 -9.875688e+04 \n",
|
|||
|
|
"6840 4765.499704 391347.475503 3.388942e+08 -2.069900e+08 \n",
|
|||
|
|
"6841 -12.919758 7572.830139 1.354277e+07 -1.396089e+07 \n",
|
|||
|
|
"\n",
|
|||
|
|
" churn_ratio churn_flag activity_score flow_volatility inertia_ratio \n",
|
|||
|
|
"0 -1.092380e+08 0 1.386294 49.280511 0.998921 \n",
|
|||
|
|
"1 -6.601150e+08 0 0.693147 0.000000 0.999640 \n",
|
|||
|
|
"2 -1.746460e+08 0 0.693147 0.000000 0.999640 \n",
|
|||
|
|
"3 -1.224480e+00 0 4.304065 2168.971331 0.976619 \n",
|
|||
|
|
"4 -1.334020e+08 0 0.693147 0.000000 0.999640 \n",
|
|||
|
|
"... ... ... ... ... ... \n",
|
|||
|
|
"6837 -1.446351e+00 0 5.361292 331.677297 0.925180 \n",
|
|||
|
|
"6838 -9.267095e-01 0 7.350516 201.071555 0.587770 \n",
|
|||
|
|
"6839 -8.199681e-01 0 5.402677 2217.940406 0.926619 \n",
|
|||
|
|
"6840 -6.107804e-01 0 10.228465 391347.475503 0.044604 \n",
|
|||
|
|
"6841 -1.030874e+00 0 10.384802 7572.830139 0.032374 \n",
|
|||
|
|
"\n",
|
|||
|
|
"[6842 rows x 13 columns]"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 6,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"df_client = pd.read_csv(\"client_behavior_clean.csv\")\n",
|
|||
|
|
"df_client"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 7,
|
|||
|
|
"id": "791d8a11-fa46-400b-bbf1-55c8c055f524",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"\n",
|
|||
|
|
"#external data projet-bdc-data /carmignac /Data Modélisation /Nav\n",
|
|||
|
|
"PATH_NAV = \"s3://projet-bdc-data/carmignac/Data Modélisation/Nav/NAV_Bench_data.csv\" #C’est la table de valorisation / performance du produit.\n",
|
|||
|
|
"PATH_RATES = \"s3://projet-bdc-data/carmignac/Data Modélisation/market data/esterRates.csv\"\n",
|
|||
|
|
"\n",
|
|||
|
|
"# optional competitors\n",
|
|||
|
|
"PATH_COMP_FLOWS = \"s3://projet-bdc-data/carmignac/Data Modélisation/competitors/daily_estimated_flows.csv\"\n",
|
|||
|
|
"PATH_COMP_PERF = \"s3://projet-bdc-data/carmignac/Data Modélisation/competitors/weekly_perf_full.csv\"\n",
|
|||
|
|
"PATH_PEERS = \"s3://projet-bdc-carmignac-g3/peers/CAD_peers.csv\""
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 8,
|
|||
|
|
"id": "415015e5-4cdc-4ea9-9c0e-701c58314873",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"flows: (2574461, 25)\n",
|
|||
|
|
"aum: (5516133, 21)\n",
|
|||
|
|
"nav: (623914, 5)\n",
|
|||
|
|
"rates: (2826, 2)\n",
|
|||
|
|
"comp_flows: (963003, 6)\n",
|
|||
|
|
"comp_perf: (2370192, 5)\n",
|
|||
|
|
"peers: (31, 12)\n"
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"df_nav = pd.read_csv(PATH_NAV, sep=\";\")\n",
|
|||
|
|
"df_rates = pd.read_csv(PATH_RATES,sep=\";\")\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_comp_flows = pd.read_csv(PATH_COMP_FLOWS,sep=\";\")\n",
|
|||
|
|
"df_comp_perf = pd.read_csv(PATH_COMP_PERF,sep=\";\")\n",
|
|||
|
|
"df_peers = pd.read_csv(PATH_PEERS,sep=\"|\")\n",
|
|||
|
|
"\n",
|
|||
|
|
"print(\"flows:\", df_flows.shape)\n",
|
|||
|
|
"print(\"aum:\", df_aum.shape)\n",
|
|||
|
|
"print(\"nav:\", df_nav.shape)\n",
|
|||
|
|
"print(\"rates:\", df_rates.shape)\n",
|
|||
|
|
"print(\"comp_flows:\", df_comp_flows.shape)\n",
|
|||
|
|
"print(\"comp_perf:\", df_comp_perf.shape)\n",
|
|||
|
|
"print(\"peers:\", df_peers.shape)\n",
|
|||
|
|
"\n",
|
|||
|
|
"\n",
|
|||
|
|
"#dbe bel ekhr un dataset avec une ligne pour : un client - un produit Carmignac - un mois "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 9,
|
|||
|
|
"id": "0a52ab96-1c47-4530-83d0-148e72f70d9b",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>Dat</th>\n",
|
|||
|
|
" <th>Isin</th>\n",
|
|||
|
|
" <th>Aum Eur</th>\n",
|
|||
|
|
" <th>Price (TF PartPrice)</th>\n",
|
|||
|
|
" <th>PriceBench</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>623909</th>\n",
|
|||
|
|
" <td>10/16/2025</td>\n",
|
|||
|
|
" <td>FR001400KIF0</td>\n",
|
|||
|
|
" <td>108424691,27</td>\n",
|
|||
|
|
" <td>148,73</td>\n",
|
|||
|
|
" <td>462,49002312</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>623910</th>\n",
|
|||
|
|
" <td>10/17/2025</td>\n",
|
|||
|
|
" <td>FR001400KIF0</td>\n",
|
|||
|
|
" <td>107947215,67</td>\n",
|
|||
|
|
" <td>148,08</td>\n",
|
|||
|
|
" <td>462,6446111</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>623911</th>\n",
|
|||
|
|
" <td>10/20/2025</td>\n",
|
|||
|
|
" <td>FR001400KIF0</td>\n",
|
|||
|
|
" <td>109597120,24</td>\n",
|
|||
|
|
" <td>150,34</td>\n",
|
|||
|
|
" <td>468,73416853</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>623912</th>\n",
|
|||
|
|
" <td>10/21/2025</td>\n",
|
|||
|
|
" <td>FR001400KIF0</td>\n",
|
|||
|
|
" <td>110216503,12</td>\n",
|
|||
|
|
" <td>151,19</td>\n",
|
|||
|
|
" <td>470,33788616</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>623913</th>\n",
|
|||
|
|
" <td>10/22/2025</td>\n",
|
|||
|
|
" <td>FR001400KIF0</td>\n",
|
|||
|
|
" <td>109692584,22</td>\n",
|
|||
|
|
" <td>150,47</td>\n",
|
|||
|
|
" <td>468,13202429</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" Dat Isin Aum Eur Price (TF PartPrice) \\\n",
|
|||
|
|
"623909 10/16/2025 FR001400KIF0 108424691,27 148,73 \n",
|
|||
|
|
"623910 10/17/2025 FR001400KIF0 107947215,67 148,08 \n",
|
|||
|
|
"623911 10/20/2025 FR001400KIF0 109597120,24 150,34 \n",
|
|||
|
|
"623912 10/21/2025 FR001400KIF0 110216503,12 151,19 \n",
|
|||
|
|
"623913 10/22/2025 FR001400KIF0 109692584,22 150,47 \n",
|
|||
|
|
"\n",
|
|||
|
|
" PriceBench \n",
|
|||
|
|
"623909 462,49002312 \n",
|
|||
|
|
"623910 462,6446111 \n",
|
|||
|
|
"623911 468,73416853 \n",
|
|||
|
|
"623912 470,33788616 \n",
|
|||
|
|
"623913 468,13202429 "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 9,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"df_nav.tail()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 10,
|
|||
|
|
"id": "e15c0a1d-d636-48f5-83ab-ff43b49b0e44",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>Date</th>\n",
|
|||
|
|
" <th>Yld to Maturity</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2821</th>\n",
|
|||
|
|
" <td>16/10/2025</td>\n",
|
|||
|
|
" <td>1.928</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2822</th>\n",
|
|||
|
|
" <td>17/10/2025</td>\n",
|
|||
|
|
" <td>1.928</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2823</th>\n",
|
|||
|
|
" <td>20/10/2025</td>\n",
|
|||
|
|
" <td>1.928</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2824</th>\n",
|
|||
|
|
" <td>21/10/2025</td>\n",
|
|||
|
|
" <td>1.927</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2825</th>\n",
|
|||
|
|
" <td>22/10/2025</td>\n",
|
|||
|
|
" <td>1.928</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" Date Yld to Maturity\n",
|
|||
|
|
"2821 16/10/2025 1.928\n",
|
|||
|
|
"2822 17/10/2025 1.928\n",
|
|||
|
|
"2823 20/10/2025 1.928\n",
|
|||
|
|
"2824 21/10/2025 1.927\n",
|
|||
|
|
"2825 22/10/2025 1.928"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 10,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"df_rates.tail() #Table de marché macro, ici probablement un taux de référence."
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 11,
|
|||
|
|
"id": "ede9c196-1d10-48fc-b99f-7369a2fb3d9b",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>shareClass_name</th>\n",
|
|||
|
|
" <th>SecId_MS</th>\n",
|
|||
|
|
" <th>ISIN</th>\n",
|
|||
|
|
" <th>FundId</th>\n",
|
|||
|
|
" <th>Date</th>\n",
|
|||
|
|
" <th>Estimated Fund-level Net Flow (Daily)</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>962998</th>\n",
|
|||
|
|
" <td>TM Lansdowne European Spec Sit I Acc GBP</td>\n",
|
|||
|
|
" <td>F00000VH4K</td>\n",
|
|||
|
|
" <td>GB00BTJRQ064</td>\n",
|
|||
|
|
" <td>FS0000BQP3</td>\n",
|
|||
|
|
" <td>2025-06-27</td>\n",
|
|||
|
|
" <td>183110.412</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>962999</th>\n",
|
|||
|
|
" <td>Waverton European Dividend Gr B GBP Inc</td>\n",
|
|||
|
|
" <td>F000011TLC</td>\n",
|
|||
|
|
" <td>IE00BF5KV626</td>\n",
|
|||
|
|
" <td>FS0000E90E</td>\n",
|
|||
|
|
" <td>2025-06-27</td>\n",
|
|||
|
|
" <td>16425.603</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>963000</th>\n",
|
|||
|
|
" <td>Premier Miton European Opports B Acc</td>\n",
|
|||
|
|
" <td>F00000WMCF</td>\n",
|
|||
|
|
" <td>GB00BZ2K2M84</td>\n",
|
|||
|
|
" <td>FS0000C8WZ</td>\n",
|
|||
|
|
" <td>2025-06-27</td>\n",
|
|||
|
|
" <td>-612606.416</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>963001</th>\n",
|
|||
|
|
" <td>Incrementum Active Commodity Fund R EUR</td>\n",
|
|||
|
|
" <td>F00000SVVR</td>\n",
|
|||
|
|
" <td>LI0226274319</td>\n",
|
|||
|
|
" <td>FS0000AMCV</td>\n",
|
|||
|
|
" <td>2025-06-27</td>\n",
|
|||
|
|
" <td>-5123.607</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>963002</th>\n",
|
|||
|
|
" <td>AXAWF Inflation Plus A Cap EUR</td>\n",
|
|||
|
|
" <td>F00001CSX2</td>\n",
|
|||
|
|
" <td>LU2257473269</td>\n",
|
|||
|
|
" <td>FS0000H62L</td>\n",
|
|||
|
|
" <td>2025-06-27</td>\n",
|
|||
|
|
" <td>393490.630</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" shareClass_name SecId_MS ISIN \\\n",
|
|||
|
|
"962998 TM Lansdowne European Spec Sit I Acc GBP F00000VH4K GB00BTJRQ064 \n",
|
|||
|
|
"962999 Waverton European Dividend Gr B GBP Inc F000011TLC IE00BF5KV626 \n",
|
|||
|
|
"963000 Premier Miton European Opports B Acc F00000WMCF GB00BZ2K2M84 \n",
|
|||
|
|
"963001 Incrementum Active Commodity Fund R EUR F00000SVVR LI0226274319 \n",
|
|||
|
|
"963002 AXAWF Inflation Plus A Cap EUR F00001CSX2 LU2257473269 \n",
|
|||
|
|
"\n",
|
|||
|
|
" FundId Date Estimated Fund-level Net Flow (Daily) \n",
|
|||
|
|
"962998 FS0000BQP3 2025-06-27 183110.412 \n",
|
|||
|
|
"962999 FS0000E90E 2025-06-27 16425.603 \n",
|
|||
|
|
"963000 FS0000C8WZ 2025-06-27 -612606.416 \n",
|
|||
|
|
"963001 FS0000AMCV 2025-06-27 -5123.607 \n",
|
|||
|
|
"963002 FS0000H62L 2025-06-27 393490.630 "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 11,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"df_comp_flows.tail()\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 12,
|
|||
|
|
"id": "71407c1d-dda2-4ec6-9df4-499d4502e560",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>Date</th>\n",
|
|||
|
|
" <th>perfPeriod</th>\n",
|
|||
|
|
" <th>shareClass_name</th>\n",
|
|||
|
|
" <th>return</th>\n",
|
|||
|
|
" <th>percentile</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2370187</th>\n",
|
|||
|
|
" <td>2015-12-30</td>\n",
|
|||
|
|
" <td>WeeklyRet</td>\n",
|
|||
|
|
" <td>BNP Paribas Emerging Eq Cl Eur C</td>\n",
|
|||
|
|
" <td>-1.623478</td>\n",
|
|||
|
|
" <td>83.0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2370188</th>\n",
|
|||
|
|
" <td>2015-12-30</td>\n",
|
|||
|
|
" <td>WeeklyRet</td>\n",
|
|||
|
|
" <td>Capital Group EM Debt (LUX) B</td>\n",
|
|||
|
|
" <td>-0.162338</td>\n",
|
|||
|
|
" <td>88.0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2370189</th>\n",
|
|||
|
|
" <td>2015-12-30</td>\n",
|
|||
|
|
" <td>WeeklyRet</td>\n",
|
|||
|
|
" <td>BGF Global Allocation A2 EUR Hedged</td>\n",
|
|||
|
|
" <td>0.387712</td>\n",
|
|||
|
|
" <td>44.0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2370190</th>\n",
|
|||
|
|
" <td>2015-12-30</td>\n",
|
|||
|
|
" <td>WeeklyRet</td>\n",
|
|||
|
|
" <td>Exane Funds 2 Exane Pleiade B EUR Acc</td>\n",
|
|||
|
|
" <td>0.082896</td>\n",
|
|||
|
|
" <td>60.0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2370191</th>\n",
|
|||
|
|
" <td>2015-12-30</td>\n",
|
|||
|
|
" <td>WeeklyRet</td>\n",
|
|||
|
|
" <td>Invesco Euro Short Term Bond A EUR Acc</td>\n",
|
|||
|
|
" <td>0.034302</td>\n",
|
|||
|
|
" <td>35.0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" Date perfPeriod shareClass_name \\\n",
|
|||
|
|
"2370187 2015-12-30 WeeklyRet BNP Paribas Emerging Eq Cl Eur C \n",
|
|||
|
|
"2370188 2015-12-30 WeeklyRet Capital Group EM Debt (LUX) B \n",
|
|||
|
|
"2370189 2015-12-30 WeeklyRet BGF Global Allocation A2 EUR Hedged \n",
|
|||
|
|
"2370190 2015-12-30 WeeklyRet Exane Funds 2 Exane Pleiade B EUR Acc \n",
|
|||
|
|
"2370191 2015-12-30 WeeklyRet Invesco Euro Short Term Bond A EUR Acc \n",
|
|||
|
|
"\n",
|
|||
|
|
" return percentile \n",
|
|||
|
|
"2370187 -1.623478 83.0 \n",
|
|||
|
|
"2370188 -0.162338 88.0 \n",
|
|||
|
|
"2370189 0.387712 44.0 \n",
|
|||
|
|
"2370190 0.082896 60.0 \n",
|
|||
|
|
"2370191 0.034302 35.0 "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 12,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"df_comp_perf.tail() #Performance des concurrents, avec rang relatif.\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 13,
|
|||
|
|
"id": "05b87839-dc25-4f0d-8bf8-f43ac8c932ee",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>Name</th>\n",
|
|||
|
|
" <th>ISIN</th>\n",
|
|||
|
|
" <th>SecId_MS</th>\n",
|
|||
|
|
" <th>FundId</th>\n",
|
|||
|
|
" <th>Global Broad Category Group</th>\n",
|
|||
|
|
" <th>Global Category</th>\n",
|
|||
|
|
" <th>Morningstar Category</th>\n",
|
|||
|
|
" <th>Index Fund</th>\n",
|
|||
|
|
" <th>Enhanced Index</th>\n",
|
|||
|
|
" <th>Inception Date</th>\n",
|
|||
|
|
" <th>Inception Date of Fund's Oldest Share Class</th>\n",
|
|||
|
|
" <th>Domicile</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>26</th>\n",
|
|||
|
|
" <td>Vontobel mtx EM Ldrs ex Chn S USD Acc</td>\n",
|
|||
|
|
" <td>LU2601939452</td>\n",
|
|||
|
|
" <td>F00001G9PT</td>\n",
|
|||
|
|
" <td>FS0000IAHL</td>\n",
|
|||
|
|
" <td>Equity</td>\n",
|
|||
|
|
" <td>Global Emerging Markets Equity</td>\n",
|
|||
|
|
" <td>EAA Fund Global Emerging Markets ex-China Equity</td>\n",
|
|||
|
|
" <td>No</td>\n",
|
|||
|
|
" <td>No</td>\n",
|
|||
|
|
" <td>2023-09-20</td>\n",
|
|||
|
|
" <td>2023-09-20</td>\n",
|
|||
|
|
" <td>Luxembourg</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>27</th>\n",
|
|||
|
|
" <td>PineBridge Asia exJapan SmCap Eq A</td>\n",
|
|||
|
|
" <td>IE00B12V2V27</td>\n",
|
|||
|
|
" <td>FOGBR05LNR</td>\n",
|
|||
|
|
" <td>FSGBR06C4W</td>\n",
|
|||
|
|
" <td>Equity</td>\n",
|
|||
|
|
" <td>Asia ex-Japan Equity</td>\n",
|
|||
|
|
" <td>EAA Fund Asia ex-Japan Small/Mid-Cap Equity</td>\n",
|
|||
|
|
" <td>No</td>\n",
|
|||
|
|
" <td>No</td>\n",
|
|||
|
|
" <td>2006-04-19</td>\n",
|
|||
|
|
" <td>1994-09-01</td>\n",
|
|||
|
|
" <td>Ireland</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>28</th>\n",
|
|||
|
|
" <td>abrdn-Asian Smaller Companies A Acc USD</td>\n",
|
|||
|
|
" <td>LU0231459107</td>\n",
|
|||
|
|
" <td>F0GBR06X7H</td>\n",
|
|||
|
|
" <td>FSGBR05GSY</td>\n",
|
|||
|
|
" <td>Equity</td>\n",
|
|||
|
|
" <td>Asia ex-Japan Equity</td>\n",
|
|||
|
|
" <td>EAA Fund Asia ex-Japan Small/Mid-Cap Equity</td>\n",
|
|||
|
|
" <td>No</td>\n",
|
|||
|
|
" <td>No</td>\n",
|
|||
|
|
" <td>2004-05-14</td>\n",
|
|||
|
|
" <td>2004-05-14</td>\n",
|
|||
|
|
" <td>Luxembourg</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>29</th>\n",
|
|||
|
|
" <td>Allianz Asian Small Cap Equity A EUR</td>\n",
|
|||
|
|
" <td>LU2420271673</td>\n",
|
|||
|
|
" <td>F00001DBJJ</td>\n",
|
|||
|
|
" <td>FS0000ASMB</td>\n",
|
|||
|
|
" <td>Equity</td>\n",
|
|||
|
|
" <td>Asia ex-Japan Equity</td>\n",
|
|||
|
|
" <td>EAA Fund Asia ex-Japan Small/Mid-Cap Equity</td>\n",
|
|||
|
|
" <td>No</td>\n",
|
|||
|
|
" <td>No</td>\n",
|
|||
|
|
" <td>2022-01-05</td>\n",
|
|||
|
|
" <td>2014-05-13</td>\n",
|
|||
|
|
" <td>Luxembourg</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>30</th>\n",
|
|||
|
|
" <td>Allianz Asia Ex China Equity A (USD)</td>\n",
|
|||
|
|
" <td>LU0348788117</td>\n",
|
|||
|
|
" <td>F000000F7V</td>\n",
|
|||
|
|
" <td>FSUSA08CND</td>\n",
|
|||
|
|
" <td>Equity</td>\n",
|
|||
|
|
" <td>Asia ex-Japan Equity</td>\n",
|
|||
|
|
" <td>EAA Fund Asia ex-Japan Equity</td>\n",
|
|||
|
|
" <td>No</td>\n",
|
|||
|
|
" <td>No</td>\n",
|
|||
|
|
" <td>2008-10-03</td>\n",
|
|||
|
|
" <td>2008-10-03</td>\n",
|
|||
|
|
" <td>Luxembourg</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" Name ISIN SecId_MS \\\n",
|
|||
|
|
"26 Vontobel mtx EM Ldrs ex Chn S USD Acc LU2601939452 F00001G9PT \n",
|
|||
|
|
"27 PineBridge Asia exJapan SmCap Eq A IE00B12V2V27 FOGBR05LNR \n",
|
|||
|
|
"28 abrdn-Asian Smaller Companies A Acc USD LU0231459107 F0GBR06X7H \n",
|
|||
|
|
"29 Allianz Asian Small Cap Equity A EUR LU2420271673 F00001DBJJ \n",
|
|||
|
|
"30 Allianz Asia Ex China Equity A (USD) LU0348788117 F000000F7V \n",
|
|||
|
|
"\n",
|
|||
|
|
" FundId Global Broad Category Group Global Category \\\n",
|
|||
|
|
"26 FS0000IAHL Equity Global Emerging Markets Equity \n",
|
|||
|
|
"27 FSGBR06C4W Equity Asia ex-Japan Equity \n",
|
|||
|
|
"28 FSGBR05GSY Equity Asia ex-Japan Equity \n",
|
|||
|
|
"29 FS0000ASMB Equity Asia ex-Japan Equity \n",
|
|||
|
|
"30 FSUSA08CND Equity Asia ex-Japan Equity \n",
|
|||
|
|
"\n",
|
|||
|
|
" Morningstar Category Index Fund \\\n",
|
|||
|
|
"26 EAA Fund Global Emerging Markets ex-China Equity No \n",
|
|||
|
|
"27 EAA Fund Asia ex-Japan Small/Mid-Cap Equity No \n",
|
|||
|
|
"28 EAA Fund Asia ex-Japan Small/Mid-Cap Equity No \n",
|
|||
|
|
"29 EAA Fund Asia ex-Japan Small/Mid-Cap Equity No \n",
|
|||
|
|
"30 EAA Fund Asia ex-Japan Equity No \n",
|
|||
|
|
"\n",
|
|||
|
|
" Enhanced Index Inception Date Inception Date of Fund's Oldest Share Class \\\n",
|
|||
|
|
"26 No 2023-09-20 2023-09-20 \n",
|
|||
|
|
"27 No 2006-04-19 1994-09-01 \n",
|
|||
|
|
"28 No 2004-05-14 2004-05-14 \n",
|
|||
|
|
"29 No 2022-01-05 2014-05-13 \n",
|
|||
|
|
"30 No 2008-10-03 2008-10-03 \n",
|
|||
|
|
"\n",
|
|||
|
|
" Domicile \n",
|
|||
|
|
"26 Luxembourg \n",
|
|||
|
|
"27 Ireland \n",
|
|||
|
|
"28 Luxembourg \n",
|
|||
|
|
"29 Luxembourg \n",
|
|||
|
|
"30 Luxembourg "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 13,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"df_peers.tail() #Ça permet de mesurer la pression concurrentielle."
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 14,
|
|||
|
|
"id": "9128c36b-33fd-44b2-a622-d3059f482c02",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"Index(['Unnamed: 0', 'Agreement - Code', 'Company - Id',\n",
|
|||
|
|
" 'Company - Ultimate Parent Id', 'Registrar Account - ID',\n",
|
|||
|
|
" 'Registrar Account - Region', 'RegistrarAccount - Country',\n",
|
|||
|
|
" 'Product - Asset Type', 'Product - Strategy', 'Product - Legal Status',\n",
|
|||
|
|
" 'Product - Is Dedie ?', 'Product - Fund', 'Product - Shareclass Type',\n",
|
|||
|
|
" 'Product - Shareclass Currency', 'Product - Isin',\n",
|
|||
|
|
" 'Centralisation Date', 'Quantity - Subscription',\n",
|
|||
|
|
" 'Quantity - Redemption', 'Quantity - NetFlows',\n",
|
|||
|
|
" 'Value Ccy - Subscription', 'Value Ccy - Redemption',\n",
|
|||
|
|
" 'Value Ccy - NetFlows', 'Value € - Subscription',\n",
|
|||
|
|
" 'Value € - Redemption', 'Value € - NetFlows'],\n",
|
|||
|
|
" dtype='object')\n",
|
|||
|
|
"Index(['Unnamed: 0.1', 'Unnamed: 0', 'Agreement - Code', 'Company - Id',\n",
|
|||
|
|
" 'Company - Ultimate Parent Id', 'Registrar Account - ID',\n",
|
|||
|
|
" 'Registrar Account - Region', 'RegistrarAccount - Country',\n",
|
|||
|
|
" 'Product - Asset Type', 'Product - Strategy', 'Product - Legal Status',\n",
|
|||
|
|
" 'Product - Is Dedie ?', 'Product - Fund', 'Product - Shareclass Type',\n",
|
|||
|
|
" 'Product - Shareclass Currency', 'Product - Isin',\n",
|
|||
|
|
" 'Centralisation Date', 'Quantity - AUM', 'Value - AUM CCY',\n",
|
|||
|
|
" 'Value - AUM €', 'repair_flag'],\n",
|
|||
|
|
" dtype='object')\n",
|
|||
|
|
"Index(['Registrar Account - ID', 'n_days', 'n_transactions', 'total_netflows',\n",
|
|||
|
|
" 'mean_flow', 'std_flow', 'total_subscription', 'total_redemption',\n",
|
|||
|
|
" 'churn_ratio', 'churn_flag', 'activity_score', 'flow_volatility',\n",
|
|||
|
|
" 'inertia_ratio'],\n",
|
|||
|
|
" dtype='object')\n",
|
|||
|
|
"Index(['Dat', 'Isin', 'Aum Eur', 'Price (TF PartPrice)', 'PriceBench'], dtype='object')\n",
|
|||
|
|
"Index(['Date', 'Yld to Maturity'], dtype='object')\n",
|
|||
|
|
"Index(['shareClass_name', 'SecId_MS', 'ISIN', 'FundId', 'Date',\n",
|
|||
|
|
" 'Estimated Fund-level Net Flow (Daily)'],\n",
|
|||
|
|
" dtype='object')\n",
|
|||
|
|
"Index(['Date', 'perfPeriod', 'shareClass_name', 'return', 'percentile'], dtype='object')\n",
|
|||
|
|
"Index(['Name', 'ISIN', 'SecId_MS', 'FundId', 'Global Broad Category Group',\n",
|
|||
|
|
" 'Global Category', 'Morningstar Category', 'Index Fund',\n",
|
|||
|
|
" 'Enhanced Index', 'Inception Date',\n",
|
|||
|
|
" 'Inception Date of Fund's Oldest Share Class', 'Domicile'],\n",
|
|||
|
|
" dtype='object')\n"
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"for d in [df_flows,df_aum,df_client,df_nav,df_rates,df_comp_flows,df_comp_perf,df_peers]:\n",
|
|||
|
|
" print (d.columns)"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 15,
|
|||
|
|
"id": "7e82983d-aaf3-40c1-9186-2cb13c6274d7",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"ID_COL = \"Registrar Account - ID\"\n",
|
|||
|
|
"ISIN_COL = \"Product - Isin\"\n",
|
|||
|
|
"\n",
|
|||
|
|
"FLOW_DATE_COL = \"Centralisation Date\"\n",
|
|||
|
|
"AUM_DATE_COL = \"Centralisation Date\"\n",
|
|||
|
|
"\n",
|
|||
|
|
"FLOW_QTY_COL = \"Quantity - NetFlows\"\n",
|
|||
|
|
"FLOW_SUB_COL = \"Quantity - Subscription\"\n",
|
|||
|
|
"FLOW_RED_COL = \"Quantity - Redemption\"\n",
|
|||
|
|
"\n",
|
|||
|
|
"AUM_QTY_COL = \"Quantity - AUM\"\n",
|
|||
|
|
"AUM_VAL_COL = \"Value - AUM €\"\n",
|
|||
|
|
"\n",
|
|||
|
|
"REGION_COL = \"Registrar Account - Region\"\n",
|
|||
|
|
"COUNTRY_COL = \"RegistrarAccount - Country\"\n",
|
|||
|
|
"\n",
|
|||
|
|
"NAV_DATE_COL = \"Dat\"\n",
|
|||
|
|
"NAV_ISIN_COL = \"Isin\"\n",
|
|||
|
|
"NAV_PRICE_COL = \"Price (TF PartPrice)\"\n",
|
|||
|
|
"NAV_BENCH_COL = \"PriceBench\"\n",
|
|||
|
|
"\n",
|
|||
|
|
"RATE_DATE_COL = \"Date\"\n",
|
|||
|
|
"RATE_VAL_COL = \"Yld to Maturity\""
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 16,
|
|||
|
|
"id": "6dd153e1-7e6f-47b7-81b1-c77fa763a087",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"for df, date_col in [\n",
|
|||
|
|
" (df_flows, FLOW_DATE_COL),\n",
|
|||
|
|
" (df_aum, AUM_DATE_COL),\n",
|
|||
|
|
" (df_nav, NAV_DATE_COL),\n",
|
|||
|
|
" (df_rates, RATE_DATE_COL),\n",
|
|||
|
|
"]:\n",
|
|||
|
|
" df[date_col] = pd.to_datetime(df[date_col], errors=\"coerce\")\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_flows[\"month\"] = df_flows[FLOW_DATE_COL].dt.to_period(\"M\").dt.to_timestamp()\n",
|
|||
|
|
"df_aum[\"month\"] = df_aum[AUM_DATE_COL].dt.to_period(\"M\").dt.to_timestamp()\n",
|
|||
|
|
"df_nav[\"month\"] = df_nav[NAV_DATE_COL].dt.to_period(\"M\").dt.to_timestamp()\n",
|
|||
|
|
"df_rates[\"month\"] = df_rates[RATE_DATE_COL].dt.to_period(\"M\").dt.to_timestamp()\n",
|
|||
|
|
"\n",
|
|||
|
|
"for col in [FLOW_QTY_COL, FLOW_SUB_COL, FLOW_RED_COL]:\n",
|
|||
|
|
" df_flows[col] = pd.to_numeric(df_flows[col], errors=\"coerce\")\n",
|
|||
|
|
"\n",
|
|||
|
|
"for col in [AUM_QTY_COL, AUM_VAL_COL]:\n",
|
|||
|
|
" df_aum[col] = pd.to_numeric(df_aum[col], errors=\"coerce\")\n",
|
|||
|
|
"\n",
|
|||
|
|
"for col in [NAV_PRICE_COL, NAV_BENCH_COL]:\n",
|
|||
|
|
" df_nav[col] = pd.to_numeric(df_nav[col], errors=\"coerce\")\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_rates[RATE_VAL_COL] = pd.to_numeric(df_rates[RATE_VAL_COL], errors=\"coerce\")\n",
|
|||
|
|
"\n",
|
|||
|
|
"for df, col in [(df_flows, ISIN_COL), (df_aum, ISIN_COL)]:\n",
|
|||
|
|
" df[col] = df[col].astype(str).str.strip()\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_nav[NAV_ISIN_COL] = df_nav[NAV_ISIN_COL].astype(str).str.strip()\n",
|
|||
|
|
"\n",
|
|||
|
|
"''' Pourquoi le mois ?\n",
|
|||
|
|
"Parce que :\n",
|
|||
|
|
"les flux journaliers sont trop bruités\n",
|
|||
|
|
"le churn et les comportements de portefeuille se lisent mieux au mois #le churn signifie qu’un client quitte le fonds\n",
|
|||
|
|
"la plupart des comportements d’allocation sont plus lisibles à cette fréquence'''"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 17,
|
|||
|
|
"id": "ac43bb83-5800-4000-af9f-8cd4cae9e9d5",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"(4906475, 18)\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>Registrar Account - ID</th>\n",
|
|||
|
|
" <th>Product - Isin</th>\n",
|
|||
|
|
" <th>month</th>\n",
|
|||
|
|
" <th>aum_qty</th>\n",
|
|||
|
|
" <th>aum_val</th>\n",
|
|||
|
|
" <th>region</th>\n",
|
|||
|
|
" <th>country</th>\n",
|
|||
|
|
" <th>net_flow_qty</th>\n",
|
|||
|
|
" <th>gross_flow_qty</th>\n",
|
|||
|
|
" <th>sub_qty</th>\n",
|
|||
|
|
" <th>red_qty</th>\n",
|
|||
|
|
" <th>n_tx</th>\n",
|
|||
|
|
" <th>region_flow</th>\n",
|
|||
|
|
" <th>country_flow</th>\n",
|
|||
|
|
" <th>active_rel_month</th>\n",
|
|||
|
|
" <th>holding_rel_month</th>\n",
|
|||
|
|
" <th>flow_to_aum_rel</th>\n",
|
|||
|
|
" <th>turnover_rel</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>8307</td>\n",
|
|||
|
|
" <td>LU0099161993</td>\n",
|
|||
|
|
" <td>2017-03-01</td>\n",
|
|||
|
|
" <td>200.0</td>\n",
|
|||
|
|
" <td>37836.00</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>-138.0</td>\n",
|
|||
|
|
" <td>138.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>-138.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>-6.900000e-01</td>\n",
|
|||
|
|
" <td>6.900000e-01</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>8307</td>\n",
|
|||
|
|
" <td>LU0099161993</td>\n",
|
|||
|
|
" <td>2020-08-01</td>\n",
|
|||
|
|
" <td>300.0</td>\n",
|
|||
|
|
" <td>75603.00</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>100.0</td>\n",
|
|||
|
|
" <td>100.0</td>\n",
|
|||
|
|
" <td>100.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>3.333333e-01</td>\n",
|
|||
|
|
" <td>3.333333e-01</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2</th>\n",
|
|||
|
|
" <td>8307</td>\n",
|
|||
|
|
" <td>LU0099161993</td>\n",
|
|||
|
|
" <td>2024-05-01</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>-100.0</td>\n",
|
|||
|
|
" <td>100.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>-100.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>-1.000000e+11</td>\n",
|
|||
|
|
" <td>1.000000e+11</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3</th>\n",
|
|||
|
|
" <td>8307</td>\n",
|
|||
|
|
" <td>LU0164455502</td>\n",
|
|||
|
|
" <td>2015-07-01</td>\n",
|
|||
|
|
" <td>786.0</td>\n",
|
|||
|
|
" <td>219144.66</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>-35.0</td>\n",
|
|||
|
|
" <td>35.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>-35.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>-4.452926e-02</td>\n",
|
|||
|
|
" <td>4.452926e-02</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4</th>\n",
|
|||
|
|
" <td>8307</td>\n",
|
|||
|
|
" <td>LU0164455502</td>\n",
|
|||
|
|
" <td>2015-10-01</td>\n",
|
|||
|
|
" <td>886.0</td>\n",
|
|||
|
|
" <td>231538.38</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>100.0</td>\n",
|
|||
|
|
" <td>100.0</td>\n",
|
|||
|
|
" <td>100.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1.128668e-01</td>\n",
|
|||
|
|
" <td>1.128668e-01</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" Registrar Account - ID Product - Isin month aum_qty aum_val \\\n",
|
|||
|
|
"0 8307 LU0099161993 2017-03-01 200.0 37836.00 \n",
|
|||
|
|
"1 8307 LU0099161993 2020-08-01 300.0 75603.00 \n",
|
|||
|
|
"2 8307 LU0099161993 2024-05-01 0.0 0.00 \n",
|
|||
|
|
"3 8307 LU0164455502 2015-07-01 786.0 219144.66 \n",
|
|||
|
|
"4 8307 LU0164455502 2015-10-01 886.0 231538.38 \n",
|
|||
|
|
"\n",
|
|||
|
|
" region country net_flow_qty gross_flow_qty sub_qty red_qty \\\n",
|
|||
|
|
"0 SWITZERLAND SWITZERLAND -138.0 138.0 0.0 -138.0 \n",
|
|||
|
|
"1 SWITZERLAND SWITZERLAND 100.0 100.0 100.0 0.0 \n",
|
|||
|
|
"2 SWITZERLAND SWITZERLAND -100.0 100.0 0.0 -100.0 \n",
|
|||
|
|
"3 SWITZERLAND SWITZERLAND -35.0 35.0 0.0 -35.0 \n",
|
|||
|
|
"4 SWITZERLAND SWITZERLAND 100.0 100.0 100.0 0.0 \n",
|
|||
|
|
"\n",
|
|||
|
|
" n_tx region_flow country_flow active_rel_month holding_rel_month \\\n",
|
|||
|
|
"0 1.0 SWITZERLAND SWITZERLAND 1 1 \n",
|
|||
|
|
"1 1.0 SWITZERLAND SWITZERLAND 1 1 \n",
|
|||
|
|
"2 1.0 SWITZERLAND SWITZERLAND 1 0 \n",
|
|||
|
|
"3 1.0 SWITZERLAND SWITZERLAND 1 1 \n",
|
|||
|
|
"4 1.0 SWITZERLAND SWITZERLAND 1 1 \n",
|
|||
|
|
"\n",
|
|||
|
|
" flow_to_aum_rel turnover_rel \n",
|
|||
|
|
"0 -6.900000e-01 6.900000e-01 \n",
|
|||
|
|
"1 3.333333e-01 3.333333e-01 \n",
|
|||
|
|
"2 -1.000000e+11 1.000000e+11 \n",
|
|||
|
|
"3 -4.452926e-02 4.452926e-02 \n",
|
|||
|
|
"4 1.128668e-01 1.128668e-01 "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 17,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"'''On veut s’assurer que l’univers des produits Carmignac détenus par les clients est bien cohérent avec l’univers des NAV \n",
|
|||
|
|
"utilisés pour calculer les performances.'''\n",
|
|||
|
|
"\n",
|
|||
|
|
"#pour merge flux et aum c est un full\n",
|
|||
|
|
"'''\n",
|
|||
|
|
"Si un mois existe :\n",
|
|||
|
|
"dans les flux mais pas dans les encours → la clé est gardée\n",
|
|||
|
|
"dans les encours mais pas dans les flux → la clé est gardée\n",
|
|||
|
|
"dans les deux → une seule ligne de clé\n",
|
|||
|
|
"👉 C’est donc une logique proche d’un full outer join, mais construite manuellement.\n",
|
|||
|
|
"'''\n",
|
|||
|
|
"df_flows_rel_m = (\n",
|
|||
|
|
" df_flows\n",
|
|||
|
|
" .dropna(subset=[ID_COL, ISIN_COL, \"month\"])\n",
|
|||
|
|
" .assign(\n",
|
|||
|
|
" gross_flow_qty=lambda x: x[FLOW_QTY_COL].abs(),\n",
|
|||
|
|
" sub_qty=lambda x: x[FLOW_SUB_COL].fillna(0),\n",
|
|||
|
|
" red_qty=lambda x: x[FLOW_RED_COL].fillna(0)\n",
|
|||
|
|
" )\n",
|
|||
|
|
" .groupby([ID_COL, ISIN_COL, \"month\"], as_index=False)\n",
|
|||
|
|
" .agg(\n",
|
|||
|
|
" net_flow_qty=(FLOW_QTY_COL, \"sum\"),\n",
|
|||
|
|
" gross_flow_qty=(\"gross_flow_qty\", \"sum\"),\n",
|
|||
|
|
" sub_qty=(\"sub_qty\", \"sum\"),\n",
|
|||
|
|
" red_qty=(\"red_qty\", \"sum\"),\n",
|
|||
|
|
" n_tx=(FLOW_QTY_COL, \"size\"),\n",
|
|||
|
|
" region=(REGION_COL, \"last\"),\n",
|
|||
|
|
" country=(COUNTRY_COL, \"last\")\n",
|
|||
|
|
" )\n",
|
|||
|
|
")\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_aum_rel_m = (\n",
|
|||
|
|
" df_aum\n",
|
|||
|
|
" .dropna(subset=[ID_COL, ISIN_COL, \"month\"])\n",
|
|||
|
|
" .groupby([ID_COL, ISIN_COL, \"month\"], as_index=False)\n",
|
|||
|
|
" .agg(\n",
|
|||
|
|
" aum_qty=(AUM_QTY_COL, \"sum\"),\n",
|
|||
|
|
" aum_val=(AUM_VAL_COL, \"sum\"),\n",
|
|||
|
|
" region=(REGION_COL, \"last\"),\n",
|
|||
|
|
" country=(COUNTRY_COL, \"last\")\n",
|
|||
|
|
" )\n",
|
|||
|
|
")\n",
|
|||
|
|
"\n",
|
|||
|
|
"keys = pd.concat([\n",
|
|||
|
|
" df_flows_rel_m[[ID_COL, ISIN_COL, \"month\"]],\n",
|
|||
|
|
" df_aum_rel_m[[ID_COL, ISIN_COL, \"month\"]]\n",
|
|||
|
|
"]).drop_duplicates()\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_rel_m = (\n",
|
|||
|
|
" keys\n",
|
|||
|
|
" .merge(df_aum_rel_m, on=[ID_COL, ISIN_COL, \"month\"], how=\"left\", suffixes=(\"\", \"_aum\"))\n",
|
|||
|
|
" .merge(df_flows_rel_m, on=[ID_COL, ISIN_COL, \"month\"], how=\"left\", suffixes=(\"\", \"_flow\"))\n",
|
|||
|
|
")\n",
|
|||
|
|
"\n",
|
|||
|
|
"for c in [\"aum_qty\", \"aum_val\", \"net_flow_qty\", \"gross_flow_qty\", \"sub_qty\", \"red_qty\", \"n_tx\"]:\n",
|
|||
|
|
" df_rel_m[c] = df_rel_m[c].fillna(0)\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_rel_m[\"region\"] = df_rel_m[\"region\"].fillna(df_rel_m.get(\"region_flow\"))\n",
|
|||
|
|
"df_rel_m[\"country\"] = df_rel_m[\"country\"].fillna(df_rel_m.get(\"country_flow\"))\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_rel_m[\"active_rel_month\"] = (df_rel_m[\"gross_flow_qty\"] > 0).astype(int)\n",
|
|||
|
|
"df_rel_m[\"holding_rel_month\"] = (df_rel_m[\"aum_qty\"] > 0).astype(int)\n",
|
|||
|
|
"df_rel_m[\"flow_to_aum_rel\"] = df_rel_m[\"net_flow_qty\"] / (df_rel_m[\"aum_qty\"].abs() + EPS)\n",
|
|||
|
|
"df_rel_m[\"turnover_rel\"] = df_rel_m[\"gross_flow_qty\"] / (df_rel_m[\"aum_qty\"].abs() + EPS)\n",
|
|||
|
|
"\n",
|
|||
|
|
"print(df_rel_m.shape)\n",
|
|||
|
|
"df_rel_m.head()\n",
|
|||
|
|
"\n",
|
|||
|
|
"\n",
|
|||
|
|
"'''\n",
|
|||
|
|
"On agrège séparément :\n",
|
|||
|
|
"les flows au niveau client-produit-mois\n",
|
|||
|
|
"les AUM au niveau client-produit-mois\n",
|
|||
|
|
"\n",
|
|||
|
|
"Puis on les fusionne.\n",
|
|||
|
|
"\n",
|
|||
|
|
"Datasets créés : df_flows_rel_m\n",
|
|||
|
|
"Table des transactions mensuelles au niveau : Registrar Account - ID × Product - Isin × month'''"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 18,
|
|||
|
|
"id": "2597a326-88f7-493f-830b-31826112eefa",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>Product - Isin</th>\n",
|
|||
|
|
" <th>month</th>\n",
|
|||
|
|
" <th>ret_fund_m</th>\n",
|
|||
|
|
" <th>ret_bench_m</th>\n",
|
|||
|
|
" <th>active_return_m</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>617756</th>\n",
|
|||
|
|
" <td>FR0007486709</td>\n",
|
|||
|
|
" <td>2012-11-01</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>613737</th>\n",
|
|||
|
|
" <td>FR0010135103</td>\n",
|
|||
|
|
" <td>2010-03-01</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>613810</th>\n",
|
|||
|
|
" <td>FR0010135103</td>\n",
|
|||
|
|
" <td>2010-06-01</td>\n",
|
|||
|
|
" <td>0.070565</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>614192</th>\n",
|
|||
|
|
" <td>FR0010135103</td>\n",
|
|||
|
|
" <td>2011-12-01</td>\n",
|
|||
|
|
" <td>-0.024482</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>614258</th>\n",
|
|||
|
|
" <td>FR0010135103</td>\n",
|
|||
|
|
" <td>2012-03-01</td>\n",
|
|||
|
|
" <td>0.028958</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" Product - Isin month ret_fund_m ret_bench_m active_return_m\n",
|
|||
|
|
"617756 FR0007486709 2012-11-01 NaN NaN NaN\n",
|
|||
|
|
"613737 FR0010135103 2010-03-01 NaN NaN NaN\n",
|
|||
|
|
"613810 FR0010135103 2010-06-01 0.070565 NaN NaN\n",
|
|||
|
|
"614192 FR0010135103 2011-12-01 -0.024482 NaN NaN\n",
|
|||
|
|
"614258 FR0010135103 2012-03-01 0.028958 NaN NaN"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 18,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"df_nav_m = (\n",
|
|||
|
|
" df_nav\n",
|
|||
|
|
" .dropna(subset=[NAV_ISIN_COL, \"month\", NAV_PRICE_COL])\n",
|
|||
|
|
" .sort_values([NAV_ISIN_COL, \"month\"])\n",
|
|||
|
|
" .groupby([NAV_ISIN_COL, \"month\"], as_index=False)\n",
|
|||
|
|
" .tail(1)\n",
|
|||
|
|
" .copy()\n",
|
|||
|
|
")\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_nav_m[\"ret_fund_m\"] = df_nav_m.groupby(NAV_ISIN_COL)[NAV_PRICE_COL].pct_change()\n",
|
|||
|
|
"df_nav_m[\"ret_bench_m\"] = df_nav_m.groupby(NAV_ISIN_COL)[NAV_BENCH_COL].pct_change()\n",
|
|||
|
|
"df_nav_m[\"active_return_m\"] = df_nav_m[\"ret_fund_m\"] - df_nav_m[\"ret_bench_m\"]\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_nav_m = df_nav_m.rename(columns={NAV_ISIN_COL: ISIN_COL})\n",
|
|||
|
|
"df_nav_m = df_nav_m[[ISIN_COL, \"month\", \"ret_fund_m\", \"ret_bench_m\", \"active_return_m\"]]\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_nav_m.head()\n",
|
|||
|
|
"#on agrège au niveau mensuel en prenant la dernière observation disponible du mois. pour nav et rates "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 19,
|
|||
|
|
"id": "73cb228a-4c21-4407-a3f5-526c4b88639f",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>month</th>\n",
|
|||
|
|
" <th>Yld to Maturity</th>\n",
|
|||
|
|
" <th>delta_rate_m</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>2014-12-01</td>\n",
|
|||
|
|
" <td>0.144</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>22</th>\n",
|
|||
|
|
" <td>2015-01-01</td>\n",
|
|||
|
|
" <td>0.086</td>\n",
|
|||
|
|
" <td>-0.058</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>43</th>\n",
|
|||
|
|
" <td>2015-02-01</td>\n",
|
|||
|
|
" <td>0.064</td>\n",
|
|||
|
|
" <td>-0.022</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>65</th>\n",
|
|||
|
|
" <td>2015-03-01</td>\n",
|
|||
|
|
" <td>0.050</td>\n",
|
|||
|
|
" <td>-0.014</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>86</th>\n",
|
|||
|
|
" <td>2015-04-01</td>\n",
|
|||
|
|
" <td>-0.027</td>\n",
|
|||
|
|
" <td>-0.077</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" month Yld to Maturity delta_rate_m\n",
|
|||
|
|
"0 2014-12-01 0.144 NaN\n",
|
|||
|
|
"22 2015-01-01 0.086 -0.058\n",
|
|||
|
|
"43 2015-02-01 0.064 -0.022\n",
|
|||
|
|
"65 2015-03-01 0.050 -0.014\n",
|
|||
|
|
"86 2015-04-01 -0.027 -0.077"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 19,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"df_rates_m = (\n",
|
|||
|
|
" df_rates\n",
|
|||
|
|
" .dropna(subset=[\"month\", RATE_VAL_COL])\n",
|
|||
|
|
" .sort_values(RATE_DATE_COL)\n",
|
|||
|
|
" .groupby(\"month\", as_index=False)\n",
|
|||
|
|
" .tail(1)\n",
|
|||
|
|
" .copy()\n",
|
|||
|
|
")\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_rates_m[\"delta_rate_m\"] = df_rates_m[RATE_VAL_COL].diff()\n",
|
|||
|
|
"df_rates_m = df_rates_m[[\"month\", RATE_VAL_COL, \"delta_rate_m\"]]\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_rates_m.head()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 20,
|
|||
|
|
"id": "1e1f0fa9-9c62-4a5e-8ee1-2605c76fb80a",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>Registrar Account - ID</th>\n",
|
|||
|
|
" <th>Product - Isin</th>\n",
|
|||
|
|
" <th>month</th>\n",
|
|||
|
|
" <th>aum_qty</th>\n",
|
|||
|
|
" <th>aum_val</th>\n",
|
|||
|
|
" <th>region</th>\n",
|
|||
|
|
" <th>country</th>\n",
|
|||
|
|
" <th>net_flow_qty</th>\n",
|
|||
|
|
" <th>gross_flow_qty</th>\n",
|
|||
|
|
" <th>sub_qty</th>\n",
|
|||
|
|
" <th>red_qty</th>\n",
|
|||
|
|
" <th>n_tx</th>\n",
|
|||
|
|
" <th>region_flow</th>\n",
|
|||
|
|
" <th>country_flow</th>\n",
|
|||
|
|
" <th>active_rel_month</th>\n",
|
|||
|
|
" <th>holding_rel_month</th>\n",
|
|||
|
|
" <th>flow_to_aum_rel</th>\n",
|
|||
|
|
" <th>turnover_rel</th>\n",
|
|||
|
|
" <th>ret_fund_m</th>\n",
|
|||
|
|
" <th>ret_bench_m</th>\n",
|
|||
|
|
" <th>active_return_m</th>\n",
|
|||
|
|
" <th>delta_rate_m</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>8307</td>\n",
|
|||
|
|
" <td>LU0099161993</td>\n",
|
|||
|
|
" <td>2017-03-01</td>\n",
|
|||
|
|
" <td>200.0</td>\n",
|
|||
|
|
" <td>37836.00</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>-138.0</td>\n",
|
|||
|
|
" <td>138.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>-138.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>-6.900000e-01</td>\n",
|
|||
|
|
" <td>6.900000e-01</td>\n",
|
|||
|
|
" <td>0.175000</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>-0.010</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>8307</td>\n",
|
|||
|
|
" <td>LU0099161993</td>\n",
|
|||
|
|
" <td>2020-08-01</td>\n",
|
|||
|
|
" <td>300.0</td>\n",
|
|||
|
|
" <td>75603.00</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>100.0</td>\n",
|
|||
|
|
" <td>100.0</td>\n",
|
|||
|
|
" <td>100.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>3.333333e-01</td>\n",
|
|||
|
|
" <td>3.333333e-01</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2</th>\n",
|
|||
|
|
" <td>8307</td>\n",
|
|||
|
|
" <td>LU0099161993</td>\n",
|
|||
|
|
" <td>2024-05-01</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>-100.0</td>\n",
|
|||
|
|
" <td>100.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>-100.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>-1.000000e+11</td>\n",
|
|||
|
|
" <td>1.000000e+11</td>\n",
|
|||
|
|
" <td>0.085809</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.004</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3</th>\n",
|
|||
|
|
" <td>8307</td>\n",
|
|||
|
|
" <td>LU0164455502</td>\n",
|
|||
|
|
" <td>2015-07-01</td>\n",
|
|||
|
|
" <td>786.0</td>\n",
|
|||
|
|
" <td>219144.66</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>-35.0</td>\n",
|
|||
|
|
" <td>35.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>-35.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>-4.452926e-02</td>\n",
|
|||
|
|
" <td>4.452926e-02</td>\n",
|
|||
|
|
" <td>-0.054839</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>-0.042</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4</th>\n",
|
|||
|
|
" <td>8307</td>\n",
|
|||
|
|
" <td>LU0164455502</td>\n",
|
|||
|
|
" <td>2015-10-01</td>\n",
|
|||
|
|
" <td>886.0</td>\n",
|
|||
|
|
" <td>231538.38</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>100.0</td>\n",
|
|||
|
|
" <td>100.0</td>\n",
|
|||
|
|
" <td>100.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1.128668e-01</td>\n",
|
|||
|
|
" <td>1.128668e-01</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>-0.007</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" Registrar Account - ID Product - Isin month aum_qty aum_val \\\n",
|
|||
|
|
"0 8307 LU0099161993 2017-03-01 200.0 37836.00 \n",
|
|||
|
|
"1 8307 LU0099161993 2020-08-01 300.0 75603.00 \n",
|
|||
|
|
"2 8307 LU0099161993 2024-05-01 0.0 0.00 \n",
|
|||
|
|
"3 8307 LU0164455502 2015-07-01 786.0 219144.66 \n",
|
|||
|
|
"4 8307 LU0164455502 2015-10-01 886.0 231538.38 \n",
|
|||
|
|
"\n",
|
|||
|
|
" region country net_flow_qty gross_flow_qty sub_qty red_qty \\\n",
|
|||
|
|
"0 SWITZERLAND SWITZERLAND -138.0 138.0 0.0 -138.0 \n",
|
|||
|
|
"1 SWITZERLAND SWITZERLAND 100.0 100.0 100.0 0.0 \n",
|
|||
|
|
"2 SWITZERLAND SWITZERLAND -100.0 100.0 0.0 -100.0 \n",
|
|||
|
|
"3 SWITZERLAND SWITZERLAND -35.0 35.0 0.0 -35.0 \n",
|
|||
|
|
"4 SWITZERLAND SWITZERLAND 100.0 100.0 100.0 0.0 \n",
|
|||
|
|
"\n",
|
|||
|
|
" n_tx region_flow country_flow active_rel_month holding_rel_month \\\n",
|
|||
|
|
"0 1.0 SWITZERLAND SWITZERLAND 1 1 \n",
|
|||
|
|
"1 1.0 SWITZERLAND SWITZERLAND 1 1 \n",
|
|||
|
|
"2 1.0 SWITZERLAND SWITZERLAND 1 0 \n",
|
|||
|
|
"3 1.0 SWITZERLAND SWITZERLAND 1 1 \n",
|
|||
|
|
"4 1.0 SWITZERLAND SWITZERLAND 1 1 \n",
|
|||
|
|
"\n",
|
|||
|
|
" flow_to_aum_rel turnover_rel ret_fund_m ret_bench_m active_return_m \\\n",
|
|||
|
|
"0 -6.900000e-01 6.900000e-01 0.175000 0.0 0.0 \n",
|
|||
|
|
"1 3.333333e-01 3.333333e-01 0.000000 0.0 0.0 \n",
|
|||
|
|
"2 -1.000000e+11 1.000000e+11 0.085809 0.0 0.0 \n",
|
|||
|
|
"3 -4.452926e-02 4.452926e-02 -0.054839 0.0 0.0 \n",
|
|||
|
|
"4 1.128668e-01 1.128668e-01 0.000000 0.0 0.0 \n",
|
|||
|
|
"\n",
|
|||
|
|
" delta_rate_m \n",
|
|||
|
|
"0 -0.010 \n",
|
|||
|
|
"1 0.000 \n",
|
|||
|
|
"2 0.004 \n",
|
|||
|
|
"3 -0.042 \n",
|
|||
|
|
"4 -0.007 "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 20,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"df_rel_m = df_rel_m.merge(\n",
|
|||
|
|
" df_nav_m,\n",
|
|||
|
|
" on=[ISIN_COL, \"month\"],\n",
|
|||
|
|
" how=\"left\"\n",
|
|||
|
|
")\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_rel_m = df_rel_m.merge(\n",
|
|||
|
|
" df_rates_m[[\"month\", \"delta_rate_m\"]],\n",
|
|||
|
|
" on=\"month\",\n",
|
|||
|
|
" how=\"left\"\n",
|
|||
|
|
")\n",
|
|||
|
|
"\n",
|
|||
|
|
"for c in [\"ret_fund_m\", \"ret_bench_m\", \"active_return_m\", \"delta_rate_m\"]:\n",
|
|||
|
|
" df_rel_m[c] = df_rel_m[c].fillna(0)\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_rel_m.head()\n",
|
|||
|
|
"\n",
|
|||
|
|
"'''\n",
|
|||
|
|
"Créer un dataset complet contenant : fsionner ala left uaane hasab rel m shufyo bkhdu inter\n",
|
|||
|
|
"client + produit + performance + environnement macro.'''"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 21,
|
|||
|
|
"id": "41a4ac43-9035-46f3-8cba-5ba0d88ec98a",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"def weighted_mean(x, w):\n",
|
|||
|
|
" x = np.asarray(x, dtype=float)\n",
|
|||
|
|
" w = np.asarray(w, dtype=float)\n",
|
|||
|
|
" mask = np.isfinite(x) & np.isfinite(w) & (w >= 0)\n",
|
|||
|
|
" if mask.sum() == 0 or w[mask].sum() == 0:\n",
|
|||
|
|
" return np.nan\n",
|
|||
|
|
" return np.average(x[mask], weights=w[mask])\n",
|
|||
|
|
"\n",
|
|||
|
|
"def hhi_from_weights(w):\n",
|
|||
|
|
" w = np.asarray(w, dtype=float)\n",
|
|||
|
|
" w = np.clip(w, 0, None)\n",
|
|||
|
|
" s = w.sum()\n",
|
|||
|
|
" if s <= 0:\n",
|
|||
|
|
" return np.nan\n",
|
|||
|
|
" p = w / s\n",
|
|||
|
|
" return np.sum(p**2)\n",
|
|||
|
|
"\n",
|
|||
|
|
"def compute_trend(y):\n",
|
|||
|
|
" y = np.asarray(y, dtype=float)\n",
|
|||
|
|
" if len(y) < 4:\n",
|
|||
|
|
" return np.nan\n",
|
|||
|
|
" x = np.arange(len(y)).reshape(-1, 1)\n",
|
|||
|
|
" mask = np.isfinite(y)\n",
|
|||
|
|
" if mask.sum() < 4:\n",
|
|||
|
|
" return np.nan\n",
|
|||
|
|
" reg = LinearRegression().fit(x[mask], y[mask])\n",
|
|||
|
|
" return reg.coef_[0]\n",
|
|||
|
|
"\n",
|
|||
|
|
"def compute_beta(y, x):\n",
|
|||
|
|
" y = np.asarray(y, dtype=float)\n",
|
|||
|
|
" x = np.asarray(x, dtype=float)\n",
|
|||
|
|
" mask = np.isfinite(y) & np.isfinite(x)\n",
|
|||
|
|
" if mask.sum() < 6:\n",
|
|||
|
|
" return np.nan\n",
|
|||
|
|
" reg = LinearRegression().fit(x[mask].reshape(-1, 1), y[mask])\n",
|
|||
|
|
" return reg.coef_[0]"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 34,
|
|||
|
|
"id": "79facbea-b77c-4cf9-95f7-526e1dedf9b0",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"(1002344, 21)\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>Registrar Account - ID</th>\n",
|
|||
|
|
" <th>month</th>\n",
|
|||
|
|
" <th>aum_qty</th>\n",
|
|||
|
|
" <th>aum_val</th>\n",
|
|||
|
|
" <th>net_flow_qty</th>\n",
|
|||
|
|
" <th>gross_flow_qty</th>\n",
|
|||
|
|
" <th>sub_qty</th>\n",
|
|||
|
|
" <th>red_qty</th>\n",
|
|||
|
|
" <th>n_tx</th>\n",
|
|||
|
|
" <th>n_isin_held</th>\n",
|
|||
|
|
" <th>n_isin_active</th>\n",
|
|||
|
|
" <th>delta_rate_m</th>\n",
|
|||
|
|
" <th>region</th>\n",
|
|||
|
|
" <th>country</th>\n",
|
|||
|
|
" <th>active_month</th>\n",
|
|||
|
|
" <th>flow_to_aum_m</th>\n",
|
|||
|
|
" <th>turnover_m</th>\n",
|
|||
|
|
" <th>sub_share_m</th>\n",
|
|||
|
|
" <th>red_share_m</th>\n",
|
|||
|
|
" <th>aum_peak_to_date</th>\n",
|
|||
|
|
" <th>aum_drawdown</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>7905</td>\n",
|
|||
|
|
" <td>2015-01-01</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>-0.058</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>7905</td>\n",
|
|||
|
|
" <td>2015-02-01</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>-0.022</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2</th>\n",
|
|||
|
|
" <td>7905</td>\n",
|
|||
|
|
" <td>2015-03-01</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>-0.014</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3</th>\n",
|
|||
|
|
" <td>7905</td>\n",
|
|||
|
|
" <td>2015-04-01</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>-0.077</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4</th>\n",
|
|||
|
|
" <td>7905</td>\n",
|
|||
|
|
" <td>2015-05-01</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>-0.053</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" Registrar Account - ID month aum_qty aum_val net_flow_qty \\\n",
|
|||
|
|
"0 7905 2015-01-01 0.0 0.0 0.0 \n",
|
|||
|
|
"1 7905 2015-02-01 0.0 0.0 0.0 \n",
|
|||
|
|
"2 7905 2015-03-01 0.0 0.0 0.0 \n",
|
|||
|
|
"3 7905 2015-04-01 0.0 0.0 0.0 \n",
|
|||
|
|
"4 7905 2015-05-01 0.0 0.0 0.0 \n",
|
|||
|
|
"\n",
|
|||
|
|
" gross_flow_qty sub_qty red_qty n_tx n_isin_held n_isin_active \\\n",
|
|||
|
|
"0 0.0 0.0 0.0 0.0 0 0 \n",
|
|||
|
|
"1 0.0 0.0 0.0 0.0 0 0 \n",
|
|||
|
|
"2 0.0 0.0 0.0 0.0 0 0 \n",
|
|||
|
|
"3 0.0 0.0 0.0 0.0 0 0 \n",
|
|||
|
|
"4 0.0 0.0 0.0 0.0 0 0 \n",
|
|||
|
|
"\n",
|
|||
|
|
" delta_rate_m region country active_month flow_to_aum_m \\\n",
|
|||
|
|
"0 -0.058 LUXEMBOURG LUXEMBOURG 0 0.0 \n",
|
|||
|
|
"1 -0.022 LUXEMBOURG LUXEMBOURG 0 0.0 \n",
|
|||
|
|
"2 -0.014 LUXEMBOURG LUXEMBOURG 0 0.0 \n",
|
|||
|
|
"3 -0.077 LUXEMBOURG LUXEMBOURG 0 0.0 \n",
|
|||
|
|
"4 -0.053 LUXEMBOURG LUXEMBOURG 0 0.0 \n",
|
|||
|
|
"\n",
|
|||
|
|
" turnover_m sub_share_m red_share_m aum_peak_to_date aum_drawdown \n",
|
|||
|
|
"0 0.0 0.0 0.0 0.0 1.0 \n",
|
|||
|
|
"1 0.0 0.0 0.0 0.0 1.0 \n",
|
|||
|
|
"2 0.0 0.0 0.0 0.0 1.0 \n",
|
|||
|
|
"3 0.0 0.0 0.0 0.0 1.0 \n",
|
|||
|
|
"4 0.0 0.0 0.0 0.0 1.0 "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 34,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"# =========================\n",
|
|||
|
|
"# ULTRA LIGHT VERSION\n",
|
|||
|
|
"# =========================\n",
|
|||
|
|
"\n",
|
|||
|
|
"tmp = df_rel_m.copy()\n",
|
|||
|
|
"tmp[\"isin_held_flag\"] = (tmp[\"aum_qty\"] > 0).astype(int)\n",
|
|||
|
|
"tmp[\"isin_active_flag\"] = (tmp[\"gross_flow_qty\"] > 0).astype(int)\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_month = (\n",
|
|||
|
|
" tmp.groupby([ID_COL, \"month\"], as_index=False)\n",
|
|||
|
|
" .agg(\n",
|
|||
|
|
" aum_qty=(\"aum_qty\", \"sum\"),\n",
|
|||
|
|
" aum_val=(\"aum_val\", \"sum\"),\n",
|
|||
|
|
" net_flow_qty=(\"net_flow_qty\", \"sum\"),\n",
|
|||
|
|
" gross_flow_qty=(\"gross_flow_qty\", \"sum\"),\n",
|
|||
|
|
" sub_qty=(\"sub_qty\", \"sum\"),\n",
|
|||
|
|
" red_qty=(\"red_qty\", \"sum\"),\n",
|
|||
|
|
" n_tx=(\"n_tx\", \"sum\"),\n",
|
|||
|
|
" n_isin_held=(\"isin_held_flag\", \"sum\"),\n",
|
|||
|
|
" n_isin_active=(\"isin_active_flag\", \"sum\"),\n",
|
|||
|
|
" delta_rate_m=(\"delta_rate_m\", \"first\"),\n",
|
|||
|
|
" region=(\"region\", \"first\"),\n",
|
|||
|
|
" country=(\"country\", \"first\"),\n",
|
|||
|
|
" )\n",
|
|||
|
|
" .sort_values([ID_COL, \"month\"])\n",
|
|||
|
|
" .reset_index(drop=True)\n",
|
|||
|
|
")\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_month[\"active_month\"] = (df_month[\"gross_flow_qty\"] > 0).astype(int)\n",
|
|||
|
|
"df_month[\"flow_to_aum_m\"] = df_month[\"net_flow_qty\"] / (df_month[\"aum_qty\"].abs() + EPS)\n",
|
|||
|
|
"df_month[\"turnover_m\"] = df_month[\"gross_flow_qty\"] / (df_month[\"aum_qty\"].abs() + EPS)\n",
|
|||
|
|
"df_month[\"sub_share_m\"] = df_month[\"sub_qty\"] / (df_month[\"gross_flow_qty\"] + EPS)\n",
|
|||
|
|
"df_month[\"red_share_m\"] = df_month[\"red_qty\"] / (df_month[\"gross_flow_qty\"] + EPS)\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_month[\"aum_peak_to_date\"] = df_month.groupby(ID_COL)[\"aum_qty\"].cummax()\n",
|
|||
|
|
"df_month[\"aum_drawdown\"] = 1 - (df_month[\"aum_qty\"] / (df_month[\"aum_peak_to_date\"] + EPS))\n",
|
|||
|
|
"\n",
|
|||
|
|
"print(df_month.shape)\n",
|
|||
|
|
"df_month.head()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 35,
|
|||
|
|
"id": "1a2d234f-42f8-4cd1-b50e-7fc3f8c829d2",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>Registrar Account - ID</th>\n",
|
|||
|
|
" <th>Product - Isin</th>\n",
|
|||
|
|
" <th>rel_n_months</th>\n",
|
|||
|
|
" <th>rel_active_months</th>\n",
|
|||
|
|
" <th>rel_holding_months</th>\n",
|
|||
|
|
" <th>rel_aum_mean</th>\n",
|
|||
|
|
" <th>rel_turnover_mean</th>\n",
|
|||
|
|
" <th>rel_turnover_vol</th>\n",
|
|||
|
|
" <th>rel_flow_to_aum_vol</th>\n",
|
|||
|
|
" <th>rel_n_tx</th>\n",
|
|||
|
|
" <th>rel_full_exit_count</th>\n",
|
|||
|
|
" <th>rel_entry_count</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>7905</td>\n",
|
|||
|
|
" <td>FR0010135103</td>\n",
|
|||
|
|
" <td>80</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>7905</td>\n",
|
|||
|
|
" <td>FR0010147603</td>\n",
|
|||
|
|
" <td>80</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2</th>\n",
|
|||
|
|
" <td>7905</td>\n",
|
|||
|
|
" <td>FR0010148981</td>\n",
|
|||
|
|
" <td>80</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3</th>\n",
|
|||
|
|
" <td>7905</td>\n",
|
|||
|
|
" <td>FR0010148999</td>\n",
|
|||
|
|
" <td>80</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4</th>\n",
|
|||
|
|
" <td>7905</td>\n",
|
|||
|
|
" <td>FR0010149096</td>\n",
|
|||
|
|
" <td>80</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" Registrar Account - ID Product - Isin rel_n_months rel_active_months \\\n",
|
|||
|
|
"0 7905 FR0010135103 80 0 \n",
|
|||
|
|
"1 7905 FR0010147603 80 0 \n",
|
|||
|
|
"2 7905 FR0010148981 80 0 \n",
|
|||
|
|
"3 7905 FR0010148999 80 0 \n",
|
|||
|
|
"4 7905 FR0010149096 80 0 \n",
|
|||
|
|
"\n",
|
|||
|
|
" rel_holding_months rel_aum_mean rel_turnover_mean rel_turnover_vol \\\n",
|
|||
|
|
"0 0 0.0 0.0 0.0 \n",
|
|||
|
|
"1 0 0.0 0.0 0.0 \n",
|
|||
|
|
"2 0 0.0 0.0 0.0 \n",
|
|||
|
|
"3 0 0.0 0.0 0.0 \n",
|
|||
|
|
"4 0 0.0 0.0 0.0 \n",
|
|||
|
|
"\n",
|
|||
|
|
" rel_flow_to_aum_vol rel_n_tx rel_full_exit_count rel_entry_count \n",
|
|||
|
|
"0 0.0 0.0 0 0 \n",
|
|||
|
|
"1 0.0 0.0 0 0 \n",
|
|||
|
|
"2 0.0 0.0 0 0 \n",
|
|||
|
|
"3 0.0 0.0 0 0 \n",
|
|||
|
|
"4 0.0 0.0 0 0 "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 35,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"tmp = df_rel_m.sort_values([ID_COL, ISIN_COL, \"month\"]).copy()\n",
|
|||
|
|
"tmp[\"prev_aum\"] = tmp.groupby([ID_COL, ISIN_COL])[\"aum_qty\"].shift(1)\n",
|
|||
|
|
"tmp[\"full_exit_event\"] = ((tmp[\"prev_aum\"] > 0) & (tmp[\"aum_qty\"] <= 0)).astype(int)\n",
|
|||
|
|
"tmp[\"entry_event\"] = ((tmp[\"prev_aum\"].fillna(0) <= 0) & (tmp[\"aum_qty\"] > 0)).astype(int)\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_rel_feat = (\n",
|
|||
|
|
" tmp.groupby([ID_COL, ISIN_COL], as_index=False)\n",
|
|||
|
|
" .agg(\n",
|
|||
|
|
" rel_n_months=(\"month\", \"nunique\"),\n",
|
|||
|
|
" rel_active_months=(\"active_rel_month\", \"sum\"),\n",
|
|||
|
|
" rel_holding_months=(\"holding_rel_month\", \"sum\"),\n",
|
|||
|
|
" rel_aum_mean=(\"aum_qty\", \"mean\"),\n",
|
|||
|
|
" rel_turnover_mean=(\"turnover_rel\", \"mean\"),\n",
|
|||
|
|
" rel_turnover_vol=(\"turnover_rel\", \"std\"),\n",
|
|||
|
|
" rel_flow_to_aum_vol=(\"flow_to_aum_rel\", \"std\"),\n",
|
|||
|
|
" rel_n_tx=(\"n_tx\", \"sum\"),\n",
|
|||
|
|
" rel_full_exit_count=(\"full_exit_event\", \"sum\"),\n",
|
|||
|
|
" rel_entry_count=(\"entry_event\", \"sum\")\n",
|
|||
|
|
" )\n",
|
|||
|
|
")\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_rel_feat.head()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 38,
|
|||
|
|
"id": "9b61ce6a-1f54-423a-8a54-9897fe1bce20",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"(17238, 34)\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>Registrar Account - ID</th>\n",
|
|||
|
|
" <th>n_months</th>\n",
|
|||
|
|
" <th>n_active_months</th>\n",
|
|||
|
|
" <th>flow_freq</th>\n",
|
|||
|
|
" <th>aum_qty_mean</th>\n",
|
|||
|
|
" <th>aum_qty_median</th>\n",
|
|||
|
|
" <th>aum_qty_max</th>\n",
|
|||
|
|
" <th>aum_qty_last</th>\n",
|
|||
|
|
" <th>net_flow_qty_sum</th>\n",
|
|||
|
|
" <th>gross_flow_qty_sum</th>\n",
|
|||
|
|
" <th>gross_flow_qty_mean</th>\n",
|
|||
|
|
" <th>n_tx_total</th>\n",
|
|||
|
|
" <th>net_flow_vol</th>\n",
|
|||
|
|
" <th>turnover_mean</th>\n",
|
|||
|
|
" <th>turnover_vol</th>\n",
|
|||
|
|
" <th>flow_to_aum_mean</th>\n",
|
|||
|
|
" <th>flow_to_aum_vol</th>\n",
|
|||
|
|
" <th>avg_n_isin_held</th>\n",
|
|||
|
|
" <th>max_n_isin_held</th>\n",
|
|||
|
|
" <th>sub_share_mean</th>\n",
|
|||
|
|
" <th>red_share_mean</th>\n",
|
|||
|
|
" <th>delta_rate_mean</th>\n",
|
|||
|
|
" <th>aum_drawdown_last</th>\n",
|
|||
|
|
" <th>aum_drawdown_max</th>\n",
|
|||
|
|
" <th>region</th>\n",
|
|||
|
|
" <th>country</th>\n",
|
|||
|
|
" <th>n_isin_total</th>\n",
|
|||
|
|
" <th>rel_turnover_mean_avg</th>\n",
|
|||
|
|
" <th>rel_turnover_vol_avg</th>\n",
|
|||
|
|
" <th>rel_flow_to_aum_vol_avg</th>\n",
|
|||
|
|
" <th>full_exit_count</th>\n",
|
|||
|
|
" <th>entry_count</th>\n",
|
|||
|
|
" <th>avg_holding_months_per_isin</th>\n",
|
|||
|
|
" <th>max_holding_months_per_isin</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>7905</td>\n",
|
|||
|
|
" <td>80</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00000</td>\n",
|
|||
|
|
" <td>-0.008925</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>12</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>7912</td>\n",
|
|||
|
|
" <td>80</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00000</td>\n",
|
|||
|
|
" <td>-0.008925</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>5</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2</th>\n",
|
|||
|
|
" <td>7962</td>\n",
|
|||
|
|
" <td>80</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00000</td>\n",
|
|||
|
|
" <td>-0.008925</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>4</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3</th>\n",
|
|||
|
|
" <td>8307</td>\n",
|
|||
|
|
" <td>130</td>\n",
|
|||
|
|
" <td>77</td>\n",
|
|||
|
|
" <td>0.592308</td>\n",
|
|||
|
|
" <td>21568.649523</td>\n",
|
|||
|
|
" <td>20698.97</td>\n",
|
|||
|
|
" <td>58533.06</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>27252.124</td>\n",
|
|||
|
|
" <td>177077.31</td>\n",
|
|||
|
|
" <td>1362.133154</td>\n",
|
|||
|
|
" <td>161.0</td>\n",
|
|||
|
|
" <td>3508.455222</td>\n",
|
|||
|
|
" <td>0.056109</td>\n",
|
|||
|
|
" <td>0.136358</td>\n",
|
|||
|
|
" <td>0.011473</td>\n",
|
|||
|
|
" <td>0.134336</td>\n",
|
|||
|
|
" <td>10.276923</td>\n",
|
|||
|
|
" <td>15</td>\n",
|
|||
|
|
" <td>0.260828</td>\n",
|
|||
|
|
" <td>-0.36224</td>\n",
|
|||
|
|
" <td>0.013723</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>29</td>\n",
|
|||
|
|
" <td>5.479069e+09</td>\n",
|
|||
|
|
" <td>3.702940e+10</td>\n",
|
|||
|
|
" <td>3.702940e+10</td>\n",
|
|||
|
|
" <td>36</td>\n",
|
|||
|
|
" <td>36</td>\n",
|
|||
|
|
" <td>46.068966</td>\n",
|
|||
|
|
" <td>120</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4</th>\n",
|
|||
|
|
" <td>8354</td>\n",
|
|||
|
|
" <td>64</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00000</td>\n",
|
|||
|
|
" <td>-0.010063</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" Registrar Account - ID n_months n_active_months flow_freq aum_qty_mean \\\n",
|
|||
|
|
"0 7905 80 0 0.000000 0.000000 \n",
|
|||
|
|
"1 7912 80 0 0.000000 0.000000 \n",
|
|||
|
|
"2 7962 80 0 0.000000 0.000000 \n",
|
|||
|
|
"3 8307 130 77 0.592308 21568.649523 \n",
|
|||
|
|
"4 8354 64 0 0.000000 0.000000 \n",
|
|||
|
|
"\n",
|
|||
|
|
" aum_qty_median aum_qty_max aum_qty_last net_flow_qty_sum \\\n",
|
|||
|
|
"0 0.00 0.00 0.0 0.000 \n",
|
|||
|
|
"1 0.00 0.00 0.0 0.000 \n",
|
|||
|
|
"2 0.00 0.00 0.0 0.000 \n",
|
|||
|
|
"3 20698.97 58533.06 0.0 27252.124 \n",
|
|||
|
|
"4 0.00 0.00 0.0 0.000 \n",
|
|||
|
|
"\n",
|
|||
|
|
" gross_flow_qty_sum gross_flow_qty_mean n_tx_total net_flow_vol \\\n",
|
|||
|
|
"0 0.00 0.000000 0.0 0.000000 \n",
|
|||
|
|
"1 0.00 0.000000 0.0 0.000000 \n",
|
|||
|
|
"2 0.00 0.000000 0.0 0.000000 \n",
|
|||
|
|
"3 177077.31 1362.133154 161.0 3508.455222 \n",
|
|||
|
|
"4 0.00 0.000000 0.0 0.000000 \n",
|
|||
|
|
"\n",
|
|||
|
|
" turnover_mean turnover_vol flow_to_aum_mean flow_to_aum_vol \\\n",
|
|||
|
|
"0 0.000000 0.000000 0.000000 0.000000 \n",
|
|||
|
|
"1 0.000000 0.000000 0.000000 0.000000 \n",
|
|||
|
|
"2 0.000000 0.000000 0.000000 0.000000 \n",
|
|||
|
|
"3 0.056109 0.136358 0.011473 0.134336 \n",
|
|||
|
|
"4 0.000000 0.000000 0.000000 0.000000 \n",
|
|||
|
|
"\n",
|
|||
|
|
" avg_n_isin_held max_n_isin_held sub_share_mean red_share_mean \\\n",
|
|||
|
|
"0 0.000000 0 0.000000 0.00000 \n",
|
|||
|
|
"1 0.000000 0 0.000000 0.00000 \n",
|
|||
|
|
"2 0.000000 0 0.000000 0.00000 \n",
|
|||
|
|
"3 10.276923 15 0.260828 -0.36224 \n",
|
|||
|
|
"4 0.000000 0 0.000000 0.00000 \n",
|
|||
|
|
"\n",
|
|||
|
|
" delta_rate_mean aum_drawdown_last aum_drawdown_max region \\\n",
|
|||
|
|
"0 -0.008925 1.0 1.0 LUXEMBOURG \n",
|
|||
|
|
"1 -0.008925 1.0 1.0 LUXEMBOURG \n",
|
|||
|
|
"2 -0.008925 1.0 1.0 LUXEMBOURG \n",
|
|||
|
|
"3 0.013723 1.0 1.0 SWITZERLAND \n",
|
|||
|
|
"4 -0.010063 1.0 1.0 SWITZERLAND \n",
|
|||
|
|
"\n",
|
|||
|
|
" country n_isin_total rel_turnover_mean_avg rel_turnover_vol_avg \\\n",
|
|||
|
|
"0 LUXEMBOURG 12 0.000000e+00 0.000000e+00 \n",
|
|||
|
|
"1 LUXEMBOURG 5 0.000000e+00 0.000000e+00 \n",
|
|||
|
|
"2 LUXEMBOURG 4 0.000000e+00 0.000000e+00 \n",
|
|||
|
|
"3 SWITZERLAND 29 5.479069e+09 3.702940e+10 \n",
|
|||
|
|
"4 SWITZERLAND 1 0.000000e+00 0.000000e+00 \n",
|
|||
|
|
"\n",
|
|||
|
|
" rel_flow_to_aum_vol_avg full_exit_count entry_count \\\n",
|
|||
|
|
"0 0.000000e+00 0 0 \n",
|
|||
|
|
"1 0.000000e+00 0 0 \n",
|
|||
|
|
"2 0.000000e+00 0 0 \n",
|
|||
|
|
"3 3.702940e+10 36 36 \n",
|
|||
|
|
"4 0.000000e+00 0 0 \n",
|
|||
|
|
"\n",
|
|||
|
|
" avg_holding_months_per_isin max_holding_months_per_isin \n",
|
|||
|
|
"0 0.000000 0 \n",
|
|||
|
|
"1 0.000000 0 \n",
|
|||
|
|
"2 0.000000 0 \n",
|
|||
|
|
"3 46.068966 120 \n",
|
|||
|
|
"4 0.000000 0 "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 38,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"df_rel_client = (\n",
|
|||
|
|
" df_rel_feat\n",
|
|||
|
|
" .groupby(ID_COL, as_index=False)\n",
|
|||
|
|
" .agg(\n",
|
|||
|
|
" n_isin_total=(ISIN_COL, \"nunique\"),\n",
|
|||
|
|
" rel_turnover_mean_avg=(\"rel_turnover_mean\", \"mean\"),\n",
|
|||
|
|
" rel_turnover_vol_avg=(\"rel_turnover_vol\", \"mean\"),\n",
|
|||
|
|
" rel_flow_to_aum_vol_avg=(\"rel_flow_to_aum_vol\", \"mean\"),\n",
|
|||
|
|
" full_exit_count=(\"rel_full_exit_count\", \"sum\"),\n",
|
|||
|
|
" entry_count=(\"rel_entry_count\", \"sum\"),\n",
|
|||
|
|
" avg_holding_months_per_isin=(\"rel_holding_months\", \"mean\"),\n",
|
|||
|
|
" max_holding_months_per_isin=(\"rel_holding_months\", \"max\")\n",
|
|||
|
|
" )\n",
|
|||
|
|
")\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_client = (\n",
|
|||
|
|
" df_month\n",
|
|||
|
|
" .groupby(ID_COL, as_index=False)\n",
|
|||
|
|
" .agg(\n",
|
|||
|
|
" n_months=(\"month\", \"nunique\"),\n",
|
|||
|
|
" n_active_months=(\"active_month\", \"sum\"),\n",
|
|||
|
|
" flow_freq=(\"active_month\", \"mean\"),\n",
|
|||
|
|
"\n",
|
|||
|
|
" aum_qty_mean=(\"aum_qty\", \"mean\"),\n",
|
|||
|
|
" aum_qty_median=(\"aum_qty\", \"median\"),\n",
|
|||
|
|
" aum_qty_max=(\"aum_qty\", \"max\"),\n",
|
|||
|
|
" aum_qty_last=(\"aum_qty\", \"last\"),\n",
|
|||
|
|
"\n",
|
|||
|
|
" net_flow_qty_sum=(\"net_flow_qty\", \"sum\"),\n",
|
|||
|
|
" gross_flow_qty_sum=(\"gross_flow_qty\", \"sum\"),\n",
|
|||
|
|
" gross_flow_qty_mean=(\"gross_flow_qty\", \"mean\"),\n",
|
|||
|
|
" n_tx_total=(\"n_tx\", \"sum\"),\n",
|
|||
|
|
"\n",
|
|||
|
|
" net_flow_vol=(\"net_flow_qty\", \"std\"),\n",
|
|||
|
|
" turnover_mean=(\"turnover_m\", \"mean\"),\n",
|
|||
|
|
" turnover_vol=(\"turnover_m\", \"std\"),\n",
|
|||
|
|
" flow_to_aum_mean=(\"flow_to_aum_m\", \"mean\"),\n",
|
|||
|
|
" flow_to_aum_vol=(\"flow_to_aum_m\", \"std\"),\n",
|
|||
|
|
"\n",
|
|||
|
|
" avg_n_isin_held=(\"n_isin_held\", \"mean\"),\n",
|
|||
|
|
" max_n_isin_held=(\"n_isin_held\", \"max\"),\n",
|
|||
|
|
"\n",
|
|||
|
|
" sub_share_mean=(\"sub_share_m\", \"mean\"),\n",
|
|||
|
|
" red_share_mean=(\"red_share_m\", \"mean\"),\n",
|
|||
|
|
"\n",
|
|||
|
|
" delta_rate_mean=(\"delta_rate_m\", \"mean\"),\n",
|
|||
|
|
" aum_drawdown_last=(\"aum_drawdown\", \"last\"),\n",
|
|||
|
|
" aum_drawdown_max=(\"aum_drawdown\", \"max\"),\n",
|
|||
|
|
"\n",
|
|||
|
|
" region=(\"region\", \"last\"),\n",
|
|||
|
|
" country=(\"country\", \"last\")\n",
|
|||
|
|
" )\n",
|
|||
|
|
")\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_client = df_client.merge(df_rel_client, on=ID_COL, how=\"left\")\n",
|
|||
|
|
"\n",
|
|||
|
|
"print(df_client.shape)\n",
|
|||
|
|
"df_client.head()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 56,
|
|||
|
|
"id": "48d1b22b-f0ca-448e-a330-6b7d64fe48b3",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/plain": [
|
|||
|
|
"Index(['Registrar Account - ID', 'n_months', 'n_active_months', 'flow_freq',\n",
|
|||
|
|
" 'aum_qty_mean', 'aum_qty_median', 'aum_qty_max', 'aum_qty_last',\n",
|
|||
|
|
" 'net_flow_qty_sum', 'gross_flow_qty_sum', 'gross_flow_qty_mean',\n",
|
|||
|
|
" 'n_tx_total', 'net_flow_vol', 'turnover_mean', 'turnover_vol',\n",
|
|||
|
|
" 'flow_to_aum_mean', 'flow_to_aum_vol', 'avg_n_isin_held',\n",
|
|||
|
|
" 'max_n_isin_held', 'sub_share_mean', 'red_share_mean',\n",
|
|||
|
|
" 'delta_rate_mean', 'aum_drawdown_last', 'aum_drawdown_max', 'region',\n",
|
|||
|
|
" 'country', 'n_isin_total', 'rel_turnover_mean_avg',\n",
|
|||
|
|
" 'rel_turnover_vol_avg', 'rel_flow_to_aum_vol_avg', 'full_exit_count',\n",
|
|||
|
|
" 'entry_count', 'avg_holding_months_per_isin',\n",
|
|||
|
|
" 'max_holding_months_per_isin', 'flow_trend_12m_x', 'aum_trend_12m_x',\n",
|
|||
|
|
" 'drawdown_trend_12m_x', 'beta_rate_x', 'flow_trend_12m_y',\n",
|
|||
|
|
" 'aum_trend_12m_y', 'drawdown_trend_12m_y', 'beta_rate_y'],\n",
|
|||
|
|
" dtype='object')"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 56,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"df_client.columns"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 57,
|
|||
|
|
"id": "a9b34e2b-503f-41a1-9629-670ceb7615ba",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/plain": [
|
|||
|
|
"(17238, 42)"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 57,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"df_client.shape"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 40,
|
|||
|
|
"id": "934507d6-8aaf-43e2-8a2d-d6cfea0b6af1",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"(17238, 38)\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>Registrar Account - ID</th>\n",
|
|||
|
|
" <th>n_months</th>\n",
|
|||
|
|
" <th>n_active_months</th>\n",
|
|||
|
|
" <th>flow_freq</th>\n",
|
|||
|
|
" <th>aum_qty_mean</th>\n",
|
|||
|
|
" <th>aum_qty_median</th>\n",
|
|||
|
|
" <th>aum_qty_max</th>\n",
|
|||
|
|
" <th>aum_qty_last</th>\n",
|
|||
|
|
" <th>net_flow_qty_sum</th>\n",
|
|||
|
|
" <th>gross_flow_qty_sum</th>\n",
|
|||
|
|
" <th>gross_flow_qty_mean</th>\n",
|
|||
|
|
" <th>n_tx_total</th>\n",
|
|||
|
|
" <th>net_flow_vol</th>\n",
|
|||
|
|
" <th>turnover_mean</th>\n",
|
|||
|
|
" <th>turnover_vol</th>\n",
|
|||
|
|
" <th>flow_to_aum_mean</th>\n",
|
|||
|
|
" <th>flow_to_aum_vol</th>\n",
|
|||
|
|
" <th>avg_n_isin_held</th>\n",
|
|||
|
|
" <th>max_n_isin_held</th>\n",
|
|||
|
|
" <th>sub_share_mean</th>\n",
|
|||
|
|
" <th>red_share_mean</th>\n",
|
|||
|
|
" <th>delta_rate_mean</th>\n",
|
|||
|
|
" <th>aum_drawdown_last</th>\n",
|
|||
|
|
" <th>aum_drawdown_max</th>\n",
|
|||
|
|
" <th>region</th>\n",
|
|||
|
|
" <th>country</th>\n",
|
|||
|
|
" <th>n_isin_total</th>\n",
|
|||
|
|
" <th>rel_turnover_mean_avg</th>\n",
|
|||
|
|
" <th>rel_turnover_vol_avg</th>\n",
|
|||
|
|
" <th>rel_flow_to_aum_vol_avg</th>\n",
|
|||
|
|
" <th>full_exit_count</th>\n",
|
|||
|
|
" <th>entry_count</th>\n",
|
|||
|
|
" <th>avg_holding_months_per_isin</th>\n",
|
|||
|
|
" <th>max_holding_months_per_isin</th>\n",
|
|||
|
|
" <th>flow_trend_12m</th>\n",
|
|||
|
|
" <th>aum_trend_12m</th>\n",
|
|||
|
|
" <th>drawdown_trend_12m</th>\n",
|
|||
|
|
" <th>beta_rate</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>7905</td>\n",
|
|||
|
|
" <td>80</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00000</td>\n",
|
|||
|
|
" <td>-0.008925</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>12</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.00000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>7912</td>\n",
|
|||
|
|
" <td>80</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00000</td>\n",
|
|||
|
|
" <td>-0.008925</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>5</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.00000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2</th>\n",
|
|||
|
|
" <td>7962</td>\n",
|
|||
|
|
" <td>80</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00000</td>\n",
|
|||
|
|
" <td>-0.008925</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>LUXEMBOURG</td>\n",
|
|||
|
|
" <td>4</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.00000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3</th>\n",
|
|||
|
|
" <td>8307</td>\n",
|
|||
|
|
" <td>130</td>\n",
|
|||
|
|
" <td>77</td>\n",
|
|||
|
|
" <td>0.592308</td>\n",
|
|||
|
|
" <td>21568.649523</td>\n",
|
|||
|
|
" <td>20698.97</td>\n",
|
|||
|
|
" <td>58533.06</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>27252.124</td>\n",
|
|||
|
|
" <td>177077.31</td>\n",
|
|||
|
|
" <td>1362.133154</td>\n",
|
|||
|
|
" <td>161.0</td>\n",
|
|||
|
|
" <td>3508.455222</td>\n",
|
|||
|
|
" <td>0.056109</td>\n",
|
|||
|
|
" <td>0.136358</td>\n",
|
|||
|
|
" <td>0.011473</td>\n",
|
|||
|
|
" <td>0.134336</td>\n",
|
|||
|
|
" <td>10.276923</td>\n",
|
|||
|
|
" <td>15</td>\n",
|
|||
|
|
" <td>0.260828</td>\n",
|
|||
|
|
" <td>-0.36224</td>\n",
|
|||
|
|
" <td>0.013723</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>29</td>\n",
|
|||
|
|
" <td>5.479069e+09</td>\n",
|
|||
|
|
" <td>3.702940e+10</td>\n",
|
|||
|
|
" <td>3.702940e+10</td>\n",
|
|||
|
|
" <td>36</td>\n",
|
|||
|
|
" <td>36</td>\n",
|
|||
|
|
" <td>46.068966</td>\n",
|
|||
|
|
" <td>120</td>\n",
|
|||
|
|
" <td>-0.01049</td>\n",
|
|||
|
|
" <td>-1142.587413</td>\n",
|
|||
|
|
" <td>0.01952</td>\n",
|
|||
|
|
" <td>-0.131741</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4</th>\n",
|
|||
|
|
" <td>8354</td>\n",
|
|||
|
|
" <td>64</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" <td>0.00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00000</td>\n",
|
|||
|
|
" <td>-0.010063</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>SWITZERLAND</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.00000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.00000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" Registrar Account - ID n_months n_active_months flow_freq aum_qty_mean \\\n",
|
|||
|
|
"0 7905 80 0 0.000000 0.000000 \n",
|
|||
|
|
"1 7912 80 0 0.000000 0.000000 \n",
|
|||
|
|
"2 7962 80 0 0.000000 0.000000 \n",
|
|||
|
|
"3 8307 130 77 0.592308 21568.649523 \n",
|
|||
|
|
"4 8354 64 0 0.000000 0.000000 \n",
|
|||
|
|
"\n",
|
|||
|
|
" aum_qty_median aum_qty_max aum_qty_last net_flow_qty_sum \\\n",
|
|||
|
|
"0 0.00 0.00 0.0 0.000 \n",
|
|||
|
|
"1 0.00 0.00 0.0 0.000 \n",
|
|||
|
|
"2 0.00 0.00 0.0 0.000 \n",
|
|||
|
|
"3 20698.97 58533.06 0.0 27252.124 \n",
|
|||
|
|
"4 0.00 0.00 0.0 0.000 \n",
|
|||
|
|
"\n",
|
|||
|
|
" gross_flow_qty_sum gross_flow_qty_mean n_tx_total net_flow_vol \\\n",
|
|||
|
|
"0 0.00 0.000000 0.0 0.000000 \n",
|
|||
|
|
"1 0.00 0.000000 0.0 0.000000 \n",
|
|||
|
|
"2 0.00 0.000000 0.0 0.000000 \n",
|
|||
|
|
"3 177077.31 1362.133154 161.0 3508.455222 \n",
|
|||
|
|
"4 0.00 0.000000 0.0 0.000000 \n",
|
|||
|
|
"\n",
|
|||
|
|
" turnover_mean turnover_vol flow_to_aum_mean flow_to_aum_vol \\\n",
|
|||
|
|
"0 0.000000 0.000000 0.000000 0.000000 \n",
|
|||
|
|
"1 0.000000 0.000000 0.000000 0.000000 \n",
|
|||
|
|
"2 0.000000 0.000000 0.000000 0.000000 \n",
|
|||
|
|
"3 0.056109 0.136358 0.011473 0.134336 \n",
|
|||
|
|
"4 0.000000 0.000000 0.000000 0.000000 \n",
|
|||
|
|
"\n",
|
|||
|
|
" avg_n_isin_held max_n_isin_held sub_share_mean red_share_mean \\\n",
|
|||
|
|
"0 0.000000 0 0.000000 0.00000 \n",
|
|||
|
|
"1 0.000000 0 0.000000 0.00000 \n",
|
|||
|
|
"2 0.000000 0 0.000000 0.00000 \n",
|
|||
|
|
"3 10.276923 15 0.260828 -0.36224 \n",
|
|||
|
|
"4 0.000000 0 0.000000 0.00000 \n",
|
|||
|
|
"\n",
|
|||
|
|
" delta_rate_mean aum_drawdown_last aum_drawdown_max region \\\n",
|
|||
|
|
"0 -0.008925 1.0 1.0 LUXEMBOURG \n",
|
|||
|
|
"1 -0.008925 1.0 1.0 LUXEMBOURG \n",
|
|||
|
|
"2 -0.008925 1.0 1.0 LUXEMBOURG \n",
|
|||
|
|
"3 0.013723 1.0 1.0 SWITZERLAND \n",
|
|||
|
|
"4 -0.010063 1.0 1.0 SWITZERLAND \n",
|
|||
|
|
"\n",
|
|||
|
|
" country n_isin_total rel_turnover_mean_avg rel_turnover_vol_avg \\\n",
|
|||
|
|
"0 LUXEMBOURG 12 0.000000e+00 0.000000e+00 \n",
|
|||
|
|
"1 LUXEMBOURG 5 0.000000e+00 0.000000e+00 \n",
|
|||
|
|
"2 LUXEMBOURG 4 0.000000e+00 0.000000e+00 \n",
|
|||
|
|
"3 SWITZERLAND 29 5.479069e+09 3.702940e+10 \n",
|
|||
|
|
"4 SWITZERLAND 1 0.000000e+00 0.000000e+00 \n",
|
|||
|
|
"\n",
|
|||
|
|
" rel_flow_to_aum_vol_avg full_exit_count entry_count \\\n",
|
|||
|
|
"0 0.000000e+00 0 0 \n",
|
|||
|
|
"1 0.000000e+00 0 0 \n",
|
|||
|
|
"2 0.000000e+00 0 0 \n",
|
|||
|
|
"3 3.702940e+10 36 36 \n",
|
|||
|
|
"4 0.000000e+00 0 0 \n",
|
|||
|
|
"\n",
|
|||
|
|
" avg_holding_months_per_isin max_holding_months_per_isin flow_trend_12m \\\n",
|
|||
|
|
"0 0.000000 0 0.00000 \n",
|
|||
|
|
"1 0.000000 0 0.00000 \n",
|
|||
|
|
"2 0.000000 0 0.00000 \n",
|
|||
|
|
"3 46.068966 120 -0.01049 \n",
|
|||
|
|
"4 0.000000 0 0.00000 \n",
|
|||
|
|
"\n",
|
|||
|
|
" aum_trend_12m drawdown_trend_12m beta_rate \n",
|
|||
|
|
"0 0.000000 0.00000 0.000000 \n",
|
|||
|
|
"1 0.000000 0.00000 0.000000 \n",
|
|||
|
|
"2 0.000000 0.00000 0.000000 \n",
|
|||
|
|
"3 -1142.587413 0.01952 -0.131741 \n",
|
|||
|
|
"4 0.000000 0.00000 0.000000 "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 40,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"def compute_trend(y):\n",
|
|||
|
|
" y = np.asarray(y, dtype=float)\n",
|
|||
|
|
" if len(y) < 4:\n",
|
|||
|
|
" return np.nan\n",
|
|||
|
|
" x = np.arange(len(y)).reshape(-1, 1)\n",
|
|||
|
|
" mask = np.isfinite(y)\n",
|
|||
|
|
" if mask.sum() < 4:\n",
|
|||
|
|
" return np.nan\n",
|
|||
|
|
" reg = LinearRegression().fit(x[mask], y[mask])\n",
|
|||
|
|
" return reg.coef_[0]\n",
|
|||
|
|
"\n",
|
|||
|
|
"def compute_beta(y, x):\n",
|
|||
|
|
" y = np.asarray(y, dtype=float)\n",
|
|||
|
|
" x = np.asarray(x, dtype=float)\n",
|
|||
|
|
" mask = np.isfinite(y) & np.isfinite(x)\n",
|
|||
|
|
" if mask.sum() < 6:\n",
|
|||
|
|
" return np.nan\n",
|
|||
|
|
" reg = LinearRegression().fit(x[mask].reshape(-1, 1), y[mask])\n",
|
|||
|
|
" return reg.coef_[0]\n",
|
|||
|
|
"\n",
|
|||
|
|
"rows = []\n",
|
|||
|
|
"\n",
|
|||
|
|
"for acc, g in df_month.groupby(ID_COL):\n",
|
|||
|
|
" g = g.sort_values(\"month\")\n",
|
|||
|
|
"\n",
|
|||
|
|
" flow = g[\"flow_to_aum_m\"].values\n",
|
|||
|
|
" aum = g[\"aum_qty\"].values\n",
|
|||
|
|
" delta_rate = g[\"delta_rate_m\"].values\n",
|
|||
|
|
" drawdown = g[\"aum_drawdown\"].values\n",
|
|||
|
|
"\n",
|
|||
|
|
" rows.append({\n",
|
|||
|
|
" ID_COL: acc,\n",
|
|||
|
|
" \"flow_trend_12m\": compute_trend(flow[-12:]),\n",
|
|||
|
|
" \"aum_trend_12m\": compute_trend(aum[-12:]),\n",
|
|||
|
|
" \"drawdown_trend_12m\": compute_trend(drawdown[-12:]),\n",
|
|||
|
|
" \"beta_rate\": compute_beta(flow, delta_rate),\n",
|
|||
|
|
" })\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_beta = pd.DataFrame(rows)\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_client = df_client.merge(df_beta, on=ID_COL, how=\"left\")\n",
|
|||
|
|
"\n",
|
|||
|
|
"print(df_client.shape)\n",
|
|||
|
|
"df_client.head()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 58,
|
|||
|
|
"id": "4a35e933-5417-4141-a1f0-ab4edb567d51",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>Registrar Account - ID</th>\n",
|
|||
|
|
" <th>n_months</th>\n",
|
|||
|
|
" <th>n_active_months</th>\n",
|
|||
|
|
" <th>flow_freq</th>\n",
|
|||
|
|
" <th>aum_qty_mean</th>\n",
|
|||
|
|
" <th>aum_qty_median</th>\n",
|
|||
|
|
" <th>aum_qty_max</th>\n",
|
|||
|
|
" <th>aum_qty_last</th>\n",
|
|||
|
|
" <th>net_flow_qty_sum</th>\n",
|
|||
|
|
" <th>gross_flow_qty_sum</th>\n",
|
|||
|
|
" <th>gross_flow_qty_mean</th>\n",
|
|||
|
|
" <th>n_tx_total</th>\n",
|
|||
|
|
" <th>net_flow_vol</th>\n",
|
|||
|
|
" <th>turnover_mean</th>\n",
|
|||
|
|
" <th>turnover_vol</th>\n",
|
|||
|
|
" <th>flow_to_aum_mean</th>\n",
|
|||
|
|
" <th>flow_to_aum_vol</th>\n",
|
|||
|
|
" <th>avg_n_isin_held</th>\n",
|
|||
|
|
" <th>max_n_isin_held</th>\n",
|
|||
|
|
" <th>sub_share_mean</th>\n",
|
|||
|
|
" <th>red_share_mean</th>\n",
|
|||
|
|
" <th>delta_rate_mean</th>\n",
|
|||
|
|
" <th>aum_drawdown_last</th>\n",
|
|||
|
|
" <th>aum_drawdown_max</th>\n",
|
|||
|
|
" <th>region</th>\n",
|
|||
|
|
" <th>country</th>\n",
|
|||
|
|
" <th>n_isin_total</th>\n",
|
|||
|
|
" <th>rel_turnover_mean_avg</th>\n",
|
|||
|
|
" <th>rel_turnover_vol_avg</th>\n",
|
|||
|
|
" <th>rel_flow_to_aum_vol_avg</th>\n",
|
|||
|
|
" <th>full_exit_count</th>\n",
|
|||
|
|
" <th>entry_count</th>\n",
|
|||
|
|
" <th>avg_holding_months_per_isin</th>\n",
|
|||
|
|
" <th>max_holding_months_per_isin</th>\n",
|
|||
|
|
" <th>flow_trend_12m_x</th>\n",
|
|||
|
|
" <th>aum_trend_12m_x</th>\n",
|
|||
|
|
" <th>drawdown_trend_12m_x</th>\n",
|
|||
|
|
" <th>beta_rate_x</th>\n",
|
|||
|
|
" <th>flow_trend_12m_y</th>\n",
|
|||
|
|
" <th>aum_trend_12m_y</th>\n",
|
|||
|
|
" <th>drawdown_trend_12m_y</th>\n",
|
|||
|
|
" <th>beta_rate_y</th>\n",
|
|||
|
|
" <th>gross_flow_to_aum</th>\n",
|
|||
|
|
" <th>avg_ticket</th>\n",
|
|||
|
|
" <th>flow_direction_balance</th>\n",
|
|||
|
|
" <th>redemption_bias</th>\n",
|
|||
|
|
" <th>activity_intensity</th>\n",
|
|||
|
|
" <th>exit_rate_per_isin</th>\n",
|
|||
|
|
" <th>entry_rate_per_isin</th>\n",
|
|||
|
|
" <th>aum_final_to_peak</th>\n",
|
|||
|
|
" <th>log_aum_qty_mean</th>\n",
|
|||
|
|
" <th>log_gross_flow_qty_sum</th>\n",
|
|||
|
|
" <th>log_n_tx_total</th>\n",
|
|||
|
|
" <th>log_avg_ticket</th>\n",
|
|||
|
|
" <th>country_grp</th>\n",
|
|||
|
|
" <th>region_grp</th>\n",
|
|||
|
|
" <th>cluster_k2</th>\n",
|
|||
|
|
" <th>cluster_k5</th>\n",
|
|||
|
|
" <th>cluster_k10</th>\n",
|
|||
|
|
" <th>churn_hard</th>\n",
|
|||
|
|
" <th>churn_soft</th>\n",
|
|||
|
|
" <th>churn_warning</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>17217</th>\n",
|
|||
|
|
" <td>422835</td>\n",
|
|||
|
|
" <td>57</td>\n",
|
|||
|
|
" <td>26</td>\n",
|
|||
|
|
" <td>0.456140</td>\n",
|
|||
|
|
" <td>3.305042e+04</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>5.372034e+05</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>5.050329e+05</td>\n",
|
|||
|
|
" <td>8.986925e+05</td>\n",
|
|||
|
|
" <td>1.576653e+04</td>\n",
|
|||
|
|
" <td>68.0</td>\n",
|
|||
|
|
" <td>4.698930e+04</td>\n",
|
|||
|
|
" <td>9.464842e+12</td>\n",
|
|||
|
|
" <td>3.058166e+13</td>\n",
|
|||
|
|
" <td>2.993416e+12</td>\n",
|
|||
|
|
" <td>3.181011e+13</td>\n",
|
|||
|
|
" <td>0.140351</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0.219723</td>\n",
|
|||
|
|
" <td>-0.241074</td>\n",
|
|||
|
|
" <td>-0.009035</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>ITALY</td>\n",
|
|||
|
|
" <td>ITALY</td>\n",
|
|||
|
|
" <td>3</td>\n",
|
|||
|
|
" <td>4.860324e+12</td>\n",
|
|||
|
|
" <td>1.237445e+13</td>\n",
|
|||
|
|
" <td>1.319247e+13</td>\n",
|
|||
|
|
" <td>3</td>\n",
|
|||
|
|
" <td>3</td>\n",
|
|||
|
|
" <td>2.666667</td>\n",
|
|||
|
|
" <td>8</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>6.383533e+13</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>6.383533e+13</td>\n",
|
|||
|
|
" <td>27.191559</td>\n",
|
|||
|
|
" <td>13216.065779</td>\n",
|
|||
|
|
" <td>0.561964</td>\n",
|
|||
|
|
" <td>-0.460796</td>\n",
|
|||
|
|
" <td>1.192982</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>10.405820</td>\n",
|
|||
|
|
" <td>13.708697</td>\n",
|
|||
|
|
" <td>4.234107</td>\n",
|
|||
|
|
" <td>9.489264</td>\n",
|
|||
|
|
" <td>ITALY</td>\n",
|
|||
|
|
" <td>ITALY</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>17220</th>\n",
|
|||
|
|
" <td>422860</td>\n",
|
|||
|
|
" <td>62</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>4.503548e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>2.792200e+01</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.161290</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>-0.007677</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>ITALY</td>\n",
|
|||
|
|
" <td>ITALY</td>\n",
|
|||
|
|
" <td>3</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>3.333333</td>\n",
|
|||
|
|
" <td>10</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.333333</td>\n",
|
|||
|
|
" <td>0.333333</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>1.705393</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>ITALY</td>\n",
|
|||
|
|
" <td>ITALY</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>17221</th>\n",
|
|||
|
|
" <td>422864</td>\n",
|
|||
|
|
" <td>44</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>8.169545e-01</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>1.797300e+01</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.045455</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>-0.009023</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>UNITED KINGDOM</td>\n",
|
|||
|
|
" <td>UNITED KINGDOM</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>2.000000</td>\n",
|
|||
|
|
" <td>2</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.597162</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>UNITED KINGDOM</td>\n",
|
|||
|
|
" <td>UNITED KINGDOM</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>17224</th>\n",
|
|||
|
|
" <td>422876</td>\n",
|
|||
|
|
" <td>77</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>3.192987e-01</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>1.229300e+01</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.025974</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>-0.009182</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>ITALY</td>\n",
|
|||
|
|
" <td>ITALY</td>\n",
|
|||
|
|
" <td>10</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0.200000</td>\n",
|
|||
|
|
" <td>2</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.100000</td>\n",
|
|||
|
|
" <td>0.100000</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.277100</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>ITALY</td>\n",
|
|||
|
|
" <td>ITALY</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>17227</th>\n",
|
|||
|
|
" <td>422891</td>\n",
|
|||
|
|
" <td>48</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>3.572000e+01</td>\n",
|
|||
|
|
" <td>5.358000e+01</td>\n",
|
|||
|
|
" <td>5.358000e+01</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.666667</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>-0.007917</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>UNITED KINGDOM</td>\n",
|
|||
|
|
" <td>UNITED KINGDOM</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>32.000000</td>\n",
|
|||
|
|
" <td>32</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>3.603322</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>UNITED KINGDOM</td>\n",
|
|||
|
|
" <td>UNITED KINGDOM</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>17230</th>\n",
|
|||
|
|
" <td>422906</td>\n",
|
|||
|
|
" <td>114</td>\n",
|
|||
|
|
" <td>112</td>\n",
|
|||
|
|
" <td>0.982456</td>\n",
|
|||
|
|
" <td>1.319870e+03</td>\n",
|
|||
|
|
" <td>8.466950e+01</td>\n",
|
|||
|
|
" <td>1.216348e+04</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>2.488392e+03</td>\n",
|
|||
|
|
" <td>2.901017e+04</td>\n",
|
|||
|
|
" <td>2.544751e+02</td>\n",
|
|||
|
|
" <td>367.0</td>\n",
|
|||
|
|
" <td>3.655121e+02</td>\n",
|
|||
|
|
" <td>7.934937e+10</td>\n",
|
|||
|
|
" <td>1.987296e+11</td>\n",
|
|||
|
|
" <td>-1.053788e+10</td>\n",
|
|||
|
|
" <td>1.906889e+11</td>\n",
|
|||
|
|
" <td>0.929825</td>\n",
|
|||
|
|
" <td>3</td>\n",
|
|||
|
|
" <td>0.373516</td>\n",
|
|||
|
|
" <td>-0.622580</td>\n",
|
|||
|
|
" <td>0.014351</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>SPAIN</td>\n",
|
|||
|
|
" <td>SPAIN</td>\n",
|
|||
|
|
" <td>4</td>\n",
|
|||
|
|
" <td>6.943214e+10</td>\n",
|
|||
|
|
" <td>1.266133e+11</td>\n",
|
|||
|
|
" <td>1.355015e+11</td>\n",
|
|||
|
|
" <td>39</td>\n",
|
|||
|
|
" <td>39</td>\n",
|
|||
|
|
" <td>26.500000</td>\n",
|
|||
|
|
" <td>35</td>\n",
|
|||
|
|
" <td>4.573969e+09</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>2.857298e+09</td>\n",
|
|||
|
|
" <td>4.573969e+09</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>2.857298e+09</td>\n",
|
|||
|
|
" <td>21.979558</td>\n",
|
|||
|
|
" <td>79.046774</td>\n",
|
|||
|
|
" <td>0.085777</td>\n",
|
|||
|
|
" <td>-0.996097</td>\n",
|
|||
|
|
" <td>3.219298</td>\n",
|
|||
|
|
" <td>9.750000</td>\n",
|
|||
|
|
" <td>9.750000</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>7.186046</td>\n",
|
|||
|
|
" <td>10.275436</td>\n",
|
|||
|
|
" <td>5.908083</td>\n",
|
|||
|
|
" <td>4.382611</td>\n",
|
|||
|
|
" <td>SPAIN</td>\n",
|
|||
|
|
" <td>SPAIN</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>17232</th>\n",
|
|||
|
|
" <td>67100</td>\n",
|
|||
|
|
" <td>79</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>5.677362e+03</td>\n",
|
|||
|
|
" <td>1.621000e+03</td>\n",
|
|||
|
|
" <td>3.962330e+04</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>2.291139</td>\n",
|
|||
|
|
" <td>6</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>-0.009089</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>GERMANY</td>\n",
|
|||
|
|
" <td>GERMANY</td>\n",
|
|||
|
|
" <td>21</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>14</td>\n",
|
|||
|
|
" <td>20</td>\n",
|
|||
|
|
" <td>8.619048</td>\n",
|
|||
|
|
" <td>21</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>-3.006628e+02</td>\n",
|
|||
|
|
" <td>0.007588</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>-3.006628e+02</td>\n",
|
|||
|
|
" <td>0.007588</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.666667</td>\n",
|
|||
|
|
" <td>0.952381</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>8.644418</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>GERMANY</td>\n",
|
|||
|
|
" <td>GERMANY</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>17233</th>\n",
|
|||
|
|
" <td>67104</td>\n",
|
|||
|
|
" <td>63</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>1.238095e+02</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>7.800000e+03</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.015873</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>-0.007476</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>GERMANY</td>\n",
|
|||
|
|
" <td>GERMANY</td>\n",
|
|||
|
|
" <td>11</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0.090909</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.090909</td>\n",
|
|||
|
|
" <td>0.090909</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>4.826789</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>GERMANY</td>\n",
|
|||
|
|
" <td>GERMANY</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>17236</th>\n",
|
|||
|
|
" <td>OFF DISTRIBUTION</td>\n",
|
|||
|
|
" <td>131</td>\n",
|
|||
|
|
" <td>131</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>1.309559e+08</td>\n",
|
|||
|
|
" <td>1.483052e+08</td>\n",
|
|||
|
|
" <td>2.226195e+08</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>1.319043e+08</td>\n",
|
|||
|
|
" <td>5.035368e+08</td>\n",
|
|||
|
|
" <td>3.843793e+06</td>\n",
|
|||
|
|
" <td>27679.0</td>\n",
|
|||
|
|
" <td>1.190158e+07</td>\n",
|
|||
|
|
" <td>1.652515e+12</td>\n",
|
|||
|
|
" <td>1.891390e+13</td>\n",
|
|||
|
|
" <td>-1.557131e+11</td>\n",
|
|||
|
|
" <td>1.782218e+12</td>\n",
|
|||
|
|
" <td>164.839695</td>\n",
|
|||
|
|
" <td>219</td>\n",
|
|||
|
|
" <td>0.905278</td>\n",
|
|||
|
|
" <td>-0.842048</td>\n",
|
|||
|
|
" <td>0.013618</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>469</td>\n",
|
|||
|
|
" <td>1.179033e+12</td>\n",
|
|||
|
|
" <td>9.883021e+12</td>\n",
|
|||
|
|
" <td>9.883389e+12</td>\n",
|
|||
|
|
" <td>378</td>\n",
|
|||
|
|
" <td>585</td>\n",
|
|||
|
|
" <td>46.042644</td>\n",
|
|||
|
|
" <td>130</td>\n",
|
|||
|
|
" <td>-7.845547e+11</td>\n",
|
|||
|
|
" <td>-2.180184e+06</td>\n",
|
|||
|
|
" <td>0.009793</td>\n",
|
|||
|
|
" <td>9.599623e+10</td>\n",
|
|||
|
|
" <td>-7.845547e+11</td>\n",
|
|||
|
|
" <td>-2.180184e+06</td>\n",
|
|||
|
|
" <td>0.009793</td>\n",
|
|||
|
|
" <td>9.599623e+10</td>\n",
|
|||
|
|
" <td>3.845088</td>\n",
|
|||
|
|
" <td>18192.017337</td>\n",
|
|||
|
|
" <td>0.261956</td>\n",
|
|||
|
|
" <td>-1.747326</td>\n",
|
|||
|
|
" <td>211.290076</td>\n",
|
|||
|
|
" <td>0.805970</td>\n",
|
|||
|
|
" <td>1.247335</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>18.690371</td>\n",
|
|||
|
|
" <td>20.037167</td>\n",
|
|||
|
|
" <td>10.228465</td>\n",
|
|||
|
|
" <td>9.808793</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>17237</th>\n",
|
|||
|
|
" <td>PRIVATE CLIENT</td>\n",
|
|||
|
|
" <td>131</td>\n",
|
|||
|
|
" <td>131</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>3.826133e+06</td>\n",
|
|||
|
|
" <td>3.068170e+06</td>\n",
|
|||
|
|
" <td>8.415289e+06</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>-4.181221e+05</td>\n",
|
|||
|
|
" <td>2.603098e+07</td>\n",
|
|||
|
|
" <td>1.987098e+05</td>\n",
|
|||
|
|
" <td>32363.0</td>\n",
|
|||
|
|
" <td>1.715429e+05</td>\n",
|
|||
|
|
" <td>4.894466e+09</td>\n",
|
|||
|
|
" <td>5.601972e+10</td>\n",
|
|||
|
|
" <td>-4.894466e+09</td>\n",
|
|||
|
|
" <td>5.601972e+10</td>\n",
|
|||
|
|
" <td>37.954198</td>\n",
|
|||
|
|
" <td>54</td>\n",
|
|||
|
|
" <td>0.520087</td>\n",
|
|||
|
|
" <td>-0.577005</td>\n",
|
|||
|
|
" <td>0.013618</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>89</td>\n",
|
|||
|
|
" <td>1.739254e+10</td>\n",
|
|||
|
|
" <td>1.168016e+11</td>\n",
|
|||
|
|
" <td>1.034362e+11</td>\n",
|
|||
|
|
" <td>55</td>\n",
|
|||
|
|
" <td>111</td>\n",
|
|||
|
|
" <td>55.865169</td>\n",
|
|||
|
|
" <td>130</td>\n",
|
|||
|
|
" <td>-2.466058e+10</td>\n",
|
|||
|
|
" <td>-6.690212e+04</td>\n",
|
|||
|
|
" <td>0.007950</td>\n",
|
|||
|
|
" <td>3.017409e+09</td>\n",
|
|||
|
|
" <td>-2.466058e+10</td>\n",
|
|||
|
|
" <td>-6.690212e+04</td>\n",
|
|||
|
|
" <td>0.007950</td>\n",
|
|||
|
|
" <td>3.017409e+09</td>\n",
|
|||
|
|
" <td>6.803470</td>\n",
|
|||
|
|
" <td>804.343896</td>\n",
|
|||
|
|
" <td>-0.016062</td>\n",
|
|||
|
|
" <td>-1.097093</td>\n",
|
|||
|
|
" <td>247.045802</td>\n",
|
|||
|
|
" <td>0.617978</td>\n",
|
|||
|
|
" <td>1.247191</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" <td>15.157366</td>\n",
|
|||
|
|
" <td>17.074798</td>\n",
|
|||
|
|
" <td>10.384802</td>\n",
|
|||
|
|
" <td>6.691269</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>FRANCE</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>0</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" Registrar Account - ID n_months n_active_months flow_freq \\\n",
|
|||
|
|
"17217 422835 57 26 0.456140 \n",
|
|||
|
|
"17220 422860 62 0 0.000000 \n",
|
|||
|
|
"17221 422864 44 0 0.000000 \n",
|
|||
|
|
"17224 422876 77 0 0.000000 \n",
|
|||
|
|
"17227 422891 48 0 0.000000 \n",
|
|||
|
|
"17230 422906 114 112 0.982456 \n",
|
|||
|
|
"17232 67100 79 0 0.000000 \n",
|
|||
|
|
"17233 67104 63 0 0.000000 \n",
|
|||
|
|
"17236 OFF DISTRIBUTION 131 131 1.000000 \n",
|
|||
|
|
"17237 PRIVATE CLIENT 131 131 1.000000 \n",
|
|||
|
|
"\n",
|
|||
|
|
" aum_qty_mean aum_qty_median aum_qty_max aum_qty_last \\\n",
|
|||
|
|
"17217 3.305042e+04 0.000000e+00 5.372034e+05 0.0 \n",
|
|||
|
|
"17220 4.503548e+00 0.000000e+00 2.792200e+01 0.0 \n",
|
|||
|
|
"17221 8.169545e-01 0.000000e+00 1.797300e+01 0.0 \n",
|
|||
|
|
"17224 3.192987e-01 0.000000e+00 1.229300e+01 0.0 \n",
|
|||
|
|
"17227 3.572000e+01 5.358000e+01 5.358000e+01 0.0 \n",
|
|||
|
|
"17230 1.319870e+03 8.466950e+01 1.216348e+04 0.0 \n",
|
|||
|
|
"17232 5.677362e+03 1.621000e+03 3.962330e+04 0.0 \n",
|
|||
|
|
"17233 1.238095e+02 0.000000e+00 7.800000e+03 0.0 \n",
|
|||
|
|
"17236 1.309559e+08 1.483052e+08 2.226195e+08 0.0 \n",
|
|||
|
|
"17237 3.826133e+06 3.068170e+06 8.415289e+06 0.0 \n",
|
|||
|
|
"\n",
|
|||
|
|
" net_flow_qty_sum gross_flow_qty_sum gross_flow_qty_mean n_tx_total \\\n",
|
|||
|
|
"17217 5.050329e+05 8.986925e+05 1.576653e+04 68.0 \n",
|
|||
|
|
"17220 0.000000e+00 0.000000e+00 0.000000e+00 0.0 \n",
|
|||
|
|
"17221 0.000000e+00 0.000000e+00 0.000000e+00 0.0 \n",
|
|||
|
|
"17224 0.000000e+00 0.000000e+00 0.000000e+00 0.0 \n",
|
|||
|
|
"17227 0.000000e+00 0.000000e+00 0.000000e+00 0.0 \n",
|
|||
|
|
"17230 2.488392e+03 2.901017e+04 2.544751e+02 367.0 \n",
|
|||
|
|
"17232 0.000000e+00 0.000000e+00 0.000000e+00 0.0 \n",
|
|||
|
|
"17233 0.000000e+00 0.000000e+00 0.000000e+00 0.0 \n",
|
|||
|
|
"17236 1.319043e+08 5.035368e+08 3.843793e+06 27679.0 \n",
|
|||
|
|
"17237 -4.181221e+05 2.603098e+07 1.987098e+05 32363.0 \n",
|
|||
|
|
"\n",
|
|||
|
|
" net_flow_vol turnover_mean turnover_vol flow_to_aum_mean \\\n",
|
|||
|
|
"17217 4.698930e+04 9.464842e+12 3.058166e+13 2.993416e+12 \n",
|
|||
|
|
"17220 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 \n",
|
|||
|
|
"17221 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 \n",
|
|||
|
|
"17224 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 \n",
|
|||
|
|
"17227 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 \n",
|
|||
|
|
"17230 3.655121e+02 7.934937e+10 1.987296e+11 -1.053788e+10 \n",
|
|||
|
|
"17232 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 \n",
|
|||
|
|
"17233 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 \n",
|
|||
|
|
"17236 1.190158e+07 1.652515e+12 1.891390e+13 -1.557131e+11 \n",
|
|||
|
|
"17237 1.715429e+05 4.894466e+09 5.601972e+10 -4.894466e+09 \n",
|
|||
|
|
"\n",
|
|||
|
|
" flow_to_aum_vol avg_n_isin_held max_n_isin_held sub_share_mean \\\n",
|
|||
|
|
"17217 3.181011e+13 0.140351 1 0.219723 \n",
|
|||
|
|
"17220 0.000000e+00 0.161290 1 0.000000 \n",
|
|||
|
|
"17221 0.000000e+00 0.045455 1 0.000000 \n",
|
|||
|
|
"17224 0.000000e+00 0.025974 1 0.000000 \n",
|
|||
|
|
"17227 0.000000e+00 0.666667 1 0.000000 \n",
|
|||
|
|
"17230 1.906889e+11 0.929825 3 0.373516 \n",
|
|||
|
|
"17232 0.000000e+00 2.291139 6 0.000000 \n",
|
|||
|
|
"17233 0.000000e+00 0.015873 1 0.000000 \n",
|
|||
|
|
"17236 1.782218e+12 164.839695 219 0.905278 \n",
|
|||
|
|
"17237 5.601972e+10 37.954198 54 0.520087 \n",
|
|||
|
|
"\n",
|
|||
|
|
" red_share_mean delta_rate_mean aum_drawdown_last aum_drawdown_max \\\n",
|
|||
|
|
"17217 -0.241074 -0.009035 1.0 1.0 \n",
|
|||
|
|
"17220 0.000000 -0.007677 1.0 1.0 \n",
|
|||
|
|
"17221 0.000000 -0.009023 1.0 1.0 \n",
|
|||
|
|
"17224 0.000000 -0.009182 1.0 1.0 \n",
|
|||
|
|
"17227 0.000000 -0.007917 1.0 1.0 \n",
|
|||
|
|
"17230 -0.622580 0.014351 1.0 1.0 \n",
|
|||
|
|
"17232 0.000000 -0.009089 1.0 1.0 \n",
|
|||
|
|
"17233 0.000000 -0.007476 1.0 1.0 \n",
|
|||
|
|
"17236 -0.842048 0.013618 1.0 1.0 \n",
|
|||
|
|
"17237 -0.577005 0.013618 1.0 1.0 \n",
|
|||
|
|
"\n",
|
|||
|
|
" region country n_isin_total rel_turnover_mean_avg \\\n",
|
|||
|
|
"17217 ITALY ITALY 3 4.860324e+12 \n",
|
|||
|
|
"17220 ITALY ITALY 3 0.000000e+00 \n",
|
|||
|
|
"17221 UNITED KINGDOM UNITED KINGDOM 1 0.000000e+00 \n",
|
|||
|
|
"17224 ITALY ITALY 10 0.000000e+00 \n",
|
|||
|
|
"17227 UNITED KINGDOM UNITED KINGDOM 1 0.000000e+00 \n",
|
|||
|
|
"17230 SPAIN SPAIN 4 6.943214e+10 \n",
|
|||
|
|
"17232 GERMANY GERMANY 21 0.000000e+00 \n",
|
|||
|
|
"17233 GERMANY GERMANY 11 0.000000e+00 \n",
|
|||
|
|
"17236 FRANCE FRANCE 469 1.179033e+12 \n",
|
|||
|
|
"17237 FRANCE FRANCE 89 1.739254e+10 \n",
|
|||
|
|
"\n",
|
|||
|
|
" rel_turnover_vol_avg rel_flow_to_aum_vol_avg full_exit_count \\\n",
|
|||
|
|
"17217 1.237445e+13 1.319247e+13 3 \n",
|
|||
|
|
"17220 0.000000e+00 0.000000e+00 1 \n",
|
|||
|
|
"17221 0.000000e+00 0.000000e+00 1 \n",
|
|||
|
|
"17224 0.000000e+00 0.000000e+00 1 \n",
|
|||
|
|
"17227 0.000000e+00 0.000000e+00 1 \n",
|
|||
|
|
"17230 1.266133e+11 1.355015e+11 39 \n",
|
|||
|
|
"17232 0.000000e+00 0.000000e+00 14 \n",
|
|||
|
|
"17233 0.000000e+00 0.000000e+00 1 \n",
|
|||
|
|
"17236 9.883021e+12 9.883389e+12 378 \n",
|
|||
|
|
"17237 1.168016e+11 1.034362e+11 55 \n",
|
|||
|
|
"\n",
|
|||
|
|
" entry_count avg_holding_months_per_isin max_holding_months_per_isin \\\n",
|
|||
|
|
"17217 3 2.666667 8 \n",
|
|||
|
|
"17220 1 3.333333 10 \n",
|
|||
|
|
"17221 1 2.000000 2 \n",
|
|||
|
|
"17224 1 0.200000 2 \n",
|
|||
|
|
"17227 1 32.000000 32 \n",
|
|||
|
|
"17230 39 26.500000 35 \n",
|
|||
|
|
"17232 20 8.619048 21 \n",
|
|||
|
|
"17233 1 0.090909 1 \n",
|
|||
|
|
"17236 585 46.042644 130 \n",
|
|||
|
|
"17237 111 55.865169 130 \n",
|
|||
|
|
"\n",
|
|||
|
|
" flow_trend_12m_x aum_trend_12m_x drawdown_trend_12m_x beta_rate_x \\\n",
|
|||
|
|
"17217 0.000000e+00 0.000000e+00 0.000000 6.383533e+13 \n",
|
|||
|
|
"17220 0.000000e+00 0.000000e+00 0.000000 0.000000e+00 \n",
|
|||
|
|
"17221 0.000000e+00 0.000000e+00 0.000000 0.000000e+00 \n",
|
|||
|
|
"17224 0.000000e+00 0.000000e+00 0.000000 0.000000e+00 \n",
|
|||
|
|
"17227 0.000000e+00 0.000000e+00 0.000000 0.000000e+00 \n",
|
|||
|
|
"17230 4.573969e+09 0.000000e+00 0.000000 2.857298e+09 \n",
|
|||
|
|
"17232 0.000000e+00 -3.006628e+02 0.007588 0.000000e+00 \n",
|
|||
|
|
"17233 0.000000e+00 0.000000e+00 0.000000 0.000000e+00 \n",
|
|||
|
|
"17236 -7.845547e+11 -2.180184e+06 0.009793 9.599623e+10 \n",
|
|||
|
|
"17237 -2.466058e+10 -6.690212e+04 0.007950 3.017409e+09 \n",
|
|||
|
|
"\n",
|
|||
|
|
" flow_trend_12m_y aum_trend_12m_y drawdown_trend_12m_y beta_rate_y \\\n",
|
|||
|
|
"17217 0.000000e+00 0.000000e+00 0.000000 6.383533e+13 \n",
|
|||
|
|
"17220 0.000000e+00 0.000000e+00 0.000000 0.000000e+00 \n",
|
|||
|
|
"17221 0.000000e+00 0.000000e+00 0.000000 0.000000e+00 \n",
|
|||
|
|
"17224 0.000000e+00 0.000000e+00 0.000000 0.000000e+00 \n",
|
|||
|
|
"17227 0.000000e+00 0.000000e+00 0.000000 0.000000e+00 \n",
|
|||
|
|
"17230 4.573969e+09 0.000000e+00 0.000000 2.857298e+09 \n",
|
|||
|
|
"17232 0.000000e+00 -3.006628e+02 0.007588 0.000000e+00 \n",
|
|||
|
|
"17233 0.000000e+00 0.000000e+00 0.000000 0.000000e+00 \n",
|
|||
|
|
"17236 -7.845547e+11 -2.180184e+06 0.009793 9.599623e+10 \n",
|
|||
|
|
"17237 -2.466058e+10 -6.690212e+04 0.007950 3.017409e+09 \n",
|
|||
|
|
"\n",
|
|||
|
|
" gross_flow_to_aum avg_ticket flow_direction_balance \\\n",
|
|||
|
|
"17217 27.191559 13216.065779 0.561964 \n",
|
|||
|
|
"17220 0.000000 0.000000 0.000000 \n",
|
|||
|
|
"17221 0.000000 0.000000 0.000000 \n",
|
|||
|
|
"17224 0.000000 0.000000 0.000000 \n",
|
|||
|
|
"17227 0.000000 0.000000 0.000000 \n",
|
|||
|
|
"17230 21.979558 79.046774 0.085777 \n",
|
|||
|
|
"17232 0.000000 0.000000 0.000000 \n",
|
|||
|
|
"17233 0.000000 0.000000 0.000000 \n",
|
|||
|
|
"17236 3.845088 18192.017337 0.261956 \n",
|
|||
|
|
"17237 6.803470 804.343896 -0.016062 \n",
|
|||
|
|
"\n",
|
|||
|
|
" redemption_bias activity_intensity exit_rate_per_isin \\\n",
|
|||
|
|
"17217 -0.460796 1.192982 1.000000 \n",
|
|||
|
|
"17220 0.000000 0.000000 0.333333 \n",
|
|||
|
|
"17221 0.000000 0.000000 1.000000 \n",
|
|||
|
|
"17224 0.000000 0.000000 0.100000 \n",
|
|||
|
|
"17227 0.000000 0.000000 1.000000 \n",
|
|||
|
|
"17230 -0.996097 3.219298 9.750000 \n",
|
|||
|
|
"17232 0.000000 0.000000 0.666667 \n",
|
|||
|
|
"17233 0.000000 0.000000 0.090909 \n",
|
|||
|
|
"17236 -1.747326 211.290076 0.805970 \n",
|
|||
|
|
"17237 -1.097093 247.045802 0.617978 \n",
|
|||
|
|
"\n",
|
|||
|
|
" entry_rate_per_isin aum_final_to_peak log_aum_qty_mean \\\n",
|
|||
|
|
"17217 1.000000 0.0 10.405820 \n",
|
|||
|
|
"17220 0.333333 0.0 1.705393 \n",
|
|||
|
|
"17221 1.000000 0.0 0.597162 \n",
|
|||
|
|
"17224 0.100000 0.0 0.277100 \n",
|
|||
|
|
"17227 1.000000 0.0 3.603322 \n",
|
|||
|
|
"17230 9.750000 0.0 7.186046 \n",
|
|||
|
|
"17232 0.952381 0.0 8.644418 \n",
|
|||
|
|
"17233 0.090909 0.0 4.826789 \n",
|
|||
|
|
"17236 1.247335 0.0 18.690371 \n",
|
|||
|
|
"17237 1.247191 0.0 15.157366 \n",
|
|||
|
|
"\n",
|
|||
|
|
" log_gross_flow_qty_sum log_n_tx_total log_avg_ticket country_grp \\\n",
|
|||
|
|
"17217 13.708697 4.234107 9.489264 ITALY \n",
|
|||
|
|
"17220 0.000000 0.000000 0.000000 ITALY \n",
|
|||
|
|
"17221 0.000000 0.000000 0.000000 UNITED KINGDOM \n",
|
|||
|
|
"17224 0.000000 0.000000 0.000000 ITALY \n",
|
|||
|
|
"17227 0.000000 0.000000 0.000000 UNITED KINGDOM \n",
|
|||
|
|
"17230 10.275436 5.908083 4.382611 SPAIN \n",
|
|||
|
|
"17232 0.000000 0.000000 0.000000 GERMANY \n",
|
|||
|
|
"17233 0.000000 0.000000 0.000000 GERMANY \n",
|
|||
|
|
"17236 20.037167 10.228465 9.808793 FRANCE \n",
|
|||
|
|
"17237 17.074798 10.384802 6.691269 FRANCE \n",
|
|||
|
|
"\n",
|
|||
|
|
" region_grp cluster_k2 cluster_k5 cluster_k10 churn_hard \\\n",
|
|||
|
|
"17217 ITALY 0 0 0 1 \n",
|
|||
|
|
"17220 ITALY 0 0 0 1 \n",
|
|||
|
|
"17221 UNITED KINGDOM 0 0 0 1 \n",
|
|||
|
|
"17224 ITALY 0 0 0 1 \n",
|
|||
|
|
"17227 UNITED KINGDOM 0 0 0 1 \n",
|
|||
|
|
"17230 SPAIN 0 0 0 1 \n",
|
|||
|
|
"17232 GERMANY 0 0 0 1 \n",
|
|||
|
|
"17233 GERMANY 0 0 0 1 \n",
|
|||
|
|
"17236 FRANCE 0 0 0 1 \n",
|
|||
|
|
"17237 FRANCE 0 0 0 1 \n",
|
|||
|
|
"\n",
|
|||
|
|
" churn_soft churn_warning \n",
|
|||
|
|
"17217 1 0 \n",
|
|||
|
|
"17220 1 0 \n",
|
|||
|
|
"17221 1 0 \n",
|
|||
|
|
"17224 1 0 \n",
|
|||
|
|
"17227 1 0 \n",
|
|||
|
|
"17230 1 0 \n",
|
|||
|
|
"17232 1 0 \n",
|
|||
|
|
"17233 1 0 \n",
|
|||
|
|
"17236 1 0 \n",
|
|||
|
|
"17237 1 1 "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 58,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"dfc.tail(10)"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 59,
|
|||
|
|
"id": "e5f589f2-6433-4917-8358-864c425eda22",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/plain": [
|
|||
|
|
"(9672, 62)"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 59,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"dfc.shape"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 42,
|
|||
|
|
"id": "3f78e685-b3e7-4c02-81d2-fc480d524814",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"Nb clients = 9672\n",
|
|||
|
|
"Nb features = 34\n",
|
|||
|
|
"['log_aum_qty_mean', 'flow_freq', 'gross_flow_to_aum', 'turnover_vol', 'flow_to_aum_vol', 'activity_intensity', 'log_n_tx_total', 'avg_n_isin_held', 'n_isin_total', 'avg_holding_months_per_isin', 'exit_rate_per_isin', 'flow_direction_balance', 'redemption_bias', 'aum_drawdown_last', 'country_grp_FRANCE', 'country_grp_GERMANY', 'country_grp_ITALY', 'country_grp_LATAM', 'country_grp_LUXEMBOURG', 'country_grp_Other', 'country_grp_SPAIN', 'country_grp_SWITZERLAND', 'country_grp_UNITED KINGDOM', 'country_grp_UNITED STATES', 'region_grp_FRANCE', 'region_grp_GERMANY', 'region_grp_ITALY', 'region_grp_LATAM', 'region_grp_LUXEMBOURG', 'region_grp_NORDICS', 'region_grp_Other', 'region_grp_SPAIN', 'region_grp_SWITZERLAND', 'region_grp_UNITED KINGDOM']\n"
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"dfc = df_client.copy()\n",
|
|||
|
|
"\n",
|
|||
|
|
"dfc[\"gross_flow_to_aum\"] = dfc[\"gross_flow_qty_sum\"] / (dfc[\"aum_qty_mean\"].abs() + EPS)\n",
|
|||
|
|
"dfc[\"avg_ticket\"] = dfc[\"gross_flow_qty_sum\"] / (dfc[\"n_tx_total\"] + EPS)\n",
|
|||
|
|
"dfc[\"flow_direction_balance\"] = dfc[\"net_flow_qty_sum\"] / (dfc[\"gross_flow_qty_sum\"] + EPS)\n",
|
|||
|
|
"dfc[\"redemption_bias\"] = dfc[\"red_share_mean\"] - dfc[\"sub_share_mean\"]\n",
|
|||
|
|
"dfc[\"activity_intensity\"] = dfc[\"n_tx_total\"] / (dfc[\"n_months\"] + EPS)\n",
|
|||
|
|
"dfc[\"exit_rate_per_isin\"] = dfc[\"full_exit_count\"] / (dfc[\"n_isin_total\"] + EPS)\n",
|
|||
|
|
"dfc[\"entry_rate_per_isin\"] = dfc[\"entry_count\"] / (dfc[\"n_isin_total\"] + EPS)\n",
|
|||
|
|
"dfc[\"aum_final_to_peak\"] = dfc[\"aum_qty_last\"] / (dfc[\"aum_qty_max\"] + EPS)\n",
|
|||
|
|
"\n",
|
|||
|
|
"for col in [\"aum_qty_mean\", \"gross_flow_qty_sum\", \"n_tx_total\", \"avg_ticket\"]:\n",
|
|||
|
|
" dfc[f\"log_{col}\"] = np.log1p(dfc[col].clip(lower=0))\n",
|
|||
|
|
"\n",
|
|||
|
|
"dfc = dfc[(dfc[\"n_months\"] >= 6) & (dfc[\"aum_qty_mean\"] > 0)].copy()\n",
|
|||
|
|
"\n",
|
|||
|
|
"top_countries = dfc[\"country\"].fillna(\"Unknown\").value_counts().head(10).index\n",
|
|||
|
|
"top_regions = dfc[\"region\"].fillna(\"Unknown\").value_counts().head(10).index\n",
|
|||
|
|
"\n",
|
|||
|
|
"dfc[\"country_grp\"] = np.where(dfc[\"country\"].isin(top_countries), dfc[\"country\"], \"Other\")\n",
|
|||
|
|
"dfc[\"region_grp\"] = np.where(dfc[\"region\"].isin(top_regions), dfc[\"region\"], \"Other\")\n",
|
|||
|
|
"\n",
|
|||
|
|
"base_features = [\n",
|
|||
|
|
" \"log_aum_qty_mean\",\n",
|
|||
|
|
" \"flow_freq\",\n",
|
|||
|
|
" \"gross_flow_to_aum\",\n",
|
|||
|
|
" \"turnover_vol\",\n",
|
|||
|
|
" \"flow_to_aum_vol\",\n",
|
|||
|
|
" \"activity_intensity\",\n",
|
|||
|
|
" \"log_n_tx_total\",\n",
|
|||
|
|
" \"avg_n_isin_held\",\n",
|
|||
|
|
" \"n_isin_total\",\n",
|
|||
|
|
" \"avg_holding_months_per_isin\",\n",
|
|||
|
|
" \"exit_rate_per_isin\",\n",
|
|||
|
|
" \"flow_direction_balance\",\n",
|
|||
|
|
" \"redemption_bias\",\n",
|
|||
|
|
" \"aum_drawdown_last\",\n",
|
|||
|
|
"]\n",
|
|||
|
|
"\n",
|
|||
|
|
"base_features = [c for c in base_features if c in dfc.columns]\n",
|
|||
|
|
"\n",
|
|||
|
|
"X_num = dfc[base_features].replace([np.inf, -np.inf], np.nan).fillna(dfc[base_features].median())\n",
|
|||
|
|
"X_cat = pd.get_dummies(dfc[[\"country_grp\", \"region_grp\"]].fillna(\"Unknown\"), drop_first=True)\n",
|
|||
|
|
"\n",
|
|||
|
|
"X = pd.concat([X_num.reset_index(drop=True), X_cat.reset_index(drop=True)], axis=1)\n",
|
|||
|
|
"\n",
|
|||
|
|
"scaler = RobustScaler()\n",
|
|||
|
|
"X_scaled = scaler.fit_transform(X)\n",
|
|||
|
|
"\n",
|
|||
|
|
"print(\"Nb clients =\", X.shape[0])\n",
|
|||
|
|
"print(\"Nb features =\", X.shape[1])\n",
|
|||
|
|
"print(X.columns.tolist())"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 43,
|
|||
|
|
"id": "7e865952-a1d2-4f39-bbbc-306c8ed7857c",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>k</th>\n",
|
|||
|
|
" <th>inertia</th>\n",
|
|||
|
|
" <th>silhouette</th>\n",
|
|||
|
|
" <th>davies_bouldin</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>4.524688e+27</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>2</td>\n",
|
|||
|
|
" <td>5.112657e+26</td>\n",
|
|||
|
|
" <td>0.999551</td>\n",
|
|||
|
|
" <td>0.261256</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2</th>\n",
|
|||
|
|
" <td>3</td>\n",
|
|||
|
|
" <td>2.261593e+26</td>\n",
|
|||
|
|
" <td>0.999410</td>\n",
|
|||
|
|
" <td>0.421666</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3</th>\n",
|
|||
|
|
" <td>4</td>\n",
|
|||
|
|
" <td>1.116793e+26</td>\n",
|
|||
|
|
" <td>0.999431</td>\n",
|
|||
|
|
" <td>0.246382</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4</th>\n",
|
|||
|
|
" <td>5</td>\n",
|
|||
|
|
" <td>4.183981e+25</td>\n",
|
|||
|
|
" <td>0.999076</td>\n",
|
|||
|
|
" <td>0.293760</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>5</th>\n",
|
|||
|
|
" <td>6</td>\n",
|
|||
|
|
" <td>2.520739e+25</td>\n",
|
|||
|
|
" <td>0.999066</td>\n",
|
|||
|
|
" <td>0.338481</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>6</th>\n",
|
|||
|
|
" <td>7</td>\n",
|
|||
|
|
" <td>1.141968e+25</td>\n",
|
|||
|
|
" <td>0.998961</td>\n",
|
|||
|
|
" <td>0.257299</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>7</th>\n",
|
|||
|
|
" <td>8</td>\n",
|
|||
|
|
" <td>5.503246e+24</td>\n",
|
|||
|
|
" <td>0.998936</td>\n",
|
|||
|
|
" <td>0.138057</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>8</th>\n",
|
|||
|
|
" <td>9</td>\n",
|
|||
|
|
" <td>1.305121e+24</td>\n",
|
|||
|
|
" <td>0.998803</td>\n",
|
|||
|
|
" <td>0.064578</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>9</th>\n",
|
|||
|
|
" <td>10</td>\n",
|
|||
|
|
" <td>5.648568e+23</td>\n",
|
|||
|
|
" <td>0.998696</td>\n",
|
|||
|
|
" <td>0.126169</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" k inertia silhouette davies_bouldin\n",
|
|||
|
|
"0 1 4.524688e+27 NaN NaN\n",
|
|||
|
|
"1 2 5.112657e+26 0.999551 0.261256\n",
|
|||
|
|
"2 3 2.261593e+26 0.999410 0.421666\n",
|
|||
|
|
"3 4 1.116793e+26 0.999431 0.246382\n",
|
|||
|
|
"4 5 4.183981e+25 0.999076 0.293760\n",
|
|||
|
|
"5 6 2.520739e+25 0.999066 0.338481\n",
|
|||
|
|
"6 7 1.141968e+25 0.998961 0.257299\n",
|
|||
|
|
"7 8 5.503246e+24 0.998936 0.138057\n",
|
|||
|
|
"8 9 1.305121e+24 0.998803 0.064578\n",
|
|||
|
|
"9 10 5.648568e+23 0.998696 0.126169"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 43,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"rows = []\n",
|
|||
|
|
"\n",
|
|||
|
|
"for k in range(1, 11):\n",
|
|||
|
|
" km = KMeans(n_clusters=k, n_init=50, random_state=42)\n",
|
|||
|
|
" labels = km.fit_predict(X_scaled)\n",
|
|||
|
|
"\n",
|
|||
|
|
" row = {\n",
|
|||
|
|
" \"k\": k,\n",
|
|||
|
|
" \"inertia\": km.inertia_\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" if k >= 2:\n",
|
|||
|
|
" row[\"silhouette\"] = silhouette_score(X_scaled, labels)\n",
|
|||
|
|
" row[\"davies_bouldin\"] = davies_bouldin_score(X_scaled, labels)\n",
|
|||
|
|
" else:\n",
|
|||
|
|
" row[\"silhouette\"] = np.nan\n",
|
|||
|
|
" row[\"davies_bouldin\"] = np.nan\n",
|
|||
|
|
"\n",
|
|||
|
|
" rows.append(row)\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_kdiag = pd.DataFrame(rows)\n",
|
|||
|
|
"df_kdiag"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 44,
|
|||
|
|
"id": "04c350be-d871-4de8-93d6-3775d78e4725",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABjUAAAGGCAYAAAAzegNcAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA2LlJREFUeJzs3XlcVNX/x/HXzLDLoiC4goomqKCm4oJbmZVpq+VSmaVmZbvfX6Xt2mbfvtW3VbM0TbPUcsnSbP3mFiruiLlviBuCyr7NzO8PZApFBQUuDO/n49EjuXPm3M+5o871fs45H5PdbrcjIiIiIiIiIiIiIiJSyZmNDkBERERERERERERERKQklNQQEREREREREREREZEqQUkNERERERERERERERGpEpTUEBERERERERERERGRKkFJDRERERERERERERERqRKU1BARERERERERERERkSpBSQ0REREREREREREREakSlNQQEREREREREREREZEqQUkNERERERERERERERGpEpTUEBERERGp5nr16sXYsWMdP69Zs4awsDDWrFnjOHbPPfdw4403GhGeiIiIOKkPP/yQsLAwo8OoUGPHjqVXr14XbXfo0CHCwsKYP3++41h1vF4ixVFSQ6SchIWF8eGHHzp+LvziSUlJMTAq53f2dRcREanuduzYweOPP87VV19NZGQk3bt3Z9iwYcycOdPo0Mrc7t27+fDDDzl06NA5r82aNavIQwERERGB+fPnExYW5vgvMjKSbt26MWLECGbMmEF6errRIZa5sWPHFhlzy5Yt6dmzJ6NHj2b37t1GhyciJeBidAAiVcn8+fN59tlnz/v6nDlzaNu2bcUFVA5mzpzJe++9x+rVq3F1dS22TVhYGHfffTcvvfRSBUdXYNmyZWzZsoXHHnvMkPOLiIhUFRs2bGDo0KHUr1+fAQMGEBgYyJEjR9i8eTMzZszgnnvuAWDp0qWYTCaDo718u3fv5qOPPqJjx440bNiwyGtff/01tWrVon///gZFJyIiUnk9/vjjNGzYkPz8fE6cOMHatWt54403mD59OhMnTiQ8PLxczjtq1CgeeOCBcun7Qtzc3HjttdcAsFqtHDx4kNmzZ7NixQoWL15MnTp1KjymkjDqeolUNkpqiFyCwi/7s4WEhBgQTdn6448/6Nq163kTGpXBsmXLmDVrVrFJjS1btmCxWAyISkREpPL55JNP8PHx4dtvv8XX17fIa8nJyY5fu7m5VXRoIiIiUon06NGDyMhIx88PPvggMTExPPTQQzz88MMsWbIEDw+PMj+vi4sLLi4V/3jSxcWFW265pcixtm3b8uCDD7Js2TIGDhxY4TGVhFHXS6Sy0fZTIpegR48e3HLLLef85+/vb3RolyUrK4vY2Fiuuuoqo0MpVmZm5kXbuLu76wteRETkjIMHD9KsWbNzEhoAAQEBjl+fXVPjQnbv3s0999xDmzZt6N69O5999tk5bZKTk3nuueeIjo4mMjKSm2++mQULFhRpU1zdDih+/2iAPXv28Pjjj9OxY0ciIyPp378/v/32m+P1+fPn88QTTwAwdOhQx5YSa9asoVevXuzatYu1a9c6jheuUgFITU3l9ddfp2fPnkRERHDttdfy6aefYrPZSnRNREREnFGXLl14+OGHSUxMZNGiRQBs376dsWPHcs011xAZGUnXrl159tlnOXnypON9S5cuJSwsjLVr157T5+zZswkLC2Pnzp3A+WtEfPfdd/Tv35/WrVvTsWNHRo8ezZEjR4q02b9/P4899hhdu3YlMjKSHj16MHr0aNLS0i5pvLVr1wY4Z6JkQkKC4x6kTZs2DBw4kD/++KNIm8JtvM7eAvN89ztnS01NZezYsbRv354OHTowZsyYYsdR3PUKCwvjlVde4ddff+XGG28kIiKCfv36sXz58pIOXaTKUVJDpIKdPHmSJ554gnbt2tGpUydee+01cnJyirTJz8/n448/pnfv3kRERNCrVy/effddcnNzHW0mTJhAp06dsNvtjmOvvvoqYWFhzJgxw3HsxIkThIWF8dVXX100tpiYGHJzc+nRo0epxlT4Jb1kyRImTZrkmOFx7733cuDAgXPab968mREjRtC+fXvatGnDkCFDWL9+fZE2hV/Uu3fv5v/+7/+IiorirrvuYuzYscyaNQugyB6Yhc6uqZGYmMi4ceO4/vrrad26NZ06deLxxx8vdq9tERERZ9OgQQPi4+MdDw4u1+nTp7n//vsJDw9nzJgxhIaG8vbbb7Ns2TJHm+zsbO655x4WLVrETTfdxDPPPIOPjw9jx47liy++uKTz7tq1i0GDBrFnzx5GjhzJ2LFj8fLy4pFHHuGXX34BICoqypGoeOihh3jrrbd46623aNq0Kc899xx169YlNDTUcfyhhx4CCiZ1DBkyhEWLFnHrrbfywgsv0K5dO959910mTJhwmVdMRESkaitczbBy5UoA/vzzTxISEujfvz8vvvgiffv2ZcmSJTzwwAOO5xNXXXUVXl5e/Pjjj+f0t2TJEq644gqaN29+3nNOmjSJMWPG0KhRI8aOHcvQoUOJiYnh7rvvJjU1FYDc3FxGjBjBpk2bGDJkCC+99BIDBw4kISHB0eZiUlJSSElJ4cSJE2zcuJEJEyZQs2ZNrr76akebEydOMHjwYFauXMmdd97J6NGjycnJYdSoUY57kMtlt9t5+OGH+e6777j55pt58sknOXr0KGPGjClxH+vXr2fcuHH07duXp59+mpycHB5//PEiySYRZ6LpzCKXID09/ZyC3yaTiVq1al30vU8++SQNGjTg//7v/9i0aRMzZ84kNTWVt956y9HmhRdeYMGCBVx//fUMGzaMLVu2MHnyZPbs2cPHH38MQIcOHZg+fTq7du1y3AysW7cOs9nMunXrGDp0qOMYFPxD/2KWLVtGq1atHLMTSuuzzz7DZDIxfPhw0tPTmTJlCk899RTffPONo01MTAwjR44kIiKCRx99FJPJxPz587n33nv56quvaN26dZE+n3jiCRo1asTo0aOx2+20bNmS48ePs2rVqiLX7Hzi4uLYuHEj/fr1o27duiQmJvL1118zdOhQFi9ejKen5yWNVUREpCoYPnw4I0eO5NZbb6V169a0b9+eLl260KlTp0vaavL48eP8+9//5tZbbwXgjjvuoFevXsybN4+ePXsCBTXG9uzZw3/+8x9uvvlmAAYPHsw999zDe++9x+233463t3epzvv6669Tr1495s2b59gq66677uLOO+/k7bff5tprryU4OJgOHTowc+ZMoqOj6dSpk+P9vXv35r333qNWrVrnbDUxbdo0EhISWLBgAY0bN3bEGxQUxNSpUxk+fDj16tUr9bUSERFxBnXr1sXHx4eEhASg4Pt3+PDhRdq0bduWf/3rX6xfv54OHTrg4eFBr169+Omnn3jhhRccKx+SkpKIjY3l0UcfPe/5EhMT+fDDD3nyyScdExAArrvuOm677Ta++uorHnroIfbs2cOhQ4d4//336dOnj6Pdhfr+p8zMTLp06VLkWJ06dfj888+L7MLx6aefcuLECWbNmkWHDh0AGDBgADfffDMTJkzgmmuuwWy+vDnjv/32G7GxsTz99NPcf//9ANx5552O5zolsWfPHpYsWeLYFr1Tp07ccsstLF68mCFDhlxWfCKVkZIaIpfgvvvuO+eYm5sbcXFxF31vw4YNmTRpEgB333033t7efPXVVwwfPpzw8HC2b9/OggULGDBggKNo1d13342/vz+ff/45q1evpnPnzrRv3x4oSFo0b96ctLQ0du7cyXXXXedIZBS+XrNmTZo1a3bR2JYvX35ZxTNzcnJYuHCh42GDr68vr7/+Ojt37qR58+bY7XbGjRtHp06dmDJliqMg6eDBg+nXrx/vvfcen3/+eZE+w8PDeeedd4oca9y4MatWrTrnoURxrrrqqiI3OABXX301gwYN4qeffnI8lBEREXFGXbt2Zfbs2Xz66aesXLmSjRs3MmXKFPz9/Xnttde45pprStWfl5dXke9fNzc3IiMjHQ86oOB+IjAwkBtvvNFxzNXVlXv
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 1600x400 with 3 Axes>"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"fig, axes = plt.subplots(1, 3, figsize=(16, 4))\n",
|
|||
|
|
"\n",
|
|||
|
|
"axes[0].plot(df_kdiag[\"k\"], df_kdiag[\"inertia\"], marker=\"o\")\n",
|
|||
|
|
"axes[0].set_title(\"Elbow / Inertia\")\n",
|
|||
|
|
"axes[0].set_xlabel(\"K\")\n",
|
|||
|
|
"\n",
|
|||
|
|
"axes[1].plot(df_kdiag[\"k\"], df_kdiag[\"silhouette\"], marker=\"o\")\n",
|
|||
|
|
"axes[1].set_title(\"Silhouette\")\n",
|
|||
|
|
"axes[1].set_xlabel(\"K\")\n",
|
|||
|
|
"\n",
|
|||
|
|
"axes[2].plot(df_kdiag[\"k\"], df_kdiag[\"davies_bouldin\"], marker=\"o\")\n",
|
|||
|
|
"axes[2].set_title(\"Davies-Bouldin\")\n",
|
|||
|
|
"axes[2].set_xlabel(\"K\")\n",
|
|||
|
|
"\n",
|
|||
|
|
"plt.tight_layout()\n",
|
|||
|
|
"plt.show()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 45,
|
|||
|
|
"id": "a7249fea-2ad6-4d32-af6f-c9a234cbfe1c",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"K=2 | silhouette=0.9996 | davies_bouldin=0.2613\n",
|
|||
|
|
"K=5 | silhouette=0.9991 | davies_bouldin=0.2938\n",
|
|||
|
|
"K=10 | silhouette=0.9987 | davies_bouldin=0.1262\n"
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"RESULTS = {}\n",
|
|||
|
|
"\n",
|
|||
|
|
"for k in [2, 5, 10]:\n",
|
|||
|
|
" km = KMeans(n_clusters=k, n_init=50, random_state=42)\n",
|
|||
|
|
" labels = km.fit_predict(X_scaled)\n",
|
|||
|
|
" dfc[f\"cluster_k{k}\"] = labels\n",
|
|||
|
|
"\n",
|
|||
|
|
" RESULTS[k] = {\n",
|
|||
|
|
" \"model\": km,\n",
|
|||
|
|
" \"labels\": labels,\n",
|
|||
|
|
" \"silhouette\": silhouette_score(X_scaled, labels),\n",
|
|||
|
|
" \"davies_bouldin\": davies_bouldin_score(X_scaled, labels)\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
"for k in [2, 5, 10]:\n",
|
|||
|
|
" print(f\"K={k} | silhouette={RESULTS[k]['silhouette']:.4f} | davies_bouldin={RESULTS[k]['davies_bouldin']:.4f}\")"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 46,
|
|||
|
|
"id": "0dd70e26-f831-4140-8815-eebb40c9aba7",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"\n",
|
|||
|
|
"===== K=2 =====\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>n_clients</th>\n",
|
|||
|
|
" <th>aum_qty_mean_med</th>\n",
|
|||
|
|
" <th>gross_flow_to_aum_med</th>\n",
|
|||
|
|
" <th>flow_freq_med</th>\n",
|
|||
|
|
" <th>n_tx_total_med</th>\n",
|
|||
|
|
" <th>avg_n_isin_held_med</th>\n",
|
|||
|
|
" <th>n_isin_total_med</th>\n",
|
|||
|
|
" <th>avg_holding_months_per_isin_med</th>\n",
|
|||
|
|
" <th>exit_rate_per_isin_med</th>\n",
|
|||
|
|
" <th>flow_direction_balance_med</th>\n",
|
|||
|
|
" <th>redemption_bias_med</th>\n",
|
|||
|
|
" <th>aum_drawdown_last_med</th>\n",
|
|||
|
|
" <th>aum_final_to_peak_med</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>cluster_k2</th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>9667</td>\n",
|
|||
|
|
" <td>200.644385</td>\n",
|
|||
|
|
" <td>2.560684</td>\n",
|
|||
|
|
" <td>0.058824</td>\n",
|
|||
|
|
" <td>2.0</td>\n",
|
|||
|
|
" <td>0.666667</td>\n",
|
|||
|
|
" <td>2.0</td>\n",
|
|||
|
|
" <td>13.34</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>-5.714286e-02</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>5</td>\n",
|
|||
|
|
" <td>75884.615385</td>\n",
|
|||
|
|
" <td>4.651799</td>\n",
|
|||
|
|
" <td>0.094595</td>\n",
|
|||
|
|
" <td>11.0</td>\n",
|
|||
|
|
" <td>0.750000</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>36.00</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>0.208726</td>\n",
|
|||
|
|
" <td>-4.423077e+12</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>0.0</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" n_clients aum_qty_mean_med gross_flow_to_aum_med flow_freq_med \\\n",
|
|||
|
|
"cluster_k2 \n",
|
|||
|
|
"0 9667 200.644385 2.560684 0.058824 \n",
|
|||
|
|
"1 5 75884.615385 4.651799 0.094595 \n",
|
|||
|
|
"\n",
|
|||
|
|
" n_tx_total_med avg_n_isin_held_med n_isin_total_med \\\n",
|
|||
|
|
"cluster_k2 \n",
|
|||
|
|
"0 2.0 0.666667 2.0 \n",
|
|||
|
|
"1 11.0 0.750000 1.0 \n",
|
|||
|
|
"\n",
|
|||
|
|
" avg_holding_months_per_isin_med exit_rate_per_isin_med \\\n",
|
|||
|
|
"cluster_k2 \n",
|
|||
|
|
"0 13.34 1.0 \n",
|
|||
|
|
"1 36.00 1.0 \n",
|
|||
|
|
"\n",
|
|||
|
|
" flow_direction_balance_med redemption_bias_med \\\n",
|
|||
|
|
"cluster_k2 \n",
|
|||
|
|
"0 0.000000 -5.714286e-02 \n",
|
|||
|
|
"1 0.208726 -4.423077e+12 \n",
|
|||
|
|
"\n",
|
|||
|
|
" aum_drawdown_last_med aum_final_to_peak_med \n",
|
|||
|
|
"cluster_k2 \n",
|
|||
|
|
"0 1.0 0.0 \n",
|
|||
|
|
"1 1.0 0.0 "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"\n",
|
|||
|
|
"===== K=5 =====\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>n_clients</th>\n",
|
|||
|
|
" <th>aum_qty_mean_med</th>\n",
|
|||
|
|
" <th>gross_flow_to_aum_med</th>\n",
|
|||
|
|
" <th>flow_freq_med</th>\n",
|
|||
|
|
" <th>n_tx_total_med</th>\n",
|
|||
|
|
" <th>avg_n_isin_held_med</th>\n",
|
|||
|
|
" <th>n_isin_total_med</th>\n",
|
|||
|
|
" <th>avg_holding_months_per_isin_med</th>\n",
|
|||
|
|
" <th>exit_rate_per_isin_med</th>\n",
|
|||
|
|
" <th>flow_direction_balance_med</th>\n",
|
|||
|
|
" <th>redemption_bias_med</th>\n",
|
|||
|
|
" <th>aum_drawdown_last_med</th>\n",
|
|||
|
|
" <th>aum_final_to_peak_med</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>cluster_k5</th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>9665</td>\n",
|
|||
|
|
" <td>200.507246</td>\n",
|
|||
|
|
" <td>2.560684</td>\n",
|
|||
|
|
" <td>0.058824</td>\n",
|
|||
|
|
" <td>2.0</td>\n",
|
|||
|
|
" <td>0.666667</td>\n",
|
|||
|
|
" <td>2.0</td>\n",
|
|||
|
|
" <td>13.333333</td>\n",
|
|||
|
|
" <td>1.000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>-5.714286e-02</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>2</td>\n",
|
|||
|
|
" <td>94722.757683</td>\n",
|
|||
|
|
" <td>5.784578</td>\n",
|
|||
|
|
" <td>0.070374</td>\n",
|
|||
|
|
" <td>10.0</td>\n",
|
|||
|
|
" <td>0.586798</td>\n",
|
|||
|
|
" <td>2.0</td>\n",
|
|||
|
|
" <td>35.166667</td>\n",
|
|||
|
|
" <td>1.500</td>\n",
|
|||
|
|
" <td>0.001110</td>\n",
|
|||
|
|
" <td>-4.646436e+12</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2</th>\n",
|
|||
|
|
" <td>2</td>\n",
|
|||
|
|
" <td>101582.362250</td>\n",
|
|||
|
|
" <td>4.932272</td>\n",
|
|||
|
|
" <td>0.082639</td>\n",
|
|||
|
|
" <td>7.5</td>\n",
|
|||
|
|
" <td>0.875000</td>\n",
|
|||
|
|
" <td>2.0</td>\n",
|
|||
|
|
" <td>28.000000</td>\n",
|
|||
|
|
" <td>0.500</td>\n",
|
|||
|
|
" <td>0.682622</td>\n",
|
|||
|
|
" <td>-2.943535e+12</td>\n",
|
|||
|
|
" <td>0.500000</td>\n",
|
|||
|
|
" <td>0.500000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4</th>\n",
|
|||
|
|
" <td>2</td>\n",
|
|||
|
|
" <td>152151.798643</td>\n",
|
|||
|
|
" <td>3.417115</td>\n",
|
|||
|
|
" <td>0.052149</td>\n",
|
|||
|
|
" <td>7.5</td>\n",
|
|||
|
|
" <td>1.381561</td>\n",
|
|||
|
|
" <td>3.0</td>\n",
|
|||
|
|
" <td>45.750000</td>\n",
|
|||
|
|
" <td>0.875</td>\n",
|
|||
|
|
" <td>0.199417</td>\n",
|
|||
|
|
" <td>-9.113122e+11</td>\n",
|
|||
|
|
" <td>0.940068</td>\n",
|
|||
|
|
" <td>0.059932</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3</th>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>75884.615385</td>\n",
|
|||
|
|
" <td>4.651799</td>\n",
|
|||
|
|
" <td>0.282051</td>\n",
|
|||
|
|
" <td>15.0</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>39.000000</td>\n",
|
|||
|
|
" <td>0.000</td>\n",
|
|||
|
|
" <td>0.201133</td>\n",
|
|||
|
|
" <td>-6.666667e+12</td>\n",
|
|||
|
|
" <td>0.685315</td>\n",
|
|||
|
|
" <td>0.314685</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" n_clients aum_qty_mean_med gross_flow_to_aum_med flow_freq_med \\\n",
|
|||
|
|
"cluster_k5 \n",
|
|||
|
|
"0 9665 200.507246 2.560684 0.058824 \n",
|
|||
|
|
"1 2 94722.757683 5.784578 0.070374 \n",
|
|||
|
|
"2 2 101582.362250 4.932272 0.082639 \n",
|
|||
|
|
"4 2 152151.798643 3.417115 0.052149 \n",
|
|||
|
|
"3 1 75884.615385 4.651799 0.282051 \n",
|
|||
|
|
"\n",
|
|||
|
|
" n_tx_total_med avg_n_isin_held_med n_isin_total_med \\\n",
|
|||
|
|
"cluster_k5 \n",
|
|||
|
|
"0 2.0 0.666667 2.0 \n",
|
|||
|
|
"1 10.0 0.586798 2.0 \n",
|
|||
|
|
"2 7.5 0.875000 2.0 \n",
|
|||
|
|
"4 7.5 1.381561 3.0 \n",
|
|||
|
|
"3 15.0 1.000000 1.0 \n",
|
|||
|
|
"\n",
|
|||
|
|
" avg_holding_months_per_isin_med exit_rate_per_isin_med \\\n",
|
|||
|
|
"cluster_k5 \n",
|
|||
|
|
"0 13.333333 1.000 \n",
|
|||
|
|
"1 35.166667 1.500 \n",
|
|||
|
|
"2 28.000000 0.500 \n",
|
|||
|
|
"4 45.750000 0.875 \n",
|
|||
|
|
"3 39.000000 0.000 \n",
|
|||
|
|
"\n",
|
|||
|
|
" flow_direction_balance_med redemption_bias_med \\\n",
|
|||
|
|
"cluster_k5 \n",
|
|||
|
|
"0 0.000000 -5.714286e-02 \n",
|
|||
|
|
"1 0.001110 -4.646436e+12 \n",
|
|||
|
|
"2 0.682622 -2.943535e+12 \n",
|
|||
|
|
"4 0.199417 -9.113122e+11 \n",
|
|||
|
|
"3 0.201133 -6.666667e+12 \n",
|
|||
|
|
"\n",
|
|||
|
|
" aum_drawdown_last_med aum_final_to_peak_med \n",
|
|||
|
|
"cluster_k5 \n",
|
|||
|
|
"0 1.000000 0.000000 \n",
|
|||
|
|
"1 1.000000 0.000000 \n",
|
|||
|
|
"2 0.500000 0.500000 \n",
|
|||
|
|
"4 0.940068 0.059932 \n",
|
|||
|
|
"3 0.685315 0.314685 "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"\n",
|
|||
|
|
"===== K=10 =====\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>n_clients</th>\n",
|
|||
|
|
" <th>aum_qty_mean_med</th>\n",
|
|||
|
|
" <th>gross_flow_to_aum_med</th>\n",
|
|||
|
|
" <th>flow_freq_med</th>\n",
|
|||
|
|
" <th>n_tx_total_med</th>\n",
|
|||
|
|
" <th>avg_n_isin_held_med</th>\n",
|
|||
|
|
" <th>n_isin_total_med</th>\n",
|
|||
|
|
" <th>avg_holding_months_per_isin_med</th>\n",
|
|||
|
|
" <th>exit_rate_per_isin_med</th>\n",
|
|||
|
|
" <th>flow_direction_balance_med</th>\n",
|
|||
|
|
" <th>redemption_bias_med</th>\n",
|
|||
|
|
" <th>aum_drawdown_last_med</th>\n",
|
|||
|
|
" <th>aum_final_to_peak_med</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>cluster_k10</th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>9655</td>\n",
|
|||
|
|
" <td>199.700364</td>\n",
|
|||
|
|
" <td>2.561100</td>\n",
|
|||
|
|
" <td>0.058824</td>\n",
|
|||
|
|
" <td>2.0</td>\n",
|
|||
|
|
" <td>0.666667</td>\n",
|
|||
|
|
" <td>2.0</td>\n",
|
|||
|
|
" <td>13.333333</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>-5.714286e-02</td>\n",
|
|||
|
|
" <td>1.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>6</th>\n",
|
|||
|
|
" <td>7</td>\n",
|
|||
|
|
" <td>11281.487500</td>\n",
|
|||
|
|
" <td>1.646680</td>\n",
|
|||
|
|
" <td>0.056000</td>\n",
|
|||
|
|
" <td>7.0</td>\n",
|
|||
|
|
" <td>0.637500</td>\n",
|
|||
|
|
" <td>3.0</td>\n",
|
|||
|
|
" <td>43.222222</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>-0.260413</td>\n",
|
|||
|
|
" <td>-2.225352e+11</td>\n",
|
|||
|
|
" <td>1.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>9</th>\n",
|
|||
|
|
" <td>3</td>\n",
|
|||
|
|
" <td>16597.286822</td>\n",
|
|||
|
|
" <td>2.348949</td>\n",
|
|||
|
|
" <td>0.015504</td>\n",
|
|||
|
|
" <td>3.0</td>\n",
|
|||
|
|
" <td>0.751938</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>46.000000</td>\n",
|
|||
|
|
" <td>0.333333</td>\n",
|
|||
|
|
" <td>-0.547161</td>\n",
|
|||
|
|
" <td>-6.525000e+10</td>\n",
|
|||
|
|
" <td>1.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>40190.138462</td>\n",
|
|||
|
|
" <td>7.329808</td>\n",
|
|||
|
|
" <td>0.046154</td>\n",
|
|||
|
|
" <td>11.0</td>\n",
|
|||
|
|
" <td>0.538462</td>\n",
|
|||
|
|
" <td>3.0</td>\n",
|
|||
|
|
" <td>23.333333</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>-0.206507</td>\n",
|
|||
|
|
" <td>-4.423077e+12</td>\n",
|
|||
|
|
" <td>1.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2</th>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>75884.615385</td>\n",
|
|||
|
|
" <td>4.651799</td>\n",
|
|||
|
|
" <td>0.282051</td>\n",
|
|||
|
|
" <td>15.0</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>39.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.201133</td>\n",
|
|||
|
|
" <td>-6.666667e+12</td>\n",
|
|||
|
|
" <td>6.853147e-01</td>\n",
|
|||
|
|
" <td>0.314685</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3</th>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>20646.937000</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>0.027778</td>\n",
|
|||
|
|
" <td>2.0</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>36.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>-3.347944e+12</td>\n",
|
|||
|
|
" <td>4.840572e-14</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>5</th>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>182517.787500</td>\n",
|
|||
|
|
" <td>8.864544</td>\n",
|
|||
|
|
" <td>0.137500</td>\n",
|
|||
|
|
" <td>13.0</td>\n",
|
|||
|
|
" <td>0.750000</td>\n",
|
|||
|
|
" <td>3.0</td>\n",
|
|||
|
|
" <td>20.000000</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>0.365245</td>\n",
|
|||
|
|
" <td>-2.539125e+12</td>\n",
|
|||
|
|
" <td>1.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4</th>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>152961.538462</td>\n",
|
|||
|
|
" <td>4.491325</td>\n",
|
|||
|
|
" <td>0.030769</td>\n",
|
|||
|
|
" <td>6.0</td>\n",
|
|||
|
|
" <td>1.630769</td>\n",
|
|||
|
|
" <td>4.0</td>\n",
|
|||
|
|
" <td>53.000000</td>\n",
|
|||
|
|
" <td>0.750000</td>\n",
|
|||
|
|
" <td>-0.149927</td>\n",
|
|||
|
|
" <td>-6.461538e+11</td>\n",
|
|||
|
|
" <td>8.801370e-01</td>\n",
|
|||
|
|
" <td>0.119863</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>7</th>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>151342.058824</td>\n",
|
|||
|
|
" <td>2.342905</td>\n",
|
|||
|
|
" <td>0.073529</td>\n",
|
|||
|
|
" <td>9.0</td>\n",
|
|||
|
|
" <td>1.132353</td>\n",
|
|||
|
|
" <td>2.0</td>\n",
|
|||
|
|
" <td>38.500000</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>0.548762</td>\n",
|
|||
|
|
" <td>-1.176471e+12</td>\n",
|
|||
|
|
" <td>1.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>8</th>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>149255.376905</td>\n",
|
|||
|
|
" <td>4.239348</td>\n",
|
|||
|
|
" <td>0.094595</td>\n",
|
|||
|
|
" <td>9.0</td>\n",
|
|||
|
|
" <td>0.635135</td>\n",
|
|||
|
|
" <td>1.0</td>\n",
|
|||
|
|
" <td>47.000000</td>\n",
|
|||
|
|
" <td>2.000000</td>\n",
|
|||
|
|
" <td>0.208726</td>\n",
|
|||
|
|
" <td>-4.869795e+12</td>\n",
|
|||
|
|
" <td>1.000000e+00</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" n_clients aum_qty_mean_med gross_flow_to_aum_med \\\n",
|
|||
|
|
"cluster_k10 \n",
|
|||
|
|
"0 9655 199.700364 2.561100 \n",
|
|||
|
|
"6 7 11281.487500 1.646680 \n",
|
|||
|
|
"9 3 16597.286822 2.348949 \n",
|
|||
|
|
"1 1 40190.138462 7.329808 \n",
|
|||
|
|
"2 1 75884.615385 4.651799 \n",
|
|||
|
|
"3 1 20646.937000 1.000000 \n",
|
|||
|
|
"5 1 182517.787500 8.864544 \n",
|
|||
|
|
"4 1 152961.538462 4.491325 \n",
|
|||
|
|
"7 1 151342.058824 2.342905 \n",
|
|||
|
|
"8 1 149255.376905 4.239348 \n",
|
|||
|
|
"\n",
|
|||
|
|
" flow_freq_med n_tx_total_med avg_n_isin_held_med \\\n",
|
|||
|
|
"cluster_k10 \n",
|
|||
|
|
"0 0.058824 2.0 0.666667 \n",
|
|||
|
|
"6 0.056000 7.0 0.637500 \n",
|
|||
|
|
"9 0.015504 3.0 0.751938 \n",
|
|||
|
|
"1 0.046154 11.0 0.538462 \n",
|
|||
|
|
"2 0.282051 15.0 1.000000 \n",
|
|||
|
|
"3 0.027778 2.0 1.000000 \n",
|
|||
|
|
"5 0.137500 13.0 0.750000 \n",
|
|||
|
|
"4 0.030769 6.0 1.630769 \n",
|
|||
|
|
"7 0.073529 9.0 1.132353 \n",
|
|||
|
|
"8 0.094595 9.0 0.635135 \n",
|
|||
|
|
"\n",
|
|||
|
|
" n_isin_total_med avg_holding_months_per_isin_med \\\n",
|
|||
|
|
"cluster_k10 \n",
|
|||
|
|
"0 2.0 13.333333 \n",
|
|||
|
|
"6 3.0 43.222222 \n",
|
|||
|
|
"9 1.0 46.000000 \n",
|
|||
|
|
"1 3.0 23.333333 \n",
|
|||
|
|
"2 1.0 39.000000 \n",
|
|||
|
|
"3 1.0 36.000000 \n",
|
|||
|
|
"5 3.0 20.000000 \n",
|
|||
|
|
"4 4.0 53.000000 \n",
|
|||
|
|
"7 2.0 38.500000 \n",
|
|||
|
|
"8 1.0 47.000000 \n",
|
|||
|
|
"\n",
|
|||
|
|
" exit_rate_per_isin_med flow_direction_balance_med \\\n",
|
|||
|
|
"cluster_k10 \n",
|
|||
|
|
"0 1.000000 0.000000 \n",
|
|||
|
|
"6 1.000000 -0.260413 \n",
|
|||
|
|
"9 0.333333 -0.547161 \n",
|
|||
|
|
"1 1.000000 -0.206507 \n",
|
|||
|
|
"2 0.000000 0.201133 \n",
|
|||
|
|
"3 0.000000 1.000000 \n",
|
|||
|
|
"5 1.000000 0.365245 \n",
|
|||
|
|
"4 0.750000 -0.149927 \n",
|
|||
|
|
"7 1.000000 0.548762 \n",
|
|||
|
|
"8 2.000000 0.208726 \n",
|
|||
|
|
"\n",
|
|||
|
|
" redemption_bias_med aum_drawdown_last_med aum_final_to_peak_med \n",
|
|||
|
|
"cluster_k10 \n",
|
|||
|
|
"0 -5.714286e-02 1.000000e+00 0.000000 \n",
|
|||
|
|
"6 -2.225352e+11 1.000000e+00 0.000000 \n",
|
|||
|
|
"9 -6.525000e+10 1.000000e+00 0.000000 \n",
|
|||
|
|
"1 -4.423077e+12 1.000000e+00 0.000000 \n",
|
|||
|
|
"2 -6.666667e+12 6.853147e-01 0.314685 \n",
|
|||
|
|
"3 -3.347944e+12 4.840572e-14 1.000000 \n",
|
|||
|
|
"5 -2.539125e+12 1.000000e+00 0.000000 \n",
|
|||
|
|
"4 -6.461538e+11 8.801370e-01 0.119863 \n",
|
|||
|
|
"7 -1.176471e+12 1.000000e+00 0.000000 \n",
|
|||
|
|
"8 -4.869795e+12 1.000000e+00 0.000000 "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"profile_vars = [\n",
|
|||
|
|
" \"aum_qty_mean\",\n",
|
|||
|
|
" \"gross_flow_to_aum\",\n",
|
|||
|
|
" \"flow_freq\",\n",
|
|||
|
|
" \"n_tx_total\",\n",
|
|||
|
|
" \"avg_n_isin_held\",\n",
|
|||
|
|
" \"n_isin_total\",\n",
|
|||
|
|
" \"avg_holding_months_per_isin\",\n",
|
|||
|
|
" \"exit_rate_per_isin\",\n",
|
|||
|
|
" \"flow_direction_balance\",\n",
|
|||
|
|
" \"redemption_bias\",\n",
|
|||
|
|
" \"aum_drawdown_last\",\n",
|
|||
|
|
" \"aum_final_to_peak\",\n",
|
|||
|
|
"]\n",
|
|||
|
|
"\n",
|
|||
|
|
"profile_vars = [c for c in profile_vars if c in dfc.columns]\n",
|
|||
|
|
"\n",
|
|||
|
|
"for k in [2, 5, 10]:\n",
|
|||
|
|
" print(f\"\\n===== K={k} =====\")\n",
|
|||
|
|
" prof = (\n",
|
|||
|
|
" dfc.groupby(f\"cluster_k{k}\")\n",
|
|||
|
|
" .agg(\n",
|
|||
|
|
" n_clients=(ID_COL, \"count\"),\n",
|
|||
|
|
" **{f\"{c}_med\": (c, \"median\") for c in profile_vars}\n",
|
|||
|
|
" )\n",
|
|||
|
|
" .sort_values(\"n_clients\", ascending=False)\n",
|
|||
|
|
" )\n",
|
|||
|
|
" display(prof)"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 47,
|
|||
|
|
"id": "9368ab73-fd28-4b0e-9a8a-17b860cbf6d4",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABNgAAAGGCAYAAACpCjxcAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAkqxJREFUeJzs3XlczWn/P/DXaVOkqEQqWyi7UpFlmLKNfRmMQZYwtoxsKWujZF8zCNNi7Ey2scxMs1gmFUKWMLYscScRiup0fn/4Od85c4qWU1fn9Ho+Hudx1/X5nNOrM93HOe/Pdb0viUwmk4GIiIiIiIiIiIgKRUt0ACIiIiIiIiIiInXGAhsREREREREREVERsMBGRERERERERERUBCywERERERERERERFQELbEREREREREREREXAAhsREREREREREVERsMBGRERERERERERUBCywERERERERERERFQELbEREREREREREREXAAhsREVEp5urqilmzZomOUaJ++ukn2Nra4uHDh6KjEBERERHlCwtsREREAiQmJmLevHlwc3NDkyZN4ODggK+++gphYWF4+/ZtiWTIyMjAunXrEB0dXSI/T10dPnwYoaGhomOUOra2tvjuu++Uxjdu3AhbW1v4+PggJyen0I9/+/ZtLF26FL1794a9vT3atm2LsWPHIj4+viixiYiIiIoFC2xEREQl7M8//0TPnj1x7NgxfP7555g7dy6mTZuG6tWrY9myZQgICCiRHBkZGQgKCkJMTEyJ/Lz86t27Ny5fvgxLS0vRUQAAR44cQXh4uOgYaiE4OBirVq1C3759ERAQAC2twr/V3LdvH/bu3YvGjRtj1qxZGDFiBO7evYtBgwbh77//VmFqIiIioqLTER2AiIioLHnw4AG8vLxQvXp1hIWFwdzcXH5syJAhuH//Pv78809xAVUgPT0d5cuXL/T9tbW1oa2trcJEpVNGRgYMDAxEx1CZLVu2YMWKFejTpw8WLVpUpOIaAHTv3h2TJk1ChQoV5GP9+/dHt27dsG7dOrRu3bqokYmIiIhUhjPYiIiIStCWLVuQnp6OgIAAheLaBzVr1sTw4cPzvP+6detga2urNJ5b37L4+Hh4eHigZcuWaNq0KVxdXeHj4wMAePjwIVxcXAAAQUFBsLW1ha2tLdatWye//+3btzF58mQ4OzujSZMm6NevHyIj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
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 1400x400 with 2 Axes>"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"image/png": "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
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 1400x400 with 2 Axes>"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABMsAAAGGCAYAAABlkwa3AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAmiJJREFUeJzs3XdYk9f7BvA7LEEREHCwXKjgFgQUtdWC1jpwVlvrFrUurLhRq1BF3BMXakGsW4urjn6LbR1FQEXFgbYuHGhRcYIiIb8/LPmZAhZC4iEv9+e6cpWc9yXcRhqT5z3nOTKFQqEAERERERERERERQU90ACIiIiIiIiIiouKCxTIiIiIiIiIiIqJ/sFhGRERERERERET0DxbLiIiIiIiIiIiI/sFiGRERERERERER0T9YLCMiIiIiIiIiIvoHi2VERERERERERET/YLGMiIiIiIiIiIjoHyyWERERERERERER/YPFMiIiomLCy8sLkydPFh3jg/rxxx/h5OSEO3fuiI5CRERERASAxTIiIiKtS05OxvTp0+Ht7Y369evD1dUVX375JTZs2IBXr159kAwZGRlYvnw5YmNjP8jP01X79u1DRESE6BjFjpOTE7777rtc46tXr4aTkxMCAgKQnZ1dpJ+xatUqDBs2DM2aNYOTkxOWL1+e77kPHjzAN998Azc3N7i6umL48OG4fft2kX4+ERERUQ4Wy4iIiLTot99+g4+PDw4ePIhPPvkE3377LcaNGwdbW1vMnz8fwcHBHyRHRkYGQkNDERcX90F+XkF17twZ58+fh52dnegoAID9+/cjMjJSdAydEBYWhsWLF6Nr164IDg6Gnl7R3lYuWbIEFy5cQO3atd973suXL9GvXz/Ex8fj66+/xujRo3H58mX06dMHaWlpRcpAREREBAAGogMQERFJ1e3bt+Hv7w9bW1ts2LABFSpUUB7r3bs3bt26hd9++01cQA1IT09H6dKl1f5+fX196OvrazBR8ZSRkQETExPRMTRm3bp1WLhwIbp06YLZs2cXuVAGANHR0bC3t8fjx4/h6emZ73mbN2/GzZs3sWPHDjRo0AAA8NFHH8HHxwfh4eEYO3ZskbMQERFRycaZZURERFqybt06pKenIzg4WKVQlqNKlSro379/vt+/fPlyODk55RrPq89XYmIifH190aRJEzRo0ABeXl4ICAgA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
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 1400x400 with 2 Axes>"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"def robust_zscore_col(s):\n",
|
|||
|
|
" med = np.nanmedian(s)\n",
|
|||
|
|
" mad = np.nanmedian(np.abs(s - med))\n",
|
|||
|
|
" if mad == 0 or np.isnan(mad):\n",
|
|||
|
|
" return np.zeros(len(s))\n",
|
|||
|
|
" return (s - med) / (1.4826 * mad)\n",
|
|||
|
|
"\n",
|
|||
|
|
"for k in [2, 5, 10]:\n",
|
|||
|
|
" prof = dfc.groupby(f\"cluster_k{k}\")[profile_vars].median()\n",
|
|||
|
|
" prof_z = prof.copy()\n",
|
|||
|
|
"\n",
|
|||
|
|
" for c in prof.columns:\n",
|
|||
|
|
" prof_z[c] = robust_zscore_col(prof[c].values)\n",
|
|||
|
|
"\n",
|
|||
|
|
" plt.figure(figsize=(14, 4))\n",
|
|||
|
|
" sns.heatmap(prof_z, cmap=\"RdBu_r\", center=0)\n",
|
|||
|
|
" plt.title(f\"Cluster signatures — K={k}\")\n",
|
|||
|
|
" plt.tight_layout()\n",
|
|||
|
|
" plt.show()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 48,
|
|||
|
|
"id": "6e7fa1e2-cec7-41be-943f-d06b25e1e175",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAtkAAAKyCAYAAAAAfsIHAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAq15JREFUeJzs3XlU1dX+//EXqEgoohhexAER9VihCIaIouSU2c1SydRM06gkHFJD0UoTMzHNIafEQlNRypxKzLns3kpTyzlCzQGHVKScQEU55/dHv873nlDzwIED8nys9VnLz977s/d7k/euN9v92R8Hk8lkEgAAAACbcbR3AAAAAMC9hiQbAAAAsDGSbAAAAMDGSLIBAAAAGyPJBgAAAGyMJBsAAACwMZJsAAAAwMZIsgEAAAAbI8kGgBLml19+0YwZM/Tbb7/ZOxQAuGeRZAPFxIwZM2QwGOwdBu5gxIgRat26tV1j+Ke/J5cvX9aAAQN08eJFVa1atRAjA4CShSQbsIMVK1bIYDCYrwYNGig0NFQRERFauHChrly5YpNxzp49qxkzZiglJcUm/ZUUV69e1YwZM/TDDz/YNY45c+Zo06ZNNu1z5MiRevDBB/X666/btN+C8sMPP8hgMGjdunUW5dnZ2erXr5/q16+vZcuW5WuMrVu3auTIkWrfvr38/f3Vpk0bvfHGGzp37ly++gVQspFkA3Y0aNAgTZw4UWPGjFGvXr0kSePHj9eTTz6pX375xaLtK6+8or1791rV/7lz5zRz5kySbCtdvXpVM2fO1Pbt26167u23386VDOZHfHy81Un2nf6enDx5Un5+fpo0aZIcHYvv//3fuHFDgwYN0jfffKO3335bTz/9dL76mzRpkrZv3662bdvqzTff1L///W+tXbtWnTt3Vnp6uo2iBlDSlLZ3AEBJ1rJlSzVo0MB8369fP23dulWRkZGKiorSl19+KWdnZ0lS6dKlVbo0/5MtirKysuTi4qIyZcrYPYY7/T2pXr26IiMjCzky27px44YGDx6sLVu2aOzYseratWu++xw5cqQaN25s8YtHixYt9NxzzykxMVFDhgzJ9xgASp7iu5QB3KNCQkIUFRWlU6dO6YsvvjCX32qv7XfffacePXro4YcfVkBAgNq3b68pU6ZI+vOf2f9a4Rs5cqR5a8qKFSskSTt37tSgQYP0yCOPyM/PT2FhYRo/fryuXbtmMcaIESMUEBCgs2fPKioqSgEBAWratKneffdd5eTkWLQ1Go1asGCBOnbsqAYNGqhp06aKiIjQvn37LNp9/vnn6tKlixo2bKgmTZpoyJAhd/US3l8/g6NHjyo6OlqNGzdW06ZNNW3aNJlMJv3222965ZVXFBgYqObNm2vevHkWz2dnZ+v9999Xly5d1LhxYzVq1EjPPvustm3bZm5z8uRJhYSESJJmzpxp/rnNmDHD4ueRlpaml156SQEBAYqOjjbX/e+e7OnTp6t+/fraunWrRRyjRo2Sn59frn+t+F8Gg0FZWVlauXKlOYYRI0ZY/BwOHz6s1157TUFBQXr22Wct6v7ubn/me/bsUUREhBo3bix/f38999xz+vHHH2//H6UQ3bx5U0OHDtXmzZs1ZswYPfPMMzbpNygoKNfKflBQkCpWrKgjR47YZAwAJQ/LYkAR9NRTT2nKlCn69ttvb5tIHDp0SP369ZPBYNCgQYPk5OSk48eP66effpIk+fr6atCgQZo+fbq6deumxo0bS5ICAwMlSevWrdO1a9fUo0cPVaxYUXv37lViYqLOnDmj6dOnW4yVk5OjiIgINWzYUMOHD9fWrVs1b9481ahRw5zcSdIbb7yhFStWqGXLlnr66aeVk5OjnTt3as+ePeYV+w8++EDvv/++OnTooKefflq///67EhMT1bNnT61atUoVKlT4x5/PkCFD5Ovrq9dee03ffPONPvjgA1WsWFGffPKJmjZtqujoaK1evVrvvvuuGjRooKCgIEnSlStX9Nlnn+mJJ55Q165dlZmZqWXLlunFF1/UZ599pgceeEDu7u4aM2aMxowZo3bt2qldu3aSZJG43rx505yIxsTEmP+14e9eeeUVff3113rjjTf0xRdfqHz58vrvf/+rpUuX6tVXX1X9+vVvO8eJEyfqzTffVMOGDc1/B2rWrGnR5tVXX5W3t7eGDBkik8l0277u9me+detWvfTSS/Lz89OAAQPk4OCgFStW6Pnnn9eSJUvUsGHDf/xvU1BycnI0dOhQbdy4UaNHj1b37t1ztblx44YuX758V/1VrFjxjltmMjMzlZmZqUqVKuU5ZgAlnAlAoVu+fLmpXr16pr179962TePGjU2dOnUy30+fPt1Ur1498/38+fNN9erVM2VkZNy2j71795rq1atnWr58ea66q1ev5iqLj483GQwG06lTp8xlMTExpnr16plmzpxp0bZTp06mzp07m++3bt1qqlevnuntt9/O1a/RaDSZTCbTyZMnTQ888IDpgw8+sKhPTU01Pfjgg7nK/+6vn8GoUaPMZTdv3jS1bNnSZDAYTPHx8ebyixcvmho2bGiKiYmxaHv9+nWLPi9evGhq1qyZaeTIkeayjIwMU7169UzTp0/PFcNfP4/33nvvlnWtWrXKNbeHHnrI9MYbb5guXrxoatGihalLly6mGzdu3HGuJpPJ1KhRI4v4//5zGDp06G3r/nK3P3Oj0Wh69NFHTS+88IL5v5fJ9Offk9atW5v69u37j/EWhG3btpnq1atnatWqlalevXqmxMTEf2x7N9eJEyfuOO6sWbNM9erVM33//fe2nhKAEoKVbKCIcnFxUWZm5m3r/1p93Lx5s8LDw61+ke1/V1+zsrJ07do1BQQEyGQy6eeff5aXl5dF+x49eljcN27c2GI7y4YNG+Tg4KABAwbkGsvBwUGStHHjRhmNRnXo0EG///67uf7++++Xt7e3fvjhh7vaM/y/L7qVKlVKfn5+OnPmjEV5hQoV5OPjoxMnTli0LVWqlKQ/t7ZcunRJRqNRfn5++vnnn/9x3P/195/H7dSrV0+DBg3S5MmTlZqaqj/++EPz5s2zyf76W63m/t3d/sxTUlJ07NgxvfLKK/rjjz8s+ggJCdHnn38uo9Fotxcmz58/r9KlS6t69eq3bVO/fn3Nnz//rvrz8PC4bd2OHTs0a9YsdejQwbx1CACsRZINFFFZWVmqXLnybesff/xxffbZZ3rzzTc1efJkhYSEqF27dnrsscfuKhE6ffq0pk+frq+++koXL160qPv7EYJly5aVu7u7RZmbm5vFc2lpaapSpYoqVqx42zGPHTsmk8mkRx999Jb1d5t4/v0XAFdX11vG6OrqqgsXLliUrVy5UvPmzdPRo0d148YNc/mdkrdbxenp6XnX7SMiIrRmzRrt3btXQ4cOVZ06de762Tu5m5jv9md+7NgxSVJMTMxt+7p8+bLc3NxuWZefUzjulPD+ZdiwYVqwYIFeffVVJSQkmLc//S83Nzc1a9Ysz3FI0q+//qoBAwaobt26GjduXL76AvCnHTt2KCEhQfv371d6erpmzZqltm3b3vXz169f11tvvaUDBw7o119/1SOPPKLZs2dbtNmwYYOSkpKUkpKi7Oxs1a1bVwMGDFCLFi1sPZ27RpINFEFnzpzR5cuXc+3B/V/Ozs5avHixfvjhB23ZskX//e9/9eWXX+rTTz/VvHnzzCu2t5KTk6O+ffvq4sWLevHFF1W7dm25uLjo7NmzGjFihIxGo0X7O/VlDaPRKAcHB3344Ye37NPFxeWu+rnVLxG3i9H0P3uVP//8c40YMUJt27ZVRESEKleurFKlSik+Pt5ixfufODk5WbWie+LECR0/flySdPDgwbt+7p+ULVv2H9vc7c/8r5/T8OHD9cADD9yyrzv99wkNDb2bkG8pNTX1H9t4eHho/vz56tGjh/r166fExMRce9qzs7Nz/cJ4O+7u7rl+Hr/99psiIiJUvnx5zZ07V+XLl7/7SQC4raysLBkMBoWHh9/yXzv/SU5OjsqWLatevXpp/fr1t2yzY8cONWvWTEOGDFGFChW0YsUKvfLKK1q
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 800x700 with 2 Axes>"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAtkAAAKyCAYAAAAAfsIHAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAqn1JREFUeJzs3XlU1dX+//EXqEgIohhewAEV9WjhAKWIkqRpZTevU6ZmmkYl4ZCailaakIlDDjlrF82RMqcScy67t3IsNTVCuw6opCKlIqgo5/z+6Nf5dgLNA4dzQJ6PtT5r+dl7f/Z+b9LW2+3+7I+TyWQyCQAAAIDNODs6AAAAAOBeQ5INAAAA2BhJNgAAAGBjJNkAAACAjZFkAwAAADZGkg0AAADYGEk2AAAAYGMk2QAAAICNkWQDQAnz008/aebMmfrll18cHQoA3LNIsoFiYubMmTIYDI4OA3cwcuRItW7d2qEx/N3vk4yMDA0YMECXL1+Wr6+vHSMDgJKFJBtwgDVr1shgMJivBg0aKCwsTBEREVqyZImuXr1qk3HOnz+vmTNnKikpySb9lRTXrl3TzJkztXv3bofGMW/ePG3bts2mfY4aNUoPPPCA3njjDZv2W1h2794tg8GgTZs2WZRnZ2erX79+qlevnlatWlWgMf765/HPV1paWoH6BlBylXZ0AEBJNmjQIFWtWlW3bt3SxYsXtWfPHo0fP14ffvih5syZo3r16pnbvvrqq3rllVes6v/ChQuaNWuWqlSpovr169s6/HvWtWvXNGvWLA0YMEAhISF3/dw777wjk8lkszjmz5+vJ554Qm3atLnrZ+70++TMmTMKDAxU37595excfNdYbt68qUGDBumrr77SO++8o2eeecYm/f7x5/HPypcvb5O+AZQ8JNmAA7Vs2VINGjQw3/fr1087d+5UZGSkoqKi9Pnnn8vV1VWSVLp0aZUuzR/ZoigrK0tubm4qU6aMw2O40++TqlWrKjIy0s6R2dbNmzc1ePBg7dixQ7GxseratavN+v7rn0cAKIjiu5QB3KNCQ0MVFRWls2fP6rPPPjOX57XX9ptvvlGPHj308MMPKygoSE888YSmTp0q6fd/Zv9jhW/UqFHmf/5es2aNJGnfvn0aNGiQHn30UQUGBio8PFzjx4/X9evXLcYYOXKkgoKCdP78eUVFRSkoKEjNmjXTxIkTlZOTY9HWaDRq8eLFat++vRo0aKBmzZopIiJChw4dsmj36aefqnPnzmrYsKGaNm2qIUOG3NVLeH/8DE6cOKFhw4bpoYceUrNmzTR9+nSZTCb98ssvevXVVxUcHKwWLVpo4cKFFs9nZ2fr/fffV+fOnfXQQw+pcePGeu6557Rr1y5zmzNnzig0NFSSNGvWLPPPbebMmRY/j5SUFL388ssKCgrSsGHDzHV/3pM9Y8YM1atXTzt37rSIY/To0QoMDNRPP/1027kaDAZlZWVp7dq15hhGjhxp8XP4+eef9frrr6tJkyZ67rnnLOr+6m5/5gcPHlRERIQeeughNWrUSM8//7y+++672/9HsaNbt25p6NCh2r59u8aOHatnn33W5mNcvXo11+9rAMgPlsWAIqhDhw6aOnWqvv7669smEseOHVO/fv1kMBg0aNAgubi46NSpU/r+++8lSQEBARo0aJBmzJihbt266aGHHpIkBQcHS5I2bdqk69evq0ePHqpQoYJ++OEHLVu2TOfOndOMGTMsxsrJyVFERIQaNmyoESNGaOfOnVq4cKGqVatmTu4k6c0339SaNWvUsmVLPfPMM8rJydG+fft08OBB8wrh3Llz9f7776tdu3Z65pln9Ouvv2rZsmXq2bOn1q1bd1f/PD9kyBAFBATo9ddf11dffaW5c+eqQoUK+uijj9SsWTMNGzZM69ev18SJE9WgQQM1adJE0u8J1CeffKKnn35aXbt2VWZmplatWqWXXnpJn3zyierXry8vLy+NHTtWY8eOVdu2bdW2bVtJskhcb926ZU5Eo6Ojzf/a8FevvvqqvvzyS7355pv67LPP5O7urv/+979auXKlXnvtNYvtQH81adIkvfXWW2rYsKH590D16tUt2rz22mvy9/fXkCFD7rhN5W5/5jt37tTLL7+swMBADRgwQE5OTlqzZo1eeOEFrVixQg0bNvzb/zaFJScnR0OHDtXWrVs1ZswYde/ePVebmzdvKiMj4676q1ChQq4tM71791ZWVpbKlCmjsLAwjRw5UjVq1LBF+ABKIhMAu1u9erWpbt26ph9++OG2bR566CFTx44dzfczZsww1a1b13y/aNEiU926dU3p6em37eOHH34w1a1b17R69epcddeuXctVNn/+fJPBYDCdPXvWXBYdHW2qW7euadasWRZtO3bsaOrUqZP5fufOnaa6deua3nnnnVz9Go1Gk8lkMp05c8ZUv35909y5cy3qk5OTTQ888ECu8r/642cwevRoc9mtW7dMLVu2NBkMBtP8+fPN5ZcvXzY1bNjQFB0dbdH2xo0bFn1evnzZ1Lx5c9OoUaPMZenp6aa6deuaZsyYkSuGP34e7733Xp51rVq1yjW3Bx980PTmm2+aLl++bHrkkUdMnTt3Nt28efOOczWZTKbGjRtbxP/Xn8PQoUNvW/eHu/2ZG41G0+OPP2568cUXzf+9TKbff5+0bt3a1Ldv37+NtzDs2rXLVLduXVOrVq1MdevWNS1btuxv297Ndfr0afNzGzZsMI0cOdK0du1a09atW03Tpk0zNWrUyBQSEmJKTU21xzQB3INYyQaKKDc3N2VmZt62/o/Vx+3bt6tLly5Wv8j259XXrKwsXb9+XUFBQTKZTPrxxx/l5+dn0b5Hjx4W9w899JDFdpYtW7bIyclJAwYMyDWWk5OTJGnr1q0yGo1q166dfv31V3P9/fffL39/f+3evfuu9gz/+UW3UqVKKTAwUOfOnbMoL1++vGrWrKnTp09btC1VqpSk37e2XLlyRUajUYGBgfrxxx//dtw/++vP43bq1q2rQYMGacqUKUpOTtZvv/2mhQsX2mR/fV6ruX91tz/zpKQknTx5Uq+++qp+++03iz5CQ0P16aefymg0OuyFyYsXL6p06dK5Xkz8s3r16mnRokV31Z+3t7f510899ZSeeuop832bNm0UFham559/XnPnzlVsbGz+AwdQYpFkA0VUVlaWKlWqdNv6p556Sp988oneeustTZkyRaGhoWrbtq2efPLJu0qEUlNTNWPGDH3xxRe6fPmyRd1fjxAsW7asvLy8LMo8PT0tnktJSVHlypVVoUKF24558uRJmUwmPf7443nW323i+de/AHh4eOQZo4eHhy5dumRRtnbtWi1cuFAnTpzQzZs3zeV3St7yitPHx+eu20dERGjDhg364YcfNHToUNWuXfuun72Tu4n5bn/mJ0+elCRFR0fftq+MjAx5enrmWVeQo+7+nPDezvDhw7V48WK99tprio+PN29/+jNPT081b94833H82cMPP6xGjRrl2k8PwHp79+5VfHy8Dh8+rLS0NM2ePduqU5Nu3Liht99+W0eOHNH//vc/Pfroo5ozZ45Fmy1btighIUFJSUnKzs5WnTp1NGDAAD3yyCO2ns5dI8kGiqBz584pIyMj1x7cP3N1ddXy5cu1e/du7dixQ//973/1+eef6+OPP9bChQvNK7Z5ycnJUd++fXX58mW99NJLqlWrltzc3HT+/HmNHDlSRqPRov2d+rKG0WiUk5OTPvjggzz7dHNzu6t+8vpLxO1iNP1pr/Knn36qkSNHqk2bNoqIiFClSpVUqlQpzZ8/32LF+++4uLhYtaJ7+vRpnTp1SpJ09OjRu37u75QtW/Zv29ztz/yPn9OIESNue9zjnf77hIWF3U3IeUpOTv7bNt7e3lq0aJF69Oihfv36admyZbn2tGdnZ+f6C+PteHl5/e3vax8fH504ceKu+gNwe1lZWTIYDOrSpUue/9r5d3JyclS2bFn16tVLmzdvzrPN3r171bx5cw0ZMkTly5fXmjVr9Oqrr2rlypV64IEHCjqFfCHJBoqgTz/9VNLfJy7Ozs4KDQ1VaGi
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 800x700 with 2 Axes>"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAtkAAAKyCAYAAAAAfsIHAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAqzZJREFUeJzs3XlcVdX+//E3qEgIohhexAEV9WjhAKWIEqRp082cMjXTNCoJh9RUtNLETMw5p9QumiNlTiXmXHav5VhqaoR6HVBJQUpFUFHO+f3Rr/O9J9A8cDgH5PV8PPbj4V5r7bU+i7zf74fl2ms7mUwmkwAAAADYjLOjAwAAAADuNSTZAAAAgI2RZAMAAAA2RpINAAAA2BhJNgAAAGBjJNkAAACAjZFkAwAAADZGkg0AAADYGEk2ANyjfvnlF82cOVO//vqro0MBgBKHJBsoYmbOnCmDweDoMHAHI0aMUOvWrR0aw9/9PcnIyFD//v11+fJlValSxY6RAQAkkmygUK1evVoGg8F8NWzYUKGhoYqIiNDixYt19epVm4xz4cIFzZw5U4mJiTbpr6S4du2aZs6cqd27dzs0jrlz52rr1q027XPkyJF64IEH9NZbb9m038Kye/duGQwGbdy40aI8Oztbffv2Vf369bVy5coCjZGamqrJkyerZ8+eCgwMlMFguON/+x9//FHdu3dX48aN1bJlS40bN06ZmZkFigFAyUGSDdjBwIEDNXHiRI0ZM0Y9e/aUJI0fP17PPvusfvnlF4u2r7/+un766Ser+k9NTdWsWbNIsq107do1zZo1S3v27LHquffeey9XMlgQ8+bNszrJvtPfk7NnzyogIECTJk2Ss3Px/T/zN2/e1MCBA/Xtt9/qvffe03PPPVeg/k6ePKmPP/5Yqampf/uvRYmJierdu7euX7+uESNG6LnnntNnn32mN954o0AxACg5Sjs6AKAkCAsLU8OGDc33ffv21c6dOxUZGamoqCh99dVXcnV1lSSVLl1apUvzP82iKCsrS25ubipTpozDY7jT35Nq1aopMjLSzpHZ1s2bNzVo0CBt375dY8eOVZcuXQrc54MPPqjdu3erQoUK2rhxo/bv33/btlOnTlX58uW1ZMkSubu7S/rj5/rOO+9ox44dCg0NLXA8AO5txXeJAyjmQkJCFBUVpXPnzunLL780l+e11/a7775T9+7d9fDDDyswMFBPPPGEpk6dKumPf2b/c4Vv5MiR5q0pq1evliTt27dPAwcO1KOPPqqAgACFh4dr/Pjxun79usUYI0aMUGBgoC5cuKCoqCgFBgaqefPm+uCDD5STk2PR1mg0atGiRWrXrp0aNmyo5s2bKyIiQocOHbJo98UXX6hTp05q1KiRmjVrpsGDB9/VS3h//gxOnjypoUOH6qGHHlLz5s01ffp0mUwm/frrr3r99dcVFBSkli1basGCBRbPZ2dn68MPP1SnTp300EMPqUmTJnrhhRe0a9cuc5uzZ88qJCREkjRr1izzz23mzJkWP4/k5GS9+uqrCgwM1NChQ811/7sne8aMGapfv7527txpEceoUaMUEBCQ618r/pfBYFBWVpbWrFljjmHEiBEWP4fjx4/rzTffVNOmTfXCCy9Y1P3V3f7MDx48qIiICD300ENq3LixXnzxRf3www+3/49iR7du3dKQIUO0bds2jRkzRs8//7xN+nV3d1eFChX+tt3Vq1f1/fff69lnnzUn2JLUvn17ubm5acOGDTaJB8C9jeUywIHat2+vqVOnaseOHbdNJI4dO6a+ffvKYDBo4MCBcnFx0enTp/Xjjz9Kkvz9/TVw4EDNmDFDXbt21UMPPSRJCgoKkiRt3LhR169fV/fu3VWhQgX99NNPWrp0qc6fP68ZM2ZYjJWTk6OIiAg1atRIw4cP186dO7VgwQJVr17dnNxJ0ttvv63Vq1crLCxMzz33nHJycrRv3z4dPHjQvGL/0Ucf6cMPP9RTTz2l5557Tr/99puWLl2qHj16aO3atSpfvvzf/nwGDx4sf39/vfnmm/r222/10UcfqUKFCvr000/VvHlzDR06VOvWrdMHH3yghg0bqmnTppL+SJI+//xzPfPMM+rSpYsyMzO1cuVKvfLKK/r888/VoEEDeXl5acyYMRozZozatm2rtm3bSpJF4nrr1i1zIhodHW3+14a/ev311/XNN9/o7bff1pdffil3d3f95z//0YoVK/TGG2+ofv36t53jxIkT9c4776hRo0bmvwM1atSwaPPGG2/Iz89PgwcPlslkum1fd/sz37lzp1599VUFBASof//+cnJy0urVq/XSSy9p+fLlatSo0d/+tyksOTk5GjJkiLZs2aLRo0erW7duudrcvHlTGRkZd9VfhQoVrN4yk5SUpFu3bikgIMCi3MXFRQ0aNGBbFoC7YwJQaFatWmWqV6+e6aeffrptm4ceesjUoUMH8/2MGTNM9erVM98vXLjQVK9ePVN6evpt+/jpp59M9erVM61atSpX3bVr13KVzZs3z2QwGEznzp0zl0VHR5vq1atnmjVrlkXbDh06mDp27Gi+37lzp6levXqm9957L1e/RqPRZDKZTGfPnjU1aNDA9NFHH1nUJyUlmR544IFc5X/1589g1KhR5rJbt26ZwsLCTAaDwTRv3jxz+eXLl02NGjUyRUdHW7S9ceOGRZ+XL182tWjRwjRy5EhzWXp6uqlevXqmGTNm5Irhz5/H5MmT86xr1apVrrk9+OCDprffftt0+fJl0yOPPGLq1KmT6ebNm3ecq8lkMjVp0sQi/r/+HIYMGXLbuj/d7c/caDSaHn/8cdPLL79s/u9lMv3x96R169amPn36/G28hWHXrl2mevXqmVq1amWqV6+eaenSpX/b9m6uM2fO5NnHhg0bTPXq1TPt2rXrtnV79+7NVTdw4EBTy5Yt8z9RACUGK9mAg7m5ud3xxII/Vx+3bdumzp07W70q97+rr1lZWbp+/boCAwNlMpn0888/y9fX16J99+7dLe4feughi+0smzdvlpOTk/r3759rLCcnJ0nSli1bZDQa9dRTT+m3334z199///3y8/PT7t2772rP8P++6FaqVCkFBATo/PnzFuXly5dXrVq1dObMGYu2pUqVkvTH1pYrV67IaDQqICBAP//889+O+7/++vO4nXr16mngwIGaMmWKkpKS9Pvvv2vBggU22V+f12ruX93tzzwxMVGnTp3S66+/rt9//92ij5CQEH3xxRcyGo0Oe2Hy4sWLKl26tKpVq3bbNvXr19fChQvvqj9vb2+rY/hzK5WLi0uuurJly+baagUAeSHJBhwsKytLlSpVum39008/rc8//1zvvPOOpkyZopCQELVt21ZPPvnkXSVCKSkpmjFjhr7++mtdvnzZou6vRwiWLVtWXl5eFmWenp4WzyUnJ6ty5cp33Nt66tQpmUwmPf7443nW323i+ddfADw8PPKM0cPDQ5cuXbIoW7NmjRYsWKCTJ0/q5s2b5vI7JW95xenj43PX7SMiIrR+/Xr99NNPGjJkiOrUqXPXz97J3cR8tz/zU6dOSZKio6Nv21dGRoY8PT3zrEtLS/vbWG7nbhLeYcOGadGiRXrjjTcUFxdn3v70vzw9PdWiRYt8x/F3/vzFNDs7O1fdjRs3brttCEDe9u7dq7i4OB0+fFhpaWmaPXu22rRpc9fP37hxQ++++66OHDmi//73v3r00Uc1Z84cizabN29WfHy8EhMTlZ2drbp166p///565JFHbD2du0aSDTjQ+fPnlZGRkWsP7v9ydXXVsmXLtHv3bm3fvl3/+c9/9NVXX+mzzz7TggULzCu2ecnJyVGfPn10+fJlvfLKK6pdu7bc3Nx04cIFjRgxQkaj0aL9nfqyhtFolJOTkz7++OM8+3Rzc7urfvL6JeJ2MZr+Z6/yF198oREjRqhNmzaKiIhQpUqVVKpUKc2bN89ixfvvuLi4WLWie+bMGZ0+fVqSdPTo0bt+7u+ULVv2b9vc7c/8z5/T8OHD1aBBgzz7utN/n4KcqpGUlPS3bby9vbVw4UJ1795dffv21dKlS3Ptac/Ozs7
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 800x700 with 2 Axes>"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"def plot_distance_matrix_sorted(X_scaled, labels, max_points=400, title=\"Distance matrix\"):\n",
|
|||
|
|
" n = X_scaled.shape[0]\n",
|
|||
|
|
" idx = np.arange(n)\n",
|
|||
|
|
"\n",
|
|||
|
|
" if n > max_points:\n",
|
|||
|
|
" rng = np.random.default_rng(42)\n",
|
|||
|
|
" idx = rng.choice(idx, size=max_points, replace=False)\n",
|
|||
|
|
"\n",
|
|||
|
|
" X_sub = X_scaled[idx]\n",
|
|||
|
|
" labels_sub = np.asarray(labels)[idx]\n",
|
|||
|
|
"\n",
|
|||
|
|
" order = np.lexsort((np.arange(len(labels_sub)), labels_sub))\n",
|
|||
|
|
" X_sub = X_sub[order]\n",
|
|||
|
|
"\n",
|
|||
|
|
" D = pairwise_distances(X_sub)\n",
|
|||
|
|
"\n",
|
|||
|
|
" plt.figure(figsize=(8, 7))\n",
|
|||
|
|
" sns.heatmap(D, cmap=\"viridis\")\n",
|
|||
|
|
" plt.title(title)\n",
|
|||
|
|
" plt.tight_layout()\n",
|
|||
|
|
" plt.show()\n",
|
|||
|
|
"\n",
|
|||
|
|
"for k in [2, 5, 10]:\n",
|
|||
|
|
" plot_distance_matrix_sorted(\n",
|
|||
|
|
" X_scaled,\n",
|
|||
|
|
" dfc[f\"cluster_k{k}\"].values,\n",
|
|||
|
|
" title=f\"Distance matrix triée — K={k}\"\n",
|
|||
|
|
" )"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 51,
|
|||
|
|
"id": "3c052322-6566-4567-b084-81148fa65538",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAGGCAYAAADmRxfNAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAZK1JREFUeJzt3XlcVOXix/HPDIuIu4j7kmYgKoZmLrglmZlLuWSZYTdzX1uvy9Vr6c3QSlNTU3PNbHdpMy3zek3F0tI019zXFMElBURmzu+PE/OTQGUAOTB8368XJWfO8szwMMz3PJvNMAwDERERERGRLLBbXQAREREREcn7FCxERERERCTLFCxERERERCTLFCxERERERCTLFCxERERERCTLFCxERERERCTLFCxERERERCTLFCxERERERCTLFCxERERERCTLFCxExG1vv/02wcHBVhcjz+rRowc9evSwuhjp0s825wQHB/P2229n6tiIiAhGjBiRzSVKbcSIEURERNzWa4iIZ1GwEMnnli1bRnBwsOsrNDSUpk2b0qtXL9577z0uX76cLdc5c+YMb7/9Nnv27MmW80nOiYiIyPQHYJHMioiIoF+/fmm2r1ixgpCQEHr16sXVq1czff7Tp08zffp0Hn30Ue69914aNmxIjx492LRpU1aKLZKveVtdABHJHYYOHUrFihVJTk7m3Llz/PTTT7z22mssXLiQmTNnUqNGDde+AwYMoG/fvm6d/+zZs0yfPp0KFSoQEhKS3cUXyXN27NiBl5dXpo5dtWoVNpstm0uU+33xxReMHDmS8PBwZs6cSYECBTJ9ru+//553332XVq1a0alTJ5KTk/n888/p2bMnr732Gl26dMnGkovkDwoWIgJA8+bNCQ0NdX3fr18/oqOj6d+/PwMHDmTlypX4+fkB4O3tjbe33j5E3OV0Orl27RoFChTI0odiX1/fbCxV3vD1118zYsQIGjVqlOVQAdCwYUP++9//UrJkSde2J554gkceeYRp06YpWIhkgrpCicgNNW7cmIEDB3Ly5Em++OIL1/b0+uFv3LiRJ554gvr161O3bl0efPBBJk+eDMCPP/7Io48+CsDIkSNd3a6WLVsGwNatWxk6dCj33XcftWvXpkWLFrz22mskJiamusaIESOoW7cuZ86cYeDAgdStW5dGjRoxceJEHA5Hqn2dTieLFi2i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
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 800x400 with 1 Axes>"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAGGCAYAAADmRxfNAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAW09JREFUeJzt3XlcVFXjx/Evq4AoKOK+Z4yoGC6VayapmeVTaouV2qKmuVXWT21PW8AWK1PTyi2XLBXNsrTIp0dNLC0tNbfcUVMQFWURmLm/P4YZGQEFBhmEz/v1mhfMnTt3zp05c+d+7zn3XDfDMAwBAAAAgBPcXV0AAAAAANc+ggUAAAAApxEsAAAAADiNYAEAAADAaQQLAAAAAE4jWAAAAABwGsECAAAAgNMIFgAAAACcRrAAAAAA4DSCBYAC++ijj2QymVxdjGtW//791b9/f1cXI1d8tsXHZDLpo48+KtRzIyIiNG7cuCIukaNx48YpIiLiqr4GgNKFYAGUcdHR0TKZTPZbWFiYOnTooIEDB+rzzz/X+fPni+R1Tpw4oY8++kg7d+4skuWh+ERERBR6BxgorIiICA0ZMiTH9OXLlys0NFQDBw7UhQsXnHqN7Nu+7LdPPvnEqeUCZZWnqwsAoGQYNWqUateurczMTCUkJOi3337TW2+9pTlz5mjatGlq3Lixfd4nn3xSTzzxRIGWf/LkSU2ZMkW1atVSaGhoURcfuOb89ddf8vDwKNRzV61aJTc3tyIuUcm3YsUKPf/882rXrp2mTZumcuXKOb3M9u3b6+6773aY1qRJE6eXC5RFBAsAkqRbbrlFYWFh9vtDhgxRbGyshg4dqmHDhum7776Tj4+PJMnT01Oenmw+gIKyWCzKyMhQuXLlnNop9vb2LsJSXRtWrlypcePGqU2bNkUWKiSpfv36OYIFgMKhKxSAPLVt21bDhg3T0aNHtWLFCvv03Prh//LLL3rwwQfVunVrtWjRQrfffrsmTZokSfr111917733SpKef/55e3eD6OhoSdLmzZs1atQo3XrrrWrWrJk6deqkt956S2lpaQ6vMW7cOLVo0UInTpzQsGHD1KJFC7Vp00YTJ06U2Wx2mNdisWju3Lnq2bOnwsLC1KZNGw0cOFDbtm1zmO/rr79W79691bx5c91000165plndPz4cYd5Dh48qJEjR6p9+/YKCwvTLbfcomeeeUbnzp274nv45ZdfqkuXLmrevLnuvfdebd68Occ86enp+vDDD9W7d2+1atVK4eHheuihh7Rx40aH+eLi4mQymTRz5kz7cps1a6Y+ffror7/+cpg3Pj5ezz//vG655RY1a9ZMHTp00JNPPqm4uLgrljk/kpKS9Oabb6pTp05q1qyZunbtqk8++UQWi8VhvpUrV6p3795q0aKFWrZsqZ49e2ru3Ln2x21d8TZt2qRXXnlFN998s1q2bKkxY8bo7NmzDsuKiYnRE088oQ4dOqhZs2bq0qWLpk6dmuOzl6Q///xTgwcP1o033qjw8PAcrytJ+/bt06hRo3TTTTcpLCxMvXv31k8//ZSv9U9JSVFUVJR9/W+//XbNnDlThmE4zGcymTRhwgStWLFCd955p8LCwrRu3Tr7Y5d2Mfv111/Vu3dvhYWFqUuXLlq0aFGu37dLz7GwvY+///67IiMj1aZNG4WHh2v48OFKTEws9PtYUnz33Xf6v//7P9100036+OOPiyxU2KSlpTndrQoALRYAruDuu+/WpEmTtH79et1///25zrN3714NGTJEJpNJo0aNkre3tw4dOqQ//vhDknTddddp1KhRmjx5sh544AG1atVKktSyZUtJ1m4daWlpevDBBxUYGKi//vpL8+fP17///qvJkyc7vJbZbNbAgQPVvHlzjRkzRrGxsZo1a5bq1Kmjhx56yD7fiy++qOjoaN1yyy269957ZTabtXnzZv3555/2lpmPP/5YH374oe644w7de++9SkxM1Pz58/Xwww9r+fLlqlixotLT0zVw4EClp6erX79+qlKlik6cOKGff/5ZSUlJqlChQp7v3eLFi/XKK6+oRYsWeuSRR3TkyBE9+eSTCggIUI0aNezznT9/XosXL9Zdd92l++67T8nJyVqyZIkGDRqkxYsX5+g69u233yo5OVkPPPCA3Nzc9Nlnn2nkyJGKiYmRl5eXJGnkyJH6559/1K9fP9WqVUuJiYn65ZdfdPz4cdWuXTtfn31eUlNT1a9fP504cUJ9+/ZVjRo1tGXLFk2aNEnx8fF68cUXJVnD5ujRo9W2bVs999xzkqT9+/frjz/+0COPPOKwzAkTJqhixYoaMWKEDhw4oC+++ELHjh3TvHnz7F1+li1bJj8/Pz322GPy8/PTxo0bNXnyZJ0/f15jx461L+uXX37RkCFDVLVqVQ0YMEBVqlTRvn379PPPP9tfd+/evXrwwQdVrVo1DR48WH5+fvr+++81fPhwffTRR+ratWue628Yhp588kl7YA4NDdW6dev09ttv68SJE3rhhRcc5t+4caO+//57Pfzww6pUqZJq1aqV63L//vtvDRo0SMHBwRo5cqQsFoumTp2qypUr5/uzeeONN+zv49GjRzV37lxNmDBBH3zwgX2e/L6PJcXq1av1f//3f2rdurWmT59ubznN7uzZs/kKRr6+vvL19XWYtmzZMi1cuFCGYei6667Tk08+qZ49exZZ+YEyxQBQpi1dutQICQkx/vrrrzznadWqlXHPPffY70+ePNkICQmx3589e7YREhJinDp1Ks9l/PXXX0ZISIixdOnSHI+lpqbmmDZjxgzDZDIZR48etU8bO3asERISYkyZMsVh3nvuucfo1auX/X5sbKwREhJivP766zmWa7FYDMMwjLi4OCM0NNT4+OOPHR7fvXu30aRJE/v0v//+2wgJCTG+//77PNctN+np6Ubbtm2Nu+++27hw4YJ9+pdffmmEhIQY/fr1s0/LzMx0mMcwDOPs2bNGu3btjOeff94+7ciRI0ZISIhx0003GWfOnLFPj4mJMUJCQow1a9bYnxsSEmJ89tlnBSqzYeT8bHMzdepUIzw83Dhw4IDD9HfffdcIDQ01jh07ZhiGYbzxxhtGy5YtjczMzDyXZat/vXr1MtLT0+3TP/30UyMkJMSIiYmxT8utnrz88svGDTfcYH//MjMzjYiICKNz587G2bNnHea1ffaGYRiPPPKIcddddzm87xaLxXjggQeMbt26XXb9f/zxRyMkJMSYNm2aw/SRI0caJpPJOHTokH1aSEiI0bhxY2Pv3r05lhMSEmJMnjzZfn/IkCHGDTfcYPz777/2aQcPHjSaNGmS4zPp3LmzMXbsWPt92/v46KOPOqznW2+9ZYSGhhpJSUn2afl5Hw3D+n3r3LnzZd+Lq6lz585Ghw4djCZNmhj9+vUzUlJSLjtvSEjIFW/Z32/DMIwHHnjAmDNnjhETE2MsXLjQuOuuu4yQkBBjwYIFV3v1gFKJrlAArsjPz0/Jycl5Pl6xYkVJ0k8//ZSjK0x+ZD8CmZKSosTERLVo0UKGYejvv//OMf+DDz7ocL9Vq1YOXXx++OEHubm5acSIETmeazv6/eOPP8piseiOO+5QYmKi/ValShXVq1dPv/76qyTJ399fkrR+/Xqlpqbme522b9+uU6dOqW/fvg794Xv16pWjlcPDw8M+j8Vi0ZkzZ5SZmalmzZrluv49evRQQECA/X7r1q0lSUeOHJFkfT+9vLz022+/5ehOVBRWrVqlVq1aqWLFig7vXbt27WQ2m7Vp0yZJ1nqRmpqqX3755YrLfOCBB+ytLZL1M/b09NT//vc/+7Ts9eT8+fNKTExU69atlZqaqv3790uyHvWPi4vTgAED7PXSxvbZnzlzRhs3btQdd9xhX05iYqJOnz6tDh066ODBgzpx4kSeZV27dq08PDxyDBn8+OOPyzAMrV271mH6jTfeqEaNGl12/c1ms2JjY3XbbbepWrVq9un16tVTx44dL/vc7O6//36Hk7pbt24ts9mso0eP2qfl530sKc6ePavMzExVr14915YKm3feeUezZ8++4u2ee+5xeN6
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 800x400 with 1 Axes>"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"def intra_inter_distances(X_scaled, labels):\n",
|
|||
|
|
" D = pairwise_distances(X_scaled)\n",
|
|||
|
|
" labels = np.asarray(labels)\n",
|
|||
|
|
"\n",
|
|||
|
|
" intra, inter = [], []\n",
|
|||
|
|
" n = len(labels)\n",
|
|||
|
|
"\n",
|
|||
|
|
" for i in range(n):\n",
|
|||
|
|
" for j in range(i+1, n):\n",
|
|||
|
|
" if labels[i] == labels[j]:\n",
|
|||
|
|
" intra.append(D[i, j])\n",
|
|||
|
|
" else:\n",
|
|||
|
|
" inter.append(D[i, j])\n",
|
|||
|
|
"\n",
|
|||
|
|
" return np.array(intra), np.array(inter)\n",
|
|||
|
|
"\n",
|
|||
|
|
"for k in [2, 5]:\n",
|
|||
|
|
" intra, inter = intra_inter_distances(X_scaled, dfc[f\"cluster_k{k}\"].values)\n",
|
|||
|
|
"\n",
|
|||
|
|
" plt.figure(figsize=(8, 4))\n",
|
|||
|
|
" sns.kdeplot(intra, label=\"Intra-cluster\", fill=True)\n",
|
|||
|
|
" sns.kdeplot(inter, label=\"Inter-cluster\", fill=True)\n",
|
|||
|
|
" plt.title(f\"Distances dans l'espace original — K={k}\")\n",
|
|||
|
|
" plt.xlabel(\"Distance\")\n",
|
|||
|
|
" plt.legend()\n",
|
|||
|
|
" plt.tight_layout()\n",
|
|||
|
|
" plt.show()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 52,
|
|||
|
|
"id": "b4a85ccf-34e1-4788-adfc-35da95ba774f",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/plain": [
|
|||
|
|
"churn_hard 0.813586\n",
|
|||
|
|
"churn_soft 0.847705\n",
|
|||
|
|
"churn_warning 0.404880\n",
|
|||
|
|
"dtype: float64"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 52,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"dfc[\"churn_hard\"] = (dfc[\"aum_final_to_peak\"] < 0.10).astype(int)\n",
|
|||
|
|
"\n",
|
|||
|
|
"dfc[\"churn_soft\"] = (\n",
|
|||
|
|
" (dfc[\"aum_final_to_peak\"] < 0.40) &\n",
|
|||
|
|
" (dfc[\"aum_drawdown_last\"] > 0.40)\n",
|
|||
|
|
").astype(int)\n",
|
|||
|
|
"\n",
|
|||
|
|
"dfc[\"churn_warning\"] = (\n",
|
|||
|
|
" (dfc[\"flow_direction_balance\"] < 0) &\n",
|
|||
|
|
" (dfc[\"aum_drawdown_last\"] > 0.20)\n",
|
|||
|
|
").astype(int)\n",
|
|||
|
|
"\n",
|
|||
|
|
"dfc[[\"churn_hard\", \"churn_soft\", \"churn_warning\"]].mean()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 53,
|
|||
|
|
"id": "e990eea6-b569-4fe9-9196-42ec4ccc0e17",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"\n",
|
|||
|
|
"===== CHURN PAR CLUSTER K=2 =====\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>n_clients</th>\n",
|
|||
|
|
" <th>churn_hard_rate</th>\n",
|
|||
|
|
" <th>churn_soft_rate</th>\n",
|
|||
|
|
" <th>churn_warning_rate</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>cluster_k2</th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>9667</td>\n",
|
|||
|
|
" <td>0.813696</td>\n",
|
|||
|
|
" <td>0.847729</td>\n",
|
|||
|
|
" <td>0.404986</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>5</td>\n",
|
|||
|
|
" <td>0.600000</td>\n",
|
|||
|
|
" <td>0.800000</td>\n",
|
|||
|
|
" <td>0.200000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" n_clients churn_hard_rate churn_soft_rate churn_warning_rate\n",
|
|||
|
|
"cluster_k2 \n",
|
|||
|
|
"0 9667 0.813696 0.847729 0.404986\n",
|
|||
|
|
"1 5 0.600000 0.800000 0.200000"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"\n",
|
|||
|
|
"===== CHURN PAR CLUSTER K=5 =====\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>n_clients</th>\n",
|
|||
|
|
" <th>churn_hard_rate</th>\n",
|
|||
|
|
" <th>churn_soft_rate</th>\n",
|
|||
|
|
" <th>churn_warning_rate</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>cluster_k5</th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>9665</td>\n",
|
|||
|
|
" <td>0.813761</td>\n",
|
|||
|
|
" <td>0.847698</td>\n",
|
|||
|
|
" <td>0.404966</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>2</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>0.500000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2</th>\n",
|
|||
|
|
" <td>2</td>\n",
|
|||
|
|
" <td>0.500000</td>\n",
|
|||
|
|
" <td>0.500000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4</th>\n",
|
|||
|
|
" <td>2</td>\n",
|
|||
|
|
" <td>0.500000</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>0.500000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3</th>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" n_clients churn_hard_rate churn_soft_rate churn_warning_rate\n",
|
|||
|
|
"cluster_k5 \n",
|
|||
|
|
"0 9665 0.813761 0.847698 0.404966\n",
|
|||
|
|
"1 2 1.000000 1.000000 0.500000\n",
|
|||
|
|
"2 2 0.500000 0.500000 0.000000\n",
|
|||
|
|
"4 2 0.500000 1.000000 0.500000\n",
|
|||
|
|
"3 1 0.000000 1.000000 0.000000"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"for k in [2, 5]:\n",
|
|||
|
|
" out = (\n",
|
|||
|
|
" dfc.groupby(f\"cluster_k{k}\")\n",
|
|||
|
|
" .agg(\n",
|
|||
|
|
" n_clients=(ID_COL, \"count\"),\n",
|
|||
|
|
" churn_hard_rate=(\"churn_hard\", \"mean\"),\n",
|
|||
|
|
" churn_soft_rate=(\"churn_soft\", \"mean\"),\n",
|
|||
|
|
" churn_warning_rate=(\"churn_warning\", \"mean\")\n",
|
|||
|
|
" )\n",
|
|||
|
|
" .sort_values(\"n_clients\", ascending=False)\n",
|
|||
|
|
" )\n",
|
|||
|
|
" print(f\"\\n===== CHURN PAR CLUSTER K={k} =====\")\n",
|
|||
|
|
" display(out)"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 54,
|
|||
|
|
"id": "4ad61286-89b0-473f-811d-f3affee994f0",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"\n",
|
|||
|
|
"===== NIVEAU 2 / EXPLICATION — K=2 =====\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>n_clients</th>\n",
|
|||
|
|
" <th>delta_rate_mean_med</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>cluster_k2</th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>9667</td>\n",
|
|||
|
|
" <td>-0.004346</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>5</td>\n",
|
|||
|
|
" <td>0.022432</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" n_clients delta_rate_mean_med\n",
|
|||
|
|
"cluster_k2 \n",
|
|||
|
|
"0 9667 -0.004346\n",
|
|||
|
|
"1 5 0.022432"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"\n",
|
|||
|
|
"===== NIVEAU 2 / EXPLICATION — K=5 =====\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/html": [
|
|||
|
|
"<div>\n",
|
|||
|
|
"<style scoped>\n",
|
|||
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|||
|
|
" vertical-align: middle;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe tbody tr th {\n",
|
|||
|
|
" vertical-align: top;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" .dataframe thead th {\n",
|
|||
|
|
" text-align: right;\n",
|
|||
|
|
" }\n",
|
|||
|
|
"</style>\n",
|
|||
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|||
|
|
" <thead>\n",
|
|||
|
|
" <tr style=\"text-align: right;\">\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th>n_clients</th>\n",
|
|||
|
|
" <th>delta_rate_mean_med</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>cluster_k5</th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" <th></th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>9665</td>\n",
|
|||
|
|
" <td>-0.004350</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>2</td>\n",
|
|||
|
|
" <td>0.018078</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2</th>\n",
|
|||
|
|
" <td>2</td>\n",
|
|||
|
|
" <td>0.013204</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4</th>\n",
|
|||
|
|
" <td>2</td>\n",
|
|||
|
|
" <td>0.024369</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3</th>\n",
|
|||
|
|
" <td>1</td>\n",
|
|||
|
|
" <td>0.051667</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" n_clients delta_rate_mean_med\n",
|
|||
|
|
"cluster_k5 \n",
|
|||
|
|
"0 9665 -0.004350\n",
|
|||
|
|
"1 2 0.018078\n",
|
|||
|
|
"2 2 0.013204\n",
|
|||
|
|
"4 2 0.024369\n",
|
|||
|
|
"3 1 0.051667"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"#niv 2 explciation eocno \n",
|
|||
|
|
"explain_vars = [\n",
|
|||
|
|
" \"beta_rate\",\n",
|
|||
|
|
" \"delta_rate_mean\",\n",
|
|||
|
|
" \"aum_trend_12m\",\n",
|
|||
|
|
" \"flow_trend_12m\",\n",
|
|||
|
|
" \"drawdown_trend_12m\",\n",
|
|||
|
|
"]\n",
|
|||
|
|
"\n",
|
|||
|
|
"explain_vars = [c for c in explain_vars if c in dfc.columns]\n",
|
|||
|
|
"\n",
|
|||
|
|
"for k in [2, 5]:\n",
|
|||
|
|
" print(f\"\\n===== NIVEAU 2 / EXPLICATION — K={k} =====\")\n",
|
|||
|
|
" out = (\n",
|
|||
|
|
" dfc.groupby(f\"cluster_k{k}\")\n",
|
|||
|
|
" .agg(\n",
|
|||
|
|
" n_clients=(ID_COL, \"count\"),\n",
|
|||
|
|
" **{f\"{c}_med\": (c, \"median\") for c in explain_vars}\n",
|
|||
|
|
" )\n",
|
|||
|
|
" .sort_values(\"n_clients\", ascending=False)\n",
|
|||
|
|
" )\n",
|
|||
|
|
" display(out)"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 55,
|
|||
|
|
"id": "0ae8a553-1ec2-4789-8b6c-c70909495b18",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"image/png": "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JSQkqEePHpLkEip+//13ORwO3X777Vq/fr1btf7Zd999p/Pnz2vEiBG55mD8+XgKy8vLSx4eHvrhhx/00EMPuX0FYePGjbr99ttVpUoVl0/3Q0NDtXDhQm3fvl0PPPCAc3n37t1NDxWSdPr0aUlSnTp18g0V0uXgVBDX+n+ZmpqqCRMmqE6dOho2bJh7hQIo0wgWAMqUSpUqSZLOnz/v1nZ//hT7iqpVqzqHLhVGnTp18l136623uryuUqWKJBWoP6vVqrp167osa9iwoSTp+PHjzmVff/213nvvPe3Zs0eZmZnO5XkFgGvV+mdHjhyRJN12220Fau8uT09PTZw4Ua+//rr+8pe/qGXLlurcubMefPBB+fv7X3f7w4cPa9++ffl+sn/1UKKCHvdvv/2mrKysArW9WtWqVa87LOnBBx/UqVOnNH/+fPn4+Gjw4MF5tjM60To9PV0jR47U+fPn9cEHH7gdwAGUbQQLAGVKpUqVVKNGDR04cMCt7fL7lPjPw3vy+0Te4XDkufzPVwyult+k3KIYTiRdHuoyatQo3XHHHZo+fbr8/f3l4eGh+Ph4/eMf/3Cr1qKQ3/cur+czDB48WF26dNGXX36pf/3rX5o7d64WLlyouLg4NW/e/Jr9ZGdn6y9/+Uu+n8RfGR51RUGPe9y4cfrhhx8K1PZqy5YtU7t27a7Zply5cpo7d66GDRumWbNmqXLlyurXr1+udikpKQXqs3LlyrmOLTMzU+PGjdO+ffu0ePFiNW3atOAHAQAiWAAog+6++2599NFHSkxMVEhISJHtt0qVKnleUThx4kSR9VEQ2dnZOnr0qPMqhXR5joQk56Trzz77TOXLl9fixYtdPi2Pj4831PeV4WIHDhxQ/fr1C7zdlSsyf/zxh8vyP19hubqfoUOHaujQofr555/14IMPasmSJXrzzTcl5R9U6tWrp/T09CK/herkyZMLffWqIEPbJKl8+fJ677339Pjjj2vatGmqUqWKunXr5tKmY8eOBdrX1XMssrOzNXnyZCUkJOjtt99W27ZtC34AAPD/ESwAlDnDhg3TunXr9OKLLyouLs55x6Arjhw5oq+//jrPW85eS7169fTHH39o7969zjeLp06d0hdffFFktRfUihUrnJO3c3JytGLFCnl4eDiHANlsNlksFperKceOHdOmTZsM9duxY0dVrFhRCxYs0J133plr8nZ+b/hr164tm82m7du3q2vXrs7lK1eudGmXkZEhq9Xqst969eqpYsWKLsO5vL2983yjf//992vevHnasmWL7rzzTpd1Z8+eVYUKFVSunPt/GgMDA93epjAqVaqkmJgYPfroo3r22We1cOFCl2FdhZ1j8corr2jDhg16+eWX1b179yKtGUDZQbAAUObUq1dPb775psaPH6+wsDDnk7czMzOVmJiojRs3FuqJzWFhYXrzzTc1duxYPfbYY7pw4YJWrlyphg0bavfu3cVwJHkrX768tmzZosmTJys4OFhbtmzR5s2b9eSTTzonInfq1EmxsbEaNmyYevbsqdTUVH3wwQeqV6+e9u3bV+i+K1WqpKlTp+rFF1/UQw89pJ49e6pKlSrau3evLly4oNdffz3P7SpXrqz77rtP77//viwWi+rWravNmzcrNTXVpd3PP/+swYMH67777lOTJk1ks9n
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 800x400 with 1 Axes>"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"image/png": "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
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 800x400 with 1 Axes>"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"for k in [2, 5]:\n",
|
|||
|
|
" tmp = (\n",
|
|||
|
|
" dfc.groupby(f\"cluster_k{k}\")\n",
|
|||
|
|
" .agg(\n",
|
|||
|
|
" churn_hard=(\"churn_hard\", \"mean\"),\n",
|
|||
|
|
" churn_soft=(\"churn_soft\", \"mean\"),\n",
|
|||
|
|
" churn_warning=(\"churn_warning\", \"mean\")\n",
|
|||
|
|
" )\n",
|
|||
|
|
" )\n",
|
|||
|
|
"\n",
|
|||
|
|
" tmp.plot(kind=\"bar\", figsize=(8, 4))\n",
|
|||
|
|
" plt.title(f\"Churn par cluster — K={k}\")\n",
|
|||
|
|
" plt.ylabel(\"Rate\")\n",
|
|||
|
|
" plt.tight_layout()\n",
|
|||
|
|
" plt.show()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": null,
|
|||
|
|
"id": "5fc62ca1-a145-4669-8798-33d72352d4d5",
|
|||
|
|
"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.12"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"nbformat": 4,
|
|||
|
|
"nbformat_minor": 5
|
|||
|
|
}
|