Project_Carmignac/rupture.ipynb

1237 lines
455 KiB
Plaintext
Raw Normal View History

2025-12-04 16:11:38 +01:00
{
"cells": [
{
"cell_type": "code",
2026-01-30 16:02:14 +01:00
"execution_count": 2,
2026-01-29 18:40:49 +01:00
"id": "0ed82607-1bc0-48f2-829e-97df9052f8d9",
2025-12-04 16:11:38 +01:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fichiers AUM : ['projet-bdc-data/carmignac/AUM ENSAE V1 -20251027.csv', 'projet-bdc-data/carmignac/AUM ENSAE V2 -20251105.csv']\n"
]
}
],
"source": [
2026-01-29 18:40:49 +01:00
"# Données\n",
"\n",
2025-12-04 16:11:38 +01:00
"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",
2026-01-29 18:40:49 +01:00
"# 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",
2025-12-04 16:11:38 +01:00
"# 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",
2026-01-29 18:40:49 +01:00
"df = aum_data['AUM ENSAE V2 -20251105.csv']\n",
"dg = flows_data['Flows ENSAE V2 -20251105.csv']"
2025-12-04 16:11:38 +01:00
]
},
{
"cell_type": "code",
2026-01-29 18:40:49 +01:00
"execution_count": 5,
2025-12-04 16:11:38 +01:00
"id": "076209a7-f6b3-4b78-9179-e24ff38338e0",
"metadata": {},
"outputs": [],
"source": [
"from detection_rupture import detect_ruptures"
]
},
{
"cell_type": "code",
2026-01-29 18:40:49 +01:00
"execution_count": 197,
2025-12-04 16:11:38 +01:00
"id": "14c59f0f-676b-4d76-878a-1176cadfc9b1",
"metadata": {},
"outputs": [
{
"data": {
2026-01-29 18:40:49 +01:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA9sAAAHqCAYAAAAUMF39AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAmwFJREFUeJzs3Xd4U+XbB/BvVtPdUgodUKCUvacsEZApoiAouH7iXqAiKgIOBAeCCzfiQHldqAwREaigIFNA9iy0UKCLtrSlO+O8f6TnNGmSNmmT5oR8P9flJTlZT5Inae4893PfCkEQBBARERERERGRyyg9PQAiIiIiIiKiqw2DbSIiIiIiIiIXY7BNRERERERE5GIMtomIiIiIiIhcjME2ERERERERkYsx2CYiIiIiIiJyMQbbRERERERERC7GYJuIiIiIiIjIxRhsExEREREREbkYg20iIiKqd4cOHcIrr7yC8+fPe3ooNVq2bBk++ugjTw+DiIi8DINtIiKq0b333ovg4GBPD8PK2bNnoVAo8PXXX3t6KGTmlVdegUKhsHt+fn4+brnlFly+fBlxcXH1ODLnrVmzBo8++ih69Ojh6aHIBt93RESOYbBNRCQTX3/9NRQKBfz9/XHx4kWr8wcPHoxOnTp5YGTkLmlpaXjllVdw4MABTw+lXt13333o3r073nvvPavzvv/+eyxatMjtY/jkk09qDBbPnj2LBx54AN999x369+/v9jH5gh07duCVV15BXl6ep4dCROR2DLaJiGSmrKwMb775pqeHQfUgLS0Nc+fO9alg++zZs+jVqxe+/fZbKJXWX0PkFGwfOHAAn332GW655Ra3j8dX7NixA3PnzmWwTUQ+gcE2EZHMdOvWDZ9//jnS0tI8PRSX0Ov1KC8v9/Qwas0bx19aWgqj0ejpYdjUokULzJ49G/7+/p4eSo3GjRuH8ePHe3oYbiXnuUJE5O0YbBMRyczs2bNhMBgcWt3W6/V49dVXkZCQAK1WKwUyZWVlFpdr0aIFxowZg7///hu9evVCQEAAOnfujL///hsAsHLlSnTu3Bn+/v7o2bMn9u/fb/P+kpOTMXLkSAQFBSE2Nhbz5s2DIAjS+eJezrfffhuLFi2SxnXs2DEAwIkTJ3DrrbciIiIC/v7+6NWrF9asWePQ85KXl4d7770XYWFhCA8Px+TJk+2ujtX2fqobv5jmf/bsWYvr/P3331AoFNJzCVSm/O/btw/9+/dHQEAA4uPjsXjxYovr9e7dG4AprVqhUFjsg23RogXuvfdeqzEOHjwYgwcPtrr/H3/8ES+++CKaNGmCwMBAFBQUAAB2796NUaNGISwsDIGBgRg0aBC2b99ucZtXrlzBtGnT0KJFC2i1WjRu3BjDhw/Hf//9V+Nztm3bNvTu3Rv+/v5ISEjAZ599Zvey3377LXr27ImAgABERETg9ttvtyiQNnjwYPz+++84d+6c9Hy0aNFCOr+srAxz5sxBq1atoNVqERcXhxkzZljNd/G+rrnmGgQGBqJBgwa47rrrsHHjRum5PXr0KLZs2SLdj/lzmpeXh2nTpiEuLg5arRatWrXCggULrIJSo9GIRYsWoWPHjvD390dUVBQeeeQRXL582eJye/fuxciRIxEZGSnNhfvvv7/G51Z8327cuBHdunWDv78/OnTogJUrV1pcLjc3F88++yw6d+6M4OBghIaG4oYbbsDBgwctLlfTXLHF0ffdoUOHcO+996Jly5bw9/dHdHQ07r//fuTk5EiXeeWVV/Dcc88BAOLj46Xn3vw9VdMcISLyJmpPD4CIiCzFx8fjnnvuweeff46ZM2ciNjbW7mUffPBBfPPNN7j11lvxzDPPYPfu3Zg/fz6OHz+OVatWWVz29OnTuPPOO/HII4/g7rvvxttvv42bbroJixcvxuzZs/H4448DAObPn4+JEyfi5MmTFmm+BoMBo0aNQt++fbFw4UKsX78ec+bMgV6vx7x58yzua+nSpSgtLcXDDz8MrVaLiIgIHD16FAMGDECTJk0wc+ZMBAUF4aeffsK4ceOwYsWKalN1BUHA2LFjsW3bNjz66KNo3749Vq1ahcmTJ1tdti73U934nXX58mWMHj0aEydOxB133IGffvoJjz32GPz8/HD//fejffv2mDdvHl5++WU8/PDDGDhwIADUem/wq6++Cj8/Pzz77LMoKyuDn58fNm/ejBtuuAE9e/bEnDlzoFQqsXTpUlx//fX4559/cM011wAAHn30Ufzyyy+YOnUqOnTogJycHGzbtg3Hjx+vtjDY4cOHMWLECDRq1AivvPIK9Ho95syZg6ioKKvLvv7663jppZcwceJEPPjgg7h06RI+/PBDXHfdddi/fz/Cw8PxwgsvID8/HxcuXJD2c4uF+YxGI26++WZs27YNDz/8MNq3b4/Dhw/jvffew6lTp7B69WrpvubOnYtXXnkF/fv3x7x58+Dn54fdu3dj8+bNGDFiBBYtWoQnnngCwcHBeOGFFwBAGnNxcTEGDRqEixcv4pFHHkGzZs2wY8cOzJo1C+np6RYp7o888gi+/vpr3HfffXjyySeRkpKCjz76CPv378f27duh0WiQlZUlPUczZ85EeHg4zp49axUw25OUlIRJkybh0UcfxeTJk7F06VLcdtttWL9+PYYPHw7A9CPY6tWrcdtttyE+Ph6ZmZn47LPPMGjQIBw7dszqM8TWXLHFmfddYmIikpOTcd999yE6OhpHjx7FkiVLcPToUezatQsKhQLjx4/HqVOn8MMPP+C9995DZGQkAKBRo0YOzxEiIq8iEBGRLCxdulQAIOzZs0c4c+aMoFarhSeffFI6f9CgQULHjh2l0wcOHBAACA8++KDF7Tz77LMCAGHz5s3SsebNmwsAhB07dkjHNmzYIAAQAgIChHPnzknHP/vsMwGA8Ndff0nHJk+eLAAQnnjiCemY0WgUbrzxRsHPz0+4dOmSIAiCkJKSIgAQQkNDhaysLItxDR06VOjcubNQWlpqcRv9+/cXWrduXe1zs3r1agGAsHDhQumYXq8XBg4cKAAQli5d6pL7qW784uuTkpJicfyvv/6yer4GDRokABDeeecd6VhZWZnQrVs3oXHjxkJ5ebkgCIKwZ88eq/GLmjdvLkyePNnq+KBBg4RBgwZZ3X/Lli2F4uJii8fcunVrYeTIkYLRaJSOFxcXC/Hx8cLw4cOlY2FhYcKUKVOqe2psGjdunODv728xf44dOyaoVCrB/CvG2bNnBZVKJbz++usW1z98+LCgVqstjt94441C8+bNre7r//7v/wSlUin8888/FscXL14sABC2b98uCIIgJCUlCUqlUrjlllsEg8FgcVnz56Fjx44Wz6Po1VdfFYKCgoRTp05ZHJ85c6agUqmE1NRUQRAE4Z9//hEACN99953F5davX29xfNWqVdL72lni+3bFihXSsfz8fCEmJkbo3r27dKy0tNTqsaakpAharVaYN2+edMzeXLHHmfedrdv74YcfBADC1q1bpWNvvfWWzfeRM3OEiMhbMI2ciEiGWrZsif/9739YsmQJ0tPTbV5m3bp1AIDp06dbHH/mmWcAAL///rvF8Q4dOqBfv37S6T59+gAArr/+ejRr1szqeHJystV9Tp06Vfq3QqHA1KlTUV5ejj///NPichMmTJBWqwBTmuvmzZsxceJEXLlyBdnZ2cjOzkZOTg5GjhyJpKQkmxXYzR+rWq3GY489Jh1TqVR44oknLC5X1/uxN/7aUKvVeOSRR6TTfn5+eOSRR5CVlYV9+/bV6bZtmTx5MgICAqTTBw4cQFJSEu68807k5ORIz0VRURGGDh2KrVu3SmnR4eHh2L17t1N1AgwGAzZs2IBx48ZZzJ/27dtj5MiRFpdduXIljEYjJk6cKI0jOzsb0dHRaN26Nf76668a7+/nn39G+/bt0a5dO4vbuP766wFAuo3Vq1fDaDTi5ZdftirAVl07MvP7GThwIBo0aGBxP8OGDYPBYMDWrVuly4WFhWH48OEWl+vZsyeCg4Ol8YirsWvXroVOp6vx/quKjY21yMYIDQ3FPffcg/379yMjIwM
2025-12-04 16:11:38 +01:00
"text/plain": [
"<Figure size 1000x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"\n",
2026-01-29 18:40:49 +01:00
"ruptures_df = detect_ruptures(df, 0.05)\n",
2025-12-04 16:11:38 +01:00
"\n",
"# Copier pour éviter les effets de bord\n",
"df_plot = ruptures_df.copy()\n",
"df_plot['date'] = pd.to_datetime(df_plot['date'])\n",
"\n",
"# Compter les ruptures par date\n",
"counts = df_plot.groupby('date').size().reset_index(name='rupture_count')\n",
"\n",
"plt.figure(figsize=(10, 5))\n",
"plt.plot(counts['date'], counts['rupture_count'], marker='.')\n",
"plt.xlabel(\"Date\")\n",
2026-01-29 18:40:49 +01:00
"plt.ylabel(\"Nombre de connexions\")\n",
"plt.title(\"Nombre de connexions détectées par date\")\n",
2025-12-04 16:11:38 +01:00
"plt.grid(True)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
2026-01-29 18:40:49 +01:00
{
"cell_type": "code",
"execution_count": 207,
"id": "611b4e6f-38dd-42db-93c6-970214ee89b2",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Nombre de ruptures détectées : 548\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>date</th>\n",
" <th>old_account</th>\n",
" <th>new_account</th>\n",
" <th>value</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2019-12-31</td>\n",
" <td>406533</td>\n",
" <td>200127202</td>\n",
" <td>718444.2870</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2016-06-30</td>\n",
" <td>402699</td>\n",
" <td>200038850</td>\n",
" <td>223734.2979</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2015-07-31</td>\n",
" <td>402703</td>\n",
" <td>200013353</td>\n",
" <td>88886.7529</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>2019-12-31</td>\n",
" <td>404813</td>\n",
" <td>200127636</td>\n",
" <td>160820.3092</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>2015-03-31</td>\n",
" <td>406311</td>\n",
" <td>200001401</td>\n",
" <td>63268.8208</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" date old_account new_account value\n",
"0 2019-12-31 406533 200127202 718444.2870\n",
"3 2016-06-30 402699 200038850 223734.2979\n",
"4 2015-07-31 402703 200013353 88886.7529\n",
"5 2019-12-31 404813 200127636 160820.3092\n",
"7 2015-03-31 406311 200001401 63268.8208"
]
},
"execution_count": 207,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ruptures_df = detect_ruptures(df, 0.05)\n",
"\n",
"print(f\"Nombre de ruptures détectées : {len(ruptures_df)}\")\n",
"ruptures_df.head()\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "b837e39e-5d54-45eb-ac1e-fbb59fad0134",
"metadata": {},
"outputs": [],
"source": [
"from function import evolution_2_comptes\n",
"\n",
"def comparaison(i):\n",
" evolution_2_comptes(df, ruptures_df.iloc[i,1],ruptures_df.iloc[i,2])\n",
"\n",
"def rupture(compte_id, ruptures_df):\n",
" \"\"\"\n",
" Vérifie si un compte est impliqué dans une rupture.\n",
" \n",
" Args:\n",
" compte_id (int ou str) : l'ID du compte à tester\n",
" ruptures_df (DataFrame) : dataframe des ruptures avec colonnes 'old_account' et 'new_account'\n",
" \n",
" Returns:\n",
" tuple : (dans_old, dans_new)\n",
" - dans_old : True si le compte est dans old_account\n",
" - dans_new : True si le compte est dans new_account\n",
" \"\"\"\n",
" dans_old = compte_id in ruptures_df['old_account'].values\n",
" dans_new = compte_id in ruptures_df['new_account'].values\n",
" return (dans_old, dans_new)"
]
},
{
"cell_type": "code",
"execution_count": 190,
"id": "4d81bcc5-4b4b-41c7-82e1-a227745de250",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA6hNJREFUeJzs3Xl4U2Xax/Ffmu7Qha20yL7LvmNFRRApUHFDRURBRBwVVMBRZFQ2FRxXUEBcWNzwBcZlRFBARJgZQBDEDUVAkLUgAi3Q0iU57x9pTpuuaZu0Jfl+rqtXkpMnz3kSTgvcve/7sRiGYQgAAAAAAAAoRwEVvQAAAAAAAAD4H4JSAAAAAAAAKHcEpQAAAAAAAFDuCEoBAAAAAACg3BGUAgAAAAAAQLkjKAUAAAAAAIByR1AKAAAAAAAA5Y6gFAAAAAAAAModQSkAAMrBd999p6efflpnzpyp6KUAAAAAlQJBKQAAvOzYsWO69tprFRsbq4iIiIpeDgAAAFApWAzDMCp6EQAA+LKVK1cqOTlZQ4YMqeilAAAAAJUGmVIAAHjZgAEDyjUgZbFYNGXKFI/OuWjRIlksFu3fv9+j85aFN94nKpcrr7xSV155ZUUvAwAAeAlBKQAAvMAZxCnsa/PmzRW9xAJNnz5dn3zySUUvo9L75ZdfZLFYFBoaqtOnTxc4pmHDhrrmmmsKfO7bb7+VxWLRokWLzGNTpkyRxWJRQECADh48mO81KSkpCgsLk8Vi0ZgxYzzxNuCndu7cqSlTplSqIDMAwD8RlAIAwIumTZumd999N99X06ZNK3ppBSosKHXHHXcoLS1NDRo0KP9FVULvvfeeYmNjJUn/+te/PDp3SEiIPvjgg3zHP/roI4+eB/5r586dmjp1KkEpAECFC6zoBQAA4Mv69++vLl26VPQyysxqtcpqtVb0MioFwzC0ePFi3Xbbbdq3b5/ef/993X333R6bf8CAAfrggw/06KOPuhxfvHixEhMT9eGHH3rsXOXFMAydP39eYWFhFb0UAABQiZApBQBABcnMzFT16tU1YsSIfM+lpKQoNDRUf//7381jx48f18iRI1W7dm2Fhoaqffv2evvtt4s9z5133qmGDRvmO+4sF3OyWCw6d+6c3n77bbPM8M4775RUeE+puXPnqnXr1goJCVGdOnU0evTofOVsV155pdq0aaOdO3eqV69eCg8P10UXXaTnnnuu2LVLUnp6usaNG6datWopIiJC1157rQ4dOlTg2MOHD+uuu+5S7dq1FRISotatW2vBggX5xr366qtq3bq1wsPDVa1aNXXp0kWLFy92az3/+9//tH//ft1666269dZbtWHDhkLXUxq33XabduzYoV9//dU8lpSUpK+++kq33Xab2/M4y/zef/99tWjRQqGhoercubM2bNiQb+x3332n/v37KzIyUlWrVtVVV12Vr8Q07/XiVNC14SxdXLVqlbp06aKwsDC9/vrrRa73jTfeUJMmTRQWFqZu3brpP//5T4Hj0tPTNXnyZDVt2lQhISGqV6+eHn30UaWnp5tj9u/fn688Mvfn4uxFlpaWppYtW6ply5ZKS0szx5w8eVJxcXG69NJLZbPZilz36dOnNW7cODVs2FAhISGqW7euhg0bphMnTphj3Pneda75hRde0Jw5c9S4cWOFh4erb9++OnjwoAzD0FNPPaW6desqLCxM1113nU6ePOkyh/NzX716tTp06KDQ0FC1atXKJctu0aJFuvnmmyVJvXr1Mr/Xv/76a3PM559/rssvv1xVqlRRRESEEhMT9fPPP7ucKykpSSNGjFDdunUVEhKiuLg4XXfddWRfAQBKhKAUAABelJycrBMnTrh8/fXXX5KkoKAg3XDDDfrkk0+UkZHh8rpPPvlE6enpuvXWWyU5/vN85ZVX6t1339XQoUP1/PPPKyoqSnfeeadmzZrlkbW+++67CgkJ0eWXX26WGf7tb38rdPyUKVM0evRo1alTRy+++KIGDRqk119/XX379lVmZqbL2FOnTqlfv35q3769XnzxRbVs2VITJkzQ559/Xuy67r77bs2cOVN9+/bVs88+q6CgICUmJuYbd+zYMV1yySX68ssvNWbMGM2aNUtNmzbVyJEjNXPmTHPcm2++qQcffFCtWrXSzJkzNXXqVHXo0EHffPONW5/T+++/ryZNmqhr164aOHCgwsPDCyy3K60rrrhCdevWdQmSLVmyRFWrVi3wfRdl/fr1Gjt2rG6//XZNmzZNf/31l/r166effvrJHPPzzz/r8ssv1/fff69HH31UTz75pPbt26crr7zS7c+kILt27dKQIUN09dVXa9asWerQoUOhY+fPn6+//e1vio2N1XPPPacePXro2muvzddby26369prr9ULL7yggQMH6tVXX9X111+vl19+WYMHDy7xGsPCwvT2229rz549evzxx83jo0ePVnJyshYtWlRkhuDZs2d1+eWX69VXX1Xfvn01a9Ys3Xvvvfr111/NQGVJv3fff/99zZ07Vw888IAefvhhrV+/XrfccoueeOIJffHFF5owYYLuueceLV++3CVo7bR7924NHjxY/fv314wZMxQYGKibb75Za9askeS4vh588EFJ0j/+8Q/ze/3iiy+W5Pg5kJiYqKpVq+qf//ynnnzySe3cuVOXXXaZS8Bp0KBB+vjjjzVixAjNnTtXDz74oM6cOaMDBw6U+M8BAODHDAAA4HELFy40JBX4FRISYo5btWqVIclYvny5y+sHDBhgNG7c2Hw8c+ZMQ5Lx3nvvmccyMjKM+Ph4o2rVqkZKSop5XJIxefJk8/Hw4cONBg0a5Fvj5MmTjbz/FKhSpYoxfPjwQt/Pvn37DMMwjOPHjxvBwcFG3759DZvNZo6bPXu2IclYsGCBeaxnz56GJOOdd94xj6WnpxuxsbHGoEGD8p0rtx07dhiSjPvvv9/l+G233ZbvfY4cOdKIi4szTpw44TL21ltvNaKioozU1FTDMAzjuuuuM1q3bl3keQuTkZFh1KhRw3j88cdd1tK+fft8Yxs0aGAkJiYWOM/WrVsNScbChQvNY84/jz///NP4+9//bjRt2tR8rmvXrsaIESMMw3D8+Y4ePbrYtTqvt2+//dY89scffxihoaHGDTfcYB67/vrrjeDgYGPv3r3msSNHjhgRERHGFVdckW99eeW9NpzvXZLxxRdfFLvOjIwMIyYmxujQoYORnp5uHn/jjTcMSUbPnj3NY++++64REBBg/Oc//3GZY968eYYk43//+59hGIaxb9++fJ9v7s8l93VjGIYxceJEIyAgwNiwYYOxbNkyQ5Ixc+bMYtc+adIkQ5Lx0Ucf5XvObrcbhuH+965zzbVq1TJOnz7tsjZJRvv27Y3MzEzz+JAhQ4zg4GDj/Pnz5jHn5/7hhx+ax5KTk424uDijY8eO5jHne1y3bp3Lms+cOWNER0cbo0aNcjmelJRkREVFmcdPnTplSDKef/75Yj8jAACKQqYUAABeNGfOHK1Zs8blK3d2UO/evVWzZk0tWbLEPHbq1CmtWbPGJfNj5cqVio2N1ZAhQ8xjQUFBevDBB3X27FmtX7++fN5Qti+//FIZGRkaO3asAgJy/jkxatQoRUZGasWKFS7jq1atqttvv918HBwcrG7duun3338v8jwrV66UJDOzw2ns2LEujw3D0IcffqiBAwfKMAyXzLSEhAQlJydr+/btkqTo6GgdOnRIW7duLfH7/vzzz/XXX3+5/DkMGTJE33//fb7yprK47bbbtGfPHm3dutW8LUnpnlN8fLw6d+5sPq5fv76uu+46rVq1SjabTTabTatXr9b111+vxo0bm+Pi4uJ022236b///a9SUlJK9R4aNWqkhISEYsd9++23On78uO69914FBwebx++8805FRUW5jF22bJkuvvhitWzZ0uXPuHfv3pKkdevWlWqtU6ZMUevWrTV8+HDdf//96tmzZ75rriAffvih2rdvrxtuuCHfc85Sx5J+7958880u77t79+6SpNtvv12BgYEuxzMyMnT48GGX19epU8dlPZGRkRo2bJi+++47JSUlFfl
"text/plain": [
"<Figure size 1200x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"comparaison(188)"
]
},
{
"cell_type": "code",
"execution_count": 187,
"id": "9a11712a-2a33-4a24-99e6-2de42374dcec",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(True, False)"
]
},
"execution_count": 187,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rupture(\"200090312\", ruptures_df)"
]
},
{
"cell_type": "code",
"execution_count": 184,
"id": "e03329bd-7369-4bc4-b904-f7d9524bb345",
"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>old_account</th>\n",
" <th>new_account</th>\n",
" <th>value</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>713</th>\n",
" <td>2019-12-31</td>\n",
" <td>200090347</td>\n",
" <td>200127306</td>\n",
" <td>3.812176e+07</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" date old_account new_account value\n",
"713 2019-12-31 200090347 200127306 3.812176e+07"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"from IPython.display import display\n",
"\n",
"# Afficher toutes les lignes et colonnes\n",
"pd.set_option('display.max_rows', None)\n",
"pd.set_option('display.max_columns', None)\n",
"pd.set_option('display.width', 1000) # Largeur totale pour éviter les retours à la ligne\n",
"\n",
"# Affichage tabulaire joli\n",
"display(ruptures_df[ruptures_df['old_account'] == '200090347'])\n",
"#ruptures_df[ruptures_df[old_account] == '200097229']\n",
"# (Optionnel) remettre les options par défaut après affichage\n",
"pd.reset_option('display.max_rows')\n",
"pd.reset_option('display.max_columns')\n",
"pd.reset_option('display.width')"
]
},
{
"cell_type": "code",
"execution_count": 273,
"id": "54abac17-601b-459d-8f73-0f21f7eb8869",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABKMAAAJOCAYAAABr8MR3AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAkt9JREFUeJzs3Xl4U3XaxvE7Tdeke1laoOwooggIghVHXBAEVEBmBFxAdNxAURmXFxcQUcEdFXFlUQFHcGEUUUFkmRFURHFDUREXhILQ0kLXtD3vHyVHYltom7TnJP1+rour7clJ8iS/ZpB7nt9zHIZhGAIAAAAAAADqQZjVBQAAAAAAAKDhIIwCAAAAAABAvSGMAgAAAAAAQL0hjAIAAAAAAEC9IYwCAAAAAABAvSGMAgAAAAAAQL0hjAIAAAAAAEC9IYwCAAAAAABAvSGMAgDgMD7//HPdc8892r9/v9WlAAAAACGBMAoAgCrs2rVL5513nlJTUxUXF2d1OQAAAEBIcBiGYVhdBAAAdrRs2TLl5ORo5MiRVpcCAAAAhAw6owAAqMLAgQPrNYhyOBy66667AvqY8+bNk8Ph0M8//xzQx/VHXbxO2Mtpp52m0047zeoyAACATRFGAQBwCG94U9Wfjz76yOoSK3XfffdpyZIlVpdhe99++60cDoeio6O1b9++Ss9p3bq1zjnnnEpv+/TTT+VwODRv3jzz2F133SWHw6GwsDD99ttvFe6Tm5urmJgYORwOXXvttYF4GWigNm/erLvuustW4TIAALVBGAUAQCXuvvtuvfTSSxX+tG/f3urSKlVVGHXJJZeooKBArVq1qv+ibGj+/PlKTU2VJL366qsBfeyoqCi9/PLLFY6//vrrAX0eNFybN2/WlClTCKMAAEEv3OoCAACwowEDBqhHjx5Wl+E3p9Mpp9NpdRm2YBiGFi5cqAsvvFDbtm3TggUL9M9//jNgjz9w4EC9/PLLuuWWW3yOL1y4UIMGDdJrr70WsOeqL4ZhqLCwUDExMVaXAgAAQgidUQAA1JDH41FycrLGjBlT4bbc3FxFR0frpptuMo/t3r1bl19+uZo2baro6Gh16dJFL7zwwhGf59JLL1Xr1q0rHPduC/NyOBzKy8vTCy+8YG4nvPTSSyVVPTNq1qxZOvbYYxUVFaVmzZpp3LhxFbatnXbaaTruuOO0efNmnX766XK5XGrevLkeeOCBI9YuSUVFRbrxxhvVuHFjxcXF6bzzztP27dsrPff333/XZZddpqZNmyoqKkrHHnus5syZU+G8J554Qscee6xcLpeSkpLUo0cPLVy4sFr1fPjhh/r55581YsQIjRgxQmvXrq2yntq48MILtWnTJn333XfmsczMTH3wwQe68MILq/043u18CxYs0NFHH63o6Gh1795da9eurXDu559/rgEDBig+Pl6xsbE688wzK2wl/evvi1dlvxveLYrvvfeeevTooZiYGD3zzDOHrffZZ59Vu3btFBMTo549e+q///1vpecVFRVp8uTJat++vaKiopSenq5bbrlFRUVF5jk///xzhW2Qh74v3lljBQUF6tixozp27KiCggLznKysLKWlpenkk09WaWnpYevet2+fbrzxRrVu3VpRUVFq0aKFRo0apT179pjnVOez6635oYce0pNPPqm2bdvK5XKpX79++u2332QYhqZOnaoWLVooJiZGgwcPVlZWls9jeN/35cuXq2vXroqOjlanTp18uurmzZunf/zjH5Kk008/3fysr1692jznnXfe0d/+9je53W7FxcVp0KBB+uabb3yeKzMzU2PGjFGLFi0UFRWltLQ0DR48mG4rAEC9IowCAKASOTk52rNnj8+fvXv3SpIiIiI0dOhQLVmyRMXFxT73W7JkiYqKijRixAhJ5f9oPu200/TSSy/poosu0oMPPqiEhARdeumleuyxxwJS60svvaSoqCj97W9/M7cTXnXVVVWef9ddd2ncuHFq1qyZHn74YQ0bNkzPPPOM+vXrJ4/H43Nudna2zj77bHXp0kUPP/ywOnbsqFtvvVXvvPPOEev65z//qRkzZqhfv36aPn26IiIiNGjQoArn7dq1SyeddJLef/99XXvttXrsscfUvn17XX755ZoxY4Z53nPPPafx48erU6dOmjFjhqZMmaKuXbvq448/rtb7tGDBArVr104nnniizj33XLlcrkq31dXWqaeeqhYtWviEY6+88opiY2Mrfd2Hs2bNGt1www26+OKLdffdd2vv3r06++yz9fXXX5vnfPPNN/rb3/6mL774QrfccovuvPNObdu2Taeddlq135PKbNmyRSNHjtRZZ52lxx57TF27dq3y3NmzZ+uqq65SamqqHnjgAfXu3VvnnXdehdlZZWVlOu+88/TQQw/p3HPP1RNPPKEhQ4bo0Ucf1fDhw2tcY0xMjF544QX9+OOPuv32283j48aNU05OjubNm3fYjsADBw7ob3/7m5544gn169dPjz32mK6++mp99913ZkBZ08/uggULNGvWLF133XX617/+pTVr1uiCCy7QHXfcoXfffVe33nqrrrzySr311ls+YbXXDz/8oOHDh2vAgAGaNm2awsPD9Y9//EMrVqyQVP77NX78eEnSbbfdZn7WjznmGEnl/zswaNAgxcbG6v7779edd96pzZs365RTTvEJmoYNG6Y33nhDY8aM0axZszR+/Hjt379fv/76a43XAQCAWjMAAIBp7ty5hqRK/0RFRZnnvffee4Yk46233vK5/8CBA422bduaP8+YMcOQZMyfP988VlxcbGRkZBixsbFGbm6ueVySMXnyZPPn0aNHG61atapQ4+TJk42//hXudruN0aNHV/l6tm3bZhiGYezevduIjIw0+vXrZ5SWlprnzZw505BkzJkzxzzWp08fQ5Lx4osvmseKioqM1NRUY9iwYRWe61CbNm0yJBljx471OX7hhRdWeJ2XX365kZaWZuzZs8fn3BEjRhgJCQlGfn6+YRiGMXjwYOPYY4897PNWpbi42EhJSTFuv/12n1q6dOlS4dxWrVoZgwYNqvRxNmzYYEgy5s6dax7zrscff/xh3HTTTUb79u3N20488URjzJgxhmGUr++4ceOOWKv39+3TTz81j/3yyy9GdHS0MXToUPPYkCFDjMjISGPr1q3msR07dhhxcXHGqaeeWqG+v/rr74b3tUsy3n333SPWWVxcbDRp0sTo2rWrUVRUZB5/9tlnDUlGnz59zGMvvfSSERYWZvz3v//1eYynn37akGR8+OGHhmEYxrZt2yq8v4e+L4f+3hiGYUycONEICwsz1q5dayxevNiQZMyYMeOItU+aNMmQZLz++usVbisrKzMMo/qfXW/NjRs3Nvbt2+dTmySjS5cuhsfjMY+PHDnSiIyMNAoLC81j3vf9tddeM4/l5OQYaWlpRrdu3cxj3te4atUqn5r3799vJCYmGldccYXP8czMTCMhIcE8np2dbUgyHnzwwSO+RwAA1CU6owAAqMSTTz6pFStW+Pw5tBvojDPOUKNGjfTKK6+Yx7Kzs7VixQqfTo9ly5YpNTVVI0eONI9FRERo/PjxOnDggNasWVM/L+ig999/X8XFxbrhhhsUFvbnfwZcccUVio+P19tvv+1zfmxsrC6++GLz58jISPXs2VM//fTTYZ9n2bJlkmR2cnjdcMMNPj8bhqHXXntN5557rgzD8OlE69+/v3JycvTZZ59JkhITE7V9+3Zt2LChxq/7nXfe0d69e33WYeTIkfriiy8qbGPyx4UXXqgff/xRGzZsML/WZIueV0ZGhrp3727+3LJlSw0ePFjvvfeeSktLVVpaquXLl2vIkCFq27ateV5aWpouvPBC/e9//1Nubm6tXkObNm3Uv3//I5736aefavfu3br66qsVGRlpHr/00kuVkJDgc+7ixYt1zDHHqGPHjj5rfMYZZ0iSVq1aVata77rrLh177LEaPXq0xo4dqz59+lT4navMa6+9pi5dumjo0KEVbvNuaazpZ/cf//iHz+vu1auXJOniiy9WeHi4z/Hi4mL9/vvvPvdv1qyZTz3x8fEaNWq
"text/plain": [
"<Figure size 1200x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"evolution_2_comptes(df,'200126356', '200126649')"
]
},
{
"cell_type": "code",
2026-01-30 16:02:14 +01:00
"execution_count": 7,
2026-01-29 18:40:49 +01:00
"id": "ed3cb5e9-7788-4a34-8b02-d6ca8196eac1",
"metadata": {},
"outputs": [
{
"data": {
2026-01-30 16:02:14 +01:00
"image/png": "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
2026-01-29 18:40:49 +01:00
"text/plain": [
"<Figure size 1200x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from function import evolution_3_comptes\n",
"\n",
2026-01-30 16:02:14 +01:00
"evolution_3_comptes(df,'200000491','200089970','200127376')\n",
2026-01-29 18:40:49 +01:00
"\n"
]
},
{
"cell_type": "code",
"execution_count": 243,
"id": "279c19a6-900f-485d-9526-be54b5381e4b",
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"\n",
"def evolution_3_comptesa(df, id1, id2, id3, show_isin=False, max_isin=3):\n",
"\n",
" def prepare_df(id):\n",
" df_id = df[df['Registrar Account - ID'] == id].copy()\n",
" df_id['Centralisation Date'] = pd.to_datetime(df_id['Centralisation Date'])\n",
" return df_id\n",
"\n",
" plt.figure(figsize=(12, 6))\n",
"\n",
" for acc_id in [id1, id2]:\n",
" df_id = prepare_df(acc_id)\n",
"\n",
" # ===== AUM TOTAL (comportement initial) =====\n",
" df_total = (\n",
" df_id\n",
" .groupby('Centralisation Date')['Quantity - AUM']\n",
" .sum()\n",
" .reset_index()\n",
" .sort_values('Centralisation Date')\n",
" )\n",
"\n",
" plt.plot(\n",
" df_total['Centralisation Date'],\n",
" df_total['Quantity - AUM'],\n",
" marker='.',\n",
" linestyle='--',\n",
" linewidth=2,\n",
" label=f'Account {acc_id}'\n",
" )\n",
"\n",
" # ===== ISIN-LEVEL (optionnel) =====\n",
" if show_isin:\n",
" top_isins = (\n",
" df_id\n",
" .groupby('Product - Isin')['Quantity - AUM']\n",
" .sum()\n",
" .sort_values(ascending=False)\n",
" .head(max_isin)\n",
" .index\n",
" )\n",
"\n",
" for isin in top_isins:\n",
" df_isin = (\n",
" df_id[df_id['Product - Isin'] == isin]\n",
" .groupby('Centralisation Date')['Quantity - AUM']\n",
" .sum()\n",
" .reset_index()\n",
" .sort_values('Centralisation Date')\n",
" )\n",
"\n",
" plt.plot(\n",
" df_isin['Centralisation Date'],\n",
" df_isin['Quantity - AUM'],\n",
" linestyle='-',\n",
" alpha=1,\n",
" label=f'ISIN {isin}' # <-- Ajout du label pour la légende\n",
" )\n",
"\n",
" plt.title(\"Évolution des AUM pour trois comptes\")\n",
" plt.xlabel(\"Date\")\n",
" plt.ylabel(\"Quantity - AUM\")\n",
" plt.grid(True)\n",
" plt.legend()\n",
" plt.tight_layout()\n",
" plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 343,
"id": "3660f9f6-79a0-469a-a4a2-d936165d98ff",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA9ZNJREFUeJzs3XlcVNX7B/DPzMAwwLC4AAOJgEoiKuKShJm4Q+CCabnkmkq5pOjPJRFRXMu+5pKaWiaYa6aZGZlK7qKlSea+hFsCroCss93fH8iNkUVAZEA/79drXnrvee49zx3OYPN07rkSQRAEEBERERERERERVSCpsRMgIiIiIiIiIqKXD4tSRERERERERERU4ViUIiIiIiIiIiKiCseiFBERERERERERVTgWpYiIiIiIiIiIqMKxKEVERERERERERBWORSkiIiIiIiIiIqpwLEoREREREREREVGFY1GKiIionJw6dQqzZ8/Go0ePjJ0KEREREVGlx6IUERFROUhOTka3bt2gUqlgZWVl7HSIiIiIiCo9iSAIgrGTICIiqupiYmKQmpqKvn37GjsVIiIiIqIqgTOliIiIykFgYGCFFqQkEglmzJhRrueMioqCRCLBtWvXyvW8z+J5XCe9eGbMmAGJRGLsNIiIiKiUWJQiIiIqo7wiTlGvY8eOGTvFQs2dOxfbt283dhqV3vnz5yGRSKBQKJCSklJojKurK7p06VJo24kTJyCRSBAVFSXuyyueSKVS3Lx5s8AxaWlpMDc3h0QiwejRo8vjMiqNDRs2YNGiRcZO44XFzzUREVVFLEoRERE9o5kzZ+Lbb78t8KpXr56xUytUUV9eBwwYgKysLLi4uFR8UpXQunXroFKpAADff/99uZ7bzMwMGzduLLB/27Zt5dpPZfI8i1Lh4eHIysp6LueuKliUIiKiqsjE2AkQERFVdW+99RZatGhh7DSemUwmg0wmM3YalYIgCNiwYQP69euHhIQErF+/HsOGDSu38wcGBmLjxo2YNGmSwf4NGzYgKCgIW7duLbe+KoogCMjOzoa5ufkznys7OxtyuRxSacn+/6mJiQlMTPiftURERFUNZ0oRERE9RxqNBtWrV8eQIUMKtKWlpUGhUGDChAnivjt37mDo0KFwcHCAQqFAkyZNEB0d/dR+Bg8eDFdX1wL7n1xrRyKRICMjA9HR0eJthoMHDwZQ9JpSy5cvR8OGDWFmZgYnJyeMGjWqwO1sbdu2RaNGjXDu3Dm0a9cOFhYWeOWVVzB//vyn5g4AOTk5GDduHOzs7GBlZYVu3brh1q1bhcb++++/eP/99+Hg4AAzMzM0bNgQ33zzTYG4L774Ag0bNoSFhQWqVauGFi1aYMOGDSXK58iRI7h27Rr69OmDPn364ODBg0XmUxb9+vVDfHw8Lly4IO5LSkrCb7/9hn79+pX4PHm3+a1fvx7169eHQqFA8+bNcfDgwQKxp06dwltvvQVra2solUp06NChwC2mRa3NVNjYyLt18ddff0WLFi1gbm6OlStXFppn27Zt8fPPP+P69eviuMsbr/v374dEIsGmTZsQHh6OV155BRYWFkhLSwMAbNmyBc2bN4e5uTlq1qyJ/v37499//31q3nv27EHr1q1ha2sLpVKJ+vXrIyws7KnvKZA7S65ly5bi2GnTpg12795tEFOaz8Xp06fh5+cHCwsL1KtXT5x5d+DAAfj4+MDc3Bz169fH3r17C72uCxcu4N1334W1tTVq1KiBsWPHIjs7W4wr7nMNVMxnhoiIqCxYlCIiInpGqampuHfvnsHr/v37AABTU1P06NED27dvh1qtNjhu+/btyMnJQZ8+fQAAWVlZaNu2Lb799lu89957+Oyzz2BjY4PBgwdj8eLF5ZLrt99+CzMzM7z55pvibYYffPBBkfEzZszAqFGj4OTkhAULFqBnz55YuXIlOnfuDI1GYxD78OFDBAQEoEmTJliwYAE8PDwwefJk/PLLL0/Na9iwYVi0aBE6d+6MTz75BKampggKCioQl5ycjNdffx179+7F6NGjsXjxYtSrVw9Dhw41uDXsq6++wpgxY+Dp6YlFixYhMjIS3t7eOH78eInep/Xr16Nu3bp47bXX0LVrV1hYWBR6u11ZtWnTBrVq1TL4wr9582YolcpCr7s4Bw4cQGhoKPr374+ZM2fi/v37CAgIwJkzZ8SYs2fP4s0338Rff/2FSZMmYdq0aUhISEDbtm1L/J4U5uLFi+jbty86deqExYsXw9vbu9C4qVOnwtvbGzVr1hTH3ZO38s2aNQs///wzJkyYgLlz50IulyMqKgrvvvsuZDIZ5s2bh+HDh2Pbtm1o3bp1ket85V1vly5dkJOTg5kzZ2LBggXo1q0bjhw58tRrioyMxIABA2BqaoqZM2ciMjISzs7O+O2338SY0n4uunTpAh8fH8yfPx9mZmbo06cPNm/ejD59+iAwMBCffPIJMjIy0KtXLzx69KhATu+++y6ys7Mxb948BAYGYsmSJQgJCRHbi/tcV9RnhoiIqEwEIiIiKpM1a9YIAAp9mZmZiXG//vqrAED46aefDI4PDAwU6tSpI24vWrRIACCsW7dO3KdWqwVfX19BqVQKaWlp4n4AwvTp08XtQYMGCS4uLgVynD59uvDkP/eWlpbCoEGDiryehIQEQRAE4c6dO4JcLhc6d+4s6HQ6MW7p0qUCAOGbb74R9/n5+QkAhLVr14r7cnJyBJVKJfTs2bNAX/nFx8cLAISRI0ca7O/Xr1+B6xw6dKjg6Ogo3Lt3zyC2T58+go2NjZCZmSkIgiB0795daNiwYbH9FkWtVgs1atQQpk6dapBLkyZNCsS6uLgIQUFBhZ7njz/+EAAIa9asEffl/Tzu3r0rTJgwQahXr57Y9tprrwlDhgwRBCH35ztq1Kin5po33k6cOCHuu379uqBQKIQePXqI+4KDgwW5XC5cvXpV3Hf79m3ByspKaNOmTYH8nvTk2Mi7dgDCrl27npqnIAhCUFBQoWN03759AgChTp064s9PEHJ/Dvb29kKjRo2ErKwscf/OnTsFAEJERESReS9cuFB8n0vj8uXLglQqFXr06GEw5gVBEPR6vSAIZftcbNiwQdx34cIFAYAglUqFY8eOifvzfk8UNl66detmkMvIkSMFAMJff/0l7ivqc10RnxkiIqKy4kwpIiKiZ7Rs2TLs2bPH4JV/dlD79u1Rs2ZNbN68Wdz38OFD7NmzB7179xb3xcTEQKVSoW/fvuI+U1NTjBkzBunp6Thw4EDFXNBje/fuhVqtRmhoqMHaPsOHD4e1tTV+/vlng3ilUon+/fuL23K5HC1btsQ///xTbD8xMTEAgDFjxhjsDw0NNdgWBAFbt25F165dIQiCwcw0f39/pKam4s8//wQA2Nra4tatW/jjjz9Kfd2//PIL7t+/b/Bz6Nu3L/766y+cPXu21OcrSr9+/XDlyhX88ccf4p+luXUvj6+vL5o3by5u165dG927d8evv/4KnU4HnU6H3bt3Izg4GHXq1BHjHB0d0a9fPxw+fFi8Va603Nzc4O/vX6ZjnzRo0CCD9ahOnDiBO3fuYOTIkVAoFOL+oKAgeHh4FBh/+dna2gIAfvzxR+j1+hLnsH37duj1ekRERBRYzyrv9sCyfC7yZkMCQP369WFra4sGDRrAx8dH3J/398I+L6NGjTLY/uijjwD899kpSkV9ZoiIiMqKRSkiIqJn1LJlS3Ts2NHg1a5dO7HdxMQEPXv2xI8//oicnBwAuU9Z02g0BkWp69evw93dvcCX4QYNGojtFSmvv/r16xvsl8vlqFOnToF8atWqVWBdn2rVquHhw4dP7UcqlaJu3boG+5/s9+7du0hJScGqVatgZ2dn8Mpbs+vOnTsAgMmTJ0OpVKJly5Zwd3fHqFGjSnTrFpC7npCbmxvMzMxw5coVXLlyBXXr1oWFhQXWr19fonPkV9gaTQDQtGlTeHh4YMOGDVi/fj1UKhXat29f6vO7u7sX2Pfqq68iMzMTd+/exd27d5GZmVng/QRyx5Zer8fNmzdL3S+QW5QqL0+eq6jxBwAeHh7Ffh5
"text/plain": [
"<Figure size 1200x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"evolution_3_comptesa(df,'200090005','200127315','200127428',show_isin=True,max_isin=3)"
]
},
{
"cell_type": "code",
"execution_count": 248,
"id": "c2b78b7d-df39-4e14-ad0a-fa58eaa5738d",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"\n",
"def check_isin_continuity(df, rupture, tol=0.05):\n",
" \"\"\"\n",
" Vérifie que les ISIN évoluent continuellement entre old_account et new_account,\n",
" en prenant pour l'ancien compte la valeur à la date précédente et pour le nouveau compte la valeur à la date de rupture.\n",
" \n",
" Args:\n",
" df (pd.DataFrame): Table principale avec colonnes ['Registrar Account - ID', 'Product - Isin', 'Centralisation Date', 'Quantity - AUM']\n",
" rupture (pd.DataFrame): Table avec colonnes ['date', 'old_account', 'new_account']\n",
" tol (float): Tolérance relative maximale (ex: 0.05 = 5%)\n",
" \n",
" Returns:\n",
" pd.DataFrame: Table avec colonnes supplémentaires :\n",
" 'isin', 'old_value', 'new_value', 'relative_change', 'check'\n",
" \"\"\"\n",
" df['Centralisation Date'] = pd.to_datetime(df['Centralisation Date'])\n",
" rupture['date'] = pd.to_datetime(rupture['date'])\n",
" \n",
" # Dictionnaire des dates disponibles par compte pour trouver la date précédente\n",
" dates_by_account = df.groupby('Registrar Account - ID')['Centralisation Date'].unique().to_dict()\n",
" \n",
" records = []\n",
" \n",
" for _, row in rupture.iterrows():\n",
" date = row['date']\n",
" old_account = row['old_account']\n",
" new_account = row['new_account']\n",
" \n",
" # Date précédente pour l'ancien compte\n",
" past_dates = [d for d in dates_by_account.get(old_account, []) if d < date]\n",
" if not past_dates:\n",
" continue\n",
" prev_date = max(past_dates)\n",
" \n",
" # Filtrer df pour old_account à date précédente et new_account à date de rupture\n",
" df_old = df[(df['Registrar Account - ID'] == old_account) & \n",
" (df['Centralisation Date'] == prev_date)]\n",
" df_new = df[(df['Registrar Account - ID'] == new_account) & \n",
" (df['Centralisation Date'] == date)]\n",
" \n",
" # Tous les ISIN concernés\n",
" isins = set(df_old['Product - Isin']).union(df_new['Product - Isin'])\n",
" \n",
" for isin in isins:\n",
" old_val = df_old[df_old['Product - Isin'] == isin]['Quantity - AUM'].sum()\n",
" new_val = df_new[df_new['Product - Isin'] == isin]['Quantity - AUM'].sum()\n",
" old = df_old['Quantity - AUM'].sum()\n",
" \n",
" if old_val == 0:\n",
" rel_change = None\n",
" check = True\n",
" else:\n",
" rel_change = (new_val - old_val) / old\n",
" check = abs(rel_change) <= tol\n",
" \n",
" records.append({\n",
" 'date': date,\n",
" 'old_account': old_account,\n",
" 'new_account': new_account,\n",
" 'isin': isin,\n",
" 'old_value': old_val,\n",
" 'new_value': new_val,\n",
" 'relative_change': rel_change,\n",
" 'check': check\n",
" })\n",
" \n",
" return pd.DataFrame(records)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 250,
"id": "35a9cc07-ae6e-4178-8a43-2ec9506db50c",
"metadata": {},
"outputs": [],
"source": [
"result_ISIN = check_isin_continuity(df, ruptures_df, tol=0.05)"
]
},
{
"cell_type": "code",
"execution_count": 232,
"id": "a146e317-7e3f-4c9c-a5e6-1d085ea02d34",
"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>old_account</th>\n",
" <th>new_account</th>\n",
" <th>value</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>63</th>\n",
" <td>2019-12-31</td>\n",
" <td>200089971</td>\n",
" <td>200127374</td>\n",
" <td>1.004622e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>64</th>\n",
" <td>2018-07-31</td>\n",
" <td>418587</td>\n",
" <td>200089971</td>\n",
" <td>1.045713e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>65</th>\n",
" <td>2019-12-31</td>\n",
" <td>200014222</td>\n",
" <td>200127323</td>\n",
" <td>1.498049e+07</td>\n",
" </tr>\n",
" <tr>\n",
" <th>68</th>\n",
" <td>2019-12-31</td>\n",
" <td>200000668</td>\n",
" <td>200127167</td>\n",
" <td>4.686255e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>80</th>\n",
" <td>2025-01-31</td>\n",
" <td>200127359</td>\n",
" <td>200139568</td>\n",
" <td>2.241300e+07</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" date old_account new_account value\n",
"63 2019-12-31 200089971 200127374 1.004622e+06\n",
"64 2018-07-31 418587 200089971 1.045713e+06\n",
"65 2019-12-31 200014222 200127323 1.498049e+07\n",
"68 2019-12-31 200000668 200127167 4.686255e+06\n",
"80 2025-01-31 200127359 200139568 2.241300e+07"
]
},
"execution_count": 232,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = ruptures_df.iloc[30:35,]\n",
"a"
]
},
{
"cell_type": "code",
"execution_count": 300,
"id": "f88fccc4-ae08-43ca-831c-874a8804a58b",
"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>old_account</th>\n",
" <th>new_account</th>\n",
" <th>isin</th>\n",
" <th>old_value</th>\n",
" <th>new_value</th>\n",
" <th>relative_change</th>\n",
" <th>check</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>188</th>\n",
" <td>2018-02-28</td>\n",
" <td>200000491</td>\n",
" <td>200089970</td>\n",
" <td>FR0010135103</td>\n",
" <td>12678.000</td>\n",
" <td>13481.000</td>\n",
" <td>0.063338</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>273</th>\n",
" <td>2024-11-30</td>\n",
" <td>200127497</td>\n",
" <td>200139377</td>\n",
" <td>LU0592698954</td>\n",
" <td>390.694</td>\n",
" <td>516.545</td>\n",
" <td>0.070361</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>278</th>\n",
" <td>2020-03-31</td>\n",
" <td>200050278</td>\n",
" <td>422653</td>\n",
" <td>LU0992625839</td>\n",
" <td>848.114</td>\n",
" <td>0.000</td>\n",
" <td>-0.261335</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>285</th>\n",
" <td>2020-03-31</td>\n",
" <td>200050278</td>\n",
" <td>422653</td>\n",
" <td>LU0992630599</td>\n",
" <td>841.974</td>\n",
" <td>0.000</td>\n",
" <td>-0.259443</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>287</th>\n",
" <td>2020-03-31</td>\n",
" <td>200050278</td>\n",
" <td>422653</td>\n",
" <td>LU0992628858</td>\n",
" <td>273.202</td>\n",
" <td>0.000</td>\n",
" <td>-0.084184</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4382</th>\n",
" <td>2019-08-31</td>\n",
" <td>200126356</td>\n",
" <td>200126649</td>\n",
" <td>LU0992625243</td>\n",
" <td>419.119</td>\n",
" <td>0.000</td>\n",
" <td>-1.000000</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4384</th>\n",
" <td>2019-08-31</td>\n",
" <td>200126356</td>\n",
" <td>200126671</td>\n",
" <td>LU0992625243</td>\n",
" <td>419.119</td>\n",
" <td>0.000</td>\n",
" <td>-1.000000</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4389</th>\n",
" <td>2020-02-29</td>\n",
" <td>200126473</td>\n",
" <td>200127826</td>\n",
" <td>LU0992630912</td>\n",
" <td>495.630</td>\n",
" <td>0.000</td>\n",
" <td>-1.000000</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4391</th>\n",
" <td>2020-03-31</td>\n",
" <td>200126869</td>\n",
" <td>200101638</td>\n",
" <td>LU0992630243</td>\n",
" <td>268.362</td>\n",
" <td>293.685</td>\n",
" <td>0.094361</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4395</th>\n",
" <td>2025-02-28</td>\n",
" <td>200139432</td>\n",
" <td>200142171</td>\n",
" <td>LU1623763064</td>\n",
" <td>415.742</td>\n",
" <td>390.810</td>\n",
" <td>-0.059970</td>\n",
" <td>False</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>192 rows × 8 columns</p>\n",
"</div>"
],
"text/plain": [
" date old_account new_account isin old_value new_value \\\n",
"188 2018-02-28 200000491 200089970 FR0010135103 12678.000 13481.000 \n",
"273 2024-11-30 200127497 200139377 LU0592698954 390.694 516.545 \n",
"278 2020-03-31 200050278 422653 LU0992625839 848.114 0.000 \n",
"285 2020-03-31 200050278 422653 LU0992630599 841.974 0.000 \n",
"287 2020-03-31 200050278 422653 LU0992628858 273.202 0.000 \n",
"... ... ... ... ... ... ... \n",
"4382 2019-08-31 200126356 200126649 LU0992625243 419.119 0.000 \n",
"4384 2019-08-31 200126356 200126671 LU0992625243 419.119 0.000 \n",
"4389 2020-02-29 200126473 200127826 LU0992630912 495.630 0.000 \n",
"4391 2020-03-31 200126869 200101638 LU0992630243 268.362 293.685 \n",
"4395 2025-02-28 200139432 200142171 LU1623763064 415.742 390.810 \n",
"\n",
" relative_change check \n",
"188 0.063338 False \n",
"273 0.070361 False \n",
"278 -0.261335 False \n",
"285 -0.259443 False \n",
"287 -0.084184 False \n",
"... ... ... \n",
"4382 -1.000000 False \n",
"4384 -1.000000 False \n",
"4389 -1.000000 False \n",
"4391 0.094361 False \n",
"4395 -0.059970 False \n",
"\n",
"[192 rows x 8 columns]"
]
},
"execution_count": 300,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"result_ISIN_false = result_ISIN[result_ISIN['check'] == False]\n",
"result_ISIN_false"
]
},
{
"cell_type": "code",
"execution_count": 301,
"id": "ad298caa-0fa1-47dd-b686-e7800046e0b9",
"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>old_account</th>\n",
" <th>new_account</th>\n",
" <th>isin</th>\n",
" <th>old_value</th>\n",
" <th>new_value</th>\n",
" <th>relative_change</th>\n",
" <th>check</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>131</th>\n",
" <td>2019-12-31</td>\n",
" <td>418209</td>\n",
" <td>200127581</td>\n",
" <td>LU0164455502</td>\n",
" <td>3575.0</td>\n",
" <td>3450.0</td>\n",
" <td>-0.034965</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>132</th>\n",
" <td>2019-12-31</td>\n",
" <td>418209</td>\n",
" <td>200127581</td>\n",
" <td>FR0010135103</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>133</th>\n",
" <td>2019-12-31</td>\n",
" <td>418209</td>\n",
" <td>200127581</td>\n",
" <td>FR0010148981</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>134</th>\n",
" <td>2019-12-31</td>\n",
" <td>418209</td>\n",
" <td>200127581</td>\n",
" <td>FR0010149302</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>True</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" date old_account new_account isin old_value new_value \\\n",
"131 2019-12-31 418209 200127581 LU0164455502 3575.0 3450.0 \n",
"132 2019-12-31 418209 200127581 FR0010135103 0.0 0.0 \n",
"133 2019-12-31 418209 200127581 FR0010148981 0.0 0.0 \n",
"134 2019-12-31 418209 200127581 FR0010149302 0.0 0.0 \n",
"\n",
" relative_change check \n",
"131 -0.034965 True \n",
"132 NaN True \n",
"133 NaN True \n",
"134 NaN True "
]
},
"execution_count": 301,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"result_ISIN[result_ISIN['new_account'] == '200127581']"
]
},
{
"cell_type": "code",
"execution_count": 302,
"id": "cd99ad4e-9bb3-4542-8cd9-14a799169988",
"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>old_account</th>\n",
" <th>new_account</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>188</th>\n",
" <td>2018-02-28</td>\n",
" <td>200000491</td>\n",
" <td>200089970</td>\n",
" </tr>\n",
" <tr>\n",
" <th>273</th>\n",
" <td>2024-11-30</td>\n",
" <td>200127497</td>\n",
" <td>200139377</td>\n",
" </tr>\n",
" <tr>\n",
" <th>278</th>\n",
" <td>2020-03-31</td>\n",
" <td>200050278</td>\n",
" <td>422653</td>\n",
" </tr>\n",
" <tr>\n",
" <th>303</th>\n",
" <td>2020-03-31</td>\n",
" <td>200071859</td>\n",
" <td>415661</td>\n",
" </tr>\n",
" <tr>\n",
" <th>330</th>\n",
" <td>2020-10-31</td>\n",
" <td>200084492</td>\n",
" <td>414547</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4382</th>\n",
" <td>2019-08-31</td>\n",
" <td>200126356</td>\n",
" <td>200126649</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4384</th>\n",
" <td>2019-08-31</td>\n",
" <td>200126356</td>\n",
" <td>200126671</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4389</th>\n",
" <td>2020-02-29</td>\n",
" <td>200126473</td>\n",
" <td>200127826</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4391</th>\n",
" <td>2020-03-31</td>\n",
" <td>200126869</td>\n",
" <td>200101638</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4395</th>\n",
" <td>2025-02-28</td>\n",
" <td>200139432</td>\n",
" <td>200142171</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>117 rows × 3 columns</p>\n",
"</div>"
],
"text/plain": [
" date old_account new_account\n",
"188 2018-02-28 200000491 200089970\n",
"273 2024-11-30 200127497 200139377\n",
"278 2020-03-31 200050278 422653\n",
"303 2020-03-31 200071859 415661\n",
"330 2020-10-31 200084492 414547\n",
"... ... ... ...\n",
"4382 2019-08-31 200126356 200126649\n",
"4384 2019-08-31 200126356 200126671\n",
"4389 2020-02-29 200126473 200127826\n",
"4391 2020-03-31 200126869 200101638\n",
"4395 2025-02-28 200139432 200142171\n",
"\n",
"[117 rows x 3 columns]"
]
},
"execution_count": 302,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"results_ISIN_unique = result_ISIN_false.iloc[:, :3].drop_duplicates()\n",
"results_ISIN_unique"
]
},
{
"cell_type": "code",
"execution_count": 344,
"id": "e544f593-fecf-4c84-8784-1c70f40e408a",
"metadata": {},
"outputs": [],
"source": [
"def comparaison2(i):\n",
" evolution_3_comptesa(df,results_ISIN_unique.iloc[i,1],results_ISIN_unique.iloc[i,2],'200127428',show_isin=True,max_isin=3)"
]
},
{
"cell_type": "code",
"execution_count": 405,
"id": "344f2c72-1245-4f97-b0f8-2a5b864ae09b",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA7ZBJREFUeJzs3Xd4FFXbx/Hv7qZ3WkhoAQLSe40ivQYVBJWmFBEs8PiIj4goRUAEeW1YsCKggGJFBQQCUpQOGqmCIEVKQk1Cetl5/1iysiSBJCRZCL/Pde1F5syZM/fszCbkzikmwzAMREREREREREREipDZ2QGIiIiIiIiIiMitR0kpEREREREREREpckpKiYiIiIiIiIhIkVNSSkREREREREREipySUiIiIiIiIiIiUuSUlBIRERERERERkSKnpJSIiIiIiIiIiBQ5JaVERERERERERKTIKSklIiJSQH7//XdeeuklLl686OxQRERERERueEpKiYiIFIDo6GjuuecegoKC8PX1dXY4IiIiIiI3PJNhGIazgxAREbnZLVu2jNjYWPr16+fsUEREREREbgrqKSUiIlIAwsPDizQhZTKZePHFFwu0zblz52IymThy5EiBtns9CuM6pfh58cUXMZlMzg5DRERE8khJKRERkXzKTOLk9Nq8ebOzQ8zWyy+/zOLFi50dxg1v3759mEwmPDw8iImJybZO5cqVueuuu7Ldt337dkwmE3PnzrWXZSZPzGYz//zzT5Zj4uLi8PT0xGQyMXLkyIK4jBvGwoULefPNN50dRrGlz7WIiNyMlJQSERG5TpMnT+azzz7L8qpWrZqzQ8tWTr+8PvTQQyQlJRESElL0Qd2A5s+fT1BQEABff/11gbbt7u7O559/nqX822+/LdDz3EgKMyk1btw4kpKSCqXtm4WSUiIicjNycXYAIiIiN7tu3brRtGlTZ4dx3SwWCxaLxdlh3BAMw2DhwoX079+fw4cPs2DBAh555JECaz88PJzPP/+cZ5991qF84cKFdO/enW+++abAzlVUDMMgOTkZT0/P624rOTkZNzc3zObc/f3UxcUFFxf9t1ZERORmo55SIiIihSgtLY2SJUsyZMiQLPvi4uLw8PDgmWeesZedPn2aoUOHUrZsWTw8PGjQoAHz5s275nkGDx5M5cqVs5RfOdeOyWQiISGBefPm2YcZDh48GMh5TqlZs2ZRp04d3N3dKVeuHCNGjMgynK1t27bUrVuXvXv30q5dO7y8vChfvjwzZsy4ZuwAKSkpjBo1ijJlyuDr68s999zD8ePHs6174sQJHn74YcqWLYu7uzt16tThk08+yVLv7bffpk6dOnh5eVGiRAmaNm3KwoULcxXPhg0bOHLkCH379qVv376sX78+x3jyo3///kRGRvLnn3/ay6Kiovj555/p379/rtvJHOa3YMECatSogYeHB02aNGH9+vVZ6v7+++9069YNPz8/fHx86NChQ5YhpjnNzZTds5E5dHHFihU0bdoUT09PPvjgg2zjbNu2LUuXLuXo0aP25y7zeV27di0mk4kvvviCcePGUb58eby8vIiLiwPgq6++okmTJnh6elK6dGkefPBBTpw4cc24IyIiaNWqFQEBAfj4+FCjRg2ef/75a76nYOsl17x5c/uz07p1a1auXOlQJy+fi507d9KmTRu8vLyoVq2avefdunXraNGiBZ6entSoUYNVq1Zle11//vknDzzwAH5+fpQqVYr//ve/JCcn2+td7XMNRfOZERERyQ8lpURERK5TbGwsZ8+edXidO3cOAFdXV+69914WL15Mamqqw3GLFy8mJSWFvn37ApCUlETbtm357LPPGDBgAP/3f/+Hv78/gwcPZubMmQUS62effYa7uzt33nmnfZjho48+mmP9F198kREjRlCuXDlee+01evfuzQcffEDnzp1JS0tzqHvhwgW6du1KgwYNeO2116hZsyZjxozhp59+umZcjzzyCG+++SadO3dm+vTpuLq60r179yz1oqOjadmyJatWrWLkyJHMnDmTatWqMXToUIehYR999BFPPvkktWvX5s0332TSpEk0bNiQLVu25Op9WrBgAaGhoTRr1oy7774bLy+vbIfb5Vfr1q2pUKGCwy/8ixYtwsfHJ9vrvpp169bx1FNP8eCDDzJ58mTOnTtH165d2b17t73Onj17uPPOO/njjz949tlnGT9+PIcPH6Zt27a5fk+ys3//fvr160enTp2YOXMmDRs2zLbeCy+8QMOGDSldurT9ubtyKN+UKVNYunQpzzzzDC+//DJubm7MnTuXBx54AIvFwrRp0xg2bBjffvstrVq1ynGer8zrveuuu0hJSWHy5Mm89tpr3HPPPWzYsOGa1zRp0iQeeughXF1dmTx5MpMmTaJixYr8/PPP9jp5/VzcddddtGjRghkzZuDu7k7fvn1ZtGgRffv2JTw8nOnTp5OQkMB9993HxYsXs8T0wAMPkJyczLRp0wgPD+ett95i+PDh9v1X+1wX1WdGREQkXwwRERHJlzlz5hhAti93d3d7vRUrVhiA8eOPPzocHx4eblStWtW+/eabbxqAMX/+fHtZamqqERYWZvj4+BhxcXH2csCYOHGifXvQoEFGSEhIlhgnTpxoXPnj3tvb2xg0aFCO13P48GHDMAzj9OnThpubm9G5c2cjIyPDXu+dd94xAOOTTz6xl7Vp08YAjE8//dRelpKSYgQFBRm9e/fOcq7LRUZGGoDxxBNPOJT3798/y3UOHTrUCA4ONs6ePetQt2/fvoa/v7+RmJhoGIZh9OjRw6hTp85Vz5uT1NRUo1SpUsYLL7zgEEuDBg2y1A0JCTG6d++ebTvbtm0zAGPOnDn2ssz7cebMGeOZZ54xqlWrZt/XrFkzY8iQIYZh2O7viBEjrhlr5vO2fft2e9nRo0cNDw8P495777WX9ezZ03BzczMOHTpkLzt58qTh6+trtG7dOkt8V7ry2ci8dsBYvnz5NeM0DMPo3r17ts/omjVrDMCoWrWq/f4Zhu0+BAYGGnXr1jWSkpLs5UuWLDEAY8KECTnG/cYbb9jf57z466+/DLPZbNx7770Oz7xhGIbVajUMI3+fi4ULF9rL/vzzTwMwzGazsXnzZnt55veJ7J6Xe+65xyGWJ554wgCMP/74w16W0+e6KD4zIiIi+aWeUiIiItfp3XffJSIiwuF1ee+g9u3bU7p0aRYtWmQvu3DhAhEREfTp08detmzZMoKCgujXr5+9zNXVlSeffJL4+HjWrVtXNBd0yapVq0hNTeWpp55ymNtn2LBh+Pn5sXTpUof6Pj4+PPjgg/ZtNzc3mjdvzt9//33V8yxbtgyAJ5980qH8qaeectg2DINvvvmGu+++G8MwHHqmdenShdjYWH777TcAAgICOH78ONu2bcvzdf/000+cO3fO4T7069ePP/74gz179uS5vZz079+fgwcPsm3bNvu/eRm6lyksLIwmTZrYtytVqkSPHj1YsWIFGRkZZGRksHLlSnr27EnVqlXt9YKDg+nfvz+//vqrfahcXlWpUoUuXbrk69grDRo0yGE+qu3bt3P69GmeeOIJPDw87OXdu3enZs2aWZ6/ywUEBADw/fffY7Vacx3D4sWLsVqtTJgwIct8VpnDA/PzucjsDQlQo0YNAgICqFWrFi1atLCXZ36d3edlxIgRDtv/+c9/gH8/Ozkpqs+MiIhIfikpJSIicp2aN29Ox44dHV7t2rWz73dxcaF37958//33pKSkALZV1tLS0hySUkePHqV69epZfhmuVauWfX9RyjxfjRo1HMrd3NyoWrVqlngqVKiQZV6fEiVKcOHChWuex2w2Exoa6lB+5XnPnDlDTEwMH374IWXKlHF4Zc7Zdfr0aQDGjBmDj48PzZs3p3r16owYMSJXQ7fANp9QlSpVcHd35+DBgxw8eJDQ0FC8vLxYsGBBrtq4XHZzNAE0atSImjVrsnDhQhYsWEBQUBDt27fPc/vVq1fPUnbbbbeRmJjImTNnOHPmDImJiVneT7A9W1arlX/++SfP5wVbUqqgXNlWTs8fQM2aNa/6eej
"text/plain": [
"<Figure size 1200x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"comparaison2(90)"
]
},
{
"cell_type": "code",
"execution_count": 306,
"id": "7124b4bc-9e17-4ad8-a863-800178c8a47e",
"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>old_account</th>\n",
" <th>new_account</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"Empty DataFrame\n",
"Columns: [date, old_account, new_account]\n",
"Index: []"
]
},
"execution_count": 306,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"results_ISIN_unique[results_ISIN_unique['old_account'] == '200127581']"
]
},
2025-12-04 16:11:38 +01:00
{
"cell_type": "code",
"execution_count": null,
2026-01-29 18:40:49 +01:00
"id": "e95bab82-365e-4797-8c6d-ed08bd7d9fe3",
2025-12-04 16:11:38 +01:00
"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",
2026-03-05 20:01:23 +01:00
"version": "3.13.12"
2025-12-04 16:11:38 +01:00
}
},
"nbformat": 4,
"nbformat_minor": 5
}