3111 lines
383 KiB
Plaintext
3111 lines
383 KiB
Plaintext
|
|
{
|
|||
|
|
"cells": [
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 2,
|
|||
|
|
"id": "4287b380-5359-49c7-ab95-ad346a3ad17a",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"Fichiers Flows : ['projet-bdc-data/carmignac/Flows ENSAE V1 -20251027.csv', 'projet-bdc-data/carmignac/Flows ENSAE V2 -20251105.csv']\n",
|
|||
|
|
"Fichiers AUM : ['projet-bdc-data/carmignac/AUM ENSAE V1 -20251027.csv', 'projet-bdc-data/carmignac/AUM ENSAE V2 -20251105.csv']\n"
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"# Import des données\n",
|
|||
|
|
"\n",
|
|||
|
|
"import os\n",
|
|||
|
|
"import s3fs\n",
|
|||
|
|
"import pandas as pd\n",
|
|||
|
|
"\n",
|
|||
|
|
"s3_ENDPOINT_URL = \"https://\" + os.environ[\"AWS_S3_ENDPOINT\"]\n",
|
|||
|
|
"\n",
|
|||
|
|
"fs = s3fs.S3FileSystem(client_kwargs={'endpoint_url': s3_ENDPOINT_URL})\n",
|
|||
|
|
"\n",
|
|||
|
|
"BUCKET = \"projet-bdc-data\"\n",
|
|||
|
|
"carmignac_path = \"projet-bdc-data/carmignac\"\n",
|
|||
|
|
"\n",
|
|||
|
|
"# Liste des fichiers FLOWS\n",
|
|||
|
|
"all_files = fs.ls(carmignac_path)\n",
|
|||
|
|
"flows_files = [f for f in all_files if \"Flows\" in f and f.endswith(\".csv\")]\n",
|
|||
|
|
"print(\"Fichiers Flows :\", flows_files)\n",
|
|||
|
|
"\n",
|
|||
|
|
"# Lire tous les fichiers dans un dictionnaire\n",
|
|||
|
|
"flows_data = {}\n",
|
|||
|
|
"for file_path in flows_files:\n",
|
|||
|
|
" with fs.open(file_path, 'r') as f:\n",
|
|||
|
|
" df = pd.read_csv(f, sep=';',low_memory=False)\n",
|
|||
|
|
" flows_data[os.path.basename(file_path)] = df\n",
|
|||
|
|
"\n",
|
|||
|
|
"\n",
|
|||
|
|
"# Liste des fichiers AUM\n",
|
|||
|
|
"all_files = fs.ls(carmignac_path)\n",
|
|||
|
|
"aum_files = [f for f in all_files if \"AUM\" in f and f.endswith(\".csv\")]\n",
|
|||
|
|
"print(\"Fichiers AUM :\", aum_files)\n",
|
|||
|
|
"\n",
|
|||
|
|
"# Lire tous les fichiers dans un dictionnaire\n",
|
|||
|
|
"aum_data = {}\n",
|
|||
|
|
"for file_path in aum_files:\n",
|
|||
|
|
" with fs.open(file_path, 'r') as f:\n",
|
|||
|
|
" df = pd.read_csv(f, sep=';',low_memory=False)\n",
|
|||
|
|
" aum_data[os.path.basename(file_path)] = df\n",
|
|||
|
|
"\n",
|
|||
|
|
"df = aum_data['AUM ENSAE V2 -20251105.csv']\n",
|
|||
|
|
"dg = flows_data['Flows ENSAE V2 -20251105.csv']"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 3,
|
|||
|
|
"id": "0b66aee0-b726-4a57-9461-6a4550a625a8",
|
|||
|
|
"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>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",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>003</td>\n",
|
|||
|
|
" <td>166</td>\n",
|
|||
|
|
" <td>166</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",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>003</td>\n",
|
|||
|
|
" <td>166</td>\n",
|
|||
|
|
" <td>166</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",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2</th>\n",
|
|||
|
|
" <td>003</td>\n",
|
|||
|
|
" <td>166</td>\n",
|
|||
|
|
" <td>166</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",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3</th>\n",
|
|||
|
|
" <td>003</td>\n",
|
|||
|
|
" <td>166</td>\n",
|
|||
|
|
" <td>166</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",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4</th>\n",
|
|||
|
|
" <td>003</td>\n",
|
|||
|
|
" <td>166</td>\n",
|
|||
|
|
" <td>166</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",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" Agreement - Code Company - Id Company - Ultimate Parent Id \\\n",
|
|||
|
|
"0 003 166 166 \n",
|
|||
|
|
"1 003 166 166 \n",
|
|||
|
|
"2 003 166 166 \n",
|
|||
|
|
"3 003 166 166 \n",
|
|||
|
|
"4 003 166 166 \n",
|
|||
|
|
"\n",
|
|||
|
|
" Registrar Account - ID Registrar Account - Region \\\n",
|
|||
|
|
"0 200000647 France \n",
|
|||
|
|
"1 200000647 France \n",
|
|||
|
|
"2 200000647 France \n",
|
|||
|
|
"3 200000647 France \n",
|
|||
|
|
"4 200000647 France \n",
|
|||
|
|
"\n",
|
|||
|
|
" RegistrarAccount - Country Product - Asset Type Product - Strategy \\\n",
|
|||
|
|
"0 France Diversified Patrimoine \n",
|
|||
|
|
"1 France Diversified Patrimoine \n",
|
|||
|
|
"2 France Diversified Patrimoine \n",
|
|||
|
|
"3 France Diversified Patrimoine \n",
|
|||
|
|
"4 France Diversified Patrimoine \n",
|
|||
|
|
"\n",
|
|||
|
|
" Product - Legal Status Product - Is Dedie ? Product - Fund \\\n",
|
|||
|
|
"0 FCP NO Carmignac Patrimoine \n",
|
|||
|
|
"1 FCP NO Carmignac Patrimoine \n",
|
|||
|
|
"2 FCP NO Carmignac Patrimoine \n",
|
|||
|
|
"3 FCP NO Carmignac Patrimoine \n",
|
|||
|
|
"4 FCP NO Carmignac Patrimoine \n",
|
|||
|
|
"\n",
|
|||
|
|
" Product - Shareclass Type Product - Shareclass Currency Product - Isin \\\n",
|
|||
|
|
"0 A EUR FR0010135103 \n",
|
|||
|
|
"1 A EUR FR0010135103 \n",
|
|||
|
|
"2 A EUR FR0010135103 \n",
|
|||
|
|
"3 A EUR FR0010135103 \n",
|
|||
|
|
"4 A EUR FR0010135103 \n",
|
|||
|
|
"\n",
|
|||
|
|
" Centralisation Date Quantity - AUM Value - AUM CCY Value - AUM € \n",
|
|||
|
|
"0 2015-03-31 35.368 24648.6666 24648.6666 \n",
|
|||
|
|
"1 2015-11-30 35.368 22413.0553 22413.0553 \n",
|
|||
|
|
"2 2015-12-31 35.368 22051.2406 22051.2406 \n",
|
|||
|
|
"3 2016-03-31 35.368 21626.1173 21626.1173 \n",
|
|||
|
|
"4 2016-11-30 35.368 22489.4502 22489.4502 "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 3,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"df.head()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 4,
|
|||
|
|
"id": "a5509e6e-ff10-4388-9fee-5cd49d01b60a",
|
|||
|
|
"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>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>...</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>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>...</td>\n",
|
|||
|
|
" <td>2020-11-05</td>\n",
|
|||
|
|
" <td>1636.00</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>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>...</td>\n",
|
|||
|
|
" <td>2015-03-09</td>\n",
|
|||
|
|
" <td>144.69</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>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>...</td>\n",
|
|||
|
|
" <td>2016-10-26</td>\n",
|
|||
|
|
" <td>0.00</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>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>...</td>\n",
|
|||
|
|
" <td>2018-10-18</td>\n",
|
|||
|
|
" <td>0.00</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>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>...</td>\n",
|
|||
|
|
" <td>2019-04-08</td>\n",
|
|||
|
|
" <td>0.00</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",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"<p>5 rows × 24 columns</p>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" Agreement - Code Company - Id Company - Ultimate Parent Id \\\n",
|
|||
|
|
"0 003 166 166 \n",
|
|||
|
|
"1 003 166 166 \n",
|
|||
|
|
"2 003 166 166 \n",
|
|||
|
|
"3 003 166 166 \n",
|
|||
|
|
"4 003 166 166 \n",
|
|||
|
|
"\n",
|
|||
|
|
" Registrar Account - ID Registrar Account - Region \\\n",
|
|||
|
|
"0 200127202 France \n",
|
|||
|
|
"1 406533 France \n",
|
|||
|
|
"2 406533 France \n",
|
|||
|
|
"3 406533 France \n",
|
|||
|
|
"4 406533 France \n",
|
|||
|
|
"\n",
|
|||
|
|
" RegistrarAccount - Country Product - Asset Type Product - Strategy \\\n",
|
|||
|
|
"0 France Equity Investissement \n",
|
|||
|
|
"1 France Diversified Patrimoine \n",
|
|||
|
|
"2 France Equity Investissement \n",
|
|||
|
|
"3 France Equity Investissement \n",
|
|||
|
|
"4 France Equity Investissement \n",
|
|||
|
|
"\n",
|
|||
|
|
" Product - Legal Status Product - Is Dedie ? ... Centralisation Date \\\n",
|
|||
|
|
"0 SICAV NO ... 2020-11-05 \n",
|
|||
|
|
"1 FCP NO ... 2015-03-09 \n",
|
|||
|
|
"2 FCP NO ... 2016-10-26 \n",
|
|||
|
|
"3 FCP NO ... 2018-10-18 \n",
|
|||
|
|
"4 FCP NO ... 2019-04-08 \n",
|
|||
|
|
"\n",
|
|||
|
|
" Quantity - Subscription Quantity - Redemption Quantity - NetFlows \\\n",
|
|||
|
|
"0 1636.00 0.000 1636.000 \n",
|
|||
|
|
"1 144.69 0.000 144.690 \n",
|
|||
|
|
"2 0.00 -8.321 -8.321 \n",
|
|||
|
|
"3 0.00 -22.083 -22.083 \n",
|
|||
|
|
"4 0.00 -465.992 -465.992 \n",
|
|||
|
|
"\n",
|
|||
|
|
" Value Ccy - Subscription Value Ccy - Redemption Value Ccy - NetFlows \\\n",
|
|||
|
|
"0 280983.00 0.00 280983.00 \n",
|
|||
|
|
"1 99985.13 0.00 99985.13 \n",
|
|||
|
|
"2 0.00 -9384.76 -9384.76 \n",
|
|||
|
|
"3 0.00 -25227.40 -25227.40 \n",
|
|||
|
|
"4 0.00 -563775.76 -563775.76 \n",
|
|||
|
|
"\n",
|
|||
|
|
" Value € - Subscription Value € - Redemption Value € - NetFlows \n",
|
|||
|
|
"0 280983.00 0.00 280983.00 \n",
|
|||
|
|
"1 99985.13 0.00 99985.13 \n",
|
|||
|
|
"2 0.00 -9384.76 -9384.76 \n",
|
|||
|
|
"3 0.00 -25227.40 -25227.40 \n",
|
|||
|
|
"4 0.00 -563775.76 -563775.76 \n",
|
|||
|
|
"\n",
|
|||
|
|
"[5 rows x 24 columns]"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 4,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"dg.head()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 5,
|
|||
|
|
"id": "d4c6dc0e-a5bc-495c-a54b-96dd238f46e3",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"# Filtrer les comptes techniques\n",
|
|||
|
|
"\n",
|
|||
|
|
"import pandas as pd\n",
|
|||
|
|
"import numpy as np\n",
|
|||
|
|
"\n",
|
|||
|
|
"df['Centralisation Date'] = pd.to_datetime(df['Centralisation Date'])\n",
|
|||
|
|
"dg['Centralisation Date'] = pd.to_datetime(dg['Centralisation Date'])\n",
|
|||
|
|
"df = df[~df['Registrar Account - ID'].isin(['Off Distribution','Private Clients', 'Private Client'])]\n",
|
|||
|
|
"dg = dg[~dg['Registrar Account - ID'].isin(['Off Distribution','Private Clients','Private Client'])]"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 6,
|
|||
|
|
"id": "c7abd838-cb2d-41dc-a280-6622b0937672",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"# Date de référence\n",
|
|||
|
|
"\n",
|
|||
|
|
"ref_date = pd.Timestamp('2025-10-31')\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_ref = df[df['Centralisation Date'] == ref_date]"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 7,
|
|||
|
|
"id": "1efb0610-4eaf-427c-a15c-d926d423db76",
|
|||
|
|
"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>Value - AUM €</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3890</th>\n",
|
|||
|
|
" <td>420350</td>\n",
|
|||
|
|
" <td>1.623308e+09</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2622</th>\n",
|
|||
|
|
" <td>364765</td>\n",
|
|||
|
|
" <td>1.383209e+09</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>956</th>\n",
|
|||
|
|
" <td>200127454</td>\n",
|
|||
|
|
" <td>8.784361e+08</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2598</th>\n",
|
|||
|
|
" <td>312933</td>\n",
|
|||
|
|
" <td>8.379604e+08</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1099</th>\n",
|
|||
|
|
" <td>200127809</td>\n",
|
|||
|
|
" <td>8.342839e+08</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" Registrar Account - ID Value - AUM €\n",
|
|||
|
|
"3890 420350 1.623308e+09\n",
|
|||
|
|
"2622 364765 1.383209e+09\n",
|
|||
|
|
"956 200127454 8.784361e+08\n",
|
|||
|
|
"2598 312933 8.379604e+08\n",
|
|||
|
|
"1099 200127809 8.342839e+08"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 7,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"aum_account = (\n",
|
|||
|
|
" df_ref\n",
|
|||
|
|
" .groupby('Registrar Account - ID')['Value - AUM €']\n",
|
|||
|
|
" .sum()\n",
|
|||
|
|
" .reset_index()\n",
|
|||
|
|
" .sort_values(by='Value - AUM €', ascending=False)\n",
|
|||
|
|
")\n",
|
|||
|
|
"aum_account.head()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 8,
|
|||
|
|
"id": "1e359eff-0fa0-410d-b7cc-03b37898890b",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/plain": [
|
|||
|
|
"(431, 2)"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 8,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"# Garder les comptes > 5M€\n",
|
|||
|
|
"aum_account = aum_account[aum_account['Value - AUM €'] > 5_000_000]\n",
|
|||
|
|
"aum_account.shape"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 9,
|
|||
|
|
"id": "99dcd4c5-56ad-4edb-90a4-ab6482455526",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"# Calcul des poids\n",
|
|||
|
|
"total_aum = aum_account['Value - AUM €'].sum()\n",
|
|||
|
|
"\n",
|
|||
|
|
"aum_account['weight'] = aum_account['Value - AUM €'] / total_aum"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 10,
|
|||
|
|
"id": "829a8019-1761-44ec-b2a4-5c4084ae0115",
|
|||
|
|
"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>Value - AUM €</th>\n",
|
|||
|
|
" <th>weight</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3890</th>\n",
|
|||
|
|
" <td>420350</td>\n",
|
|||
|
|
" <td>1.623308e+09</td>\n",
|
|||
|
|
" <td>0.048394</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2622</th>\n",
|
|||
|
|
" <td>364765</td>\n",
|
|||
|
|
" <td>1.383209e+09</td>\n",
|
|||
|
|
" <td>0.041236</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>956</th>\n",
|
|||
|
|
" <td>200127454</td>\n",
|
|||
|
|
" <td>8.784361e+08</td>\n",
|
|||
|
|
" <td>0.026188</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2598</th>\n",
|
|||
|
|
" <td>312933</td>\n",
|
|||
|
|
" <td>8.379604e+08</td>\n",
|
|||
|
|
" <td>0.024981</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1099</th>\n",
|
|||
|
|
" <td>200127809</td>\n",
|
|||
|
|
" <td>8.342839e+08</td>\n",
|
|||
|
|
" <td>0.024872</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" Registrar Account - ID Value - AUM € weight\n",
|
|||
|
|
"3890 420350 1.623308e+09 0.048394\n",
|
|||
|
|
"2622 364765 1.383209e+09 0.041236\n",
|
|||
|
|
"956 200127454 8.784361e+08 0.026188\n",
|
|||
|
|
"2598 312933 8.379604e+08 0.024981\n",
|
|||
|
|
"1099 200127809 8.342839e+08 0.024872"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 10,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"aum_account.head()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 11,
|
|||
|
|
"id": "12999c3a-3a6b-4035-a7c5-f230083a9143",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"Score initial par compte (t = 31/10/2025) :\n"
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"# Dictionnaire des scores initiaux\n",
|
|||
|
|
"scores = aum_account.set_index('Registrar Account - ID')['weight'].to_dict()\n",
|
|||
|
|
"\n",
|
|||
|
|
"print(\"Score initial par compte (t = 31/10/2025) :\")\n",
|
|||
|
|
"#print(scores)"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 12,
|
|||
|
|
"id": "c633aa38-8d11-4c1c-897f-e29c1ceaf3dc",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/plain": [
|
|||
|
|
"130"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 12,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"dates = sorted(df['Centralisation Date'].unique(), reverse=True)\n",
|
|||
|
|
"len(dates)"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 13,
|
|||
|
|
"id": "a23cd218-acf7-4143-996c-5cb209e286a9",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"# Stocks : somme des Quantity par date, compte, ISIN\n",
|
|||
|
|
"stocks_agg = df.groupby(['Centralisation Date', 'Registrar Account - ID', 'Product - Isin'])['Quantity - AUM'].sum()\n",
|
|||
|
|
"\n",
|
|||
|
|
"# Flux : somme des NetFlows par date, compte, ISIN\n",
|
|||
|
|
"flows_agg = dg.groupby(['Centralisation Date', 'Registrar Account - ID', 'Product - Isin'])['Quantity - NetFlows'].sum()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 14,
|
|||
|
|
"id": "e302da86-d226-409a-acd6-73f7965f3a60",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"def check_consistency_vector(account, date_t, date_t1, tol = 0.05):\n",
|
|||
|
|
" \"\"\"\n",
|
|||
|
|
" Vérifie si tous les ISIN d'un compte sont cohérents :\n",
|
|||
|
|
" Quantity(t) ≈ Quantity(t-1) + NetFlows\n",
|
|||
|
|
" \"\"\"\n",
|
|||
|
|
"\n",
|
|||
|
|
" # Tous les ISIN pour ce compte sur les deux dates et flux\n",
|
|||
|
|
" isins_t = stocks_agg.loc[date_t, account].index if (date_t, account) in stocks_agg.index else []\n",
|
|||
|
|
" isins_t1 = stocks_agg.loc[date_t1, account].index if (date_t1, account) in stocks_agg.index else []\n",
|
|||
|
|
" isins_fl = flows_agg.loc[date_t, account].index if (date_t, account) in flows_agg.index else []\n",
|
|||
|
|
"\n",
|
|||
|
|
" all_isins = set(isins_t) | set(isins_t1) | set(isins_fl)\n",
|
|||
|
|
"\n",
|
|||
|
|
" # Séries complètes avec fill_value=0 pour tous les ISIN\n",
|
|||
|
|
" st_t = pd.Series({isin: stocks_agg.get((date_t, account, isin), 0) for isin in all_isins}).astype(float).fillna(0)\n",
|
|||
|
|
" st_t1 = pd.Series({isin: stocks_agg.get((date_t1, account, isin), 0) for isin in all_isins}).astype(float).fillna(0)\n",
|
|||
|
|
" fl_t = pd.Series({isin: flows_agg.get((date_t, account, isin), 0) for isin in all_isins}).astype(float).fillna(0)\n",
|
|||
|
|
"\n",
|
|||
|
|
" # Vérification relative à 5 %\n",
|
|||
|
|
" diff = np.abs(st_t.values - (st_t1.values + fl_t.values))\n",
|
|||
|
|
" relative_error = diff / np.where(st_t.values != 0, st_t.values, 1) # éviter div par 0\n",
|
|||
|
|
"\n",
|
|||
|
|
" return np.all(relative_error <= tol)"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 15,
|
|||
|
|
"id": "3d1357c8-50fb-4fd9-8b80-d166dcc924cb",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"penalty = 0.9 # facteur de dégradation\n",
|
|||
|
|
"score_history = []\n",
|
|||
|
|
"\n",
|
|||
|
|
"scores = aum_account.set_index('Registrar Account - ID')['weight'].to_dict()\n",
|
|||
|
|
"score_history.append({\n",
|
|||
|
|
" \"date\": ref_date,\n",
|
|||
|
|
" \"total_score\": sum(scores.values()) # ici, scores = poids initiaux\n",
|
|||
|
|
"})\n",
|
|||
|
|
"\n",
|
|||
|
|
"# Trier les dates décroissantes (du plus récent au plus ancien)\n",
|
|||
|
|
"dates_sorted = sorted(df['Centralisation Date'].unique(), reverse=True)\n",
|
|||
|
|
"\n",
|
|||
|
|
"for i in range(len(dates_sorted)-1):\n",
|
|||
|
|
" date_t = dates_sorted[i]\n",
|
|||
|
|
" date_t1 = dates_sorted[i+1]\n",
|
|||
|
|
"\n",
|
|||
|
|
" new_scores = scores.copy()\n",
|
|||
|
|
"\n",
|
|||
|
|
" for account in scores.keys():\n",
|
|||
|
|
" if not check_consistency_vector(account, date_t, date_t1):\n",
|
|||
|
|
" new_scores[account] = scores[account] * penalty # dégrader le score\n",
|
|||
|
|
"\n",
|
|||
|
|
" scores = new_scores\n",
|
|||
|
|
" score_history.append({\n",
|
|||
|
|
" \"date\": date_t1,\n",
|
|||
|
|
" \"total_score\": sum(scores.values())\n",
|
|||
|
|
" })"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 17,
|
|||
|
|
"id": "f750c441-a465-42c0-ac29-1f63868eea07",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"image/png": "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
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 640x480 with 1 Axes>"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"import matplotlib.pyplot as plt\n",
|
|||
|
|
"\n",
|
|||
|
|
"score_df = pd.DataFrame(score_history)\n",
|
|||
|
|
"score_df = score_df.sort_values('date') # optionnel pour affichage\n",
|
|||
|
|
"\n",
|
|||
|
|
"plt.plot(score_df['date'], score_df['total_score'], marker='o')\n",
|
|||
|
|
"plt.title(\"Évolution de la Somme des Scores avec pénalité constante\")\n",
|
|||
|
|
"plt.xlabel(\"Date\")\n",
|
|||
|
|
"plt.ylabel(\"Total Score\")\n",
|
|||
|
|
"plt.gca().invert_xaxis() # remonter dans le temps à gauche\n",
|
|||
|
|
"plt.grid(True)\n",
|
|||
|
|
"plt.show()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 18,
|
|||
|
|
"id": "844508d8-456c-473a-86c8-aad51559794c",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"# Autre score\n",
|
|||
|
|
"\n",
|
|||
|
|
"def score_decay_vector(account, date_t, date_t1, tol=0.05, alpha=1.0):\n",
|
|||
|
|
" \"\"\"\n",
|
|||
|
|
" Score diminue proportionnellement à l'erreur relative au-delà de tolérance,\n",
|
|||
|
|
" en évitant les warnings si pas de données.\n",
|
|||
|
|
" \"\"\"\n",
|
|||
|
|
" # Tous les ISIN pour ce compte\n",
|
|||
|
|
" isins_t = stocks_agg.loc[date_t, account].index if (date_t, account) in stocks_agg.index else []\n",
|
|||
|
|
" isins_t1 = stocks_agg.loc[date_t1, account].index if (date_t1, account) in stocks_agg.index else []\n",
|
|||
|
|
" isins_fl = flows_agg.loc[date_t, account].index if (date_t, account) in flows_agg.index else []\n",
|
|||
|
|
"\n",
|
|||
|
|
" all_isins = set(isins_t) | set(isins_t1) | set(isins_fl)\n",
|
|||
|
|
" if len(all_isins) == 0:\n",
|
|||
|
|
" return 1.0 # pas de données → pas de dégradation\n",
|
|||
|
|
"\n",
|
|||
|
|
" # Séries complètes float + fillna\n",
|
|||
|
|
" st_t = pd.Series({isin: stocks_agg.get((date_t, account, isin), 0) for isin in all_isins}).astype(float).fillna(0)\n",
|
|||
|
|
" st_t1 = pd.Series({isin: stocks_agg.get((date_t1, account, isin), 0) for isin in all_isins}).astype(float).fillna(0)\n",
|
|||
|
|
" fl_t = pd.Series({isin: flows_agg.get((date_t, account, isin), 0) for isin in all_isins}).astype(float).fillna(0)\n",
|
|||
|
|
"\n",
|
|||
|
|
" # Calcul erreur relative\n",
|
|||
|
|
" denom = np.where(st_t.values != 0, st_t.values, 1)\n",
|
|||
|
|
" diff = np.abs(st_t.values - (st_t1.values + fl_t.values))\n",
|
|||
|
|
" relative_error = diff / denom\n",
|
|||
|
|
"\n",
|
|||
|
|
" # Décroissance proportionnelle\n",
|
|||
|
|
" relative_error_clip = np.maximum(relative_error - tol, 0)\n",
|
|||
|
|
" mean_error = np.nanmean(relative_error_clip) # remplacer NaN par 0\n",
|
|||
|
|
" decay_factor = max(0, 1 - alpha * mean_error)\n",
|
|||
|
|
"\n",
|
|||
|
|
" return decay_factor"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 23,
|
|||
|
|
"id": "8ec0295d-add3-4674-a657-13bba49f09bf",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"# Score initial = poids des comptes à la date de référence\n",
|
|||
|
|
"score_history = []\n",
|
|||
|
|
"scores = aum_account.set_index('Registrar Account - ID')['weight'].to_dict()\n",
|
|||
|
|
"score_history.append({\n",
|
|||
|
|
" \"date\": ref_date,\n",
|
|||
|
|
" \"total_score\": sum(scores.values())\n",
|
|||
|
|
"})\n",
|
|||
|
|
"\n",
|
|||
|
|
"dates_sorted = sorted(df['Centralisation Date'].unique(), reverse=True)\n",
|
|||
|
|
"\n",
|
|||
|
|
"alpha = 0.01 # sensibilité, 1 = décroissance égale à l'écart moyen au-delà de tolérance\n",
|
|||
|
|
"tol = 0.05 # tolérance 5%\n",
|
|||
|
|
"\n",
|
|||
|
|
"for i in range(1, len(dates_sorted)):\n",
|
|||
|
|
" date_t = dates_sorted[i-1]\n",
|
|||
|
|
" date_t1 = dates_sorted[i]\n",
|
|||
|
|
"\n",
|
|||
|
|
" new_scores = scores.copy()\n",
|
|||
|
|
"\n",
|
|||
|
|
" for account in scores.keys():\n",
|
|||
|
|
" decay = score_decay_vector_max(account, date_t, date_t1, tol=tol, alpha=alpha)\n",
|
|||
|
|
" new_scores[account] = scores[account] * decay\n",
|
|||
|
|
"\n",
|
|||
|
|
" scores = new_scores\n",
|
|||
|
|
" score_history.append({\n",
|
|||
|
|
" \"date\": date_t1,\n",
|
|||
|
|
" \"total_score\": sum(scores.values())\n",
|
|||
|
|
" })"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 136,
|
|||
|
|
"id": "edadf900-04e6-4fca-8e58-a5ed38cfd2e6",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlQAAAHHCAYAAAB5gsZZAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAbbFJREFUeJzt3XlcVFX/B/DPsO9u7EiyKJiioJimpaaiIGpqmttjKirlQopUPlKkYpbVo4S5pPVLM6lc0mgFRcotTU3FMlxwS1NANJFN2eb8/qCZZpgBZmBgBvi8Xy9fNXfOvffcw3Dnyznfe45ECCFARERERLVmpO8KEBERETV2DKiIiIiI6ogBFREREVEdMaAiIiIiqiMGVERERER1xICKiIiIqI4YUBERERHVEQMqIiIiojpiQEVERHX222+/YenSpbhx44a+q6K1Tz/9FGvXrtV3NaiRY0ClIxKJBEuXLtXpMT/55BNIJBJcu3ZNp8etC11fp4eHB6ZNm6az45FmDPGzRY3X/fv3MXr0aNy7dw/u7u71fr7K96G6fJ6/+eYbzJo1C927d9ddBZuYadOmwcPDQ9/V0Jq6etfHd7VMkwqoZL9UVf375Zdf9F1Ftd566y0kJibquxpNQklJCVavXo1u3brBzs4OLVu2ROfOnfH888/j/Pnz+q5es3f48GEMHToUbm5usLCwwCOPPIIRI0bg888/13fVqA7CwsLQrVs3vPfee/quitz69evxySefVFvm2rVrmDFjBj777DP06dOnYSpmoG7duoWlS5ciLS1N31VptEz0XYH6sGzZMnh6eqpsb9++vR5qU7O33noLY8eOxahRo5S2P/fcc5gwYQLMzc31U7FGaMyYMUhKSsLEiRMRHh6O0tJSnD9/Ht999x369OmDjh076ruKzdbOnTsxfvx4BAQEYP78+WjVqhWuXr2KgwcP4qOPPsKkSZP0XUWqhWvXrqFHjx6IioqCkZF+/kZXd69cv3497O3tq+0BT0tLw8aNGzF69OgGqKVhu3XrFmJjY+Hh4YGAgACl9z766CNIpVL9VKwRaZIB1dChQ9GjRw99V6POjI2NYWxsrO9qNBonTpzAd999hzfffBOvvvqq0ntr165Fbm6ufipGAIClS5eiU6dO+OWXX2BmZqb03u3btxusHkIIPHz4EJaWlg12zqbMw8ND5fetodX2Xln5j9j6VlhYCGtr6wY9Z03KyspqDJZMTU0bqDaNW5Ma8tNEaWkpWrdujbCwMJX38vLyYGFhgZdfflm+7fbt25gxYwacnJxgYWEBf39/bNmypcbzVDXmvHTpUkgkEvlriUSCwsJCbNmyRT40KfuLqqq8gPXr16Nz584wNzeHq6sr5s6dqxIsPPXUU/Dz80N6ejoGDBgAKysruLm54d13362x7gBQXFyMBQsWwMHBAba2tnj66afx119/qS178+ZNTJ8+HU5OTjA3N0fnzp2xadMmjc5T2d9//42XX34ZXbp0gY2NDezs7DB06FCcOXOmxn0vX74MAHjiiSdU3jM2NkabNm2Utp0+fRpDhw6FnZ0dbGxsMGjQIJVhYdnP4PDhw5g3bx4cHBzQsmVLvPDCCygpKUFubi6mTJmCVq1aoVWrVli4cCGEEPL9r127BolEgpUrV2LdunXw8vKClZUVhgwZghs3bkAIgTfeeANt27aFpaUlRo4cib///lul/klJSejbty+sra1ha2uLYcOG4Y8//tCoTf/44w8MHDgQlpaWaNu2LZYvX17lDVST82RlZSEsLAxt27aFubk5XFxcMHLkyBrzVy5fvozHHntMJZgCAEdHR6XXUqkUq1evRpcuXWBhYQEHBweEhITg119/lZcpKyvDG2+8AW9vb5ibm8u/2IuLi5WO5eHhgeHDh2PPnj3o0aMHLC0tsXHjRgBAbm4uIiMj4e7uDnNzc7Rv3x7vvPOOSvts27YNgYGBsLW1hZ2dHbp06YLVq1dXe70AsHLlSvTp0wdt2rSBpaUlAgMD8eWXXyqV8fPzw4ABA1T2lUqlcHNzw9ixY5W2xcfHo3PnzrCwsICTkxNeeOEF3Lt3T2X/pKQk9O/fX17nxx57rMahVdn96fz58xg3bhzs7OzQpk0bzJ8/Hw8fPlQpn5CQgMDAQFhaWqJ169aYMGGCSlK6pveikpISLF68GIGBgWjRogWsra3Rt29f/PTTT9XWGVC9V3p4eOCPP/7AgQMH5PfVp556Sl5e05+7OrLP0969exEQEAALCwt06tQJu3fvVlunAwcOYM6cOXB0dETbtm3l72tzHz958iT69OkDS0tLeHp6YsOGDSr10uS7SvF+FB8fL//dWb9+PR577DEAFcO3sjaTDZmq+z4rLCzESy+9JG9DX19frFy5Uun+B1R8x0VERCAxMRF+fn7y74jk5GSlcrLP3qVLlzBt2jS0bNkSLVq0QFhYGIqKilSuV5PPnqZ09h0mmpDNmzcLAGLfvn0iJydH6d+dO3fk5aZPny5atmwpiouLlfbfsmWLACBOnDghhBCiqKhIPProo8LU1FQsWLBAvP/++6Jv374CgIiPj1faF4BYsmSJ/PXUqVNFu3btVOq4ZMkSodjsW7duFebm5qJv375i69atYuvWreLIkSNK13P16lWV/YOCgsSaNWtERESEMDY2Fo899pgoKSmRl+vfv79wdXUV7u7uYv78+WL9+vVi4MCBAoD44YcfamzLyZMnCwBi0qRJYu3ateKZZ54RXbt2VbnOrKws0bZtW+Hu7i6WLVsmPvjgA/H0008LAOK9996r8Tzt2rUTU6dOlb8+ceKE8Pb2FosWLRIbN24Uy5YtE25ubqJFixbi5s2b1R7ryJEjAoAIDw8XpaWl1ZY9e/assLa2Fi4uLuKNN94Qb7/9tvD09BTm5ubil19+kZeT/QwCAgJESEiIWLdunXjuuecEALFw4ULx5JNPikmTJon169eL4cOHCwBiy5Yt8v2vXr0q379Tp04iLi5OxMTECDMzM/H444+LV199VfTp00e8//77Yt68eUIikYiwsDClun766adCIpGIkJAQsWbNGvHOO+8IDw8P0bJlS6XPhjqZmZnCwcFBtGrVSixdulT873//Ex06dJD/LBX31/Q8ffr0ES1atBAxMTHi//7v/8Rbb70lBgwYIA4cOFBtXXx8fIS7u7u4ceNGteWEEGLatGkCgBg6dKiIj48XK1euFCNHjhRr1qyRl5k6daoAIMaOHSvWrVsnpkyZIgCIUaNGKR2rXbt2on379qJVq1Zi0aJFYsOGDeKnn34ShYWFomvXrqJNmzbi1VdfFRs2bBBTpkwREolEzJ8/X77/3r17BQAxaNAgsW7dOrFu3ToREREhnn322Rqvo23btmLOnDli7dq1Ii4uTvTs2VMAEN999528zLJly4SRkZHIzMxU2vfAgQMCgNi5c6d828yZM4WJiYkIDw8XGzZsEP/973+FtbW1yu//5s2bhUQiEX5+fuLNN98U69atEzNnzhTPPfdctfWV3V+6dOkiRowYIdauXSu/F1Ted/ny5UIikYjx48eL9evXi9jYWGFvby88PDzEvXv35OU0vRfl5OQIFxcXERUVJT744APx7rvvCl9fX2FqaipOnz6tdO7K96HK98qvvvpKtG3bVnTs2FF+X927d68QQmj8c69Ku3bthI+Pj2jZsqVYtGiRiIuLE126dBFGRkbycyjWqVOnTqJ///5izZo14u2331ZqZ03v446OjiIiIkK8//774sknnxQAxMcffywvp+l3lex+1KlTJ+Hl5SXefvtt8d5774lr166JZcuWCQDi+eefl7fZ5cuXhRCq32dSqVQMHDhQSCQSMXPmTLF27VoxYsQIAUBERkaq/Kz8/f3l99r4+Hjh5eUlrKyslL6XZW3SrVs38cwzz4j169eLmTNnyu+1ijT97Kn7Htb1d5jSsbUqbeBkH2B1/8zNzeXl9uzZIwCIb7/9Vmn/0NBQ4eXlJX8dHx8vAIiEhAT5tpKSEtG7d29hY2Mj8vLy5NtrG1AJIYS1tbVSUFH5emQ3idu3bwszMzMxZMgQUV5eLi+3du1aAUB
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 640x480 with 1 Axes>"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"score_df = pd.DataFrame(score_history_c)\n",
|
|||
|
|
"score_df = score_df.sort_values('date')\n",
|
|||
|
|
"\n",
|
|||
|
|
"plt.plot(score_df['date'], score_df['total_score'], marker='o',markersize=4)\n",
|
|||
|
|
"plt.gca().invert_xaxis() # remonter le temps\n",
|
|||
|
|
"plt.title(\"Evolution de la Somme des Scores avec pénalité proportionnelle\")\n",
|
|||
|
|
"plt.xlabel(\"Date\")\n",
|
|||
|
|
"plt.ylabel(\"Total Score\")\n",
|
|||
|
|
"plt.grid(True)\n",
|
|||
|
|
"plt.show()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 25,
|
|||
|
|
"id": "eb308001-cdec-43b1-935d-0dc9dc59c192",
|
|||
|
|
"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>total_score</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>129</th>\n",
|
|||
|
|
" <td>2015-01-31</td>\n",
|
|||
|
|
" <td>0.936891</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>128</th>\n",
|
|||
|
|
" <td>2015-02-28</td>\n",
|
|||
|
|
" <td>0.937214</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>127</th>\n",
|
|||
|
|
" <td>2015-03-31</td>\n",
|
|||
|
|
" <td>0.937968</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>126</th>\n",
|
|||
|
|
" <td>2015-04-30</td>\n",
|
|||
|
|
" <td>0.938711</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>125</th>\n",
|
|||
|
|
" <td>2015-05-31</td>\n",
|
|||
|
|
" <td>0.938969</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>...</th>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4</th>\n",
|
|||
|
|
" <td>2025-06-30</td>\n",
|
|||
|
|
" <td>0.998601</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3</th>\n",
|
|||
|
|
" <td>2025-07-31</td>\n",
|
|||
|
|
" <td>0.998947</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2</th>\n",
|
|||
|
|
" <td>2025-08-31</td>\n",
|
|||
|
|
" <td>0.999188</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>2025-09-30</td>\n",
|
|||
|
|
" <td>0.999448</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>2025-10-31</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"<p>130 rows × 2 columns</p>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" date total_score\n",
|
|||
|
|
"129 2015-01-31 0.936891\n",
|
|||
|
|
"128 2015-02-28 0.937214\n",
|
|||
|
|
"127 2015-03-31 0.937968\n",
|
|||
|
|
"126 2015-04-30 0.938711\n",
|
|||
|
|
"125 2015-05-31 0.938969\n",
|
|||
|
|
".. ... ...\n",
|
|||
|
|
"4 2025-06-30 0.998601\n",
|
|||
|
|
"3 2025-07-31 0.998947\n",
|
|||
|
|
"2 2025-08-31 0.999188\n",
|
|||
|
|
"1 2025-09-30 0.999448\n",
|
|||
|
|
"0 2025-10-31 1.000000\n",
|
|||
|
|
"\n",
|
|||
|
|
"[130 rows x 2 columns]"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 25,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"score_df"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 22,
|
|||
|
|
"id": "1579c56d-df62-4161-a0a0-89b35f197ca3",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"def score_decay_vector_max(account, date_t, date_t1, tol=0.05, alpha=0.01):\n",
|
|||
|
|
" \"\"\"\n",
|
|||
|
|
" Score décroît proportionnellement à l'erreur relative,\n",
|
|||
|
|
" en utilisant le max entre stock actuel et stock ajusté par flux comme dénominateur.\n",
|
|||
|
|
" \"\"\"\n",
|
|||
|
|
" # Récupérer tous les ISIN pour ce compte\n",
|
|||
|
|
" isins_t = stocks_agg.loc[date_t, account].index if (date_t, account) in stocks_agg.index else []\n",
|
|||
|
|
" isins_t1 = stocks_agg.loc[date_t1, account].index if (date_t1, account) in stocks_agg.index else []\n",
|
|||
|
|
" isins_fl = flows_agg.loc[date_t, account].index if (date_t, account) in flows_agg.index else []\n",
|
|||
|
|
" \n",
|
|||
|
|
" all_isins = set(isins_t) | set(isins_t1) | set(isins_fl)\n",
|
|||
|
|
" if len(all_isins) == 0:\n",
|
|||
|
|
" return 1.0 # pas de données → pas de dégradation\n",
|
|||
|
|
" \n",
|
|||
|
|
" # Séries float complètes\n",
|
|||
|
|
" st_t = pd.Series({isin: stocks_agg.get((date_t, account, isin), 0) for isin in all_isins}).astype(float).fillna(0)\n",
|
|||
|
|
" st_t1 = pd.Series({isin: stocks_agg.get((date_t1, account, isin), 0) for isin in all_isins}).astype(float).fillna(0)\n",
|
|||
|
|
" fl_t = pd.Series({isin: flows_agg.get((date_t, account, isin), 0) for isin in all_isins}).astype(float).fillna(0)\n",
|
|||
|
|
" \n",
|
|||
|
|
" diff = np.abs(st_t.values - (st_t1.values + fl_t.values))\n",
|
|||
|
|
" \n",
|
|||
|
|
" # Dénominateur stable : max entre stock actuel et stock ajusté par flux\n",
|
|||
|
|
" denom = np.maximum(st_t.values, st_t1.values + fl_t.values)\n",
|
|||
|
|
" \n",
|
|||
|
|
" # Calcul erreur relative\n",
|
|||
|
|
" relative_error = np.zeros_like(diff)\n",
|
|||
|
|
" nonzero_mask = denom != 0\n",
|
|||
|
|
" relative_error[nonzero_mask] = diff[nonzero_mask] / denom[nonzero_mask]\n",
|
|||
|
|
" \n",
|
|||
|
|
" relative_error_clip = np.maximum(relative_error - tol, 0)\n",
|
|||
|
|
" \n",
|
|||
|
|
" decay_factor = max(0, 1 - alpha * np.nanmean(relative_error_clip))\n",
|
|||
|
|
" return decay_factor"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 140,
|
|||
|
|
"id": "e3c20686-38b7-473b-86e1-c8db01251098",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"image/png": "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jjvuYN26dTz++OPUrVuX3bt3M2nSJA4ePJijOXEREREEBgYycOBA7rvvPubOnctTTz2Fh4eH+RfZ/HqmkpOTCQgIoH379vzvf/+7Yk/c7t276dGjByVLlmTcuHEkJyczduxYSpcufcVz3HXXXfj7+zNixAjuu+8+AgMD8fX1pXTp0pQvX5533nmH4cOH06JFC/NYe/fupV27dpQvX57Ro0dTqFAh5s6dS79+/fj111/p37+/yzmefvppSpYsyZgxY4iJiQEcv0eGDBlCQEAA77//PrGxsXz55Ze0b9+ef/75xyXcp6SkEBAQQKtWrfjf//7HihUrmDhxItWrV+epp56iZMmSfPnllzz11FP079+fu+66C4DbbrstV+0dN24c7777rvl7Nyoqiq1bt7J9+3a6d++e7T3MyX65vWfPPvssRYsWZezYsRw9epSPP/6YYcOGMWfOHMAR5p0/79GjR+Pv78/Ro0f57bffrvjzdho4cCBVqlTh3XffJSgoiE8//ZSIiAi+++67HO2flYL+OYhIOoaISDa+/fZbA8hy8fT0NLdbunSpARgLFixw2T8wMNCoVq2a+fnjjz82AGP27NnmusTERKNNmzaGr6+vERUVZa4HjLFjx5qfhwwZYlSuXDlTG8eOHWtk/KOsUKFCxpAhQ7K9ntDQUMMwDOPs2bOGh4eH0aNHDyMlJcXc7vPPPzcAY/r06ea6Tp06GYDx3XffmesSEhKMMmXKGHfffXemc6W3Y8cOAzCefvppl/X333//dV1nRv/8848BGD///HO22xw6dMiwWq1G//79Xa7ZMAzDbrcbhnFt92XKlCkux5o1a5ZhtVqNv//+22X9lClTDMBYv379Fa/FedyJEyea6xISEozGjRsbpUqVMhITEw3DyPkz9ddffxmA8ddff7mcJzQ01ACMb7/91lw3ZMgQAzBGjx59xTY69evXz/Dy8jKOHTtmrtu3b59hs9ky/cwqV67s8mw6z//hhx+6bOdsb8af5e233240bNjQiI+PN9fZ7Xajbdu2Rs2aNc11zme9ffv2RnJysrk+Ojra8Pf3Nx577DGX44aHhxt+fn4u6533YcKECS7bNmnSxGjWrJn5+dy5c5me49y2t1GjRkbv3r0z7X81Odkvt/esW7du5u8FwzCMESNGGDabzbh06ZJhGIYxb948AzC2bNlyxfNmvCfO38N33HGHy3ZPP/20ARg7d+4012V8TrJ6fjP+WVGQPwcRSaNhgSJyVV988QXLly93WRYvXmx+37VrV0qUKGH+yy44eh2WL1/Ovffea65btGgRZcqUcSnp7u7uzvDhw7l8+TJr1qy5MReUasWKFSQmJvL888+7TB5/7LHHKFKkCAsXLnTZ3tfXlwcffND87OHhQcuWLTly5MgVz7No0SIAhg8f7rL++eefv84rcOXsmVq6dCmxsbFZbjN//nzsdjtjxozJNGHeOewwt/fF09Mz07DQn3/+mbp161KnTh3Onz9vLl27dgXgr7/+uur1uLm58cQTT5ifPTw8eOKJJzh79izbtm0D8veZeuqpp666TUpKCkuXLqVfv35UqlTJXF+3bl0CAgKu+dxZuXjxIqtWrWLgwIFER0eb9/TChQsEBARw6NAhTp486bLPY4895jLPcPny5Vy6dIn77rvP5edis9lo1ap
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 1000x500 with 1 Axes>"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"# Analyse pour différentes sensibilités\n",
|
|||
|
|
"\n",
|
|||
|
|
"import matplotlib.pyplot as plt\n",
|
|||
|
|
"score_df3 = pd.DataFrame(score_history_c)\n",
|
|||
|
|
"score_df3 = score_df3.sort_values('date')\n",
|
|||
|
|
"score_df2 = pd.DataFrame(score_history_c)\n",
|
|||
|
|
"score_df2 = score_df2.sort_values('date')\n",
|
|||
|
|
"score_df1 = pd.DataFrame(score_history)\n",
|
|||
|
|
"score_df1 = score_df1.sort_values('date')\n",
|
|||
|
|
"\n",
|
|||
|
|
"plt.figure(figsize=(10,5))\n",
|
|||
|
|
"\n",
|
|||
|
|
"# Tracer chaque score_history\n",
|
|||
|
|
"\n",
|
|||
|
|
"plt.plot(score_df2['date'], score_df2['total_score'], marker='o',markersize=2, label='alpha=0.01')\n",
|
|||
|
|
"plt.plot(score_df1['date'], score_df1['total_score'], marker='o',markersize=2, label='alpha=0.05')\n",
|
|||
|
|
"plt.plot(score_df3['date'], score_df3['total_score'], marker='o',markersize=2, label='alpha=0.1')\n",
|
|||
|
|
"\n",
|
|||
|
|
"# Inverser l'axe X si tu veux remonter dans le temps\n",
|
|||
|
|
"plt.gca().invert_xaxis()\n",
|
|||
|
|
"\n",
|
|||
|
|
"# Limites et labels\n",
|
|||
|
|
"plt.ylim(0.9, 1.05)\n",
|
|||
|
|
"plt.xlabel(\"Date\")\n",
|
|||
|
|
"plt.ylabel(\"Total Score\")\n",
|
|||
|
|
"plt.title(\"Évolution du score pour différentes sensibilités\")\n",
|
|||
|
|
"\n",
|
|||
|
|
"# Grille et légende\n",
|
|||
|
|
"plt.grid(True)\n",
|
|||
|
|
"plt.legend()\n",
|
|||
|
|
"\n",
|
|||
|
|
"plt.show()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 77,
|
|||
|
|
"id": "d85c7835-b4f3-4d0e-a9e3-53bb3a1420c7",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"score_history = []\n",
|
|||
|
|
"score_history_accounts = []\n",
|
|||
|
|
"\n",
|
|||
|
|
"scores = aum_account.set_index('Registrar Account - ID')['weight'].to_dict()\n",
|
|||
|
|
"\n",
|
|||
|
|
"score_history.append({\n",
|
|||
|
|
" \"date\": ref_date,\n",
|
|||
|
|
" \"total_score\": sum(scores.values())\n",
|
|||
|
|
"})\n",
|
|||
|
|
"\n",
|
|||
|
|
"for account, score in scores.items():\n",
|
|||
|
|
" score_history_accounts.append({\n",
|
|||
|
|
" \"date\": ref_date,\n",
|
|||
|
|
" \"account\": account,\n",
|
|||
|
|
" \"score\": score\n",
|
|||
|
|
" })\n",
|
|||
|
|
"\n",
|
|||
|
|
"dates_sorted = sorted(df['Centralisation Date'].unique(), reverse=True)\n",
|
|||
|
|
"\n",
|
|||
|
|
"alpha = 0.01\n",
|
|||
|
|
"tol = 0.05\n",
|
|||
|
|
"\n",
|
|||
|
|
"for i in range(1, len(dates_sorted)):\n",
|
|||
|
|
"\n",
|
|||
|
|
" date_t = dates_sorted[i-1]\n",
|
|||
|
|
" date_t1 = dates_sorted[i]\n",
|
|||
|
|
"\n",
|
|||
|
|
" new_scores = scores.copy()\n",
|
|||
|
|
"\n",
|
|||
|
|
" for account in scores.keys():\n",
|
|||
|
|
" decay = score_decay_vector_max(account, date_t, date_t1, tol=tol, alpha=alpha)\n",
|
|||
|
|
" new_scores[account] = scores[account] * decay\n",
|
|||
|
|
"\n",
|
|||
|
|
" scores = new_scores\n",
|
|||
|
|
"\n",
|
|||
|
|
" # score total\n",
|
|||
|
|
" score_history.append({\n",
|
|||
|
|
" \"date\": date_t1,\n",
|
|||
|
|
" \"total_score\": sum(scores.values())\n",
|
|||
|
|
" })\n",
|
|||
|
|
"\n",
|
|||
|
|
" # score par compte\n",
|
|||
|
|
" for account, score in scores.items():\n",
|
|||
|
|
" score_history_accounts.append({\n",
|
|||
|
|
" \"date\": date_t1,\n",
|
|||
|
|
" \"account\": account,\n",
|
|||
|
|
" \"score\": score\n",
|
|||
|
|
" })"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 78,
|
|||
|
|
"id": "76c1d97f-3e73-4305-a161-4a12abc9ffc2",
|
|||
|
|
"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>account</th>\n",
|
|||
|
|
" <th>score</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>2025-10-31</td>\n",
|
|||
|
|
" <td>420350</td>\n",
|
|||
|
|
" <td>0.048394</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>2025-10-31</td>\n",
|
|||
|
|
" <td>364765</td>\n",
|
|||
|
|
" <td>0.041236</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2</th>\n",
|
|||
|
|
" <td>2025-10-31</td>\n",
|
|||
|
|
" <td>200127454</td>\n",
|
|||
|
|
" <td>0.026188</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3</th>\n",
|
|||
|
|
" <td>2025-10-31</td>\n",
|
|||
|
|
" <td>312933</td>\n",
|
|||
|
|
" <td>0.024981</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4</th>\n",
|
|||
|
|
" <td>2025-10-31</td>\n",
|
|||
|
|
" <td>200127809</td>\n",
|
|||
|
|
" <td>0.024872</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" date account score\n",
|
|||
|
|
"0 2025-10-31 420350 0.048394\n",
|
|||
|
|
"1 2025-10-31 364765 0.041236\n",
|
|||
|
|
"2 2025-10-31 200127454 0.026188\n",
|
|||
|
|
"3 2025-10-31 312933 0.024981\n",
|
|||
|
|
"4 2025-10-31 200127809 0.024872"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 78,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"score_accounts_df = pd.DataFrame(score_history_accounts)\n",
|
|||
|
|
"score_accounts_df.head()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 126,
|
|||
|
|
"id": "0e0239f2-ec24-4a43-925b-365a087de3e4",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"image/png": "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
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 800x400 with 1 Axes>"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"account_id = '200127375'\n",
|
|||
|
|
"\n",
|
|||
|
|
"df_account = (\n",
|
|||
|
|
" score_accounts_df[score_accounts_df[\"account\"] == account_id]\n",
|
|||
|
|
" .sort_values(\"date\")\n",
|
|||
|
|
")\n",
|
|||
|
|
"\n",
|
|||
|
|
"if len(df_account) == 0:\n",
|
|||
|
|
" print(\"Compte non trouvé\")\n",
|
|||
|
|
"else:\n",
|
|||
|
|
" plt.figure(figsize=(8,4))\n",
|
|||
|
|
" plt.plot(df_account[\"date\"], df_account[\"score\"], marker='o', markersize=4)\n",
|
|||
|
|
"\n",
|
|||
|
|
" plt.gca().invert_xaxis()\n",
|
|||
|
|
" \n",
|
|||
|
|
" plt.grid(True)\n",
|
|||
|
|
"\n",
|
|||
|
|
" plt.xlabel(\"Date\")\n",
|
|||
|
|
" plt.ylabel(\"Score\")\n",
|
|||
|
|
" plt.title(f\"Score du compte {account_id}\")\n",
|
|||
|
|
"\n",
|
|||
|
|
" plt.show()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 97,
|
|||
|
|
"id": "dd2f09f1-e586-4f8d-925b-b7b8d2809541",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"def evolution_compte(df, id1, id = 'Registrar Account - ID'):\n",
|
|||
|
|
" def prepare_df(idt):\n",
|
|||
|
|
" df_id = df[df[id] == idt].copy()\n",
|
|||
|
|
" df_id['Centralisation Date'] = pd.to_datetime(df_id['Centralisation Date'])\n",
|
|||
|
|
" df_agg = (\n",
|
|||
|
|
" df_id\n",
|
|||
|
|
" .groupby('Centralisation Date')['Quantity - AUM']\n",
|
|||
|
|
" .sum()\n",
|
|||
|
|
" .reset_index()\n",
|
|||
|
|
" .sort_values('Centralisation Date')\n",
|
|||
|
|
" )\n",
|
|||
|
|
" return df_agg\n",
|
|||
|
|
"\n",
|
|||
|
|
" df1 = prepare_df(id1)\n",
|
|||
|
|
"\n",
|
|||
|
|
" plt.figure(figsize=(12, 6))\n",
|
|||
|
|
"\n",
|
|||
|
|
" # Courbe du compte\n",
|
|||
|
|
" plt.plot(df1['Centralisation Date'], df1['Quantity - AUM'],\n",
|
|||
|
|
" marker='.', linestyle='-', label=f'Account {id1}')\n",
|
|||
|
|
"\n",
|
|||
|
|
" plt.title(f\"Évolution AUM pour le compte {id1}\")\n",
|
|||
|
|
" plt.xlabel(\"Date\")\n",
|
|||
|
|
" plt.ylabel(\"Quantity - AUM\")\n",
|
|||
|
|
" plt.grid(True)\n",
|
|||
|
|
" plt.legend()\n",
|
|||
|
|
" plt.tight_layout()\n",
|
|||
|
|
" plt.show()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 103,
|
|||
|
|
"id": "3a6d1927-200e-48ee-8e96-f09e182ae340",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAnkVJREFUeJzs3Xd4VGXexvF7ZlImPYEQEnoUkCpNhNhARYJgoajAKiCirgoW2FWEVYqosPqCoIC4imBjBcWyCipIVQmKCNIEEUFaQk9CejJz3j/CDBlSJ4VJ+X6uzQVzznPO+U3ymE1unmIyDMMQAAAAAAAAcBGZPV0AAAAAAAAAah5CKQAAAAAAAFx0hFIAAAAAAAC46AilAAAAAAAAcNERSgEAAAAAAOCiI5QCAAAAAADARUcoBQAAAAAAgIuOUAoAAAAAAAAXHaEUAAAltGXLFj3//PM6e/asp0sBAAAAqjxCKQAASuDYsWO67bbbFBkZqaCgIE+XAwAAAFR5JsMwDE8XAQBAZbd8+XIlJSVp8ODBni4FAAAAqBYYKQUAQAn07t37ogZSJpNJkyZNKtd7Lly4UCaTSQcOHCjX+8Jz+JoCAICqjFAKAIBCOH7hL+xj48aNni6xQC+++KI+++wzT5dRIJvNpnr16slkMumrr74qsM29996rwMDAQu8RGBioe++91/l67dq1zq/J+++/X+A1V199tUwmk9q0aVOm+lE57dq1S5MmTSr3cG737t166qmn1L59ewUFBSkqKkp9+vTRzz//XGD7I0eO6K677lJoaKiCg4N1++23688//yyw7fz589WyZUtZrVY1a9ZMr732Wr42e/bs0ejRo3XVVVfJarUWGkCeOnVKL7/8sq677jrVqVNHoaGh6tq1qxYvXpyv7b333lvk97UjR44UWG9iYqIiIiJkMpn08ccf5zu/efNm9erVS8HBwQoKClLPnj21devWfO26d+9e4HN79epV4HMBANWbl6cLAACgsnvuuecUHR2d73jTpk09UE3xXnzxRd1xxx3q27evy/EhQ4Zo0KBB8vX19UxhklavXq34+Hg1adJEH3zwgW6++eZyu7fVatWiRYt0zz33uBw/cOCANmzYIKvVWm7PQuWya9cuTZ48Wd27d1eTJk3K7b5vvfWW5s+frwEDBuiRRx5RUlKS3njjDXXt2lVff/21evTo4WybkpKi66+/XklJSRo/fry8vb31yiuvqFu3btq6datq167tbPvGG2/ooYce0oABAzRmzBh99913euyxx5SWlqaxY8c628XFxenVV19Vq1at1LJlywJDHke7f/3rX+rdu7eeeeYZeXl5aenSpRo0aJDzc+Pw97//3aVuSTIMQw899JCaNGmi+vXrF/iMCRMmKC0trcBzv/zyi6655ho1bNhQEydOlN1u19y5c9WtWzf99NNPuuyyy1zaN2jQQFOnTnU5Vq9evQLvDQCo3gilAAAoxs0336wrrrjC02WUmcVikcVi8WgN77//vjp27Khhw4Zp/PjxSk1NVUBAQLncu3fv3vrf//6nkydPKjw83Hl80aJFqlu3rpo1a6YzZ86Uy7MupvL8HME9gwcP1qRJk1xG7t13331q2bKlJk2a5BLuzJ07V3v37tVPP/2kzp07S8r93tGmTRtNnz5dL774oiQpPT1d//rXv9SnTx/niKMHHnhAdrtdU6ZM0YMPPqiwsDBJ0m233abExEQFBQXp//7v/woNpVq3bq29e/eqcePGzmOPPPKIevTooX//+9966qmnnH0oJiZGMTExLtd///33SktL0913313g/Xfs2KHXX39dEyZM0IQJE/Kdf/bZZ+Xn56e4uDhn+HbPPfeoefPmGj9+vJYuXerSPiQkJF94DAComZi+BwBAGWRnZ6tWrVoaPnx4vnPJycmyWq365z//6Tx2/PhxjRgxQnXr1pXValW7du30zjvvFPuce++9t8ARIJMmTZLJZHK+NplMSk1N1TvvvOOcFuOY6lbY+kNz585V69at5evrq3r16mnkyJFKTEx0adO9e3e1adNGu3bt0vXXXy9/f3/Vr19fL730UrG1O6Snp+vTTz/VoEGDdNdddyk9PV2ff/55ia8vzu233y5fX1999NFHLscXLVqku+66q8SBnOO9bt68WVdddZX8/PwUHR2tefPm5Wtbkq+nY3rh2rVrXY4fOHBAJpNJCxcudB5zTF3ct2+fevfuraCgoEKDgqJ89dVXuvbaaxUQEKCgoCD16dNHO3fuLNG1iYmJGj16tJo0aSJfX181aNBAQ4cO1cmTJ916347393//93+aM2eOLrnkEvn7+6tnz546dOiQDMPQlClT1KBBA/n5+en222/X6dOnXe7RpEkT3XLLLVqxYoXat28vq9WqVq1a6ZNPPnG2Wbhwoe68805J0vXXX+/s93k/36X9fHTq1CnfVNLatWvr2muv1W+//eZy/OOPP1bnzp2dgZQktWjRQjfeeKOWLFniPLZmzRqdOnVKjzzyiMv1I0eOVGpqqpYtW+Y8VqtWrRLt9hkdHe0SSEm53wv69u2rzMzMQqcQOixatEgmk0l/+9vfCjz/+OOPq1+/frr22msLPP/dd9+pR48eLqPBoqKi1K1bN3355ZdKSUnJd01OTk6BxwEANQuhFAAAxUhKStLJkyddPk6dOiVJ8vb2Vr9+/fTZZ58pKyvL5brPPvtMmZmZGjRokKTcUKZ79+567733dPfdd+vll19WSEiI7r33Xs2aNatcan3vvffk6+ura6+9Vu+9957ee+89/f3vfy+0/aRJkzRy5EjVq1dP06dP14ABA/TGG2+oZ8+eys7Odml75swZ9erVS+3atdP06dPVokULjR07ttC1oS70v//9TykpKRo0aJAiIyPVvXt3ffDBB2V6v3n5+/vr9ttv13//+1/nsV9//VU7d+4s9Jftwpw5c0a9e/dWp06d9NJLL6lBgwZ6+OGH9fbbbzvbVNTXMycnR7GxsYqIiND//d//acCAAW5d/95776lPnz4KDAzUv//9bz377LPatWuXrrnmmmLXXEpJSdG1116r1157TT179tSsWbP00EMPaffu3Tp8+LAk99/3Bx98oLlz5+rRRx/VP/7xD61bt0533XWXnnnmGX399dcaO3asHnzwQX3xxRcuAa7D3r17NXDgQN18882aOnWqvLy8dOedd2rlypWSpOuuu06PPfaYJGn8+PHOft+yZcsyfz4Kk5CQ4DIaz263a9u2bQWOqLzyyiu1b98+nT17VpK0ZcsWScrXtlOnTjKbzc7z5SEhIUGSXGq9UHZ2tpYsWaKrrrqqwOD7o48+0oYNG4oMoDMzM+Xn55fvuL+/v7KysrRjxw6X47///rszIIyMjNSzzz6b7/sNAKCGMAAAQIEWLFhgSCrww9fX19num2++MSQZX3zxhcv1vXv3Ni655BLn65kzZxqSjPfff995LCsry4iJiTECAwON5ORk53FJxsSJE52vhw0bZjRu3DhfjRMnTjQu/L/zgIAAY9iwYYW+n/379xuGYRjHjx83fHx8jJ49exo2m83Zbvbs2YYk4+2333Ye69atmyHJePfdd53HMjMzjcjISGPAgAH5nlWQW265xbj66qudr//zn/8YXl5exvHjx13aDRs2zAgICCj0Phe+vzVr1hiSjI8++sj48ssvDZPJZBw8eNAwDMN48sknnV+Dbt26Ga1bty62Tsd7nT59ust7bd++vREREWFkZWUZhlHyr6ejvjVr1rg8Z//+/YYkY8GCBS7vXZLx9NNPF1unYeT/mp49e9YIDQ01HnjgAZd2CQkJRkhISL7jF5owYYIhyfjkk0/ynbPb7W69b8f7q1OnjpGYmOhsO27cOEOS0a5dOyM7O9t5fPDgwYaPj4+RkZHhPNa4cWNDkrF06VLnsaSkJCMqKsro0KGD89hHH31U4Oe4rJ+Pgqxfv94wmUzGs88+6zx24sQJQ5Lx3HPP5Ws/Z84cQ5Kxe/duwzAMY+TIkYbFYinw3nXq1DEGDRpU4LmXX37Z5WtdnFOnThkRERHGtddeW2S7L774wpBkzJ07N9+5tLQ
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 1200x600 with 1 Axes>"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"evolution_compte(df, '200127495') \n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 99,
|
|||
|
|
"id": "f13d2f9b-e4ce-4c1c-aa2b-55fb63b52616",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAwXtJREFUeJzs3Xd4VNXWx/HfZJJJJQVCSJAAoUkVFBAQCyqCggVBihUUO6jIfZWLigh2vRZQ7AjXgoJXLFcR4aKICkiR3qQHJKGG9D77/SPMkCEJpMykzffzPHk05+w5s2eySU5W1lrbYowxAgAAAAAAACqRT1VPAAAAAAAAAN6HoBQAAAAAAAAqHUEpAAAAAAAAVDqCUgAAAAAAAKh0BKUAAAAAAABQ6QhKAQAAAAAAoNIRlAIAAAAAAEClIygFAAAAAACASkdQCgCAclqzZo2eeeYZpaamVvVUAAAAgBqHoBQAAOVw8OBBXXvttYqOjladOnWqejoAAABAjWMxxpiqngQAADXNvHnzlJycrBtvvLGqpwIAAADUSGRKAQBQDv369avUgJTFYtFTTz3l1mvOnDlTFotFe/bscet1UXX4mgIAgJqEoBQAAKXk+IW/pI/ly5dX9RSL9dxzz+nrr7+u6mkUKz8/Xw0bNpTFYtEPP/xQ7JgRI0YoJCSkxGuEhIRoxIgRzs8XL17s/Jp88sknxT6mZ8+eslgsat++fYXmj+pp8+bNeuqpp9wenNu6daseffRRderUSXXq1FFMTIz69++vVatWFTv+77//1pAhQxQeHq7Q0FBdd9112rVrV7Fjp0+frjZt2iggIEAtW7bUG2+8UWTMtm3b9PDDD+uCCy5QQEBAiQHIo0eP6uWXX9bFF1+s+vXrKzw8XN27d9fs2bOLjB0xYsRpv6/9/fffxc73+PHjioqKksVi0X/+859yXzM3N1eTJk1Ss2bN5O/vr2bNmumZZ55RXl5esc8LAKhdfKt6AgAA1DSTJ09WXFxckeMtWrSogtmc2XPPPacbbrhBAwYMcDl+6623atiwYfL396+aiUn66aeflJCQoKZNm+rTTz/VVVdd5bZrBwQEaNasWbrllltcju/Zs0dLly5VQECA254L1cvmzZs1adIk9erVS02bNnXbdT/44ANNnz5dgwYN0v3336/k5GS9++676t69u+bPn6/evXs7x6alpenSSy9VcnKyHnvsMfn5+em1117TJZdcorVr16pevXrOse+++67uvfdeDRo0SGPHjtWvv/6qBx98UBkZGRo3bpxz3LJlyzR16lS1bdtWbdq00dq1a4ud57Jly/T444+rX79+euKJJ+Tr66svv/xSw4YNc743Dvfcc4/LvCXJGKN7771XTZs21VlnnVXsczz55JPKyMgo9lxZrnnLLbfoiy++0B133KEuXbpo+fLlmjBhguLj4/Xee+8Ve30AQC1iAABAqcyYMcNIMitXrqz055ZkJk6cWK7HBgcHm+HDh7t1Pu5y2223mfPOO89MmTLFBAcHm7S0tCJjhg8fboKDg0u8xqmv7+effzaSzMCBA42vr685fPiwy/hnn33WNGjQwFx44YWmXbt2bnstlaW498jBsUZ3795deROqhr744gsjyfz8889uve6qVatMamqqy7EjR46Y+vXrm549e7ocf/HFF40ks2LFCuexLVu2GKvVasaPH+88lpGRYerVq2f69+/v8vibb77ZBAcHm2PHjjmPHT161KSkpBhjjHn55ZdL/Frv2rXL7Nmzx+WY3W43l112mfH39z/tGjLGmF9//dVIMs8++2yx5zds2GB8fX3N5MmTjSTzxRdfnPZ6JV1zxYoVRpKZMGGCy9h//OMfxmKxmHXr1p3xugCAmo3yPQAA3Cg3N1d169bV7bffXuRcSkqKAgIC9H//93/OY4cOHdLIkSPVoEEDBQQEqGPHjvr3v/99xucZMWJEsRkgTz31lCwWi/Nzi8Wi9PR0/fvf/3aWzjhK3UrqP/TWW2+pXbt28vf3V8OGDTVq1CgdP37cZUyvXr3Uvn17bd68WZdeeqmCgoJ01lln6aWXXjrj3B0yMzP11VdfadiwYRoyZIgyMzP1zTfflPrxZ3LdddfJ399fX3zxhcvxWbNmaciQIbJaraW6juO1rl69WhdccIECAwMVFxend955p8jY0nw9HeWFixcvdjm+Z88eWSwWzZw503nMUbq4c+dO9evXT3Xq1NHNN99cujegkB9++EEXXXSRgoODVadOHfXv31+bNm0q1WOPHz+uhx9+WE2bNpW/v78aNWqk2267TUeOHCnT63a8vn/961+aNm2amjVrpqCgIPXp00f79u2TMUZPP/20GjVqpMDAQF133XU6duyYyzWaNm2qq6++WgsWLFCnTp0UEBCgtm3bau7cuc4xM2fO1ODBgyVJl156qXPdF36/y/t+dO7cuUgpab169XTRRRdpy5YtLsf/85//qGvXruratavzWOvWrXX55Zdrzpw5zmM///yzjh49qvvvv9/l8aNGjVJ6erq+//5757G6deuWarfPuLg4NWnSxOWYxWLRgAEDlJ2dXWIJocOsWbNksVh00003FXv+oYce0vXXX6+LLrrojHM53TV//fVXSdKwYcNcxg4bNkzGmGLLDQEAtQtBKQAAyig5OVlHjhxx+Th69Kgkyc/PT9dff72+/vpr5eTkuDzu66+/VnZ2tvMXsMzMTPXq1Usff/yxbr75Zr388ssKCwvTiBEjNGXKFLfM9eOPP5a/v78uuugiffzxx/r44491zz33lDj+qaee0qhRo9SwYUO98sorGjRokN5991316dNHubm5LmOTkpJ05ZVXqmPHjnrllVfUunVrjRs3rsTeUKf69ttvlZaWpmHDhik6Olq9evXSp59+WqHXW1hQUJCuu+46ffbZZ85j69at06ZNm0r8ZbskSUlJ6tevnzp37qyXXnpJjRo10n333acPP/zQOcZTX8+8vDz17dtXUVFR+te//qVBgwaV6fEff/yx+vfvr5CQEL344ouaMGGCNm/erAsvvPCMPZfS0tJ00UUX6Y033lCfPn00ZcoU3Xvvvdq6dav2798vqeyv+9NPP9Vbb72lBx54QP/4xz/0yy+/aMiQIXriiSc0f/58jRs3Tnfffbf++9//ugRwHbZv366hQ4fqqquu0vPPPy9fX18NHjxYCxculCRdfPHFevDBByVJjz32mHPdt2nTpsLvR0kSExMVGRnp/Nxut2v9+vXq0qVLkbHnn3++du7cqdTUVEnSmjVrJKnI2M6dO8vHx8d53h0SExMlyWWup8rNzdWcOXN0wQUXFBv4/uKLL7R06dIyBaBLumZ2drYkKTAw0GV8UFCQJGn16tWlfg4AQA1V1alaAADUFI7SqOI+/P39neN+/PFHI8n897//dXl8v379TLNmzZyfv/7660aS+eSTT5zHcnJyTI8ePUxISIizTMeYouV7w4cPN02aNCkyx4kTJ5pTf7yXVL53aqnXoUOHjM1mM3369DH5+fnOcW+++aaRZD788EPnsUsuucRIMh999JHzWHZ2tomOjjaDBg0q8lzFufrqq11Knt577z3j6+trDh065DKuvOV7X3zxhfnuu++MxWIx8fHxxhhjHnnkEefX4JJLLilV+Z7jtb7yyisur7VTp04mKirK5OTkGGNK//V0zO/U0rLdu3cbSWbGjBkur12S+ec//3nGeRpT9GuamppqwsPDzV133eUyLjEx0YSFhRU5fqonn3zSSDJz584tcs5ut5fpdTteX/369c3x48edY8ePH28kmY4dO5rc3Fzn8RtvvNHYbDaTlZXlPNakSRMjyXz55ZfOY8nJySYmJsace+65zmMlle9V9P0ozpIlS4zFYnEpQTt8+LCRZCZPnlxk/LRp04wks3XrVmOMMaNGjTJWq7XYa9evX98MGzas2HOnK98rztGjR01UVJS56KKLTjvuv//9r5Fk3nrrrSLnMjIyTOPGjZ3lh4X/rZXnml9++aWRZD7++GOX4++8846RZNq3b1+alwYAqMHIlAIAoIymTZumhQsXunwUzg667LLLFBkZ6VJ
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 1200x600 with 1 Axes>"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"evolution_compte(df, '200127479') "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 80,
|
|||
|
|
"id": "bb58a3a7-34c8-4b1b-a31d-7861f9336725",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"# Score : chute\n",
|
|||
|
|
"\n",
|
|||
|
|
"score_accounts_df = score_accounts_df.sort_values([\"account\",\"date\"])\n",
|
|||
|
|
"\n",
|
|||
|
|
"score_accounts_df[\"score_prev\"] = score_accounts_df.groupby(\"account\")[\"score\"].shift(1)\n",
|
|||
|
|
"\n",
|
|||
|
|
"score_accounts_df[\"relative_drop\"] = (\n",
|
|||
|
|
" abs((score_accounts_df[\"score_prev\"] - score_accounts_df[\"score\"]) /\n",
|
|||
|
|
" score_accounts_df[\"score\"]\n",
|
|||
|
|
"))\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 120,
|
|||
|
|
"id": "4415773b-c5e8-44fb-965d-e53f74037e2c",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"ruptures = score_accounts_df[score_accounts_df[\"relative_drop\"] > 0.01]"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 121,
|
|||
|
|
"id": "38ad7718-e561-4457-8bcd-a67e09f027d8",
|
|||
|
|
"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>account</th>\n",
|
|||
|
|
" <th>score</th>\n",
|
|||
|
|
" <th>score_prev</th>\n",
|
|||
|
|
" <th>relative_drop</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>19823</th>\n",
|
|||
|
|
" <td>2022-01-31</td>\n",
|
|||
|
|
" <td>200127175</td>\n",
|
|||
|
|
" <td>0.000144</td>\n",
|
|||
|
|
" <td>0.000143</td>\n",
|
|||
|
|
" <td>0.010900</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>18961</th>\n",
|
|||
|
|
" <td>2022-03-31</td>\n",
|
|||
|
|
" <td>200127175</td>\n",
|
|||
|
|
" <td>0.000147</td>\n",
|
|||
|
|
" <td>0.000144</td>\n",
|
|||
|
|
" <td>0.016491</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>16927</th>\n",
|
|||
|
|
" <td>2022-07-31</td>\n",
|
|||
|
|
" <td>200127183</td>\n",
|
|||
|
|
" <td>0.001560</td>\n",
|
|||
|
|
" <td>0.001540</td>\n",
|
|||
|
|
" <td>0.012848</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>9385</th>\n",
|
|||
|
|
" <td>2024-01-31</td>\n",
|
|||
|
|
" <td>200127331</td>\n",
|
|||
|
|
" <td>0.000245</td>\n",
|
|||
|
|
" <td>0.000214</td>\n",
|
|||
|
|
" <td>0.127564</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>13280</th>\n",
|
|||
|
|
" <td>2023-04-30</td>\n",
|
|||
|
|
" <td>200127345</td>\n",
|
|||
|
|
" <td>0.000188</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>9401</th>\n",
|
|||
|
|
" <td>2024-01-31</td>\n",
|
|||
|
|
" <td>200127345</td>\n",
|
|||
|
|
" <td>0.000216</td>\n",
|
|||
|
|
" <td>0.000188</td>\n",
|
|||
|
|
" <td>0.129203</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>20835</th>\n",
|
|||
|
|
" <td>2021-10-31</td>\n",
|
|||
|
|
" <td>200127356</td>\n",
|
|||
|
|
" <td>0.001155</td>\n",
|
|||
|
|
" <td>0.001133</td>\n",
|
|||
|
|
" <td>0.019231</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4457</th>\n",
|
|||
|
|
" <td>2024-12-31</td>\n",
|
|||
|
|
" <td>200127356</td>\n",
|
|||
|
|
" <td>0.001201</td>\n",
|
|||
|
|
" <td>0.001182</td>\n",
|
|||
|
|
" <td>0.015673</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>11785</th>\n",
|
|||
|
|
" <td>2023-07-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001177</td>\n",
|
|||
|
|
" <td>0.001164</td>\n",
|
|||
|
|
" <td>0.011002</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>20384</th>\n",
|
|||
|
|
" <td>2021-11-30</td>\n",
|
|||
|
|
" <td>200127443</td>\n",
|
|||
|
|
" <td>0.001383</td>\n",
|
|||
|
|
" <td>0.001368</td>\n",
|
|||
|
|
" <td>0.010832</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>19091</th>\n",
|
|||
|
|
" <td>2022-02-28</td>\n",
|
|||
|
|
" <td>200127443</td>\n",
|
|||
|
|
" <td>0.001447</td>\n",
|
|||
|
|
" <td>0.001401</td>\n",
|
|||
|
|
" <td>0.031917</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>398</th>\n",
|
|||
|
|
" <td>2025-10-31</td>\n",
|
|||
|
|
" <td>200127455</td>\n",
|
|||
|
|
" <td>0.000171</td>\n",
|
|||
|
|
" <td>0.000169</td>\n",
|
|||
|
|
" <td>0.011677</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>16621</th>\n",
|
|||
|
|
" <td>2022-08-31</td>\n",
|
|||
|
|
" <td>200127479</td>\n",
|
|||
|
|
" <td>0.000470</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>15759</th>\n",
|
|||
|
|
" <td>2022-10-31</td>\n",
|
|||
|
|
" <td>200127479</td>\n",
|
|||
|
|
" <td>0.000475</td>\n",
|
|||
|
|
" <td>0.000470</td>\n",
|
|||
|
|
" <td>0.010020</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>11157</th>\n",
|
|||
|
|
" <td>2023-09-30</td>\n",
|
|||
|
|
" <td>200127495</td>\n",
|
|||
|
|
" <td>0.000189</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>166</th>\n",
|
|||
|
|
" <td>2025-10-31</td>\n",
|
|||
|
|
" <td>200127554</td>\n",
|
|||
|
|
" <td>0.000941</td>\n",
|
|||
|
|
" <td>0.000850</td>\n",
|
|||
|
|
" <td>0.096969</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>12614</th>\n",
|
|||
|
|
" <td>2023-05-31</td>\n",
|
|||
|
|
" <td>200127579</td>\n",
|
|||
|
|
" <td>0.001600</td>\n",
|
|||
|
|
" <td>0.001568</td>\n",
|
|||
|
|
" <td>0.019538</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>9682</th>\n",
|
|||
|
|
" <td>2023-12-31</td>\n",
|
|||
|
|
" <td>200127613</td>\n",
|
|||
|
|
" <td>0.000679</td>\n",
|
|||
|
|
" <td>0.000470</td>\n",
|
|||
|
|
" <td>0.307807</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>14132</th>\n",
|
|||
|
|
" <td>2023-02-28</td>\n",
|
|||
|
|
" <td>200127639</td>\n",
|
|||
|
|
" <td>0.000239</td>\n",
|
|||
|
|
" <td>0.000234</td>\n",
|
|||
|
|
" <td>0.020886</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>17399</th>\n",
|
|||
|
|
" <td>2022-06-30</td>\n",
|
|||
|
|
" <td>200127731</td>\n",
|
|||
|
|
" <td>0.000973</td>\n",
|
|||
|
|
" <td>0.000824</td>\n",
|
|||
|
|
" <td>0.152497</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>10034</th>\n",
|
|||
|
|
" <td>2023-11-30</td>\n",
|
|||
|
|
" <td>200127743</td>\n",
|
|||
|
|
" <td>0.001549</td>\n",
|
|||
|
|
" <td>0.001521</td>\n",
|
|||
|
|
" <td>0.017847</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>9806</th>\n",
|
|||
|
|
" <td>2023-12-31</td>\n",
|
|||
|
|
" <td>200128473</td>\n",
|
|||
|
|
" <td>0.000271</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>17531</th>\n",
|
|||
|
|
" <td>2022-06-30</td>\n",
|
|||
|
|
" <td>200131648</td>\n",
|
|||
|
|
" <td>0.000349</td>\n",
|
|||
|
|
" <td>0.000341</td>\n",
|
|||
|
|
" <td>0.021279</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>16179</th>\n",
|
|||
|
|
" <td>2022-09-30</td>\n",
|
|||
|
|
" <td>200131736</td>\n",
|
|||
|
|
" <td>0.000521</td>\n",
|
|||
|
|
" <td>0.000486</td>\n",
|
|||
|
|
" <td>0.066359</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>15186</th>\n",
|
|||
|
|
" <td>2022-11-30</td>\n",
|
|||
|
|
" <td>200137467</td>\n",
|
|||
|
|
" <td>0.001631</td>\n",
|
|||
|
|
" <td>0.001580</td>\n",
|
|||
|
|
" <td>0.031048</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>14324</th>\n",
|
|||
|
|
" <td>2023-01-31</td>\n",
|
|||
|
|
" <td>200137467</td>\n",
|
|||
|
|
" <td>0.001656</td>\n",
|
|||
|
|
" <td>0.001637</td>\n",
|
|||
|
|
" <td>0.011322</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>13031</th>\n",
|
|||
|
|
" <td>2023-04-30</td>\n",
|
|||
|
|
" <td>200137467</td>\n",
|
|||
|
|
" <td>0.001742</td>\n",
|
|||
|
|
" <td>0.001667</td>\n",
|
|||
|
|
" <td>0.043261</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>12600</th>\n",
|
|||
|
|
" <td>2023-05-31</td>\n",
|
|||
|
|
" <td>200137467</td>\n",
|
|||
|
|
" <td>0.001766</td>\n",
|
|||
|
|
" <td>0.001742</td>\n",
|
|||
|
|
" <td>0.013685</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>10445</th>\n",
|
|||
|
|
" <td>2023-10-31</td>\n",
|
|||
|
|
" <td>200137467</td>\n",
|
|||
|
|
" <td>0.001989</td>\n",
|
|||
|
|
" <td>0.001778</td>\n",
|
|||
|
|
" <td>0.105985</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>9152</th>\n",
|
|||
|
|
" <td>2024-01-31</td>\n",
|
|||
|
|
" <td>200137467</td>\n",
|
|||
|
|
" <td>0.002019</td>\n",
|
|||
|
|
" <td>0.001998</td>\n",
|
|||
|
|
" <td>0.010172</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>50</th>\n",
|
|||
|
|
" <td>2025-10-31</td>\n",
|
|||
|
|
" <td>200137997</td>\n",
|
|||
|
|
" <td>0.004674</td>\n",
|
|||
|
|
" <td>0.004618</td>\n",
|
|||
|
|
" <td>0.012157</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>20539</th>\n",
|
|||
|
|
" <td>2021-11-30</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000046</td>\n",
|
|||
|
|
" <td>0.000045</td>\n",
|
|||
|
|
" <td>0.012108</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>20108</th>\n",
|
|||
|
|
" <td>2021-12-31</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000046</td>\n",
|
|||
|
|
" <td>0.000046</td>\n",
|
|||
|
|
" <td>0.010058</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>19677</th>\n",
|
|||
|
|
" <td>2022-01-31</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000048</td>\n",
|
|||
|
|
" <td>0.000046</td>\n",
|
|||
|
|
" <td>0.039179</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>19246</th>\n",
|
|||
|
|
" <td>2022-02-28</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000051</td>\n",
|
|||
|
|
" <td>0.000048</td>\n",
|
|||
|
|
" <td>0.058795</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>17522</th>\n",
|
|||
|
|
" <td>2022-06-30</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000053</td>\n",
|
|||
|
|
" <td>0.000052</td>\n",
|
|||
|
|
" <td>0.011141</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>13643</th>\n",
|
|||
|
|
" <td>2023-03-31</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000065</td>\n",
|
|||
|
|
" <td>0.000054</td>\n",
|
|||
|
|
" <td>0.163563</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>13212</th>\n",
|
|||
|
|
" <td>2023-04-30</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000066</td>\n",
|
|||
|
|
" <td>0.000065</td>\n",
|
|||
|
|
" <td>0.015525</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>12781</th>\n",
|
|||
|
|
" <td>2023-05-31</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000082</td>\n",
|
|||
|
|
" <td>0.000066</td>\n",
|
|||
|
|
" <td>0.199242</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>11919</th>\n",
|
|||
|
|
" <td>2023-07-31</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000087</td>\n",
|
|||
|
|
" <td>0.000083</td>\n",
|
|||
|
|
" <td>0.048745</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>11488</th>\n",
|
|||
|
|
" <td>2023-08-31</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000088</td>\n",
|
|||
|
|
" <td>0.000087</td>\n",
|
|||
|
|
" <td>0.013252</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>8902</th>\n",
|
|||
|
|
" <td>2024-02-29</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000092</td>\n",
|
|||
|
|
" <td>0.000091</td>\n",
|
|||
|
|
" <td>0.012791</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>8040</th>\n",
|
|||
|
|
" <td>2024-04-30</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000093</td>\n",
|
|||
|
|
" <td>0.000092</td>\n",
|
|||
|
|
" <td>0.010325</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>7609</th>\n",
|
|||
|
|
" <td>2024-05-31</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000095</td>\n",
|
|||
|
|
" <td>0.000093</td>\n",
|
|||
|
|
" <td>0.012915</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>6747</th>\n",
|
|||
|
|
" <td>2024-07-31</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000099</td>\n",
|
|||
|
|
" <td>0.000095</td>\n",
|
|||
|
|
" <td>0.038845</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>6316</th>\n",
|
|||
|
|
" <td>2024-08-31</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000100</td>\n",
|
|||
|
|
" <td>0.000099</td>\n",
|
|||
|
|
" <td>0.011412</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>5885</th>\n",
|
|||
|
|
" <td>2024-09-30</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000105</td>\n",
|
|||
|
|
" <td>0.000100</td>\n",
|
|||
|
|
" <td>0.041680</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>5023</th>\n",
|
|||
|
|
" <td>2024-11-30</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000111</td>\n",
|
|||
|
|
" <td>0.000105</td>\n",
|
|||
|
|
" <td>0.046012</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4592</th>\n",
|
|||
|
|
" <td>2024-12-31</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000115</td>\n",
|
|||
|
|
" <td>0.000111</td>\n",
|
|||
|
|
" <td>0.037865</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2437</th>\n",
|
|||
|
|
" <td>2025-05-31</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000139</td>\n",
|
|||
|
|
" <td>0.000118</td>\n",
|
|||
|
|
" <td>0.147957</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2006</th>\n",
|
|||
|
|
" <td>2025-06-30</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000361</td>\n",
|
|||
|
|
" <td>0.000139</td>\n",
|
|||
|
|
" <td>0.614563</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1575</th>\n",
|
|||
|
|
" <td>2025-07-31</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000371</td>\n",
|
|||
|
|
" <td>0.000361</td>\n",
|
|||
|
|
" <td>0.027594</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>713</th>\n",
|
|||
|
|
" <td>2025-09-30</td>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>0.000379</td>\n",
|
|||
|
|
" <td>0.000373</td>\n",
|
|||
|
|
" <td>0.015225</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" date account score score_prev relative_drop\n",
|
|||
|
|
"19823 2022-01-31 200127175 0.000144 0.000143 0.010900\n",
|
|||
|
|
"18961 2022-03-31 200127175 0.000147 0.000144 0.016491\n",
|
|||
|
|
"16927 2022-07-31 200127183 0.001560 0.001540 0.012848\n",
|
|||
|
|
"9385 2024-01-31 200127331 0.000245 0.000214 0.127564\n",
|
|||
|
|
"13280 2023-04-30 200127345 0.000188 0.000000 1.000000\n",
|
|||
|
|
"9401 2024-01-31 200127345 0.000216 0.000188 0.129203\n",
|
|||
|
|
"20835 2021-10-31 200127356 0.001155 0.001133 0.019231\n",
|
|||
|
|
"4457 2024-12-31 200127356 0.001201 0.001182 0.015673\n",
|
|||
|
|
"11785 2023-07-31 200127375 0.001177 0.001164 0.011002\n",
|
|||
|
|
"20384 2021-11-30 200127443 0.001383 0.001368 0.010832\n",
|
|||
|
|
"19091 2022-02-28 200127443 0.001447 0.001401 0.031917\n",
|
|||
|
|
"398 2025-10-31 200127455 0.000171 0.000169 0.011677\n",
|
|||
|
|
"16621 2022-08-31 200127479 0.000470 0.000000 1.000000\n",
|
|||
|
|
"15759 2022-10-31 200127479 0.000475 0.000470 0.010020\n",
|
|||
|
|
"11157 2023-09-30 200127495 0.000189 0.000000 1.000000\n",
|
|||
|
|
"166 2025-10-31 200127554 0.000941 0.000850 0.096969\n",
|
|||
|
|
"12614 2023-05-31 200127579 0.001600 0.001568 0.019538\n",
|
|||
|
|
"9682 2023-12-31 200127613 0.000679 0.000470 0.307807\n",
|
|||
|
|
"14132 2023-02-28 200127639 0.000239 0.000234 0.020886\n",
|
|||
|
|
"17399 2022-06-30 200127731 0.000973 0.000824 0.152497\n",
|
|||
|
|
"10034 2023-11-30 200127743 0.001549 0.001521 0.017847\n",
|
|||
|
|
"9806 2023-12-31 200128473 0.000271 0.000000 1.000000\n",
|
|||
|
|
"17531 2022-06-30 200131648 0.000349 0.000341 0.021279\n",
|
|||
|
|
"16179 2022-09-30 200131736 0.000521 0.000486 0.066359\n",
|
|||
|
|
"15186 2022-11-30 200137467 0.001631 0.001580 0.031048\n",
|
|||
|
|
"14324 2023-01-31 200137467 0.001656 0.001637 0.011322\n",
|
|||
|
|
"13031 2023-04-30 200137467 0.001742 0.001667 0.043261\n",
|
|||
|
|
"12600 2023-05-31 200137467 0.001766 0.001742 0.013685\n",
|
|||
|
|
"10445 2023-10-31 200137467 0.001989 0.001778 0.105985\n",
|
|||
|
|
"9152 2024-01-31 200137467 0.002019 0.001998 0.010172\n",
|
|||
|
|
"50 2025-10-31 200137997 0.004674 0.004618 0.012157\n",
|
|||
|
|
"20539 2021-11-30 365304 0.000046 0.000045 0.012108\n",
|
|||
|
|
"20108 2021-12-31 365304 0.000046 0.000046 0.010058\n",
|
|||
|
|
"19677 2022-01-31 365304 0.000048 0.000046 0.039179\n",
|
|||
|
|
"19246 2022-02-28 365304 0.000051 0.000048 0.058795\n",
|
|||
|
|
"17522 2022-06-30 365304 0.000053 0.000052 0.011141\n",
|
|||
|
|
"13643 2023-03-31 365304 0.000065 0.000054 0.163563\n",
|
|||
|
|
"13212 2023-04-30 365304 0.000066 0.000065 0.015525\n",
|
|||
|
|
"12781 2023-05-31 365304 0.000082 0.000066 0.199242\n",
|
|||
|
|
"11919 2023-07-31 365304 0.000087 0.000083 0.048745\n",
|
|||
|
|
"11488 2023-08-31 365304 0.000088 0.000087 0.013252\n",
|
|||
|
|
"8902 2024-02-29 365304 0.000092 0.000091 0.012791\n",
|
|||
|
|
"8040 2024-04-30 365304 0.000093 0.000092 0.010325\n",
|
|||
|
|
"7609 2024-05-31 365304 0.000095 0.000093 0.012915\n",
|
|||
|
|
"6747 2024-07-31 365304 0.000099 0.000095 0.038845\n",
|
|||
|
|
"6316 2024-08-31 365304 0.000100 0.000099 0.011412\n",
|
|||
|
|
"5885 2024-09-30 365304 0.000105 0.000100 0.041680\n",
|
|||
|
|
"5023 2024-11-30 365304 0.000111 0.000105 0.046012\n",
|
|||
|
|
"4592 2024-12-31 365304 0.000115 0.000111 0.037865\n",
|
|||
|
|
"2437 2025-05-31 365304 0.000139 0.000118 0.147957\n",
|
|||
|
|
"2006 2025-06-30 365304 0.000361 0.000139 0.614563\n",
|
|||
|
|
"1575 2025-07-31 365304 0.000371 0.000361 0.027594\n",
|
|||
|
|
"713 2025-09-30 365304 0.000379 0.000373 0.015225"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 121,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"ruptures"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 122,
|
|||
|
|
"id": "3cecbc48-9ee8-4f81-b523-00561be292dc",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"ruptures_recent = (\n",
|
|||
|
|
" ruptures.sort_values(\"date\", ascending=False)\n",
|
|||
|
|
" .groupby(\"account\")\n",
|
|||
|
|
" .first()\n",
|
|||
|
|
" .reset_index()\n",
|
|||
|
|
")"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 123,
|
|||
|
|
"id": "30d11762-99be-4139-8b94-64f009290fdd",
|
|||
|
|
"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>account</th>\n",
|
|||
|
|
" <th>date</th>\n",
|
|||
|
|
" <th>score</th>\n",
|
|||
|
|
" <th>score_prev</th>\n",
|
|||
|
|
" <th>relative_drop</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>0</th>\n",
|
|||
|
|
" <td>200127175</td>\n",
|
|||
|
|
" <td>2022-03-31</td>\n",
|
|||
|
|
" <td>0.000147</td>\n",
|
|||
|
|
" <td>0.000144</td>\n",
|
|||
|
|
" <td>0.016491</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1</th>\n",
|
|||
|
|
" <td>200127183</td>\n",
|
|||
|
|
" <td>2022-07-31</td>\n",
|
|||
|
|
" <td>0.001560</td>\n",
|
|||
|
|
" <td>0.001540</td>\n",
|
|||
|
|
" <td>0.012848</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2</th>\n",
|
|||
|
|
" <td>200127331</td>\n",
|
|||
|
|
" <td>2024-01-31</td>\n",
|
|||
|
|
" <td>0.000245</td>\n",
|
|||
|
|
" <td>0.000214</td>\n",
|
|||
|
|
" <td>0.127564</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3</th>\n",
|
|||
|
|
" <td>200127345</td>\n",
|
|||
|
|
" <td>2024-01-31</td>\n",
|
|||
|
|
" <td>0.000216</td>\n",
|
|||
|
|
" <td>0.000188</td>\n",
|
|||
|
|
" <td>0.129203</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4</th>\n",
|
|||
|
|
" <td>200127356</td>\n",
|
|||
|
|
" <td>2024-12-31</td>\n",
|
|||
|
|
" <td>0.001201</td>\n",
|
|||
|
|
" <td>0.001182</td>\n",
|
|||
|
|
" <td>0.015673</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>5</th>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>2023-07-31</td>\n",
|
|||
|
|
" <td>0.001177</td>\n",
|
|||
|
|
" <td>0.001164</td>\n",
|
|||
|
|
" <td>0.011002</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>6</th>\n",
|
|||
|
|
" <td>200127443</td>\n",
|
|||
|
|
" <td>2022-02-28</td>\n",
|
|||
|
|
" <td>0.001447</td>\n",
|
|||
|
|
" <td>0.001401</td>\n",
|
|||
|
|
" <td>0.031917</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>7</th>\n",
|
|||
|
|
" <td>200127455</td>\n",
|
|||
|
|
" <td>2025-10-31</td>\n",
|
|||
|
|
" <td>0.000171</td>\n",
|
|||
|
|
" <td>0.000169</td>\n",
|
|||
|
|
" <td>0.011677</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>8</th>\n",
|
|||
|
|
" <td>200127479</td>\n",
|
|||
|
|
" <td>2022-10-31</td>\n",
|
|||
|
|
" <td>0.000475</td>\n",
|
|||
|
|
" <td>0.000470</td>\n",
|
|||
|
|
" <td>0.010020</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>9</th>\n",
|
|||
|
|
" <td>200127495</td>\n",
|
|||
|
|
" <td>2023-09-30</td>\n",
|
|||
|
|
" <td>0.000189</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>10</th>\n",
|
|||
|
|
" <td>200127554</td>\n",
|
|||
|
|
" <td>2025-10-31</td>\n",
|
|||
|
|
" <td>0.000941</td>\n",
|
|||
|
|
" <td>0.000850</td>\n",
|
|||
|
|
" <td>0.096969</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>11</th>\n",
|
|||
|
|
" <td>200127579</td>\n",
|
|||
|
|
" <td>2023-05-31</td>\n",
|
|||
|
|
" <td>0.001600</td>\n",
|
|||
|
|
" <td>0.001568</td>\n",
|
|||
|
|
" <td>0.019538</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>12</th>\n",
|
|||
|
|
" <td>200127613</td>\n",
|
|||
|
|
" <td>2023-12-31</td>\n",
|
|||
|
|
" <td>0.000679</td>\n",
|
|||
|
|
" <td>0.000470</td>\n",
|
|||
|
|
" <td>0.307807</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>13</th>\n",
|
|||
|
|
" <td>200127639</td>\n",
|
|||
|
|
" <td>2023-02-28</td>\n",
|
|||
|
|
" <td>0.000239</td>\n",
|
|||
|
|
" <td>0.000234</td>\n",
|
|||
|
|
" <td>0.020886</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>14</th>\n",
|
|||
|
|
" <td>200127731</td>\n",
|
|||
|
|
" <td>2022-06-30</td>\n",
|
|||
|
|
" <td>0.000973</td>\n",
|
|||
|
|
" <td>0.000824</td>\n",
|
|||
|
|
" <td>0.152497</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>15</th>\n",
|
|||
|
|
" <td>200127743</td>\n",
|
|||
|
|
" <td>2023-11-30</td>\n",
|
|||
|
|
" <td>0.001549</td>\n",
|
|||
|
|
" <td>0.001521</td>\n",
|
|||
|
|
" <td>0.017847</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>16</th>\n",
|
|||
|
|
" <td>200128473</td>\n",
|
|||
|
|
" <td>2023-12-31</td>\n",
|
|||
|
|
" <td>0.000271</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>1.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>17</th>\n",
|
|||
|
|
" <td>200131648</td>\n",
|
|||
|
|
" <td>2022-06-30</td>\n",
|
|||
|
|
" <td>0.000349</td>\n",
|
|||
|
|
" <td>0.000341</td>\n",
|
|||
|
|
" <td>0.021279</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>18</th>\n",
|
|||
|
|
" <td>200131736</td>\n",
|
|||
|
|
" <td>2022-09-30</td>\n",
|
|||
|
|
" <td>0.000521</td>\n",
|
|||
|
|
" <td>0.000486</td>\n",
|
|||
|
|
" <td>0.066359</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>19</th>\n",
|
|||
|
|
" <td>200137467</td>\n",
|
|||
|
|
" <td>2024-01-31</td>\n",
|
|||
|
|
" <td>0.002019</td>\n",
|
|||
|
|
" <td>0.001998</td>\n",
|
|||
|
|
" <td>0.010172</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>20</th>\n",
|
|||
|
|
" <td>200137997</td>\n",
|
|||
|
|
" <td>2025-10-31</td>\n",
|
|||
|
|
" <td>0.004674</td>\n",
|
|||
|
|
" <td>0.004618</td>\n",
|
|||
|
|
" <td>0.012157</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>21</th>\n",
|
|||
|
|
" <td>365304</td>\n",
|
|||
|
|
" <td>2025-09-30</td>\n",
|
|||
|
|
" <td>0.000379</td>\n",
|
|||
|
|
" <td>0.000373</td>\n",
|
|||
|
|
" <td>0.015225</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" account date score score_prev relative_drop\n",
|
|||
|
|
"0 200127175 2022-03-31 0.000147 0.000144 0.016491\n",
|
|||
|
|
"1 200127183 2022-07-31 0.001560 0.001540 0.012848\n",
|
|||
|
|
"2 200127331 2024-01-31 0.000245 0.000214 0.127564\n",
|
|||
|
|
"3 200127345 2024-01-31 0.000216 0.000188 0.129203\n",
|
|||
|
|
"4 200127356 2024-12-31 0.001201 0.001182 0.015673\n",
|
|||
|
|
"5 200127375 2023-07-31 0.001177 0.001164 0.011002\n",
|
|||
|
|
"6 200127443 2022-02-28 0.001447 0.001401 0.031917\n",
|
|||
|
|
"7 200127455 2025-10-31 0.000171 0.000169 0.011677\n",
|
|||
|
|
"8 200127479 2022-10-31 0.000475 0.000470 0.010020\n",
|
|||
|
|
"9 200127495 2023-09-30 0.000189 0.000000 1.000000\n",
|
|||
|
|
"10 200127554 2025-10-31 0.000941 0.000850 0.096969\n",
|
|||
|
|
"11 200127579 2023-05-31 0.001600 0.001568 0.019538\n",
|
|||
|
|
"12 200127613 2023-12-31 0.000679 0.000470 0.307807\n",
|
|||
|
|
"13 200127639 2023-02-28 0.000239 0.000234 0.020886\n",
|
|||
|
|
"14 200127731 2022-06-30 0.000973 0.000824 0.152497\n",
|
|||
|
|
"15 200127743 2023-11-30 0.001549 0.001521 0.017847\n",
|
|||
|
|
"16 200128473 2023-12-31 0.000271 0.000000 1.000000\n",
|
|||
|
|
"17 200131648 2022-06-30 0.000349 0.000341 0.021279\n",
|
|||
|
|
"18 200131736 2022-09-30 0.000521 0.000486 0.066359\n",
|
|||
|
|
"19 200137467 2024-01-31 0.002019 0.001998 0.010172\n",
|
|||
|
|
"20 200137997 2025-10-31 0.004674 0.004618 0.012157\n",
|
|||
|
|
"21 365304 2025-09-30 0.000379 0.000373 0.015225"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 123,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"ruptures_recent"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 124,
|
|||
|
|
"id": "3da97871-c9e3-427b-9c8a-28034fe93cc2",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"ruptures_recent = ruptures_recent.sort_values(\"relative_drop\", ascending=False)"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 125,
|
|||
|
|
"id": "fed34a3d-c499-412b-83ee-690f22d3b923",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/plain": [
|
|||
|
|
"53"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 125,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"len(ruptures)"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 36,
|
|||
|
|
"id": "72534b99-1125-43cf-a06c-f6958164cc2a",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"# Pivot multi-index pour un accès rapide\n",
|
|||
|
|
"stocks_dict = {}\n",
|
|||
|
|
"for (date, account, isin), value in stocks_agg.items():\n",
|
|||
|
|
" stocks_dict.setdefault(date, {}).setdefault(account, {})[isin] = value\n",
|
|||
|
|
"\n",
|
|||
|
|
"flows_dict = {}\n",
|
|||
|
|
"for (date, account, isin), value in flows_agg.items():\n",
|
|||
|
|
" flows_dict.setdefault(date, {}).setdefault(account, {})[isin] = value"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 131,
|
|||
|
|
"id": "75c53c57-64ad-4c7a-829a-c77b4afdcc23",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"# Fonction de chirurgie pour un compte avec rupture\n",
|
|||
|
|
"\n",
|
|||
|
|
"def surgery_for_account(account, date_t, date_t1, tol=0.01, alpha=0.01):\n",
|
|||
|
|
" \"\"\"\n",
|
|||
|
|
" Pour un compte donné et une rupture, trouver le code à date_t1\n",
|
|||
|
|
" qui minimise la perte de score.\n",
|
|||
|
|
" \"\"\"\n",
|
|||
|
|
" st_t = stocks_dict.get(date_t, {}).get(account, {})\n",
|
|||
|
|
" fl_t = flows_dict.get(date_t, {}).get(account, {})\n",
|
|||
|
|
" \n",
|
|||
|
|
" # Tous les ISIN impliqués\n",
|
|||
|
|
" all_isins = set(st_t.keys())\n",
|
|||
|
|
" \n",
|
|||
|
|
" # Décroissance initiale avec le même code\n",
|
|||
|
|
" st_t1_current = stocks_dict.get(date_t1, {}).get(account, {})\n",
|
|||
|
|
" st_t_s = pd.Series({isin: st_t.get(isin,0) for isin in all_isins})\n",
|
|||
|
|
" st_t1_s = pd.Series({isin: st_t1_current.get(isin,0) for isin in all_isins})\n",
|
|||
|
|
" fl_t_s = pd.Series({isin: fl_t.get(isin,0) for isin in all_isins})\n",
|
|||
|
|
" \n",
|
|||
|
|
" diff = abs(st_t_s - (st_t1_s + fl_t_s))\n",
|
|||
|
|
" denom = np.maximum(st_t_s, st_t1_s + fl_t_s)\n",
|
|||
|
|
" relative_error = np.zeros_like(diff)\n",
|
|||
|
|
" nonzero_mask = denom != 0\n",
|
|||
|
|
" relative_error[nonzero_mask] = diff[nonzero_mask] / denom[nonzero_mask]\n",
|
|||
|
|
" relative_error_clip = np.maximum(relative_error - tol, 0)\n",
|
|||
|
|
" best_decay = max(0, 1 - alpha * np.nanmean(relative_error_clip))\n",
|
|||
|
|
" best_code = account\n",
|
|||
|
|
" \n",
|
|||
|
|
" # Si rupture > tol, tester tous les codes à t1\n",
|
|||
|
|
" if best_decay < 1 - tol:\n",
|
|||
|
|
" for candidate in stocks_dict.get(date_t1, {}).keys():\n",
|
|||
|
|
" st_c = stocks_dict[date_t1][candidate]\n",
|
|||
|
|
" st_c_s = pd.Series({isin: st_c.get(isin,0) for isin in all_isins})\n",
|
|||
|
|
" diff_c = abs(st_t_s - (st_c_s + fl_t_s))\n",
|
|||
|
|
" denom_c = np.maximum(st_t_s, st_c_s + fl_t_s)\n",
|
|||
|
|
" relative_error_c = np.zeros_like(diff_c)\n",
|
|||
|
|
" nonzero_mask_c = denom_c != 0\n",
|
|||
|
|
" relative_error_c[nonzero_mask_c] = diff_c[nonzero_mask_c] / denom_c[nonzero_mask_c]\n",
|
|||
|
|
" relative_error_clip_c = np.maximum(relative_error_c - tol, 0)\n",
|
|||
|
|
" decay_c = max(0, 1 - alpha * np.nanmean(relative_error_clip_c))\n",
|
|||
|
|
" \n",
|
|||
|
|
" if decay_c > best_decay:\n",
|
|||
|
|
" best_decay = decay_c\n",
|
|||
|
|
" best_code = candidate\n",
|
|||
|
|
" \n",
|
|||
|
|
" return best_code, best_decay"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 133,
|
|||
|
|
"id": "ad49f064-7f5e-4b1a-bf5e-b8117182b1c1",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/plain": [
|
|||
|
|
"'200127201'"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 133,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"date_t = pd.Timestamp('2023-07-31')\n",
|
|||
|
|
"date_t1 = pd.Timestamp('2023-06-30')\n",
|
|||
|
|
"date_t0 = pd.Timestamp('2022-09-30')\n",
|
|||
|
|
"\n",
|
|||
|
|
"surgery_for_account('200127375',date_t,date_t1)[0]"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 90,
|
|||
|
|
"id": "f6b9d749-c0ae-444f-b373-1502a26b9c29",
|
|||
|
|
"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>account</th>\n",
|
|||
|
|
" <th>score</th>\n",
|
|||
|
|
" <th>score_prev</th>\n",
|
|||
|
|
" <th>relative_drop</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>55842</th>\n",
|
|||
|
|
" <td>2015-01-31</td>\n",
|
|||
|
|
" <td>200127479</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>55411</th>\n",
|
|||
|
|
" <td>2015-02-28</td>\n",
|
|||
|
|
" <td>200127479</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>54980</th>\n",
|
|||
|
|
" <td>2015-03-31</td>\n",
|
|||
|
|
" <td>200127479</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>54549</th>\n",
|
|||
|
|
" <td>2015-04-30</td>\n",
|
|||
|
|
" <td>200127479</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>54118</th>\n",
|
|||
|
|
" <td>2015-05-31</td>\n",
|
|||
|
|
" <td>200127479</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" <td>NaN</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>...</th>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" <td>...</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1967</th>\n",
|
|||
|
|
" <td>2025-06-30</td>\n",
|
|||
|
|
" <td>200127479</td>\n",
|
|||
|
|
" <td>0.000486</td>\n",
|
|||
|
|
" <td>0.000485</td>\n",
|
|||
|
|
" <td>4.028644e-04</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1536</th>\n",
|
|||
|
|
" <td>2025-07-31</td>\n",
|
|||
|
|
" <td>200127479</td>\n",
|
|||
|
|
" <td>0.000486</td>\n",
|
|||
|
|
" <td>0.000486</td>\n",
|
|||
|
|
" <td>8.775873e-07</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1105</th>\n",
|
|||
|
|
" <td>2025-08-31</td>\n",
|
|||
|
|
" <td>200127479</td>\n",
|
|||
|
|
" <td>0.000486</td>\n",
|
|||
|
|
" <td>0.000486</td>\n",
|
|||
|
|
" <td>3.857307e-05</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>674</th>\n",
|
|||
|
|
" <td>2025-09-30</td>\n",
|
|||
|
|
" <td>200127479</td>\n",
|
|||
|
|
" <td>0.000486</td>\n",
|
|||
|
|
" <td>0.000486</td>\n",
|
|||
|
|
" <td>4.271008e-05</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>243</th>\n",
|
|||
|
|
" <td>2025-10-31</td>\n",
|
|||
|
|
" <td>200127479</td>\n",
|
|||
|
|
" <td>0.000486</td>\n",
|
|||
|
|
" <td>0.000486</td>\n",
|
|||
|
|
" <td>1.099025e-03</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"<p>130 rows × 5 columns</p>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" date account score score_prev relative_drop\n",
|
|||
|
|
"55842 2015-01-31 200127479 0.000000 NaN NaN\n",
|
|||
|
|
"55411 2015-02-28 200127479 0.000000 0.000000 NaN\n",
|
|||
|
|
"54980 2015-03-31 200127479 0.000000 0.000000 NaN\n",
|
|||
|
|
"54549 2015-04-30 200127479 0.000000 0.000000 NaN\n",
|
|||
|
|
"54118 2015-05-31 200127479 0.000000 0.000000 NaN\n",
|
|||
|
|
"... ... ... ... ... ...\n",
|
|||
|
|
"1967 2025-06-30 200127479 0.000486 0.000485 4.028644e-04\n",
|
|||
|
|
"1536 2025-07-31 200127479 0.000486 0.000486 8.775873e-07\n",
|
|||
|
|
"1105 2025-08-31 200127479 0.000486 0.000486 3.857307e-05\n",
|
|||
|
|
"674 2025-09-30 200127479 0.000486 0.000486 4.271008e-05\n",
|
|||
|
|
"243 2025-10-31 200127479 0.000486 0.000486 1.099025e-03\n",
|
|||
|
|
"\n",
|
|||
|
|
"[130 rows x 5 columns]"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 90,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"score_accounts_df[score_accounts_df['account']=='200127479']\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 127,
|
|||
|
|
"id": "8b239ffa-2986-4212-af74-f0d4e1753748",
|
|||
|
|
"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>account</th>\n",
|
|||
|
|
" <th>score</th>\n",
|
|||
|
|
" <th>score_prev</th>\n",
|
|||
|
|
" <th>relative_drop</th>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </thead>\n",
|
|||
|
|
" <tbody>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>16957</th>\n",
|
|||
|
|
" <td>2022-07-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001144</td>\n",
|
|||
|
|
" <td>0.001140</td>\n",
|
|||
|
|
" <td>0.003081</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>16526</th>\n",
|
|||
|
|
" <td>2022-08-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001144</td>\n",
|
|||
|
|
" <td>0.001144</td>\n",
|
|||
|
|
" <td>0.000107</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>16095</th>\n",
|
|||
|
|
" <td>2022-09-30</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001144</td>\n",
|
|||
|
|
" <td>0.001144</td>\n",
|
|||
|
|
" <td>0.000079</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>15664</th>\n",
|
|||
|
|
" <td>2022-10-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001150</td>\n",
|
|||
|
|
" <td>0.001144</td>\n",
|
|||
|
|
" <td>0.004884</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>15233</th>\n",
|
|||
|
|
" <td>2022-11-30</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001150</td>\n",
|
|||
|
|
" <td>0.001150</td>\n",
|
|||
|
|
" <td>0.000032</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>14802</th>\n",
|
|||
|
|
" <td>2022-12-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001150</td>\n",
|
|||
|
|
" <td>0.001150</td>\n",
|
|||
|
|
" <td>0.000500</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>14371</th>\n",
|
|||
|
|
" <td>2023-01-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001159</td>\n",
|
|||
|
|
" <td>0.001150</td>\n",
|
|||
|
|
" <td>0.007329</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>13940</th>\n",
|
|||
|
|
" <td>2023-02-28</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001161</td>\n",
|
|||
|
|
" <td>0.001159</td>\n",
|
|||
|
|
" <td>0.001574</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>13509</th>\n",
|
|||
|
|
" <td>2023-03-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001161</td>\n",
|
|||
|
|
" <td>0.001161</td>\n",
|
|||
|
|
" <td>0.000642</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>13078</th>\n",
|
|||
|
|
" <td>2023-04-30</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001162</td>\n",
|
|||
|
|
" <td>0.001161</td>\n",
|
|||
|
|
" <td>0.000775</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>12647</th>\n",
|
|||
|
|
" <td>2023-05-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001164</td>\n",
|
|||
|
|
" <td>0.001162</td>\n",
|
|||
|
|
" <td>0.001258</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>12216</th>\n",
|
|||
|
|
" <td>2023-06-30</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001164</td>\n",
|
|||
|
|
" <td>0.001164</td>\n",
|
|||
|
|
" <td>0.000403</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>11785</th>\n",
|
|||
|
|
" <td>2023-07-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001177</td>\n",
|
|||
|
|
" <td>0.001164</td>\n",
|
|||
|
|
" <td>0.011002</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>11354</th>\n",
|
|||
|
|
" <td>2023-08-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001177</td>\n",
|
|||
|
|
" <td>0.001177</td>\n",
|
|||
|
|
" <td>0.000352</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>10923</th>\n",
|
|||
|
|
" <td>2023-09-30</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001177</td>\n",
|
|||
|
|
" <td>0.001177</td>\n",
|
|||
|
|
" <td>0.000009</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>10492</th>\n",
|
|||
|
|
" <td>2023-10-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001179</td>\n",
|
|||
|
|
" <td>0.001177</td>\n",
|
|||
|
|
" <td>0.000907</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>10061</th>\n",
|
|||
|
|
" <td>2023-11-30</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001180</td>\n",
|
|||
|
|
" <td>0.001179</td>\n",
|
|||
|
|
" <td>0.000958</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>9630</th>\n",
|
|||
|
|
" <td>2023-12-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001181</td>\n",
|
|||
|
|
" <td>0.001180</td>\n",
|
|||
|
|
" <td>0.001105</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>9199</th>\n",
|
|||
|
|
" <td>2024-01-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001188</td>\n",
|
|||
|
|
" <td>0.001181</td>\n",
|
|||
|
|
" <td>0.005881</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>8768</th>\n",
|
|||
|
|
" <td>2024-02-29</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001190</td>\n",
|
|||
|
|
" <td>0.001188</td>\n",
|
|||
|
|
" <td>0.001295</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>8337</th>\n",
|
|||
|
|
" <td>2024-03-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001190</td>\n",
|
|||
|
|
" <td>0.001190</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>7906</th>\n",
|
|||
|
|
" <td>2024-04-30</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001194</td>\n",
|
|||
|
|
" <td>0.001190</td>\n",
|
|||
|
|
" <td>0.003455</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>7475</th>\n",
|
|||
|
|
" <td>2024-05-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001194</td>\n",
|
|||
|
|
" <td>0.001194</td>\n",
|
|||
|
|
" <td>0.000432</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>7044</th>\n",
|
|||
|
|
" <td>2024-06-30</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001194</td>\n",
|
|||
|
|
" <td>0.001194</td>\n",
|
|||
|
|
" <td>0.000237</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>6613</th>\n",
|
|||
|
|
" <td>2024-07-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001197</td>\n",
|
|||
|
|
" <td>0.001194</td>\n",
|
|||
|
|
" <td>0.001903</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>6182</th>\n",
|
|||
|
|
" <td>2024-08-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001197</td>\n",
|
|||
|
|
" <td>0.001197</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>5751</th>\n",
|
|||
|
|
" <td>2024-09-30</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001197</td>\n",
|
|||
|
|
" <td>0.001197</td>\n",
|
|||
|
|
" <td>0.000276</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>5320</th>\n",
|
|||
|
|
" <td>2024-10-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001199</td>\n",
|
|||
|
|
" <td>0.001197</td>\n",
|
|||
|
|
" <td>0.001539</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4889</th>\n",
|
|||
|
|
" <td>2024-11-30</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001199</td>\n",
|
|||
|
|
" <td>0.001199</td>\n",
|
|||
|
|
" <td>0.000027</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4458</th>\n",
|
|||
|
|
" <td>2024-12-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001199</td>\n",
|
|||
|
|
" <td>0.001199</td>\n",
|
|||
|
|
" <td>0.000091</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>4027</th>\n",
|
|||
|
|
" <td>2025-01-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001199</td>\n",
|
|||
|
|
" <td>0.001199</td>\n",
|
|||
|
|
" <td>0.000012</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3596</th>\n",
|
|||
|
|
" <td>2025-02-28</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001199</td>\n",
|
|||
|
|
" <td>0.001199</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>3165</th>\n",
|
|||
|
|
" <td>2025-03-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001200</td>\n",
|
|||
|
|
" <td>0.001199</td>\n",
|
|||
|
|
" <td>0.000799</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2734</th>\n",
|
|||
|
|
" <td>2025-04-30</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001200</td>\n",
|
|||
|
|
" <td>0.001200</td>\n",
|
|||
|
|
" <td>0.000354</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>2303</th>\n",
|
|||
|
|
" <td>2025-05-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001200</td>\n",
|
|||
|
|
" <td>0.001200</td>\n",
|
|||
|
|
" <td>0.000010</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1872</th>\n",
|
|||
|
|
" <td>2025-06-30</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001201</td>\n",
|
|||
|
|
" <td>0.001200</td>\n",
|
|||
|
|
" <td>0.000264</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1441</th>\n",
|
|||
|
|
" <td>2025-07-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001202</td>\n",
|
|||
|
|
" <td>0.001201</td>\n",
|
|||
|
|
" <td>0.000851</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>1010</th>\n",
|
|||
|
|
" <td>2025-08-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001202</td>\n",
|
|||
|
|
" <td>0.001202</td>\n",
|
|||
|
|
" <td>0.000480</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>579</th>\n",
|
|||
|
|
" <td>2025-09-30</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001202</td>\n",
|
|||
|
|
" <td>0.001202</td>\n",
|
|||
|
|
" <td>0.000000</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" <tr>\n",
|
|||
|
|
" <th>148</th>\n",
|
|||
|
|
" <td>2025-10-31</td>\n",
|
|||
|
|
" <td>200127375</td>\n",
|
|||
|
|
" <td>0.001203</td>\n",
|
|||
|
|
" <td>0.001202</td>\n",
|
|||
|
|
" <td>0.000419</td>\n",
|
|||
|
|
" </tr>\n",
|
|||
|
|
" </tbody>\n",
|
|||
|
|
"</table>\n",
|
|||
|
|
"</div>"
|
|||
|
|
],
|
|||
|
|
"text/plain": [
|
|||
|
|
" date account score score_prev relative_drop\n",
|
|||
|
|
"16957 2022-07-31 200127375 0.001144 0.001140 0.003081\n",
|
|||
|
|
"16526 2022-08-31 200127375 0.001144 0.001144 0.000107\n",
|
|||
|
|
"16095 2022-09-30 200127375 0.001144 0.001144 0.000079\n",
|
|||
|
|
"15664 2022-10-31 200127375 0.001150 0.001144 0.004884\n",
|
|||
|
|
"15233 2022-11-30 200127375 0.001150 0.001150 0.000032\n",
|
|||
|
|
"14802 2022-12-31 200127375 0.001150 0.001150 0.000500\n",
|
|||
|
|
"14371 2023-01-31 200127375 0.001159 0.001150 0.007329\n",
|
|||
|
|
"13940 2023-02-28 200127375 0.001161 0.001159 0.001574\n",
|
|||
|
|
"13509 2023-03-31 200127375 0.001161 0.001161 0.000642\n",
|
|||
|
|
"13078 2023-04-30 200127375 0.001162 0.001161 0.000775\n",
|
|||
|
|
"12647 2023-05-31 200127375 0.001164 0.001162 0.001258\n",
|
|||
|
|
"12216 2023-06-30 200127375 0.001164 0.001164 0.000403\n",
|
|||
|
|
"11785 2023-07-31 200127375 0.001177 0.001164 0.011002\n",
|
|||
|
|
"11354 2023-08-31 200127375 0.001177 0.001177 0.000352\n",
|
|||
|
|
"10923 2023-09-30 200127375 0.001177 0.001177 0.000009\n",
|
|||
|
|
"10492 2023-10-31 200127375 0.001179 0.001177 0.000907\n",
|
|||
|
|
"10061 2023-11-30 200127375 0.001180 0.001179 0.000958\n",
|
|||
|
|
"9630 2023-12-31 200127375 0.001181 0.001180 0.001105\n",
|
|||
|
|
"9199 2024-01-31 200127375 0.001188 0.001181 0.005881\n",
|
|||
|
|
"8768 2024-02-29 200127375 0.001190 0.001188 0.001295\n",
|
|||
|
|
"8337 2024-03-31 200127375 0.001190 0.001190 0.000000\n",
|
|||
|
|
"7906 2024-04-30 200127375 0.001194 0.001190 0.003455\n",
|
|||
|
|
"7475 2024-05-31 200127375 0.001194 0.001194 0.000432\n",
|
|||
|
|
"7044 2024-06-30 200127375 0.001194 0.001194 0.000237\n",
|
|||
|
|
"6613 2024-07-31 200127375 0.001197 0.001194 0.001903\n",
|
|||
|
|
"6182 2024-08-31 200127375 0.001197 0.001197 0.000000\n",
|
|||
|
|
"5751 2024-09-30 200127375 0.001197 0.001197 0.000276\n",
|
|||
|
|
"5320 2024-10-31 200127375 0.001199 0.001197 0.001539\n",
|
|||
|
|
"4889 2024-11-30 200127375 0.001199 0.001199 0.000027\n",
|
|||
|
|
"4458 2024-12-31 200127375 0.001199 0.001199 0.000091\n",
|
|||
|
|
"4027 2025-01-31 200127375 0.001199 0.001199 0.000012\n",
|
|||
|
|
"3596 2025-02-28 200127375 0.001199 0.001199 0.000000\n",
|
|||
|
|
"3165 2025-03-31 200127375 0.001200 0.001199 0.000799\n",
|
|||
|
|
"2734 2025-04-30 200127375 0.001200 0.001200 0.000354\n",
|
|||
|
|
"2303 2025-05-31 200127375 0.001200 0.001200 0.000010\n",
|
|||
|
|
"1872 2025-06-30 200127375 0.001201 0.001200 0.000264\n",
|
|||
|
|
"1441 2025-07-31 200127375 0.001202 0.001201 0.000851\n",
|
|||
|
|
"1010 2025-08-31 200127375 0.001202 0.001202 0.000480\n",
|
|||
|
|
"579 2025-09-30 200127375 0.001202 0.001202 0.000000\n",
|
|||
|
|
"148 2025-10-31 200127375 0.001203 0.001202 0.000419"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 127,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"df_account.tail(40)"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 134,
|
|||
|
|
"id": "92467723-1d7a-4eb7-bbf1-acb7ac60ce4a",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"# Chirurgie des scores\n",
|
|||
|
|
"\n",
|
|||
|
|
"score_history_c = []\n",
|
|||
|
|
"score_history_accounts_c = []\n",
|
|||
|
|
"\n",
|
|||
|
|
"scores = aum_account.set_index('Registrar Account - ID')['weight'].to_dict()\n",
|
|||
|
|
"dic_account = {}\n",
|
|||
|
|
"\n",
|
|||
|
|
"score_history_c.append({\n",
|
|||
|
|
" \"date\": ref_date,\n",
|
|||
|
|
" \"total_score\": sum(scores.values())\n",
|
|||
|
|
"})\n",
|
|||
|
|
"\n",
|
|||
|
|
"for account, score in scores.items():\n",
|
|||
|
|
" score_history_accounts_c.append({\n",
|
|||
|
|
" \"date\": ref_date,\n",
|
|||
|
|
" \"account\": account,\n",
|
|||
|
|
" \"score\": score\n",
|
|||
|
|
" })\n",
|
|||
|
|
"\n",
|
|||
|
|
"dates_sorted = sorted(df['Centralisation Date'].unique(), reverse=True)\n",
|
|||
|
|
"\n",
|
|||
|
|
"alpha = 0.01\n",
|
|||
|
|
"tol = 0.05\n",
|
|||
|
|
"\n",
|
|||
|
|
"for i in range(1, len(dates_sorted)):\n",
|
|||
|
|
"\n",
|
|||
|
|
" date_t = dates_sorted[i-1]\n",
|
|||
|
|
" date_t1 = dates_sorted[i]\n",
|
|||
|
|
"\n",
|
|||
|
|
" new_scores = scores.copy()\n",
|
|||
|
|
"\n",
|
|||
|
|
" for account in scores.keys():\n",
|
|||
|
|
" if account not in dic_account:\n",
|
|||
|
|
" decay = score_decay_vector_max(account, date_t, date_t1, tol=tol, alpha=alpha)\n",
|
|||
|
|
" if decay > 0.99: \n",
|
|||
|
|
" new_scores[account] = scores[account] * decay\n",
|
|||
|
|
" else:\n",
|
|||
|
|
" chirurgie = surgery_for_account(account,date_t,date_t1, tol = 0.01, alpha = 0.01)\n",
|
|||
|
|
" dic_account[account] = chirurgie[0]\n",
|
|||
|
|
" new_scores[account] = scores[account] * chirurgie[1]\n",
|
|||
|
|
" else: \n",
|
|||
|
|
" decay = score_decay_vector_max(dic_account[account], date_t, date_t1, tol=tol, alpha=alpha)\n",
|
|||
|
|
" if decay > 0.99: \n",
|
|||
|
|
" new_scores[account] = scores[account] * decay\n",
|
|||
|
|
" else:\n",
|
|||
|
|
" chirurgie = surgery_for_account(dic_account[account],date_t,date_t1, tol = 0.01, alpha = 0.01)\n",
|
|||
|
|
" dic_account[dic_account[account]] = chirurgie[0]\n",
|
|||
|
|
" new_scores[account] = scores[account] * chirurgie[1]\n",
|
|||
|
|
" scores = new_scores\n",
|
|||
|
|
"\n",
|
|||
|
|
" # score total\n",
|
|||
|
|
" score_history_c.append({\n",
|
|||
|
|
" \"date\": date_t1,\n",
|
|||
|
|
" \"total_score\": sum(scores.values())\n",
|
|||
|
|
" })\n",
|
|||
|
|
"\n",
|
|||
|
|
" # score par compte\n",
|
|||
|
|
" for account, score in scores.items():\n",
|
|||
|
|
" score_history_accounts_c.append({\n",
|
|||
|
|
" \"date\": date_t1,\n",
|
|||
|
|
" \"account\": account,\n",
|
|||
|
|
" \"score\": score\n",
|
|||
|
|
" })"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": null,
|
|||
|
|
"id": "68a2ff7e-a27b-4a6e-a22d-80787b88e17e",
|
|||
|
|
"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
|
|||
|
|
}
|