diff --git a/MyIA.AI.Notebooks/GenAI/Texte/09e_Production_Exploitation.ipynb b/MyIA.AI.Notebooks/GenAI/Texte/09e_Production_Exploitation.ipynb index 24a0adb1c4..dbf9f50ee2 100644 --- a/MyIA.AI.Notebooks/GenAI/Texte/09e_Production_Exploitation.ipynb +++ b/MyIA.AI.Notebooks/GenAI/Texte/09e_Production_Exploitation.ipynb @@ -5,10 +5,10 @@ "id": "dc90c000", "metadata": { "papermill": { - "duration": 0.007855, - "end_time": "2026-09-28T16:53:04.948418+00:00", + "duration": 0.006999, + "end_time": "2026-10-01T20:37:19.340726+00:00", "exception": false, - "start_time": "2026-09-28T16:53:04.940563+00:00", + "start_time": "2026-10-01T20:37:19.333727+00:00", "status": "completed" }, "tags": [] @@ -33,16 +33,16 @@ "id": "2c0da28c", "metadata": { "execution": { - "iopub.execute_input": "2026-09-28T16:53:04.965693Z", - "iopub.status.busy": "2026-09-28T16:53:04.965147Z", - "iopub.status.idle": "2026-09-28T16:53:05.001627Z", - "shell.execute_reply": "2026-09-28T16:53:04.996695Z" + "iopub.execute_input": "2026-10-01T20:37:19.358011Z", + "iopub.status.busy": "2026-10-01T20:37:19.357486Z", + "iopub.status.idle": "2026-10-01T20:37:19.383660Z", + "shell.execute_reply": "2026-10-01T20:37:19.382258Z" }, "papermill": { - "duration": 0.04706, - "end_time": "2026-09-28T16:53:05.003385+00:00", + "duration": 0.03516, + "end_time": "2026-10-01T20:37:19.384874+00:00", "exception": false, - "start_time": "2026-09-28T16:53:04.956325+00:00", + "start_time": "2026-10-01T20:37:19.349714+00:00", "status": "completed" }, "tags": [] @@ -74,10 +74,10 @@ "id": "ba52ca1a", "metadata": { "papermill": { - "duration": 0.009105, - "end_time": "2026-09-28T16:53:05.019595+00:00", + "duration": 0.006294, + "end_time": "2026-10-01T20:37:19.397556+00:00", "exception": false, - "start_time": "2026-09-28T16:53:05.010490+00:00", + "start_time": "2026-10-01T20:37:19.391262+00:00", "status": "completed" }, "tags": [] @@ -93,16 +93,16 @@ "id": "0b5cbfcf", "metadata": { "execution": { - "iopub.execute_input": "2026-09-28T16:53:05.040822Z", - "iopub.status.busy": "2026-09-28T16:53:05.040296Z", - "iopub.status.idle": "2026-09-28T16:53:08.613191Z", - "shell.execute_reply": "2026-09-28T16:53:08.611991Z" + "iopub.execute_input": "2026-10-01T20:37:19.413636Z", + "iopub.status.busy": "2026-10-01T20:37:19.413108Z", + "iopub.status.idle": "2026-10-01T20:37:22.482838Z", + "shell.execute_reply": "2026-10-01T20:37:22.481529Z" }, "papermill": { - "duration": 3.588199, - "end_time": "2026-09-28T16:53:08.614310+00:00", + "duration": 3.08013, + "end_time": "2026-10-01T20:37:22.484028+00:00", "exception": false, - "start_time": "2026-09-28T16:53:05.026111+00:00", + "start_time": "2026-10-01T20:37:19.403898+00:00", "status": "completed" }, "tags": [] @@ -119,7 +119,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "API directe fournisseur HTTP 200 139 modèles\n", + "API directe fournisseur HTTP 200 140 modèles\n", "Prix catalogue openai/gpt-5-mini : $0.25/M entrée, $2.00/M sortie\n" ] } @@ -175,16 +175,16 @@ "id": "0bfa605f", "metadata": { "execution": { - "iopub.execute_input": "2026-09-28T16:53:08.628815Z", - "iopub.status.busy": "2026-09-28T16:53:08.628325Z", - "iopub.status.idle": "2026-09-28T16:53:08.642547Z", - "shell.execute_reply": "2026-09-28T16:53:08.641043Z" + "iopub.execute_input": "2026-10-01T20:37:22.497530Z", + "iopub.status.busy": "2026-10-01T20:37:22.497070Z", + "iopub.status.idle": "2026-10-01T20:37:22.506687Z", + "shell.execute_reply": "2026-10-01T20:37:22.505455Z" }, "papermill": { - "duration": 0.023335, - "end_time": "2026-09-28T16:53:08.644070+00:00", + "duration": 0.01769, + "end_time": "2026-10-01T20:37:22.507647+00:00", "exception": false, - "start_time": "2026-09-28T16:53:08.620735+00:00", + "start_time": "2026-10-01T20:37:22.489957+00:00", "status": "completed" }, "tags": [] @@ -234,16 +234,16 @@ "id": "dea89f9f", "metadata": { "execution": { - "iopub.execute_input": "2026-09-28T16:53:08.660551Z", - "iopub.status.busy": "2026-09-28T16:53:08.659789Z", - "iopub.status.idle": "2026-09-28T16:53:08.672355Z", - "shell.execute_reply": "2026-09-28T16:53:08.670912Z" + "iopub.execute_input": "2026-10-01T20:37:22.520271Z", + "iopub.status.busy": "2026-10-01T20:37:22.519805Z", + "iopub.status.idle": "2026-10-01T20:37:22.528572Z", + "shell.execute_reply": "2026-10-01T20:37:22.527199Z" }, "papermill": { - "duration": 0.02333, - "end_time": "2026-09-28T16:53:08.673786+00:00", + "duration": 0.017133, + "end_time": "2026-10-01T20:37:22.529680+00:00", "exception": false, - "start_time": "2026-09-28T16:53:08.650456+00:00", + "start_time": "2026-10-01T20:37:22.512547+00:00", "status": "completed" }, "tags": [] @@ -295,10 +295,10 @@ "id": "b7ff4094", "metadata": { "papermill": { - "duration": 0.007039, - "end_time": "2026-09-28T16:53:08.692012+00:00", + "duration": 0.005794, + "end_time": "2026-10-01T20:37:22.542066+00:00", "exception": false, - "start_time": "2026-09-28T16:53:08.684973+00:00", + "start_time": "2026-10-01T20:37:22.536272+00:00", "status": "completed" }, "tags": [] @@ -319,16 +319,16 @@ "id": "17aae912", "metadata": { "execution": { - "iopub.execute_input": "2026-09-28T16:53:08.717941Z", - "iopub.status.busy": "2026-09-28T16:53:08.717401Z", - "iopub.status.idle": "2026-09-28T16:54:45.784487Z", - "shell.execute_reply": "2026-09-28T16:54:45.783019Z" + "iopub.execute_input": "2026-10-01T20:37:22.557752Z", + "iopub.status.busy": "2026-10-01T20:37:22.557235Z", + "iopub.status.idle": "2026-10-01T20:38:43.245382Z", + "shell.execute_reply": "2026-10-01T20:38:43.243583Z" }, "papermill": { - "duration": 97.092228, - "end_time": "2026-09-28T16:54:45.791003+00:00", + "duration": 80.702329, + "end_time": "2026-10-01T20:38:43.251433+00:00", "exception": false, - "start_time": "2026-09-28T16:53:08.698775+00:00", + "start_time": "2026-10-01T20:37:22.549104+00:00", "status": "completed" }, "tags": [] @@ -367,7 +367,7 @@ " 0\n", " local\n", " 86.7\n", - " 1.207\n", + " 1.001\n", " 0.000000\n", " 0.000000\n", " \n", @@ -375,9 +375,9 @@ " 1\n", " distant\n", " 100.0\n", - " 1.892\n", - " 0.000042\n", - " 0.001254\n", + " 1.572\n", + " 0.000043\n", + " 0.001277\n", " \n", " \n", "\n", @@ -385,8 +385,8 @@ ], "text/plain": [ " modèle justesse % latence médiane (s) coût/requête ($) coût total ($)\n", - "0 local 86.7 1.207 0.000000 0.000000\n", - "1 distant 100.0 1.892 0.000042 0.001254" + "0 local 86.7 1.001 0.000000 0.000000\n", + "1 distant 100.0 1.572 0.000043 0.001277" ] }, "metadata": {}, @@ -426,10 +426,10 @@ "id": "21a21751", "metadata": { "papermill": { - "duration": 0.005669, - "end_time": "2026-09-28T16:54:45.804429+00:00", + "duration": 0.009631, + "end_time": "2026-10-01T20:38:43.268275+00:00", "exception": false, - "start_time": "2026-09-28T16:54:45.798760+00:00", + "start_time": "2026-10-01T20:38:43.258644+00:00", "status": "completed" }, "tags": [] @@ -447,10 +447,10 @@ "id": "a19b6040", "metadata": { "papermill": { - "duration": 0.007041, - "end_time": "2026-09-28T16:54:45.818988+00:00", + "duration": 0.008276, + "end_time": "2026-10-01T20:38:43.284254+00:00", "exception": false, - "start_time": "2026-09-28T16:54:45.811947+00:00", + "start_time": "2026-10-01T20:38:43.275978+00:00", "status": "completed" }, "tags": [] @@ -460,8 +460,10 @@ "\n", "Un budget d'exploitation ne se décrète pas, il se simule à partir du coût mesuré. À volume fixe,\n", "la trajectoire de dépense est une droite dont la pente est le coût par requête ; le mix local/distant\n", - "fait varier la pente. L'exploitant veut trois choses : la trajectoire, la date de franchissement\n", - "du budget, et une alerte *avant* — posée ici à quatre-vingts pour cent du budget." + "fait varier la pente. Le budget est mensuel et **renouvelable** : le compteur retombe à zéro à chaque\n", + "frontière de mois, et c'est la trajectoire d'un mois qui décide — pas un cumul annuel. L'exploitant\n", + "veut trois choses : cette trajectoire, le jour du mois où elle franchit le budget, et une alerte\n", + "*avant* — posée ici à quatre-vingts pour cent du budget.\n" ] }, { @@ -470,16 +472,16 @@ "id": "1f127d45", "metadata": { "execution": { - "iopub.execute_input": "2026-09-28T16:54:45.835877Z", - "iopub.status.busy": "2026-09-28T16:54:45.835239Z", - "iopub.status.idle": "2026-09-28T16:54:45.861293Z", - "shell.execute_reply": "2026-09-28T16:54:45.859035Z" + "iopub.execute_input": "2026-10-01T20:38:43.301770Z", + "iopub.status.busy": "2026-10-01T20:38:43.301195Z", + "iopub.status.idle": "2026-10-01T20:38:43.325445Z", + "shell.execute_reply": "2026-10-01T20:38:43.323782Z" }, "papermill": { - "duration": 0.036488, - "end_time": "2026-09-28T16:54:45.862684+00:00", + "duration": 0.035333, + "end_time": "2026-10-01T20:38:43.326559+00:00", "exception": false, - "start_time": "2026-09-28T16:54:45.826196+00:00", + "start_time": "2026-10-01T20:38:43.291226+00:00", "status": "completed" }, "tags": [] @@ -508,41 +510,55 @@ " \n", " part locale\n", " pente ($/jour)\n", - " alerte 80 % (jour)\n", - " budget épuisé (jour)\n", + " alerte 80 % (jour du mois)\n", + " budget épuisé (jour du mois)\n", " \n", " \n", " \n", " \n", " 0\n", " 0.0\n", - " 0.0627\n", - " 128\n", - " 160\n", + " 0.0639\n", + " jamais\n", + " jamais\n", " \n", " \n", " 1\n", " 0.5\n", - " 0.0313\n", - " 256\n", - " 320\n", + " 0.0319\n", + " jamais\n", + " jamais\n", " \n", " \n", " 2\n", " 0.9\n", - " 0.0063\n", + " 0.0064\n", + " jamais\n", + " jamais\n", + " \n", + " \n", + " 3\n", + " 1.0\n", + " 0.0000\n", + " jamais\n", " jamais\n", - " > 1 an\n", " \n", " \n", "\n", "" ], "text/plain": [ - " part locale pente ($/jour) alerte 80 % (jour) budget épuisé (jour)\n", - "0 0.0 0.0627 128 160\n", - "1 0.5 0.0313 256 320\n", - "2 0.9 0.0063 jamais > 1 an" + " part locale pente ($/jour) alerte 80 % (jour du mois) \\\n", + "0 0.0 0.0639 jamais \n", + "1 0.5 0.0319 jamais \n", + "2 0.9 0.0064 jamais \n", + "3 1.0 0.0000 jamais \n", + "\n", + " budget épuisé (jour du mois) \n", + "0 jamais \n", + "1 jamais \n", + "2 jamais \n", + "3 jamais " ] }, "metadata": {}, @@ -552,42 +568,53 @@ "name": "stdout", "output_type": "stream", "text": [ - "Entrées de la simulation : coût distant mesuré $0.000042/requête, volume 1500 req/jour, budget $10/mois\n" + "Entrées : coût distant mesuré $0.000043/requête, volume 1500 req/jour, budget $10/mois renouvelable (compteur remis à zéro tous les 30 jours)\n", + "Témoin à $0.40/jour : alerte 80 % au jour 20, budget épuisé au jour 25 du mois\n", + "Témoin zéro requête : alerte jamais, épuisement jamais\n" ] } ], "source": [ + "JOURS_MOIS = 30 # mois normalisé de la simulation (paramètre de l'exploitant)\n", + "\n", "def trajectoire(cout_distant_par_req, volume_par_jour, part_locale, budget_usd):\n", - " \"\"\"Simule la dépense cumulée jour par jour. Retourne (cumuls, jour_franchissement_80, jour_epuisement).\"\"\"\n", + " \"\"\"Dépense cumulée dans le mois courant. Le budget est mensuel RENOUVELABLE : le compteur\n", + " retombe à zéro à chaque frontière de mois, et comme la pente est constante, la trajectoire\n", + " d'un mois vaut pour tous. Retourne (cumuls_du_mois, jour_du_mois_80, jour_du_mois_epuisement).\"\"\"\n", " pente = volume_par_jour * (1 - part_locale) * cout_distant_par_req\n", " cumuls, c = [], 0.0\n", " jour80 = jour_plein = None\n", - " for jour in range(1, 366):\n", + " for jour in range(1, JOURS_MOIS + 1):\n", " c += pente\n", " cumuls.append(c)\n", " if jour80 is None and c >= 0.8 * budget_usd:\n", " jour80 = jour\n", " if jour_plein is None and c >= budget_usd:\n", " jour_plein = jour\n", - " break\n", " return cumuls, jour80, jour_plein\n", "\n", "COUT_DISTANT = sum(x[\"cout_usd\"] for x in MESURES[\"distant\"]) / len(MESURES[\"distant\"])\n", "VOLUME = 1500 # requêtes/jour posées au service (paramètre de l'exploitant)\n", - "BUDGET = 10.0 # budget mensuel en dollars (paramètre de l'exploitant)\n", + "BUDGET = 10.0 # budget mensuel renouvelable en dollars (paramètre de l'exploitant)\n", "\n", "lignes = []\n", - "for part_locale in (0.0, 0.5, 0.9):\n", + "for part_locale in (0.0, 0.5, 0.9, 1.0):\n", " cumuls, j80, jp = trajectoire(COUT_DISTANT, VOLUME, part_locale, BUDGET)\n", " lignes.append({\n", " \"part locale\": part_locale,\n", " \"pente ($/jour)\": round(VOLUME * (1 - part_locale) * COUT_DISTANT, 4),\n", - " \"alerte 80 % (jour)\": j80 if j80 else \"jamais\",\n", - " \"budget épuisé (jour)\": jp if jp else \"> 1 an\",\n", + " \"alerte 80 % (jour du mois)\": j80 if j80 else \"jamais\",\n", + " \"budget épuisé (jour du mois)\": jp if jp else \"jamais\",\n", " })\n", "display(pd.DataFrame(lignes))\n", - "print(f\"Entrées de la simulation : coût distant mesuré ${COUT_DISTANT:.6f}/requête, \"\n", - " f\"volume {VOLUME} req/jour, budget ${BUDGET:.0f}/mois\")" + "print(f\"Entrées : coût distant mesuré ${COUT_DISTANT:.6f}/requête, volume {VOLUME} req/jour, \"\n", + " f\"budget ${BUDGET:.0f}/mois renouvelable (compteur remis à zéro tous les {JOURS_MOIS} jours)\")\n", + "\n", + "# Témoins de contrôle : le modèle mensuel doit rendre les deux régimes observables.\n", + "_, j80_t, jp_t = trajectoire(0.40 / VOLUME, VOLUME, 0.0, BUDGET) # pente à 0,40 $/jour\n", + "_, j80_z, jp_z = trajectoire(COUT_DISTANT, 0, 0.0, BUDGET) # zéro requête posée\n", + "print(f\"Témoin à $0.40/jour : alerte 80 % au jour {j80_t}, budget épuisé au jour {jp_t} du mois\")\n", + "print(f\"Témoin zéro requête : alerte {j80_z or 'jamais'}, épuisement {jp_z or 'jamais'}\")\n" ] }, { @@ -596,16 +623,16 @@ "id": "b097a42e", "metadata": { "execution": { - "iopub.execute_input": "2026-09-28T16:54:45.879794Z", - "iopub.status.busy": "2026-09-28T16:54:45.879242Z", - "iopub.status.idle": "2026-09-28T16:54:45.887211Z", - "shell.execute_reply": "2026-09-28T16:54:45.885773Z" + "iopub.execute_input": "2026-10-01T20:38:43.344354Z", + "iopub.status.busy": "2026-10-01T20:38:43.343743Z", + "iopub.status.idle": "2026-10-01T20:38:43.352833Z", + "shell.execute_reply": "2026-10-01T20:38:43.351342Z" }, "papermill": { - "duration": 0.018493, - "end_time": "2026-09-28T16:54:45.888508+00:00", + "duration": 0.020153, + "end_time": "2026-10-01T20:38:43.354234+00:00", "exception": false, - "start_time": "2026-09-28T16:54:45.870015+00:00", + "start_time": "2026-10-01T20:38:43.334081+00:00", "status": "completed" }, "tags": [] @@ -615,20 +642,22 @@ "name": "stdout", "output_type": "stream", "text": [ - "Vérification de l'organe d'alerte au jour 30 : seuil non franchi\n" + "Mois calme (pente mesurée), jour 30 : seuil non franchi\n", + "Mois tendu ($0.40/jour), jour 20 : seuil franchi -- ALERTE\n" ] } ], "source": [ "def verifier_alerte(cumuls, budget_usd, au_jour):\n", - " \"\"\"L'organe d'alerte : dit si, au jour donné, on a franchi le seuil de quatre-vingts pour cent.\"\"\"\n", + " \"\"\"L'organe d'alerte : dit si, au jour du mois donné, on a franchi le seuil de quatre-vingts pour cent.\"\"\"\n", " return cumuls[au_jour - 1] >= 0.8 * budget_usd\n", "\n", "cumuls, j80, jp = trajectoire(COUT_DISTANT, VOLUME, 0.5, BUDGET)\n", - "SEUIL_JOUR = min(j80 or 1, 30) # on vérifie l'alerte au plus tard au seuil calculé\n", - "franchie = verifier_alerte(cumuls, BUDGET, SEUIL_JOUR)\n", - "print(f\"Vérification de l'organe d'alerte au jour {SEUIL_JOUR} : seuil \"\n", - " f\"{'franchi -- ALERTE' if franchie else 'non franchi'}\")" + "calme = verifier_alerte(cumuls, BUDGET, JOURS_MOIS) # régime calme : vérifié au dernier jour du mois\n", + "cumuls_t, j80_t, _ = trajectoire(0.40 / VOLUME, VOLUME, 0.0, BUDGET)\n", + "tendu = verifier_alerte(cumuls_t, BUDGET, j80_t) # régime tendu : au jour d'alerte calculé\n", + "print(f\"Mois calme (pente mesurée), jour {JOURS_MOIS} : seuil {'franchi -- ALERTE' if calme else 'non franchi'}\")\n", + "print(f\"Mois tendu ($0.40/jour), jour {j80_t} : seuil {'franchi -- ALERTE' if tendu else 'non franchi'}\")\n" ] }, { @@ -636,20 +665,24 @@ "id": "07a09627", "metadata": { "papermill": { - "duration": 0.006072, - "end_time": "2026-09-28T16:54:45.901245+00:00", + "duration": 0.007263, + "end_time": "2026-10-01T20:38:43.370233+00:00", "exception": false, - "start_time": "2026-09-28T16:54:45.895173+00:00", + "start_time": "2026-10-01T20:38:43.362970+00:00", "status": "completed" }, "tags": [] }, "source": [ - "**Lecture.** La pente varie d'un facteur dix selon le mix : la colonne alerte montre le cas qui\n", - "franchit le seuil en cours de période et celui qui ne l'atteint pas dans l'année.\n", - "L'alerte ne se déclenche pas sur un sentiment : c'est une fonction testée sur la trajectoire\n", - "simulée, avec la pente mesurée à la section précédente — ré-exécuter le notebook avec un autre\n", - "prix de catalogue et tout se recalcule." + "**Lecture.** La pente varie d'un facteur dix selon le mix, mais aucun mix ne menace le budget :\n", + "à 0,063 $/jour, le mois complet consomme moins de 2 $ des 10 $ — et le compteur retombe à zéro à\n", + "chaque frontière de mois, la dépense ne s'accumule pas d'un mois sur l'autre. Le témoin à\n", + "0,40 $/jour montre l'autre régime : alerte au jour 20, budget épuisé au jour 25 du mois. C'est la\n", + "lecture mensuelle qui rend ce franchissement observable — un cumul annuel le noierait deux fois\n", + "(sous-alerte à pente faible, franchissement noyé à pente forte). L'alerte ne se déclenche pas sur\n", + "un sentiment : c'est une fonction testée sur la trajectoire simulée dans les deux régimes, avec la\n", + "pente mesurée à la section précédente — ré-exécuter le notebook avec un autre prix de catalogue\n", + "et tout se recalcule.\n" ] }, { @@ -657,10 +690,10 @@ "id": "34d896c9", "metadata": { "papermill": { - "duration": 0.007518, - "end_time": "2026-09-28T16:54:45.915764+00:00", + "duration": 0.007722, + "end_time": "2026-10-01T20:38:43.385427+00:00", "exception": false, - "start_time": "2026-09-28T16:54:45.908246+00:00", + "start_time": "2026-10-01T20:38:43.377705+00:00", "status": "completed" }, "tags": [] @@ -681,16 +714,16 @@ "id": "fd1ba3a8", "metadata": { "execution": { - "iopub.execute_input": "2026-09-28T16:54:45.934728Z", - "iopub.status.busy": "2026-09-28T16:54:45.933737Z", - "iopub.status.idle": "2026-09-28T16:54:45.943869Z", - "shell.execute_reply": "2026-09-28T16:54:45.942446Z" + "iopub.execute_input": "2026-10-01T20:38:43.403174Z", + "iopub.status.busy": "2026-10-01T20:38:43.402555Z", + "iopub.status.idle": "2026-10-01T20:38:43.413405Z", + "shell.execute_reply": "2026-10-01T20:38:43.411230Z" }, "papermill": { - "duration": 0.021132, - "end_time": "2026-09-28T16:54:45.945107+00:00", + "duration": 0.02195, + "end_time": "2026-10-01T20:38:43.414769+00:00", "exception": false, - "start_time": "2026-09-28T16:54:45.923975+00:00", + "start_time": "2026-10-01T20:38:43.392819+00:00", "status": "completed" }, "tags": [] @@ -728,10 +761,10 @@ "id": "1df1ae4a", "metadata": { "papermill": { - "duration": 0.007841, - "end_time": "2026-09-28T16:54:45.960916+00:00", + "duration": 0.007732, + "end_time": "2026-10-01T20:38:43.431906+00:00", "exception": false, - "start_time": "2026-09-28T16:54:45.953075+00:00", + "start_time": "2026-10-01T20:38:43.424174+00:00", "status": "completed" }, "tags": [] @@ -748,10 +781,10 @@ "id": "af50ae5a", "metadata": { "papermill": { - "duration": 0.008209, - "end_time": "2026-09-28T16:54:45.978280+00:00", + "duration": 0.007552, + "end_time": "2026-10-01T20:38:43.448729+00:00", "exception": false, - "start_time": "2026-09-28T16:54:45.970071+00:00", + "start_time": "2026-10-01T20:38:43.441177+00:00", "status": "completed" }, "tags": [] @@ -775,16 +808,16 @@ "id": "29ac466c", "metadata": { "execution": { - "iopub.execute_input": "2026-09-28T16:54:45.996894Z", - "iopub.status.busy": "2026-09-28T16:54:45.996308Z", - "iopub.status.idle": "2026-09-28T16:54:54.883955Z", - "shell.execute_reply": "2026-09-28T16:54:54.882130Z" + "iopub.execute_input": "2026-10-01T20:38:43.467519Z", + "iopub.status.busy": "2026-10-01T20:38:43.466928Z", + "iopub.status.idle": "2026-10-01T20:38:52.526243Z", + "shell.execute_reply": "2026-10-01T20:38:52.524852Z" }, "papermill": { - "duration": 8.898438, - "end_time": "2026-09-28T16:54:54.885238+00:00", + "duration": 9.071035, + "end_time": "2026-10-01T20:38:52.527465+00:00", "exception": false, - "start_time": "2026-09-28T16:54:45.986800+00:00", + "start_time": "2026-10-01T20:38:43.456430+00:00", "status": "completed" }, "tags": [] @@ -894,10 +927,10 @@ "id": "e453a7fb", "metadata": { "papermill": { - "duration": 0.005748, - "end_time": "2026-09-28T16:54:54.898092+00:00", + "duration": 0.007959, + "end_time": "2026-10-01T20:38:52.543176+00:00", "exception": false, - "start_time": "2026-09-28T16:54:54.892344+00:00", + "start_time": "2026-10-01T20:38:52.535217+00:00", "status": "completed" }, "tags": [] @@ -914,10 +947,10 @@ "id": "e4908495", "metadata": { "papermill": { - "duration": 0.008159, - "end_time": "2026-09-28T16:54:54.913941+00:00", + "duration": 0.008141, + "end_time": "2026-10-01T20:38:52.560005+00:00", "exception": false, - "start_time": "2026-09-28T16:54:54.905782+00:00", + "start_time": "2026-10-01T20:38:52.551864+00:00", "status": "completed" }, "tags": [] @@ -937,16 +970,16 @@ "id": "df79629f", "metadata": { "execution": { - "iopub.execute_input": "2026-09-28T16:54:54.940526Z", - "iopub.status.busy": "2026-09-28T16:54:54.939980Z", - "iopub.status.idle": "2026-09-28T16:54:54.958260Z", - "shell.execute_reply": "2026-09-28T16:54:54.956694Z" + "iopub.execute_input": "2026-10-01T20:38:52.577529Z", + "iopub.status.busy": "2026-10-01T20:38:52.576924Z", + "iopub.status.idle": "2026-10-01T20:38:52.593340Z", + "shell.execute_reply": "2026-10-01T20:38:52.591969Z" }, "papermill": { - "duration": 0.031663, - "end_time": "2026-09-28T16:54:54.959722+00:00", + "duration": 0.02721, + "end_time": "2026-10-01T20:38:52.594627+00:00", "exception": false, - "start_time": "2026-09-28T16:54:54.928059+00:00", + "start_time": "2026-10-01T20:38:52.567417+00:00", "status": "completed" }, "tags": [] @@ -1069,10 +1102,10 @@ "id": "9fcd7655", "metadata": { "papermill": { - "duration": 0.007926, - "end_time": "2026-09-28T16:54:54.976142+00:00", + "duration": 0.008269, + "end_time": "2026-10-01T20:38:52.611860+00:00", "exception": false, - "start_time": "2026-09-28T16:54:54.968216+00:00", + "start_time": "2026-10-01T20:38:52.603591+00:00", "status": "completed" }, "tags": [] @@ -1090,10 +1123,10 @@ "id": "94ce2434", "metadata": { "papermill": { - "duration": 0.009083, - "end_time": "2026-09-28T16:54:54.996443+00:00", + "duration": 0.007737, + "end_time": "2026-10-01T20:38:52.628194+00:00", "exception": false, - "start_time": "2026-09-28T16:54:54.987360+00:00", + "start_time": "2026-10-01T20:38:52.620457+00:00", "status": "completed" }, "tags": [] @@ -1112,10 +1145,10 @@ "id": "beb6915b", "metadata": { "papermill": { - "duration": 0.014271, - "end_time": "2026-09-28T16:54:55.019505+00:00", + "duration": 0.007453, + "end_time": "2026-10-01T20:38:52.644029+00:00", "exception": false, - "start_time": "2026-09-28T16:54:55.005234+00:00", + "start_time": "2026-10-01T20:38:52.636576+00:00", "status": "completed" }, "tags": [] @@ -1129,10 +1162,10 @@ "id": "715bc248", "metadata": { "papermill": { - "duration": 0.008478, - "end_time": "2026-09-28T16:54:55.040903+00:00", + "duration": 0.007742, + "end_time": "2026-10-01T20:38:52.659745+00:00", "exception": false, - "start_time": "2026-09-28T16:54:55.032425+00:00", + "start_time": "2026-10-01T20:38:52.652003+00:00", "status": "completed" }, "tags": [] @@ -1141,8 +1174,8 @@ "### Exercice 1 : alerte prédictive\n", "\n", "L'alerte actuelle attend le franchissement du seuil. Écrivez `jour_franchissement_prevu(cumuls, budget)`\n", - "qui **extrapole la pente** des premiers jours pour prédire le jour de franchissement complet du\n", - "budget — l'exploitant veut être prévenu des semaines à l'avance, pas le jour du seuil." + "qui **extrapole la pente** des premiers jours du mois pour prédire le jour du mois où le budget\n", + "s'épuise — l'exploitant veut être prévenu des semaines à l'avance, pas le jour du seuil.\n" ] }, { @@ -1151,16 +1184,16 @@ "id": "5a6b4b49", "metadata": { "execution": { - "iopub.execute_input": "2026-09-28T16:54:55.060990Z", - "iopub.status.busy": "2026-09-28T16:54:55.060344Z", - "iopub.status.idle": "2026-09-28T16:54:55.068388Z", - "shell.execute_reply": "2026-09-28T16:54:55.066683Z" + "iopub.execute_input": "2026-10-01T20:38:52.678001Z", + "iopub.status.busy": "2026-10-01T20:38:52.677405Z", + "iopub.status.idle": "2026-10-01T20:38:52.684584Z", + "shell.execute_reply": "2026-10-01T20:38:52.683150Z" }, "papermill": { - "duration": 0.020615, - "end_time": "2026-09-28T16:54:55.069780+00:00", + "duration": 0.018408, + "end_time": "2026-10-01T20:38:52.685872+00:00", "exception": false, - "start_time": "2026-09-28T16:54:55.049165+00:00", + "start_time": "2026-10-01T20:38:52.667464+00:00", "status": "completed" }, "tags": [] @@ -1192,10 +1225,10 @@ "id": "4b76346c", "metadata": { "papermill": { - "duration": 0.010291, - "end_time": "2026-09-28T16:54:55.086498+00:00", + "duration": 0.008441, + "end_time": "2026-10-01T20:38:52.702375+00:00", "exception": false, - "start_time": "2026-09-28T16:54:55.076207+00:00", + "start_time": "2026-10-01T20:38:52.693934+00:00", "status": "completed" }, "tags": [] @@ -1215,16 +1248,16 @@ "id": "91f6f694", "metadata": { "execution": { - "iopub.execute_input": "2026-09-28T16:54:55.107714Z", - "iopub.status.busy": "2026-09-28T16:54:55.107071Z", - "iopub.status.idle": "2026-09-28T16:54:55.117386Z", - "shell.execute_reply": "2026-09-28T16:54:55.112958Z" + "iopub.execute_input": "2026-10-01T20:38:52.721401Z", + "iopub.status.busy": "2026-10-01T20:38:52.720814Z", + "iopub.status.idle": "2026-10-01T20:38:52.727973Z", + "shell.execute_reply": "2026-10-01T20:38:52.726361Z" }, "papermill": { - "duration": 0.023126, - "end_time": "2026-09-28T16:54:55.119032+00:00", + "duration": 0.01868, + "end_time": "2026-10-01T20:38:52.729279+00:00", "exception": false, - "start_time": "2026-09-28T16:54:55.095906+00:00", + "start_time": "2026-10-01T20:38:52.710599+00:00", "status": "completed" }, "tags": [] @@ -1256,10 +1289,10 @@ "id": "3551bcc5", "metadata": { "papermill": { - "duration": 0.008139, - "end_time": "2026-09-28T16:54:55.137227+00:00", + "duration": 0.007847, + "end_time": "2026-10-01T20:38:52.745323+00:00", "exception": false, - "start_time": "2026-09-28T16:54:55.129088+00:00", + "start_time": "2026-10-01T20:38:52.737476+00:00", "status": "completed" }, "tags": [] @@ -1278,16 +1311,16 @@ "id": "a272698a", "metadata": { "execution": { - "iopub.execute_input": "2026-09-28T16:54:55.156973Z", - "iopub.status.busy": "2026-09-28T16:54:55.156524Z", - "iopub.status.idle": "2026-09-28T16:54:55.163928Z", - "shell.execute_reply": "2026-09-28T16:54:55.162376Z" + "iopub.execute_input": "2026-10-01T20:38:52.763813Z", + "iopub.status.busy": "2026-10-01T20:38:52.763220Z", + "iopub.status.idle": "2026-10-01T20:38:52.770119Z", + "shell.execute_reply": "2026-10-01T20:38:52.768683Z" }, "papermill": { - "duration": 0.018777, - "end_time": "2026-09-28T16:54:55.165021+00:00", + "duration": 0.017828, + "end_time": "2026-10-01T20:38:52.771494+00:00", "exception": false, - "start_time": "2026-09-28T16:54:55.146244+00:00", + "start_time": "2026-10-01T20:38:52.753666+00:00", "status": "completed" }, "tags": [] @@ -1318,10 +1351,10 @@ "id": "3901bfe8", "metadata": { "papermill": { - "duration": 0.014685, - "end_time": "2026-09-28T16:54:55.187750+00:00", + "duration": 0.008319, + "end_time": "2026-10-01T20:38:52.788391+00:00", "exception": false, - "start_time": "2026-09-28T16:54:55.173065+00:00", + "start_time": "2026-10-01T20:38:52.780072+00:00", "status": "completed" }, "tags": [] @@ -1352,17 +1385,17 @@ }, "papermill": { "default_parameters": {}, - "duration": 114.791676, - "end_time": "2026-09-28T16:54:56.330360+00:00", + "duration": 96.812514, + "end_time": "2026-10-01T20:38:53.581385+00:00", "environment_variables": {}, "exception": null, - "input_path": "09e_Production_Exploitation.ipynb", - "output_path": "09e_exec.ipynb", + "input_path": "MyIA.AI.Notebooks/GenAI/Texte/09e_Production_Exploitation.ipynb", + "output_path": "MyIA.AI.Notebooks/GenAI/Texte/09e_Production_Exploitation.ipynb", "parameters": {}, - "start_time": "2026-09-28T16:53:01.538684+00:00", + "start_time": "2026-10-01T20:37:16.768871+00:00", "version": "2.7.0" } }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file