From f92afad9858e7d80bde50755e292496c959aa89c Mon Sep 17 00:00:00 2001 From: amyheather Date: Tue, 8 Apr 2025 14:41:31 +0100 Subject: [PATCH 01/24] docs(readme): add article figures + write "How to run" section of README --- README.md | 65 ++++++++++++++++-- .../{ => article}/article_monks_etal_2016.pdf | Bin docs/article/fig1.png | Bin 0 -> 24971 bytes docs/article/fig2.png | Bin 0 -> 59888 bytes docs/article/fig3.png | Bin 0 -> 23426 bytes .../supplementary_monks_etal_2016.docx | Bin .../supplementary_monks_etal_2016.pdf | Bin 7 files changed, 60 insertions(+), 5 deletions(-) rename docs/{ => article}/article_monks_etal_2016.pdf (100%) create mode 100644 docs/article/fig1.png create mode 100644 docs/article/fig2.png create mode 100644 docs/article/fig3.png rename docs/{ => article}/supplementary_monks_etal_2016.docx (100%) rename docs/{ => article}/supplementary_monks_etal_2016.pdf (100%) diff --git a/README.md b/README.md index dbeae92..8148a0a 100644 --- a/README.md +++ b/README.md @@ -28,14 +28,69 @@ TBC ## How to run -TBC +The simulation code is provided as a **package** within `simulation/`. There are notebooks executing the model and analysing the results in `notebooks/`. + +To run the model with base parameters once or with replications: + +``` +from simulation.parameters import Param +from simulation.runner import Runner + +param = Param() +runner = Runner(param=param) + +single_result = runner.run_single(run=0) +rep_results = runner.run_reps() +``` + +Example altering the model parameters: + +``` +from simulation.parameters import Param, ASUArrivals, RehabRouting +from simulation.runner import Runner - +The original study used Simul8. Each of the outputs from that article have been reproduced in this repository using Python, with some examples below. To generate these, simply execute `notebooks/analysis.ipynb`. + +Examples: + +**Figure 1** + +
+
+ Original:
+ +
+
+ From this repository:
+ +
+
+ +**Figure 3** + +
+
+ Original:
+ +
+
+ From this repository:
+ +
+

diff --git a/docs/article_monks_etal_2016.pdf b/docs/article/article_monks_etal_2016.pdf similarity index 100% rename from docs/article_monks_etal_2016.pdf rename to docs/article/article_monks_etal_2016.pdf diff --git a/docs/article/fig1.png b/docs/article/fig1.png new file mode 100644 index 0000000000000000000000000000000000000000..d747c9693d3c4df38df7cc5bdc690e2f139edc23 GIT binary patch literal 24971 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 literal 0 HcmV?d00001 diff --git a/docs/article/fig2.png b/docs/article/fig2.png new file mode 100644 index 0000000000000000000000000000000000000000..2006a7ab0ccf2ab32debc54a5179f7d669904589 GIT binary patch literal 59888 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 literal 0 HcmV?d00001 diff --git a/docs/article/fig3.png b/docs/article/fig3.png new file mode 100644 index 0000000000000000000000000000000000000000..da60437f7231b3f9cc3b7fc25245b51c3eb2cf5f GIT binary patch literal 23426 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 literal 0 HcmV?d00001 diff --git a/docs/supplementary_monks_etal_2016.docx b/docs/article/supplementary_monks_etal_2016.docx similarity index 100% rename from docs/supplementary_monks_etal_2016.docx rename to docs/article/supplementary_monks_etal_2016.docx diff --git a/docs/supplementary_monks_etal_2016.pdf b/docs/article/supplementary_monks_etal_2016.pdf similarity index 100% rename from docs/supplementary_monks_etal_2016.pdf rename to docs/article/supplementary_monks_etal_2016.pdf From 06f3b2ab046a575808355eeced0b423544daf1ce Mon Sep 17 00:00:00 2001 From: Amy Heather <92166537+amyheather@users.noreply.github.com> Date: Tue, 8 Apr 2025 14:45:16 +0100 Subject: [PATCH 02/24] docs(readme): alter images (as side-by-side display didn't work on GitHub) --- README.md | 36 +++++++++++++++--------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 8148a0a..c24fd4a 100644 --- a/README.md +++ b/README.md @@ -64,33 +64,27 @@ rep_results = runner.run_reps() The original study used Simul8. Each of the outputs from that article have been reproduced in this repository using Python, with some examples below. To generate these, simply execute `notebooks/analysis.ipynb`. -Examples: +#### Examples **Figure 1** -
-
- Original:
- -
-
- From this repository:
- -
-
+Original: + +![](docs/article/fig1.png) + +From this repository: + +![](outputs/occupancy_freq_asu.png) **Figure 3** -
-
- Original:
- -
-
- From this repository:
- -
-
+Original: + +![](docs/article/fig3.png) + +From this repository: + +![](outputs/delay_prob_asu.png)
From c659c2d70350c026df2f49e23ff01dd957678603 Mon Sep 17 00:00:00 2001 From: amyheather Date: Tue, 8 Apr 2025 15:22:51 +0100 Subject: [PATCH 03/24] feat(runner): add summary tables combining replications, and use these for Figure 1 and 3 --- notebooks/analysis.ipynb | 262 +++++++++---------------------- outputs/delay_prob_asu.png | Bin 25212 -> 25242 bytes outputs/delay_prob_rehab.png | Bin 24050 -> 25719 bytes outputs/occupancy_freq_asu.png | Bin 30739 -> 30327 bytes outputs/occupancy_freq_rehab.png | Bin 27597 -> 30157 bytes simulation/runner.py | 43 ++++- 6 files changed, 115 insertions(+), 190 deletions(-) diff --git a/notebooks/analysis.ipynb b/notebooks/analysis.ipynb index d1f7ced..d0e364e 100644 --- a/notebooks/analysis.ipynb +++ b/notebooks/analysis.ipynb @@ -4,7 +4,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Analysis" + "# Analysis\n", + "\n", + "This analysis reproduces the analysis performed in:\n", + "\n", + "> Monks T, Worthington D, Allen M, Pitt M, Stein K, James MA. A modelling tool for capacity planning in acute and community stroke services. BMC Health Serv Res. 2016 Sep 29;16(1):530. doi: [10.1186/s12913-016-1789-4](https://doi.org/10.1186/s12913-016-1789-4). PMID: 27688152; PMCID: PMC5043535.\n", + "\n", + "It is organised into:\n", + "\n", + "* Base case\n", + " * Run the model\n", + " * Figure 1\n", + " * Figure 3\n", + "* Scenario analysis" ] }, { @@ -22,6 +34,7 @@ "import os\n", "\n", "from IPython.display import display\n", + "import pandas as pd\n", "import plotly.express as px\n", "\n", "from simulation.parameters import Param\n", @@ -43,165 +56,36 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Running the model" + "## Base case\n", + "\n", + "### Run the model" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'time': 1095, 'asu_occupancy': 7, 'rehab_occupancy': 12},\n", - " {'time': 1096, 'asu_occupancy': 5, 'rehab_occupancy': 11},\n", - " {'time': 1097, 'asu_occupancy': 5, 'rehab_occupancy': 10},\n", - " {'time': 1098, 'asu_occupancy': 4, 'rehab_occupancy': 10},\n", - " {'time': 1099, 'asu_occupancy': 5, 'rehab_occupancy': 10}]" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# View the raw model run and output\n", - "model = Model(Param(), run_number=0)\n", - "model.run()\n", - "display(model.audit_list[0:5])" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "# Set up runner\n", - "runner = Runner(param=Param(cores=8))" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
bedsfreqpctc_pctprob_delay
0110.0005480.0005481.000000
12120.0065750.0071230.923077
23390.0213700.0284930.750000
34760.0416440.0701370.593750
451340.0734250.1435620.511450
\n", - "
" - ], - "text/plain": [ - " beds freq pct c_pct prob_delay\n", - "0 1 1 0.000548 0.000548 1.000000\n", - "1 2 12 0.006575 0.007123 0.923077\n", - "2 3 39 0.021370 0.028493 0.750000\n", - "3 4 76 0.041644 0.070137 0.593750\n", - "4 5 134 0.073425 0.143562 0.511450" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Run once and preview results\n", - "single_results = runner.run_single(run=0)\n", - "single_results[\"asu\"].head()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, "outputs": [], "source": [ - "# Run replications\n", - "rep_results = runner.run_reps()" + "# Set up runner to run in parallel with nine cores\n", + "runner = Runner(param=Param(cores=9))\n", + "\n", + "# Run the model for 150 replications\n", + "rep_results, overall_results = runner.run_reps()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Figure 1\n", + "### Figure 1\n", "\n", "**Figure 1.** Simulation probability density function for occupancy of an acute stroke unit." ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -262,7 +146,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -287,12 +171,12 @@ "textposition": "auto", "type": "bar", "x": { - "bdata": "AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRob", + "bdata": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGw==", "dtype": "i1" }, "xaxis": "x", "y": { - "bdata": "roVnXn/0QT+GSJsNv+56P+0qDjv74ZU/v+4aQFdSpT/zX9RW9cuyP4vikfCtKL4/CMiu4rCzvz/nkBdYDKjCP/ASWeX9LsE/PNQ3Mlrdtj9TcrEvLCW3P5axTu+WTK4/5vVHHwH4qD8J/k1UxxOTP1MNgWg31YA/v+4aQFdShT+GSJsNv+5qPxpnATafcWY/roVnXn/0UT+uhWdef/RBP66FZ15/9EE/roVnXn/0QT8AAAAAAAAAAK6FZ15/9EE/AAAAAAAAAAAAAAAAAAAAAK6FZ15/9EE/", + "bdata": "bHe/VzQKMD//vkgzrA5hP08nssFfBoA/f6Ef0PnDlj913+cr55CnP+223BUFI7Q/RvufnWFgvD+cdR1r2zTBPwmmrrcdzcE/j7VtmmiYwD8cnN/xgoy7P5KDn4ss5bQ/qwY2fjXVrD/2CZbpb8yiPyg+kDoQUZY/uL4HeaudiT8tQxzr4jZ6PxWqVUJfJGs/fnz9vw9RWT/anDhJORFFP41+E9tZ/zA/VYDoO6M8IT9fuYhWz+UIPybkgGqwpO4+JuSAarCk3j4m5IBqsKTOPgAAAAAAAAAAJuSAarCkzj4=", "dtype": "f8" }, "yaxis": "y" @@ -1138,12 +1022,12 @@ "textposition": "auto", "type": "bar", "x": { - "bdata": "AwQFBgcICQoLDA0ODxAREhM=", + "bdata": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGw==", "dtype": "i1" }, "xaxis": "x", "y": { - "bdata": "ZHY0Sg8zdD/gwIEDBw6MP5KyJ0WzwqQ/huNqRsqetD/QV84hL7C4P/vhFeTmUsE/1oyUPSmaxT/Y2Q+vIDfHP8TtQeo63L4/MaBKbHxpsD9N2LpMPeujPyvQtBd3z5k/hkibDb/uij/xKTXl3mt/P/EpNeXea28/roVnXn/0QT+uhWdef/RxPw==", + "bdata": "VYDoO6M8ET/6zK9/9oc7P+XhonBDcmE/buomK6BxgD+beRI+FCuVP1Z10OBlq6U/S76wl5AJsj/Tzh74XvW4Pw0+NWdWob4/RstcluJJwD+uKdyK9Mm/PzFl+KUX1Ls/yzXyZvoStz/8so0qYHWxP232+dPVO6g/iLDqhe3Enz+ghAP11WyTP414rtRqo4Y/QzrzBnQEeT/UPZ3IBn9pPxpnATafcVY/xKVhLahDRj92sF9yYLM3P62uihEXdic/NHmUuH1HED+YjpBC7ibzPpiOkELuJvM+JuSAarCkzj4=", "dtype": "f8" }, "yaxis": "y" @@ -1970,11 +1854,11 @@ ], "source": [ "# Acute stroke unit\n", - "plot_occupancy_freq(single_results[\"asu\"], unit=\"asu\",\n", + "plot_occupancy_freq(overall_results[\"asu\"], unit=\"asu\",\n", " file=\"occupancy_freq_asu.png\")\n", "\n", "# Rehabilitation unit\n", - "plot_occupancy_freq(single_results[\"rehab\"], unit=\"rehab\",\n", + "plot_occupancy_freq(overall_results[\"rehab\"], unit=\"rehab\",\n", " file=\"occupancy_freq_rehab.png\")" ] }, @@ -1982,7 +1866,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Figure 3\n", + "### Figure 3\n", "\n", "**Figure 3**. Simulated trade-off between the probability that a patient is delayed and the no. of acute beds available.\n", "\n", @@ -1993,7 +1877,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -2027,64 +1911,64 @@ " \n", " \n", " 0\n", - " 1\n", - " 1\n", - " 0.000548\n", - " 0.000548\n", + " 0\n", + " 67\n", + " 0.000245\n", + " 0.000245\n", " 1.000000\n", " \n", " \n", " 1\n", - " 2\n", - " 12\n", - " 0.006575\n", - " 0.007123\n", - " 0.923077\n", + " 1\n", + " 570\n", + " 0.002082\n", + " 0.002327\n", + " 0.894819\n", " \n", " \n", " 2\n", - " 3\n", - " 39\n", - " 0.021370\n", - " 0.028493\n", - " 0.750000\n", + " 2\n", + " 2142\n", + " 0.007825\n", + " 0.010152\n", + " 0.770781\n", " \n", " \n", " 3\n", - " 4\n", - " 76\n", - " 0.041644\n", - " 0.070137\n", - " 0.593750\n", + " 3\n", + " 6086\n", + " 0.022232\n", + " 0.032384\n", + " 0.686520\n", " \n", " \n", " 4\n", - " 5\n", - " 134\n", - " 0.073425\n", - " 0.143562\n", - " 0.511450\n", + " 4\n", + " 12600\n", + " 0.046027\n", + " 0.078411\n", + " 0.587002\n", " \n", " \n", "\n", "" ], "text/plain": [ - " beds freq pct c_pct prob_delay\n", - "0 1 1 0.000548 0.000548 1.000000\n", - "1 2 12 0.006575 0.007123 0.923077\n", - "2 3 39 0.021370 0.028493 0.750000\n", - "3 4 76 0.041644 0.070137 0.593750\n", - "4 5 134 0.073425 0.143562 0.511450" + " beds freq pct c_pct prob_delay\n", + "0 0 67 0.000245 0.000245 1.000000\n", + "1 1 570 0.002082 0.002327 0.894819\n", + "2 2 2142 0.007825 0.010152 0.770781\n", + "3 3 6086 0.022232 0.032384 0.686520\n", + "4 4 12600 0.046027 0.078411 0.587002" ] }, - "execution_count": 9, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "single_results[\"asu\"].head()" + "overall_results[\"asu\"].head()" ] }, { @@ -2122,7 +2006,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -2177,7 +2061,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -2204,12 +2088,12 @@ "showlegend": false, "type": "scatter", "x": { - "bdata": "AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRob", + "bdata": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGw==", "dtype": "i1" }, "xaxis": "x", "y": { - "bdata": "AAAAAAAA8D+d2Imd2IntPwAAAAAAAOg/AAAAAAAA4z/I3towzV3gP6BZrWHS2Nw/MkmJOR6T1D+SkZGRkZHRP8HIXFz71Mk/5e7bAbZNvj+cZJtkm2S7P8IQGgyhwbA/MhB22hw0qj+TXhWcA6OTPzdgqKZjLoE/2L38eLaIhT9a1kq2YRxrP4lHiqm+h2Y/EiABEiABUj+szR0cmP5BP4vOT9wQ/EE/Qm1KUor5QT8AAAAAAAAAAHEfwX0E90E/AAAAAAAAAAAAAAAAAAAAALCFZ15/9EE/", + "bdata": "AAAAAAAA8D8CgetuXKLsP4sNV508qug/m06e1vj35T+8CtyeuMjiP42pU0p6BuA/qSXTppl62j9x1FjuBmLVP+9WTb6IcNA/Bq0gv9i6yD8s6bykhLDBPxM5x9fNSbg/wbfHebF0rz9ycuDEB7ijP5ZrLrXP4pY/jWbkEMzviT9z7pcSL196P91PM8TfNms/6TlGSkRYWT8hM8wovxNFP4KVVdlBADE/BwnK5fk8IT9r4g4G/+UIP6FZt8LNpO4+chiVFr+k3j6yPInAt6TOPgAAAAAAAAAAJ+SAarCkzj4=", "dtype": "f8" }, "yaxis": "y" @@ -3099,12 +2983,12 @@ "showlegend": false, "type": "scatter", "x": { - "bdata": "AwQFBgcICQoLDA0ODxAREhM=", + "bdata": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGw==", "dtype": "i1" }, "xaxis": "x", "y": { - "bdata": "AAAAAAAA8D+Hh4eHh4fnP9FeQnsJ7eU/c3JycnJy4j9Fg806cyLaP9YMdWfNUNc/ECqLROz90z8MxwBMxRXQP9vgup5HUsI/x6eGF9wbsj8ebiL42BKlP79jamDvmJo/Q72blPphiz8q0ZoaBLN/P3yRtVW8k28/o6ksO7wIQj+vhWdef/RxPw==", + "bdata": "AAAAAAAA8D+1utPqTqvrPwMKozpNDuo/VHHrBCQj6D/w+yfpgB/lP6wowwgyZOI/HbnlVh5L3z9BUUDJt9PZP9rmRLSmMtU/kAI+BBSs0D+jXQm4XPHJPwZijXLXScM/rhLQ2f1uvD9WEeTshdizP+73oW4YJKo/VW2Du3WUoD+KJdQ+uuGTP4F6+llJ6YY/FPjIaNgpeT9K6gBwpZBpPxEj6tY6eVY/uvpr4FJHRj9GEhR3FbU3Pxg/1lm0dic/VuG7l6hHED/dyFDFCSfzPu/FVdjyJvM+J+SAarCkzj4=", "dtype": "f8" }, "yaxis": "y" @@ -3972,8 +3856,8 @@ } ], "source": [ - "plot_delay_prob(single_results[\"asu\"], unit=\"asu\", file=\"delay_prob_asu.png\")\n", - "plot_delay_prob(single_results[\"rehab\"], unit=\"rehab\",\n", + "plot_delay_prob(overall_results[\"asu\"], unit=\"asu\", file=\"delay_prob_asu.png\")\n", + "plot_delay_prob(overall_results[\"rehab\"], unit=\"rehab\",\n", " file=\"delay_prob_rehab.png\")" ] } diff --git a/outputs/delay_prob_asu.png b/outputs/delay_prob_asu.png index 17f8b1da2e5583f11cf82e6d5c0a7caaff5cf3a2..4146c103cc02798c5c33be60ce267bac2e56dbdc 100644 GIT binary patch literal 25242 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 diff --git a/outputs/delay_prob_rehab.png b/outputs/delay_prob_rehab.png index a8daf01175652011431a6a174b87fbbed7b53557..51dd161d06575645bd2d0431c1d703379889f5d7 100644 GIT binary patch literal 25719 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 Cc;WK^ literal 24050 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 I+pc!1?NejDkbEG3AUN%krZq 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

F8Nr~CR|hu zFSS5eXY}nR8|tI>)R8?4LcgQNU)wd+mMAqesRY)y3LFJy{3QO~#f7NU6emE{8lh+i zm;{0`yE7?|dnjtI{5C%fMT#f1$eDvfX^D~E1~mccnmgCemi(pVW_~z%|D+Pf#A(J^ zxWjG9cj^@r9*?LQMdUO$jyzDh)^IqdK39z?%L|k%S-jAEB2eOZ* zf~n~%rm0QASu^p(pY2J`$D*Rk>l5moNRXlJAX6E2;m<;xZ?2&l%R6qahTh(AyKI_RJCn#(pGzkP?nv9x$LB87Gw7T{H186nX7=;p*k+eRL!Z z{=6jaPIN*w$_d4zr(e&#svoa6Z*^4@N#uH)We z!A*%4PRiqNB0a9_?TZV`$<_}zV5#>o)xJ68&`5g}pwC+Zd4z~4A}<8lJmO;Tf|^JNHLg(q>WUNSdji zQ^b;#dR`j-Wd2xLShPc>NlEpSX4cs9L6=i>mdgRJv=T}NhKIxWFOSA6x6e%|N7WnB zVC`amKxFgNWx7GpH6%1!BO$~qFT)DES|}qX!Zjik9(uC!qBb*?s6o1lWS^(Q3wwD# zhv2!1%haw&F~YZ>R5alLt;^+9eMl#`ld^s6NLi+Oo0r;U^?m`M?6>@)1#ACJ1dLUnD zAo)VhhITJO@`Nt?zdVQ$LwXucCz)ArdlF>pccq{^zvXWG^OK%H&6qWw(}Lyb&w&`B zfxBhI{c}ELKpx3Y%lT{#A#9%|8MM3q`Pfm|SisGm1TmLy`TMud-Q5$;d&}zi=Mw+3 ij5{~`f4Gc`3_4++%1Z3ACh#nGl$^AZRI0?)`~MeW0h0Lu diff --git a/outputs/occupancy_freq_asu.png b/outputs/occupancy_freq_asu.png index 08336aa17b4059d83fc62a939ba95b5b7427e387..a44618cd796f22c64d9604717dd07ff24522b706 100644 GIT binary patch literal 30327 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 S2Kd=8nYM1qJEunizznN=QpLNH-Wrhje$hbi*F^ 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 literal 27597 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 diff --git a/simulation/runner.py b/simulation/runner.py index 5465d1b..d2a3424 100644 --- a/simulation/runner.py +++ b/simulation/runner.py @@ -59,6 +59,24 @@ def get_occupancy_freq(self, audit_list, unit): df = pd.DataFrame( complete_frequency.items(), columns=["beds", "freq"]) + # Calculate percentage, cumulative percentage and probability of delay + df = self.calculate_occupancy_stats(df) + + return df + + def calculate_occupancy_stats(self, df): + """ + Given the frequencies of each occupancy level, calculates: + 1. Percentage + 2. Cumulative percentage + 3. Probability of delay + + Parameters + ---------- + df: pd.Dataframe + Dataframe containing the frequency of each occupancy level + (e.g. as output by get_occupancy_freq()). + """ # Add column with frequencies converted to proportions df["pct"] = df["freq"] / df["freq"].sum() @@ -122,4 +140,27 @@ def run_reps(self): delayed(self.run_single)(run) for run in range(self.param.number_of_runs)) - return results + # Extract dataframes and add run column + rep_dataframes = {"asu": [], "rehab": []} + for i, entry in enumerate(results): + for key in ["asu", "rehab"]: + df_copy = entry[key].copy() + df_copy["run"] = i + rep_dataframes[key].append(df_copy) + + # Concatenate the ASU and rehab dataframes into a single dataframe each + result = {key: pd.concat(dfs) for key, dfs in rep_dataframes.items()} + + # Create a summary dataframe for each unit with the overall frequency + # and occupancy for each bed + overall = {} + for unit in ["asu", "rehab"]: + # Sum the count the frequencies of beds across replications + comb = (result[unit] + .groupby("beds", as_index=False)["freq"] + .sum()) + # Calculate percentage, cumulative percentage and probability of + # delay, and save to dictionary + overall[unit] = self.calculate_occupancy_stats(comb) + + return result, overall From 0e1f91603b33660e1e76e578b70da89a421a8ed2 Mon Sep 17 00:00:00 2001 From: amyheather Date: Tue, 8 Apr 2025 16:12:21 +0100 Subject: [PATCH 04/24] feat(analysis): add scenario 1 and table 2 --- notebooks/analysis.ipynb | 1075 +++++++++++++++++++++++++++++++++++++- 1 file changed, 1068 insertions(+), 7 deletions(-) diff --git a/notebooks/analysis.ipynb b/notebooks/analysis.ipynb index d0e364e..43902b4 100644 --- a/notebooks/analysis.ipynb +++ b/notebooks/analysis.ipynb @@ -37,7 +37,7 @@ "import pandas as pd\n", "import plotly.express as px\n", "\n", - "from simulation.parameters import Param\n", + "from simulation.parameters import Param, ASUArrivals, RehabArrivals\n", "from simulation.model import Model\n", "from simulation.runner import Runner" ] @@ -71,7 +71,7 @@ "runner = Runner(param=Param(cores=9))\n", "\n", "# Run the model for 150 replications\n", - "rep_results, overall_results = runner.run_reps()" + "base_reps, base_overall = runner.run_reps()" ] }, { @@ -1854,11 +1854,11 @@ ], "source": [ "# Acute stroke unit\n", - "plot_occupancy_freq(overall_results[\"asu\"], unit=\"asu\",\n", + "plot_occupancy_freq(base_overall[\"asu\"], unit=\"asu\",\n", " file=\"occupancy_freq_asu.png\")\n", "\n", "# Rehabilitation unit\n", - "plot_occupancy_freq(overall_results[\"rehab\"], unit=\"rehab\",\n", + "plot_occupancy_freq(base_overall[\"rehab\"], unit=\"rehab\",\n", " file=\"occupancy_freq_rehab.png\")" ] }, @@ -1968,7 +1968,7 @@ } ], "source": [ - "overall_results[\"asu\"].head()" + "base_overall[\"asu\"].head()" ] }, { @@ -3856,10 +3856,1071 @@ } ], "source": [ - "plot_delay_prob(overall_results[\"asu\"], unit=\"asu\", file=\"delay_prob_asu.png\")\n", - "plot_delay_prob(overall_results[\"rehab\"], unit=\"rehab\",\n", + "plot_delay_prob(base_overall[\"asu\"], unit=\"asu\", file=\"delay_prob_asu.png\")\n", + "plot_delay_prob(base_overall[\"rehab\"], unit=\"rehab\",\n", " file=\"delay_prob_rehab.png\")" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Scenario analysis\n", + "\n", + "### Scenario 1\n", + "\n", + "**5% more admissions.** A 5% increase in admissions across all patient subgroups." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'stroke': 1.26, 'tia': 9.765, 'neuro': 3.7800000000000002, 'other': 3.3600000000000003, '_initialised': True}\n", + "{'stroke': 22.89, 'neuro': 33.285000000000004, 'other': 30.03, '_initialised': True}\n" + ] + } + ], + "source": [ + "def increase_by_5_percent(params_dict):\n", + " \"\"\"\n", + " Helper function to increase all attributes of a class by 5%.\n", + "\n", + " Parameters\n", + " ----------\n", + " params_dict: dict\n", + " Dictionary of parameters.\n", + " \"\"\"\n", + " return {k: v * 1.05 for k, v in params_dict.items() if k != '_initialised'}\n", + "\n", + "\n", + "# Apply 5% increase to inter-arrival parameters\n", + "s1_param = Param(\n", + " ASUArrivals(**increase_by_5_percent(vars(ASUArrivals()))),\n", + " RehabArrivals(**increase_by_5_percent(vars(RehabArrivals()))),\n", + " cores=9\n", + ")\n", + "\n", + "print(vars(s1_param.asu_arrivals))\n", + "print(vars(s1_param.rehab_arrivals))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# Run the model for 150 replications\n", + "runner = Runner(param=s1_param)\n", + "s1_reps, s1_overall = runner.run_reps()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Table 2\n", + "\n", + "**Table 2** Likelihood of delay. Current admissions versus 5% more admissions.\n", + "\n", + "This table presents results from the base case and scenario 1 for acute beds 9-14 and rehab beds 10-16." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
bedsfreqpctc_pctprob_delay
00670.0002450.0002451.000000
115700.0020820.0023270.894819
2221420.0078250.0101520.770781
3360860.0222320.0323840.686520
44126000.0460270.0784110.587002
55215330.0786590.1570700.500791
66303440.1108460.2679160.413733
77367990.1344260.4023420.334108
88380710.1390720.5414140.256869
99354920.1296510.6710650.193202
1010294590.1076130.7786780.138199
1111223440.0816220.8603000.094876
1212154160.0563140.9166140.061437
1313100510.0367160.9533300.038513
141459660.0217940.9751230.022350
151534240.0125080.9876310.012664
161617520.0064000.9940310.006438
17179070.0033130.9973440.003322
18184230.0015450.9988890.001547
19191760.0006430.9995320.000643
2020710.0002590.9997920.000259
2121360.0001320.9999230.000132
2222130.0000470.9999710.000047
232340.0000150.9999850.000015
242420.0000070.9999930.000007
252510.0000040.9999960.000004
262600.0000000.9999960.000000
272710.0000041.0000000.000004
\n", + "
" + ], + "text/plain": [ + " beds freq pct c_pct prob_delay\n", + "0 0 67 0.000245 0.000245 1.000000\n", + "1 1 570 0.002082 0.002327 0.894819\n", + "2 2 2142 0.007825 0.010152 0.770781\n", + "3 3 6086 0.022232 0.032384 0.686520\n", + "4 4 12600 0.046027 0.078411 0.587002\n", + "5 5 21533 0.078659 0.157070 0.500791\n", + "6 6 30344 0.110846 0.267916 0.413733\n", + "7 7 36799 0.134426 0.402342 0.334108\n", + "8 8 38071 0.139072 0.541414 0.256869\n", + "9 9 35492 0.129651 0.671065 0.193202\n", + "10 10 29459 0.107613 0.778678 0.138199\n", + "11 11 22344 0.081622 0.860300 0.094876\n", + "12 12 15416 0.056314 0.916614 0.061437\n", + "13 13 10051 0.036716 0.953330 0.038513\n", + "14 14 5966 0.021794 0.975123 0.022350\n", + "15 15 3424 0.012508 0.987631 0.012664\n", + "16 16 1752 0.006400 0.994031 0.006438\n", + "17 17 907 0.003313 0.997344 0.003322\n", + "18 18 423 0.001545 0.998889 0.001547\n", + "19 19 176 0.000643 0.999532 0.000643\n", + "20 20 71 0.000259 0.999792 0.000259\n", + "21 21 36 0.000132 0.999923 0.000132\n", + "22 22 13 0.000047 0.999971 0.000047\n", + "23 23 4 0.000015 0.999985 0.000015\n", + "24 24 2 0.000007 0.999993 0.000007\n", + "25 25 1 0.000004 0.999996 0.000004\n", + "26 26 0 0.000000 0.999996 0.000000\n", + "27 27 1 0.000004 1.000000 0.000004" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
bedsfreqpctc_pctprob_delay
00970.0003540.0003541.000000
117850.0028680.0032220.890023
2229410.0107430.0139650.769291
3378430.0286500.0426160.672296
44156830.0572890.0999050.573440
55253910.0927530.1926580.481437
66339620.1240620.3167200.391710
77389200.1421740.4588930.309818
88382640.1397770.5986700.233479
99338920.1238060.7224770.171364
1010268890.0982250.8207010.119684
1111192700.0703930.8910940.078996
1212127060.0464150.9375090.049508
131379150.0289130.9664220.029918
141446300.0169130.9833350.017200
151524070.0087930.9921280.008862
161611780.0043030.9964310.004319
17175520.0020160.9984470.002020
18182620.0009570.9994050.000958
19191030.0003760.9997810.000376
2020350.0001280.9999090.000128
2121170.0000620.9999710.000062
222240.0000150.9999850.000015
232320.0000070.9999930.000007
242410.0000040.9999960.000004
252500.0000000.9999960.000000
262610.0000041.0000000.000004
\n", + "
" + ], + "text/plain": [ + " beds freq pct c_pct prob_delay\n", + "0 0 97 0.000354 0.000354 1.000000\n", + "1 1 785 0.002868 0.003222 0.890023\n", + "2 2 2941 0.010743 0.013965 0.769291\n", + "3 3 7843 0.028650 0.042616 0.672296\n", + "4 4 15683 0.057289 0.099905 0.573440\n", + "5 5 25391 0.092753 0.192658 0.481437\n", + "6 6 33962 0.124062 0.316720 0.391710\n", + "7 7 38920 0.142174 0.458893 0.309818\n", + "8 8 38264 0.139777 0.598670 0.233479\n", + "9 9 33892 0.123806 0.722477 0.171364\n", + "10 10 26889 0.098225 0.820701 0.119684\n", + "11 11 19270 0.070393 0.891094 0.078996\n", + "12 12 12706 0.046415 0.937509 0.049508\n", + "13 13 7915 0.028913 0.966422 0.029918\n", + "14 14 4630 0.016913 0.983335 0.017200\n", + "15 15 2407 0.008793 0.992128 0.008862\n", + "16 16 1178 0.004303 0.996431 0.004319\n", + "17 17 552 0.002016 0.998447 0.002020\n", + "18 18 262 0.000957 0.999405 0.000958\n", + "19 19 103 0.000376 0.999781 0.000376\n", + "20 20 35 0.000128 0.999909 0.000128\n", + "21 21 17 0.000062 0.999971 0.000062\n", + "22 22 4 0.000015 0.999985 0.000015\n", + "23 23 2 0.000007 0.999993 0.000007\n", + "24 24 1 0.000004 0.999996 0.000004\n", + "25 25 0 0.000000 0.999996 0.000000\n", + "26 26 1 0.000004 1.000000 0.000004" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# View the full results from the base and scenario for the ASU\n", + "display(base_overall[\"asu\"])\n", + "display(s1_overall[\"asu\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def make_table2_segment(unit, filter_beds):\n", + " \"\"\"\n", + " Make segment of Table 2 for either the acute stroke unit (\"asu\") or\n", + " rehabilitation unit (\"rehab\").\n", + "\n", + " Parameters\n", + " ----------\n", + " unit: str\n", + " Name of unit to extract results for (\"asu\", \"rehab\").\n", + " filter_beds: list\n", + " List of bed numbers to get results for.\n", + "\n", + " Returns\n", + " -------\n", + " full_df: pd.DataFrame\n", + " Results from base case and scenario side-by-side.\n", + " \"\"\"\n", + " # Get the overall results for base and scenario 1\n", + " tab2_dict = {\"prob_delay_current\": base_overall[unit],\n", + " \"prob_delay_5\": s1_overall[unit]}\n", + "\n", + " # Create list to store modified dataframes\n", + " tab2_list = []\n", + "\n", + " for prob_name, df in tab2_dict.items():\n", + "\n", + " # Extract results for specified beds\n", + " df = df[df[\"beds\"].isin(filter_beds)][[\"beds\", \"prob_delay\"]]\n", + "\n", + " # Round probability of delay to 2 d.p.\n", + " df[\"prob_delay\"] = round(df[\"prob_delay\"], 2)\n", + "\n", + " # Rename column to be specific to scenario\n", + " df = df.rename(columns={\"prob_delay\": prob_name})\n", + "\n", + " tab2_list.append(df)\n", + "\n", + " # Combine into single dataframe\n", + " full_df = pd.merge(tab2_list[0], tab2_list[1], on=\"beds\")\n", + "\n", + " # Add column with unit name\n", + " full_df.insert(0, \"unit\", unit)\n", + "\n", + " return full_df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The scenario results in my table are most similar to those from one bed later in the article...\n", + "\n", + "Example 1:\n", + "\n", + "* My scenario ASU beds 9 = 0.17\n", + "* Article scenario ASU beds 9 = not reported\n", + "* Article scenario ASU beds 10 = 0.16\n", + "\n", + "Example 2:\n", + "\n", + "* My scenario ASU beds 10 = 0.12\n", + "* Article scenario ASU beds 10 = 0.16\n", + "* Article scenario ASU beds 11 = 0.11\n", + "\n", + "Example 3:\n", + "\n", + "* My scenario rehab beds 11 = 0.13\n", + "* Article scenario rehab beds 11 = not reported\n", + "* Article scenario rehab beds 12 = 0.13\n", + "\n", + "TODO: What would we expect? For it to go up or down with this scenario?" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
unitbedsprob_delay_currentprob_delay_5
0asu90.190.17
1asu100.140.12
2asu110.090.08
3asu120.060.05
4asu130.040.03
5asu140.020.02
6rehab100.200.18
7rehab110.150.13
8rehab120.110.09
9rehab130.080.06
10rehab140.050.04
11rehab150.030.02
12rehab160.020.01
\n", + "
" + ], + "text/plain": [ + " unit beds prob_delay_current prob_delay_5\n", + "0 asu 9 0.19 0.17\n", + "1 asu 10 0.14 0.12\n", + "2 asu 11 0.09 0.08\n", + "3 asu 12 0.06 0.05\n", + "4 asu 13 0.04 0.03\n", + "5 asu 14 0.02 0.02\n", + "6 rehab 10 0.20 0.18\n", + "7 rehab 11 0.15 0.13\n", + "8 rehab 12 0.11 0.09\n", + "9 rehab 13 0.08 0.06\n", + "10 rehab 14 0.05 0.04\n", + "11 rehab 15 0.03 0.02\n", + "12 rehab 16 0.02 0.01" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Acute stroke unit: 9 to 14 beds\n", + "tab2_asu = make_table2_segment(unit=\"asu\", filter_beds=list(range(9,15)))\n", + "\n", + "# Rehab unit: 10 to 16 beds, excluding 11 (we do this later, so can still see)\n", + "tab2_rehab = make_table2_segment(unit=\"rehab\", filter_beds=list(range(10,17)))\n", + "\n", + "# Combine into a single table\n", + "full_tab2 = pd.concat([tab2_asu, tab2_rehab]).reset_index(drop=True)\n", + "full_tab2" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
unitbedsprob_delay_currentprob_delay_5
0asu90.19NaN
1asu100.140.12
2asu110.090.08
3asu120.060.05
4asu130.040.03
5asu140.020.02
6rehab100.20NaN
8rehab120.110.09
9rehab130.080.06
10rehab140.050.04
11rehab150.030.02
12rehab160.020.01
\n", + "
" + ], + "text/plain": [ + " unit beds prob_delay_current prob_delay_5\n", + "0 asu 9 0.19 NaN\n", + "1 asu 10 0.14 0.12\n", + "2 asu 11 0.09 0.08\n", + "3 asu 12 0.06 0.05\n", + "4 asu 13 0.04 0.03\n", + "5 asu 14 0.02 0.02\n", + "6 rehab 10 0.20 NaN\n", + "8 rehab 12 0.11 0.09\n", + "9 rehab 13 0.08 0.06\n", + "10 rehab 14 0.05 0.04\n", + "11 rehab 15 0.03 0.02\n", + "12 rehab 16 0.02 0.01" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# These are some adjustments to how table is presented in article...\n", + "\n", + "adj_full_tab_2 = full_tab2.copy()\n", + "\n", + "# Drop the result for ASU beds 9 and rehab beds 10 for the scenario\n", + "adj_full_tab_2.loc[(adj_full_tab_2[\"unit\"] == \"asu\") &\n", + " (adj_full_tab_2[\"beds\"] == 9),\n", + " \"prob_delay_5\"] = None\n", + "adj_full_tab_2.loc[(adj_full_tab_2[\"unit\"] == \"rehab\") &\n", + " (adj_full_tab_2[\"beds\"] == 10),\n", + " \"prob_delay_5\"] = None\n", + "\n", + "# Drop the result for rehab 11 beds\n", + "adj_full_tab_2 = adj_full_tab_2[\n", + " ~((adj_full_tab_2[\"unit\"] == \"rehab\") & (adj_full_tab_2[\"beds\"] == 11))]\n", + "\n", + "adj_full_tab_2" + ] } ], "metadata": { From 99556b4c72f1bcc4a4491a514ffe6b92357af589 Mon Sep 17 00:00:00 2001 From: amyheather Date: Tue, 8 Apr 2025 16:23:06 +0100 Subject: [PATCH 05/24] fix(analysis): corrected scenario 1 from increasing IAT by 5% (hence decreasing admission) to decreasing IAT by 5% (hence increasing admissions) --- notebooks/analysis.ipynb | 406 ++++++++++++++++++--------------------- outputs/delay_s1.csv | 13 ++ 2 files changed, 203 insertions(+), 216 deletions(-) create mode 100644 outputs/delay_s1.csv diff --git a/notebooks/analysis.ipynb b/notebooks/analysis.ipynb index 43902b4..6fa3450 100644 --- a/notebooks/analysis.ipynb +++ b/notebooks/analysis.ipynb @@ -3881,28 +3881,28 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'stroke': 1.26, 'tia': 9.765, 'neuro': 3.7800000000000002, 'other': 3.3600000000000003, '_initialised': True}\n", - "{'stroke': 22.89, 'neuro': 33.285000000000004, 'other': 30.03, '_initialised': True}\n" + "{'stroke': 1.14, 'tia': 8.835, 'neuro': 3.42, 'other': 3.04, '_initialised': True}\n", + "{'stroke': 20.71, 'neuro': 30.115, 'other': 27.17, '_initialised': True}\n" ] } ], "source": [ - "def increase_by_5_percent(params_dict):\n", + "def alter_by_5_percent(params_dict):\n", " \"\"\"\n", - " Helper function to increase all attributes of a class by 5%.\n", + " Helper function to reduce all attributes of a class by 5%.\n", "\n", " Parameters\n", " ----------\n", " params_dict: dict\n", " Dictionary of parameters.\n", " \"\"\"\n", - " return {k: v * 1.05 for k, v in params_dict.items() if k != '_initialised'}\n", + " return {k: v * 0.95 for k, v in params_dict.items() if k != '_initialised'}\n", "\n", "\n", "# Apply 5% increase to inter-arrival parameters\n", "s1_param = Param(\n", - " ASUArrivals(**increase_by_5_percent(vars(ASUArrivals()))),\n", - " RehabArrivals(**increase_by_5_percent(vars(RehabArrivals()))),\n", + " ASUArrivals(**alter_by_5_percent(vars(ASUArrivals()))),\n", + " RehabArrivals(**alter_by_5_percent(vars(RehabArrivals()))),\n", " cores=9\n", ")\n", "\n", @@ -4261,218 +4261,218 @@ " \n", " 0\n", " 0\n", - " 97\n", - " 0.000354\n", - " 0.000354\n", + " 49\n", + " 0.000179\n", + " 0.000179\n", " 1.000000\n", " \n", " \n", " 1\n", " 1\n", - " 785\n", - " 0.002868\n", - " 0.003222\n", - " 0.890023\n", + " 398\n", + " 0.001454\n", + " 0.001633\n", + " 0.890380\n", " \n", " \n", " 2\n", " 2\n", - " 2941\n", - " 0.010743\n", - " 0.013965\n", - " 0.769291\n", + " 1550\n", + " 0.005662\n", + " 0.007295\n", + " 0.776164\n", " \n", " \n", " 3\n", " 3\n", - " 7843\n", - " 0.028650\n", - " 0.042616\n", - " 0.672296\n", + " 4586\n", + " 0.016753\n", + " 0.024047\n", + " 0.696643\n", " \n", " \n", " 4\n", " 4\n", - " 15683\n", - " 0.057289\n", - " 0.099905\n", - " 0.573440\n", + " 10088\n", + " 0.036851\n", + " 0.060899\n", + " 0.605123\n", " \n", " \n", " 5\n", " 5\n", - " 25391\n", - " 0.092753\n", - " 0.192658\n", - " 0.481437\n", + " 17643\n", + " 0.064449\n", + " 0.125348\n", + " 0.514163\n", " \n", " \n", " 6\n", " 6\n", - " 33962\n", - " 0.124062\n", - " 0.316720\n", - " 0.391710\n", + " 26749\n", + " 0.097713\n", + " 0.223061\n", + " 0.438056\n", " \n", " \n", " 7\n", " 7\n", - " 38920\n", - " 0.142174\n", - " 0.458893\n", - " 0.309818\n", + " 34016\n", + " 0.124259\n", + " 0.347321\n", + " 0.357766\n", " \n", " \n", " 8\n", " 8\n", - " 38264\n", - " 0.139777\n", - " 0.598670\n", - " 0.233479\n", + " 36840\n", + " 0.134575\n", + " 0.481896\n", + " 0.279262\n", " \n", " \n", " 9\n", " 9\n", - " 33892\n", - " 0.123806\n", - " 0.722477\n", - " 0.171364\n", + " 35927\n", + " 0.131240\n", + " 0.613136\n", + " 0.214047\n", " \n", " \n", " 10\n", " 10\n", - " 26889\n", - " 0.098225\n", - " 0.820701\n", - " 0.119684\n", + " 32005\n", + " 0.116913\n", + " 0.730049\n", + " 0.160144\n", " \n", " \n", " 11\n", " 11\n", - " 19270\n", - " 0.070393\n", - " 0.891094\n", - " 0.078996\n", + " 25034\n", + " 0.091448\n", + " 0.821498\n", + " 0.111319\n", " \n", " \n", " 12\n", " 12\n", - " 12706\n", - " 0.046415\n", - " 0.937509\n", - " 0.049508\n", + " 18505\n", + " 0.067598\n", + " 0.889096\n", + " 0.076030\n", " \n", " \n", " 13\n", " 13\n", - " 7915\n", - " 0.028913\n", - " 0.966422\n", - " 0.029918\n", + " 12523\n", + " 0.045746\n", + " 0.934842\n", + " 0.048935\n", " \n", " \n", " 14\n", " 14\n", - " 4630\n", - " 0.016913\n", - " 0.983335\n", - " 0.017200\n", + " 7983\n", + " 0.029162\n", + " 0.964004\n", + " 0.030251\n", " \n", " \n", " 15\n", " 15\n", - " 2407\n", - " 0.008793\n", - " 0.992128\n", - " 0.008862\n", + " 4676\n", + " 0.017081\n", + " 0.981085\n", + " 0.017411\n", " \n", " \n", " 16\n", " 16\n", - " 1178\n", - " 0.004303\n", - " 0.996431\n", - " 0.004319\n", + " 2550\n", + " 0.009315\n", + " 0.990400\n", + " 0.009405\n", " \n", " \n", " 17\n", " 17\n", - " 552\n", - " 0.002016\n", - " 0.998447\n", - " 0.002020\n", + " 1415\n", + " 0.005169\n", + " 0.995569\n", + " 0.005192\n", " \n", " \n", " 18\n", " 18\n", - " 262\n", - " 0.000957\n", - " 0.999405\n", - " 0.000958\n", + " 644\n", + " 0.002353\n", + " 0.997921\n", + " 0.002357\n", " \n", " \n", " 19\n", " 19\n", - " 103\n", - " 0.000376\n", - " 0.999781\n", - " 0.000376\n", + " 317\n", + " 0.001158\n", + " 0.999079\n", + " 0.001159\n", " \n", " \n", " 20\n", " 20\n", - " 35\n", - " 0.000128\n", - " 0.999909\n", - " 0.000128\n", + " 153\n", + " 0.000559\n", + " 0.999638\n", + " 0.000559\n", " \n", " \n", " 21\n", " 21\n", - " 17\n", - " 0.000062\n", - " 0.999971\n", - " 0.000062\n", + " 55\n", + " 0.000201\n", + " 0.999839\n", + " 0.000201\n", " \n", " \n", " 22\n", " 22\n", - " 4\n", - " 0.000015\n", - " 0.999985\n", - " 0.000015\n", + " 25\n", + " 0.000091\n", + " 0.999931\n", + " 0.000091\n", " \n", " \n", " 23\n", " 23\n", - " 2\n", - " 0.000007\n", - " 0.999993\n", - " 0.000007\n", + " 12\n", + " 0.000044\n", + " 0.999974\n", + " 0.000044\n", " \n", " \n", " 24\n", " 24\n", - " 1\n", - " 0.000004\n", - " 0.999996\n", - " 0.000004\n", + " 3\n", + " 0.000011\n", + " 0.999985\n", + " 0.000011\n", " \n", " \n", " 25\n", " 25\n", - " 0\n", - " 0.000000\n", - " 0.999996\n", - " 0.000000\n", + " 2\n", + " 0.000007\n", + " 0.999993\n", + " 0.000007\n", " \n", " \n", " 26\n", " 26\n", - " 1\n", - " 0.000004\n", + " 2\n", + " 0.000007\n", " 1.000000\n", - " 0.000004\n", + " 0.000007\n", " \n", " \n", "\n", @@ -4480,33 +4480,33 @@ ], "text/plain": [ " beds freq pct c_pct prob_delay\n", - "0 0 97 0.000354 0.000354 1.000000\n", - "1 1 785 0.002868 0.003222 0.890023\n", - "2 2 2941 0.010743 0.013965 0.769291\n", - "3 3 7843 0.028650 0.042616 0.672296\n", - "4 4 15683 0.057289 0.099905 0.573440\n", - "5 5 25391 0.092753 0.192658 0.481437\n", - "6 6 33962 0.124062 0.316720 0.391710\n", - "7 7 38920 0.142174 0.458893 0.309818\n", - "8 8 38264 0.139777 0.598670 0.233479\n", - "9 9 33892 0.123806 0.722477 0.171364\n", - "10 10 26889 0.098225 0.820701 0.119684\n", - "11 11 19270 0.070393 0.891094 0.078996\n", - "12 12 12706 0.046415 0.937509 0.049508\n", - "13 13 7915 0.028913 0.966422 0.029918\n", - "14 14 4630 0.016913 0.983335 0.017200\n", - "15 15 2407 0.008793 0.992128 0.008862\n", - "16 16 1178 0.004303 0.996431 0.004319\n", - "17 17 552 0.002016 0.998447 0.002020\n", - "18 18 262 0.000957 0.999405 0.000958\n", - "19 19 103 0.000376 0.999781 0.000376\n", - "20 20 35 0.000128 0.999909 0.000128\n", - "21 21 17 0.000062 0.999971 0.000062\n", - "22 22 4 0.000015 0.999985 0.000015\n", - "23 23 2 0.000007 0.999993 0.000007\n", - "24 24 1 0.000004 0.999996 0.000004\n", - "25 25 0 0.000000 0.999996 0.000000\n", - "26 26 1 0.000004 1.000000 0.000004" + "0 0 49 0.000179 0.000179 1.000000\n", + "1 1 398 0.001454 0.001633 0.890380\n", + "2 2 1550 0.005662 0.007295 0.776164\n", + "3 3 4586 0.016753 0.024047 0.696643\n", + "4 4 10088 0.036851 0.060899 0.605123\n", + "5 5 17643 0.064449 0.125348 0.514163\n", + "6 6 26749 0.097713 0.223061 0.438056\n", + "7 7 34016 0.124259 0.347321 0.357766\n", + "8 8 36840 0.134575 0.481896 0.279262\n", + "9 9 35927 0.131240 0.613136 0.214047\n", + "10 10 32005 0.116913 0.730049 0.160144\n", + "11 11 25034 0.091448 0.821498 0.111319\n", + "12 12 18505 0.067598 0.889096 0.076030\n", + "13 13 12523 0.045746 0.934842 0.048935\n", + "14 14 7983 0.029162 0.964004 0.030251\n", + "15 15 4676 0.017081 0.981085 0.017411\n", + "16 16 2550 0.009315 0.990400 0.009405\n", + "17 17 1415 0.005169 0.995569 0.005192\n", + "18 18 644 0.002353 0.997921 0.002357\n", + "19 19 317 0.001158 0.999079 0.001159\n", + "20 20 153 0.000559 0.999638 0.000559\n", + "21 21 55 0.000201 0.999839 0.000201\n", + "22 22 25 0.000091 0.999931 0.000091\n", + "23 23 12 0.000044 0.999974 0.000044\n", + "24 24 3 0.000011 0.999985 0.000011\n", + "25 25 2 0.000007 0.999993 0.000007\n", + "26 26 2 0.000007 1.000000 0.000007" ] }, "metadata": {}, @@ -4571,33 +4571,6 @@ " return full_df" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The scenario results in my table are most similar to those from one bed later in the article...\n", - "\n", - "Example 1:\n", - "\n", - "* My scenario ASU beds 9 = 0.17\n", - "* Article scenario ASU beds 9 = not reported\n", - "* Article scenario ASU beds 10 = 0.16\n", - "\n", - "Example 2:\n", - "\n", - "* My scenario ASU beds 10 = 0.12\n", - "* Article scenario ASU beds 10 = 0.16\n", - "* Article scenario ASU beds 11 = 0.11\n", - "\n", - "Example 3:\n", - "\n", - "* My scenario rehab beds 11 = 0.13\n", - "* Article scenario rehab beds 11 = not reported\n", - "* Article scenario rehab beds 12 = 0.13\n", - "\n", - "TODO: What would we expect? For it to go up or down with this scenario?" - ] - }, { "cell_type": "code", "execution_count": 13, @@ -4636,91 +4609,91 @@ " asu\n", " 9\n", " 0.19\n", - " 0.17\n", + " 0.21\n", " \n", " \n", " 1\n", " asu\n", " 10\n", " 0.14\n", - " 0.12\n", + " 0.16\n", " \n", " \n", " 2\n", " asu\n", " 11\n", " 0.09\n", - " 0.08\n", + " 0.11\n", " \n", " \n", " 3\n", " asu\n", " 12\n", " 0.06\n", - " 0.05\n", + " 0.08\n", " \n", " \n", " 4\n", " asu\n", " 13\n", " 0.04\n", - " 0.03\n", + " 0.05\n", " \n", " \n", " 5\n", " asu\n", " 14\n", " 0.02\n", - " 0.02\n", + " 0.03\n", " \n", " \n", " 6\n", " rehab\n", " 10\n", " 0.20\n", - " 0.18\n", + " 0.23\n", " \n", " \n", " 7\n", " rehab\n", " 11\n", " 0.15\n", - " 0.13\n", + " 0.18\n", " \n", " \n", " 8\n", " rehab\n", " 12\n", " 0.11\n", - " 0.09\n", + " 0.13\n", " \n", " \n", " 9\n", " rehab\n", " 13\n", " 0.08\n", - " 0.06\n", + " 0.09\n", " \n", " \n", " 10\n", " rehab\n", " 14\n", " 0.05\n", - " 0.04\n", + " 0.06\n", " \n", " \n", " 11\n", " rehab\n", " 15\n", " 0.03\n", - " 0.02\n", + " 0.04\n", " \n", " \n", " 12\n", " rehab\n", " 16\n", " 0.02\n", - " 0.01\n", + " 0.03\n", " \n", " \n", "\n", @@ -4728,19 +4701,19 @@ ], "text/plain": [ " unit beds prob_delay_current prob_delay_5\n", - "0 asu 9 0.19 0.17\n", - "1 asu 10 0.14 0.12\n", - "2 asu 11 0.09 0.08\n", - "3 asu 12 0.06 0.05\n", - "4 asu 13 0.04 0.03\n", - "5 asu 14 0.02 0.02\n", - "6 rehab 10 0.20 0.18\n", - "7 rehab 11 0.15 0.13\n", - "8 rehab 12 0.11 0.09\n", - "9 rehab 13 0.08 0.06\n", - "10 rehab 14 0.05 0.04\n", - "11 rehab 15 0.03 0.02\n", - "12 rehab 16 0.02 0.01" + "0 asu 9 0.19 0.21\n", + "1 asu 10 0.14 0.16\n", + "2 asu 11 0.09 0.11\n", + "3 asu 12 0.06 0.08\n", + "4 asu 13 0.04 0.05\n", + "5 asu 14 0.02 0.03\n", + "6 rehab 10 0.20 0.23\n", + "7 rehab 11 0.15 0.18\n", + "8 rehab 12 0.11 0.13\n", + "9 rehab 13 0.08 0.09\n", + "10 rehab 14 0.05 0.06\n", + "11 rehab 15 0.03 0.04\n", + "12 rehab 16 0.02 0.03" ] }, "execution_count": 13, @@ -4805,35 +4778,35 @@ " asu\n", " 10\n", " 0.14\n", - " 0.12\n", + " 0.16\n", " \n", " \n", " 2\n", " asu\n", " 11\n", " 0.09\n", - " 0.08\n", + " 0.11\n", " \n", " \n", " 3\n", " asu\n", " 12\n", " 0.06\n", - " 0.05\n", + " 0.08\n", " \n", " \n", " 4\n", " asu\n", " 13\n", " 0.04\n", - " 0.03\n", + " 0.05\n", " \n", " \n", " 5\n", " asu\n", " 14\n", " 0.02\n", - " 0.02\n", + " 0.03\n", " \n", " \n", " 6\n", @@ -4847,35 +4820,35 @@ " rehab\n", " 12\n", " 0.11\n", - " 0.09\n", + " 0.13\n", " \n", " \n", " 9\n", " rehab\n", " 13\n", " 0.08\n", - " 0.06\n", + " 0.09\n", " \n", " \n", " 10\n", " rehab\n", " 14\n", " 0.05\n", - " 0.04\n", + " 0.06\n", " \n", " \n", " 11\n", " rehab\n", " 15\n", " 0.03\n", - " 0.02\n", + " 0.04\n", " \n", " \n", " 12\n", " rehab\n", " 16\n", " 0.02\n", - " 0.01\n", + " 0.03\n", " \n", " \n", "\n", @@ -4884,22 +4857,21 @@ "text/plain": [ " unit beds prob_delay_current prob_delay_5\n", "0 asu 9 0.19 NaN\n", - "1 asu 10 0.14 0.12\n", - "2 asu 11 0.09 0.08\n", - "3 asu 12 0.06 0.05\n", - "4 asu 13 0.04 0.03\n", - "5 asu 14 0.02 0.02\n", + "1 asu 10 0.14 0.16\n", + "2 asu 11 0.09 0.11\n", + "3 asu 12 0.06 0.08\n", + "4 asu 13 0.04 0.05\n", + "5 asu 14 0.02 0.03\n", "6 rehab 10 0.20 NaN\n", - "8 rehab 12 0.11 0.09\n", - "9 rehab 13 0.08 0.06\n", - "10 rehab 14 0.05 0.04\n", - "11 rehab 15 0.03 0.02\n", - "12 rehab 16 0.02 0.01" + "8 rehab 12 0.11 0.13\n", + "9 rehab 13 0.08 0.09\n", + "10 rehab 14 0.05 0.06\n", + "11 rehab 15 0.03 0.04\n", + "12 rehab 16 0.02 0.03" ] }, - "execution_count": 14, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ @@ -4919,7 +4891,9 @@ "adj_full_tab_2 = adj_full_tab_2[\n", " ~((adj_full_tab_2[\"unit\"] == \"rehab\") & (adj_full_tab_2[\"beds\"] == 11))]\n", "\n", - "adj_full_tab_2" + "# Display and save to csv\n", + "display(adj_full_tab_2)\n", + "adj_full_tab_2.to_csv(os.path.join(OUTPUT_DIR, \"delay_s1.csv\"), index=False)" ] } ], diff --git a/outputs/delay_s1.csv b/outputs/delay_s1.csv new file mode 100644 index 0000000..9101344 --- /dev/null +++ b/outputs/delay_s1.csv @@ -0,0 +1,13 @@ +unit,beds,prob_delay_current,prob_delay_5 +asu,9,0.19, +asu,10,0.14,0.16 +asu,11,0.09,0.11 +asu,12,0.06,0.08 +asu,13,0.04,0.05 +asu,14,0.02,0.03 +rehab,10,0.2, +rehab,12,0.11,0.13 +rehab,13,0.08,0.09 +rehab,14,0.05,0.06 +rehab,15,0.03,0.04 +rehab,16,0.02,0.03 From dd55b6f7a61dfedfd0a80b389c0cc68afed591e3 Mon Sep 17 00:00:00 2001 From: amyheather Date: Tue, 8 Apr 2025 16:45:09 +0100 Subject: [PATCH 06/24] feat(analysis): add 1 in n patients delayed to table for scenario 1, and add scenario 4 run --- notebooks/analysis.ipynb | 815 +++++++++------------------------------ outputs/delay_s1.csv | 26 +- 2 files changed, 198 insertions(+), 643 deletions(-) diff --git a/notebooks/analysis.ipynb b/notebooks/analysis.ipynb index 6fa3450..19a038f 100644 --- a/notebooks/analysis.ipynb +++ b/notebooks/analysis.ipynb @@ -16,7 +16,9 @@ " * Run the model\n", " * Figure 1\n", " * Figure 3\n", - "* Scenario analysis" + "* Scenario analysis\n", + " * Scenario 1\n", + " * Table 2" ] }, { @@ -3901,8 +3903,8 @@ "\n", "# Apply 5% increase to inter-arrival parameters\n", "s1_param = Param(\n", - " ASUArrivals(**alter_by_5_percent(vars(ASUArrivals()))),\n", - " RehabArrivals(**alter_by_5_percent(vars(RehabArrivals()))),\n", + " asu_arrivals=ASUArrivals(**alter_by_5_percent(vars(ASUArrivals()))),\n", + " rehab_arrivals=RehabArrivals(**alter_by_5_percent(vars(RehabArrivals()))),\n", " cores=9\n", ")\n", "\n", @@ -3936,593 +3938,6 @@ "cell_type": "code", "execution_count": 11, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
bedsfreqpctc_pctprob_delay
00670.0002450.0002451.000000
115700.0020820.0023270.894819
2221420.0078250.0101520.770781
3360860.0222320.0323840.686520
44126000.0460270.0784110.587002
55215330.0786590.1570700.500791
66303440.1108460.2679160.413733
77367990.1344260.4023420.334108
88380710.1390720.5414140.256869
99354920.1296510.6710650.193202
1010294590.1076130.7786780.138199
1111223440.0816220.8603000.094876
1212154160.0563140.9166140.061437
1313100510.0367160.9533300.038513
141459660.0217940.9751230.022350
151534240.0125080.9876310.012664
161617520.0064000.9940310.006438
17179070.0033130.9973440.003322
18184230.0015450.9988890.001547
19191760.0006430.9995320.000643
2020710.0002590.9997920.000259
2121360.0001320.9999230.000132
2222130.0000470.9999710.000047
232340.0000150.9999850.000015
242420.0000070.9999930.000007
252510.0000040.9999960.000004
262600.0000000.9999960.000000
272710.0000041.0000000.000004
\n", - "
" - ], - "text/plain": [ - " beds freq pct c_pct prob_delay\n", - "0 0 67 0.000245 0.000245 1.000000\n", - "1 1 570 0.002082 0.002327 0.894819\n", - "2 2 2142 0.007825 0.010152 0.770781\n", - "3 3 6086 0.022232 0.032384 0.686520\n", - "4 4 12600 0.046027 0.078411 0.587002\n", - "5 5 21533 0.078659 0.157070 0.500791\n", - "6 6 30344 0.110846 0.267916 0.413733\n", - "7 7 36799 0.134426 0.402342 0.334108\n", - "8 8 38071 0.139072 0.541414 0.256869\n", - "9 9 35492 0.129651 0.671065 0.193202\n", - "10 10 29459 0.107613 0.778678 0.138199\n", - "11 11 22344 0.081622 0.860300 0.094876\n", - "12 12 15416 0.056314 0.916614 0.061437\n", - "13 13 10051 0.036716 0.953330 0.038513\n", - "14 14 5966 0.021794 0.975123 0.022350\n", - "15 15 3424 0.012508 0.987631 0.012664\n", - "16 16 1752 0.006400 0.994031 0.006438\n", - "17 17 907 0.003313 0.997344 0.003322\n", - "18 18 423 0.001545 0.998889 0.001547\n", - "19 19 176 0.000643 0.999532 0.000643\n", - "20 20 71 0.000259 0.999792 0.000259\n", - "21 21 36 0.000132 0.999923 0.000132\n", - "22 22 13 0.000047 0.999971 0.000047\n", - "23 23 4 0.000015 0.999985 0.000015\n", - "24 24 2 0.000007 0.999993 0.000007\n", - "25 25 1 0.000004 0.999996 0.000004\n", - "26 26 0 0.000000 0.999996 0.000000\n", - "27 27 1 0.000004 1.000000 0.000004" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
bedsfreqpctc_pctprob_delay
00490.0001790.0001791.000000
113980.0014540.0016330.890380
2215500.0056620.0072950.776164
3345860.0167530.0240470.696643
44100880.0368510.0608990.605123
55176430.0644490.1253480.514163
66267490.0977130.2230610.438056
77340160.1242590.3473210.357766
88368400.1345750.4818960.279262
99359270.1312400.6131360.214047
1010320050.1169130.7300490.160144
1111250340.0914480.8214980.111319
1212185050.0675980.8890960.076030
1313125230.0457460.9348420.048935
141479830.0291620.9640040.030251
151546760.0170810.9810850.017411
161625500.0093150.9904000.009405
171714150.0051690.9955690.005192
18186440.0023530.9979210.002357
19193170.0011580.9990790.001159
20201530.0005590.9996380.000559
2121550.0002010.9998390.000201
2222250.0000910.9999310.000091
2323120.0000440.9999740.000044
242430.0000110.9999850.000011
252520.0000070.9999930.000007
262620.0000071.0000000.000007
\n", - "
" - ], - "text/plain": [ - " beds freq pct c_pct prob_delay\n", - "0 0 49 0.000179 0.000179 1.000000\n", - "1 1 398 0.001454 0.001633 0.890380\n", - "2 2 1550 0.005662 0.007295 0.776164\n", - "3 3 4586 0.016753 0.024047 0.696643\n", - "4 4 10088 0.036851 0.060899 0.605123\n", - "5 5 17643 0.064449 0.125348 0.514163\n", - "6 6 26749 0.097713 0.223061 0.438056\n", - "7 7 34016 0.124259 0.347321 0.357766\n", - "8 8 36840 0.134575 0.481896 0.279262\n", - "9 9 35927 0.131240 0.613136 0.214047\n", - "10 10 32005 0.116913 0.730049 0.160144\n", - "11 11 25034 0.091448 0.821498 0.111319\n", - "12 12 18505 0.067598 0.889096 0.076030\n", - "13 13 12523 0.045746 0.934842 0.048935\n", - "14 14 7983 0.029162 0.964004 0.030251\n", - "15 15 4676 0.017081 0.981085 0.017411\n", - "16 16 2550 0.009315 0.990400 0.009405\n", - "17 17 1415 0.005169 0.995569 0.005192\n", - "18 18 644 0.002353 0.997921 0.002357\n", - "19 19 317 0.001158 0.999079 0.001159\n", - "20 20 153 0.000559 0.999638 0.000559\n", - "21 21 55 0.000201 0.999839 0.000201\n", - "22 22 25 0.000091 0.999931 0.000091\n", - "23 23 12 0.000044 0.999974 0.000044\n", - "24 24 3 0.000011 0.999985 0.000011\n", - "25 25 2 0.000007 0.999993 0.000007\n", - "26 26 2 0.000007 1.000000 0.000007" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# View the full results from the base and scenario for the ASU\n", - "display(base_overall[\"asu\"])\n", - "display(s1_overall[\"asu\"])" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, "outputs": [], "source": [ "def make_table2_segment(unit, filter_beds):\n", @@ -4543,13 +3958,13 @@ " Results from base case and scenario side-by-side.\n", " \"\"\"\n", " # Get the overall results for base and scenario 1\n", - " tab2_dict = {\"prob_delay_current\": base_overall[unit],\n", - " \"prob_delay_5\": s1_overall[unit]}\n", + " tab2_dict = {\"current\": base_overall[unit],\n", + " \"5%\": s1_overall[unit]}\n", "\n", " # Create list to store modified dataframes\n", " tab2_list = []\n", "\n", - " for prob_name, df in tab2_dict.items():\n", + " for scenario_name, df in tab2_dict.items():\n", "\n", " # Extract results for specified beds\n", " df = df[df[\"beds\"].isin(filter_beds)][[\"beds\", \"prob_delay\"]]\n", @@ -4557,9 +3972,14 @@ " # Round probability of delay to 2 d.p.\n", " df[\"prob_delay\"] = round(df[\"prob_delay\"], 2)\n", "\n", + " # Add column with calculation of 1 in every n patients delayed\n", + " df[f\"1_in_n_delay_{scenario_name}\"] = (\n", + " round(1 / df[\"prob_delay\"]).astype(int))\n", + "\n", " # Rename column to be specific to scenario\n", - " df = df.rename(columns={\"prob_delay\": prob_name})\n", + " df = df.rename(columns={\"prob_delay\": f\"prob_delay_{scenario_name}\"})\n", "\n", + " # Save dataframe to list\n", " tab2_list.append(df)\n", "\n", " # Combine into single dataframe\n", @@ -4573,7 +3993,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -4600,7 +4020,9 @@ " unit\n", " beds\n", " prob_delay_current\n", - " prob_delay_5\n", + " 1_in_n_delay_current\n", + " prob_delay_5%\n", + " 1_in_n_delay_5%\n", " \n", " \n", " \n", @@ -4609,114 +4031,155 @@ " asu\n", " 9\n", " 0.19\n", + " 5\n", " 0.21\n", + " 5\n", " \n", " \n", " 1\n", " asu\n", " 10\n", " 0.14\n", + " 7\n", " 0.16\n", + " 6\n", " \n", " \n", " 2\n", " asu\n", " 11\n", " 0.09\n", + " 11\n", " 0.11\n", + " 9\n", " \n", " \n", " 3\n", " asu\n", " 12\n", " 0.06\n", + " 17\n", " 0.08\n", + " 12\n", " \n", " \n", " 4\n", " asu\n", " 13\n", " 0.04\n", + " 25\n", " 0.05\n", + " 20\n", " \n", " \n", " 5\n", " asu\n", " 14\n", " 0.02\n", + " 50\n", " 0.03\n", + " 33\n", " \n", " \n", " 6\n", " rehab\n", " 10\n", " 0.20\n", + " 5\n", " 0.23\n", + " 4\n", " \n", " \n", " 7\n", " rehab\n", " 11\n", " 0.15\n", + " 7\n", " 0.18\n", + " 6\n", " \n", " \n", " 8\n", " rehab\n", " 12\n", " 0.11\n", + " 9\n", " 0.13\n", + " 8\n", " \n", " \n", " 9\n", " rehab\n", " 13\n", " 0.08\n", + " 12\n", " 0.09\n", + " 11\n", " \n", " \n", " 10\n", " rehab\n", " 14\n", " 0.05\n", + " 20\n", " 0.06\n", + " 17\n", " \n", " \n", " 11\n", " rehab\n", " 15\n", " 0.03\n", + " 33\n", " 0.04\n", + " 25\n", " \n", " \n", " 12\n", " rehab\n", " 16\n", " 0.02\n", + " 50\n", " 0.03\n", + " 33\n", " \n", " \n", "\n", "" ], "text/plain": [ - " unit beds prob_delay_current prob_delay_5\n", - "0 asu 9 0.19 0.21\n", - "1 asu 10 0.14 0.16\n", - "2 asu 11 0.09 0.11\n", - "3 asu 12 0.06 0.08\n", - "4 asu 13 0.04 0.05\n", - "5 asu 14 0.02 0.03\n", - "6 rehab 10 0.20 0.23\n", - "7 rehab 11 0.15 0.18\n", - "8 rehab 12 0.11 0.13\n", - "9 rehab 13 0.08 0.09\n", - "10 rehab 14 0.05 0.06\n", - "11 rehab 15 0.03 0.04\n", - "12 rehab 16 0.02 0.03" + " unit beds prob_delay_current 1_in_n_delay_current prob_delay_5% \\\n", + "0 asu 9 0.19 5 0.21 \n", + "1 asu 10 0.14 7 0.16 \n", + "2 asu 11 0.09 11 0.11 \n", + "3 asu 12 0.06 17 0.08 \n", + "4 asu 13 0.04 25 0.05 \n", + "5 asu 14 0.02 50 0.03 \n", + "6 rehab 10 0.20 5 0.23 \n", + "7 rehab 11 0.15 7 0.18 \n", + "8 rehab 12 0.11 9 0.13 \n", + "9 rehab 13 0.08 12 0.09 \n", + "10 rehab 14 0.05 20 0.06 \n", + "11 rehab 15 0.03 33 0.04 \n", + "12 rehab 16 0.02 50 0.03 \n", + "\n", + " 1_in_n_delay_5% \n", + "0 5 \n", + "1 6 \n", + "2 9 \n", + "3 12 \n", + "4 20 \n", + "5 33 \n", + "6 4 \n", + "7 6 \n", + "8 8 \n", + "9 11 \n", + "10 17 \n", + "11 25 \n", + "12 33 " ] }, - "execution_count": 13, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -4733,9 +4196,20 @@ "full_tab2" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "These are some adjustments to how table is presented in article...\n", + "\n", + "(hiding / dropping some results)\n", + "\n", + "The 1 in n delay columns are int columns rounded to 1 d.p., but python doesn't allow NaN in an int column, so they display as floats below." + ] + }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -4762,7 +4236,9 @@ " unit\n", " beds\n", " prob_delay_current\n", - " prob_delay_5\n", + " 1_in_n_delay_current\n", + " prob_delay_5%\n", + " 1_in_n_delay_5%\n", " \n", " \n", " \n", @@ -4771,6 +4247,8 @@ " asu\n", " 9\n", " 0.19\n", + " 5\n", + " NaN\n", " NaN\n", " \n", " \n", @@ -4778,41 +4256,53 @@ " asu\n", " 10\n", " 0.14\n", + " 7\n", " 0.16\n", + " 6.0\n", " \n", " \n", " 2\n", " asu\n", " 11\n", " 0.09\n", + " 11\n", " 0.11\n", + " 9.0\n", " \n", " \n", " 3\n", " asu\n", " 12\n", " 0.06\n", + " 17\n", " 0.08\n", + " 12.0\n", " \n", " \n", " 4\n", " asu\n", " 13\n", " 0.04\n", + " 25\n", " 0.05\n", + " 20.0\n", " \n", " \n", " 5\n", " asu\n", " 14\n", " 0.02\n", + " 50\n", " 0.03\n", + " 33.0\n", " \n", " \n", " 6\n", " rehab\n", " 10\n", " 0.20\n", + " 5\n", + " NaN\n", " NaN\n", " \n", " \n", @@ -4820,54 +4310,78 @@ " rehab\n", " 12\n", " 0.11\n", + " 9\n", " 0.13\n", + " 8.0\n", " \n", " \n", " 9\n", " rehab\n", " 13\n", " 0.08\n", + " 12\n", " 0.09\n", + " 11.0\n", " \n", " \n", " 10\n", " rehab\n", " 14\n", " 0.05\n", + " 20\n", " 0.06\n", + " 17.0\n", " \n", " \n", " 11\n", " rehab\n", " 15\n", " 0.03\n", + " 33\n", " 0.04\n", + " 25.0\n", " \n", " \n", " 12\n", " rehab\n", " 16\n", " 0.02\n", + " 50\n", " 0.03\n", + " 33.0\n", " \n", " \n", "\n", "" ], "text/plain": [ - " unit beds prob_delay_current prob_delay_5\n", - "0 asu 9 0.19 NaN\n", - "1 asu 10 0.14 0.16\n", - "2 asu 11 0.09 0.11\n", - "3 asu 12 0.06 0.08\n", - "4 asu 13 0.04 0.05\n", - "5 asu 14 0.02 0.03\n", - "6 rehab 10 0.20 NaN\n", - "8 rehab 12 0.11 0.13\n", - "9 rehab 13 0.08 0.09\n", - "10 rehab 14 0.05 0.06\n", - "11 rehab 15 0.03 0.04\n", - "12 rehab 16 0.02 0.03" + " unit beds prob_delay_current 1_in_n_delay_current prob_delay_5% \\\n", + "0 asu 9 0.19 5 NaN \n", + "1 asu 10 0.14 7 0.16 \n", + "2 asu 11 0.09 11 0.11 \n", + "3 asu 12 0.06 17 0.08 \n", + "4 asu 13 0.04 25 0.05 \n", + "5 asu 14 0.02 50 0.03 \n", + "6 rehab 10 0.20 5 NaN \n", + "8 rehab 12 0.11 9 0.13 \n", + "9 rehab 13 0.08 12 0.09 \n", + "10 rehab 14 0.05 20 0.06 \n", + "11 rehab 15 0.03 33 0.04 \n", + "12 rehab 16 0.02 50 0.03 \n", + "\n", + " 1_in_n_delay_5% \n", + "0 NaN \n", + "1 6.0 \n", + "2 9.0 \n", + "3 12.0 \n", + "4 20.0 \n", + "5 33.0 \n", + "6 NaN \n", + "8 8.0 \n", + "9 11.0 \n", + "10 17.0 \n", + "11 25.0 \n", + "12 33.0 " ] }, "metadata": {}, @@ -4875,17 +4389,15 @@ } ], "source": [ - "# These are some adjustments to how table is presented in article...\n", - "\n", "adj_full_tab_2 = full_tab2.copy()\n", "\n", "# Drop the result for ASU beds 9 and rehab beds 10 for the scenario\n", "adj_full_tab_2.loc[(adj_full_tab_2[\"unit\"] == \"asu\") &\n", " (adj_full_tab_2[\"beds\"] == 9),\n", - " \"prob_delay_5\"] = None\n", + " [\"prob_delay_5%\", \"1_in_n_delay_5%\"]] = None\n", "adj_full_tab_2.loc[(adj_full_tab_2[\"unit\"] == \"rehab\") &\n", " (adj_full_tab_2[\"beds\"] == 10),\n", - " \"prob_delay_5\"] = None\n", + " [\"prob_delay_5%\", \"1_in_n_delay_5%\"]] = None\n", "\n", "# Drop the result for rehab 11 beds\n", "adj_full_tab_2 = adj_full_tab_2[\n", @@ -4895,6 +4407,49 @@ "display(adj_full_tab_2)\n", "adj_full_tab_2.to_csv(os.path.join(OUTPUT_DIR, \"delay_s1.csv\"), index=False)" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Scenario 4\n", + "\n", + "**No complex-neurological cases.** Complex neurological patients are excluded from the pathway in order to assess their impact on bed requirements." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# Set IAT very high, essentially meaning that we have no neuro arrivals\n", + "s4_param = Param(\n", + " asu_arrivals=ASUArrivals(neuro = 10_000_000_000),\n", + " rehab_arrivals=RehabArrivals(neuro=10_000_000_000),\n", + " cores=9\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "# Run the model for 150 replications\n", + "runner = Runner(param=s4_param)\n", + "s4_reps, s4_overall = runner.run_reps()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Supplementary table 1\n", + "\n", + "**Supplementary Table 1.** Likelihood of delay. Current admissions versus No Complex neurological patients." + ] } ], "metadata": { diff --git a/outputs/delay_s1.csv b/outputs/delay_s1.csv index 9101344..36a74fc 100644 --- a/outputs/delay_s1.csv +++ b/outputs/delay_s1.csv @@ -1,13 +1,13 @@ -unit,beds,prob_delay_current,prob_delay_5 -asu,9,0.19, -asu,10,0.14,0.16 -asu,11,0.09,0.11 -asu,12,0.06,0.08 -asu,13,0.04,0.05 -asu,14,0.02,0.03 -rehab,10,0.2, -rehab,12,0.11,0.13 -rehab,13,0.08,0.09 -rehab,14,0.05,0.06 -rehab,15,0.03,0.04 -rehab,16,0.02,0.03 +unit,beds,prob_delay_current,1_in_n_delay_current,prob_delay_5%,1_in_n_delay_5% +asu,9,0.19,5,, +asu,10,0.14,7,0.16,6.0 +asu,11,0.09,11,0.11,9.0 +asu,12,0.06,17,0.08,12.0 +asu,13,0.04,25,0.05,20.0 +asu,14,0.02,50,0.03,33.0 +rehab,10,0.2,5,, +rehab,12,0.11,9,0.13,8.0 +rehab,13,0.08,12,0.09,11.0 +rehab,14,0.05,20,0.06,17.0 +rehab,15,0.03,33,0.04,25.0 +rehab,16,0.02,50,0.03,33.0 From caf734209072fbebcbb0d5ff91633f0b72d06377 Mon Sep 17 00:00:00 2001 From: amyheather Date: Wed, 9 Apr 2025 09:58:12 +0100 Subject: [PATCH 07/24] feat(analysis): add supp table 1, adjusting make_table2_segment -> make_delay_table so it can be used for both - and adjusted it so it calculates 1 in n delay from raw prob delay, not rounded --- notebooks/analysis.ipynb | 361 ++++++++++++++---- outputs/{delay_s1.csv => delay_scenario1.csv} | 14 +- outputs/delay_scenario4.csv | 12 + 3 files changed, 296 insertions(+), 91 deletions(-) rename outputs/{delay_s1.csv => delay_scenario1.csv} (50%) create mode 100644 outputs/delay_scenario4.csv diff --git a/notebooks/analysis.ipynb b/notebooks/analysis.ipynb index 19a038f..153d824 100644 --- a/notebooks/analysis.ipynb +++ b/notebooks/analysis.ipynb @@ -3940,55 +3940,72 @@ "metadata": {}, "outputs": [], "source": [ - "def make_table2_segment(unit, filter_beds):\n", + "def make_delay_table(\n", + " scenario, scenario_name, base=base_overall, base_name=\"current\",\n", + " asu_beds=list(range(9,15)), rehab_beds=list(range(10,17))\n", + " ):\n", " \"\"\"\n", - " Make segment of Table 2 for either the acute stroke unit (\"asu\") or\n", - " rehabilitation unit (\"rehab\").\n", + " Create table with the probability of delay and 1 in n patients delayed,\n", + " for the base case and a provided scenario.\n", "\n", " Parameters\n", " ----------\n", - " unit: str\n", - " Name of unit to extract results for (\"asu\", \"rehab\").\n", - " filter_beds: list\n", - " List of bed numbers to get results for.\n", - "\n", - " Returns\n", - " -------\n", - " full_df: pd.DataFrame\n", - " Results from base case and scenario side-by-side.\n", + " scenario: dict\n", + " Dictionary containing two dataframes: \"asu\" and \"rehab\". These contain\n", + " the overall results from a scenario run of the simulation.\n", + " scenario_name: str\n", + " Name for scenario to use in table labels.\n", + " base: dict\n", + " Dictionary containing two dataframes: \"asu\" and \"rehab\". These contain\n", + " the overall results from the base case run of the simulation.\n", + " base_name: str\n", + " Name for base case to use in table labels.\n", + " asu_beds: list\n", + " List of acute stroke unit (ASU) bed numbers to get results for.\n", + " rehab_beds: list\n", + " List of rehabilitation unit bed numbers to get results for.\n", " \"\"\"\n", - " # Get the overall results for base and scenario 1\n", - " tab2_dict = {\"current\": base_overall[unit],\n", - " \"5%\": s1_overall[unit]}\n", + " # Create list to store the ASU and rehab dataframes\n", + " tab_full = []\n", "\n", - " # Create list to store modified dataframes\n", - " tab2_list = []\n", + " # Loop over ASU and rehab units...\n", + " for unit_name, unit_beds in {\"asu\": asu_beds, \"rehab\": rehab_beds}.items():\n", "\n", - " for scenario_name, df in tab2_dict.items():\n", + " # Create list to store base case and scenario dataframes\n", + " tab_segment = []\n", "\n", - " # Extract results for specified beds\n", - " df = df[df[\"beds\"].isin(filter_beds)][[\"beds\", \"prob_delay\"]]\n", + " # Loop over base case and scenario...\n", + " for scenario_name, df in {base_name: base[unit_name],\n", + " scenario_name: scenario[unit_name]}.items():\n", "\n", - " # Round probability of delay to 2 d.p.\n", - " df[\"prob_delay\"] = round(df[\"prob_delay\"], 2)\n", + " # Extract results for specified beds\n", + " df = df[df[\"beds\"].isin(unit_beds)][[\"beds\", \"prob_delay\"]]\n", "\n", - " # Add column with calculation of 1 in every n patients delayed\n", - " df[f\"1_in_n_delay_{scenario_name}\"] = (\n", - " round(1 / df[\"prob_delay\"]).astype(int))\n", + " # Add column with calculation of 1 in every n patients delayed\n", + " df[f\"1_in_n_delay_{scenario_name}\"] = (\n", + " round(1 / df[\"prob_delay\"])).astype(int)\n", "\n", - " # Rename column to be specific to scenario\n", - " df = df.rename(columns={\"prob_delay\": f\"prob_delay_{scenario_name}\"})\n", + " # Round probability of delay to 2 d.p.\n", + " df[\"prob_delay\"] = round(df[\"prob_delay\"], 2)\n", "\n", - " # Save dataframe to list\n", - " tab2_list.append(df)\n", + " # Rename column to be specific to scenario\n", + " df = df.rename(columns={\n", + " \"prob_delay\": f\"prob_delay_{scenario_name}\"})\n", + "\n", + " # Save dataframe to list\n", + " tab_segment.append(df)\n", + "\n", + " # Combine into single dataframe\n", + " full_df = pd.merge(tab_segment[0], tab_segment[1], on=\"beds\")\n", "\n", - " # Combine into single dataframe\n", - " full_df = pd.merge(tab2_list[0], tab2_list[1], on=\"beds\")\n", + " # Add column with unit name\n", + " full_df.insert(0, \"unit\", unit_name)\n", "\n", - " # Add column with unit name\n", - " full_df.insert(0, \"unit\", unit)\n", + " # Save dataframe to list\n", + " tab_full.append(full_df)\n", "\n", - " return full_df" + " # Combine into a single table\n", + " return pd.concat(tab_full).reset_index(drop=True)" ] }, { @@ -4058,16 +4075,16 @@ " asu\n", " 12\n", " 0.06\n", - " 17\n", + " 16\n", " 0.08\n", - " 12\n", + " 13\n", " \n", " \n", " 4\n", " asu\n", " 13\n", " 0.04\n", - " 25\n", + " 26\n", " 0.05\n", " 20\n", " \n", @@ -4076,7 +4093,7 @@ " asu\n", " 14\n", " 0.02\n", - " 50\n", + " 45\n", " 0.03\n", " 33\n", " \n", @@ -4112,7 +4129,7 @@ " rehab\n", " 13\n", " 0.08\n", - " 12\n", + " 13\n", " 0.09\n", " 11\n", " \n", @@ -4123,25 +4140,25 @@ " 0.05\n", " 20\n", " 0.06\n", - " 17\n", + " 15\n", " \n", " \n", " 11\n", " rehab\n", " 15\n", " 0.03\n", - " 33\n", + " 31\n", " 0.04\n", - " 25\n", + " 23\n", " \n", " \n", " 12\n", " rehab\n", " 16\n", " 0.02\n", - " 50\n", + " 52\n", " 0.03\n", - " 33\n", + " 37\n", " \n", " \n", "\n", @@ -4152,31 +4169,31 @@ "0 asu 9 0.19 5 0.21 \n", "1 asu 10 0.14 7 0.16 \n", "2 asu 11 0.09 11 0.11 \n", - "3 asu 12 0.06 17 0.08 \n", - "4 asu 13 0.04 25 0.05 \n", - "5 asu 14 0.02 50 0.03 \n", + "3 asu 12 0.06 16 0.08 \n", + "4 asu 13 0.04 26 0.05 \n", + "5 asu 14 0.02 45 0.03 \n", "6 rehab 10 0.20 5 0.23 \n", "7 rehab 11 0.15 7 0.18 \n", "8 rehab 12 0.11 9 0.13 \n", - "9 rehab 13 0.08 12 0.09 \n", + "9 rehab 13 0.08 13 0.09 \n", "10 rehab 14 0.05 20 0.06 \n", - "11 rehab 15 0.03 33 0.04 \n", - "12 rehab 16 0.02 50 0.03 \n", + "11 rehab 15 0.03 31 0.04 \n", + "12 rehab 16 0.02 52 0.03 \n", "\n", " 1_in_n_delay_5% \n", "0 5 \n", "1 6 \n", "2 9 \n", - "3 12 \n", + "3 13 \n", "4 20 \n", "5 33 \n", "6 4 \n", "7 6 \n", "8 8 \n", "9 11 \n", - "10 17 \n", - "11 25 \n", - "12 33 " + "10 15 \n", + "11 23 \n", + "12 37 " ] }, "execution_count": 12, @@ -4185,14 +4202,7 @@ } ], "source": [ - "# Acute stroke unit: 9 to 14 beds\n", - "tab2_asu = make_table2_segment(unit=\"asu\", filter_beds=list(range(9,15)))\n", - "\n", - "# Rehab unit: 10 to 16 beds, excluding 11 (we do this later, so can still see)\n", - "tab2_rehab = make_table2_segment(unit=\"rehab\", filter_beds=list(range(10,17)))\n", - "\n", - "# Combine into a single table\n", - "full_tab2 = pd.concat([tab2_asu, tab2_rehab]).reset_index(drop=True)\n", + "full_tab2 = make_delay_table(scenario=s1_overall, scenario_name=\"5%\")\n", "full_tab2" ] }, @@ -4204,7 +4214,7 @@ "\n", "(hiding / dropping some results)\n", "\n", - "The 1 in n delay columns are int columns rounded to 1 d.p., but python doesn't allow NaN in an int column, so they display as floats below." + "The 1 in n delay columns are **rounded to the nearest whole number**, but python doesn't allow NaN or Inf in an int column, so they provided as floats." ] }, { @@ -4274,16 +4284,16 @@ " asu\n", " 12\n", " 0.06\n", - " 17\n", + " 16\n", " 0.08\n", - " 12.0\n", + " 13.0\n", " \n", " \n", " 4\n", " asu\n", " 13\n", " 0.04\n", - " 25\n", + " 26\n", " 0.05\n", " 20.0\n", " \n", @@ -4292,7 +4302,7 @@ " asu\n", " 14\n", " 0.02\n", - " 50\n", + " 45\n", " 0.03\n", " 33.0\n", " \n", @@ -4319,7 +4329,7 @@ " rehab\n", " 13\n", " 0.08\n", - " 12\n", + " 13\n", " 0.09\n", " 11.0\n", " \n", @@ -4330,25 +4340,25 @@ " 0.05\n", " 20\n", " 0.06\n", - " 17.0\n", + " 15.0\n", " \n", " \n", " 11\n", " rehab\n", " 15\n", " 0.03\n", - " 33\n", + " 31\n", " 0.04\n", - " 25.0\n", + " 23.0\n", " \n", " \n", " 12\n", " rehab\n", " 16\n", " 0.02\n", - " 50\n", + " 52\n", " 0.03\n", - " 33.0\n", + " 37.0\n", " \n", " \n", "\n", @@ -4359,29 +4369,29 @@ "0 asu 9 0.19 5 NaN \n", "1 asu 10 0.14 7 0.16 \n", "2 asu 11 0.09 11 0.11 \n", - "3 asu 12 0.06 17 0.08 \n", - "4 asu 13 0.04 25 0.05 \n", - "5 asu 14 0.02 50 0.03 \n", + "3 asu 12 0.06 16 0.08 \n", + "4 asu 13 0.04 26 0.05 \n", + "5 asu 14 0.02 45 0.03 \n", "6 rehab 10 0.20 5 NaN \n", "8 rehab 12 0.11 9 0.13 \n", - "9 rehab 13 0.08 12 0.09 \n", + "9 rehab 13 0.08 13 0.09 \n", "10 rehab 14 0.05 20 0.06 \n", - "11 rehab 15 0.03 33 0.04 \n", - "12 rehab 16 0.02 50 0.03 \n", + "11 rehab 15 0.03 31 0.04 \n", + "12 rehab 16 0.02 52 0.03 \n", "\n", " 1_in_n_delay_5% \n", "0 NaN \n", "1 6.0 \n", "2 9.0 \n", - "3 12.0 \n", + "3 13.0 \n", "4 20.0 \n", "5 33.0 \n", "6 NaN \n", "8 8.0 \n", "9 11.0 \n", - "10 17.0 \n", - "11 25.0 \n", - "12 33.0 " + "10 15.0 \n", + "11 23.0 \n", + "12 37.0 " ] }, "metadata": {}, @@ -4405,7 +4415,8 @@ "\n", "# Display and save to csv\n", "display(adj_full_tab_2)\n", - "adj_full_tab_2.to_csv(os.path.join(OUTPUT_DIR, \"delay_s1.csv\"), index=False)" + "adj_full_tab_2.to_csv(\n", + " os.path.join(OUTPUT_DIR, \"delay_scenario1.csv\"), index=False)" ] }, { @@ -4450,6 +4461,188 @@ "\n", "**Supplementary Table 1.** Likelihood of delay. Current admissions versus No Complex neurological patients." ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
unitbedsprob_delay_current1_in_n_delay_currentprob_delay_no_complex_neuro1_in_n_delay_no_complex_neuro
0asu100.1470.0911
1asu110.09110.0618
2asu120.06160.0331
3asu130.04260.0255
4asu140.02450.01111
5asu150.01790.00225
6rehab120.1190.0520
7rehab130.08130.0332
8rehab140.05200.0257
9rehab150.03310.01101
10rehab160.02520.00212
\n", + "
" + ], + "text/plain": [ + " unit beds prob_delay_current 1_in_n_delay_current \\\n", + "0 asu 10 0.14 7 \n", + "1 asu 11 0.09 11 \n", + "2 asu 12 0.06 16 \n", + "3 asu 13 0.04 26 \n", + "4 asu 14 0.02 45 \n", + "5 asu 15 0.01 79 \n", + "6 rehab 12 0.11 9 \n", + "7 rehab 13 0.08 13 \n", + "8 rehab 14 0.05 20 \n", + "9 rehab 15 0.03 31 \n", + "10 rehab 16 0.02 52 \n", + "\n", + " prob_delay_no_complex_neuro 1_in_n_delay_no_complex_neuro \n", + "0 0.09 11 \n", + "1 0.06 18 \n", + "2 0.03 31 \n", + "3 0.02 55 \n", + "4 0.01 111 \n", + "5 0.00 225 \n", + "6 0.05 20 \n", + "7 0.03 32 \n", + "8 0.02 57 \n", + "9 0.01 101 \n", + "10 0.00 212 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Make table\n", + "sup_tab1 = make_delay_table(scenario=s4_overall,\n", + " scenario_name=\"no_complex_neuro\",\n", + " asu_beds=list(range(10,16)),\n", + " rehab_beds=list(range(12,17)))\n", + "\n", + "# Display and save to csv\n", + "display(sup_tab1)\n", + "sup_tab1.to_csv(os.path.join(OUTPUT_DIR, \"delay_scenario4.csv\"), index=False)" + ] } ], "metadata": { diff --git a/outputs/delay_s1.csv b/outputs/delay_scenario1.csv similarity index 50% rename from outputs/delay_s1.csv rename to outputs/delay_scenario1.csv index 36a74fc..00845d1 100644 --- a/outputs/delay_s1.csv +++ b/outputs/delay_scenario1.csv @@ -2,12 +2,12 @@ unit,beds,prob_delay_current,1_in_n_delay_current,prob_delay_5%,1_in_n_delay_5% asu,9,0.19,5,, asu,10,0.14,7,0.16,6.0 asu,11,0.09,11,0.11,9.0 -asu,12,0.06,17,0.08,12.0 -asu,13,0.04,25,0.05,20.0 -asu,14,0.02,50,0.03,33.0 +asu,12,0.06,16,0.08,13.0 +asu,13,0.04,26,0.05,20.0 +asu,14,0.02,45,0.03,33.0 rehab,10,0.2,5,, rehab,12,0.11,9,0.13,8.0 -rehab,13,0.08,12,0.09,11.0 -rehab,14,0.05,20,0.06,17.0 -rehab,15,0.03,33,0.04,25.0 -rehab,16,0.02,50,0.03,33.0 +rehab,13,0.08,13,0.09,11.0 +rehab,14,0.05,20,0.06,15.0 +rehab,15,0.03,31,0.04,23.0 +rehab,16,0.02,52,0.03,37.0 diff --git a/outputs/delay_scenario4.csv b/outputs/delay_scenario4.csv new file mode 100644 index 0000000..f1e1154 --- /dev/null +++ b/outputs/delay_scenario4.csv @@ -0,0 +1,12 @@ +unit,beds,prob_delay_current,1_in_n_delay_current,prob_delay_no_complex_neuro,1_in_n_delay_no_complex_neuro +asu,10,0.14,7,0.09,11 +asu,11,0.09,11,0.06,18 +asu,12,0.06,16,0.03,31 +asu,13,0.04,26,0.02,55 +asu,14,0.02,45,0.01,111 +asu,15,0.01,79,0.0,225 +rehab,12,0.11,9,0.05,20 +rehab,13,0.08,13,0.03,32 +rehab,14,0.05,20,0.02,57 +rehab,15,0.03,31,0.01,101 +rehab,16,0.02,52,0.0,212 From 0662f0b3d813c2b0cab1d73f4718e1b7272949a7 Mon Sep 17 00:00:00 2001 From: amyheather Date: Wed, 9 Apr 2025 13:54:03 +0100 Subject: [PATCH 08/24] feat(pooling): attempt at bed pooling (though not sure if it's quite right) --- notebooks/analysis.ipynb | 754 ++++++++++++++++++++++++++++++++------- 1 file changed, 620 insertions(+), 134 deletions(-) diff --git a/notebooks/analysis.ipynb b/notebooks/analysis.ipynb index 153d824..595d5c1 100644 --- a/notebooks/analysis.ipynb +++ b/notebooks/analysis.ipynb @@ -15,10 +15,16 @@ "* Base case\n", " * Run the model\n", " * Figure 1\n", + " * Theory: probability of delay\n", " * Figure 3\n", - "* Scenario analysis\n", + "* Scenario analysis: altering arrivals\n", " * Scenario 1\n", - " * Table 2" + " * Table 2\n", + " * Scenario 4\n", + " * Supplementary table 1\n", + "* Scenario analysis: pooling beds\n", + " * Theory: pooling beds\n", + " * Scenario 2" ] }, { @@ -36,6 +42,7 @@ "import os\n", "\n", "from IPython.display import display\n", + "import numpy as np\n", "import pandas as pd\n", "import plotly.express as px\n", "\n", @@ -1868,115 +1875,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Figure 3\n", - "\n", - "**Figure 3**. Simulated trade-off between the probability that a patient is delayed and the no. of acute beds available.\n", + "### Theory: probability of delay\n", "\n", "We can use our frequency and cumulative frequency of occupied beds from the simulation to calculate blocking probability.\n", "\n", - "Our model output these tables..." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
bedsfreqpctc_pctprob_delay
00670.0002450.0002451.000000
115700.0020820.0023270.894819
2221420.0078250.0101520.770781
3360860.0222320.0323840.686520
44126000.0460270.0784110.587002
\n", - "
" - ], - "text/plain": [ - " beds freq pct c_pct prob_delay\n", - "0 0 67 0.000245 0.000245 1.000000\n", - "1 1 570 0.002082 0.002327 0.894819\n", - "2 2 2142 0.007825 0.010152 0.770781\n", - "3 3 6086 0.022232 0.032384 0.686520\n", - "4 4 12600 0.046027 0.078411 0.587002" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "base_overall[\"asu\"].head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ + "For example:\n", + "\n", + "| Beds | `pct` | `c_pct` | Probability of delay |\n", + "| - | - | - | - |\n", + "| 0 | 0.2 | 0.2 | 1.0 |\n", + "| 1 | 0.3 | 0.5 | 0.6 |\n", + "| 2 | 0.4 | 0.9 | 0.44 |\n", + "| 3 | 0.1 | 1.0 | 0.1 |\n", + "\n", "We can interpret...\n", "\n", "* `pct` as the probability of having exactly x beds occupied.\n", @@ -1984,31 +1895,31 @@ "\n", "We can then calculate `pct/c_pct`, which is the probability of delay when the system has exactly x beds occupied.\n", "\n", - "For example:\n", - "\n", - "| Beds | `pct` | `c_pct` | Probability of delay |\n", - "| - | - | - | - |\n", - "| 7 | 0.2 | 0.2 | 1.0 |\n", - "| 8 | 0.3 | 0.5 | 0.6 |\n", - "| 9 | 0.4 | 0.9 | 0.44 |\n", - "| 10 | 0.1 | 1.0 | 0.1 |\n", - "\n", - "Interpretation for 8 beds:\n", + "Interpretation for 1 bed:\n", "\n", - "* If we **randomly select a day when the occupancy is 8 or fewer beds**, there's a **60%** chance that the occupancy will be **exactly 8 beds (rather than 7 beds)**.\n", + "* If we **randomly select a day when the occupancy is 1 or fewer beds**, there's a **60%** chance that the occupancy will be **exactly 1 beds (rather than 0 beds)**.\n", "\n", "This can then be connected to the probability of delay by thinking about system capacity:\n", "\n", - "* If we assume that the unit has a total of 8 beds, then when 8 beds are occupied, the unit is at **full capacity**.\n", - "* Any new patients arriving when 8 beds are occupied would experience a delay.\n", - "* So 0.6 represents the probability that, given we're at or below capacity (7 or 8 beds), we're actually at full capacity (8 beds)\n", + "* If we assume that the unit has a total of 1 beds, then when 1 beds are occupied, the unit is at **full capacity**.\n", + "* Any new patients arriving when 1 beds are occupied would experience a delay.\n", + "* So 0.6 represents the probability that, given we're at or below capacity (0 or 1 beds), we're actually at full capacity (1 beds)\n", "\n", "In other words, `pct/c_pct` is the probability that a new arrival will experience a delay when the system has exactly x beds occupied, given that the capacity of the system is x beds." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Figure 3\n", + "\n", + "**Figure 3**. Simulated trade-off between the probability that a patient is delayed and the no. of acute beds available." + ] + }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -2063,7 +1974,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -3867,7 +3778,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Scenario analysis\n", + "## Scenario analysis: altering arrivals\n", "\n", "### Scenario 1\n", "\n", @@ -3876,7 +3787,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -3914,7 +3825,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -3936,7 +3847,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -4010,7 +3921,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -4196,7 +4107,7 @@ "12 37 " ] }, - "execution_count": 12, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -4219,7 +4130,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -4430,7 +4341,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -4444,7 +4355,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -4464,7 +4375,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -4643,6 +4554,581 @@ "display(sup_tab1)\n", "sup_tab1.to_csv(os.path.join(OUTPUT_DIR, \"delay_scenario4.csv\"), index=False)" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Scenario analysis: pooling beds\n", + "\n", + "### Theory: pooling beds\n", + "\n", + "#### Reminder: What is probability of delay?\n", + "\n", + "As mentioned above, we calculate the probability `prob_delay` like so:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
bedsfreqpctc_pctprob_delay
00670.0002450.0002451.000000
115700.0020820.0023270.894819
2221420.0078250.0101520.770781
3360860.0222320.0323840.686520
44126000.0460270.0784110.587002
\n", + "
" + ], + "text/plain": [ + " beds freq pct c_pct prob_delay\n", + "0 0 67 0.000245 0.000245 1.000000\n", + "1 1 570 0.002082 0.002327 0.894819\n", + "2 2 2142 0.007825 0.010152 0.770781\n", + "3 3 6086 0.022232 0.032384 0.686520\n", + "4 4 12600 0.046027 0.078411 0.587002" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "base_overall[\"asu\"].head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And this has two interpretations:\n", + "\n", + "* It is the likelihood of already having **at least X number of patient occupying** the unit.\n", + "* And therefore, **if X is the capacity, it is the probability of delay** for new patients entering the unit.\n", + "\n", + "For example, there is:\n", + "\n", + "* A 100% probability of there being 0 or more people occupying the unit at any given time\n", + "* A 100% probability of delay for new patients, if capacity is 0\n", + "\n", + "And...\n", + "\n", + "* A 89% probability of there being 1 or more people occupying the unit at any given time\n", + "* A 89% probability of delay for new patients, if capacity is 1\n", + "\n", + "And so on." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Using these to estimate probability of delay with pooled beds\n", + "\n", + "Let's imagine the following scenario:\n", + "\n", + "> Scenario: **11 dedicated acute beds, 11 dedicated rehab beds, and 4 pooled beds.**\n", + ">\n", + "> Acute patients will be delayed if:\n", + "> * There are ≥15 acute patients (using all 11 acute beds + all 4 pooled beds)\n", + "> * OR there are 11-14 acute patients AND rehab patients are using some of the pooled beds\n", + ">\n", + "> No delays if 10 or fewer acute patients, as still a bed spare.\n", + ">\n", + "> Rehab patients will be delayed if:\n", + "> * There are ≥15 rehab patients (using all 11 rehab beds + all 4 pooled beds)\n", + "> * OR there are 11-14 rehab patients AND acute patients are using some of the pooled beds\n", + "\n", + "Focusing on the acute patients, `prob_delay` tells us that the probability of having at least 15 patients occupying the unit is 0.012." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
bedsfreqpctc_pctprob_delay
151534240.0125080.9876310.012664
\n", + "
" + ], + "text/plain": [ + " beds freq pct c_pct prob_delay\n", + "15 15 3424 0.012508 0.987631 0.012664" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "base_overall[\"asu\"][base_overall[\"asu\"][\"beds\"] == 15]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will also then have delays if there are:\n", + "\n", + "* 11 acute 4 rehab\n", + "* 12 acute 3 rehab\n", + "* 13 acute 2 rehab\n", + "* 14 acute 1 rehab\n", + "\n", + "To work out these, we multiply the probability of having at least X acute by the probability of having at least Y rehab - for example:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
bedsfreqpctc_pctprob_delay
1111223440.0816220.86030.094876
\n", + "
" + ], + "text/plain": [ + " beds freq pct c_pct prob_delay\n", + "11 11 22344 0.081622 0.8603 0.094876" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
bedsfreqpctc_pctprob_delay
4456590.0206720.0313170.660096
\n", + "
" + ], + "text/plain": [ + " beds freq pct c_pct prob_delay\n", + "4 4 5659 0.020672 0.031317 0.660096" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "np.float64(0.06262734094605638)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p_asu_11 = base_overall[\"asu\"][base_overall[\"asu\"][\"beds\"] == 11]\n", + "p_rehab_4 = base_overall[\"rehab\"][base_overall[\"rehab\"][\"beds\"] == 4]\n", + "\n", + "display(p_asu_11)\n", + "display(p_rehab_4)\n", + "\n", + "# Probability of having at least 11 acute AND at least 4 rehab\n", + "p_asu_11[\"prob_delay\"].values[0] * p_rehab_4[\"prob_delay\"].values[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The overall probability is the sum of these calculations." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Scenario 2 and 3\n", + "\n", + "Scenario 2: **Pooling of acute and rehab beds.** The acute and rehab wards are co-located at same site. Beds are pooled and can be used by either acute or rehabilitation patients. Pooling of the total bed stock of 22 is compared to the pooling of an increased bed stock of 26.\n", + "\n", + "Scenario 3: **Partial pooling of acute and rehab beds.** The acute and rehab wards are co-located at same site. A subset of the 26 beds are pooled and can be used by either acute or rehab patients.\n", + "\n", + "We can calculate probabilities with pooled beds based on our existing probabilities of delay.\n", + "\n", + "Partial pooling example (like scenario 3)...\n", + "\n", + "Complete pooling example (like scenario 2)...\n", + "\n", + "> **Example #2**\n", + ">\n", + "> Scenario: 0 acute, 0 rehab, 22 pooled\n", + ">\n", + "> Acute patients will be delayed if:\n", + "> * Total patients (acute + rehab) > 22 AND acute patients > rehab patients\n", + "> * OR total patients > 22 AND acute patients = rehab patients\n", + ">\n", + "> Rehab patients will be delayed if:\n", + "> * Total patients (acute + rehab) > 22 AND rehab patients > acute patients\n", + "> * OR total patients > 22 AND acute patients = rehab patients" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "class PooledDelay:\n", + " def __init__(self, base_results):\n", + " \"\"\"\n", + " Parameters\n", + " ----------\n", + " base_results: dict\n", + " Dictionary containing two dataframes: \"asu\" and \"rehab\". These\n", + " contain the overall results from the base run of the simulation.\n", + " \"\"\"\n", + " # Extract the ASU and rehab results for probability of delay\n", + " self.asu = base_results[\"asu\"].set_index(\"beds\")[\"prob_delay\"]\n", + " self.rehab = base_results[\"rehab\"].set_index(\"beds\")[\"prob_delay\"]\n", + "\n", + " # To store the bed counts\n", + " self.asu_beds = np.nan\n", + " self.rehab_beds = np.nan\n", + " self.pooled_beds = np.nan\n", + "\n", + " def calculate_delay(self, asu_beds, rehab_beds, pooled_beds):\n", + " \"\"\"\n", + " Analyse a bed pooling scenario.\n", + "\n", + " Parameters\n", + " ----------\n", + " asu_beds: int\n", + " Number of dedicated ASU beds (excluding pooled beds).\n", + " rehab_beds: int\n", + " Number of dedicated rehabilitation beds (excluding pooled beds).\n", + " pooled_beds: int\n", + " Number of beds that can be used by either unit.\n", + " \"\"\"\n", + " # Get counts of dedicated and pooled beds\n", + " self.asu_beds = asu_beds\n", + " self.rehab_beds = rehab_beds\n", + " self.pooled_beds = pooled_beds\n", + "\n", + " # Only ASU delay, which is ASU + pooled full, with rehab below capacity\n", + " max_beds = self.asu_beds + self.pooled_beds\n", + " self.asu_only = self.asu[max_beds] * (1 - self.rehab[self.rehab_beds])\n", + "\n", + " # Vice versa for rehab\n", + " max_beds = self.rehab_beds + self.pooled_beds\n", + " self.rehab_only = self.rehab[max_beds] * (1 - self.asu[self.asu_beds])\n", + "\n", + " # Find combinations of patients that would cause delays\n", + " self.asu_comb = self.get_delay_combinations(unit=\"asu\")\n", + " self.rehab_comb = self.get_delay_combinations(unit=\"rehab\")\n", + "\n", + " # Convert to probabilities\n", + " self.asu_comb_probs = (\n", + " sum(self.asu[d[\"asu\"]] * self.rehab[d[\"rehab\"]]\n", + " for d in self.asu_comb))\n", + " self.rehab_comb_probs = (\n", + " sum(self.asu[d[\"asu\"]] * self.rehab[d[\"rehab\"]]\n", + " for d in self.rehab_comb))\n", + " \n", + " return {\"asu\": round(self.asu_only + self.asu_comb_probs, 3),\n", + " \"rehab\": round(self.rehab_only + self.rehab_comb_probs, 3)}\n", + "\n", + " def get_delay_combinations(self, unit):\n", + " \"\"\"\n", + " Generates a list of dictionaries representing combinations of patients\n", + " that would cause delays.\n", + "\n", + " This function calculates all combinations where the number of patients\n", + " for a specific unit exceeds its dedicated beds but stays within the\n", + " maximum capacity (dedicated + pooled beds).\n", + "\n", + " Parameters\n", + " ----------\n", + " unit: str\n", + " Name of unit to investigate (\"asu\", \"rehab\").\n", + "\n", + " Returns\n", + " -------\n", + " combinations: list\n", + " List of dictionaries containing the asu and rehab bed counts.\n", + " \"\"\"\n", + " # Determine name of other unit, depending on which you are focussing on\n", + " other_unit = \"rehab\" if unit == \"asu\" else \"asu\"\n", + "\n", + " # Get the counts of available beds for focus unit and other unit\n", + " unit_beds = getattr(self, f\"{unit}_beds\")\n", + " other_beds = getattr(self, f\"{other_unit}_beds\")\n", + "\n", + " # Find max beds for that unit\n", + " max_beds = unit_beds + self.pooled_beds\n", + "\n", + " # Get combinations of beds which would cause a delay\n", + " combinations = [{unit: i, other_unit: max_beds - i + other_beds}\n", + " for i in range(unit_beds, max_beds + 1)][::-1]\n", + "\n", + " return combinations" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "asu 0 rehab 0 pooled 22\n", + "{'asu': np.float64(0.132), 'rehab': np.float64(0.132)}\n", + "------------------\n", + "asu 0 rehab 0 pooled 26\n", + "{'asu': np.float64(0.026), 'rehab': np.float64(0.026)}\n", + "------------------\n", + "asu 14 rehab 12 pooled 0\n", + "{'asu': np.float64(0.022), 'rehab': np.float64(0.111)}\n", + "------------------\n", + "asu 11 rehab 11 pooled 4\n", + "{'asu': np.float64(0.024), 'rehab': np.float64(0.043)}\n", + "------------------\n", + "asu 11 rehab 10 pooled 5\n", + "{'asu': np.float64(0.02), 'rehab': np.float64(0.044)}\n", + "------------------\n", + "asu 10 rehab 10 pooled 6\n", + "{'asu': np.float64(0.023), 'rehab': np.float64(0.034)}\n", + "------------------\n", + "asu 10 rehab 9 pooled 7\n", + "{'asu': np.float64(0.021), 'rehab': np.float64(0.035)}\n", + "------------------\n", + "asu 9 rehab 9 pooled 8\n", + "{'asu': np.float64(0.023), 'rehab': np.float64(0.03)}\n", + "------------------\n", + "asu 9 rehab 8 pooled 9\n", + "{'asu': np.float64(0.022), 'rehab': np.float64(0.03)}\n", + "------------------\n" + ] + } + ], + "source": [ + "pooled_delay = PooledDelay(base_results=base_overall)\n", + "for beds in [(0, 0, 22), (0, 0, 26), (14, 12, 0), (11, 11, 4), (11, 10, 5),\n", + " (10, 10, 6), (10, 9, 7), (9, 9, 8), (9, 8, 9)]:\n", + " print(f\"asu {beds[0]} rehab {beds[1]} pooled {beds[2]}\")\n", + " print(pooled_delay.calculate_delay(\n", + " asu_beds=beds[0], rehab_beds=beds[1], pooled_beds=beds[2]))\n", + " print(\"------------------\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "14 12 0 matches my base overall 14 and 12 (which it should as no pooling basically)\n", + "\n", + "11 11 4 matches my manual calculation below for ASU -" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.024341193866000005" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(0.012664*(1-0.150691))+(0.012664*0.150691)+(0.022350*0.111069)+(0.038513*0.077523)+(0.061437*0.051057)+(0.094876*0.032383)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But it doesn't match the article." + ] } ], "metadata": { From d271f650ac7b9bc846aa35d062fec69a07ace23d Mon Sep 17 00:00:00 2001 From: amyheather Date: Wed, 9 Apr 2025 14:07:23 +0100 Subject: [PATCH 09/24] chore(analysis): removing pooling explanations --- notebooks/analysis.ipynb | 529 +++++++++++---------------------------- 1 file changed, 152 insertions(+), 377 deletions(-) diff --git a/notebooks/analysis.ipynb b/notebooks/analysis.ipynb index 595d5c1..05e561a 100644 --- a/notebooks/analysis.ipynb +++ b/notebooks/analysis.ipynb @@ -4559,360 +4559,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Scenario analysis: pooling beds\n", - "\n", - "### Theory: pooling beds\n", - "\n", - "#### Reminder: What is probability of delay?\n", - "\n", - "As mentioned above, we calculate the probability `prob_delay` like so:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
bedsfreqpctc_pctprob_delay
00670.0002450.0002451.000000
115700.0020820.0023270.894819
2221420.0078250.0101520.770781
3360860.0222320.0323840.686520
44126000.0460270.0784110.587002
\n", - "
" - ], - "text/plain": [ - " beds freq pct c_pct prob_delay\n", - "0 0 67 0.000245 0.000245 1.000000\n", - "1 1 570 0.002082 0.002327 0.894819\n", - "2 2 2142 0.007825 0.010152 0.770781\n", - "3 3 6086 0.022232 0.032384 0.686520\n", - "4 4 12600 0.046027 0.078411 0.587002" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "base_overall[\"asu\"].head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And this has two interpretations:\n", - "\n", - "* It is the likelihood of already having **at least X number of patient occupying** the unit.\n", - "* And therefore, **if X is the capacity, it is the probability of delay** for new patients entering the unit.\n", - "\n", - "For example, there is:\n", - "\n", - "* A 100% probability of there being 0 or more people occupying the unit at any given time\n", - "* A 100% probability of delay for new patients, if capacity is 0\n", - "\n", - "And...\n", - "\n", - "* A 89% probability of there being 1 or more people occupying the unit at any given time\n", - "* A 89% probability of delay for new patients, if capacity is 1\n", - "\n", - "And so on." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Using these to estimate probability of delay with pooled beds\n", - "\n", - "Let's imagine the following scenario:\n", - "\n", - "> Scenario: **11 dedicated acute beds, 11 dedicated rehab beds, and 4 pooled beds.**\n", - ">\n", - "> Acute patients will be delayed if:\n", - "> * There are ≥15 acute patients (using all 11 acute beds + all 4 pooled beds)\n", - "> * OR there are 11-14 acute patients AND rehab patients are using some of the pooled beds\n", - ">\n", - "> No delays if 10 or fewer acute patients, as still a bed spare.\n", - ">\n", - "> Rehab patients will be delayed if:\n", - "> * There are ≥15 rehab patients (using all 11 rehab beds + all 4 pooled beds)\n", - "> * OR there are 11-14 rehab patients AND acute patients are using some of the pooled beds\n", - "\n", - "Focusing on the acute patients, `prob_delay` tells us that the probability of having at least 15 patients occupying the unit is 0.012." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
bedsfreqpctc_pctprob_delay
151534240.0125080.9876310.012664
\n", - "
" - ], - "text/plain": [ - " beds freq pct c_pct prob_delay\n", - "15 15 3424 0.012508 0.987631 0.012664" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "base_overall[\"asu\"][base_overall[\"asu\"][\"beds\"] == 15]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will also then have delays if there are:\n", - "\n", - "* 11 acute 4 rehab\n", - "* 12 acute 3 rehab\n", - "* 13 acute 2 rehab\n", - "* 14 acute 1 rehab\n", - "\n", - "To work out these, we multiply the probability of having at least X acute by the probability of having at least Y rehab - for example:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
bedsfreqpctc_pctprob_delay
1111223440.0816220.86030.094876
\n", - "
" - ], - "text/plain": [ - " beds freq pct c_pct prob_delay\n", - "11 11 22344 0.081622 0.8603 0.094876" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
bedsfreqpctc_pctprob_delay
4456590.0206720.0313170.660096
\n", - "
" - ], - "text/plain": [ - " beds freq pct c_pct prob_delay\n", - "4 4 5659 0.020672 0.031317 0.660096" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "np.float64(0.06262734094605638)" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p_asu_11 = base_overall[\"asu\"][base_overall[\"asu\"][\"beds\"] == 11]\n", - "p_rehab_4 = base_overall[\"rehab\"][base_overall[\"rehab\"][\"beds\"] == 4]\n", - "\n", - "display(p_asu_11)\n", - "display(p_rehab_4)\n", - "\n", - "# Probability of having at least 11 acute AND at least 4 rehab\n", - "p_asu_11[\"prob_delay\"].values[0] * p_rehab_4[\"prob_delay\"].values[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The overall probability is the sum of these calculations." + "## Scenario analysis: pooling beds" ] }, { @@ -4923,30 +4570,12 @@ "\n", "Scenario 2: **Pooling of acute and rehab beds.** The acute and rehab wards are co-located at same site. Beds are pooled and can be used by either acute or rehabilitation patients. Pooling of the total bed stock of 22 is compared to the pooling of an increased bed stock of 26.\n", "\n", - "Scenario 3: **Partial pooling of acute and rehab beds.** The acute and rehab wards are co-located at same site. A subset of the 26 beds are pooled and can be used by either acute or rehab patients.\n", - "\n", - "We can calculate probabilities with pooled beds based on our existing probabilities of delay.\n", - "\n", - "Partial pooling example (like scenario 3)...\n", - "\n", - "Complete pooling example (like scenario 2)...\n", - "\n", - "> **Example #2**\n", - ">\n", - "> Scenario: 0 acute, 0 rehab, 22 pooled\n", - ">\n", - "> Acute patients will be delayed if:\n", - "> * Total patients (acute + rehab) > 22 AND acute patients > rehab patients\n", - "> * OR total patients > 22 AND acute patients = rehab patients\n", - ">\n", - "> Rehab patients will be delayed if:\n", - "> * Total patients (acute + rehab) > 22 AND rehab patients > acute patients\n", - "> * OR total patients > 22 AND acute patients = rehab patients" + "Scenario 3: **Partial pooling of acute and rehab beds.** The acute and rehab wards are co-located at same site. A subset of the 26 beds are pooled and can be used by either acute or rehab patients." ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -5045,9 +4674,57 @@ " return combinations" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Can't check with data from article as don't have enough of it." + ] + }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "fail\n", + "fail\n", + "{'asu': np.float64(0.02), 'rehab': np.float64(0.11)}\n", + "asu 14 rehab 12 pooled 0\n", + "fail\n", + "fail\n", + "fail\n", + "fail\n", + "fail\n", + "fail\n" + ] + } + ], + "source": [ + "pooled_delay = PooledDelay(base_results=base_overall)\n", + "\n", + "# Replace with data from article\n", + "pooled_delay.asu = pd.Series(\n", + " data=[0.19, 0.14, 0.09, 0.06, 0.04, 0.02], index=[9, 10, 11, 12, 13, 14])\n", + "pooled_delay.rehab = pd.Series(\n", + " data=[0.20, 0.11, 0.08, 0.05, 0.03, 0.02], index=[10, 12, 13, 14, 15, 16])\n", + "\n", + "for beds in [(0, 0, 22), (0, 0, 26), (14, 12, 0), (11, 11, 4), (11, 10, 5),\n", + " (10, 10, 6), (10, 9, 7), (9, 9, 8), (9, 8, 9)]:\n", + " try:\n", + " print(pooled_delay.calculate_delay(\n", + " asu_beds=beds[0], rehab_beds=beds[1], pooled_beds=beds[2]))\n", + " print(f\"asu {beds[0]} rehab {beds[1]} pooled {beds[2]}\")\n", + " except:\n", + " print(\"fail\")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -5105,7 +4782,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -5114,7 +4791,7 @@ "0.024341193866000005" ] }, - "execution_count": 21, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -5129,6 +4806,104 @@ "source": [ "But it doesn't match the article." ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "beds\n", + "0 1.000000\n", + "1 0.894819\n", + "2 0.770781\n", + "3 0.686520\n", + "4 0.587002\n", + "5 0.500791\n", + "6 0.413733\n", + "7 0.334108\n", + "8 0.256869\n", + "9 0.193202\n", + "10 0.138199\n", + "11 0.094876\n", + "12 0.061437\n", + "13 0.038513\n", + "14 0.022350\n", + "15 0.012664\n", + "16 0.006438\n", + "17 0.003322\n", + "18 0.001547\n", + "19 0.000643\n", + "20 0.000259\n", + "21 0.000132\n", + "22 0.000047\n", + "23 0.000015\n", + "24 0.000007\n", + "25 0.000004\n", + "26 0.000000\n", + "27 0.000004\n", + "Name: prob_delay, dtype: float64" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pooled_delay.asu" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "beds\n", + "0 1.000000\n", + "1 0.864662\n", + "2 0.814246\n", + "3 0.754290\n", + "4 0.660096\n", + "5 0.574731\n", + "6 0.488960\n", + "7 0.403547\n", + "8 0.331217\n", + "9 0.260503\n", + "10 0.202678\n", + "11 0.150691\n", + "12 0.111069\n", + "13 0.077523\n", + "14 0.051057\n", + "15 0.032383\n", + "16 0.019416\n", + "17 0.011187\n", + "18 0.006143\n", + "19 0.003121\n", + "20 0.001372\n", + "21 0.000680\n", + "22 0.000362\n", + "23 0.000179\n", + "24 0.000062\n", + "25 0.000018\n", + "26 0.000018\n", + "27 0.000004\n", + "Name: prob_delay, dtype: float64" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pooled_delay.rehab" + ] } ], "metadata": { From 997f32de7b9a8470f567957ded53e0b7961a74c6 Mon Sep 17 00:00:00 2001 From: amyheather Date: Fri, 11 Apr 2025 09:12:39 +0100 Subject: [PATCH 10/24] fix(analysis): use frequencies instead of prob_delay for the bed pooling scenarios, and actually follows the provided formula in the appendix! (I had done something weird/different/not right) --- notebooks/analysis.ipynb | 748 +++++++++++++++++++++++++++++---------- 1 file changed, 556 insertions(+), 192 deletions(-) diff --git a/notebooks/analysis.ipynb b/notebooks/analysis.ipynb index 05e561a..35914e4 100644 --- a/notebooks/analysis.ipynb +++ b/notebooks/analysis.ipynb @@ -4559,23 +4559,359 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Scenario analysis: pooling beds" + "## Scenario analysis: pooling beds\n", + "\n", + "### Scenario 2\n", + "\n", + "Scenario 2: **Pooling of acute and rehab beds.** The acute and rehab wards are co-located at same site. Beds are pooled and can be used by either acute or rehabilitation patients. Pooling of the total bed stock of 22 is compared to the pooling of an increased bed stock of 26." ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 16, "metadata": {}, + "outputs": [], "source": [ - "### Scenario 2 and 3\n", + "pooled_freq = base_overall[\"asu\"][\"freq\"] + base_overall[\"rehab\"][\"freq\"]\n", + "\n", + "df = pd.DataFrame(pooled_freq)\n", + "\n", + "# Add column with frequencies converted to proportions\n", + "df[\"pct\"] = df[\"freq\"] / df[\"freq\"].sum()\n", "\n", - "Scenario 2: **Pooling of acute and rehab beds.** The acute and rehab wards are co-located at same site. Beds are pooled and can be used by either acute or rehabilitation patients. Pooling of the total bed stock of 22 is compared to the pooling of an increased bed stock of 26.\n", + "# Add column with the cumulative percentage\n", + "df[\"c_pct\"] = df[\"pct\"].cumsum()\n", + "\n", + "# Calculate the probability of delay\n", + "df[\"prob_delay\"] = df[\"pct\"] / df[\"c_pct\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
freqpctc_pctprob_delay
0850.0001550.0001551.000000
16850.0012510.0014060.889610
227250.0049770.0063840.779685
382840.0151310.0215140.703286
4182590.0333500.0548640.607863
5331190.0604910.1153550.524392
6496320.0906520.2060070.440043
7634880.1159600.3219670.360160
8708250.1293610.4513280.286623
9703280.1284530.5797810.221554
10634520.1158940.6956750.166592
11521020.0951630.7908380.120332
12400900.0732240.8640620.084744
13287200.0524570.9165190.057235
14189230.0345630.9510810.036340
15119170.0217660.9728470.022374
1669450.0126850.9855320.012871
1739330.0071840.9927160.007236
1820950.0038260.9965420.003840
1910280.0018780.9984200.001881
204460.0008150.9992350.000815
212220.0004050.9996400.000406
221120.0002050.9998450.000205
23530.0000970.9999420.000097
24190.0000350.9999760.000035
2560.0000110.9999870.000011
2650.0000090.9999960.000009
2720.0000041.0000000.000004
\n", + "
" + ], + "text/plain": [ + " freq pct c_pct prob_delay\n", + "0 85 0.000155 0.000155 1.000000\n", + "1 685 0.001251 0.001406 0.889610\n", + "2 2725 0.004977 0.006384 0.779685\n", + "3 8284 0.015131 0.021514 0.703286\n", + "4 18259 0.033350 0.054864 0.607863\n", + "5 33119 0.060491 0.115355 0.524392\n", + "6 49632 0.090652 0.206007 0.440043\n", + "7 63488 0.115960 0.321967 0.360160\n", + "8 70825 0.129361 0.451328 0.286623\n", + "9 70328 0.128453 0.579781 0.221554\n", + "10 63452 0.115894 0.695675 0.166592\n", + "11 52102 0.095163 0.790838 0.120332\n", + "12 40090 0.073224 0.864062 0.084744\n", + "13 28720 0.052457 0.916519 0.057235\n", + "14 18923 0.034563 0.951081 0.036340\n", + "15 11917 0.021766 0.972847 0.022374\n", + "16 6945 0.012685 0.985532 0.012871\n", + "17 3933 0.007184 0.992716 0.007236\n", + "18 2095 0.003826 0.996542 0.003840\n", + "19 1028 0.001878 0.998420 0.001881\n", + "20 446 0.000815 0.999235 0.000815\n", + "21 222 0.000405 0.999640 0.000406\n", + "22 112 0.000205 0.999845 0.000205\n", + "23 53 0.000097 0.999942 0.000097\n", + "24 19 0.000035 0.999976 0.000035\n", + "25 6 0.000011 0.999987 0.000011\n", + "26 5 0.000009 0.999996 0.000009\n", + "27 2 0.000004 1.000000 0.000004" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "np.float64(0.0002045979741147027)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[22][\"prob_delay\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "np.float64(9.132453451884755e-06)" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[26][\"prob_delay\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Scenario 3\n", "\n", "Scenario 3: **Partial pooling of acute and rehab beds.** The acute and rehab wards are co-located at same site. A subset of the 26 beds are pooled and can be used by either acute or rehab patients." ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -4588,55 +4924,85 @@ " Dictionary containing two dataframes: \"asu\" and \"rehab\". These\n", " contain the overall results from the base run of the simulation.\n", " \"\"\"\n", - " # Extract the ASU and rehab results for probability of delay\n", - " self.asu = base_results[\"asu\"].set_index(\"beds\")[\"prob_delay\"]\n", - " self.rehab = base_results[\"rehab\"].set_index(\"beds\")[\"prob_delay\"]\n", + " # Extract the ASU and rehab frequencies\n", + " self.asu = base_results[\"asu\"].set_index(\"beds\")[\"freq\"]\n", + " self.rehab = base_results[\"rehab\"].set_index(\"beds\")[\"freq\"]\n", "\n", " # To store the bed counts\n", " self.asu_beds = np.nan\n", " self.rehab_beds = np.nan\n", " self.pooled_beds = np.nan\n", "\n", - " def calculate_delay(self, asu_beds, rehab_beds, pooled_beds):\n", + " def prob_occupancy(self, occ_freq, threshold, comparison):\n", " \"\"\"\n", - " Analyse a bed pooling scenario.\n", + " Calculate the probability of an occupancy based on the specified\n", + " comparison with a threshold value, using observed frequencies of\n", + " different occupancies.\n", "\n", " Parameters\n", " ----------\n", - " asu_beds: int\n", - " Number of dedicated ASU beds (excluding pooled beds).\n", - " rehab_beds: int\n", - " Number of dedicated rehabilitation beds (excluding pooled beds).\n", - " pooled_beds: int\n", - " Number of beds that can be used by either unit.\n", + " occ_freq : pd.Series\n", + " Frequencies of each number of beds, with the index representing the\n", + " occupancy.\n", + " min_occ : int\n", + " The minimum number of beds for which we want to check probability.\n", + " threshold : int\n", + " The threshold number of beds for comparison.\n", + " comparison : str\n", + " The type of comparison to perform. Options are: \"ge\" (greater than\n", + " or equal to, >=), \"eq\" (equal to, =), or \"lt\" (less than, <).\n", + "\n", + " Returns\n", + " -------\n", + " float\n", + " The probability of an occupancy greater than or equal to min_occ.\n", " \"\"\"\n", - " # Get counts of dedicated and pooled beds\n", - " self.asu_beds = asu_beds\n", - " self.rehab_beds = rehab_beds\n", - " self.pooled_beds = pooled_beds\n", + " # Calculate total frequency\n", + " total_freq = occ_freq.sum()\n", "\n", - " # Only ASU delay, which is ASU + pooled full, with rehab below capacity\n", - " max_beds = self.asu_beds + self.pooled_beds\n", - " self.asu_only = self.asu[max_beds] * (1 - self.rehab[self.rehab_beds])\n", + " # Calculate the frequency based on the comparison type\n", + " if comparison == \"ge\":\n", + " # Greater than or equal to\n", + " filtered_freq = occ_freq[occ_freq.index >= threshold].sum()\n", + " elif comparison == \"eq\":\n", + " # Equal to\n", + " filtered_freq = occ_freq[occ_freq.index == threshold].sum()\n", + " elif comparison == \"lt\":\n", + " # Less than\n", + " filtered_freq = occ_freq[occ_freq.index < threshold].sum()\n", "\n", - " # Vice versa for rehab\n", - " max_beds = self.rehab_beds + self.pooled_beds\n", - " self.rehab_only = self.rehab[max_beds] * (1 - self.asu[self.asu_beds])\n", + " # Calculate and return the probability\n", + " return filtered_freq / total_freq\n", "\n", - " # Find combinations of patients that would cause delays\n", - " self.asu_comb = self.get_delay_combinations(unit=\"asu\")\n", - " self.rehab_comb = self.get_delay_combinations(unit=\"rehab\")\n", + " def calculate_only_unit_overflow(self, unit):\n", + " \"\"\"\n", + " Calculate the probability of only the specified unit having delays.\n", + "\n", + " Parameters\n", + " ----------\n", + " unit: str\n", + " Name of unit to investigate (\"asu\", \"rehab\").\n", + " \"\"\"\n", + " # Determine name of other unit, depending on which you are focussing on\n", + " other_unit = \"rehab\" if unit == \"asu\" else \"asu\"\n", + "\n", + " # Get the counts of available beds for focus unit and other unit\n", + " unit_beds = getattr(self, f\"{unit}_beds\")\n", + " other_beds = getattr(self, f\"{other_unit}_beds\")\n", "\n", - " # Convert to probabilities\n", - " self.asu_comb_probs = (\n", - " sum(self.asu[d[\"asu\"]] * self.rehab[d[\"rehab\"]]\n", - " for d in self.asu_comb))\n", - " self.rehab_comb_probs = (\n", - " sum(self.asu[d[\"asu\"]] * self.rehab[d[\"rehab\"]]\n", - " for d in self.rehab_comb))\n", - " \n", - " return {\"asu\": round(self.asu_only + self.asu_comb_probs, 3),\n", - " \"rehab\": round(self.rehab_only + self.rehab_comb_probs, 3)}\n", + " # Only that unit will have delays if they >= dedicated + pooled,\n", + " # whilst other unit < dedicated\n", + " p_unit = self.prob_occupancy(\n", + " occ_freq=getattr(self, unit),\n", + " threshold=unit_beds+self.pooled_beds,\n", + " comparison=\"ge\"\n", + " )\n", + " p_other = self.prob_occupancy(\n", + " occ_freq=getattr(self, other_unit),\n", + " threshold=other_beds,\n", + " comparison=\"lt\"\n", + " )\n", + " return p_unit*p_other\n", "\n", " def get_delay_combinations(self, unit):\n", " \"\"\"\n", @@ -4671,99 +5037,202 @@ " combinations = [{unit: i, other_unit: max_beds - i + other_beds}\n", " for i in range(unit_beds, max_beds + 1)][::-1]\n", "\n", - " return combinations" + " return combinations\n", + "\n", + " def calculate_combination_probability(self, combination):\n", + " \"\"\"\n", + " Calculate the probability of a set of combinations occurring.\n", + "\n", + " Parameters\n", + " ----------\n", + " combination: dict\n", + " Dictionary with keys \"asu\" and \"rehab\" specifying thresholds.\n", + " This must be that output from get_delay_combinations(), which\n", + " outputs them in descending order for the unit capacity, which is\n", + " important, as the first we check >=, and others ==.\n", + "\n", + " Returns\n", + " -------\n", + " float\n", + " Probability of this combination occurring.\n", + " \"\"\"\n", + " # List to store results\n", + " probabilities = []\n", + "\n", + " # Use a counter to loop through the combinations...\n", + " for i, combo in enumerate(combination):\n", + "\n", + " # Extract the primary unit and other unit's name and thresholds\n", + " unit_name, other_name = combo.keys()\n", + " unit_threshold, other_threshold = combo.values()\n", + "\n", + " # If it's the first combination, then we check unit >= threshold\n", + " if i == 0:\n", + " p_unit = self.prob_occupancy(\n", + " occ_freq=getattr(self, unit_name),\n", + " threshold=unit_threshold,\n", + " comparison=\"ge\")\n", + " # For all other items, we check unit == threshold\n", + " else:\n", + " p_unit = self.prob_occupancy(\n", + " occ_freq=getattr(self, unit_name),\n", + " threshold=unit_threshold,\n", + " comparison=\"eq\")\n", + "\n", + " # The other unit will always be checking >= threshold\n", + " p_other = self.prob_occupancy(\n", + " occ_freq=getattr(self, other_name),\n", + " threshold=other_threshold,\n", + " comparison=\"ge\")\n", + "\n", + " # Multiply probabilities and add to list\n", + " probabilities.append(p_unit*p_other)\n", + "\n", + " # Return sum of list\n", + " return sum(probabilities)\n", + "\n", + " def calculate_delay(self, asu_beds, rehab_beds, pooled_beds):\n", + " \"\"\"\n", + " Analyse a bed pooling scenario.\n", + "\n", + " Parameters\n", + " ----------\n", + " asu_beds: int\n", + " Number of dedicated ASU beds (excluding pooled beds).\n", + " rehab_beds: int\n", + " Number of dedicated rehabilitation beds (excluding pooled beds).\n", + " pooled_beds: int\n", + " Number of beds that can be used by either unit.\n", + " \"\"\"\n", + " # Get counts of dedicated and pooled beds\n", + " self.asu_beds = asu_beds\n", + " self.rehab_beds = rehab_beds\n", + " self.pooled_beds = pooled_beds\n", + "\n", + " # Get probability of only the ASU, or only rehab, having delays\n", + " p_asu_only = self.calculate_only_unit_overflow(unit=\"asu\")\n", + " print(f\"p_asu_only {p_asu_only}\")\n", + " p_rehab_only = self.calculate_only_unit_overflow(unit=\"rehab\")\n", + " print(f\"p_rehab_only {p_rehab_only}\")\n", + "\n", + " # Find combinations of patients that would cause delays\n", + " asu_comb = self.get_delay_combinations(unit=\"asu\")\n", + " print(f\"asu combinations: {asu_comb}\")\n", + " rehab_comb = self.get_delay_combinations(unit=\"rehab\")\n", + " print(f\"rehab combinations: {rehab_comb}\")\n", + "\n", + " # Convert those to probabilities\n", + " p_asu_comb = self.calculate_combination_probability(asu_comb)\n", + " p_rehab_comb = self.calculate_combination_probability(rehab_comb)\n", + "\n", + " # Combine the only + combination probabilities for each unit\n", + " return {\"asu\": p_asu_only + p_asu_comb,\n", + " \"rehab\": p_rehab_only + p_rehab_comb}" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 21, "metadata": {}, + "outputs": [], "source": [ - "Can't check with data from article as don't have enough of it." + "pooled_delay = PooledDelay(base_results=base_overall)" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "fail\n", - "fail\n", - "{'asu': np.float64(0.02), 'rehab': np.float64(0.11)}\n", - "asu 14 rehab 12 pooled 0\n", - "fail\n", - "fail\n", - "fail\n", - "fail\n", - "fail\n", - "fail\n" + "p_asu_only 0.03366690305206313\n", + "p_rehab_only 0.10348735694418382\n", + "asu combinations: [{'asu': 14, 'rehab': 12}, {'asu': 13, 'rehab': 13}, {'asu': 12, 'rehab': 14}]\n", + "rehab combinations: [{'rehab': 14, 'asu': 12}, {'rehab': 13, 'asu': 13}, {'rehab': 12, 'asu': 14}]\n" ] + }, + { + "data": { + "text/plain": [ + "{'asu': np.float64(0.060365052325014074),\n", + " 'rehab': np.float64(0.13018550621713476)}" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "pooled_delay = PooledDelay(base_results=base_overall)\n", - "\n", - "# Replace with data from article\n", - "pooled_delay.asu = pd.Series(\n", - " data=[0.19, 0.14, 0.09, 0.06, 0.04, 0.02], index=[9, 10, 11, 12, 13, 14])\n", - "pooled_delay.rehab = pd.Series(\n", - " data=[0.20, 0.11, 0.08, 0.05, 0.03, 0.02], index=[10, 12, 13, 14, 15, 16])\n", - "\n", - "for beds in [(0, 0, 22), (0, 0, 26), (14, 12, 0), (11, 11, 4), (11, 10, 5),\n", - " (10, 10, 6), (10, 9, 7), (9, 9, 8), (9, 8, 9)]:\n", - " try:\n", - " print(pooled_delay.calculate_delay(\n", - " asu_beds=beds[0], rehab_beds=beds[1], pooled_beds=beds[2]))\n", - " print(f\"asu {beds[0]} rehab {beds[1]} pooled {beds[2]}\")\n", - " except:\n", - " print(\"fail\")" + "pooled_delay.calculate_delay(asu_beds=12, rehab_beds=12, pooled_beds=2)" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "asu 0 rehab 0 pooled 22\n", - "{'asu': np.float64(0.132), 'rehab': np.float64(0.132)}\n", - "------------------\n", - "asu 0 rehab 0 pooled 26\n", - "{'asu': np.float64(0.026), 'rehab': np.float64(0.026)}\n", - "------------------\n", "asu 14 rehab 12 pooled 0\n", - "{'asu': np.float64(0.022), 'rehab': np.float64(0.111)}\n", + "p_asu_only 0.03366690305206313\n", + "p_rehab_only 0.26561941446758824\n", + "asu combinations: [{'asu': 14, 'rehab': 12}]\n", + "rehab combinations: [{'rehab': 12, 'asu': 14}]\n", + "{'asu': np.float64(0.046670319634703195), 'rehab': np.float64(0.2786228310502283)}\n", "------------------\n", "asu 11 rehab 11 pooled 4\n", - "{'asu': np.float64(0.024), 'rehab': np.float64(0.043)}\n", + "p_asu_only 0.01524126873084381\n", + "p_rehab_only 0.056812888458539226\n", + "asu combinations: [{'asu': 15, 'rehab': 11}, {'asu': 14, 'rehab': 12}, {'asu': 13, 'rehab': 13}, {'asu': 12, 'rehab': 14}, {'asu': 11, 'rehab': 15}]\n", + "rehab combinations: [{'rehab': 15, 'asu': 11}, {'rehab': 14, 'asu': 12}, {'rehab': 13, 'asu': 13}, {'rehab': 12, 'asu': 14}, {'rehab': 11, 'asu': 15}]\n", + "{'asu': np.float64(0.05059883634119389), 'rehab': np.float64(0.0921704560688893)}\n", "------------------\n", "asu 11 rehab 10 pooled 5\n", - "{'asu': np.float64(0.02), 'rehab': np.float64(0.044)}\n", + "p_asu_only 0.006042192428014429\n", + "p_rehab_only 0.056812888458539226\n", + "asu combinations: [{'asu': 16, 'rehab': 10}, {'asu': 15, 'rehab': 11}, {'asu': 14, 'rehab': 12}, {'asu': 13, 'rehab': 13}, {'asu': 12, 'rehab': 14}, {'asu': 11, 'rehab': 15}]\n", + "rehab combinations: [{'rehab': 15, 'asu': 11}, {'rehab': 14, 'asu': 12}, {'rehab': 13, 'asu': 13}, {'rehab': 12, 'asu': 14}, {'rehab': 11, 'asu': 15}, {'rehab': 10, 'asu': 16}]\n", + "{'asu': np.float64(0.042935678612205756), 'rehab': np.float64(0.09370637464273054)}\n", "------------------\n", "asu 10 rehab 10 pooled 6\n", - "{'asu': np.float64(0.023), 'rehab': np.float64(0.034)}\n", + "p_asu_only 0.006042192428014429\n", + "p_rehab_only 0.028141824165467778\n", + "asu combinations: [{'asu': 16, 'rehab': 10}, {'asu': 15, 'rehab': 11}, {'asu': 14, 'rehab': 12}, {'asu': 13, 'rehab': 13}, {'asu': 12, 'rehab': 14}, {'asu': 11, 'rehab': 15}, {'asu': 10, 'rehab': 16}]\n", + "rehab combinations: [{'rehab': 16, 'asu': 10}, {'rehab': 15, 'asu': 11}, {'rehab': 14, 'asu': 12}, {'rehab': 13, 'asu': 13}, {'rehab': 12, 'asu': 14}, {'rehab': 11, 'asu': 15}, {'rehab': 10, 'asu': 16}]\n", + "{'asu': np.float64(0.047448536242363594), 'rehab': np.float64(0.06954816797981694)}\n", "------------------\n", "asu 10 rehab 9 pooled 7\n", - "{'asu': np.float64(0.021), 'rehab': np.float64(0.035)}\n", + "p_asu_only 0.0021562354079356144\n", + "p_rehab_only 0.028141824165467778\n", + "asu combinations: [{'asu': 17, 'rehab': 9}, {'asu': 16, 'rehab': 10}, {'asu': 15, 'rehab': 11}, {'asu': 14, 'rehab': 12}, {'asu': 13, 'rehab': 13}, {'asu': 12, 'rehab': 14}, {'asu': 11, 'rehab': 15}, {'asu': 10, 'rehab': 16}]\n", + "rehab combinations: [{'rehab': 16, 'asu': 10}, {'rehab': 15, 'asu': 11}, {'rehab': 14, 'asu': 12}, {'rehab': 13, 'asu': 13}, {'rehab': 12, 'asu': 14}, {'rehab': 11, 'asu': 15}, {'rehab': 10, 'asu': 16}, {'rehab': 9, 'asu': 17}]\n", + "{'asu': np.float64(0.044322156698984594), 'rehab': np.float64(0.07030774545651676)}\n", "------------------\n", "asu 9 rehab 9 pooled 8\n", - "{'asu': np.float64(0.023), 'rehab': np.float64(0.03)}\n", + "p_asu_only 0.0021562354079356144\n", + "p_rehab_only 0.012434220724338524\n", + "asu combinations: [{'asu': 17, 'rehab': 9}, {'asu': 16, 'rehab': 10}, {'asu': 15, 'rehab': 11}, {'asu': 14, 'rehab': 12}, {'asu': 13, 'rehab': 13}, {'asu': 12, 'rehab': 14}, {'asu': 11, 'rehab': 15}, {'asu': 10, 'rehab': 16}, {'asu': 9, 'rehab': 17}]\n", + "rehab combinations: [{'rehab': 17, 'asu': 9}, {'rehab': 16, 'asu': 10}, {'rehab': 15, 'asu': 11}, {'rehab': 14, 'asu': 12}, {'rehab': 13, 'asu': 13}, {'rehab': 12, 'asu': 14}, {'rehab': 11, 'asu': 15}, {'rehab': 10, 'asu': 16}, {'rehab': 9, 'asu': 17}]\n", + "{'asu': np.float64(0.047299752048539444), 'rehab': np.float64(0.05757773736494235)}\n", "------------------\n", "asu 9 rehab 8 pooled 9\n", - "{'asu': np.float64(0.022), 'rehab': np.float64(0.03)}\n", + "p_asu_only 0.0006415995930026479\n", + "p_rehab_only 0.012434220724338524\n", + "asu combinations: [{'asu': 18, 'rehab': 8}, {'asu': 17, 'rehab': 9}, {'asu': 16, 'rehab': 10}, {'asu': 15, 'rehab': 11}, {'asu': 14, 'rehab': 12}, {'asu': 13, 'rehab': 13}, {'asu': 12, 'rehab': 14}, {'asu': 11, 'rehab': 15}, {'asu': 10, 'rehab': 16}, {'asu': 9, 'rehab': 17}]\n", + "rehab combinations: [{'rehab': 17, 'asu': 9}, {'rehab': 16, 'asu': 10}, {'rehab': 15, 'asu': 11}, {'rehab': 14, 'asu': 12}, {'rehab': 13, 'asu': 13}, {'rehab': 12, 'asu': 14}, {'rehab': 11, 'asu': 15}, {'rehab': 10, 'asu': 16}, {'rehab': 9, 'asu': 17}, {'rehab': 8, 'asu': 18}]\n", + "{'asu': np.float64(0.046102869848418514), 'rehab': np.float64(0.05789549097975438)}\n", "------------------\n" ] } ], "source": [ - "pooled_delay = PooledDelay(base_results=base_overall)\n", - "for beds in [(0, 0, 22), (0, 0, 26), (14, 12, 0), (11, 11, 4), (11, 10, 5),\n", + "for beds in [(14, 12, 0), (11, 11, 4), (11, 10, 5),\n", " (10, 10, 6), (10, 9, 7), (9, 9, 8), (9, 8, 9)]:\n", " print(f\"asu {beds[0]} rehab {beds[1]} pooled {beds[2]}\")\n", " print(pooled_delay.calculate_delay(\n", @@ -4782,7 +5251,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -4791,7 +5260,7 @@ "0.024341193866000005" ] }, - "execution_count": 19, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -4799,111 +5268,6 @@ "source": [ "(0.012664*(1-0.150691))+(0.012664*0.150691)+(0.022350*0.111069)+(0.038513*0.077523)+(0.061437*0.051057)+(0.094876*0.032383)" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But it doesn't match the article." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "beds\n", - "0 1.000000\n", - "1 0.894819\n", - "2 0.770781\n", - "3 0.686520\n", - "4 0.587002\n", - "5 0.500791\n", - "6 0.413733\n", - "7 0.334108\n", - "8 0.256869\n", - "9 0.193202\n", - "10 0.138199\n", - "11 0.094876\n", - "12 0.061437\n", - "13 0.038513\n", - "14 0.022350\n", - "15 0.012664\n", - "16 0.006438\n", - "17 0.003322\n", - "18 0.001547\n", - "19 0.000643\n", - "20 0.000259\n", - "21 0.000132\n", - "22 0.000047\n", - "23 0.000015\n", - "24 0.000007\n", - "25 0.000004\n", - "26 0.000000\n", - "27 0.000004\n", - "Name: prob_delay, dtype: float64" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pooled_delay.asu" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "beds\n", - "0 1.000000\n", - "1 0.864662\n", - "2 0.814246\n", - "3 0.754290\n", - "4 0.660096\n", - "5 0.574731\n", - "6 0.488960\n", - "7 0.403547\n", - "8 0.331217\n", - "9 0.260503\n", - "10 0.202678\n", - "11 0.150691\n", - "12 0.111069\n", - "13 0.077523\n", - "14 0.051057\n", - "15 0.032383\n", - "16 0.019416\n", - "17 0.011187\n", - "18 0.006143\n", - "19 0.003121\n", - "20 0.001372\n", - "21 0.000680\n", - "22 0.000362\n", - "23 0.000179\n", - "24 0.000062\n", - "25 0.000018\n", - "26 0.000018\n", - "27 0.000004\n", - "Name: prob_delay, dtype: float64" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pooled_delay.rehab" - ] } ], "metadata": { From 1602069d36568e441e44c7e4bb5d934d6365b30f Mon Sep 17 00:00:00 2001 From: amyheather Date: Fri, 11 Apr 2025 09:13:47 +0100 Subject: [PATCH 11/24] docs(readme): add installation instructions and list of results --- README.md | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c24fd4a..16d3201 100644 --- a/README.md +++ b/README.md @@ -14,15 +14,31 @@ This repository applies the [Python DES RAP Template](https://github.com/pythonh > Monks T, Worthington D, Allen M, Pitt M, Stein K, James MA. A modelling tool for capacity planning in acute and community stroke services. BMC Health Serv Res. 2016 Sep 29;16(1):530. doi: [10.1186/s12913-016-1789-4](https://doi.org/10.1186/s12913-016-1789-4). PMID: 27688152; PMCID: PMC5043535. +Model diagram: + ![](images/stroke_rehab_design.png)
## Installation -TBC +Clone the repository locally: - +``` +git clone https://github.com/pythonhealthdatascience/stroke_rap_python.git +cd stroke_rap_python +``` + +Use the provided `environment.yaml` file to set up a Python environment with `conda`: + +``` +conda env create --file environment.yaml +conda activate +``` + +The provided `environment.yaml` file is a snapshot of the environment used when creating the repository, including specific package versions. You can update this file if necessary, but be sure to test that everything continues to work as expected after any updates. Also note that some dependencies are not required for modelling, but instead served other purposes, like running `.ipynb` files and linting. + +As an alternative, a `requirements.txt` file is provided which can be used to set up the environment with `virtualenv`. This is used by GitHub actions, which run much faster with a virtual environment than a conda environment. However, we recommend locally installing the environment using conda, as it will also manage the Python version for you. If using `virtualenv`, it won't fetch a specific version of Python - so please note the version listed in `environment.yaml`.
@@ -49,7 +65,7 @@ Example altering the model parameters: from simulation.parameters import Param, ASUArrivals, RehabRouting from simulation.runner import Runner -# Modified on of the arrival rates, some routing probabilities, and the +# Modified one of the arrival rates, some routing probabilities, and the # number of replications param = Param( asu_arrivals=ASUArrivals(tia=10), @@ -60,9 +76,20 @@ runner = Runner(param=param) rep_results = runner.run_reps() ``` -### Generating the figures from the article +### Generating the results from the article + +The original study used Simul8. Each of the outputs from that article have been replicated in this repository using Python: + +* Figure 1. Simulation probability density function for occupancy of an acute stroke unit. +* Figure 3. Simulated trade-off between the probability that a patient is delayed and the no. of acute beds available. +* Table 2. Likelihood of delay. Current admissions versus 5% more admissions. +* Table 3. Results of pooling of acute and rehab beds. +* Supplementary Table 1. Likelihood of delay. Current admissions versus No Complex neurological patients. +* Supplementary Table 3. Likelihood of delay. Current admissions versus ring fenced acute stroke beds. + +To generate these, simply execute `notebooks/analysis.ipynb`. -The original study used Simul8. Each of the outputs from that article have been reproduced in this repository using Python, with some examples below. To generate these, simply execute `notebooks/analysis.ipynb`. + #### Examples From 41ed9e33d4342da33cf2a44dc254125de43e6864 Mon Sep 17 00:00:00 2001 From: amyheather Date: Fri, 11 Apr 2025 09:14:48 +0100 Subject: [PATCH 12/24] docs(log): update log --- docs/log.md | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/docs/log.md b/docs/log.md index 53f6dc9..b105029 100644 --- a/docs/log.md +++ b/docs/log.md @@ -805,4 +805,52 @@ I then add new tests based on the python template and on the tests ran in https: I add methods to check parameter validity in `Param`. This flagged that rehab other routing probability don't sum to 100% (88% and 13%) - but this is as described in the paper, and presumed to be due to rounding, so altered the validation test to allow. -> 💡 When explain tests, could do all in one section, like Tests > Back tests, Tests > Functional tests, Tests > Unit tests - and then on each of those pages, it's like, if you have parameter validation... if you have warm-up... etc. etc. suggesting tests could include. \ No newline at end of file +> 💡 When explain tests, could do all in one section, like Tests > Back tests, Tests > Functional tests, Tests > Unit tests - and then on each of those pages, it's like, if you have parameter validation... if you have warm-up... etc. etc. suggesting tests could include. + +## Scenario logic + +Having successfully implemented the base model generating Figure 1 and 3 (as in https://github.com/pythonhealthdatascience/llm_simpy/), I then moved on to the scenarios from Monks et al. 2016. These were: + +0. **Current admissions** Current admission levels; beds are reserved for either acute or rehab patients +1. **5% more admissions** A 5% increase in admissions across all patient subgroups. +2. **Pooling of acute and rehab beds** The acute and rehab wards are co-located at same site. Beds are pooled and can be used by either acute or rehabilitation patients. Pooling of the total bed stock of 22 is compared to the pooling of an increased bed stock of 26. +3. **Partial pooling of acute and rehab beds** The acute and rehab wards are co-located at same site. A subset of the 26 beds are pooled and can be used by either acute or rehab patients. +4. **No complex-neurological cases** Complex neurological patients are excluded from the pathway in order to assess their impact on bed requirements + +### Scenario 1 and 4 + +As from the supplementary: + +> "Scenarios investigating increased demand multiply the mean arrival rates (supplied in main text) by the appropriate factor. To exclude a particular patient group, the mean inter-arrival time for that group is multiplied by a large number such that no arrivals will occur in the modelled time horizon." + +Hence, it is understood that: + +* **Scenario 1** can be achieved by multiplying all patient IAT by 1.05 (see below: 0.95). +* **Scenario 4** can be achieved by multiplying IAT for complex neurological patients by a very high number (e.g. 10,000,000) - and can add a test which checks no patients are complex neurological. + +## Using multiple replications + +Altered `Runner` to output summary tables from across replications, and switched to using these for Figures 1 and 3. + +## Scenario 1 + Table 2 + +Ran scenario 1 in `analysis.ipynb` and created Table 2. Noticed some differences. + +I find scenario with same bed number, probability of delay drops. They find that it goes up. + +Thinking through the logic, scenario has more arrivals -> wards more full -> expect delays for lower max bed numbers earlier -> expect higher probability of delay for lower bed numbers. + +I then realised my mistake! I had actually lower admissions, as I'd multiplied IAT by 1.05, when I should've multiplied by 0.95. + +## Scenario 4 + supplementary table 1 + +Ran scenario, adjusted function from table 2 so it could be used to make this table too. + +## Scenario logic + +We now have two remaining scenarios: + +* Scenario 2: **Pooling of acute and rehab beds** The acute and rehab wards are co-located at same site. Beds are pooled and can be used by either acute or rehabilitation patients. Pooling of the total bed stock of 22 is compared to the pooling of an increased bed stock of 26. +* Scenario 3: **Partial pooling of acute and rehab beds** The acute and rehab wards are co-located at same site. A subset of the 26 beds are pooled and can be used by either acute or rehab patients. + +It took quite a while to understand the formula and how to implement them. \ No newline at end of file From e5d9cd95461de5796c25370e1efd7701f6dc3785 Mon Sep 17 00:00:00 2001 From: amyheather Date: Tue, 6 May 2025 11:05:38 +0100 Subject: [PATCH 13/24] feat(data): add parameters as a long csv file --- inputs/data_dictionary.md | 9 +++++++++ inputs/parameters.csv | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 inputs/data_dictionary.md create mode 100644 inputs/parameters.csv diff --git a/inputs/data_dictionary.md b/inputs/data_dictionary.md new file mode 100644 index 0000000..b92a516 --- /dev/null +++ b/inputs/data_dictionary.md @@ -0,0 +1,9 @@ +# Data dictionary for `parameters.csv` + +| Column | Data type | Description | Possible values | +| - | - | - | - | +| unit | str | Hospital unit | `asu`: Acute Stroke Unit
`rehab`: Rehabilitation Unit (post-acute recovery care) | +| parameter | str | Type of operational metric | `iat`: Inter-arrival time (time between patient admissions)
`los`: Length of stay (duration from admission to discharge)
`routing`: Transition probability between care pathways | +| type | str | Patient classification or care transition path | **For `iat`/`los`:**
`stroke`: Stroke patients
`stroke_esd`: Stroke patients transferred to Early Supported Discharge
`stroke_noesd`: Stroke patients not transferred to Early Supported Discharge
`tia`: Transient Ischemic Attack patients
`neuro`: Complex neurological patients
`other`: Other patient types

**For `routing`:**
`[diagnosis]_rehab`: Probability of transferring to rehabilitation unit
`[diagnosis]_esd`: Probability of Early Supported Discharge
`[diagnosis]_other`: Probability of other discharge pathways | +| mean | float | **For `iat`:** Mean days between admissions
**For `los`:** Mean days in unit
**For `routing`:** Probability (0-1 scale) | - | +| sd | float | Standard deviation of the mean | - | \ No newline at end of file diff --git a/inputs/parameters.csv b/inputs/parameters.csv new file mode 100644 index 0000000..b564dd8 --- /dev/null +++ b/inputs/parameters.csv @@ -0,0 +1,38 @@ +unit,parameter,type,mean,sd +asu,iat,stroke,1.2,NA +asu,iat,tia,9.3,NA +asu,iat,neuro,3.6,NA +asu,iat,other,3.2,NA +rehab,iat,stroke,21.8,NA +rehab,iat,neuro,31.7,NA +rehab,iat,other,28.6,NA +asu,los,stroke_noesd,7.4,8.61 +asu,los,stroke_esd,4.6,4.8 +asu,los,tia,1.8,2.3 +asu,los,neuro,4,5 +asu,los,other,3.8,5.2 +rehab,los,stroke_noesd,28.4,27.2 +rehab,los,stroke_esd,30.3,2un3.1 +rehab,los,tia,18.7,23.5 +rehab,los,neuro,27.6,28.4 +rehab,los,other,16.1,14.1 +asu,routing,stroke_rehab,0.24,NA +asu,routing,stroke_esd,0.13,NA +asu,routing,stroke_other,0.63,NA +asu,routing,tia_rehab,0.01,NA +asu,routing,tia_esd,0.01,NA +asu,routing,tia_other,0.98,NA +asu,routing,neuro_rehab,0.11,NA +asu,routing,neuro_esd,0.05,NA +asu,routing,neuro_other,0.84,NA +asu,routing,other_rehab,0.05,NA +asu,routing,other_esd,0.1,NA +asu,routing,other_other,0.85,NA +rehab,routing,stroke_esd,0.4,NA +rehab,routing,stroke_other,0.6,NA +rehab,routing,tia_esd,0,NA +rehab,routing,tia_other,1,NA +rehab,routing,neuro_esd,0.09,NA +rehab,routing,neuro_other,0.91,NA +rehab,routing,other_esd,0.13,NA +rehab,routing,other_other,0.88,NA From be89bb827ca4d0a183e68e4476bbfd9dde077ddf Mon Sep 17 00:00:00 2001 From: amyheather Date: Tue, 6 May 2025 11:52:52 +0100 Subject: [PATCH 14/24] feat(data): create notebook with imports parameters from CSV and sets up Param (also, corrected noesd to no_esd in CSV) --- inputs/data_dictionary.md | 2 +- inputs/parameters.csv | 4 +- notebooks/parameters_csv.ipynb | 175 +++++++++++++++++++++++++++++++++ 3 files changed, 178 insertions(+), 3 deletions(-) create mode 100644 notebooks/parameters_csv.ipynb diff --git a/inputs/data_dictionary.md b/inputs/data_dictionary.md index b92a516..47e8d9a 100644 --- a/inputs/data_dictionary.md +++ b/inputs/data_dictionary.md @@ -4,6 +4,6 @@ | - | - | - | - | | unit | str | Hospital unit | `asu`: Acute Stroke Unit
`rehab`: Rehabilitation Unit (post-acute recovery care) | | parameter | str | Type of operational metric | `iat`: Inter-arrival time (time between patient admissions)
`los`: Length of stay (duration from admission to discharge)
`routing`: Transition probability between care pathways | -| type | str | Patient classification or care transition path | **For `iat`/`los`:**
`stroke`: Stroke patients
`stroke_esd`: Stroke patients transferred to Early Supported Discharge
`stroke_noesd`: Stroke patients not transferred to Early Supported Discharge
`tia`: Transient Ischemic Attack patients
`neuro`: Complex neurological patients
`other`: Other patient types

**For `routing`:**
`[diagnosis]_rehab`: Probability of transferring to rehabilitation unit
`[diagnosis]_esd`: Probability of Early Supported Discharge
`[diagnosis]_other`: Probability of other discharge pathways | +| type | str | Patient classification or care transition path | **For `iat`/`los`:**
`stroke`: Stroke patients
`stroke_esd`: Stroke patients transferred to Early Supported Discharge
`stroke_no_esd`: Stroke patients not transferred to Early Supported Discharge
`tia`: Transient Ischemic Attack patients
`neuro`: Complex neurological patients
`other`: Other patient types

**For `routing`:**
`[diagnosis]_rehab`: Probability of transferring to rehabilitation unit
`[diagnosis]_esd`: Probability of Early Supported Discharge
`[diagnosis]_other`: Probability of other discharge pathways | | mean | float | **For `iat`:** Mean days between admissions
**For `los`:** Mean days in unit
**For `routing`:** Probability (0-1 scale) | - | | sd | float | Standard deviation of the mean | - | \ No newline at end of file diff --git a/inputs/parameters.csv b/inputs/parameters.csv index b564dd8..43d1a5c 100644 --- a/inputs/parameters.csv +++ b/inputs/parameters.csv @@ -6,12 +6,12 @@ asu,iat,other,3.2,NA rehab,iat,stroke,21.8,NA rehab,iat,neuro,31.7,NA rehab,iat,other,28.6,NA -asu,los,stroke_noesd,7.4,8.61 +asu,los,stroke_no_esd,7.4,8.61 asu,los,stroke_esd,4.6,4.8 asu,los,tia,1.8,2.3 asu,los,neuro,4,5 asu,los,other,3.8,5.2 -rehab,los,stroke_noesd,28.4,27.2 +rehab,los,stroke_no_esd,28.4,27.2 rehab,los,stroke_esd,30.3,2un3.1 rehab,los,tia,18.7,23.5 rehab,los,neuro,27.6,28.4 diff --git a/notebooks/parameters_csv.ipynb b/notebooks/parameters_csv.ipynb new file mode 100644 index 0000000..66bbb3a --- /dev/null +++ b/notebooks/parameters_csv.ipynb @@ -0,0 +1,175 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Using parameters from csv" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "from simulation.parameters import (\n", + " ASUArrivals, RehabArrivals, ASULOS, RehabLOS,\n", + " ASURouting, RehabRouting, Param\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating parameter class\n", + "\n", + "We can set up classes based on CSV, replacing the default inputs with those from the csv.\n", + "\n", + "If you were only planning to use parameters from csv, then you could remove the default inputs from the classes in `parameters.py` altogether." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def init_param_class(df, unit, parameter, param_class):\n", + " \"\"\"\n", + " Instantiate a parameter class using values from a DataFrame.\n", + "\n", + " Parameters\n", + " ----------\n", + " df : pd.DataFrame\n", + " Dataframe with columns \"unit\", \"parameter\", \"type\", \"mean\" and \"sd\".\n", + " unit : str\n", + " Unit name to filter by (\"asu\" or \"rehab\").\n", + " parameter : str\n", + " Parameter name to filter by (\"iat\", \"los\" or \"routing\").\n", + " param_class: class\n", + " Class to instantiate.\n", + "\n", + " Returns\n", + " -------\n", + " object\n", + " An instance of param_class initialised with parameters from the\n", + " DataFrame.\n", + " \"\"\"\n", + " # Filter data to the specified unit and parameter\n", + " df_subset = df[(df[\"unit\"] == unit) & (df[\"parameter\"] == parameter)]\n", + "\n", + " # If all SD values are missing, create a dict: {type: mean}\n", + " if df_subset[\"sd\"].isnull().all():\n", + " param_dict = df_subset.set_index(\"type\")[\"mean\"].to_dict()\n", + " # Otherwise, create a nested dict with mean and SD for each type\n", + " else:\n", + " param_dict = {}\n", + " for _, row in df_subset.iterrows():\n", + " param_dict[f\"{row[\"type\"]}_mean\"] = row[\"mean\"]\n", + " param_dict[f\"{row[\"type\"]}_sd\"] = row[\"sd\"]\n", + "\n", + " # Instantiate parameter class using dict\n", + " return param_class(**param_dict)\n", + "\n", + "\n", + "\n", + "def setup_param_from_csv(csv_path):\n", + " \"\"\"\n", + " Create a Param instance using parameter values loaded from a CSV file.\n", + "\n", + " Parameters\n", + " ----------\n", + " csv_path : str\n", + " Path to csv file containing the parameters. Should have columns \"unit\",\n", + " \"parameter\", \"type\", \"mean\" and \"sd\". Missing values should be marked\n", + " as \"NA\".\n", + "\n", + " Returns\n", + " -------\n", + " Param\n", + " An instance of Param initialised with the parameters from the CSV file.\n", + " \"\"\"\n", + " # Load parameter data from CSV, treating \"NA\" as missing values\n", + " df = pd.read_csv(csv_path, na_values=[\"NA\"])\n", + "\n", + " # Specify mapping of Param() arguments to their corresponding units,\n", + " # parameter types, and parameter classes\n", + " param_specs = [\n", + " (\"asu_arrivals\", \"asu\", \"iat\", ASUArrivals),\n", + " (\"rehab_arrivals\", \"rehab\", \"iat\", RehabArrivals),\n", + " (\"asu_los\", \"asu\", \"los\", ASULOS),\n", + " (\"rehab_los\", \"rehab\", \"los\", RehabLOS),\n", + " (\"asu_routing\", \"asu\", \"routing\", ASURouting),\n", + " (\"rehab_routing\", \"rehab\", \"routing\", RehabRouting),\n", + " ]\n", + "\n", + " # Instantiate each parameter class and store in a dictionary\n", + " param_kwargs = {\n", + " name: init_param_class(\n", + " df=df, unit=unit, parameter=parameter, param_class=param_class)\n", + " for name, unit, parameter, param_class in param_specs\n", + " }\n", + "\n", + " # Return a Param instance initialised with all parameter classes\n", + " return Param(**param_kwargs)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'asu_arrivals': ,\n", + " 'rehab_arrivals': ,\n", + " 'asu_los': ,\n", + " 'rehab_los': ,\n", + " 'asu_routing': ,\n", + " 'rehab_routing': ,\n", + " 'warm_up_period': 1095,\n", + " 'data_collection_period': 1825,\n", + " 'number_of_runs': 150,\n", + " 'audit_interval': 1,\n", + " 'cores': 1,\n", + " 'logger': ,\n", + " '_initialised': True}" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "setup_param_from_csv(csv_path=\"../inputs/parameters.csv\").__dict__" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "stroke-rap-python", + "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.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From f79faca24dabcc5e08bc029e231833a62fdedd51 Mon Sep 17 00:00:00 2001 From: amyheather Date: Tue, 20 May 2025 15:04:25 +0100 Subject: [PATCH 15/24] feat(runner): add 1_in_n_delay to output table and regenerate exp results --- notebooks/generate_exp_results.ipynb | 36 +++++++++++------ simulation/runner.py | 30 +++++++++++++- tests/exp_results/asu_occupancy.csv | 56 +++++++++++++-------------- tests/exp_results/rehab_occupancy.csv | 36 ++++++++--------- 4 files changed, 98 insertions(+), 60 deletions(-) diff --git a/notebooks/generate_exp_results.ipynb b/notebooks/generate_exp_results.ipynb index 7ffa02f..78b89f9 100644 --- a/notebooks/generate_exp_results.ipynb +++ b/notebooks/generate_exp_results.ipynb @@ -178,6 +178,7 @@ " pct\n", " c_pct\n", " prob_delay\n", + " 1_in_n_delay\n", " \n", " \n", " \n", @@ -188,6 +189,7 @@ " 0.000548\n", " 0.000548\n", " 1.000000\n", + " 1.0\n", " \n", " \n", " 1\n", @@ -196,6 +198,7 @@ " 0.006575\n", " 0.007123\n", " 0.923077\n", + " 1.0\n", " \n", " \n", " 2\n", @@ -204,6 +207,7 @@ " 0.021370\n", " 0.028493\n", " 0.750000\n", + " 1.0\n", " \n", " \n", " 3\n", @@ -212,6 +216,7 @@ " 0.041644\n", " 0.070137\n", " 0.593750\n", + " 2.0\n", " \n", " \n", " 4\n", @@ -220,18 +225,19 @@ " 0.073425\n", " 0.143562\n", " 0.511450\n", + " 2.0\n", " \n", " \n", "\n", "" ], "text/plain": [ - " beds freq pct c_pct prob_delay\n", - "0 1 1 0.000548 0.000548 1.000000\n", - "1 2 12 0.006575 0.007123 0.923077\n", - "2 3 39 0.021370 0.028493 0.750000\n", - "3 4 76 0.041644 0.070137 0.593750\n", - "4 5 134 0.073425 0.143562 0.511450" + " beds freq pct c_pct prob_delay 1_in_n_delay\n", + "0 1 1 0.000548 0.000548 1.000000 1.0\n", + "1 2 12 0.006575 0.007123 0.923077 1.0\n", + "2 3 39 0.021370 0.028493 0.750000 1.0\n", + "3 4 76 0.041644 0.070137 0.593750 2.0\n", + "4 5 134 0.073425 0.143562 0.511450 2.0" ] }, "metadata": {}, @@ -263,6 +269,7 @@ " pct\n", " c_pct\n", " prob_delay\n", + " 1_in_n_delay\n", " \n", " \n", " \n", @@ -273,6 +280,7 @@ " 0.004932\n", " 0.004932\n", " 1.000000\n", + " 1.0\n", " \n", " \n", " 1\n", @@ -281,6 +289,7 @@ " 0.013699\n", " 0.018630\n", " 0.735294\n", + " 1.0\n", " \n", " \n", " 2\n", @@ -289,6 +298,7 @@ " 0.040548\n", " 0.059178\n", " 0.685185\n", + " 1.0\n", " \n", " \n", " 3\n", @@ -297,6 +307,7 @@ " 0.080548\n", " 0.139726\n", " 0.576471\n", + " 2.0\n", " \n", " \n", " 4\n", @@ -305,18 +316,19 @@ " 0.096438\n", " 0.236164\n", " 0.408353\n", + " 2.0\n", " \n", " \n", "\n", "" ], "text/plain": [ - " beds freq pct c_pct prob_delay\n", - "0 3 9 0.004932 0.004932 1.000000\n", - "1 4 25 0.013699 0.018630 0.735294\n", - "2 5 74 0.040548 0.059178 0.685185\n", - "3 6 147 0.080548 0.139726 0.576471\n", - "4 7 176 0.096438 0.236164 0.408353" + " beds freq pct c_pct prob_delay 1_in_n_delay\n", + "0 3 9 0.004932 0.004932 1.000000 1.0\n", + "1 4 25 0.013699 0.018630 0.735294 1.0\n", + "2 5 74 0.040548 0.059178 0.685185 1.0\n", + "3 6 147 0.080548 0.139726 0.576471 2.0\n", + "4 7 176 0.096438 0.236164 0.408353 2.0" ] }, "metadata": {}, diff --git a/simulation/runner.py b/simulation/runner.py index d2a3424..630bb68 100644 --- a/simulation/runner.py +++ b/simulation/runner.py @@ -70,6 +70,7 @@ def calculate_occupancy_stats(self, df): 1. Percentage 2. Cumulative percentage 3. Probability of delay + 4. 1 in every n patients delays Parameters ---------- @@ -86,6 +87,9 @@ def calculate_occupancy_stats(self, df): # Calculate the probability of delay df["prob_delay"] = df["pct"] / df["c_pct"] + # Add column with calculation of 1 in every n patients delayed + df["1_in_n_delay"] = round(1 / df["prob_delay"]) + return df def run_single(self, run): @@ -103,11 +107,28 @@ def run_single(self, run): rehab_occupancy = self.get_occupancy_freq( audit_list=model.audit_list, unit="rehab") - return {"asu": asu_occupancy, "rehab": rehab_occupancy} + # Return the raw audit list and calculated occupancy frequencies + return {"audit_list": model.audit_list, + "asu": asu_occupancy, + "rehab": rehab_occupancy} def run_reps(self): """ Execute a single model configuration for multiple runs/replications. + + Returns + ------- + result : dict of str -> pd.DataFrame + Dictionary containing concatenated occupancy dataframes for each + unit (e.g., 'asu' and 'rehab'), with an added 'run' column + indicating the replication. + overall : dict of str -> pd.DataFrame + Dictionary containing summary statistics for each unit, including + frequency, percentage, cumulative percentage, and probability of + delay. + combined_audit_list : list + Combined audit list containing all audit entries from every + replication, concatenated into a single list. """ # Sequential execution if self.param.cores == 1: @@ -163,4 +184,9 @@ def run_reps(self): # delay, and save to dictionary overall[unit] = self.calculate_occupancy_stats(comb) - return result, overall + # Combine all audit lists from every replication into one list + combined_audit_list = [] + for entry in results: + combined_audit_list.extend(entry["audit_list"]) + + return result, overall, combined_audit_list diff --git a/tests/exp_results/asu_occupancy.csv b/tests/exp_results/asu_occupancy.csv index 75e2cd9..7f544e8 100644 --- a/tests/exp_results/asu_occupancy.csv +++ b/tests/exp_results/asu_occupancy.csv @@ -1,28 +1,28 @@ -beds,freq,pct,c_pct,prob_delay -1,1,0.000547945205479452,0.000547945205479452,1.0 -2,12,0.006575342465753425,0.007123287671232877,0.923076923076923 -3,39,0.021369863013698632,0.02849315068493151,0.75 -4,76,0.041643835616438356,0.07013698630136986,0.59375 -5,134,0.07342465753424658,0.14356164383561643,0.5114503816793894 -6,215,0.1178082191780822,0.26136986301369863,0.45073375262054505 -7,226,0.12383561643835617,0.3852054794520548,0.32147937411095306 -8,266,0.14575342465753424,0.530958904109589,0.27450980392156865 -9,245,0.13424657534246576,0.6652054794520548,0.20181219110378915 -10,163,0.08931506849315068,0.7545205479452055,0.11837327523602033 -11,165,0.09041095890410959,0.8449315068493151,0.10700389105058367 -12,108,0.05917808219178082,0.9041095890410958,0.06545454545454546 -13,89,0.04876712328767123,0.952876712328767,0.05117883841288097 -14,34,0.01863013698630137,0.9715068493150684,0.019176536943034405 -15,15,0.00821917808219178,0.9797260273972601,0.008389261744966443 -16,19,0.010410958904109589,0.9901369863013697,0.010514665190924186 -17,6,0.0032876712328767125,0.9934246575342465,0.003309431880860453 -18,5,0.0027397260273972603,0.9961643835616437,0.0027502750275027505 -19,2,0.001095890410958904,0.9972602739726026,0.001098901098901099 -20,1,0.000547945205479452,0.997808219178082,0.0005491488193300384 -21,1,0.000547945205479452,0.9983561643835615,0.0005488474204171241 -22,1,0.000547945205479452,0.9989041095890409,0.0005485463521667582 -23,0,0.0,0.9989041095890409,0.0 -24,1,0.000547945205479452,0.9994520547945203,0.0005482456140350878 -25,0,0.0,0.9994520547945203,0.0 -26,0,0.0,0.9994520547945203,0.0 -27,1,0.000547945205479452,0.9999999999999997,0.0005479452054794522 +beds,freq,pct,c_pct,prob_delay,1_in_n_delay +1,1,0.000547945205479452,0.000547945205479452,1.0,1.0 +2,12,0.006575342465753425,0.007123287671232877,0.923076923076923,1.0 +3,39,0.021369863013698632,0.02849315068493151,0.75,1.0 +4,76,0.041643835616438356,0.07013698630136986,0.59375,2.0 +5,134,0.07342465753424658,0.14356164383561643,0.5114503816793894,2.0 +6,215,0.1178082191780822,0.26136986301369863,0.45073375262054505,2.0 +7,226,0.12383561643835617,0.3852054794520548,0.32147937411095306,3.0 +8,266,0.14575342465753424,0.530958904109589,0.27450980392156865,4.0 +9,245,0.13424657534246576,0.6652054794520548,0.20181219110378915,5.0 +10,163,0.08931506849315068,0.7545205479452055,0.11837327523602033,8.0 +11,165,0.09041095890410959,0.8449315068493151,0.10700389105058367,9.0 +12,108,0.05917808219178082,0.9041095890410958,0.06545454545454546,15.0 +13,89,0.04876712328767123,0.952876712328767,0.05117883841288097,20.0 +14,34,0.01863013698630137,0.9715068493150684,0.019176536943034405,52.0 +15,15,0.00821917808219178,0.9797260273972601,0.008389261744966443,119.0 +16,19,0.010410958904109589,0.9901369863013697,0.010514665190924186,95.0 +17,6,0.0032876712328767125,0.9934246575342465,0.003309431880860453,302.0 +18,5,0.0027397260273972603,0.9961643835616437,0.0027502750275027505,364.0 +19,2,0.001095890410958904,0.9972602739726026,0.001098901098901099,910.0 +20,1,0.000547945205479452,0.997808219178082,0.0005491488193300384,1821.0 +21,1,0.000547945205479452,0.9983561643835615,0.0005488474204171241,1822.0 +22,1,0.000547945205479452,0.9989041095890409,0.0005485463521667582,1823.0 +23,0,0.0,0.9989041095890409,0.0,inf +24,1,0.000547945205479452,0.9994520547945203,0.0005482456140350878,1824.0 +25,0,0.0,0.9994520547945203,0.0,inf +26,0,0.0,0.9994520547945203,0.0,inf +27,1,0.000547945205479452,0.9999999999999997,0.0005479452054794522,1825.0 diff --git a/tests/exp_results/rehab_occupancy.csv b/tests/exp_results/rehab_occupancy.csv index 7b4f398..d20032c 100644 --- a/tests/exp_results/rehab_occupancy.csv +++ b/tests/exp_results/rehab_occupancy.csv @@ -1,18 +1,18 @@ -beds,freq,pct,c_pct,prob_delay -3,9,0.004931506849315068,0.004931506849315068,1.0 -4,25,0.0136986301369863,0.01863013698630137,0.7352941176470588 -5,74,0.040547945205479455,0.05917808219178082,0.6851851851851852 -6,147,0.08054794520547945,0.13972602739726026,0.5764705882352942 -7,176,0.09643835616438357,0.23616438356164382,0.4083526682134571 -8,247,0.13534246575342465,0.3715068493150685,0.36430678466076694 -9,308,0.16876712328767124,0.5402739726027397,0.31237322515212984 -10,331,0.18136986301369862,0.7216438356164383,0.2513287775246773 -11,220,0.12054794520547946,0.8421917808219177,0.14313597918022122 -12,117,0.06410958904109589,0.9063013698630136,0.07073760580411124 -13,71,0.03890410958904109,0.9452054794520547,0.04115942028985507 -14,46,0.025205479452054796,0.9704109589041094,0.02597402597402598 -15,24,0.01315068493150685,0.9835616438356163,0.01337047353760446 -16,14,0.007671232876712329,0.9912328767123286,0.007739082365948039 -17,7,0.0038356164383561643,0.9950684931506848,0.0038546255506607934 -18,1,0.000547945205479452,0.9956164383561642,0.0005503577325261421 -19,8,0.004383561643835616,0.9999999999999998,0.004383561643835617 +beds,freq,pct,c_pct,prob_delay,1_in_n_delay +3,9,0.004931506849315068,0.004931506849315068,1.0,1.0 +4,25,0.0136986301369863,0.01863013698630137,0.7352941176470588,1.0 +5,74,0.040547945205479455,0.05917808219178082,0.6851851851851852,1.0 +6,147,0.08054794520547945,0.13972602739726026,0.5764705882352942,2.0 +7,176,0.09643835616438357,0.23616438356164382,0.4083526682134571,2.0 +8,247,0.13534246575342465,0.3715068493150685,0.36430678466076694,3.0 +9,308,0.16876712328767124,0.5402739726027397,0.31237322515212984,3.0 +10,331,0.18136986301369862,0.7216438356164383,0.2513287775246773,4.0 +11,220,0.12054794520547946,0.8421917808219177,0.14313597918022122,7.0 +12,117,0.06410958904109589,0.9063013698630136,0.07073760580411124,14.0 +13,71,0.03890410958904109,0.9452054794520547,0.04115942028985507,24.0 +14,46,0.025205479452054796,0.9704109589041094,0.02597402597402598,38.0 +15,24,0.01315068493150685,0.9835616438356163,0.01337047353760446,75.0 +16,14,0.007671232876712329,0.9912328767123286,0.007739082365948039,129.0 +17,7,0.0038356164383561643,0.9950684931506848,0.0038546255506607934,259.0 +18,1,0.000547945205479452,0.9956164383561642,0.0005503577325261421,1817.0 +19,8,0.004383561643835616,0.9999999999999998,0.004383561643835617,228.0 From bab543e5aadc30ae4132583fde7b4f69a6ff02e2 Mon Sep 17 00:00:00 2001 From: amyheather Date: Tue, 20 May 2025 15:05:13 +0100 Subject: [PATCH 16/24] fix(complete pooling): correct calculation of complete pooling to use raw bed numbers rather than just combining counts of overall frequencies --- notebooks/analysis.ipynb | 1148 ++++++++++++++++++++++------------- outputs/delay_scenario1.csv | 24 +- outputs/delay_scenario4.csv | 22 +- outputs/pooling.csv | 10 + 4 files changed, 764 insertions(+), 440 deletions(-) create mode 100644 outputs/pooling.csv diff --git a/notebooks/analysis.ipynb b/notebooks/analysis.ipynb index 35914e4..0e54b33 100644 --- a/notebooks/analysis.ipynb +++ b/notebooks/analysis.ipynb @@ -47,7 +47,6 @@ "import plotly.express as px\n", "\n", "from simulation.parameters import Param, ASUArrivals, RehabArrivals\n", - "from simulation.model import Model\n", "from simulation.runner import Runner" ] }, @@ -77,10 +76,10 @@ "outputs": [], "source": [ "# Set up runner to run in parallel with nine cores\n", - "runner = Runner(param=Param(cores=9))\n", + "base_runner = Runner(param=Param(cores=9))\n", "\n", "# Run the model for 150 replications\n", - "base_reps, base_overall = runner.run_reps()" + "base_reps, base_overall, base_audit = base_runner.run_reps()" ] }, { @@ -3830,8 +3829,8 @@ "outputs": [], "source": [ "# Run the model for 150 replications\n", - "runner = Runner(param=s1_param)\n", - "s1_reps, s1_overall = runner.run_reps()" + "s1_runner = Runner(param=s1_param)\n", + "s1_reps, s1_overall, s1_audit = s1_runner.run_reps()" ] }, { @@ -3890,18 +3889,16 @@ " scenario_name: scenario[unit_name]}.items():\n", "\n", " # Extract results for specified beds\n", - " df = df[df[\"beds\"].isin(unit_beds)][[\"beds\", \"prob_delay\"]]\n", - "\n", - " # Add column with calculation of 1 in every n patients delayed\n", - " df[f\"1_in_n_delay_{scenario_name}\"] = (\n", - " round(1 / df[\"prob_delay\"])).astype(int)\n", + " df = df[df[\"beds\"].isin(unit_beds)][\n", + " [\"beds\", \"prob_delay\", \"1_in_n_delay\"]]\n", "\n", " # Round probability of delay to 2 d.p.\n", " df[\"prob_delay\"] = round(df[\"prob_delay\"], 2)\n", "\n", " # Rename column to be specific to scenario\n", " df = df.rename(columns={\n", - " \"prob_delay\": f\"prob_delay_{scenario_name}\"})\n", + " \"prob_delay\": f\"prob_delay_{scenario_name}\",\n", + " \"1_in_n_delay\": f\"1_in_n_delay_{scenario_name}\"})\n", "\n", " # Save dataframe to list\n", " tab_segment.append(df)\n", @@ -3959,117 +3956,117 @@ " asu\n", " 9\n", " 0.19\n", - " 5\n", + " 5.0\n", " 0.21\n", - " 5\n", + " 5.0\n", " \n", " \n", " 1\n", " asu\n", " 10\n", " 0.14\n", - " 7\n", + " 7.0\n", " 0.16\n", - " 6\n", + " 6.0\n", " \n", " \n", " 2\n", " asu\n", " 11\n", " 0.09\n", - " 11\n", + " 11.0\n", " 0.11\n", - " 9\n", + " 9.0\n", " \n", " \n", " 3\n", " asu\n", " 12\n", " 0.06\n", - " 16\n", + " 16.0\n", " 0.08\n", - " 13\n", + " 13.0\n", " \n", " \n", " 4\n", " asu\n", " 13\n", " 0.04\n", - " 26\n", + " 26.0\n", " 0.05\n", - " 20\n", + " 20.0\n", " \n", " \n", " 5\n", " asu\n", " 14\n", " 0.02\n", - " 45\n", + " 45.0\n", " 0.03\n", - " 33\n", + " 33.0\n", " \n", " \n", " 6\n", " rehab\n", " 10\n", " 0.20\n", - " 5\n", + " 5.0\n", " 0.23\n", - " 4\n", + " 4.0\n", " \n", " \n", " 7\n", " rehab\n", " 11\n", " 0.15\n", - " 7\n", + " 7.0\n", " 0.18\n", - " 6\n", + " 6.0\n", " \n", " \n", " 8\n", " rehab\n", " 12\n", " 0.11\n", - " 9\n", + " 9.0\n", " 0.13\n", - " 8\n", + " 8.0\n", " \n", " \n", " 9\n", " rehab\n", " 13\n", " 0.08\n", - " 13\n", + " 13.0\n", " 0.09\n", - " 11\n", + " 11.0\n", " \n", " \n", " 10\n", " rehab\n", " 14\n", " 0.05\n", - " 20\n", + " 20.0\n", " 0.06\n", - " 15\n", + " 15.0\n", " \n", " \n", " 11\n", " rehab\n", " 15\n", " 0.03\n", - " 31\n", + " 31.0\n", " 0.04\n", - " 23\n", + " 23.0\n", " \n", " \n", " 12\n", " rehab\n", " 16\n", " 0.02\n", - " 52\n", + " 52.0\n", " 0.03\n", - " 37\n", + " 37.0\n", " \n", " \n", "\n", @@ -4077,34 +4074,34 @@ ], "text/plain": [ " unit beds prob_delay_current 1_in_n_delay_current prob_delay_5% \\\n", - "0 asu 9 0.19 5 0.21 \n", - "1 asu 10 0.14 7 0.16 \n", - "2 asu 11 0.09 11 0.11 \n", - "3 asu 12 0.06 16 0.08 \n", - "4 asu 13 0.04 26 0.05 \n", - "5 asu 14 0.02 45 0.03 \n", - "6 rehab 10 0.20 5 0.23 \n", - "7 rehab 11 0.15 7 0.18 \n", - "8 rehab 12 0.11 9 0.13 \n", - "9 rehab 13 0.08 13 0.09 \n", - "10 rehab 14 0.05 20 0.06 \n", - "11 rehab 15 0.03 31 0.04 \n", - "12 rehab 16 0.02 52 0.03 \n", + "0 asu 9 0.19 5.0 0.21 \n", + "1 asu 10 0.14 7.0 0.16 \n", + "2 asu 11 0.09 11.0 0.11 \n", + "3 asu 12 0.06 16.0 0.08 \n", + "4 asu 13 0.04 26.0 0.05 \n", + "5 asu 14 0.02 45.0 0.03 \n", + "6 rehab 10 0.20 5.0 0.23 \n", + "7 rehab 11 0.15 7.0 0.18 \n", + "8 rehab 12 0.11 9.0 0.13 \n", + "9 rehab 13 0.08 13.0 0.09 \n", + "10 rehab 14 0.05 20.0 0.06 \n", + "11 rehab 15 0.03 31.0 0.04 \n", + "12 rehab 16 0.02 52.0 0.03 \n", "\n", " 1_in_n_delay_5% \n", - "0 5 \n", - "1 6 \n", - "2 9 \n", - "3 13 \n", - "4 20 \n", - "5 33 \n", - "6 4 \n", - "7 6 \n", - "8 8 \n", - "9 11 \n", - "10 15 \n", - "11 23 \n", - "12 37 " + "0 5.0 \n", + "1 6.0 \n", + "2 9.0 \n", + "3 13.0 \n", + "4 20.0 \n", + "5 33.0 \n", + "6 4.0 \n", + "7 6.0 \n", + "8 8.0 \n", + "9 11.0 \n", + "10 15.0 \n", + "11 23.0 \n", + "12 37.0 " ] }, "execution_count": 11, @@ -4168,7 +4165,7 @@ " asu\n", " 9\n", " 0.19\n", - " 5\n", + " 5.0\n", " NaN\n", " NaN\n", " \n", @@ -4177,7 +4174,7 @@ " asu\n", " 10\n", " 0.14\n", - " 7\n", + " 7.0\n", " 0.16\n", " 6.0\n", " \n", @@ -4186,7 +4183,7 @@ " asu\n", " 11\n", " 0.09\n", - " 11\n", + " 11.0\n", " 0.11\n", " 9.0\n", " \n", @@ -4195,7 +4192,7 @@ " asu\n", " 12\n", " 0.06\n", - " 16\n", + " 16.0\n", " 0.08\n", " 13.0\n", " \n", @@ -4204,7 +4201,7 @@ " asu\n", " 13\n", " 0.04\n", - " 26\n", + " 26.0\n", " 0.05\n", " 20.0\n", " \n", @@ -4213,7 +4210,7 @@ " asu\n", " 14\n", " 0.02\n", - " 45\n", + " 45.0\n", " 0.03\n", " 33.0\n", " \n", @@ -4222,7 +4219,7 @@ " rehab\n", " 10\n", " 0.20\n", - " 5\n", + " 5.0\n", " NaN\n", " NaN\n", " \n", @@ -4231,7 +4228,7 @@ " rehab\n", " 12\n", " 0.11\n", - " 9\n", + " 9.0\n", " 0.13\n", " 8.0\n", " \n", @@ -4240,7 +4237,7 @@ " rehab\n", " 13\n", " 0.08\n", - " 13\n", + " 13.0\n", " 0.09\n", " 11.0\n", " \n", @@ -4249,7 +4246,7 @@ " rehab\n", " 14\n", " 0.05\n", - " 20\n", + " 20.0\n", " 0.06\n", " 15.0\n", " \n", @@ -4258,7 +4255,7 @@ " rehab\n", " 15\n", " 0.03\n", - " 31\n", + " 31.0\n", " 0.04\n", " 23.0\n", " \n", @@ -4267,7 +4264,7 @@ " rehab\n", " 16\n", " 0.02\n", - " 52\n", + " 52.0\n", " 0.03\n", " 37.0\n", " \n", @@ -4277,18 +4274,18 @@ ], "text/plain": [ " unit beds prob_delay_current 1_in_n_delay_current prob_delay_5% \\\n", - "0 asu 9 0.19 5 NaN \n", - "1 asu 10 0.14 7 0.16 \n", - "2 asu 11 0.09 11 0.11 \n", - "3 asu 12 0.06 16 0.08 \n", - "4 asu 13 0.04 26 0.05 \n", - "5 asu 14 0.02 45 0.03 \n", - "6 rehab 10 0.20 5 NaN \n", - "8 rehab 12 0.11 9 0.13 \n", - "9 rehab 13 0.08 13 0.09 \n", - "10 rehab 14 0.05 20 0.06 \n", - "11 rehab 15 0.03 31 0.04 \n", - "12 rehab 16 0.02 52 0.03 \n", + "0 asu 9 0.19 5.0 NaN \n", + "1 asu 10 0.14 7.0 0.16 \n", + "2 asu 11 0.09 11.0 0.11 \n", + "3 asu 12 0.06 16.0 0.08 \n", + "4 asu 13 0.04 26.0 0.05 \n", + "5 asu 14 0.02 45.0 0.03 \n", + "6 rehab 10 0.20 5.0 NaN \n", + "8 rehab 12 0.11 9.0 0.13 \n", + "9 rehab 13 0.08 13.0 0.09 \n", + "10 rehab 14 0.05 20.0 0.06 \n", + "11 rehab 15 0.03 31.0 0.04 \n", + "12 rehab 16 0.02 52.0 0.03 \n", "\n", " 1_in_n_delay_5% \n", "0 NaN \n", @@ -4360,8 +4357,8 @@ "outputs": [], "source": [ "# Run the model for 150 replications\n", - "runner = Runner(param=s4_param)\n", - "s4_reps, s4_overall = runner.run_reps()" + "s4_runner = Runner(param=s4_param)\n", + "s4_reps, s4_overall, s4_audit = s4_runner.run_reps()" ] }, { @@ -4413,99 +4410,99 @@ " asu\n", " 10\n", " 0.14\n", - " 7\n", + " 7.0\n", " 0.09\n", - " 11\n", + " 11.0\n", " \n", " \n", " 1\n", " asu\n", " 11\n", " 0.09\n", - " 11\n", + " 11.0\n", " 0.06\n", - " 18\n", + " 18.0\n", " \n", " \n", " 2\n", " asu\n", " 12\n", " 0.06\n", - " 16\n", + " 16.0\n", " 0.03\n", - " 31\n", + " 31.0\n", " \n", " \n", " 3\n", " asu\n", " 13\n", " 0.04\n", - " 26\n", + " 26.0\n", " 0.02\n", - " 55\n", + " 55.0\n", " \n", " \n", " 4\n", " asu\n", " 14\n", " 0.02\n", - " 45\n", + " 45.0\n", " 0.01\n", - " 111\n", + " 111.0\n", " \n", " \n", " 5\n", " asu\n", " 15\n", " 0.01\n", - " 79\n", + " 79.0\n", " 0.00\n", - " 225\n", + " 225.0\n", " \n", " \n", " 6\n", " rehab\n", " 12\n", " 0.11\n", - " 9\n", + " 9.0\n", " 0.05\n", - " 20\n", + " 20.0\n", " \n", " \n", " 7\n", " rehab\n", " 13\n", " 0.08\n", - " 13\n", + " 13.0\n", " 0.03\n", - " 32\n", + " 32.0\n", " \n", " \n", " 8\n", " rehab\n", " 14\n", " 0.05\n", - " 20\n", + " 20.0\n", " 0.02\n", - " 57\n", + " 57.0\n", " \n", " \n", " 9\n", " rehab\n", " 15\n", " 0.03\n", - " 31\n", + " 31.0\n", " 0.01\n", - " 101\n", + " 101.0\n", " \n", " \n", " 10\n", " rehab\n", " 16\n", " 0.02\n", - " 52\n", + " 52.0\n", " 0.00\n", - " 212\n", + " 212.0\n", " \n", " \n", "\n", @@ -4513,30 +4510,30 @@ ], "text/plain": [ " unit beds prob_delay_current 1_in_n_delay_current \\\n", - "0 asu 10 0.14 7 \n", - "1 asu 11 0.09 11 \n", - "2 asu 12 0.06 16 \n", - "3 asu 13 0.04 26 \n", - "4 asu 14 0.02 45 \n", - "5 asu 15 0.01 79 \n", - "6 rehab 12 0.11 9 \n", - "7 rehab 13 0.08 13 \n", - "8 rehab 14 0.05 20 \n", - "9 rehab 15 0.03 31 \n", - "10 rehab 16 0.02 52 \n", + "0 asu 10 0.14 7.0 \n", + "1 asu 11 0.09 11.0 \n", + "2 asu 12 0.06 16.0 \n", + "3 asu 13 0.04 26.0 \n", + "4 asu 14 0.02 45.0 \n", + "5 asu 15 0.01 79.0 \n", + "6 rehab 12 0.11 9.0 \n", + "7 rehab 13 0.08 13.0 \n", + "8 rehab 14 0.05 20.0 \n", + "9 rehab 15 0.03 31.0 \n", + "10 rehab 16 0.02 52.0 \n", "\n", " prob_delay_no_complex_neuro 1_in_n_delay_no_complex_neuro \n", - "0 0.09 11 \n", - "1 0.06 18 \n", - "2 0.03 31 \n", - "3 0.02 55 \n", - "4 0.01 111 \n", - "5 0.00 225 \n", - "6 0.05 20 \n", - "7 0.03 32 \n", - "8 0.02 57 \n", - "9 0.01 101 \n", - "10 0.00 212 " + "0 0.09 11.0 \n", + "1 0.06 18.0 \n", + "2 0.03 31.0 \n", + "3 0.02 55.0 \n", + "4 0.01 111.0 \n", + "5 0.00 225.0 \n", + "6 0.05 20.0 \n", + "7 0.03 32.0 \n", + "8 0.02 57.0 \n", + "9 0.01 101.0 \n", + "10 0.00 212.0 " ] }, "metadata": {}, @@ -4570,26 +4567,6 @@ "cell_type": "code", "execution_count": 16, "metadata": {}, - "outputs": [], - "source": [ - "pooled_freq = base_overall[\"asu\"][\"freq\"] + base_overall[\"rehab\"][\"freq\"]\n", - "\n", - "df = pd.DataFrame(pooled_freq)\n", - "\n", - "# Add column with frequencies converted to proportions\n", - "df[\"pct\"] = df[\"freq\"] / df[\"freq\"].sum()\n", - "\n", - "# Add column with the cumulative percentage\n", - "df[\"c_pct\"] = df[\"pct\"].cumsum()\n", - "\n", - "# Calculate the probability of delay\n", - "df[\"prob_delay\"] = df[\"pct\"] / df[\"c_pct\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, "outputs": [ { "data": { @@ -4612,292 +4589,497 @@ " \n", " \n", " \n", + " beds\n", " freq\n", " pct\n", " c_pct\n", " prob_delay\n", + " 1_in_n_delay\n", " \n", " \n", " \n", " \n", " 0\n", - " 85\n", - " 0.000155\n", - " 0.000155\n", + " 2\n", + " 1\n", + " 0.000004\n", + " 0.000004\n", " 1.000000\n", + " 1.0\n", " \n", " \n", " 1\n", - " 685\n", - " 0.001251\n", - " 0.001406\n", - " 0.889610\n", + " 3\n", + " 11\n", + " 0.000040\n", + " 0.000044\n", + " 0.916667\n", + " 1.0\n", " \n", " \n", " 2\n", - " 2725\n", - " 0.004977\n", - " 0.006384\n", - " 0.779685\n", + " 4\n", + " 13\n", + " 0.000047\n", + " 0.000091\n", + " 0.520000\n", + " 2.0\n", " \n", " \n", " 3\n", - " 8284\n", - " 0.015131\n", - " 0.021514\n", - " 0.703286\n", + " 5\n", + " 52\n", + " 0.000190\n", + " 0.000281\n", + " 0.675325\n", + " 1.0\n", " \n", " \n", " 4\n", - " 18259\n", - " 0.033350\n", - " 0.054864\n", - " 0.607863\n", + " 6\n", + " 133\n", + " 0.000486\n", + " 0.000767\n", + " 0.633333\n", + " 2.0\n", " \n", " \n", " 5\n", - " 33119\n", - " 0.060491\n", - " 0.115355\n", - " 0.524392\n", + " 7\n", + " 416\n", + " 0.001520\n", + " 0.002287\n", + " 0.664537\n", + " 2.0\n", " \n", " \n", " 6\n", - " 49632\n", - " 0.090652\n", - " 0.206007\n", - " 0.440043\n", + " 8\n", + " 952\n", + " 0.003478\n", + " 0.005764\n", + " 0.603295\n", + " 2.0\n", " \n", " \n", " 7\n", - " 63488\n", - " 0.115960\n", - " 0.321967\n", - " 0.360160\n", + " 9\n", + " 2049\n", + " 0.007485\n", + " 0.013249\n", + " 0.564930\n", + " 2.0\n", " \n", " \n", " 8\n", - " 70825\n", - " 0.129361\n", - " 0.451328\n", - " 0.286623\n", + " 10\n", + " 3709\n", + " 0.013549\n", + " 0.026798\n", + " 0.505589\n", + " 2.0\n", " \n", " \n", " 9\n", - " 70328\n", - " 0.128453\n", - " 0.579781\n", - " 0.221554\n", + " 11\n", + " 6326\n", + " 0.023109\n", + " 0.049907\n", + " 0.463036\n", + " 2.0\n", " \n", " \n", " 10\n", - " 63452\n", - " 0.115894\n", - " 0.695675\n", - " 0.166592\n", + " 12\n", + " 9584\n", + " 0.035010\n", + " 0.084917\n", + " 0.412286\n", + " 2.0\n", " \n", " \n", " 11\n", - " 52102\n", - " 0.095163\n", - " 0.790838\n", - " 0.120332\n", + " 13\n", + " 13434\n", + " 0.049074\n", + " 0.133991\n", + " 0.366249\n", + " 3.0\n", " \n", " \n", " 12\n", - " 40090\n", - " 0.073224\n", - " 0.864062\n", - " 0.084744\n", + " 14\n", + " 17387\n", + " 0.063514\n", + " 0.197505\n", + " 0.321582\n", + " 3.0\n", " \n", " \n", " 13\n", - " 28720\n", - " 0.052457\n", - " 0.916519\n", - " 0.057235\n", + " 15\n", + " 21372\n", + " 0.078071\n", + " 0.275576\n", + " 0.283302\n", + " 4.0\n", " \n", " \n", " 14\n", - " 18923\n", - " 0.034563\n", - " 0.951081\n", - " 0.036340\n", + " 16\n", + " 23833\n", + " 0.087061\n", + " 0.362637\n", + " 0.240078\n", + " 4.0\n", " \n", " \n", " 15\n", - " 11917\n", - " 0.021766\n", - " 0.972847\n", - " 0.022374\n", + " 17\n", + " 25548\n", + " 0.093326\n", + " 0.455963\n", + " 0.204679\n", + " 5.0\n", " \n", " \n", " 16\n", - " 6945\n", - " 0.012685\n", - " 0.985532\n", - " 0.012871\n", + " 18\n", + " 25435\n", + " 0.092913\n", + " 0.548877\n", + " 0.169279\n", + " 6.0\n", " \n", " \n", " 17\n", - " 3933\n", - " 0.007184\n", - " 0.992716\n", - " 0.007236\n", + " 19\n", + " 24410\n", + " 0.089169\n", + " 0.638046\n", + " 0.139753\n", + " 7.0\n", " \n", " \n", " 18\n", - " 2095\n", - " 0.003826\n", - " 0.996542\n", - " 0.003840\n", + " 20\n", + " 22014\n", + " 0.080416\n", + " 0.718462\n", + " 0.111929\n", + " 9.0\n", " \n", " \n", " 19\n", - " 1028\n", - " 0.001878\n", - " 0.998420\n", - " 0.001881\n", + " 21\n", + " 19212\n", + " 0.070181\n", + " 0.788643\n", + " 0.088989\n", + " 11.0\n", " \n", " \n", " 20\n", - " 446\n", - " 0.000815\n", - " 0.999235\n", - " 0.000815\n", + " 22\n", + " 15967\n", + " 0.058327\n", + " 0.846970\n", + " 0.068865\n", + " 15.0\n", " \n", " \n", " 21\n", - " 222\n", - " 0.000405\n", - " 0.999640\n", - " 0.000406\n", + " 23\n", + " 12496\n", + " 0.045647\n", + " 0.892617\n", + " 0.051139\n", + " 20.0\n", " \n", " \n", " 22\n", - " 112\n", - " 0.000205\n", - " 0.999845\n", - " 0.000205\n", + " 24\n", + " 9255\n", + " 0.033808\n", + " 0.926426\n", + " 0.036493\n", + " 27.0\n", " \n", " \n", " 23\n", - " 53\n", - " 0.000097\n", - " 0.999942\n", - " 0.000097\n", + " 25\n", + " 6781\n", + " 0.024771\n", + " 0.951196\n", + " 0.026042\n", + " 38.0\n", " \n", " \n", " 24\n", - " 19\n", - " 0.000035\n", - " 0.999976\n", - " 0.000035\n", + " 26\n", + " 4850\n", + " 0.017717\n", + " 0.968913\n", + " 0.018285\n", + " 55.0\n", " \n", " \n", " 25\n", - " 6\n", - " 0.000011\n", - " 0.999987\n", - " 0.000011\n", + " 27\n", + " 3344\n", + " 0.012216\n", + " 0.981129\n", + " 0.012450\n", + " 80.0\n", " \n", " \n", " 26\n", - " 5\n", - " 0.000009\n", - " 0.999996\n", - " 0.000009\n", + " 28\n", + " 2025\n", + " 0.007397\n", + " 0.988526\n", + " 0.007483\n", + " 134.0\n", " \n", " \n", " 27\n", + " 29\n", + " 1238\n", + " 0.004522\n", + " 0.993048\n", + " 0.004554\n", + " 220.0\n", + " \n", + " \n", + " 28\n", + " 30\n", + " 810\n", + " 0.002959\n", + " 0.996007\n", + " 0.002971\n", + " 337.0\n", + " \n", + " \n", + " 29\n", + " 31\n", + " 457\n", + " 0.001669\n", + " 0.997677\n", + " 0.001673\n", + " 598.0\n", + " \n", + " \n", + " 30\n", + " 32\n", + " 267\n", + " 0.000975\n", + " 0.998652\n", + " 0.000977\n", + " 1024.0\n", + " \n", + " \n", + " 31\n", + " 33\n", + " 155\n", + " 0.000566\n", + " 0.999218\n", + " 0.000567\n", + " 1765.0\n", + " \n", + " \n", + " 32\n", + " 34\n", + " 99\n", + " 0.000362\n", + " 0.999580\n", + " 0.000362\n", + " 2764.0\n", + " \n", + " \n", + " 33\n", + " 35\n", + " 46\n", + " 0.000168\n", + " 0.999748\n", + " 0.000168\n", + " 5950.0\n", + " \n", + " \n", + " 34\n", + " 36\n", + " 30\n", + " 0.000110\n", + " 0.999858\n", + " 0.000110\n", + " 9124.0\n", + " \n", + " \n", + " 35\n", + " 37\n", + " 22\n", + " 0.000080\n", + " 0.999938\n", + " 0.000080\n", + " 12442.0\n", + " \n", + " \n", + " 36\n", + " 38\n", + " 6\n", + " 0.000022\n", + " 0.999960\n", + " 0.000022\n", + " 45623.0\n", + " \n", + " \n", + " 37\n", + " 39\n", + " 4\n", + " 0.000015\n", + " 0.999974\n", + " 0.000015\n", + " 68436.0\n", + " \n", + " \n", + " 38\n", + " 40\n", + " 4\n", + " 0.000015\n", + " 0.999989\n", + " 0.000015\n", + " 68437.0\n", + " \n", + " \n", + " 39\n", + " 41\n", " 2\n", + " 0.000007\n", + " 0.999996\n", + " 0.000007\n", + " 136875.0\n", + " \n", + " \n", + " 40\n", + " 42\n", + " 1\n", " 0.000004\n", " 1.000000\n", " 0.000004\n", + " 273750.0\n", " \n", " \n", "\n", "" ], "text/plain": [ - " freq pct c_pct prob_delay\n", - "0 85 0.000155 0.000155 1.000000\n", - "1 685 0.001251 0.001406 0.889610\n", - "2 2725 0.004977 0.006384 0.779685\n", - "3 8284 0.015131 0.021514 0.703286\n", - "4 18259 0.033350 0.054864 0.607863\n", - "5 33119 0.060491 0.115355 0.524392\n", - "6 49632 0.090652 0.206007 0.440043\n", - "7 63488 0.115960 0.321967 0.360160\n", - "8 70825 0.129361 0.451328 0.286623\n", - "9 70328 0.128453 0.579781 0.221554\n", - "10 63452 0.115894 0.695675 0.166592\n", - "11 52102 0.095163 0.790838 0.120332\n", - "12 40090 0.073224 0.864062 0.084744\n", - "13 28720 0.052457 0.916519 0.057235\n", - "14 18923 0.034563 0.951081 0.036340\n", - "15 11917 0.021766 0.972847 0.022374\n", - "16 6945 0.012685 0.985532 0.012871\n", - "17 3933 0.007184 0.992716 0.007236\n", - "18 2095 0.003826 0.996542 0.003840\n", - "19 1028 0.001878 0.998420 0.001881\n", - "20 446 0.000815 0.999235 0.000815\n", - "21 222 0.000405 0.999640 0.000406\n", - "22 112 0.000205 0.999845 0.000205\n", - "23 53 0.000097 0.999942 0.000097\n", - "24 19 0.000035 0.999976 0.000035\n", - "25 6 0.000011 0.999987 0.000011\n", - "26 5 0.000009 0.999996 0.000009\n", - "27 2 0.000004 1.000000 0.000004" + " beds freq pct c_pct prob_delay 1_in_n_delay\n", + "0 2 1 0.000004 0.000004 1.000000 1.0\n", + "1 3 11 0.000040 0.000044 0.916667 1.0\n", + "2 4 13 0.000047 0.000091 0.520000 2.0\n", + "3 5 52 0.000190 0.000281 0.675325 1.0\n", + "4 6 133 0.000486 0.000767 0.633333 2.0\n", + "5 7 416 0.001520 0.002287 0.664537 2.0\n", + "6 8 952 0.003478 0.005764 0.603295 2.0\n", + "7 9 2049 0.007485 0.013249 0.564930 2.0\n", + "8 10 3709 0.013549 0.026798 0.505589 2.0\n", + "9 11 6326 0.023109 0.049907 0.463036 2.0\n", + "10 12 9584 0.035010 0.084917 0.412286 2.0\n", + "11 13 13434 0.049074 0.133991 0.366249 3.0\n", + "12 14 17387 0.063514 0.197505 0.321582 3.0\n", + "13 15 21372 0.078071 0.275576 0.283302 4.0\n", + "14 16 23833 0.087061 0.362637 0.240078 4.0\n", + "15 17 25548 0.093326 0.455963 0.204679 5.0\n", + "16 18 25435 0.092913 0.548877 0.169279 6.0\n", + "17 19 24410 0.089169 0.638046 0.139753 7.0\n", + "18 20 22014 0.080416 0.718462 0.111929 9.0\n", + "19 21 19212 0.070181 0.788643 0.088989 11.0\n", + "20 22 15967 0.058327 0.846970 0.068865 15.0\n", + "21 23 12496 0.045647 0.892617 0.051139 20.0\n", + "22 24 9255 0.033808 0.926426 0.036493 27.0\n", + "23 25 6781 0.024771 0.951196 0.026042 38.0\n", + "24 26 4850 0.017717 0.968913 0.018285 55.0\n", + "25 27 3344 0.012216 0.981129 0.012450 80.0\n", + "26 28 2025 0.007397 0.988526 0.007483 134.0\n", + "27 29 1238 0.004522 0.993048 0.004554 220.0\n", + "28 30 810 0.002959 0.996007 0.002971 337.0\n", + "29 31 457 0.001669 0.997677 0.001673 598.0\n", + "30 32 267 0.000975 0.998652 0.000977 1024.0\n", + "31 33 155 0.000566 0.999218 0.000567 1765.0\n", + "32 34 99 0.000362 0.999580 0.000362 2764.0\n", + "33 35 46 0.000168 0.999748 0.000168 5950.0\n", + "34 36 30 0.000110 0.999858 0.000110 9124.0\n", + "35 37 22 0.000080 0.999938 0.000080 12442.0\n", + "36 38 6 0.000022 0.999960 0.000022 45623.0\n", + "37 39 4 0.000015 0.999974 0.000015 68436.0\n", + "38 40 4 0.000015 0.999989 0.000015 68437.0\n", + "39 41 2 0.000007 0.999996 0.000007 136875.0\n", + "40 42 1 0.000004 1.000000 0.000004 273750.0" ] }, - "execution_count": 17, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df" + "# Calculate the combined occupancy from each timepoint in the audit\n", + "combined_audit = [\n", + " {\"pooled_occupancy\": b[\"asu_occupancy\"] + b[\"rehab_occupancy\"]}\n", + " for b in base_audit\n", + "]\n", + "\n", + "# Hijack the get_occupancy_freq() method from runner to calculate stats\n", + "pooled_results = base_runner.get_occupancy_freq(combined_audit, unit=\"pooled\")\n", + "pooled_results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Get probability of delay and 1 in every n patients delayed from 22 and 26 pooled beds, to use in Table 3 below." ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "np.float64(0.0002045979741147027)" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "0.06886542625227508 15.0\n" + ] } ], "source": [ - "df.loc[22][\"prob_delay\"]" + "pdelay_pooling_22 = pooled_results[\n", + " pooled_results[\"beds\"] == 22][\"prob_delay\"].item()\n", + "npatients_pooling_22 = pooled_results[\n", + " pooled_results[\"beds\"] == 22][\"1_in_n_delay\"].item()\n", + "print(pdelay_pooling_22, npatients_pooling_22)" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "np.float64(9.132453451884755e-06)" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "0.01828532649675765 55.0\n" + ] } ], "source": [ - "df.loc[26][\"prob_delay\"]" + "pdelay_pooling_26 = pooled_results[\n", + " pooled_results[\"beds\"] == 26][\"prob_delay\"].item()\n", + "npatients_pooling_26 = pooled_results[\n", + " pooled_results[\"beds\"] == 26][\"1_in_n_delay\"].item()\n", + "print(pdelay_pooling_26, npatients_pooling_26)" ] }, { @@ -4911,7 +5093,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -5111,162 +5293,294 @@ "\n", " # Get probability of only the ASU, or only rehab, having delays\n", " p_asu_only = self.calculate_only_unit_overflow(unit=\"asu\")\n", - " print(f\"p_asu_only {p_asu_only}\")\n", + " #print(f\"p_asu_only {p_asu_only}\")\n", " p_rehab_only = self.calculate_only_unit_overflow(unit=\"rehab\")\n", - " print(f\"p_rehab_only {p_rehab_only}\")\n", + " #print(f\"p_rehab_only {p_rehab_only}\")\n", "\n", " # Find combinations of patients that would cause delays\n", " asu_comb = self.get_delay_combinations(unit=\"asu\")\n", - " print(f\"asu combinations: {asu_comb}\")\n", + " #print(f\"asu combinations: {asu_comb}\")\n", " rehab_comb = self.get_delay_combinations(unit=\"rehab\")\n", - " print(f\"rehab combinations: {rehab_comb}\")\n", + " #print(f\"rehab combinations: {rehab_comb}\")\n", "\n", " # Convert those to probabilities\n", " p_asu_comb = self.calculate_combination_probability(asu_comb)\n", " p_rehab_comb = self.calculate_combination_probability(rehab_comb)\n", "\n", - " # Combine the only + combination probabilities for each unit\n", - " return {\"asu\": p_asu_only + p_asu_comb,\n", - " \"rehab\": p_rehab_only + p_rehab_comb}" + " # Create dictionary with the bed numbers, and the combined only +\n", + " # combination probabilities for each unit\n", + " pool_results = {\n", + " \"dedicated_acute\": self.asu_beds,\n", + " \"dedicated_rehab\": self.rehab_beds,\n", + " \"pooled\": self.pooled_beds,\n", + " \"pdelay_acute\": p_asu_only + p_asu_comb,\n", + " \"pdelay_rehab\": p_rehab_only + p_rehab_comb}\n", + "\n", + " # Calculate 1 in every n patients delays\n", + " pool_results[\"1_in_n_delay_acute\"] = (\n", + " round(1 / pool_results[\"pdelay_acute\"]))\n", + " pool_results[\"1_in_n_delay_rehab\"] = (\n", + " round(1 / pool_results[\"pdelay_rehab\"]))\n", + "\n", + " # Round the probability of delay (after calculation, so doesn't impact)\n", + " pool_results[\"pdelay_acute\"] = round(pool_results[\"pdelay_acute\"], 3)\n", + " pool_results[\"pdelay_rehab\"] = round(pool_results[\"pdelay_rehab\"], 3)\n", + "\n", + " return pool_results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create list with the 22 + 26 pooled bed results." ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ - "pooled_delay = PooledDelay(base_results=base_overall)" + "def create_pool_result(pooled_value, pdelay_value, npatients_value):\n", + " \"\"\"\n", + " Create a dictionary representing a pool result entry.\n", + "\n", + " Parameters\n", + " ----------\n", + " pooled_value : int\n", + " The value for the 'pooled' key.\n", + " pdelay_value : float or int\n", + " The probability of delay (for acute and rehab).\n", + " npatients_value : int\n", + " 1 in every n patients delayed (for acute and rehab).\n", + "\n", + " Returns\n", + " -------\n", + " dict\n", + " A dictionary with keys 'dedicated_acute', 'dedicated_rehab', 'pooled', \n", + " 'pdelay_acute', and 'pdelay_rehab'.\n", + " \"\"\"\n", + " return {\n", + " \"dedicated_acute\": 0,\n", + " \"dedicated_rehab\": 0,\n", + " \"pooled\": pooled_value,\n", + " \"pdelay_acute\": pdelay_value,\n", + " \"pdelay_rehab\": pdelay_value,\n", + " \"1_in_n_delay_acute\": npatients_value,\n", + " \"1_in_n_delay_rehab\": npatients_value\n", + " }\n", + "\n", + "\n", + "pool_result_list = [\n", + " create_pool_result(22, pdelay_pooling_22, npatients_pooling_22),\n", + " create_pool_result(26, pdelay_pooling_26, npatients_pooling_26)\n", + "]" ] }, { - "cell_type": "code", - "execution_count": 22, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "p_asu_only 0.03366690305206313\n", - "p_rehab_only 0.10348735694418382\n", - "asu combinations: [{'asu': 14, 'rehab': 12}, {'asu': 13, 'rehab': 13}, {'asu': 12, 'rehab': 14}]\n", - "rehab combinations: [{'rehab': 14, 'asu': 12}, {'rehab': 13, 'asu': 13}, {'rehab': 12, 'asu': 14}]\n" - ] - }, - { - "data": { - "text/plain": [ - "{'asu': np.float64(0.060365052325014074),\n", - " 'rehab': np.float64(0.13018550621713476)}" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "pooled_delay.calculate_delay(asu_beds=12, rehab_beds=12, pooled_beds=2)" + "Calculate results from other pooling scenarios and add to the list, then display as a dataframe." ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 21, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "asu 14 rehab 12 pooled 0\n", - "p_asu_only 0.03366690305206313\n", - "p_rehab_only 0.26561941446758824\n", - "asu combinations: [{'asu': 14, 'rehab': 12}]\n", - "rehab combinations: [{'rehab': 12, 'asu': 14}]\n", - "{'asu': np.float64(0.046670319634703195), 'rehab': np.float64(0.2786228310502283)}\n", - "------------------\n", - "asu 11 rehab 11 pooled 4\n", - "p_asu_only 0.01524126873084381\n", - "p_rehab_only 0.056812888458539226\n", - "asu combinations: [{'asu': 15, 'rehab': 11}, {'asu': 14, 'rehab': 12}, {'asu': 13, 'rehab': 13}, {'asu': 12, 'rehab': 14}, {'asu': 11, 'rehab': 15}]\n", - "rehab combinations: [{'rehab': 15, 'asu': 11}, {'rehab': 14, 'asu': 12}, {'rehab': 13, 'asu': 13}, {'rehab': 12, 'asu': 14}, {'rehab': 11, 'asu': 15}]\n", - "{'asu': np.float64(0.05059883634119389), 'rehab': np.float64(0.0921704560688893)}\n", - "------------------\n", - "asu 11 rehab 10 pooled 5\n", - "p_asu_only 0.006042192428014429\n", - "p_rehab_only 0.056812888458539226\n", - "asu combinations: [{'asu': 16, 'rehab': 10}, {'asu': 15, 'rehab': 11}, {'asu': 14, 'rehab': 12}, {'asu': 13, 'rehab': 13}, {'asu': 12, 'rehab': 14}, {'asu': 11, 'rehab': 15}]\n", - "rehab combinations: [{'rehab': 15, 'asu': 11}, {'rehab': 14, 'asu': 12}, {'rehab': 13, 'asu': 13}, {'rehab': 12, 'asu': 14}, {'rehab': 11, 'asu': 15}, {'rehab': 10, 'asu': 16}]\n", - "{'asu': np.float64(0.042935678612205756), 'rehab': np.float64(0.09370637464273054)}\n", - "------------------\n", - "asu 10 rehab 10 pooled 6\n", - "p_asu_only 0.006042192428014429\n", - "p_rehab_only 0.028141824165467778\n", - "asu combinations: [{'asu': 16, 'rehab': 10}, {'asu': 15, 'rehab': 11}, {'asu': 14, 'rehab': 12}, {'asu': 13, 'rehab': 13}, {'asu': 12, 'rehab': 14}, {'asu': 11, 'rehab': 15}, {'asu': 10, 'rehab': 16}]\n", - "rehab combinations: [{'rehab': 16, 'asu': 10}, {'rehab': 15, 'asu': 11}, {'rehab': 14, 'asu': 12}, {'rehab': 13, 'asu': 13}, {'rehab': 12, 'asu': 14}, {'rehab': 11, 'asu': 15}, {'rehab': 10, 'asu': 16}]\n", - "{'asu': np.float64(0.047448536242363594), 'rehab': np.float64(0.06954816797981694)}\n", - "------------------\n", - "asu 10 rehab 9 pooled 7\n", - "p_asu_only 0.0021562354079356144\n", - "p_rehab_only 0.028141824165467778\n", - "asu combinations: [{'asu': 17, 'rehab': 9}, {'asu': 16, 'rehab': 10}, {'asu': 15, 'rehab': 11}, {'asu': 14, 'rehab': 12}, {'asu': 13, 'rehab': 13}, {'asu': 12, 'rehab': 14}, {'asu': 11, 'rehab': 15}, {'asu': 10, 'rehab': 16}]\n", - "rehab combinations: [{'rehab': 16, 'asu': 10}, {'rehab': 15, 'asu': 11}, {'rehab': 14, 'asu': 12}, {'rehab': 13, 'asu': 13}, {'rehab': 12, 'asu': 14}, {'rehab': 11, 'asu': 15}, {'rehab': 10, 'asu': 16}, {'rehab': 9, 'asu': 17}]\n", - "{'asu': np.float64(0.044322156698984594), 'rehab': np.float64(0.07030774545651676)}\n", - "------------------\n", - "asu 9 rehab 9 pooled 8\n", - "p_asu_only 0.0021562354079356144\n", - "p_rehab_only 0.012434220724338524\n", - "asu combinations: [{'asu': 17, 'rehab': 9}, {'asu': 16, 'rehab': 10}, {'asu': 15, 'rehab': 11}, {'asu': 14, 'rehab': 12}, {'asu': 13, 'rehab': 13}, {'asu': 12, 'rehab': 14}, {'asu': 11, 'rehab': 15}, {'asu': 10, 'rehab': 16}, {'asu': 9, 'rehab': 17}]\n", - "rehab combinations: [{'rehab': 17, 'asu': 9}, {'rehab': 16, 'asu': 10}, {'rehab': 15, 'asu': 11}, {'rehab': 14, 'asu': 12}, {'rehab': 13, 'asu': 13}, {'rehab': 12, 'asu': 14}, {'rehab': 11, 'asu': 15}, {'rehab': 10, 'asu': 16}, {'rehab': 9, 'asu': 17}]\n", - "{'asu': np.float64(0.047299752048539444), 'rehab': np.float64(0.05757773736494235)}\n", - "------------------\n", - "asu 9 rehab 8 pooled 9\n", - "p_asu_only 0.0006415995930026479\n", - "p_rehab_only 0.012434220724338524\n", - "asu combinations: [{'asu': 18, 'rehab': 8}, {'asu': 17, 'rehab': 9}, {'asu': 16, 'rehab': 10}, {'asu': 15, 'rehab': 11}, {'asu': 14, 'rehab': 12}, {'asu': 13, 'rehab': 13}, {'asu': 12, 'rehab': 14}, {'asu': 11, 'rehab': 15}, {'asu': 10, 'rehab': 16}, {'asu': 9, 'rehab': 17}]\n", - "rehab combinations: [{'rehab': 17, 'asu': 9}, {'rehab': 16, 'asu': 10}, {'rehab': 15, 'asu': 11}, {'rehab': 14, 'asu': 12}, {'rehab': 13, 'asu': 13}, {'rehab': 12, 'asu': 14}, {'rehab': 11, 'asu': 15}, {'rehab': 10, 'asu': 16}, {'rehab': 9, 'asu': 17}, {'rehab': 8, 'asu': 18}]\n", - "{'asu': np.float64(0.046102869848418514), 'rehab': np.float64(0.05789549097975438)}\n", - "------------------\n" - ] - } - ], + "outputs": [], "source": [ + "# Create instance of class\n", + "pooled_delay = PooledDelay(base_results=base_overall)\n", + "\n", + "# Loop through other pooling scenarios\n", "for beds in [(14, 12, 0), (11, 11, 4), (11, 10, 5),\n", " (10, 10, 6), (10, 9, 7), (9, 9, 8), (9, 8, 9)]:\n", - " print(f\"asu {beds[0]} rehab {beds[1]} pooled {beds[2]}\")\n", - " print(pooled_delay.calculate_delay(\n", - " asu_beds=beds[0], rehab_beds=beds[1], pooled_beds=beds[2]))\n", - " print(\"------------------\")" + " pool_result_list.append(pooled_delay.calculate_delay(\n", + " asu_beds=beds[0], rehab_beds=beds[1], pooled_beds=beds[2]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "14 12 0 matches my base overall 14 and 12 (which it should as no pooling basically)\n", - "\n", - "11 11 4 matches my manual calculation below for ASU -" + "### Table 3" ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 22, "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
dedicated_acutededicated_rehabpooledpdelay_acutepdelay_rehab1_in_n_delay_acute1_in_n_delay_rehab
000220.0690.0691515
100260.0180.0185555
2141200.0470.279214
3111140.0510.0922011
4111050.0430.0942311
5101060.0470.0702114
610970.0440.0702314
79980.0470.0582117
89890.0460.0582217
\n", + "
" + ], "text/plain": [ - "0.024341193866000005" + " dedicated_acute dedicated_rehab pooled pdelay_acute pdelay_rehab \\\n", + "0 0 0 22 0.069 0.069 \n", + "1 0 0 26 0.018 0.018 \n", + "2 14 12 0 0.047 0.279 \n", + "3 11 11 4 0.051 0.092 \n", + "4 11 10 5 0.043 0.094 \n", + "5 10 10 6 0.047 0.070 \n", + "6 10 9 7 0.044 0.070 \n", + "7 9 9 8 0.047 0.058 \n", + "8 9 8 9 0.046 0.058 \n", + "\n", + " 1_in_n_delay_acute 1_in_n_delay_rehab \n", + "0 15 15 \n", + "1 55 55 \n", + "2 21 4 \n", + "3 20 11 \n", + "4 23 11 \n", + "5 21 14 \n", + "6 23 14 \n", + "7 21 17 \n", + "8 22 17 " ] }, - "execution_count": 24, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "(0.012664*(1-0.150691))+(0.012664*0.150691)+(0.022350*0.111069)+(0.038513*0.077523)+(0.061437*0.051057)+(0.094876*0.032383)" + "# Convert to a dataframe\n", + "tab2 = pd.DataFrame(pool_result_list)\n", + "\n", + "for delay_type in [\"acute\", \"rehab\"]:\n", + " # Round probabilities to 3 decimal places\n", + " tab2[f\"pdelay_{delay_type}\"] = round(tab2[f\"pdelay_{delay_type}\"], 3)\n", + " # Convert 1-in-n counts to integers\n", + " tab2[f\"1_in_n_delay_{delay_type}\"] = (\n", + " tab2[f\"1_in_n_delay_{delay_type}\"].astype(int))\n", + "\n", + "# Display and save to csv\n", + "display(tab2)\n", + "tab2.to_csv(\n", + " os.path.join(OUTPUT_DIR, \"pooling.csv\"), index=False)" ] } ], diff --git a/outputs/delay_scenario1.csv b/outputs/delay_scenario1.csv index 00845d1..ce434f7 100644 --- a/outputs/delay_scenario1.csv +++ b/outputs/delay_scenario1.csv @@ -1,13 +1,13 @@ unit,beds,prob_delay_current,1_in_n_delay_current,prob_delay_5%,1_in_n_delay_5% -asu,9,0.19,5,, -asu,10,0.14,7,0.16,6.0 -asu,11,0.09,11,0.11,9.0 -asu,12,0.06,16,0.08,13.0 -asu,13,0.04,26,0.05,20.0 -asu,14,0.02,45,0.03,33.0 -rehab,10,0.2,5,, -rehab,12,0.11,9,0.13,8.0 -rehab,13,0.08,13,0.09,11.0 -rehab,14,0.05,20,0.06,15.0 -rehab,15,0.03,31,0.04,23.0 -rehab,16,0.02,52,0.03,37.0 +asu,9,0.19,5.0,, +asu,10,0.14,7.0,0.16,6.0 +asu,11,0.09,11.0,0.11,9.0 +asu,12,0.06,16.0,0.08,13.0 +asu,13,0.04,26.0,0.05,20.0 +asu,14,0.02,45.0,0.03,33.0 +rehab,10,0.2,5.0,, +rehab,12,0.11,9.0,0.13,8.0 +rehab,13,0.08,13.0,0.09,11.0 +rehab,14,0.05,20.0,0.06,15.0 +rehab,15,0.03,31.0,0.04,23.0 +rehab,16,0.02,52.0,0.03,37.0 diff --git a/outputs/delay_scenario4.csv b/outputs/delay_scenario4.csv index f1e1154..26b30c6 100644 --- a/outputs/delay_scenario4.csv +++ b/outputs/delay_scenario4.csv @@ -1,12 +1,12 @@ unit,beds,prob_delay_current,1_in_n_delay_current,prob_delay_no_complex_neuro,1_in_n_delay_no_complex_neuro -asu,10,0.14,7,0.09,11 -asu,11,0.09,11,0.06,18 -asu,12,0.06,16,0.03,31 -asu,13,0.04,26,0.02,55 -asu,14,0.02,45,0.01,111 -asu,15,0.01,79,0.0,225 -rehab,12,0.11,9,0.05,20 -rehab,13,0.08,13,0.03,32 -rehab,14,0.05,20,0.02,57 -rehab,15,0.03,31,0.01,101 -rehab,16,0.02,52,0.0,212 +asu,10,0.14,7.0,0.09,11.0 +asu,11,0.09,11.0,0.06,18.0 +asu,12,0.06,16.0,0.03,31.0 +asu,13,0.04,26.0,0.02,55.0 +asu,14,0.02,45.0,0.01,111.0 +asu,15,0.01,79.0,0.0,225.0 +rehab,12,0.11,9.0,0.05,20.0 +rehab,13,0.08,13.0,0.03,32.0 +rehab,14,0.05,20.0,0.02,57.0 +rehab,15,0.03,31.0,0.01,101.0 +rehab,16,0.02,52.0,0.0,212.0 diff --git a/outputs/pooling.csv b/outputs/pooling.csv new file mode 100644 index 0000000..cfbe0ae --- /dev/null +++ b/outputs/pooling.csv @@ -0,0 +1,10 @@ +dedicated_acute,dedicated_rehab,pooled,pdelay_acute,pdelay_rehab,1_in_n_delay_acute,1_in_n_delay_rehab +0,0,22,0.069,0.069,15,15 +0,0,26,0.018,0.018,55,55 +14,12,0,0.047,0.279,21,4 +11,11,4,0.051,0.092,20,11 +11,10,5,0.043,0.094,23,11 +10,10,6,0.047,0.07,21,14 +10,9,7,0.044,0.07,23,14 +9,9,8,0.047,0.058,21,17 +9,8,9,0.046,0.058,22,17 From 46378f40ed4a4598caffa31fd7622d30008062be Mon Sep 17 00:00:00 2001 From: amyheather Date: Tue, 20 May 2025 15:44:36 +0100 Subject: [PATCH 17/24] fix(analysis): corrected tab 3 to use 14 12 0 values from tab 2 rather than entering into calculations, then compared results to those when run using students function, and found no change - as students got closer results, any differences i have now would presumably be down to model rather than methods here --- notebooks/analysis.ipynb | 687 ++++++++++++++++++++++++++++++++++++--- outputs/pooling.csv | 2 +- 2 files changed, 636 insertions(+), 53 deletions(-) diff --git a/notebooks/analysis.ipynb b/notebooks/analysis.ipynb index 0e54b33..48b1565 100644 --- a/notebooks/analysis.ipynb +++ b/notebooks/analysis.ipynb @@ -3892,9 +3892,6 @@ " df = df[df[\"beds\"].isin(unit_beds)][\n", " [\"beds\", \"prob_delay\", \"1_in_n_delay\"]]\n", "\n", - " # Round probability of delay to 2 d.p.\n", - " df[\"prob_delay\"] = round(df[\"prob_delay\"], 2)\n", - "\n", " # Rename column to be specific to scenario\n", " df = df.rename(columns={\n", " \"prob_delay\": f\"prob_delay_{scenario_name}\",\n", @@ -3955,117 +3952,117 @@ " 0\n", " asu\n", " 9\n", - " 0.19\n", + " 0.193202\n", " 5.0\n", - " 0.21\n", + " 0.214047\n", " 5.0\n", " \n", " \n", " 1\n", " asu\n", " 10\n", - " 0.14\n", + " 0.138199\n", " 7.0\n", - " 0.16\n", + " 0.160144\n", " 6.0\n", " \n", " \n", " 2\n", " asu\n", " 11\n", - " 0.09\n", + " 0.094876\n", " 11.0\n", - " 0.11\n", + " 0.111319\n", " 9.0\n", " \n", " \n", " 3\n", " asu\n", " 12\n", - " 0.06\n", + " 0.061437\n", " 16.0\n", - " 0.08\n", + " 0.076030\n", " 13.0\n", " \n", " \n", " 4\n", " asu\n", " 13\n", - " 0.04\n", + " 0.038513\n", " 26.0\n", - " 0.05\n", + " 0.048935\n", " 20.0\n", " \n", " \n", " 5\n", " asu\n", " 14\n", - " 0.02\n", + " 0.022350\n", " 45.0\n", - " 0.03\n", + " 0.030251\n", " 33.0\n", " \n", " \n", " 6\n", " rehab\n", " 10\n", - " 0.20\n", + " 0.202678\n", " 5.0\n", - " 0.23\n", + " 0.226770\n", " 4.0\n", " \n", " \n", " 7\n", " rehab\n", " 11\n", - " 0.15\n", + " 0.150691\n", " 7.0\n", - " 0.18\n", + " 0.176401\n", " 6.0\n", " \n", " \n", " 8\n", " rehab\n", " 12\n", - " 0.11\n", + " 0.111069\n", " 9.0\n", - " 0.13\n", + " 0.131936\n", " 8.0\n", " \n", " \n", " 9\n", " rehab\n", " 13\n", - " 0.08\n", + " 0.077523\n", " 13.0\n", - " 0.09\n", + " 0.094953\n", " 11.0\n", " \n", " \n", " 10\n", " rehab\n", " 14\n", - " 0.05\n", + " 0.051057\n", " 20.0\n", - " 0.06\n", + " 0.064930\n", " 15.0\n", " \n", " \n", " 11\n", " rehab\n", " 15\n", - " 0.03\n", + " 0.032383\n", " 31.0\n", - " 0.04\n", + " 0.042869\n", " 23.0\n", " \n", " \n", " 12\n", " rehab\n", " 16\n", - " 0.02\n", + " 0.019416\n", " 52.0\n", - " 0.03\n", + " 0.026822\n", " 37.0\n", " \n", " \n", @@ -4074,19 +4071,19 @@ ], "text/plain": [ " unit beds prob_delay_current 1_in_n_delay_current prob_delay_5% \\\n", - "0 asu 9 0.19 5.0 0.21 \n", - "1 asu 10 0.14 7.0 0.16 \n", - "2 asu 11 0.09 11.0 0.11 \n", - "3 asu 12 0.06 16.0 0.08 \n", - "4 asu 13 0.04 26.0 0.05 \n", - "5 asu 14 0.02 45.0 0.03 \n", - "6 rehab 10 0.20 5.0 0.23 \n", - "7 rehab 11 0.15 7.0 0.18 \n", - "8 rehab 12 0.11 9.0 0.13 \n", - "9 rehab 13 0.08 13.0 0.09 \n", - "10 rehab 14 0.05 20.0 0.06 \n", - "11 rehab 15 0.03 31.0 0.04 \n", - "12 rehab 16 0.02 52.0 0.03 \n", + "0 asu 9 0.193202 5.0 0.214047 \n", + "1 asu 10 0.138199 7.0 0.160144 \n", + "2 asu 11 0.094876 11.0 0.111319 \n", + "3 asu 12 0.061437 16.0 0.076030 \n", + "4 asu 13 0.038513 26.0 0.048935 \n", + "5 asu 14 0.022350 45.0 0.030251 \n", + "6 rehab 10 0.202678 5.0 0.226770 \n", + "7 rehab 11 0.150691 7.0 0.176401 \n", + "8 rehab 12 0.111069 9.0 0.131936 \n", + "9 rehab 13 0.077523 13.0 0.094953 \n", + "10 rehab 14 0.051057 20.0 0.064930 \n", + "11 rehab 15 0.032383 31.0 0.042869 \n", + "12 rehab 16 0.019416 52.0 0.026822 \n", "\n", " 1_in_n_delay_5% \n", "0 5.0 \n", @@ -4309,6 +4306,12 @@ "source": [ "adj_full_tab_2 = full_tab2.copy()\n", "\n", + "# Round probability of delay to 2 d.p.\n", + "adj_full_tab_2[\"prob_delay_current\"] = round(\n", + " adj_full_tab_2[\"prob_delay_current\"], 2)\n", + "adj_full_tab_2[\"prob_delay_5%\"] = round(\n", + " adj_full_tab_2[\"prob_delay_5%\"], 2)\n", + "\n", "# Drop the result for ASU beds 9 and rehab beds 10 for the scenario\n", "adj_full_tab_2.loc[(adj_full_tab_2[\"unit\"] == \"asu\") &\n", " (adj_full_tab_2[\"beds\"] == 9),\n", @@ -4547,6 +4550,11 @@ " asu_beds=list(range(10,16)),\n", " rehab_beds=list(range(12,17)))\n", "\n", + "# Round the probability of delay to 2 d.p.\n", + "sup_tab1[\"prob_delay_current\"] = round(sup_tab1[\"prob_delay_current\"], 2)\n", + "sup_tab1[\"prob_delay_no_complex_neuro\"] = round(\n", + " sup_tab1[\"prob_delay_no_complex_neuro\"], 2)\n", + "\n", "# Display and save to csv\n", "display(sup_tab1)\n", "sup_tab1.to_csv(os.path.join(OUTPUT_DIR, \"delay_scenario4.csv\"), index=False)" @@ -5382,7 +5390,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Calculate results from other pooling scenarios and add to the list, then display as a dataframe." + "Add result for 14 acute 12 rehab 0 pooled, as in table 2 above." ] }, { @@ -5390,13 +5398,41 @@ "execution_count": 21, "metadata": {}, "outputs": [], + "source": [ + "# Extract result for 14 acute and 12 rehab beds\n", + "acute14 = full_tab2[(full_tab2[\"unit\"] == \"asu\") & (full_tab2[\"beds\"] == 14)]\n", + "rehab12 = full_tab2[(full_tab2[\"unit\"] == \"rehab\") & (full_tab2[\"beds\"] == 12)]\n", + "\n", + "pool_result_list.append({\n", + " \"dedicated_acute\": 14,\n", + " \"dedicated_rehab\": 12,\n", + " \"pooled\": 0,\n", + " \"pdelay_acute\": acute14[\"prob_delay_current\"].item(),\n", + " \"pdelay_rehab\": rehab12[\"prob_delay_current\"].item(),\n", + " \"1_in_n_delay_acute\": acute14[\"1_in_n_delay_current\"].item(),\n", + " \"1_in_n_delay_rehab\":rehab12[\"1_in_n_delay_current\"].item()\n", + "})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Calculate results from other pooling scenarios and add to the list, then display as a dataframe." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], "source": [ "# Create instance of class\n", "pooled_delay = PooledDelay(base_results=base_overall)\n", "\n", "# Loop through other pooling scenarios\n", - "for beds in [(14, 12, 0), (11, 11, 4), (11, 10, 5),\n", - " (10, 10, 6), (10, 9, 7), (9, 9, 8), (9, 8, 9)]:\n", + "for beds in [(11, 11, 4), (11, 10, 5), (10, 10, 6), (10, 9, 7),\n", + " (9, 9, 8), (9, 8, 9)]:\n", " pool_result_list.append(pooled_delay.calculate_delay(\n", " asu_beds=beds[0], rehab_beds=beds[1], pooled_beds=beds[2]))" ] @@ -5410,7 +5446,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -5469,10 +5505,10 @@ " 14\n", " 12\n", " 0\n", - " 0.047\n", - " 0.279\n", - " 21\n", - " 4\n", + " 0.022\n", + " 0.111\n", + " 45\n", + " 9\n", " \n", " \n", " 3\n", @@ -5542,7 +5578,7 @@ " dedicated_acute dedicated_rehab pooled pdelay_acute pdelay_rehab \\\n", "0 0 0 22 0.069 0.069 \n", "1 0 0 26 0.018 0.018 \n", - "2 14 12 0 0.047 0.279 \n", + "2 14 12 0 0.022 0.111 \n", "3 11 11 4 0.051 0.092 \n", "4 11 10 5 0.043 0.094 \n", "5 10 10 6 0.047 0.070 \n", @@ -5553,7 +5589,7 @@ " 1_in_n_delay_acute 1_in_n_delay_rehab \n", "0 15 15 \n", "1 55 55 \n", - "2 21 4 \n", + "2 45 9 \n", "3 20 11 \n", "4 23 11 \n", "5 21 14 \n", @@ -5582,6 +5618,553 @@ "tab2.to_csv(\n", " os.path.join(OUTPUT_DIR, \"pooling.csv\"), index=False)" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Compare to other Python calculation\n", + "\n", + "Tom shared some previous code from assignment which attempted to reproduce the same paper. To check whether my data is the issue, I applied the student's functions to my raw model data.\n", + "\n", + "I found that my results did not change - so the differences are related to the model implementation, rather than the calculations here." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import itertools\n", + "import math\n", + "import matplotlib.pyplot as plt\n", + "from collections import Counter" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "# Number of beds (dedicated acute, dedicated rehab, pooled)\n", + "N_BEDS_BASAL = (10, 12, 0)\n", + "N_BEDS_INC = (14, 12, 0)\n", + "N_BEDS_POOLED_1 = (0, 0, 22)\n", + "N_BEDS_POOLED_2 = (0, 0, 26)\n", + "N_BEDS_PART_POOLED_1 = (11, 11, 4)\n", + "N_BEDS_PART_POOLED_2 = (11, 10, 5)\n", + "N_BEDS_PART_POOLED_3 = (10, 10, 6)\n", + "N_BEDS_PART_POOLED_4 = (10, 9, 7)\n", + "N_BEDS_PART_POOLED_5 = (9, 9, 8)\n", + "N_BEDS_PART_POOLED_6 = (9, 8, 9)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "def calc_p_delay(occupancies, n_beds, include_one_in_every=False):\n", + " '''\n", + " helper function for calculating p(delay) for a given bed number\n", + "\n", + " Params:\n", + " -------\n", + " occupancies: list of int\n", + " a list containing daily bed occupancies\n", + " n_beds: int\n", + " the number of beds\n", + " included_one_in_every: Boolean\n", + " whether to include 'one in every n patients delayed'\n", + " in the return\n", + "\n", + " Returns:\n", + " List:\n", + " [number of beds, p(delay), one_in_every]\n", + " if include_one_in_every is true\n", + " [number of beds, p(delay)]\n", + " if include_one_in_every is false\n", + " -------\n", + " '''\n", + " # create a dictionary in the format {number of beds: count}\n", + " # from the occupancies list\n", + " data_dict = Counter(occupancies)\n", + "\n", + " # calculate p(delay) using the Erlang formula: P(N=n) / P(N<=n)\n", + " # P(N=n) - probability that exactly n beds are occupied\n", + " numerator = data_dict[n_beds]\n", + " # P(N<=n) - probability that at most n beds are occupied\n", + " denominator = sum(value for key, value in data_dict.items() if key <= n_beds)\n", + " # compute p(delay)\n", + " p_delay = numerator / denominator\n", + "\n", + " if include_one_in_every:\n", + " # one in every n patients delayed\n", + " one_in_every = int(round(1 / p_delay, 0))\n", + " return([n_beds, p_delay, one_in_every])\n", + " else:\n", + " return([n_beds, p_delay])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Complete bed pooling** - with their methods, the result is the same as mine." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "acute_occupancy_current = [b[\"asu_occupancy\"] for b in base_audit]\n", + "rehab_occupancy_current = [b[\"rehab_occupancy\"] for b in base_audit]" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[22, 0.0688654262522751, 15] [26, 0.018285326496757653, 55]\n" + ] + } + ], + "source": [ + "# add acute and rehab occupancies element-wise to obtain the pooled occupancy\n", + "pooled_occupancy = np.array(acute_occupancy_current) + \\\n", + " np.array(rehab_occupancy_current)\n", + "\n", + "# [n_beds, p(delay), one_in_every_n_patients_delayed] for 22 pooled beds\n", + "result_0_0_22 = calc_p_delay(pooled_occupancy, 22, True)\n", + "\n", + "# [n_beds, p(delay), one_in_every_n_patients_delayed] for 26 pooled beds\n", + "result_0_0_26 = calc_p_delay(pooled_occupancy, 26, True)\n", + "\n", + "print(result_0_0_22, result_0_0_26)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Partial bed pooling** - they all match." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{0: 67,\n", + " 1: 570,\n", + " 2: 2142,\n", + " 3: 6086,\n", + " 4: 12600,\n", + " 5: 21533,\n", + " 6: 30344,\n", + " 7: 36799,\n", + " 8: 38071,\n", + " 9: 35492,\n", + " 10: 29459,\n", + " 11: 22344,\n", + " 12: 15416,\n", + " 13: 10051,\n", + " 14: 5966,\n", + " 15: 3424,\n", + " 16: 1752,\n", + " 17: 907,\n", + " 18: 423,\n", + " 19: 176,\n", + " 20: 71,\n", + " 21: 36,\n", + " 22: 13,\n", + " 23: 4,\n", + " 24: 2,\n", + " 25: 1,\n", + " 27: 1}" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# counter dict for acute bed occupancy \n", + "# in the format of {number of beds: count}\n", + "dict_acute_occupancy_count = Counter(acute_occupancy_current)\n", + "\n", + "# counter dict for rehab bed occupancy\n", + "# in the format of {number of beds: count}\n", + "dict_rehab_occupancy_count = Counter(rehab_occupancy_current)\n", + "\n", + "# print sorted dict\n", + "dict(sorted(dict_acute_occupancy_count.items(), key=lambda item: item[0]))" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "# Right-tail cumulative probability of occupancy greater than or equal to n.\n", + "# (e.g., P(acute >= n))\n", + "def prob_ge(counter, n):\n", + " '''\n", + " helper function for calculating the right-tail cumulative PROBability\n", + " of occupancy for bed numbers Greater than or Equal to n\n", + " (i.e., P(acute >= n))\n", + " '''\n", + " total = sum(value for value in counter.values())\n", + " cases = sum(value for key, value in counter.items() if key >= n)\n", + " return cases / total\n", + "\n", + "# PROBability of occupancy EQual to n (e.g., P(rehab = n))\n", + "def prob_eq(counter, n):\n", + " '''\n", + " helper function for calculating the PROBability of occupancy\n", + " for bed numbers EQual to n (i.e., P(acute=n))\n", + " '''\n", + " total = sum(value for value in counter.values())\n", + " case = counter[n]\n", + " return case / total" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "def calc_acute_pooled_p_delay(a_counter, r_counter, pooling):\n", + " '''\n", + " helper function for calculating p(delay) for partially pooled acute beds\n", + "\n", + " Params:\n", + " -------\n", + " a_counter: dict\n", + " Counter dict for the acute bed occupancy\n", + " r_counter: dict\n", + " Counter dict for the rehab bed occupancy\n", + " pooling: 3-tuple of int\n", + " (n_beds dedicated to acute, n_beds dedicated to rehab, pooled_beds)\n", + "\n", + " Returns:\n", + " --------\n", + " Tuple:\n", + " (p(delay) for acute beds, one in every n patients delayed)\n", + " \n", + " '''\n", + " a = pooling[0] # No. beds dedicated acute\n", + " r = pooling[1] # No. beds dedicated rehab\n", + " p = pooling[2] # No. beds pooled\n", + " \n", + " x = prob_ge(a_counter, a + p)\n", + " y = sum(prob_eq(a_counter, a + p - i) * prob_ge(r_counter, r + i)\n", + " for i in range(1, p + 1))\n", + " p_delay = x + y\n", + " one_in_every = int(round(1 / (x + y), 0))\n", + " return(p_delay, one_in_every)\n", + "\n", + "def calc_rehab_pooled_p_delay(a_counter, r_counter, pooling):\n", + " '''\n", + " helper function for calculating p(delay) for partially pooled rehab beds\n", + "\n", + " Params:\n", + " -------\n", + " a_counter: dict\n", + " Counter dict for the acute bed occupancy\n", + " r_counter: dict\n", + " Counter dict for the rehab bed occupancy\n", + " pooling: tuple of int\n", + " (n_beds dedicated to acute, n_beds dedicated to rehab, pooled_beds)\n", + "\n", + " Returns:\n", + " --------\n", + " Tuple:\n", + " (p(delay) for rehab beds, one in every n patients delayed)\n", + " ''' \n", + " a = pooling[0] # No. beds dedicated acute\n", + " r = pooling[1] # No. beds dedicated rehab\n", + " p = pooling[2] # No. beds pooled\n", + "\n", + " x = prob_ge(r_counter, r + p)\n", + " y = sum(prob_eq(r_counter, r + p - i) * prob_ge(a_counter, a + i)\n", + " for i in range(1, p + 1))\n", + " p_delay = x + y\n", + " one_in_every = int(round(1 / (x + y), 0))\n", + " return(p_delay, one_in_every)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "# Partial pooling scenario 1 (11 / 11 / 4)\n", + "result_11_11_4_acute = calc_acute_pooled_p_delay(dict_acute_occupancy_count,\n", + " dict_rehab_occupancy_count,\n", + " N_BEDS_PART_POOLED_1)\n", + "result_11_11_4_rehab = calc_rehab_pooled_p_delay(dict_acute_occupancy_count,\n", + " dict_rehab_occupancy_count,\n", + " N_BEDS_PART_POOLED_1)\n", + "\n", + "# Partial pooling scenario 2 (11 / 10 / 5)\n", + "result_11_10_5_acute = calc_acute_pooled_p_delay(dict_acute_occupancy_count,\n", + " dict_rehab_occupancy_count,\n", + " N_BEDS_PART_POOLED_2)\n", + "result_11_10_5_rehab = calc_rehab_pooled_p_delay(dict_acute_occupancy_count,\n", + " dict_rehab_occupancy_count,\n", + " N_BEDS_PART_POOLED_2)\n", + "\n", + "# Partial pooling scenario 3 (10 / 10 / 6)\n", + "result_10_10_6_acute = calc_acute_pooled_p_delay(dict_acute_occupancy_count,\n", + " dict_rehab_occupancy_count,\n", + " N_BEDS_PART_POOLED_3)\n", + "result_10_10_6_rehab = calc_rehab_pooled_p_delay(dict_acute_occupancy_count,\n", + " dict_rehab_occupancy_count,\n", + " N_BEDS_PART_POOLED_3)\n", + "\n", + "# Partial pooling scenario 4 (10 / 9 / 7)\n", + "result_10_9_7_acute = calc_acute_pooled_p_delay(dict_acute_occupancy_count,\n", + " dict_rehab_occupancy_count,\n", + " N_BEDS_PART_POOLED_4)\n", + "result_10_9_7_rehab = calc_rehab_pooled_p_delay(dict_acute_occupancy_count,\n", + " dict_rehab_occupancy_count,\n", + " N_BEDS_PART_POOLED_4)\n", + "\n", + "# Partial pooling scenario 5 (9 / 9 / 8)\n", + "result_9_9_8_acute = calc_acute_pooled_p_delay(dict_acute_occupancy_count,\n", + " dict_rehab_occupancy_count,\n", + " N_BEDS_PART_POOLED_5)\n", + "result_9_9_8_rehab = calc_rehab_pooled_p_delay(dict_acute_occupancy_count,\n", + " dict_rehab_occupancy_count,\n", + " N_BEDS_PART_POOLED_5)\n", + "\n", + "# Partial pooling scenario 6 (9 / 8 / 9)\n", + "result_9_8_9_acute = calc_acute_pooled_p_delay(dict_acute_occupancy_count,\n", + " dict_rehab_occupancy_count,\n", + " N_BEDS_PART_POOLED_6)\n", + "result_9_8_9_rehab = calc_rehab_pooled_p_delay(dict_acute_occupancy_count,\n", + " dict_rehab_occupancy_count,\n", + " N_BEDS_PART_POOLED_6)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "# generate rows for pooled beds\n", + "bed_0_0_22 = [*N_BEDS_POOLED_1,\n", + " result_0_0_22[1], result_0_0_22[1],\n", + " result_0_0_22[2], result_0_0_22[2]]\n", + "\n", + "bed_0_0_26 = [*N_BEDS_POOLED_2,\n", + " result_0_0_26[1], result_0_0_26[1],\n", + " result_0_0_26[2], result_0_0_26[2]]\n", + "\n", + "# generate a row for beds without pooling\n", + "temp1 = calc_p_delay(acute_occupancy_current, 14, True)\n", + "temp2 = calc_p_delay(rehab_occupancy_current, 12, True)\n", + "bed_14_12_0 = [*N_BEDS_INC,\n", + " temp1[1], temp2[1],\n", + " temp1[2], temp2[2]]\n", + "\n", + "# generate rows for partially pooled beds (6 scenarios)\n", + "bed_11_11_4 = [*N_BEDS_PART_POOLED_1,\n", + " result_11_11_4_acute[0], result_11_11_4_rehab[0],\n", + " result_11_11_4_acute[1], result_11_11_4_rehab[1]]\n", + "\n", + "bed_11_10_5 = [*N_BEDS_PART_POOLED_2,\n", + " result_11_10_5_acute[0], result_11_10_5_rehab[0],\n", + " result_11_10_5_acute[1], result_11_10_5_rehab[1]]\n", + "\n", + "bed_10_10_6 = [*N_BEDS_PART_POOLED_3,\n", + " result_10_10_6_acute[0], result_10_10_6_rehab[0],\n", + " result_10_10_6_acute[1], result_10_10_6_rehab[1]]\n", + "\n", + "bed_10_9_7 = [*N_BEDS_PART_POOLED_4,\n", + " result_10_9_7_acute[0], result_10_9_7_rehab[0],\n", + " result_10_9_7_acute[1], result_10_9_7_rehab[1]]\n", + "\n", + "bed_9_9_8 = [*N_BEDS_PART_POOLED_5,\n", + " result_9_9_8_acute[0], result_9_9_8_rehab[0],\n", + " result_9_9_8_acute[1], result_9_9_8_rehab[1]]\n", + "\n", + "bed_9_8_9 = [*N_BEDS_PART_POOLED_6,\n", + " result_9_8_9_acute[0], result_9_8_9_rehab[0],\n", + " result_9_8_9_acute[1], result_9_8_9_rehab[1]]" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Table 3. Results of pooling of acute and rehab beds
No. bedsp(delay)1 in every n pts delayed
Dedicated acuteDedicated rehabPooledAcuteRehabAcuteRehab
00220.0690.0691515
00260.0180.0185555
141200.0220.111459
111140.0510.0922011
111050.0430.0942311
101060.0470.0702114
10970.0440.0702314
9980.0470.0582117
9890.0460.0582217
\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# multi-index column names\n", + "columns = pd.MultiIndex.from_tuples([\n", + " ('No. beds', 'Dedicated acute'),\n", + " ('No. beds', 'Dedicated rehab'),\n", + " ('No. beds', 'Pooled'),\n", + " ('p(delay)', 'Acute'),\n", + " ('p(delay)', 'Rehab'),\n", + " ('1 in every n pts delayed', 'Acute'),\n", + " ('1 in every n pts delayed', 'Rehab')\n", + "])\n", + "\n", + "table_3 = (pd.DataFrame([bed_0_0_22, \n", + " bed_0_0_26,\n", + " bed_14_12_0,\n", + " bed_11_11_4,\n", + " bed_11_10_5,\n", + " bed_10_10_6,\n", + " bed_10_9_7,\n", + " bed_9_9_8,\n", + " bed_9_8_9],\n", + " columns=columns)\n", + " .style.set_caption('Table 3. Results of pooling of acute and rehab beds')\n", + " .format({('p(delay)', 'Acute'): '{:.3f}', ('p(delay)', 'Rehab'): '{:.3f}'})\n", + " .hide(axis='index'))\n", + "\n", + "table_3" + ] } ], "metadata": { diff --git a/outputs/pooling.csv b/outputs/pooling.csv index cfbe0ae..56d8aa4 100644 --- a/outputs/pooling.csv +++ b/outputs/pooling.csv @@ -1,7 +1,7 @@ dedicated_acute,dedicated_rehab,pooled,pdelay_acute,pdelay_rehab,1_in_n_delay_acute,1_in_n_delay_rehab 0,0,22,0.069,0.069,15,15 0,0,26,0.018,0.018,55,55 -14,12,0,0.047,0.279,21,4 +14,12,0,0.022,0.111,45,9 11,11,4,0.051,0.092,20,11 11,10,5,0.043,0.094,23,11 10,10,6,0.047,0.07,21,14 From 057d7d0ad062fef09ba6efdb3cc542b37872859c Mon Sep 17 00:00:00 2001 From: amyheather Date: Tue, 20 May 2025 15:45:02 +0100 Subject: [PATCH 18/24] chore(analysis): remove student comparison --- notebooks/analysis.ipynb | 547 --------------------------------------- 1 file changed, 547 deletions(-) diff --git a/notebooks/analysis.ipynb b/notebooks/analysis.ipynb index 48b1565..5516868 100644 --- a/notebooks/analysis.ipynb +++ b/notebooks/analysis.ipynb @@ -5618,553 +5618,6 @@ "tab2.to_csv(\n", " os.path.join(OUTPUT_DIR, \"pooling.csv\"), index=False)" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Compare to other Python calculation\n", - "\n", - "Tom shared some previous code from assignment which attempted to reproduce the same paper. To check whether my data is the issue, I applied the student's functions to my raw model data.\n", - "\n", - "I found that my results did not change - so the differences are related to the model implementation, rather than the calculations here." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "import itertools\n", - "import math\n", - "import matplotlib.pyplot as plt\n", - "from collections import Counter" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Number of beds (dedicated acute, dedicated rehab, pooled)\n", - "N_BEDS_BASAL = (10, 12, 0)\n", - "N_BEDS_INC = (14, 12, 0)\n", - "N_BEDS_POOLED_1 = (0, 0, 22)\n", - "N_BEDS_POOLED_2 = (0, 0, 26)\n", - "N_BEDS_PART_POOLED_1 = (11, 11, 4)\n", - "N_BEDS_PART_POOLED_2 = (11, 10, 5)\n", - "N_BEDS_PART_POOLED_3 = (10, 10, 6)\n", - "N_BEDS_PART_POOLED_4 = (10, 9, 7)\n", - "N_BEDS_PART_POOLED_5 = (9, 9, 8)\n", - "N_BEDS_PART_POOLED_6 = (9, 8, 9)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_p_delay(occupancies, n_beds, include_one_in_every=False):\n", - " '''\n", - " helper function for calculating p(delay) for a given bed number\n", - "\n", - " Params:\n", - " -------\n", - " occupancies: list of int\n", - " a list containing daily bed occupancies\n", - " n_beds: int\n", - " the number of beds\n", - " included_one_in_every: Boolean\n", - " whether to include 'one in every n patients delayed'\n", - " in the return\n", - "\n", - " Returns:\n", - " List:\n", - " [number of beds, p(delay), one_in_every]\n", - " if include_one_in_every is true\n", - " [number of beds, p(delay)]\n", - " if include_one_in_every is false\n", - " -------\n", - " '''\n", - " # create a dictionary in the format {number of beds: count}\n", - " # from the occupancies list\n", - " data_dict = Counter(occupancies)\n", - "\n", - " # calculate p(delay) using the Erlang formula: P(N=n) / P(N<=n)\n", - " # P(N=n) - probability that exactly n beds are occupied\n", - " numerator = data_dict[n_beds]\n", - " # P(N<=n) - probability that at most n beds are occupied\n", - " denominator = sum(value for key, value in data_dict.items() if key <= n_beds)\n", - " # compute p(delay)\n", - " p_delay = numerator / denominator\n", - "\n", - " if include_one_in_every:\n", - " # one in every n patients delayed\n", - " one_in_every = int(round(1 / p_delay, 0))\n", - " return([n_beds, p_delay, one_in_every])\n", - " else:\n", - " return([n_beds, p_delay])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Complete bed pooling** - with their methods, the result is the same as mine." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "acute_occupancy_current = [b[\"asu_occupancy\"] for b in base_audit]\n", - "rehab_occupancy_current = [b[\"rehab_occupancy\"] for b in base_audit]" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[22, 0.0688654262522751, 15] [26, 0.018285326496757653, 55]\n" - ] - } - ], - "source": [ - "# add acute and rehab occupancies element-wise to obtain the pooled occupancy\n", - "pooled_occupancy = np.array(acute_occupancy_current) + \\\n", - " np.array(rehab_occupancy_current)\n", - "\n", - "# [n_beds, p(delay), one_in_every_n_patients_delayed] for 22 pooled beds\n", - "result_0_0_22 = calc_p_delay(pooled_occupancy, 22, True)\n", - "\n", - "# [n_beds, p(delay), one_in_every_n_patients_delayed] for 26 pooled beds\n", - "result_0_0_26 = calc_p_delay(pooled_occupancy, 26, True)\n", - "\n", - "print(result_0_0_22, result_0_0_26)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Partial bed pooling** - they all match." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{0: 67,\n", - " 1: 570,\n", - " 2: 2142,\n", - " 3: 6086,\n", - " 4: 12600,\n", - " 5: 21533,\n", - " 6: 30344,\n", - " 7: 36799,\n", - " 8: 38071,\n", - " 9: 35492,\n", - " 10: 29459,\n", - " 11: 22344,\n", - " 12: 15416,\n", - " 13: 10051,\n", - " 14: 5966,\n", - " 15: 3424,\n", - " 16: 1752,\n", - " 17: 907,\n", - " 18: 423,\n", - " 19: 176,\n", - " 20: 71,\n", - " 21: 36,\n", - " 22: 13,\n", - " 23: 4,\n", - " 24: 2,\n", - " 25: 1,\n", - " 27: 1}" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# counter dict for acute bed occupancy \n", - "# in the format of {number of beds: count}\n", - "dict_acute_occupancy_count = Counter(acute_occupancy_current)\n", - "\n", - "# counter dict for rehab bed occupancy\n", - "# in the format of {number of beds: count}\n", - "dict_rehab_occupancy_count = Counter(rehab_occupancy_current)\n", - "\n", - "# print sorted dict\n", - "dict(sorted(dict_acute_occupancy_count.items(), key=lambda item: item[0]))" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Right-tail cumulative probability of occupancy greater than or equal to n.\n", - "# (e.g., P(acute >= n))\n", - "def prob_ge(counter, n):\n", - " '''\n", - " helper function for calculating the right-tail cumulative PROBability\n", - " of occupancy for bed numbers Greater than or Equal to n\n", - " (i.e., P(acute >= n))\n", - " '''\n", - " total = sum(value for value in counter.values())\n", - " cases = sum(value for key, value in counter.items() if key >= n)\n", - " return cases / total\n", - "\n", - "# PROBability of occupancy EQual to n (e.g., P(rehab = n))\n", - "def prob_eq(counter, n):\n", - " '''\n", - " helper function for calculating the PROBability of occupancy\n", - " for bed numbers EQual to n (i.e., P(acute=n))\n", - " '''\n", - " total = sum(value for value in counter.values())\n", - " case = counter[n]\n", - " return case / total" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_acute_pooled_p_delay(a_counter, r_counter, pooling):\n", - " '''\n", - " helper function for calculating p(delay) for partially pooled acute beds\n", - "\n", - " Params:\n", - " -------\n", - " a_counter: dict\n", - " Counter dict for the acute bed occupancy\n", - " r_counter: dict\n", - " Counter dict for the rehab bed occupancy\n", - " pooling: 3-tuple of int\n", - " (n_beds dedicated to acute, n_beds dedicated to rehab, pooled_beds)\n", - "\n", - " Returns:\n", - " --------\n", - " Tuple:\n", - " (p(delay) for acute beds, one in every n patients delayed)\n", - " \n", - " '''\n", - " a = pooling[0] # No. beds dedicated acute\n", - " r = pooling[1] # No. beds dedicated rehab\n", - " p = pooling[2] # No. beds pooled\n", - " \n", - " x = prob_ge(a_counter, a + p)\n", - " y = sum(prob_eq(a_counter, a + p - i) * prob_ge(r_counter, r + i)\n", - " for i in range(1, p + 1))\n", - " p_delay = x + y\n", - " one_in_every = int(round(1 / (x + y), 0))\n", - " return(p_delay, one_in_every)\n", - "\n", - "def calc_rehab_pooled_p_delay(a_counter, r_counter, pooling):\n", - " '''\n", - " helper function for calculating p(delay) for partially pooled rehab beds\n", - "\n", - " Params:\n", - " -------\n", - " a_counter: dict\n", - " Counter dict for the acute bed occupancy\n", - " r_counter: dict\n", - " Counter dict for the rehab bed occupancy\n", - " pooling: tuple of int\n", - " (n_beds dedicated to acute, n_beds dedicated to rehab, pooled_beds)\n", - "\n", - " Returns:\n", - " --------\n", - " Tuple:\n", - " (p(delay) for rehab beds, one in every n patients delayed)\n", - " ''' \n", - " a = pooling[0] # No. beds dedicated acute\n", - " r = pooling[1] # No. beds dedicated rehab\n", - " p = pooling[2] # No. beds pooled\n", - "\n", - " x = prob_ge(r_counter, r + p)\n", - " y = sum(prob_eq(r_counter, r + p - i) * prob_ge(a_counter, a + i)\n", - " for i in range(1, p + 1))\n", - " p_delay = x + y\n", - " one_in_every = int(round(1 / (x + y), 0))\n", - " return(p_delay, one_in_every)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# Partial pooling scenario 1 (11 / 11 / 4)\n", - "result_11_11_4_acute = calc_acute_pooled_p_delay(dict_acute_occupancy_count,\n", - " dict_rehab_occupancy_count,\n", - " N_BEDS_PART_POOLED_1)\n", - "result_11_11_4_rehab = calc_rehab_pooled_p_delay(dict_acute_occupancy_count,\n", - " dict_rehab_occupancy_count,\n", - " N_BEDS_PART_POOLED_1)\n", - "\n", - "# Partial pooling scenario 2 (11 / 10 / 5)\n", - "result_11_10_5_acute = calc_acute_pooled_p_delay(dict_acute_occupancy_count,\n", - " dict_rehab_occupancy_count,\n", - " N_BEDS_PART_POOLED_2)\n", - "result_11_10_5_rehab = calc_rehab_pooled_p_delay(dict_acute_occupancy_count,\n", - " dict_rehab_occupancy_count,\n", - " N_BEDS_PART_POOLED_2)\n", - "\n", - "# Partial pooling scenario 3 (10 / 10 / 6)\n", - "result_10_10_6_acute = calc_acute_pooled_p_delay(dict_acute_occupancy_count,\n", - " dict_rehab_occupancy_count,\n", - " N_BEDS_PART_POOLED_3)\n", - "result_10_10_6_rehab = calc_rehab_pooled_p_delay(dict_acute_occupancy_count,\n", - " dict_rehab_occupancy_count,\n", - " N_BEDS_PART_POOLED_3)\n", - "\n", - "# Partial pooling scenario 4 (10 / 9 / 7)\n", - "result_10_9_7_acute = calc_acute_pooled_p_delay(dict_acute_occupancy_count,\n", - " dict_rehab_occupancy_count,\n", - " N_BEDS_PART_POOLED_4)\n", - "result_10_9_7_rehab = calc_rehab_pooled_p_delay(dict_acute_occupancy_count,\n", - " dict_rehab_occupancy_count,\n", - " N_BEDS_PART_POOLED_4)\n", - "\n", - "# Partial pooling scenario 5 (9 / 9 / 8)\n", - "result_9_9_8_acute = calc_acute_pooled_p_delay(dict_acute_occupancy_count,\n", - " dict_rehab_occupancy_count,\n", - " N_BEDS_PART_POOLED_5)\n", - "result_9_9_8_rehab = calc_rehab_pooled_p_delay(dict_acute_occupancy_count,\n", - " dict_rehab_occupancy_count,\n", - " N_BEDS_PART_POOLED_5)\n", - "\n", - "# Partial pooling scenario 6 (9 / 8 / 9)\n", - "result_9_8_9_acute = calc_acute_pooled_p_delay(dict_acute_occupancy_count,\n", - " dict_rehab_occupancy_count,\n", - " N_BEDS_PART_POOLED_6)\n", - "result_9_8_9_rehab = calc_rehab_pooled_p_delay(dict_acute_occupancy_count,\n", - " dict_rehab_occupancy_count,\n", - " N_BEDS_PART_POOLED_6)" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "# generate rows for pooled beds\n", - "bed_0_0_22 = [*N_BEDS_POOLED_1,\n", - " result_0_0_22[1], result_0_0_22[1],\n", - " result_0_0_22[2], result_0_0_22[2]]\n", - "\n", - "bed_0_0_26 = [*N_BEDS_POOLED_2,\n", - " result_0_0_26[1], result_0_0_26[1],\n", - " result_0_0_26[2], result_0_0_26[2]]\n", - "\n", - "# generate a row for beds without pooling\n", - "temp1 = calc_p_delay(acute_occupancy_current, 14, True)\n", - "temp2 = calc_p_delay(rehab_occupancy_current, 12, True)\n", - "bed_14_12_0 = [*N_BEDS_INC,\n", - " temp1[1], temp2[1],\n", - " temp1[2], temp2[2]]\n", - "\n", - "# generate rows for partially pooled beds (6 scenarios)\n", - "bed_11_11_4 = [*N_BEDS_PART_POOLED_1,\n", - " result_11_11_4_acute[0], result_11_11_4_rehab[0],\n", - " result_11_11_4_acute[1], result_11_11_4_rehab[1]]\n", - "\n", - "bed_11_10_5 = [*N_BEDS_PART_POOLED_2,\n", - " result_11_10_5_acute[0], result_11_10_5_rehab[0],\n", - " result_11_10_5_acute[1], result_11_10_5_rehab[1]]\n", - "\n", - "bed_10_10_6 = [*N_BEDS_PART_POOLED_3,\n", - " result_10_10_6_acute[0], result_10_10_6_rehab[0],\n", - " result_10_10_6_acute[1], result_10_10_6_rehab[1]]\n", - "\n", - "bed_10_9_7 = [*N_BEDS_PART_POOLED_4,\n", - " result_10_9_7_acute[0], result_10_9_7_rehab[0],\n", - " result_10_9_7_acute[1], result_10_9_7_rehab[1]]\n", - "\n", - "bed_9_9_8 = [*N_BEDS_PART_POOLED_5,\n", - " result_9_9_8_acute[0], result_9_9_8_rehab[0],\n", - " result_9_9_8_acute[1], result_9_9_8_rehab[1]]\n", - "\n", - "bed_9_8_9 = [*N_BEDS_PART_POOLED_6,\n", - " result_9_8_9_acute[0], result_9_8_9_rehab[0],\n", - " result_9_8_9_acute[1], result_9_8_9_rehab[1]]" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Table 3. Results of pooling of acute and rehab beds
No. bedsp(delay)1 in every n pts delayed
Dedicated acuteDedicated rehabPooledAcuteRehabAcuteRehab
00220.0690.0691515
00260.0180.0185555
141200.0220.111459
111140.0510.0922011
111050.0430.0942311
101060.0470.0702114
10970.0440.0702314
9980.0470.0582117
9890.0460.0582217
\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# multi-index column names\n", - "columns = pd.MultiIndex.from_tuples([\n", - " ('No. beds', 'Dedicated acute'),\n", - " ('No. beds', 'Dedicated rehab'),\n", - " ('No. beds', 'Pooled'),\n", - " ('p(delay)', 'Acute'),\n", - " ('p(delay)', 'Rehab'),\n", - " ('1 in every n pts delayed', 'Acute'),\n", - " ('1 in every n pts delayed', 'Rehab')\n", - "])\n", - "\n", - "table_3 = (pd.DataFrame([bed_0_0_22, \n", - " bed_0_0_26,\n", - " bed_14_12_0,\n", - " bed_11_11_4,\n", - " bed_11_10_5,\n", - " bed_10_10_6,\n", - " bed_10_9_7,\n", - " bed_9_9_8,\n", - " bed_9_8_9],\n", - " columns=columns)\n", - " .style.set_caption('Table 3. Results of pooling of acute and rehab beds')\n", - " .format({('p(delay)', 'Acute'): '{:.3f}', ('p(delay)', 'Rehab'): '{:.3f}'})\n", - " .hide(axis='index'))\n", - "\n", - "table_3" - ] } ], "metadata": { From 0dcd3066f9b7e78a51d4a2a65a14ef38f04276ca Mon Sep 17 00:00:00 2001 From: amyheather Date: Tue, 20 May 2025 15:52:16 +0100 Subject: [PATCH 19/24] refactor(analysis): rename outputs to relate to name of tables and figures from paper --- notebooks/analysis.ipynb | 27 +++++++++--------- ...occupancy_freq_asu.png => figure1_asu.png} | Bin ...pancy_freq_rehab.png => figure1_rehab.png} | Bin .../{delay_prob_asu.png => figure3_asu.png} | Bin ...delay_prob_rehab.png => figure3_rehab.png} | Bin .../{delay_scenario4.csv => suptable1.csv} | 0 outputs/{delay_scenario1.csv => table2.csv} | 0 outputs/{pooling.csv => table3.csv} | 0 8 files changed, 13 insertions(+), 14 deletions(-) rename outputs/{occupancy_freq_asu.png => figure1_asu.png} (100%) rename outputs/{occupancy_freq_rehab.png => figure1_rehab.png} (100%) rename outputs/{delay_prob_asu.png => figure3_asu.png} (100%) rename outputs/{delay_prob_rehab.png => figure3_rehab.png} (100%) rename outputs/{delay_scenario4.csv => suptable1.csv} (100%) rename outputs/{delay_scenario1.csv => table2.csv} (100%) rename outputs/{pooling.csv => table3.csv} (100%) diff --git a/notebooks/analysis.ipynb b/notebooks/analysis.ipynb index 5516868..7c5404a 100644 --- a/notebooks/analysis.ipynb +++ b/notebooks/analysis.ipynb @@ -1863,11 +1863,11 @@ "source": [ "# Acute stroke unit\n", "plot_occupancy_freq(base_overall[\"asu\"], unit=\"asu\",\n", - " file=\"occupancy_freq_asu.png\")\n", + " file=\"figure1_asu.png\")\n", "\n", "# Rehabilitation unit\n", "plot_occupancy_freq(base_overall[\"rehab\"], unit=\"rehab\",\n", - " file=\"occupancy_freq_rehab.png\")" + " file=\"figure1_rehab.png\")" ] }, { @@ -3768,9 +3768,8 @@ } ], "source": [ - "plot_delay_prob(base_overall[\"asu\"], unit=\"asu\", file=\"delay_prob_asu.png\")\n", - "plot_delay_prob(base_overall[\"rehab\"], unit=\"rehab\",\n", - " file=\"delay_prob_rehab.png\")" + "plot_delay_prob(base_overall[\"asu\"], unit=\"asu\", file=\"figure3_asu.png\")\n", + "plot_delay_prob(base_overall[\"rehab\"], unit=\"rehab\", file=\"figure3_rehab.png\")" ] }, { @@ -4327,7 +4326,7 @@ "# Display and save to csv\n", "display(adj_full_tab_2)\n", "adj_full_tab_2.to_csv(\n", - " os.path.join(OUTPUT_DIR, \"delay_scenario1.csv\"), index=False)" + " os.path.join(OUTPUT_DIR, \"table2.csv\"), index=False)" ] }, { @@ -4557,7 +4556,7 @@ "\n", "# Display and save to csv\n", "display(sup_tab1)\n", - "sup_tab1.to_csv(os.path.join(OUTPUT_DIR, \"delay_scenario4.csv\"), index=False)" + "sup_tab1.to_csv(os.path.join(OUTPUT_DIR, \"suptable1.csv\"), index=False)" ] }, { @@ -5604,19 +5603,19 @@ ], "source": [ "# Convert to a dataframe\n", - "tab2 = pd.DataFrame(pool_result_list)\n", + "tab3 = pd.DataFrame(pool_result_list)\n", "\n", "for delay_type in [\"acute\", \"rehab\"]:\n", " # Round probabilities to 3 decimal places\n", - " tab2[f\"pdelay_{delay_type}\"] = round(tab2[f\"pdelay_{delay_type}\"], 3)\n", + " tab3[f\"pdelay_{delay_type}\"] = round(tab3[f\"pdelay_{delay_type}\"], 3)\n", " # Convert 1-in-n counts to integers\n", - " tab2[f\"1_in_n_delay_{delay_type}\"] = (\n", - " tab2[f\"1_in_n_delay_{delay_type}\"].astype(int))\n", + " tab3[f\"1_in_n_delay_{delay_type}\"] = (\n", + " tab3[f\"1_in_n_delay_{delay_type}\"].astype(int))\n", "\n", "# Display and save to csv\n", - "display(tab2)\n", - "tab2.to_csv(\n", - " os.path.join(OUTPUT_DIR, \"pooling.csv\"), index=False)" + "display(tab3)\n", + "tab3.to_csv(\n", + " os.path.join(OUTPUT_DIR, \"table3.csv\"), index=False)" ] } ], diff --git a/outputs/occupancy_freq_asu.png b/outputs/figure1_asu.png similarity index 100% rename from outputs/occupancy_freq_asu.png rename to outputs/figure1_asu.png diff --git a/outputs/occupancy_freq_rehab.png b/outputs/figure1_rehab.png similarity index 100% rename from outputs/occupancy_freq_rehab.png rename to outputs/figure1_rehab.png diff --git a/outputs/delay_prob_asu.png b/outputs/figure3_asu.png similarity index 100% rename from outputs/delay_prob_asu.png rename to outputs/figure3_asu.png diff --git a/outputs/delay_prob_rehab.png b/outputs/figure3_rehab.png similarity index 100% rename from outputs/delay_prob_rehab.png rename to outputs/figure3_rehab.png diff --git a/outputs/delay_scenario4.csv b/outputs/suptable1.csv similarity index 100% rename from outputs/delay_scenario4.csv rename to outputs/suptable1.csv diff --git a/outputs/delay_scenario1.csv b/outputs/table2.csv similarity index 100% rename from outputs/delay_scenario1.csv rename to outputs/table2.csv diff --git a/outputs/pooling.csv b/outputs/table3.csv similarity index 100% rename from outputs/pooling.csv rename to outputs/table3.csv From 0d6839b3f4ad8860955689d960c454979e92d75b Mon Sep 17 00:00:00 2001 From: amyheather Date: Wed, 21 May 2025 10:26:03 +0100 Subject: [PATCH 20/24] fix(model): add stroke mortality parameter for stroke other LOS sampling (#6) --- notebooks/analysis.ipynb | 898 ++++++++++++++++++-------------------- outputs/figure1_asu.png | Bin 30327 -> 29789 bytes outputs/figure1_rehab.png | Bin 30157 -> 31249 bytes outputs/figure3_asu.png | Bin 25242 -> 25019 bytes outputs/figure3_rehab.png | Bin 25719 -> 25700 bytes outputs/suptable1.csv | 18 +- outputs/table2.csv | 20 +- outputs/table3.csv | 18 +- simulation/model.py | 14 +- simulation/parameters.py | 9 + 10 files changed, 481 insertions(+), 496 deletions(-) diff --git a/notebooks/analysis.ipynb b/notebooks/analysis.ipynb index 7c5404a..53bcbab 100644 --- a/notebooks/analysis.ipynb +++ b/notebooks/analysis.ipynb @@ -179,12 +179,12 @@ "textposition": "auto", "type": "bar", "x": { - "bdata": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGw==", + "bdata": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGA==", "dtype": "i1" }, "xaxis": "x", "y": { - "bdata": "bHe/VzQKMD//vkgzrA5hP08nssFfBoA/f6Ef0PnDlj913+cr55CnP+223BUFI7Q/RvufnWFgvD+cdR1r2zTBPwmmrrcdzcE/j7VtmmiYwD8cnN/xgoy7P5KDn4ss5bQ/qwY2fjXVrD/2CZbpb8yiPyg+kDoQUZY/uL4HeaudiT8tQxzr4jZ6PxWqVUJfJGs/fnz9vw9RWT/anDhJORFFP41+E9tZ/zA/VYDoO6M8IT9fuYhWz+UIPybkgGqwpO4+JuSAarCk3j4m5IBqsKTOPgAAAAAAAAAAJuSAarCkzj4=", + "bdata": "HoK9nOx5MT88RTIGLeVhP00xGGv8cII/UOespqw7mj8s3TlyTcCqP+bacxjKvrU/yjRAtVnsvT9M8SFU28TBP3gNmsNu/sE/MVFHJ+U1wD9qXnDwf2G6P4CKNMyGaLM/wcH/hWnUqj+fZUbr2lWgP2CQZaM3ZJM/Bjc8t+pbhT8yAMjeIoR1P6OeDaqCTmU/iWNXdAz3VT+jng2qgk5FP66FZ15/9DE/5NXYY2W6HD8m5IBqsKT+PibkgGqwpN4+JuSAarCkzj4=", "dtype": "f8" }, "yaxis": "y" @@ -1030,12 +1030,12 @@ "textposition": "auto", "type": "bar", "x": { - "bdata": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGw==", + "bdata": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBka", "dtype": "i1" }, "xaxis": "x", "y": { - "bdata": "VYDoO6M8ET/6zK9/9oc7P+XhonBDcmE/buomK6BxgD+beRI+FCuVP1Z10OBlq6U/S76wl5AJsj/Tzh74XvW4Pw0+NWdWob4/RstcluJJwD+uKdyK9Mm/PzFl+KUX1Ls/yzXyZvoStz/8so0qYHWxP232+dPVO6g/iLDqhe3Enz+ghAP11WyTP414rtRqo4Y/QzrzBnQEeT/UPZ3IBn9pPxpnATafcVY/xKVhLahDRj92sF9yYLM3P62uihEXdic/NHmUuH1HED+YjpBC7ibzPpiOkELuJvM+JuSAarCkzj4=", + "bdata": "occwXRrQ+j7N3gFI1Ow9P0s7fhSZ22Q/8EXKoUjqgD8sTjRGIMiVP/BpOgCSNqU/84mpuy10sT9gW3jjwSq5P6KAC+5/cL4/qI4qWg1XwD+jwAQ5viLAP/2ulSMKebw/zg48s/vwtj+wHruTXyaxPzSFZ2GzEag/oeugu2Mcnz+MKmkR6a6TP8Iy+lk83IU/WgJCaX70dz+bnYKcXXdpP7DyaSv8/1c/IjOfg04PSD/wvDIYYmA5P3eHPL/IMSI/uZXkxRMcFD+YjpBC7ibzPibkgGqwpN4+", "dtype": "f8" }, "yaxis": "y" @@ -2000,12 +2000,12 @@ "showlegend": false, "type": "scatter", "x": { - "bdata": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGw==", + "bdata": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGA==", "dtype": "i1" }, "xaxis": "x", "y": { - "bdata": "AAAAAAAA8D8CgetuXKLsP4sNV508qug/m06e1vj35T+8CtyeuMjiP42pU0p6BuA/qSXTppl62j9x1FjuBmLVP+9WTb6IcNA/Bq0gv9i6yD8s6bykhLDBPxM5x9fNSbg/wbfHebF0rz9ycuDEB7ijP5ZrLrXP4pY/jWbkEMzviT9z7pcSL196P91PM8TfNms/6TlGSkRYWT8hM8wovxNFP4KVVdlBADE/BwnK5fk8IT9r4g4G/+UIP6FZt8LNpO4+chiVFr+k3j6yPInAt6TOPgAAAAAAAAAAJ+SAarCkzj4=", + "bdata": "AAAAAAAA8D94G0jdxITsPyp4OQUvJ+k/QvsLgbQc5j+RX9Yh2LfiP8LQGvMaMt8/uppMGpyx2T++srGRtKnUP1FD/HWsic8/99FI/kZAxz+hkxh7pXvAP3qunp90J7Y/tOxDG6PlrD/2xG0ycQKhP4wWtQsjzZM/zvQqi6WUhT8mT5DT5p91P52/0Xq2W2U/e2XDGRj9VT/4z8ec0lBFP5jty6Ev9TE/HwbEC7G6HD9rd6RsxqT+PrE8icC3pN4+JuSAarCkzj4=", "dtype": "f8" }, "yaxis": "y" @@ -2895,12 +2895,12 @@ "showlegend": false, "type": "scatter", "x": { - "bdata": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGw==", + "bdata": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBka", "dtype": "i1" }, "xaxis": "x", "y": { - "bdata": "AAAAAAAA8D+1utPqTqvrPwMKozpNDuo/VHHrBCQj6D/w+yfpgB/lP6wowwgyZOI/HbnlVh5L3z9BUUDJt9PZP9rmRLSmMtU/kAI+BBSs0D+jXQm4XPHJPwZijXLXScM/rhLQ2f1uvD9WEeTshdizP+73oW4YJKo/VW2Du3WUoD+KJdQ+uuGTP4F6+llJ6YY/FPjIaNgpeT9K6gBwpZBpPxEj6tY6eVY/uvpr4FJHRj9GEhR3FbU3Pxg/1lm0dic/VuG7l6hHED/dyFDFCSfzPu/FVdjyJvM+J+SAarCkzj4=", + "bdata": "AAAAAAAA8D9ONtlkk03uP8sGMraa5+o/B99OBDZq5z8k2fio9efkPw+aPUoy6+E/KvZn5Ryx3j9HxwzG2SnaP8mroAbBLNU/w/uOU17G0D/NZTWweVHKP3YXjA+ip8M/zOuwo4gvvD87FfBIznezP1SzYUI18Kk/0Qq9oWQ7oD87FPsrrSKUP4JZ/ov4HoY/8CIHNh0ZeD+d3hzM2YlpPziUlzReCFg/vyKV2C0TSD9rycsm82E5P4uzm7hCMiI/9FRLeTUcFD9HLx1u9ybzPibkgGqwpN4+", "dtype": "f8" }, "yaxis": "y" @@ -3951,117 +3951,117 @@ " 0\n", " asu\n", " 9\n", - " 0.193202\n", - " 5.0\n", - " 0.214047\n", + " 0.181649\n", + " 6.0\n", + " 0.203707\n", " 5.0\n", " \n", " \n", " 1\n", " asu\n", " 10\n", - " 0.138199\n", + " 0.128773\n", + " 8.0\n", + " 0.149243\n", " 7.0\n", - " 0.160144\n", - " 6.0\n", " \n", " \n", " 2\n", " asu\n", " 11\n", - " 0.094876\n", - " 11.0\n", - " 0.111319\n", - " 9.0\n", + " 0.086540\n", + " 12.0\n", + " 0.104845\n", + " 10.0\n", " \n", " \n", " 3\n", " asu\n", " 12\n", - " 0.061437\n", - " 16.0\n", - " 0.076030\n", - " 13.0\n", + " 0.056439\n", + " 18.0\n", + " 0.070083\n", + " 14.0\n", " \n", " \n", " 4\n", " asu\n", " 13\n", - " 0.038513\n", - " 26.0\n", - " 0.048935\n", - " 20.0\n", + " 0.033222\n", + " 30.0\n", + " 0.043671\n", + " 23.0\n", " \n", " \n", " 5\n", " asu\n", " 14\n", - " 0.022350\n", - " 45.0\n", - " 0.030251\n", - " 33.0\n", + " 0.019337\n", + " 52.0\n", + " 0.025647\n", + " 39.0\n", " \n", " \n", " 6\n", " rehab\n", " 10\n", - " 0.202678\n", + " 0.205611\n", " 5.0\n", - " 0.226770\n", + " 0.227895\n", " 4.0\n", " \n", " \n", " 7\n", " rehab\n", " 11\n", - " 0.150691\n", + " 0.153553\n", " 7.0\n", - " 0.176401\n", + " 0.174892\n", " 6.0\n", " \n", " \n", " 8\n", " rehab\n", " 12\n", - " 0.111069\n", + " 0.110100\n", " 9.0\n", - " 0.131936\n", + " 0.129832\n", " 8.0\n", " \n", " \n", " 9\n", " rehab\n", " 13\n", - " 0.077523\n", + " 0.076047\n", " 13.0\n", - " 0.094953\n", + " 0.092773\n", " 11.0\n", " \n", " \n", " 10\n", " rehab\n", " 14\n", - " 0.051057\n", + " 0.050661\n", " 20.0\n", - " 0.064930\n", - " 15.0\n", + " 0.064114\n", + " 16.0\n", " \n", " \n", " 11\n", " rehab\n", " 15\n", - " 0.032383\n", - " 31.0\n", - " 0.042869\n", - " 23.0\n", + " 0.031703\n", + " 32.0\n", + " 0.041860\n", + " 24.0\n", " \n", " \n", " 12\n", " rehab\n", " 16\n", - " 0.019416\n", - " 52.0\n", - " 0.026822\n", + " 0.019664\n", + " 51.0\n", + " 0.027139\n", " 37.0\n", " \n", " \n", @@ -4070,33 +4070,33 @@ ], "text/plain": [ " unit beds prob_delay_current 1_in_n_delay_current prob_delay_5% \\\n", - "0 asu 9 0.193202 5.0 0.214047 \n", - "1 asu 10 0.138199 7.0 0.160144 \n", - "2 asu 11 0.094876 11.0 0.111319 \n", - "3 asu 12 0.061437 16.0 0.076030 \n", - "4 asu 13 0.038513 26.0 0.048935 \n", - "5 asu 14 0.022350 45.0 0.030251 \n", - "6 rehab 10 0.202678 5.0 0.226770 \n", - "7 rehab 11 0.150691 7.0 0.176401 \n", - "8 rehab 12 0.111069 9.0 0.131936 \n", - "9 rehab 13 0.077523 13.0 0.094953 \n", - "10 rehab 14 0.051057 20.0 0.064930 \n", - "11 rehab 15 0.032383 31.0 0.042869 \n", - "12 rehab 16 0.019416 52.0 0.026822 \n", + "0 asu 9 0.181649 6.0 0.203707 \n", + "1 asu 10 0.128773 8.0 0.149243 \n", + "2 asu 11 0.086540 12.0 0.104845 \n", + "3 asu 12 0.056439 18.0 0.070083 \n", + "4 asu 13 0.033222 30.0 0.043671 \n", + "5 asu 14 0.019337 52.0 0.025647 \n", + "6 rehab 10 0.205611 5.0 0.227895 \n", + "7 rehab 11 0.153553 7.0 0.174892 \n", + "8 rehab 12 0.110100 9.0 0.129832 \n", + "9 rehab 13 0.076047 13.0 0.092773 \n", + "10 rehab 14 0.050661 20.0 0.064114 \n", + "11 rehab 15 0.031703 32.0 0.041860 \n", + "12 rehab 16 0.019664 51.0 0.027139 \n", "\n", " 1_in_n_delay_5% \n", "0 5.0 \n", - "1 6.0 \n", - "2 9.0 \n", - "3 13.0 \n", - "4 20.0 \n", - "5 33.0 \n", + "1 7.0 \n", + "2 10.0 \n", + "3 14.0 \n", + "4 23.0 \n", + "5 39.0 \n", "6 4.0 \n", "7 6.0 \n", "8 8.0 \n", "9 11.0 \n", - "10 15.0 \n", - "11 23.0 \n", + "10 16.0 \n", + "11 24.0 \n", "12 37.0 " ] }, @@ -4160,8 +4160,8 @@ " 0\n", " asu\n", " 9\n", - " 0.19\n", - " 5.0\n", + " 0.18\n", + " 6.0\n", " NaN\n", " NaN\n", " \n", @@ -4169,52 +4169,52 @@ " 1\n", " asu\n", " 10\n", - " 0.14\n", + " 0.13\n", + " 8.0\n", + " 0.15\n", " 7.0\n", - " 0.16\n", - " 6.0\n", " \n", " \n", " 2\n", " asu\n", " 11\n", " 0.09\n", - " 11.0\n", - " 0.11\n", - " 9.0\n", + " 12.0\n", + " 0.10\n", + " 10.0\n", " \n", " \n", " 3\n", " asu\n", " 12\n", " 0.06\n", - " 16.0\n", - " 0.08\n", - " 13.0\n", + " 18.0\n", + " 0.07\n", + " 14.0\n", " \n", " \n", " 4\n", " asu\n", " 13\n", + " 0.03\n", + " 30.0\n", " 0.04\n", - " 26.0\n", - " 0.05\n", - " 20.0\n", + " 23.0\n", " \n", " \n", " 5\n", " asu\n", " 14\n", " 0.02\n", - " 45.0\n", + " 52.0\n", " 0.03\n", - " 33.0\n", + " 39.0\n", " \n", " \n", " 6\n", " rehab\n", " 10\n", - " 0.20\n", + " 0.21\n", " 5.0\n", " NaN\n", " NaN\n", @@ -4244,23 +4244,23 @@ " 0.05\n", " 20.0\n", " 0.06\n", - " 15.0\n", + " 16.0\n", " \n", " \n", " 11\n", " rehab\n", " 15\n", " 0.03\n", - " 31.0\n", + " 32.0\n", " 0.04\n", - " 23.0\n", + " 24.0\n", " \n", " \n", " 12\n", " rehab\n", " 16\n", " 0.02\n", - " 52.0\n", + " 51.0\n", " 0.03\n", " 37.0\n", " \n", @@ -4270,31 +4270,31 @@ ], "text/plain": [ " unit beds prob_delay_current 1_in_n_delay_current prob_delay_5% \\\n", - "0 asu 9 0.19 5.0 NaN \n", - "1 asu 10 0.14 7.0 0.16 \n", - "2 asu 11 0.09 11.0 0.11 \n", - "3 asu 12 0.06 16.0 0.08 \n", - "4 asu 13 0.04 26.0 0.05 \n", - "5 asu 14 0.02 45.0 0.03 \n", - "6 rehab 10 0.20 5.0 NaN \n", + "0 asu 9 0.18 6.0 NaN \n", + "1 asu 10 0.13 8.0 0.15 \n", + "2 asu 11 0.09 12.0 0.10 \n", + "3 asu 12 0.06 18.0 0.07 \n", + "4 asu 13 0.03 30.0 0.04 \n", + "5 asu 14 0.02 52.0 0.03 \n", + "6 rehab 10 0.21 5.0 NaN \n", "8 rehab 12 0.11 9.0 0.13 \n", "9 rehab 13 0.08 13.0 0.09 \n", "10 rehab 14 0.05 20.0 0.06 \n", - "11 rehab 15 0.03 31.0 0.04 \n", - "12 rehab 16 0.02 52.0 0.03 \n", + "11 rehab 15 0.03 32.0 0.04 \n", + "12 rehab 16 0.02 51.0 0.03 \n", "\n", " 1_in_n_delay_5% \n", "0 NaN \n", - "1 6.0 \n", - "2 9.0 \n", - "3 13.0 \n", - "4 20.0 \n", - "5 33.0 \n", + "1 7.0 \n", + "2 10.0 \n", + "3 14.0 \n", + "4 23.0 \n", + "5 39.0 \n", "6 NaN \n", "8 8.0 \n", "9 11.0 \n", - "10 15.0 \n", - "11 23.0 \n", + "10 16.0 \n", + "11 24.0 \n", "12 37.0 " ] }, @@ -4411,55 +4411,55 @@ " 0\n", " asu\n", " 10\n", - " 0.14\n", - " 7.0\n", - " 0.09\n", - " 11.0\n", + " 0.13\n", + " 8.0\n", + " 0.08\n", + " 12.0\n", " \n", " \n", " 1\n", " asu\n", " 11\n", " 0.09\n", - " 11.0\n", - " 0.06\n", - " 18.0\n", + " 12.0\n", + " 0.05\n", + " 20.0\n", " \n", " \n", " 2\n", " asu\n", " 12\n", " 0.06\n", - " 16.0\n", + " 18.0\n", " 0.03\n", - " 31.0\n", + " 36.0\n", " \n", " \n", " 3\n", " asu\n", " 13\n", - " 0.04\n", - " 26.0\n", - " 0.02\n", - " 55.0\n", + " 0.03\n", + " 30.0\n", + " 0.01\n", + " 67.0\n", " \n", " \n", " 4\n", " asu\n", " 14\n", " 0.02\n", - " 45.0\n", + " 52.0\n", " 0.01\n", - " 111.0\n", + " 131.0\n", " \n", " \n", " 5\n", " asu\n", " 15\n", " 0.01\n", - " 79.0\n", + " 95.0\n", " 0.00\n", - " 225.0\n", + " 277.0\n", " \n", " \n", " 6\n", @@ -4468,7 +4468,7 @@ " 0.11\n", " 9.0\n", " 0.05\n", - " 20.0\n", + " 19.0\n", " \n", " \n", " 7\n", @@ -4493,18 +4493,18 @@ " rehab\n", " 15\n", " 0.03\n", - " 31.0\n", + " 32.0\n", " 0.01\n", - " 101.0\n", + " 110.0\n", " \n", " \n", " 10\n", " rehab\n", " 16\n", " 0.02\n", - " 52.0\n", + " 51.0\n", " 0.00\n", - " 212.0\n", + " 205.0\n", " \n", " \n", "\n", @@ -4512,30 +4512,30 @@ ], "text/plain": [ " unit beds prob_delay_current 1_in_n_delay_current \\\n", - "0 asu 10 0.14 7.0 \n", - "1 asu 11 0.09 11.0 \n", - "2 asu 12 0.06 16.0 \n", - "3 asu 13 0.04 26.0 \n", - "4 asu 14 0.02 45.0 \n", - "5 asu 15 0.01 79.0 \n", + "0 asu 10 0.13 8.0 \n", + "1 asu 11 0.09 12.0 \n", + "2 asu 12 0.06 18.0 \n", + "3 asu 13 0.03 30.0 \n", + "4 asu 14 0.02 52.0 \n", + "5 asu 15 0.01 95.0 \n", "6 rehab 12 0.11 9.0 \n", "7 rehab 13 0.08 13.0 \n", "8 rehab 14 0.05 20.0 \n", - "9 rehab 15 0.03 31.0 \n", - "10 rehab 16 0.02 52.0 \n", + "9 rehab 15 0.03 32.0 \n", + "10 rehab 16 0.02 51.0 \n", "\n", " prob_delay_no_complex_neuro 1_in_n_delay_no_complex_neuro \n", - "0 0.09 11.0 \n", - "1 0.06 18.0 \n", - "2 0.03 31.0 \n", - "3 0.02 55.0 \n", - "4 0.01 111.0 \n", - "5 0.00 225.0 \n", - "6 0.05 20.0 \n", + "0 0.08 12.0 \n", + "1 0.05 20.0 \n", + "2 0.03 36.0 \n", + "3 0.01 67.0 \n", + "4 0.01 131.0 \n", + "5 0.00 277.0 \n", + "6 0.05 19.0 \n", "7 0.03 32.0 \n", "8 0.02 57.0 \n", - "9 0.01 101.0 \n", - "10 0.00 212.0 " + "9 0.01 110.0 \n", + "10 0.00 205.0 " ] }, "metadata": {}, @@ -4607,420 +4607,390 @@ " \n", " \n", " 0\n", - " 2\n", - " 1\n", - " 0.000004\n", - " 0.000004\n", + " 3\n", + " 3\n", + " 0.000011\n", + " 0.000011\n", " 1.000000\n", " 1.0\n", " \n", " \n", " 1\n", - " 3\n", - " 11\n", - " 0.000040\n", - " 0.000044\n", - " 0.916667\n", + " 4\n", + " 14\n", + " 0.000051\n", + " 0.000062\n", + " 0.823529\n", " 1.0\n", " \n", " \n", " 2\n", - " 4\n", - " 13\n", - " 0.000047\n", - " 0.000091\n", - " 0.520000\n", - " 2.0\n", - " \n", - " \n", - " 3\n", " 5\n", - " 52\n", - " 0.000190\n", - " 0.000281\n", - " 0.675325\n", + " 51\n", + " 0.000186\n", + " 0.000248\n", + " 0.750000\n", " 1.0\n", " \n", " \n", - " 4\n", + " 3\n", " 6\n", - " 133\n", - " 0.000486\n", - " 0.000767\n", - " 0.633333\n", - " 2.0\n", + " 189\n", + " 0.000690\n", + " 0.000939\n", + " 0.735409\n", + " 1.0\n", " \n", " \n", - " 5\n", + " 4\n", " 7\n", - " 416\n", - " 0.001520\n", - " 0.002287\n", - " 0.664537\n", + " 466\n", + " 0.001702\n", + " 0.002641\n", + " 0.644537\n", " 2.0\n", " \n", " \n", - " 6\n", + " 5\n", " 8\n", - " 952\n", - " 0.003478\n", - " 0.005764\n", - " 0.603295\n", + " 1178\n", + " 0.004303\n", + " 0.006944\n", + " 0.619674\n", " 2.0\n", " \n", " \n", - " 7\n", + " 6\n", " 9\n", - " 2049\n", - " 0.007485\n", - " 0.013249\n", - " 0.564930\n", + " 2324\n", + " 0.008489\n", + " 0.015434\n", + " 0.550059\n", " 2.0\n", " \n", " \n", - " 8\n", + " 7\n", " 10\n", - " 3709\n", - " 0.013549\n", - " 0.026798\n", - " 0.505589\n", + " 4106\n", + " 0.014999\n", + " 0.030433\n", + " 0.492858\n", " 2.0\n", " \n", " \n", - " 9\n", + " 8\n", " 11\n", - " 6326\n", - " 0.023109\n", - " 0.049907\n", - " 0.463036\n", + " 6748\n", + " 0.024650\n", + " 0.055083\n", + " 0.447510\n", " 2.0\n", " \n", " \n", - " 10\n", + " 9\n", " 12\n", - " 9584\n", - " 0.035010\n", - " 0.084917\n", - " 0.412286\n", + " 10234\n", + " 0.037384\n", + " 0.092468\n", + " 0.404298\n", " 2.0\n", " \n", " \n", - " 11\n", + " 10\n", " 13\n", - " 13434\n", - " 0.049074\n", - " 0.133991\n", - " 0.366249\n", + " 14118\n", + " 0.051573\n", + " 0.144040\n", + " 0.358043\n", " 3.0\n", " \n", " \n", - " 12\n", + " 11\n", " 14\n", - " 17387\n", - " 0.063514\n", - " 0.197505\n", - " 0.321582\n", + " 18167\n", + " 0.066363\n", + " 0.210404\n", + " 0.315410\n", " 3.0\n", " \n", " \n", - " 13\n", + " 12\n", " 15\n", - " 21372\n", - " 0.078071\n", - " 0.275576\n", - " 0.283302\n", + " 21953\n", + " 0.080194\n", + " 0.290597\n", + " 0.275961\n", " 4.0\n", " \n", " \n", - " 14\n", + " 13\n", " 16\n", - " 23833\n", - " 0.087061\n", - " 0.362637\n", - " 0.240078\n", + " 24390\n", + " 0.089096\n", + " 0.379693\n", + " 0.234652\n", " 4.0\n", " \n", " \n", - " 15\n", + " 14\n", " 17\n", - " 25548\n", - " 0.093326\n", - " 0.455963\n", - " 0.204679\n", + " 25947\n", + " 0.094784\n", + " 0.474477\n", + " 0.199764\n", " 5.0\n", " \n", " \n", - " 16\n", + " 15\n", " 18\n", - " 25435\n", - " 0.092913\n", - " 0.548877\n", - " 0.169279\n", + " 25819\n", + " 0.094316\n", + " 0.568793\n", + " 0.165818\n", " 6.0\n", " \n", " \n", - " 17\n", + " 16\n", " 19\n", - " 24410\n", - " 0.089169\n", - " 0.638046\n", - " 0.139753\n", + " 24330\n", + " 0.088877\n", + " 0.657669\n", + " 0.135139\n", " 7.0\n", " \n", " \n", - " 18\n", + " 17\n", " 20\n", - " 22014\n", - " 0.080416\n", - " 0.718462\n", - " 0.111929\n", + " 21824\n", + " 0.079722\n", + " 0.737392\n", + " 0.108114\n", " 9.0\n", " \n", " \n", - " 19\n", + " 18\n", " 21\n", - " 19212\n", - " 0.070181\n", - " 0.788643\n", - " 0.088989\n", - " 11.0\n", + " 18487\n", + " 0.067532\n", + " 0.804924\n", + " 0.083899\n", + " 12.0\n", " \n", " \n", - " 20\n", + " 19\n", " 22\n", - " 15967\n", - " 0.058327\n", - " 0.846970\n", - " 0.068865\n", - " 15.0\n", + " 14883\n", + " 0.054367\n", + " 0.859291\n", + " 0.063270\n", + " 16.0\n", " \n", " \n", - " 21\n", + " 20\n", " 23\n", - " 12496\n", - " 0.045647\n", - " 0.892617\n", - " 0.051139\n", - " 20.0\n", + " 11619\n", + " 0.042444\n", + " 0.901735\n", + " 0.047069\n", + " 21.0\n", " \n", " \n", - " 22\n", + " 21\n", " 24\n", - " 9255\n", - " 0.033808\n", - " 0.926426\n", - " 0.036493\n", - " 27.0\n", + " 8578\n", + " 0.031335\n", + " 0.933070\n", + " 0.033583\n", + " 30.0\n", " \n", " \n", - " 23\n", + " 22\n", " 25\n", - " 6781\n", - " 0.024771\n", - " 0.951196\n", - " 0.026042\n", - " 38.0\n", + " 6290\n", + " 0.022977\n", + " 0.956047\n", + " 0.024034\n", + " 42.0\n", " \n", " \n", - " 24\n", + " 23\n", " 26\n", - " 4850\n", - " 0.017717\n", - " 0.968913\n", - " 0.018285\n", - " 55.0\n", + " 4367\n", + " 0.015953\n", + " 0.972000\n", + " 0.016412\n", + " 61.0\n", " \n", " \n", - " 25\n", + " 24\n", " 27\n", - " 3344\n", - " 0.012216\n", - " 0.981129\n", - " 0.012450\n", - " 80.0\n", + " 2797\n", + " 0.010217\n", + " 0.982217\n", + " 0.010402\n", + " 96.0\n", " \n", " \n", - " 26\n", + " 25\n", " 28\n", - " 2025\n", - " 0.007397\n", - " 0.988526\n", - " 0.007483\n", - " 134.0\n", + " 1919\n", + " 0.007010\n", + " 0.989227\n", + " 0.007086\n", + " 141.0\n", " \n", " \n", - " 27\n", + " 26\n", " 29\n", - " 1238\n", - " 0.004522\n", - " 0.993048\n", - " 0.004554\n", - " 220.0\n", + " 1275\n", + " 0.004658\n", + " 0.993885\n", + " 0.004686\n", + " 213.0\n", " \n", " \n", - " 28\n", + " 27\n", " 30\n", - " 810\n", - " 0.002959\n", - " 0.996007\n", - " 0.002971\n", - " 337.0\n", + " 724\n", + " 0.002645\n", + " 0.996530\n", + " 0.002654\n", + " 377.0\n", " \n", " \n", - " 29\n", + " 28\n", " 31\n", - " 457\n", - " 0.001669\n", - " 0.997677\n", - " 0.001673\n", - " 598.0\n", + " 435\n", + " 0.001589\n", + " 0.998119\n", + " 0.001592\n", + " 628.0\n", " \n", " \n", - " 30\n", + " 29\n", " 32\n", - " 267\n", - " 0.000975\n", - " 0.998652\n", - " 0.000977\n", - " 1024.0\n", + " 252\n", + " 0.000921\n", + " 0.999039\n", + " 0.000921\n", + " 1085.0\n", " \n", " \n", - " 31\n", + " 30\n", " 33\n", - " 155\n", - " 0.000566\n", - " 0.999218\n", - " 0.000567\n", - " 1765.0\n", + " 121\n", + " 0.000442\n", + " 0.999481\n", + " 0.000442\n", + " 2261.0\n", " \n", " \n", - " 32\n", + " 31\n", " 34\n", - " 99\n", - " 0.000362\n", - " 0.999580\n", - " 0.000362\n", - " 2764.0\n", + " 68\n", + " 0.000248\n", + " 0.999730\n", + " 0.000248\n", + " 4025.0\n", " \n", " \n", - " 33\n", + " 32\n", " 35\n", - " 46\n", - " 0.000168\n", - " 0.999748\n", - " 0.000168\n", - " 5950.0\n", + " 38\n", + " 0.000139\n", + " 0.999868\n", + " 0.000139\n", + " 7203.0\n", " \n", " \n", - " 34\n", + " 33\n", " 36\n", - " 30\n", - " 0.000110\n", - " 0.999858\n", - " 0.000110\n", - " 9124.0\n", + " 16\n", + " 0.000058\n", + " 0.999927\n", + " 0.000058\n", + " 17108.0\n", " \n", " \n", - " 35\n", + " 34\n", " 37\n", - " 22\n", - " 0.000080\n", - " 0.999938\n", - " 0.000080\n", - " 12442.0\n", + " 8\n", + " 0.000029\n", + " 0.999956\n", + " 0.000029\n", + " 34217.0\n", " \n", " \n", - " 36\n", + " 35\n", " 38\n", " 6\n", " 0.000022\n", - " 0.999960\n", + " 0.999978\n", " 0.000022\n", - " 45623.0\n", + " 45624.0\n", " \n", " \n", - " 37\n", + " 36\n", " 39\n", " 4\n", " 0.000015\n", - " 0.999974\n", - " 0.000015\n", - " 68436.0\n", - " \n", - " \n", - " 38\n", - " 40\n", - " 4\n", - " 0.000015\n", - " 0.999989\n", + " 0.999993\n", " 0.000015\n", " 68437.0\n", " \n", " \n", - " 39\n", - " 41\n", + " 37\n", + " 40\n", " 2\n", " 0.000007\n", - " 0.999996\n", + " 1.000000\n", " 0.000007\n", " 136875.0\n", " \n", - " \n", - " 40\n", - " 42\n", - " 1\n", - " 0.000004\n", - " 1.000000\n", - " 0.000004\n", - " 273750.0\n", - " \n", " \n", "\n", "" ], "text/plain": [ " beds freq pct c_pct prob_delay 1_in_n_delay\n", - "0 2 1 0.000004 0.000004 1.000000 1.0\n", - "1 3 11 0.000040 0.000044 0.916667 1.0\n", - "2 4 13 0.000047 0.000091 0.520000 2.0\n", - "3 5 52 0.000190 0.000281 0.675325 1.0\n", - "4 6 133 0.000486 0.000767 0.633333 2.0\n", - "5 7 416 0.001520 0.002287 0.664537 2.0\n", - "6 8 952 0.003478 0.005764 0.603295 2.0\n", - "7 9 2049 0.007485 0.013249 0.564930 2.0\n", - "8 10 3709 0.013549 0.026798 0.505589 2.0\n", - "9 11 6326 0.023109 0.049907 0.463036 2.0\n", - "10 12 9584 0.035010 0.084917 0.412286 2.0\n", - "11 13 13434 0.049074 0.133991 0.366249 3.0\n", - "12 14 17387 0.063514 0.197505 0.321582 3.0\n", - "13 15 21372 0.078071 0.275576 0.283302 4.0\n", - "14 16 23833 0.087061 0.362637 0.240078 4.0\n", - "15 17 25548 0.093326 0.455963 0.204679 5.0\n", - "16 18 25435 0.092913 0.548877 0.169279 6.0\n", - "17 19 24410 0.089169 0.638046 0.139753 7.0\n", - "18 20 22014 0.080416 0.718462 0.111929 9.0\n", - "19 21 19212 0.070181 0.788643 0.088989 11.0\n", - "20 22 15967 0.058327 0.846970 0.068865 15.0\n", - "21 23 12496 0.045647 0.892617 0.051139 20.0\n", - "22 24 9255 0.033808 0.926426 0.036493 27.0\n", - "23 25 6781 0.024771 0.951196 0.026042 38.0\n", - "24 26 4850 0.017717 0.968913 0.018285 55.0\n", - "25 27 3344 0.012216 0.981129 0.012450 80.0\n", - "26 28 2025 0.007397 0.988526 0.007483 134.0\n", - "27 29 1238 0.004522 0.993048 0.004554 220.0\n", - "28 30 810 0.002959 0.996007 0.002971 337.0\n", - "29 31 457 0.001669 0.997677 0.001673 598.0\n", - "30 32 267 0.000975 0.998652 0.000977 1024.0\n", - "31 33 155 0.000566 0.999218 0.000567 1765.0\n", - "32 34 99 0.000362 0.999580 0.000362 2764.0\n", - "33 35 46 0.000168 0.999748 0.000168 5950.0\n", - "34 36 30 0.000110 0.999858 0.000110 9124.0\n", - "35 37 22 0.000080 0.999938 0.000080 12442.0\n", - "36 38 6 0.000022 0.999960 0.000022 45623.0\n", - "37 39 4 0.000015 0.999974 0.000015 68436.0\n", - "38 40 4 0.000015 0.999989 0.000015 68437.0\n", - "39 41 2 0.000007 0.999996 0.000007 136875.0\n", - "40 42 1 0.000004 1.000000 0.000004 273750.0" + "0 3 3 0.000011 0.000011 1.000000 1.0\n", + "1 4 14 0.000051 0.000062 0.823529 1.0\n", + "2 5 51 0.000186 0.000248 0.750000 1.0\n", + "3 6 189 0.000690 0.000939 0.735409 1.0\n", + "4 7 466 0.001702 0.002641 0.644537 2.0\n", + "5 8 1178 0.004303 0.006944 0.619674 2.0\n", + "6 9 2324 0.008489 0.015434 0.550059 2.0\n", + "7 10 4106 0.014999 0.030433 0.492858 2.0\n", + "8 11 6748 0.024650 0.055083 0.447510 2.0\n", + "9 12 10234 0.037384 0.092468 0.404298 2.0\n", + "10 13 14118 0.051573 0.144040 0.358043 3.0\n", + "11 14 18167 0.066363 0.210404 0.315410 3.0\n", + "12 15 21953 0.080194 0.290597 0.275961 4.0\n", + "13 16 24390 0.089096 0.379693 0.234652 4.0\n", + "14 17 25947 0.094784 0.474477 0.199764 5.0\n", + "15 18 25819 0.094316 0.568793 0.165818 6.0\n", + "16 19 24330 0.088877 0.657669 0.135139 7.0\n", + "17 20 21824 0.079722 0.737392 0.108114 9.0\n", + "18 21 18487 0.067532 0.804924 0.083899 12.0\n", + "19 22 14883 0.054367 0.859291 0.063270 16.0\n", + "20 23 11619 0.042444 0.901735 0.047069 21.0\n", + "21 24 8578 0.031335 0.933070 0.033583 30.0\n", + "22 25 6290 0.022977 0.956047 0.024034 42.0\n", + "23 26 4367 0.015953 0.972000 0.016412 61.0\n", + "24 27 2797 0.010217 0.982217 0.010402 96.0\n", + "25 28 1919 0.007010 0.989227 0.007086 141.0\n", + "26 29 1275 0.004658 0.993885 0.004686 213.0\n", + "27 30 724 0.002645 0.996530 0.002654 377.0\n", + "28 31 435 0.001589 0.998119 0.001592 628.0\n", + "29 32 252 0.000921 0.999039 0.000921 1085.0\n", + "30 33 121 0.000442 0.999481 0.000442 2261.0\n", + "31 34 68 0.000248 0.999730 0.000248 4025.0\n", + "32 35 38 0.000139 0.999868 0.000139 7203.0\n", + "33 36 16 0.000058 0.999927 0.000058 17108.0\n", + "34 37 8 0.000029 0.999956 0.000029 34217.0\n", + "35 38 6 0.000022 0.999978 0.000022 45624.0\n", + "36 39 4 0.000015 0.999993 0.000015 68437.0\n", + "37 40 2 0.000007 1.000000 0.000007 136875.0" ] }, "execution_count": 16, @@ -5056,7 +5026,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "0.06886542625227508 15.0\n" + "0.06326972210295412 16.0\n" ] } ], @@ -5077,7 +5047,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "0.01828532649675765 55.0\n" + "0.01641204878140444 61.0\n" ] } ], @@ -5484,29 +5454,29 @@ " 0\n", " 0\n", " 22\n", - " 0.069\n", - " 0.069\n", - " 15\n", - " 15\n", + " 0.063\n", + " 0.063\n", + " 16\n", + " 16\n", " \n", " \n", " 1\n", " 0\n", " 0\n", " 26\n", - " 0.018\n", - " 0.018\n", - " 55\n", - " 55\n", + " 0.016\n", + " 0.016\n", + " 61\n", + " 61\n", " \n", " \n", " 2\n", " 14\n", " 12\n", " 0\n", - " 0.022\n", - " 0.111\n", - " 45\n", + " 0.019\n", + " 0.110\n", + " 52\n", " 9\n", " \n", " \n", @@ -5514,9 +5484,9 @@ " 11\n", " 11\n", " 4\n", - " 0.051\n", - " 0.092\n", - " 20\n", + " 0.044\n", + " 0.089\n", + " 23\n", " 11\n", " \n", " \n", @@ -5524,9 +5494,9 @@ " 11\n", " 10\n", " 5\n", - " 0.043\n", - " 0.094\n", - " 23\n", + " 0.037\n", + " 0.090\n", + " 27\n", " 11\n", " \n", " \n", @@ -5534,40 +5504,40 @@ " 10\n", " 10\n", " 6\n", - " 0.047\n", - " 0.070\n", - " 21\n", - " 14\n", + " 0.041\n", + " 0.066\n", + " 24\n", + " 15\n", " \n", " \n", " 6\n", " 10\n", " 9\n", " 7\n", - " 0.044\n", - " 0.070\n", - " 23\n", - " 14\n", + " 0.039\n", + " 0.066\n", + " 26\n", + " 15\n", " \n", " \n", " 7\n", " 9\n", " 9\n", " 8\n", - " 0.047\n", - " 0.058\n", - " 21\n", - " 17\n", + " 0.042\n", + " 0.053\n", + " 24\n", + " 19\n", " \n", " \n", " 8\n", " 9\n", " 8\n", " 9\n", - " 0.046\n", - " 0.058\n", - " 22\n", - " 17\n", + " 0.041\n", + " 0.053\n", + " 25\n", + " 19\n", " \n", " \n", "\n", @@ -5575,26 +5545,26 @@ ], "text/plain": [ " dedicated_acute dedicated_rehab pooled pdelay_acute pdelay_rehab \\\n", - "0 0 0 22 0.069 0.069 \n", - "1 0 0 26 0.018 0.018 \n", - "2 14 12 0 0.022 0.111 \n", - "3 11 11 4 0.051 0.092 \n", - "4 11 10 5 0.043 0.094 \n", - "5 10 10 6 0.047 0.070 \n", - "6 10 9 7 0.044 0.070 \n", - "7 9 9 8 0.047 0.058 \n", - "8 9 8 9 0.046 0.058 \n", + "0 0 0 22 0.063 0.063 \n", + "1 0 0 26 0.016 0.016 \n", + "2 14 12 0 0.019 0.110 \n", + "3 11 11 4 0.044 0.089 \n", + "4 11 10 5 0.037 0.090 \n", + "5 10 10 6 0.041 0.066 \n", + "6 10 9 7 0.039 0.066 \n", + "7 9 9 8 0.042 0.053 \n", + "8 9 8 9 0.041 0.053 \n", "\n", " 1_in_n_delay_acute 1_in_n_delay_rehab \n", - "0 15 15 \n", - "1 55 55 \n", - "2 45 9 \n", - "3 20 11 \n", - "4 23 11 \n", - "5 21 14 \n", - "6 23 14 \n", - "7 21 17 \n", - "8 22 17 " + "0 16 16 \n", + "1 61 61 \n", + "2 52 9 \n", + "3 23 11 \n", + "4 27 11 \n", + "5 24 15 \n", + "6 26 15 \n", + "7 24 19 \n", + "8 25 19 " ] }, "metadata": {}, diff --git a/outputs/figure1_asu.png b/outputs/figure1_asu.png index a44618cd796f22c64d9604717dd07ff24522b706..1f5d5efa3866fc5df07e15784f53d2c7b0b2aef8 100644 GIT binary patch literal 29789 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 XAt&-zpLei6fcaRM+FYwPz8m{5qW*B# literal 30327 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 diff --git a/outputs/figure3_asu.png b/outputs/figure3_asu.png index 4146c103cc02798c5c33be60ce267bac2e56dbdc..51b81d74d3eb110c835ddc42ed668b2b14c53a70 100644 GIT binary patch literal 25019 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 literal 25719 zcmeFZcRbbq|2KXP3Y8JX+df64qB65`tWcp;_Nd6_nAsc+l#FC#Rb*z5>`{`Ey*DM9 z$=>UFyo~Doy*}SRu77^N>$=^(|F{+ByvB1p9{0!net$e4T~U-J+eg0-g+h_Z%SkJv zP=pv13SCaJ7k)#lm--on!l2}(C9XT@O!Si49=cKbY1*CgX{|P+T>xD$`Vl#MOxC&2 zN4-h*alcCZDIKKn?yzl;EAQ8P`}W1){UnKG4l)M4-*fN~QKR%RZ`Kp6KKUOq%4W+Z z?Q}?@(tefRXzgw77xv;MZz;JkUvNWyeXLJ2*y`&$55n?$C;}1;e)q=`CO`r;EfJ>h z=T{g!{vZZ#dGueu!4VKq_9u2y{{3A_>^WjeEDBAu^W&W$n!p>^Vn*`&H}E$SOeEo7 z_rrXRK%pxHO#~k7J^^wYBFehIze72tfJY55@H0sMxi|_Ko%g2D z%|5dGw#aQ@n8^QUnEq#&{$E&4gPVzqKRa2ayvT#I?o@vXI3nd@iu!vSVufKFNb64z zeB?3fIMZ3`TBPMV-%1o)8vKZ6#aK|mC6obdA#I$m<)&Tk*Q zs#oU6#muMMQZ=iS(@V!j1rizmiVtP56R++Kuq2xaEnAb>w|~Ew@kuf!RV}NBlvvSk zams(5h6vt>1Vbu3-*M`9;KB;;Ltb-ZZFz_RBVzw6h>)0E?&IUbwWf}mxn^|Jk*|o^ zm`>CA(fz*Ty9;>K?Pyt4=DXL&|6E1`E^{h83U%8<_UfNI<{ZM{)%Zlv6$Jho)!*qTDa~_~`G^h>e2)8PiFMp>a4Q^E;NwU4qyulTD31 zHFf;)?=Tn;0-@8#fCI1g_3EMD&x_%LDWa)W{GSK@KO12W?B0Nh?!4-+@9*CkZHiMa zu)Z_e^)`9#XJ>ZH-oAXR*9Vw{udAeL9J}%6`qK!DLiw(@ro#@Blvu_`YUtmikMg)r zL_mjy70j`^Fu@yryE$GV@Yyp~y-$9@mA(utO>0H=lOb>!`3M2?SlCB_FJI!yAE&ub zf25Ta)h5AcDg0SDBo*wG`KTC=qaq@jGcz-6yu8guuuCrFns>7o6cl)kq-Yg15gnRX zKYlI#$+ErnBy5+!Pt49wP*mN^6HKdcNhiBevpeQ}_9BeOgZQW5<|8?gqVd-%w{)j6BZbzBVm^ z)*q?~^9o`TFnfN8hNiHCaZ|Syp85o`e{(E)HRj6H|4P;*_po0Hrgczk0hbA7|mw_crS*?kx7Sukb!-kl4DhzA8g_VewaQ+|}0?_TC_*UemZxN>OU^MH4{AoZ`~#{ z;@@||97p0r2;2X+al#Gm+3WLWBv$^};7|n4&qQ10FF^NB1)|>(x&IiXdaF^lGc~Us zZq@PUc;O&9f`0VaC-~2*(1IkRhNb$SSh$^SoGA(9l2uX%i)ZVyuXtBx{P1 z*{@!7H}!hrmG^v~Qq;5c7k+l~7}iB*)V`L``_)rmJ)W8uKE-qM9jcLIDH?T6BZ3Nh zQM{WJ!@2Mb-}^f`yHIV%!vF#EuFr*b<7}*~AI{W82r98Fy*Ra>mis{U$~P~TFWv`P zr3pXA$oRzG`ryf9(Q_{8dXjSE3a??EXlzOy1Lvtzb4f|cro2P}EheWIXm&U6)FpUa zwiZH26S{nlw4AYX{tMPYT5fC8vc_FGNu-<*$atmFR~9F6?CIhwBd=wW$0<_-tEaww zAjQN*CJ|AVao@_lzl#}Q9egG5u0vOS`NH!d73TAfhF(kJRReNw^5hc*Bho*A^%hls zVsY1+Q=-4X>@;#jJxgD{qD`MfWmFWNY(?T--*2qqh6KgqT9bVxahJn*c=SJ0b{0Ek zJCdc7XF@_K_}O2kTWC9aTT=G*1>c&8@Nhokqa{xBJmV7`nICGli7dIG<*(->40{3-BaSnde;pfUe*8?Ek8d*P&x|N}PtqXLL^So3sRQymV>u zd6PuF`}Wv(tbiZ)oI+O!;nk*uX~Y(LZ0^9q@f*)1_ycKYNC47y-9sr0_pMHrod$fL z)xcFU0#N1{2Zt;P=EamU=kBM!Cc&uP3kCRVc-3}(td-qG|IVF98-n|HKY+)MZC&p1 z)<=T=g_AMwk$kilqWD+!L&yG=mE?HwZ?`h)g3CyvGZftN+5%9z^@$ z$>|}Xz|;Kyd8<;QfKu1hi(ceRv2N=tflr@)TRwv8FV)^l!F=jcD0lFe;FFiy)3oCZ z>tEc;E3z9`F>ZME{>bLtFPsUVyK!YqR=T8^7lL;>$SAQ?-|JL<$5}xl7g9`KkG0P! z^(^T(Dyb&-KHpH)J_blHg<+K?*AH%11vl0oX^74;Zf38ls(PBK_vzyIN?!`~O<;Xy z#?#A~=N8jTSKc6ijt5{Lfwy7mA@`3&0ZS9dAMHj5HjQ_os2JiTF|yO8OEH5#epC(B zM#RA$WPj3m+s!p?Nl@{h);5^d44v_yj!5Ew$`qv?S+_gtc(v05(WxJ zVthz2ez!N$fuiY;kEJ&AVu#zGvV&s!0i!Uy}Jg?p7G|ts{>vFrUdr6LYciVx` zENua^j++D(0IuUCAMT46o~U}hjZi;jt{A>_RmmZ)NLrLSd7C7JHG$(Klzg}Tlzi`K z(fx#S5)vMygtJ4n&(>ELBW_)V+!(0qwk)HOXTb%LC`;HfwM-#GAj_h+FlL#(FtzF# zM|Jtb{j6;zHp7ZYOch<5`e6Nj4=rQPF960AoFb4IAw1`F>F)c)4W(@F6RKTkh|MBd zqQbhZP6#5oZ1l#`T(i=TpV{>xrs*Xr++}Ol5aa^^&8gCGX|Opx+gzKi*X(@Ygq@k4 zjngWyj_2-8+Xxe}x2P!OPzYzM4m~Yc!h0+fQX1oo{Rb}!sO;XVxI84qOcz|;x4W6; z_M&wO!1A#@ful2y2}NhfYJ3Sp?(FCVviCce3r z&1c*s9j_2!@I^NJ4ADvYV~g!a@cFolzPoRN*Ci+=qKtCsdvhZ>Mu<*_WjC%H94%0E zXm6kL`{%4=xFF8L)75UYNv6<#lG~S_|3p`?)%VJ(P+d1pCDCc=mLgfyqwp`SheF|VmGMwHhk0R;^na(lr!!xEmd}R&bvqKwuLxz<-&YKUD@qf-UtjFUu}4gHWPT6OYZg?A8<0fFUrs*wA9l~m zEv&0%5c$KV<$v<}-HI5Y78xp=KU};LU4C7Q1oOz4pFr+*Pv?o>ckqNe48nYc60^8m z*;vRc3-e!92;-44X-na}mY^8yFTSA$Rn16c=8_IEy29Q%TjD=lL3;Sc$Vtn2_jv}U zF2bgaTT;BTuOT8B7^$4#CJLy?p+~cw{bhD|cWy1EU;|ozdr14mb+Om5^vZdMshgd7 zxR+0uL{xMfzU_gn794z1wb1HRX*&?NQIX666#>~dcB`{@{IE2<7aSsOo8;q%zdutt z|Mc!eSJlhSHN#FQV8dvwKQYVlIPFO0bzhYB65fv3yt9zA5RT{>g&7K zn$Pi79o2Z+U$&^nd9tK2E&Td8%vLjFG-_bJZL(mP`Oy#21t<4JmfaB{xraAI$7<$T zTwT2!A;2|e_sm!Z##!S#%;N0a$3698i;<2pd@zg?)w=-`(?RfJPr%LW^~uJA*n6E{ zSY`bVO$0X!=8n2&|LajqQOlF=nK~J0TByaUaBo zxm6Z;fnbUId#iqg>RJ$Zb2~aZ&eZVMe}*s-66in_5M(CsDT*C`j_OZ7rp$u{7z;s) zN3Zfgl6v-##4P*1eftKxOw;*UI4*yDhzfk1I#gUwL}|#{_M2-PI6QR>AL+W#nRW9$ zL6S;pmjrq+%D(R@nsD!D*x3WUn-4-*@oYi;*}l|R(bsXecb5(pGK_Z7-Qd}Jaa}0f zZydtH$~h+HG#79&_(auU)w63^oFo{|PBT9d1(X%r?LE6+#8@E1GyKw>Td>FS{>YUS z!9E8mh~69!%|fB%ziLn$ehff~_bQ4?JpdIb=Q^3IfSRrg3ICnmV9oO2pl~p#i{yOi zwvxnn&JtTEI(vDvCFvPmNbsBeXto=g+%s;}FqvtLhj+Fpn-?C3W)mWB?=8XL^T)$Z zy*-Exj62prvGZgkF|cy<$6AuEI*)1vAe%g?!=w)4iIu=@vfodygRUo#s}AAvS&$c( z&UfE*6Z-am`tgRM*DcrOAEDMOqY2gGo6GeMi{jBgfJ^+bX!f0mvfe1^pWOvIHO!?3 zul!oe@kg*Vlu<0weW{v)#x03YZGZK2w#JjVI=b%ANsW1y^FKRz2L#$u)LALS*D_Lc zN;IJ8&@1h7Ym(=XIVFX%dfOQo&qE;B#J5LeSE@lDno1##&A$O5zt)Q+J1dL)Xrv(S z#S<2BojGTW1^4>O{4*%1sv4rDY6ll1BN^#L?xyfTh4IsX&$h>9wwA~8E0)?@vV{M~ zmta21vI5p)Qa&B(Ytu5A78>`L!|&)$Id_lYmLxs{qaAbi!& zpJr9n)z4~bE?=8`epXMvJJ&ogB7)(rNV~Ru)MylEfxDuJ42AczD<&HvXg2&&`SJMQ2`#=y>R+7`rlEj~Z~?X3@cjT>Vgrf3(b zoVcENbF3BTTk}Fp6UZW)&v%i+Q3x>WkF09$XNOO!e6EWU`4Qv89SD3&)l*q!I;%1g zOd7wY@(qYVZ-#Cf?vMqTn@Cb)YMSfN^RJ>-5Ge&~d&d4>c ztdKnm^x2zOUM|_K9q$qdTytQGLI;JH%f_|qjX z21fD;bfdVan=L{Z;ZAL@Ek4Uk+3VUUV*n{NJ7d;<`p32;Z70)H%xjtT{=Mi5cbi=A9q2d8iV%$o?M3#u=7_VuOSws?T4Nn& zhla>hfggJc#bJb?&L~n6!yNiRskgBT7d7$J8||0XAi=yZz5+kYRQ-0rN}v?*1JceS zw&km!I@H)>h4216?z%E}cEEY@7rz**(=!knoM-LJ))yj{H*v+&o^-i(tv6J|D6N;i zc~N5nzl+Y>od)I2I(t`TkmCiSma?oXfSIx^cDsa$SB&78Fw1L* zm-3G&ClwE32ZAsCvPLqSPU+^x>d?x~-z9F7{JU&aj8ecnf37csAi{1KcV@)}oz^{{ zG6A%Sa#JKKFtBzgzZpqyP+WhsDsfO<8hPzsLwp+0;67#Yo$#Zqj$Ek!dxQUGDr_Ac zx8*y=O|kNgUg%5rjFsdOka6AYZN+5vf>VlG<~>y4Qv6Md-C;l@X>#Dx%sWB~xpbY9 zSmn5jr01k31>_+-3w-8>aNASJ$gmS`&yhkVlN5>8W!hXBPp{ovZ+^KEG~@9AHDK#B zJ^2k$dTDotCZKL>+xZ1YM4SYEgO7!vMMiukfrX@aeW9C4d?_@A4EAYTi2Sehqj)y^ z)eQTcFMdshO`{Kd#0=b`8md&*;Yb@lp%~y$eKuSXlIvH|5clh(})31?YVCN$e4~gSB>;C6gJ`+9Nv!CWOWB@}a=^VpY z*yw2j%4Kfr`fwi}+mS1sImXWh2M0fc#Hp}EnrDPU_^=-Pepi{z6sgJ+Dk*Z1-|r+| z-UEAu_^-XPH-K_3y=>!zl;?q`sydDzYsie-Qo=?LC+U`z>g(&Pz5N7%_t+l|sD=Lz z3mQU?MYupZev|8$yW@%3*tu0U#KA0)uuJU3X5-V*(zqEYf$tz%Pl|4t4tM@n0^`;< z!KZXfwUEjbD#l>JewXGqVo-czxHNJC-kP>we7NuMW$mur1qawAigy!}Ee-6bVhDKbD5K8}LUiy(add8WUB(HAJI5&# z0V(PrY-KC+o;`b-;uRRw^DMNl;=U9+&g#z$R%Ka!E6=cVU!QM}!Hu2JEiHE0SRS?p zy5J)4j6W(FaHlkM2`^UN>BzXH4D0`G*&#)EUAdLFLb6YGR^R4n2m_5T2$*#2dhOc7 zzNrB0nN1;+6vHepFUxc{GE=Ve+W+cF%oQXwsth&lSldIr7~g$^y8?2_);X@UFwENwbqwt>MvQ9r=1E!_yIeO%-au> z&0pD#opiH{DI%X}`dxT)uP#o8a%&gLfzDK$jJIo?=PsF3PSPnU9HC6}ASC`W()hY| zRw9%exsglHN6%+u*)V8B#)^=gic!KvG6VPn7EnU>ss}p$<->ygiUXd`Vy~zmG#Xl3D zuWknwN`06UxhrT=jD&e-ix@Y7+*mG?^LAXr7Lqv7V=am%1PZ=+GU&g*x96bP{0H}> zd`hfxX6wC@dZK`vd8cK)ww585l1P*cW8R$`jFeuW>al7-PU1So1@b|snMa>7f!wQz z(ECzbFd0Kh@M3QOmPF$@%h zZUlq?(=?N4KijIR>+963uK^I|a_aliM6g56?vm<(+5i-0DyWsDU4M!>FFg6{bAK7R zFozLjlw>)Ty9(0W;n?DCf;oIX*G1Re1f2_`I0$TF2({ul38;x_t;+m`$ByUuSBI`_ z#qp>A01`NRGjo?nVUvE>jEWH)0l9kUEI5o>Ot!0;;HieGmB-L+HX|Txe>SsRsh-a8%uhf1vUwy>vPQp&$nnC zKv*{?A?0^WR5xzF3MCP;j6lFZz%!(VhNIaf&Wm60Xu_Jcfa2ofpd2=QtbX<$rvy@r zhlLLLHk|XoB5Yz#yWT*>qoy3==KBqOFb1QIue}C`hZES?(QL;exEi4TCbgZlw%nc) zB1r^{G%E1N#Ypu0B@{AK)qd$VkmGNju?kJ6<9pTu^Bc%b^KTIhfJfF0)C zZ(!NE2UgJ|QOgoi22qEMQ`&_s#Y1_f?P*QfhDx8bfgA`0AXJ+I6cRyngzZl2)hQfe30)UR2s8IOqEGtX}13uv4%J3g)%c z8u=rU#Ju!I49n$M;)+z7Xl8MEE;o~GP^q@^o3|_s_smT7>1tqAI6<9`G3(5d*_cZZ zmxqez4wT~7m2`%m5x%{?)Qc~cJ9RB}?vuULy{9LRHBL#OtWt#%KO1^n zK}|blM+w^njy5Mam(cC1mL4dCMnd9!!OyH}X|D^d>AL-M+>s!6A|mA%$Kfarpi^yq zb6>r}cI6neLfLxK>3iE>IaMlmw&~L8urlC1KPen<3ZUZNHe_Xi68a2k*!G2}$CMd| zG5C&s%FH{Ppcu*IBVHs@QZeEDrUsspcR=GQ^<0FEHXTbWEpDNfrd1HbOgXWq@#a-) zIzfv_(b*banOic$_eNN_RzdZ=2+k^nrwE^|e0OQ;8xduC{gpAL6X=Qgk)}AG2ExGW zwdHl&kvBjYDH_Nal*HzP5V4`BSj)QV7?NiqC@9Bd_w}w(71p5}CybRYq-wmqtT(bK zYfJw50Vy>jLqZO7faM;?{UNLzCy6dYgvi+Y!*YAR7>M&?LwQ66v*7d#Kp-R?7qOaI1n_VxqBzOpdckCVKzWzw9{j1a6)D+vNefV1JZTlO!G$NK;!Qu^r&PCL!Rn=b#Y=$cd@B zuf=JRN7QuoUvtkw*oIV@4wmg@sjLJmJ;sI?;cS-|x^W6P@4Ds&@uXtNOa=2Diw+Qz zrxUO4-I>?N$Wwy_=}sxn#s>=V=Qs}tY@gQbVJX~MTbj21nfWPRKN-H8)!AXZA5ji} z`_|qe5z3Zo1))K}f%6J9?2l$k{hJ$kBl=eBl+mS+1rO5_$eqZgUo~R|y{_@~uJsO- zAKSnJ&jagw<)-g|%dn};-5tP$l5!UR7O(g-=OIXce|&Rabtxc9Ef$WaJtJolW~|tN zor#2i5z5pZF7IcyFMQ*If7WhtGN$-ES+=RemXiL#73hN>;50ZlQma~jel=yeYY7(B zwg2v3<`mw2k+MbLNV-sDqMRzb%_6x#Kv}}qux~FVl6<`3vj(t4(DC=ehNGP?tjalx zW((7}?>a37dCZHadm94(i+*m34i>5$faFp~yc0q)4o`96!9S#q(4FJ$>4K|TB~Eq- z*SX9s_Xa80&4m_3bO6*ATL*391C&PqvW)w!Ti=?h0;?O|lBV5l=3E=jKLd2pqrQgN zG1^8_jF#LeI~FCMM>FiOjhQTUAzC%1X^Sk6>u#P{?6uczJcwjKPjaRcfQ17?Lx(q> zE?;3qR}kw9JiQJ!%vclhyW7iThZFQ78LkOqeQVMxOfs5XfBuyn9X}r}fn+mbS#Jto36Fw|6E+E)suQ3`3747x{T+ z87k}_;7j9?bw(&)hF9VZ~$WW~V1j3*s+O6&AQLz=<3rCI?to|xO z7|u&S8w-o=2)wIbT@PI#pckI=btDSN5kHLDT3#d>$asNYCJS;4!aNbm$Zy|C9s`qq z@4`*m?e#jP29uANdU(<6Z<5pYiA*9!GiH`}!B%Q)u~l5#97OwAT(`~O*8Uk~MXIK} zA!!YRn&;o%EFpqNvMW>^|E`=XuPKS$@pMJ7!uSYCr(EN%gP zCC(8HN4R8B(?#HcZn+oQI?ji&1VS8{&6z>9@e3nt;QQo;Ra4Lm>z}0z8)Aa`q zuuoV;cvzTmZXE7w*S0_CLQk$IO>aN=M!d-xl2y~0(G|^YG1f%nz#mv%*n#^lP*Whn zNR4c@ZQ~>!NdyQanjddpysW}el=qigvU?|YcORJW&KU`K1Cg_5E;7foz0Qh-?%of% zihU#%YydwW`2=t8J~?@$V9B%Sy*%XrArq-= zU?G)|93i@%P>#>jqW*P5ANhJd5;AJ?M4{?6lJw->=A=O_41&d94K;O5PY`g2khL`j zTdpYuN8n1;VR4P;j}uYK9#z3&*wIed+XJ`nY)1fPWhixKCi40(JXD4io!E9MH<$!d z)pqo!(i>RH$|ZX`-M2p(xd+OYx(KBSNPS7YZa-aTkbIu5(80R>_a0cHYTnxpN9;cc zo3m$o4&KwkA9Bua=gB{H+rRDMznfq@{$)r1Km52f2_`Ho3@G8l^-mC&M*Ud)ZlLr= zoH*y8Uk350W1vWLmSvwFP zS$D6;2oT#(Iu6VtTNZm#%0#uyn4dib*W5PO?He}@c3JaH_#Dm9wqHH~8iM2q8ammw z$K@ETRGI{$?Qvnl0*FG{3hdZg&=n;%ke**0<3IA%3jhPfom`LY5?vpr?^GSw&k%eg zhex5=&?9D4+aSpa+am%T-7j@zY63UNJZo1B7`ET6fpDNx2#hUHLLMKSl7=gjo($fG zYn0DWQW>`ggdOhur%QSu9i8CWiSH1w8BGsU%XgI1GW?@$4OCvnhjEAN=P$;2%&gv`xC6rlnqZcj5$8{-;U;K@GqUwjMr-;6-48i(S(->O$WRVC&G(*Cx9rfkWNo7atEf4v)lIPIb^!9 zcp?H??A^&euFlR*z#ts3&f=3QpU|;_toW>_rzbHy4f<37{f9n(@k|c*nG=dCk{Dxn zLHXuGKS{Q(LBAi&hh`la5*j&1N1(I}-go%K^Z2Mg<<<9&7Notyhr3YDR;>-7Ads(z z^!5-b%f5m|ou&7Q+_)nn8UlXhGp2MfD}bEZ_pC5!yN|*HLjspSbm$P0%Jsos3J!={ zT}FRw?$LS?2&)F+g9agwuR3z^*$mZ4eIaKMxC|{ROyl|>kjs%H1)VjHyL9Qc<7};9 zNe_|T4x`gV;ISX`Cn6g&?#O|@9coB9j%b{Kwob}2I}S>W*F8V`Js@k#4-`8$T3?qC z@vdmH)O5(pF%wac!GUm`i1M`Uw%-pUhg|w^P7>NpIQdu&w|sj9ZGDp=^7C z5=+5QxT$FJ%g5VjWl94v_3}74@TSq z848h%I5l%qKt5!9!_JDA{#XG$CtvSjkK>Up9RS9|lD^-PN4oRU5xd%pR;7>I83-;s zH{PxUAjOd2Bg`us*mEoWm`;L}Ox``NlWDAht1ko zys=nCH3C$BIP}L`&j?WFJlvP^ z0xu5d(@h|CLqNuOUN!h{ zhzi`%=^ewwC5Y$b!qm?n)IEfW7(D@Lzdd9)AK7%9d;Zn`Gs_g<$0Ty`<$2d9zn~IQ zsQ>)=DQg@!dxj>5>R;k?I*Y)diV#iLQ`8!ZL-N3wcTn>IGv%g|8sg*V1C#<~-Bz!r zhZJ(@H51r;+nqqgfG8cfE^mXgBd~`*7VN;SeZ^>5 zhGKLwc#aY8ufyF}&~3uN^m_>M+FV)qpSjzTIvWPJQCbTKGHEphZ{cOEVjTxr!!ahKw(e|%{IE^M?j zJ3){2PahoS-aFVrh>^v>7b@U>-sJ2$;Y%Pm46CnSNA%%}qgd3zr~kcQo>hYidt0bg zZHt?E6^orl4aE6*`gdj=*x+I zj5%@b%9WdLWsW6?zQ7B)$pnD+a;E z;~ysgo%Zs}Ge5+P%U}DS?-KQ%GZ6wMDh@)|mN_Xl7TZNk=_=f^t*l3Zf8hBA#4dRG zg{V3Wx0YH<;#SL%2V%c_`0ycT=hRO=m|{Rtxde!j1jzah6)8s|Wkuw?2+q9vs+Ww9A#@Dh% zI(aIHUFsqr8Nj&KZUdo!^cPg!LzA}Swnop1{v zry`=WqoZ>yETp|g#u&Y(zke!HH@~V4LVGNu^Uur|WWi%?sSzWh)TcesqduCyN>?rF zoh0TYz5+LR8k(bKDmK7S7Brq#q*y1msMS8+pKa(*cPqN=Qn4Da5bT?4!{W93ZHv{I z9loLw6A@kfuaAi9v>N0>X|Hz$B_oL;Ud&E%%QDcZuEP{A-KS!5j1>>IRNs-_CG$0 z2adwOy#D%ClX-FJrcE)L?A<;H3m4{Ah+>H!Fb6m&Dmh`H({s2udh5S+3_JgA-hT42pW>i3mY$HN+;}q5H5yG3iU|k@%%RF zv&H;i-y!%`K@JMhUF#R*oK(m;8k}uAEc}&=)>o3-+{cm<3bP)8IYCM6BBW_CJeDXSuKMpU~yKk_z>o}*LoItvYW`joqt2q-Qk0LVE z$~CbOPGPhF?cV~wX>#sxjf zx%ypZeW5{52fC>-Ac^`^CGa_yl$N_bJb(JM5S7ce z&}6xidSqQYwJdM`ey%K|m2~6AN9S7T-@Nv#aGYDc#OdwY(s%!%#i)(VhI;)3JsSe+ z6FBGE3wp0t|CyZBUO&3Lwme%qSq%Q*tI)4_6oR0Dm$`GTaOb#ySz4zYJWsab1WSuM z2fm^)%jts%7@23Q-$IT-BrIr76%e=VQJZsJqohJ)i%k0?L5%HK=~X}@;5CT#yp%f?)6 z>FfQo!~t?Ydhy8t4G$EcAKiWD;bH5PL4s#K-JoT(z&KfwVPwNZED8~z;5ne9jvNjT(=Ar zPvhF=VxM!p=vPZ&0S=agncVi2XTB4Yy$$tkP-9g?33~!?yny)lyu`B!{&9U|aliwF z+nKClHo?yB*VdX)3R)Yll7bzy!#>(_^a=J`U8l?ajF_%IjvAmi3y!S6Z%bA^Jv&%g zD|5OAnwUN#%}Eg4iTyNvHYA&M*H%7U#?ADQV^&%;UWONyoYKs#5p8XcV9g^?FkVeO zk^tRvLp@0ETndE@?yK|M$PvUcinJ%UwC9>@+E6=!Gg`epeSW0YJyG=%?q;3%rVBL| z8j|Sj*H^Bq5MGVIwB}27;g?!W)drQa(WK`;7Qb%PtIgs z*_>`ux$RSB8}p|dCrN@1V7hX<`c`-)UWS-b`X9qTSU4N$I%04E_u1^eYkqF?nPpHK zKf1gK5>2|8%~|@QmY=b%veq;|*4J|x@KrS^$UjoD>v+7P&Cfu)!Sd7x3cbR3$&<9= z>Al4UQuE{299{oOC^`C(7A9`I3;K9l-rTqZ^pWZuZ~T(LK#9SJ&U{B?;Aa=p7M#ZJ z6PI{d&xVs3PPXxn+xCr=b!%l?X|r+ac%!If2~AAeS*D^B;=1Cxiydv$i|(2?)~YkM zGAmb%4psV^ivp<`Q+A-&;i8U;>=5} zuiq~E z7=9bkZe}Dqcgu^sy?OTa5>+k#uQ@tSiT1j%5 z)LiuQz3=v)F3vcP&$p@_+X&6E9}l+^#?AGcr>Q5{obcXML_KSs%n=uR z#)C-M(R#O)B@Hm&nGb!ozaDH1v>mx)aY{IE&{weU%Vm9~9Bj{+&bgFGV)<56{gi){8K` zXfL!go#jm#gt%p*t@y({trHU9W?yUc*b3!Uugvj!UBUED%LOC{4f{fLvenr$-A{_K z%6YSZf5ISG_kdhmIg?nLQj(Qy~;pIg?kzZ%N)!e;mQxZ+m%V&~Tw$Z4& z)>WHM{km7jHY;)iHQt=yZ`Z2vNq1w0w)sA##vEtH0{(#~vpPo*OHL)u}hiq;r)dWs|u--Rf!ev7moTEWK&; z%J+`EJ}R@s^ED~PzIPo>)2lsrz@wtt?Ti*N3DxcRv~l-;K1B7Gy;EzdEyQYL(`%?VX?7M}>3KAd)U6hOyAfrvJyz=*P?#8uyzJ|_SGD)-N=RzNzkDIn`WKfxqu^d;p{Bg0>hdCgShMsbcHjn}5+{7}d z>%RUr%#2CHwkf9XUC~*8$?+CadtqDom)sv`+E@~7u#4*T3{mI)(U@B!Ejd`1s{ffCOs zi>&#jo?mFr&b#!Kl2Z3?GkG4a(_v{dnp8JRd{uf=iqLx@1P;n^f3ni@Xe+V)Dz=@a z_Zup1dtu_LkuGH(qkT~%-EQeQLwic8natuP-N(vZ83jguTs_kx^%P7xY6*%=yzS}w zOBp2wdYmlv{0zRn%=V&X_EKV-E2~QGUefe|wD8-iK3~(es!Cr|fi6=vIq2>jFj8=( z4%leiFaNS|T$68ZG?ZM>+QzD|;E|zbGzY8Ghr{%e@$(}LnYL=rCSsIAph7Zr8y%-U zTk^hP`E1wzfd#61igLNtDNt6!Ie1rA4uZteZ5ouowJmHd0B{Hg;-H z+mcK6ftS8;WJy(!hD>NB=<+9$q5>m|XA4b68I2qlg%7Gqh2`Q>(lK1-WdasGMrjfH~nPoWh0jIVEb`;?%K*!({l&W zgSCSFe8cg6XWL&I(;uHNY-WC}HXQvh+Z~F@nubbf`1&IHqitm#rWAMZ$)7PNH+-%1 zia)?OJtX&j-$-&bh-S>K$9~xAz|!opi4#j%iPi9O^rTr2yC!<70^p30JyN?8%YSsv zwmTla@Q(;n1a-hQ$8J*rjR*$M-OG)joUxY@tGmp9Z}8U|5y z9vGx2&rgM{L`TIvY4oEVoHP{?K^rwUQW-H0z8)c4n~`E5m@Rd5abZ2B+e#%t9<^r=Y>?u}%5 zT_!i@m9f##!eQBE6OSXc(QCANOK)a-{Aq;EMak88Tx`?L*NU=Cc0r@)mOgAA4O3RM zlCWLBoy8*^RRNzD&cX*(bPJMj3ef1I(MWmH^>(~@DvrHbNW5$R;p#IY38vT6b+u)6 zeN$`<<}OGRnop~KxFDSS2Yarhxku@zi8IW5Uavn~lGMD6Iu`2Sggx3h{x-Qi)RSC$ zuB$bnF>_Aw+}o)04o$>YoIa#V?U|=L!UJ)_yt*qKZ=tI<(YIN?gYyjoc^YS~u}BL~#iVZ9lR{-EG{;=Xc2Z7hhDKk6e0zOf^|cU%UMepqrURNgNS*+za7LlZ0~4S{ z0J|d)F)wd!tjF0;_Q{9{8rCs7PQ52a&X_BmoC3GpAXMI=z$ASU8jjS<-GoyOKfYb} z9;&Q2)@$r>K#n!iah`a4^g|#z7G7h^U%WK^y>`f?J&g-FRt_q0Ve^ew?i8wNgSmQd z&UgmDw(^cHjJa_QcpN@I{!`L6%#|93qHRG4M|Tm{n56}%a~uTp*o~!6;uqn(j5Y8F z1_Jk1XU6dqJqV4jLBMEL4Se(w6B;tISc?>3to5~rZeSPi5N_%6V;A=Z0286<2d%J3 zXRbB{=2+f@t?2ZIGavbMOVmDeY^+tvts~*HXWE3nXT~2u829ZnRdx69;Q?I80`<&J zM$Z?3@DFi&1AtLY6a6{MS0lo4!TSY!s*~1{V{Q;~`HeDYL{k=HzSTS<2DLsQaBFudf z>anZNK|K;2dEFL83Ie#kQ(%ELyV{5}i6gD9*}6^^z2M+QL_Fl6PsAMp_70qH!K1#6QQv+k3Nd}Z?_erD)XPzlR0O>o3hLT(l{Ro%kuqQz zo7tpK=|7+V*$LNt+u{Jc?6tc z1qU7uv0ulz!Py2@vpA>kX&;*BJZFKP5EQJ63qDzpYSg8KyA2%RX)r>Z`S5;@U9~pH z3~o}MYjqqiZQbBxd;Sxgzj_&04-KESo0H&#Cq3wNtrsd;qWRbEjt7l zDawPIU%l#Xb((WIkaw=21Ul;~C!y<_=avR2Lrk8D@72=1kW*L?_K@1med!x9bOQ#3 zeUBcN;6qm=xr~Umj1Pmal-F)(Xej)a7rlucCo^^~zx%DJVV!YrJ>r}}y@m54Y?=ts~s#7N>r6p)-&crhzG+s8@H7KeC( zkb@iG#2}dx8>eRpO3&fowceP7;uTxX#qUs)@s%6_*&zrzydINZeVj8w7Tfn^)c2MV zQ0BTdzA2uxWc#AyRMU0hy(C{=9QS?MmovKdq#;IP3|O4Ag57akE4EtW1t2{80N^=9 zcD!)JYGlLoX2X^1JVfWj&idaa_ueb$y0Q+mL&SvVNmXmj#+;XXDN~WA2mX1GQ@e8t zJb5SVNb?>L$gvUkE*w_Xxp-=?WB)w~W}ofLsO4D^b2Rwngcoi9Zeg;qM}qf2rnkHXRnr_I$ zAEYVWvvYXbC+A61V%3z;?=MS4neXgr!-TgYJlM; zV=c4SoXc$yqyHd;WZJ0l=n_8R3MFSl$r2t#WOe4xP9gnda7sv+~dT}G#+wix;t5Hhzt5|qg>b}@JCbiDdp#;?Q=;NCwT+A9!l?#zU>%?~F3 z-pIVw5B-z-VbS!-Wm^rV^P6inh?In!pepLyR@NL*EC)@ox9!ASyCyH79KqwQATlEG z)`H0|epYeLpu-=fT-?sVXkd(H8+-+yjJ12NZM1Q@%E`8_o&|{0`%YQq3X<)wl5HN? zT6mL3H)W)t&-GCGc0;&hX`YS$mJM?9oR;zF`wRC*w2r3g66TRlHfO|sQ}Jg-MtIqB zINI~_ghvze5i*O9&e+Gq@kVLHfl|wpSOHep7wZ#b5 zI(=uMj{x5A0gma7iUz82nMF8MLd^E4QwsFPG>vEl4+xHRos3N%YyHmoE3Jel8by_+ zRb?*Q?Dh@x6jIDFra7%Q&}lk-pq<&ttZP-p<#-_Z(<1Pz`&ca4eGV(t!sHmeYv`jV zi~JU1)RPmrSB9xFVYp-gV$X5yIRjm<5#!SrjX3EZADzcbUn|X-y)vwls+L(^!+L@l zYwPfeoVIzr!RBb>F>w$*QD{LJ0t*vmS^|yt~D1%W3(luuh3iVJ+! zzyhiXZ@&aB6LXBxQ@ajj;}Qzt2Qs*fd9q8wPc?80b_1#8R!*aFp*78h5l7StS)8Pj zZLoU}{Bx5%d_3b=iDUDl0b#FqoOmOql|vf-5^!`zF;&UI)`;6oG}lG(BWFhhYJ&9L;k}}Hfz*Y;lXn3pXpM_+Z%X! z_L4{IGp_y={S{($>4W;+4Scndz%zR*gQx2Kni6~ep9q)kHsHw~R`aS}X%;7c12)5E zJicJg{qlmw+nF6|z-_;M_rAQoFbA|k|Bel4$JLe?V4(7D=Ht9HJGHiYYTJC^l!Vzj zhDEopG%Q}f>T2$*J1o3rQXVDiTJ}Bls22Y6zKj1LSGeAt?25U!&Z`0I%>bUcpBMjL z^3bVy%09cu=Tlp%s<&MCU|w@CCVRo+=?@k8d|Ass&p;4&H1Q>B3oEMV!k zL)Ft3scWe4Km!<$NM|vD%pG+gXySI5hv0*HhI#2J*H#{Ry8(Ei2!p4qpUXO@geCyC Cc;WK^ diff --git a/outputs/suptable1.csv b/outputs/suptable1.csv index 26b30c6..9c60fad 100644 --- a/outputs/suptable1.csv +++ b/outputs/suptable1.csv @@ -1,12 +1,12 @@ unit,beds,prob_delay_current,1_in_n_delay_current,prob_delay_no_complex_neuro,1_in_n_delay_no_complex_neuro -asu,10,0.14,7.0,0.09,11.0 -asu,11,0.09,11.0,0.06,18.0 -asu,12,0.06,16.0,0.03,31.0 -asu,13,0.04,26.0,0.02,55.0 -asu,14,0.02,45.0,0.01,111.0 -asu,15,0.01,79.0,0.0,225.0 -rehab,12,0.11,9.0,0.05,20.0 +asu,10,0.13,8.0,0.08,12.0 +asu,11,0.09,12.0,0.05,20.0 +asu,12,0.06,18.0,0.03,36.0 +asu,13,0.03,30.0,0.01,67.0 +asu,14,0.02,52.0,0.01,131.0 +asu,15,0.01,95.0,0.0,277.0 +rehab,12,0.11,9.0,0.05,19.0 rehab,13,0.08,13.0,0.03,32.0 rehab,14,0.05,20.0,0.02,57.0 -rehab,15,0.03,31.0,0.01,101.0 -rehab,16,0.02,52.0,0.0,212.0 +rehab,15,0.03,32.0,0.01,110.0 +rehab,16,0.02,51.0,0.0,205.0 diff --git a/outputs/table2.csv b/outputs/table2.csv index ce434f7..4eca20a 100644 --- a/outputs/table2.csv +++ b/outputs/table2.csv @@ -1,13 +1,13 @@ unit,beds,prob_delay_current,1_in_n_delay_current,prob_delay_5%,1_in_n_delay_5% -asu,9,0.19,5.0,, -asu,10,0.14,7.0,0.16,6.0 -asu,11,0.09,11.0,0.11,9.0 -asu,12,0.06,16.0,0.08,13.0 -asu,13,0.04,26.0,0.05,20.0 -asu,14,0.02,45.0,0.03,33.0 -rehab,10,0.2,5.0,, +asu,9,0.18,6.0,, +asu,10,0.13,8.0,0.15,7.0 +asu,11,0.09,12.0,0.1,10.0 +asu,12,0.06,18.0,0.07,14.0 +asu,13,0.03,30.0,0.04,23.0 +asu,14,0.02,52.0,0.03,39.0 +rehab,10,0.21,5.0,, rehab,12,0.11,9.0,0.13,8.0 rehab,13,0.08,13.0,0.09,11.0 -rehab,14,0.05,20.0,0.06,15.0 -rehab,15,0.03,31.0,0.04,23.0 -rehab,16,0.02,52.0,0.03,37.0 +rehab,14,0.05,20.0,0.06,16.0 +rehab,15,0.03,32.0,0.04,24.0 +rehab,16,0.02,51.0,0.03,37.0 diff --git a/outputs/table3.csv b/outputs/table3.csv index 56d8aa4..c84d768 100644 --- a/outputs/table3.csv +++ b/outputs/table3.csv @@ -1,10 +1,10 @@ dedicated_acute,dedicated_rehab,pooled,pdelay_acute,pdelay_rehab,1_in_n_delay_acute,1_in_n_delay_rehab -0,0,22,0.069,0.069,15,15 -0,0,26,0.018,0.018,55,55 -14,12,0,0.022,0.111,45,9 -11,11,4,0.051,0.092,20,11 -11,10,5,0.043,0.094,23,11 -10,10,6,0.047,0.07,21,14 -10,9,7,0.044,0.07,23,14 -9,9,8,0.047,0.058,21,17 -9,8,9,0.046,0.058,22,17 +0,0,22,0.063,0.063,16,16 +0,0,26,0.016,0.016,61,61 +14,12,0,0.019,0.11,52,9 +11,11,4,0.044,0.089,23,11 +11,10,5,0.037,0.09,27,11 +10,10,6,0.041,0.066,24,15 +10,9,7,0.039,0.066,26,15 +9,9,8,0.042,0.053,24,19 +9,8,9,0.041,0.053,25,19 diff --git a/simulation/model.py b/simulation/model.py index f0ee284..0ada015 100644 --- a/simulation/model.py +++ b/simulation/model.py @@ -165,7 +165,7 @@ def create_distributions(self, asu_param, rehab_param, distribution_type): # Get a list of the patients in that unit (ignore other attributes) patient_types = [attr for attr in dir(unit_param) if attr in ["stroke", "stroke_esd", "stroke_noesd", - "tia", "neuro", "other"]] + "stroke_mortality", "tia", "neuro", "other"]] # For each patient type... for patient_type in patient_types: @@ -253,13 +253,19 @@ def acute_stroke_unit(self, patient): msg=(f"Patient {patient.patient_id} ({patient.patient_type}) " + f"post-ASU: {patient.post_asu_destination}")) - # If it is a stroke patient,find out if they are going to the ESD - # (stroke_esd) or not (stroke_noesd) - else, just same as patient_type + # If it is a stroke patient, find out if they are going to the ESD + # (stroke_esd) or not (stroke_noesd) or if they pass away + # (stroke_mortality). For other patients, just same as patient_type. if patient.patient_type == "stroke": if patient.post_asu_destination == "esd": routing_type = "stroke_esd" - else: + elif patient.post_asu_destination == "rehab": routing_type = "stroke_noesd" + elif patient.post_asu_destination == "other": + routing_type = "stroke_mortality" + else: + raise ValueError("Stroke post-asu destination '" + + f"{patient.post_asu_destination}' invalid") else: routing_type = patient.patient_type diff --git a/simulation/parameters.py b/simulation/parameters.py index 5b37d3c..ae19611 100644 --- a/simulation/parameters.py +++ b/simulation/parameters.py @@ -137,6 +137,7 @@ def __init__( self, stroke_no_esd_mean=7.4, stroke_no_esd_sd=8.61, stroke_esd_mean=4.6, stroke_esd_sd=4.8, + stroke_mortality_mean=7.0, stroke_mortality_sd=8.7, tia_mean=1.8, tia_sd=2.3, neuro_mean=4.0, neuro_sd=5.0, other_mean=3.8, other_sd=5.2 @@ -153,6 +154,10 @@ def __init__( Mean LOS for stroke patients with ESD. stroke_esd_sd: float SD of LOS for stroke patients with ESD. + stroke_mortality_mean: float + Mean LOS for stroke patients who pass away. + stroke_mortality_sd: float + SD of LOS for stroke patients who pass away. tia_mean: float Mean LOS for TIA patients. tia_sd: float @@ -174,6 +179,10 @@ def __init__( "mean": stroke_esd_mean, "sd": stroke_esd_sd } + self.stroke_mortality = { + "mean": stroke_mortality_mean, + "sd": stroke_mortality_sd + } self.tia = { "mean": tia_mean, "sd": tia_sd From d4868cd4104a464079eb0744ccd9d1b73972d74d Mon Sep 17 00:00:00 2001 From: amyheather Date: Wed, 21 May 2025 10:32:44 +0100 Subject: [PATCH 21/24] chore(readme): minor badge updates --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 16d3201..b0c05c8 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,10 @@ # Stroke capacity planning model: python DES RAP [![python](https://img.shields.io/badge/-Python_3.13.1-blue?logo=python&logoColor=white)](https://www.python.org/) -![licence](https://img.shields.io/badge/Licence-MIT-green.svg?labelColor=gray) +![licence](https://img.shields.io/badge/🛡️_Licence-MIT-green.svg?labelColor=gray) [![Tests](https://github.com/pythonhealthdatascience/stroke_rap_python/actions/workflows/tests.yaml/badge.svg)](https://github.com/pythonhealthdatascience/stroke_rap_python/actions/workflows/tests.yaml) [![Linting](https://github.com/pythonhealthdatascience/stroke_rap_python/actions/workflows/lint.yaml/badge.svg)](https://github.com/pythonhealthdatascience/stroke_rap_python/actions/workflows/lint.yaml) -[![ORCID: Heather](https://img.shields.io/badge/ORCID_Amy_Heather-0000--0002--6596--3479-brightgreen)](https://orcid.org/0000-0002-6596-3479) +[![ORCID](https://img.shields.io/badge/ORCID_Amy_Heather-0000--0002--6596--3479-A6CE39?&logo=orcid&logoColor=white)](https://orcid.org/0000-0002-6596-3479) @@ -89,8 +89,6 @@ The original study used Simul8. Each of the outputs from that article have been To generate these, simply execute `notebooks/analysis.ipynb`. - - #### Examples **Figure 1** From c4a41b0dca9563d3e4333ceceaf19374ab03a189 Mon Sep 17 00:00:00 2001 From: amyheather Date: Wed, 21 May 2025 10:33:42 +0100 Subject: [PATCH 22/24] test(backtest): regenerate expected results following changes to the model --- notebooks/generate_exp_results.ipynb | 130 +- tests/exp_results/asu_occupancy.csv | 45 +- tests/exp_results/audit_list.csv | 3554 ++++++++++++------------- tests/exp_results/rehab_occupancy.csv | 34 +- 4 files changed, 1877 insertions(+), 1886 deletions(-) diff --git a/notebooks/generate_exp_results.ipynb b/notebooks/generate_exp_results.ipynb index 78b89f9..035df59 100644 --- a/notebooks/generate_exp_results.ipynb +++ b/notebooks/generate_exp_results.ipynb @@ -89,26 +89,26 @@ " \n", " 1\n", " 1096\n", - " 5\n", - " 11\n", + " 3\n", + " 10\n", " \n", " \n", " 2\n", " 1097\n", - " 5\n", + " 3\n", " 10\n", " \n", " \n", " 3\n", " 1098\n", - " 4\n", - " 10\n", + " 3\n", + " 8\n", " \n", " \n", " 4\n", " 1099\n", " 5\n", - " 10\n", + " 8\n", " \n", " \n", "\n", @@ -117,10 +117,10 @@ "text/plain": [ " time asu_occupancy rehab_occupancy\n", "0 1095 7 12\n", - "1 1096 5 11\n", - "2 1097 5 10\n", - "3 1098 4 10\n", - "4 1099 5 10" + "1 1096 3 10\n", + "2 1097 3 10\n", + "3 1098 3 8\n", + "4 1099 5 8" ] }, "metadata": {}, @@ -185,46 +185,46 @@ " \n", " 0\n", " 1\n", - " 1\n", - " 0.000548\n", - " 0.000548\n", + " 5\n", + " 0.002740\n", + " 0.002740\n", " 1.000000\n", " 1.0\n", " \n", " \n", " 1\n", " 2\n", - " 12\n", - " 0.006575\n", - " 0.007123\n", - " 0.923077\n", + " 19\n", + " 0.010411\n", + " 0.013151\n", + " 0.791667\n", " 1.0\n", " \n", " \n", " 2\n", " 3\n", - " 39\n", - " 0.021370\n", - " 0.028493\n", - " 0.750000\n", - " 1.0\n", + " 41\n", + " 0.022466\n", + " 0.035616\n", + " 0.630769\n", + " 2.0\n", " \n", " \n", " 3\n", " 4\n", - " 76\n", - " 0.041644\n", - " 0.070137\n", - " 0.593750\n", + " 94\n", + " 0.051507\n", + " 0.087123\n", + " 0.591195\n", " 2.0\n", " \n", " \n", " 4\n", " 5\n", - " 134\n", - " 0.073425\n", - " 0.143562\n", - " 0.511450\n", + " 158\n", + " 0.086575\n", + " 0.173699\n", + " 0.498423\n", " 2.0\n", " \n", " \n", @@ -233,11 +233,11 @@ ], "text/plain": [ " beds freq pct c_pct prob_delay 1_in_n_delay\n", - "0 1 1 0.000548 0.000548 1.000000 1.0\n", - "1 2 12 0.006575 0.007123 0.923077 1.0\n", - "2 3 39 0.021370 0.028493 0.750000 1.0\n", - "3 4 76 0.041644 0.070137 0.593750 2.0\n", - "4 5 134 0.073425 0.143562 0.511450 2.0" + "0 1 5 0.002740 0.002740 1.000000 1.0\n", + "1 2 19 0.010411 0.013151 0.791667 1.0\n", + "2 3 41 0.022466 0.035616 0.630769 2.0\n", + "3 4 94 0.051507 0.087123 0.591195 2.0\n", + "4 5 158 0.086575 0.173699 0.498423 2.0" ] }, "metadata": {}, @@ -275,47 +275,47 @@ " \n", " \n", " 0\n", - " 3\n", - " 9\n", - " 0.004932\n", - " 0.004932\n", + " 0\n", + " 2\n", + " 0.001096\n", + " 0.001096\n", " 1.000000\n", " 1.0\n", " \n", " \n", " 1\n", - " 4\n", - " 25\n", - " 0.013699\n", - " 0.018630\n", - " 0.735294\n", + " 1\n", + " 17\n", + " 0.009315\n", + " 0.010411\n", + " 0.894737\n", " 1.0\n", " \n", " \n", " 2\n", - " 5\n", - " 74\n", - " 0.040548\n", - " 0.059178\n", - " 0.685185\n", - " 1.0\n", + " 2\n", + " 6\n", + " 0.003288\n", + " 0.013699\n", + " 0.240000\n", + " 4.0\n", " \n", " \n", " 3\n", - " 6\n", - " 147\n", - " 0.080548\n", - " 0.139726\n", - " 0.576471\n", + " 3\n", + " 18\n", + " 0.009863\n", + " 0.023562\n", + " 0.418605\n", " 2.0\n", " \n", " \n", " 4\n", - " 7\n", - " 176\n", - " 0.096438\n", - " 0.236164\n", - " 0.408353\n", + " 4\n", + " 30\n", + " 0.016438\n", + " 0.040000\n", + " 0.410959\n", " 2.0\n", " \n", " \n", @@ -324,11 +324,11 @@ ], "text/plain": [ " beds freq pct c_pct prob_delay 1_in_n_delay\n", - "0 3 9 0.004932 0.004932 1.000000 1.0\n", - "1 4 25 0.013699 0.018630 0.735294 1.0\n", - "2 5 74 0.040548 0.059178 0.685185 1.0\n", - "3 6 147 0.080548 0.139726 0.576471 2.0\n", - "4 7 176 0.096438 0.236164 0.408353 2.0" + "0 0 2 0.001096 0.001096 1.000000 1.0\n", + "1 1 17 0.009315 0.010411 0.894737 1.0\n", + "2 2 6 0.003288 0.013699 0.240000 4.0\n", + "3 3 18 0.009863 0.023562 0.418605 2.0\n", + "4 4 30 0.016438 0.040000 0.410959 2.0" ] }, "metadata": {}, diff --git a/tests/exp_results/asu_occupancy.csv b/tests/exp_results/asu_occupancy.csv index 7f544e8..f3386a6 100644 --- a/tests/exp_results/asu_occupancy.csv +++ b/tests/exp_results/asu_occupancy.csv @@ -1,28 +1,19 @@ beds,freq,pct,c_pct,prob_delay,1_in_n_delay -1,1,0.000547945205479452,0.000547945205479452,1.0,1.0 -2,12,0.006575342465753425,0.007123287671232877,0.923076923076923,1.0 -3,39,0.021369863013698632,0.02849315068493151,0.75,1.0 -4,76,0.041643835616438356,0.07013698630136986,0.59375,2.0 -5,134,0.07342465753424658,0.14356164383561643,0.5114503816793894,2.0 -6,215,0.1178082191780822,0.26136986301369863,0.45073375262054505,2.0 -7,226,0.12383561643835617,0.3852054794520548,0.32147937411095306,3.0 -8,266,0.14575342465753424,0.530958904109589,0.27450980392156865,4.0 -9,245,0.13424657534246576,0.6652054794520548,0.20181219110378915,5.0 -10,163,0.08931506849315068,0.7545205479452055,0.11837327523602033,8.0 -11,165,0.09041095890410959,0.8449315068493151,0.10700389105058367,9.0 -12,108,0.05917808219178082,0.9041095890410958,0.06545454545454546,15.0 -13,89,0.04876712328767123,0.952876712328767,0.05117883841288097,20.0 -14,34,0.01863013698630137,0.9715068493150684,0.019176536943034405,52.0 -15,15,0.00821917808219178,0.9797260273972601,0.008389261744966443,119.0 -16,19,0.010410958904109589,0.9901369863013697,0.010514665190924186,95.0 -17,6,0.0032876712328767125,0.9934246575342465,0.003309431880860453,302.0 -18,5,0.0027397260273972603,0.9961643835616437,0.0027502750275027505,364.0 -19,2,0.001095890410958904,0.9972602739726026,0.001098901098901099,910.0 -20,1,0.000547945205479452,0.997808219178082,0.0005491488193300384,1821.0 -21,1,0.000547945205479452,0.9983561643835615,0.0005488474204171241,1822.0 -22,1,0.000547945205479452,0.9989041095890409,0.0005485463521667582,1823.0 -23,0,0.0,0.9989041095890409,0.0,inf -24,1,0.000547945205479452,0.9994520547945203,0.0005482456140350878,1824.0 -25,0,0.0,0.9994520547945203,0.0,inf -26,0,0.0,0.9994520547945203,0.0,inf -27,1,0.000547945205479452,0.9999999999999997,0.0005479452054794522,1825.0 +1,5,0.0027397260273972603,0.0027397260273972603,1.0,1.0 +2,19,0.010410958904109589,0.01315068493150685,0.7916666666666666,1.0 +3,41,0.022465753424657533,0.03561643835616438,0.6307692307692307,2.0 +4,94,0.05150684931506849,0.08712328767123287,0.5911949685534592,2.0 +5,158,0.08657534246575342,0.17369863013698628,0.498422712933754,2.0 +6,235,0.12876712328767123,0.30246575342465754,0.4257246376811594,2.0 +7,256,0.14027397260273972,0.44273972602739725,0.31683168316831684,3.0 +8,251,0.13753424657534247,0.5802739726027397,0.23701605288007555,4.0 +9,249,0.13643835616438357,0.7167123287671233,0.19036697247706422,5.0 +10,183,0.10027397260273972,0.816986301369863,0.12273641851106638,8.0 +11,161,0.08821917808219178,0.9052054794520549,0.09745762711864406,10.0 +12,85,0.04657534246575343,0.9517808219178083,0.0489349453080023,20.0 +13,44,0.02410958904109589,0.9758904109589042,0.024705221785513754,40.0 +14,19,0.010410958904109589,0.9863013698630138,0.010555555555555554,95.0 +15,12,0.006575342465753425,0.9928767123287672,0.006622516556291391,151.0 +16,7,0.0038356164383561643,0.9967123287671233,0.003848268279274326,260.0 +17,1,0.000547945205479452,0.9972602739726028,0.0005494505494505495,1820.0 +18,5,0.0027397260273972603,1.0,0.0027397260273972603,365.0 diff --git a/tests/exp_results/audit_list.csv b/tests/exp_results/audit_list.csv index fcc63cc..8b6d365 100644 --- a/tests/exp_results/audit_list.csv +++ b/tests/exp_results/audit_list.csv @@ -1,1826 +1,1826 @@ time,asu_occupancy,rehab_occupancy 1095,7,12 -1096,5,11 -1097,5,10 -1098,4,10 -1099,5,10 -1100,5,10 -1101,6,10 -1102,8,10 -1103,10,10 -1104,9,10 -1105,10,10 -1106,9,11 -1107,7,11 -1108,9,9 -1109,10,9 -1110,11,9 -1111,8,8 -1112,8,8 -1113,7,8 -1114,7,8 -1115,9,8 -1116,11,6 -1117,8,6 -1118,6,7 -1119,7,7 -1120,8,7 -1121,9,7 -1122,7,8 -1123,11,8 -1124,11,8 -1125,12,7 -1126,11,8 -1127,11,8 -1128,7,8 +1096,3,10 +1097,3,10 +1098,3,8 +1099,5,8 +1100,5,7 +1101,6,7 +1102,8,7 +1103,7,7 +1104,7,6 +1105,9,6 +1106,8,6 +1107,6,6 +1108,8,5 +1109,11,4 +1110,12,4 +1111,7,5 +1112,8,5 +1113,8,5 +1114,7,3 +1115,10,3 +1116,11,3 +1117,9,3 +1118,6,3 +1119,7,3 +1120,8,3 +1121,6,3 +1122,7,3 +1123,10,4 +1124,10,5 +1125,12,5 +1126,11,6 +1127,11,6 +1128,7,7 1129,5,8 1130,7,8 1131,7,9 -1132,7,9 -1133,8,7 -1134,7,8 -1135,8,7 -1136,4,8 -1137,5,8 -1138,3,10 -1139,3,10 -1140,2,9 -1141,2,9 -1142,2,9 -1143,3,8 -1144,3,8 +1132,6,9 +1133,7,8 +1134,9,9 +1135,9,8 +1136,8,7 +1137,8,8 +1138,7,8 +1139,7,8 +1140,5,8 +1141,4,8 +1142,4,8 +1143,4,9 +1144,2,8 1145,4,8 1146,5,8 1147,8,8 -1148,6,10 -1149,4,10 -1150,6,10 -1151,7,11 -1152,5,12 -1153,2,12 -1154,3,11 -1155,5,11 +1148,8,8 +1149,5,10 +1150,7,10 +1151,6,13 +1152,5,13 +1153,3,12 +1154,4,12 +1155,6,12 1156,6,12 -1157,7,13 -1158,5,12 -1159,6,11 -1160,5,11 -1161,5,11 -1162,5,11 -1163,4,10 -1164,6,10 -1165,9,10 -1166,13,9 -1167,11,9 -1168,10,10 +1157,8,12 +1158,8,11 +1159,8,11 +1160,6,11 +1161,5,9 +1162,5,8 +1163,5,8 +1164,7,7 +1165,10,7 +1166,14,7 +1167,10,8 +1168,10,8 1169,10,8 1170,7,8 -1171,8,7 -1172,8,7 -1173,7,6 -1174,7,7 -1175,7,7 -1176,5,8 -1177,6,8 +1171,8,6 +1172,8,6 +1173,7,7 +1174,7,8 +1175,7,8 +1176,6,8 +1177,7,8 1178,6,8 -1179,7,8 -1180,8,9 -1181,11,8 -1182,11,8 -1183,11,7 -1184,11,6 -1185,8,6 -1186,8,6 -1187,9,6 -1188,6,5 -1189,7,6 -1190,5,6 -1191,7,6 -1192,8,6 -1193,7,6 -1194,8,6 -1195,8,7 -1196,9,8 -1197,9,8 -1198,10,8 -1199,12,8 -1200,11,8 -1201,14,8 -1202,14,8 -1203,14,9 +1179,6,7 +1180,7,7 +1181,10,7 +1182,12,6 +1183,11,5 +1184,13,5 +1185,10,5 +1186,11,5 +1187,10,5 +1188,7,5 +1189,7,5 +1190,7,4 +1191,9,4 +1192,10,4 +1193,9,4 +1194,10,4 +1195,11,5 +1196,14,5 +1197,12,8 +1198,13,8 +1199,14,8 +1200,14,8 +1201,18,7 +1202,16,8 +1203,14,8 1204,16,8 -1205,13,7 +1205,14,7 1206,12,8 -1207,14,8 -1208,11,9 -1209,10,9 -1210,11,9 -1211,8,11 +1207,13,9 +1208,11,10 +1209,11,10 +1210,12,9 +1211,8,10 1212,9,10 1213,9,10 1214,9,10 -1215,9,10 -1216,10,11 -1217,9,10 -1218,8,10 -1219,5,11 +1215,10,11 +1216,12,11 +1217,10,10 +1218,8,9 +1219,6,10 1220,8,10 -1221,8,9 -1222,7,9 -1223,6,9 -1224,6,10 -1225,8,10 -1226,6,9 -1227,8,9 -1228,6,7 -1229,8,6 -1230,6,6 -1231,5,6 -1232,7,6 -1233,6,5 -1234,9,5 -1235,8,6 -1236,9,7 -1237,8,6 -1238,10,6 -1239,9,5 -1240,8,5 -1241,12,5 -1242,12,6 -1243,9,7 -1244,11,7 -1245,9,7 -1246,8,7 -1247,7,6 -1248,8,5 -1249,8,5 -1250,8,5 -1251,7,6 -1252,7,6 -1253,7,6 -1254,7,6 -1255,4,7 -1256,3,7 -1257,4,8 -1258,5,9 -1259,6,8 -1260,8,8 -1261,8,8 -1262,9,8 -1263,9,8 -1264,7,8 -1265,8,8 -1266,9,8 -1267,9,9 -1268,8,10 -1269,12,10 -1270,12,10 -1271,12,9 -1272,14,9 -1273,12,10 -1274,12,10 -1275,9,10 -1276,7,10 -1277,7,9 -1278,7,9 -1279,7,7 -1280,7,7 -1281,4,8 -1282,5,8 -1283,6,6 -1284,7,6 -1285,8,7 -1286,7,8 -1287,7,10 -1288,6,9 -1289,6,9 -1290,7,8 -1291,9,8 -1292,7,8 -1293,6,8 -1294,8,7 -1295,8,7 -1296,10,7 -1297,8,8 -1298,6,8 -1299,5,8 -1300,6,8 -1301,6,8 -1302,5,9 +1221,9,10 +1222,8,11 +1223,7,12 +1224,8,12 +1225,10,11 +1226,10,9 +1227,11,7 +1228,10,7 +1229,11,7 +1230,9,7 +1231,7,7 +1232,9,8 +1233,8,7 +1234,11,7 +1235,10,8 +1236,11,9 +1237,11,9 +1238,13,9 +1239,13,9 +1240,10,9 +1241,13,9 +1242,13,9 +1243,10,9 +1244,10,9 +1245,8,9 +1246,8,9 +1247,7,9 +1248,7,9 +1249,8,10 +1250,9,10 +1251,9,8 +1252,9,8 +1253,9,8 +1254,10,8 +1255,7,8 +1256,6,7 +1257,6,8 +1258,5,10 +1259,6,10 +1260,8,10 +1261,8,9 +1262,10,9 +1263,8,9 +1264,5,8 +1265,6,7 +1266,6,7 +1267,7,7 +1268,6,8 +1269,10,8 +1270,9,8 +1271,7,7 +1272,10,7 +1273,11,7 +1274,12,7 +1275,9,7 +1276,5,8 +1277,7,8 +1278,6,8 +1279,5,9 +1280,5,9 +1281,5,9 +1282,6,9 +1283,7,9 +1284,9,9 +1285,6,12 +1286,6,12 +1287,6,14 +1288,5,14 +1289,5,14 +1290,6,13 +1291,8,13 +1292,6,14 +1293,5,14 +1294,6,13 +1295,6,13 +1296,8,12 +1297,7,11 +1298,7,11 +1299,5,11 +1300,7,10 +1301,5,9 +1302,5,8 1303,6,8 1304,6,8 -1305,6,8 -1306,8,6 -1307,8,6 -1308,8,7 -1309,9,7 -1310,7,8 -1311,10,8 -1312,7,9 -1313,4,9 -1314,3,8 -1315,6,8 -1316,6,8 -1317,7,8 -1318,6,8 -1319,8,8 -1320,8,8 -1321,9,8 -1322,10,8 -1323,11,8 -1324,9,8 -1325,7,10 -1326,7,9 -1327,7,9 -1328,11,9 -1329,10,8 -1330,9,8 -1331,8,8 -1332,12,9 -1333,11,9 -1334,7,9 -1335,8,9 -1336,8,9 -1337,4,8 -1338,3,8 -1339,5,8 -1340,6,8 -1341,7,8 -1342,9,9 -1343,9,10 +1305,7,8 +1306,9,7 +1307,11,7 +1308,9,7 +1309,12,7 +1310,8,9 +1311,11,9 +1312,5,10 +1313,4,10 +1314,3,11 +1315,7,10 +1316,6,10 +1317,6,10 +1318,4,10 +1319,7,8 +1320,7,8 +1321,6,8 +1322,6,9 +1323,7,9 +1324,7,9 +1325,5,9 +1326,5,8 +1327,5,8 +1328,9,8 +1329,5,9 +1330,7,9 +1331,6,9 +1332,11,10 +1333,9,10 +1334,6,9 +1335,7,9 +1336,6,9 +1337,2,9 +1338,1,10 +1339,2,11 +1340,3,10 +1341,4,9 +1342,7,8 +1343,7,9 1344,8,9 -1345,11,9 +1345,10,9 1346,13,9 1347,12,9 -1348,8,10 -1349,8,9 -1350,6,10 -1351,5,10 -1352,7,10 -1353,6,10 -1354,6,10 -1355,6,10 -1356,7,10 -1357,6,11 -1358,7,11 -1359,7,12 -1360,5,12 -1361,6,10 -1362,6,10 -1363,5,11 -1364,6,11 -1365,9,11 -1366,10,11 -1367,9,12 -1368,7,11 -1369,8,13 -1370,8,13 -1371,7,15 -1372,6,15 -1373,5,15 -1374,5,14 -1375,5,14 -1376,5,13 -1377,4,14 -1378,4,13 -1379,4,12 -1380,7,12 -1381,6,14 -1382,4,14 -1383,2,14 -1384,4,14 -1385,4,14 -1386,2,15 -1387,3,15 -1388,4,15 -1389,6,12 -1390,5,11 -1391,4,10 -1392,4,9 -1393,5,9 -1394,7,9 -1395,5,8 -1396,5,7 -1397,6,7 +1348,6,11 +1349,5,11 +1350,5,11 +1351,5,12 +1352,7,12 +1353,7,12 +1354,6,11 +1355,7,10 +1356,7,9 +1357,5,9 +1358,6,8 +1359,6,9 +1360,4,10 +1361,4,9 +1362,5,9 +1363,4,9 +1364,3,8 +1365,5,8 +1366,5,9 +1367,5,10 +1368,2,10 +1369,4,10 +1370,6,9 +1371,6,9 +1372,5,8 +1373,4,8 +1374,4,7 +1375,4,8 +1376,6,7 +1377,4,8 +1378,5,8 +1379,5,6 +1380,8,6 +1381,8,5 +1382,5,7 +1383,4,7 +1384,4,8 +1385,3,9 +1386,3,9 +1387,4,8 +1388,6,8 +1389,7,8 +1390,6,7 +1391,5,7 +1392,4,7 +1393,5,7 +1394,7,7 +1395,6,7 +1396,4,8 +1397,6,8 1398,5,8 -1399,9,5 -1400,10,6 -1401,9,7 -1402,6,6 -1403,6,7 -1404,8,7 -1405,7,7 -1406,9,7 -1407,9,7 -1408,7,6 -1409,7,6 -1410,7,7 -1411,10,8 -1412,8,8 -1413,8,8 -1414,8,7 -1415,9,7 -1416,6,7 -1417,6,7 -1418,5,5 -1419,6,5 +1399,7,9 +1400,7,10 +1401,6,12 +1402,6,12 +1403,6,12 +1404,8,10 +1405,6,9 +1406,6,9 +1407,7,9 +1408,4,8 +1409,3,7 +1410,5,7 +1411,8,8 +1412,7,7 +1413,6,7 +1414,7,6 +1415,9,6 +1416,8,5 +1417,5,5 +1418,4,5 +1419,5,5 1420,8,6 -1421,8,6 -1422,8,6 -1423,9,7 -1424,9,7 -1425,7,6 -1426,7,7 -1427,8,8 -1428,7,10 -1429,6,10 -1430,7,9 -1431,6,9 -1432,7,9 -1433,6,8 -1434,6,9 -1435,7,10 -1436,7,10 -1437,6,10 -1438,9,10 -1439,10,10 -1440,8,11 -1441,6,11 -1442,7,12 -1443,5,12 -1444,5,13 -1445,8,13 -1446,7,12 -1447,10,12 -1448,11,12 -1449,8,10 -1450,7,9 -1451,10,9 -1452,10,9 -1453,12,10 -1454,11,10 -1455,11,10 -1456,9,10 -1457,11,10 -1458,9,9 -1459,10,9 -1460,8,9 -1461,8,9 -1462,7,10 -1463,7,8 -1464,7,8 -1465,8,7 -1466,7,7 -1467,3,7 -1468,5,7 -1469,6,7 -1470,9,6 -1471,7,6 -1472,5,6 -1473,6,6 -1474,8,6 -1475,6,6 -1476,8,5 -1477,6,5 -1478,6,5 -1479,5,5 -1480,6,5 -1481,6,4 -1482,4,5 -1483,4,5 -1484,5,5 -1485,4,5 -1486,5,5 -1487,6,5 -1488,6,6 -1489,6,6 +1421,7,7 +1422,6,7 +1423,6,8 +1424,8,8 +1425,6,8 +1426,6,8 +1427,7,9 +1428,9,10 +1429,9,9 +1430,9,9 +1431,6,8 +1432,7,8 +1433,7,8 +1434,5,9 +1435,8,10 +1436,8,9 +1437,8,9 +1438,10,9 +1439,10,9 +1440,7,7 +1441,6,7 +1442,9,7 +1443,6,7 +1444,6,8 +1445,7,9 +1446,6,9 +1447,8,9 +1448,8,9 +1449,7,9 +1450,7,8 +1451,9,9 +1452,9,9 +1453,13,9 +1454,13,9 +1455,13,9 +1456,11,10 +1457,12,10 +1458,12,9 +1459,8,9 +1460,7,9 +1461,7,9 +1462,7,9 +1463,7,9 +1464,5,9 +1465,7,9 +1466,6,9 +1467,4,8 +1468,5,8 +1469,6,8 +1470,8,9 +1471,7,9 +1472,6,8 +1473,8,8 +1474,9,8 +1475,6,8 +1476,6,8 +1477,4,8 +1478,4,7 +1479,4,7 +1480,3,7 +1481,2,7 +1482,2,7 +1483,2,7 +1484,3,7 +1485,2,7 +1486,4,7 +1487,5,7 +1488,6,7 +1489,6,7 1490,7,6 -1491,7,7 -1492,6,6 -1493,6,7 +1491,6,7 +1492,5,7 +1493,5,8 1494,8,9 -1495,10,9 -1496,8,8 +1495,10,7 +1496,9,7 1497,9,7 -1498,8,7 -1499,6,6 -1500,8,5 -1501,7,5 -1502,8,6 -1503,9,6 -1504,5,7 -1505,7,8 -1506,8,8 -1507,7,8 -1508,8,8 -1509,8,8 -1510,9,8 -1511,11,8 -1512,11,7 -1513,13,7 -1514,13,6 -1515,10,7 -1516,9,7 -1517,9,7 -1518,9,8 -1519,10,9 -1520,10,9 -1521,12,9 -1522,11,9 -1523,12,7 -1524,16,7 -1525,10,7 -1526,10,6 -1527,9,8 -1528,7,8 -1529,5,9 -1530,13,9 -1531,13,9 -1532,11,8 -1533,9,9 -1534,11,9 -1535,10,9 -1536,7,10 -1537,6,10 -1538,4,12 -1539,5,12 -1540,4,11 -1541,3,11 -1542,4,11 -1543,4,10 -1544,4,9 -1545,5,9 -1546,4,9 -1547,4,7 -1548,4,8 -1549,4,8 -1550,6,8 -1551,8,8 -1552,8,8 -1553,7,9 -1554,6,11 -1555,6,11 -1556,4,11 -1557,7,10 -1558,6,11 -1559,6,12 -1560,9,12 -1561,10,14 -1562,11,13 -1563,8,12 -1564,6,12 -1565,8,12 -1566,10,12 -1567,9,13 -1568,9,14 -1569,9,14 -1570,11,13 -1571,9,14 -1572,10,14 -1573,15,13 -1574,12,13 -1575,9,11 -1576,12,11 -1577,10,12 -1578,9,12 -1579,8,10 -1580,6,10 -1581,5,10 -1582,5,10 -1583,5,9 -1584,5,9 -1585,10,9 -1586,9,10 -1587,11,9 -1588,10,8 -1589,11,8 -1590,9,9 -1591,8,9 -1592,10,10 -1593,7,11 -1594,8,12 -1595,9,12 -1596,8,12 -1597,7,12 -1598,7,11 -1599,8,12 -1600,6,13 -1601,6,13 -1602,7,13 -1603,8,12 -1604,7,11 -1605,7,10 -1606,7,11 -1607,8,12 -1608,9,12 -1609,11,11 -1610,12,10 -1611,12,10 -1612,13,10 -1613,11,9 -1614,10,9 -1615,8,10 -1616,9,10 -1617,9,9 -1618,9,9 -1619,8,10 -1620,11,10 -1621,9,11 -1622,5,12 -1623,6,11 -1624,6,10 -1625,6,10 -1626,7,9 -1627,8,9 -1628,7,9 -1629,8,9 -1630,8,9 -1631,8,9 -1632,6,10 -1633,8,10 -1634,5,13 -1635,6,13 -1636,9,13 -1637,12,14 -1638,12,14 -1639,11,15 -1640,10,16 -1641,12,17 -1642,13,17 -1643,11,17 -1644,11,16 -1645,13,16 -1646,12,16 -1647,11,16 -1648,12,17 -1649,11,19 -1650,9,19 -1651,9,18 -1652,11,19 -1653,12,19 -1654,8,19 -1655,9,19 -1656,8,19 -1657,9,19 -1658,11,17 -1659,11,15 -1660,13,14 -1661,13,14 -1662,13,13 -1663,17,13 -1664,17,11 -1665,19,10 -1666,21,8 -1667,20,9 -1668,18,9 -1669,18,9 -1670,15,12 -1671,14,11 -1672,12,11 -1673,11,11 -1674,10,11 -1675,12,11 -1676,10,10 -1677,11,10 -1678,13,10 -1679,16,11 -1680,16,10 -1681,10,11 -1682,11,11 -1683,12,10 -1684,16,10 -1685,16,11 -1686,12,12 -1687,10,13 -1688,8,13 -1689,8,12 -1690,8,11 -1691,9,11 -1692,8,11 -1693,7,13 -1694,7,12 -1695,9,12 -1696,9,12 -1697,9,12 -1698,10,12 -1699,10,11 -1700,7,11 -1701,12,11 -1702,11,10 -1703,12,10 -1704,8,10 -1705,8,10 -1706,8,11 -1707,9,11 -1708,11,11 -1709,9,10 -1710,9,11 -1711,8,10 -1712,10,10 -1713,9,10 +1498,8,6 +1499,9,6 +1500,9,6 +1501,9,6 +1502,10,7 +1503,11,7 +1504,7,7 +1505,8,8 +1506,10,9 +1507,10,9 +1508,11,9 +1509,11,9 +1510,11,9 +1511,11,9 +1512,12,9 +1513,14,8 +1514,13,7 +1515,11,8 +1516,10,8 +1517,10,8 +1518,9,10 +1519,11,9 +1520,10,10 +1521,14,10 +1522,13,10 +1523,13,10 +1524,18,9 +1525,11,8 +1526,11,8 +1527,11,9 +1528,8,9 +1529,6,11 +1530,13,11 +1531,13,11 +1532,12,10 +1533,10,10 +1534,12,10 +1535,11,9 +1536,10,9 +1537,9,9 +1538,8,10 +1539,9,10 +1540,6,10 +1541,6,10 +1542,7,9 +1543,8,9 +1544,7,10 +1545,8,10 +1546,8,9 +1547,8,9 +1548,8,10 +1549,7,10 +1550,7,10 +1551,8,11 +1552,7,11 +1553,6,11 +1554,6,10 +1555,8,10 +1556,6,9 +1557,9,9 +1558,8,10 +1559,7,11 +1560,9,10 +1561,10,10 +1562,9,12 +1563,6,12 +1564,6,11 +1565,8,11 +1566,10,10 +1567,9,11 +1568,9,12 +1569,8,11 +1570,8,9 +1571,5,10 +1572,6,9 +1573,11,8 +1574,7,8 +1575,6,8 +1576,9,7 +1577,9,7 +1578,7,7 +1579,5,7 +1580,4,7 +1581,3,7 +1582,4,7 +1583,4,6 +1584,4,6 +1585,9,6 +1586,8,6 +1587,11,5 +1588,8,5 +1589,9,6 +1590,7,6 +1591,6,6 +1592,9,6 +1593,8,6 +1594,8,7 +1595,8,7 +1596,9,6 +1597,9,6 +1598,7,7 +1599,9,8 +1600,6,9 +1601,6,10 +1602,7,9 +1603,8,9 +1604,7,9 +1605,7,9 +1606,9,8 +1607,10,9 +1608,10,10 +1609,12,7 +1610,11,6 +1611,10,6 +1612,9,6 +1613,9,6 +1614,9,6 +1615,6,7 +1616,7,7 +1617,7,7 +1618,7,7 +1619,7,8 +1620,9,9 +1621,9,8 +1622,5,8 +1623,5,7 +1624,5,7 +1625,5,7 +1626,6,7 +1627,6,6 +1628,5,6 +1629,8,5 +1630,8,5 +1631,8,5 +1632,7,4 +1633,8,4 +1634,5,6 +1635,6,6 +1636,9,6 +1637,11,7 +1638,11,8 +1639,9,9 +1640,6,9 +1641,7,10 +1642,9,10 +1643,9,10 +1644,9,9 +1645,10,8 +1646,8,10 +1647,5,11 +1648,8,10 +1649,8,10 +1650,7,11 +1651,8,11 +1652,10,12 +1653,11,12 +1654,5,13 +1655,4,13 +1656,4,13 +1657,4,14 +1658,6,14 +1659,7,12 +1660,9,11 +1661,8,11 +1662,9,11 +1663,13,10 +1664,11,10 +1665,13,10 +1666,16,10 +1667,16,10 +1668,16,9 +1669,15,10 +1670,15,10 +1671,12,11 +1672,9,11 +1673,10,11 +1674,9,11 +1675,11,11 +1676,8,11 +1677,9,10 +1678,10,9 +1679,13,10 +1680,12,11 +1681,9,12 +1682,8,11 +1683,9,11 +1684,13,11 +1685,14,11 +1686,12,10 +1687,10,11 +1688,8,11 +1689,7,11 +1690,6,11 +1691,8,11 +1692,8,10 +1693,7,11 +1694,6,8 +1695,9,8 +1696,9,8 +1697,6,10 +1698,7,9 +1699,7,8 +1700,6,8 +1701,10,7 +1702,10,8 +1703,10,8 +1704,8,8 +1705,9,7 +1706,10,8 +1707,11,8 +1708,12,9 +1709,10,9 +1710,10,10 +1711,10,10 +1712,12,10 +1713,11,10 1714,10,11 -1715,11,11 -1716,10,11 -1717,9,11 -1718,8,12 +1715,9,12 +1716,9,12 +1717,8,11 +1718,9,11 1719,11,11 -1720,13,10 -1721,10,9 -1722,10,10 -1723,7,13 -1724,6,13 -1725,8,13 -1726,7,13 -1727,7,13 -1728,8,13 -1729,8,13 -1730,6,12 -1731,6,13 -1732,8,13 -1733,9,13 -1734,9,13 -1735,9,13 -1736,10,13 -1737,9,14 -1738,6,15 -1739,6,15 -1740,5,15 -1741,7,16 -1742,6,15 -1743,7,15 -1744,7,13 -1745,8,13 -1746,6,14 -1747,6,14 -1748,5,15 -1749,8,15 -1750,8,14 -1751,9,14 -1752,10,14 -1753,10,14 -1754,6,14 -1755,5,14 -1756,7,16 -1757,7,16 -1758,10,14 -1759,10,14 +1720,12,11 +1721,9,11 +1722,8,12 +1723,4,14 +1724,3,14 +1725,5,14 +1726,4,13 +1727,4,13 +1728,4,12 +1729,5,11 +1730,5,11 +1731,7,9 +1732,9,9 +1733,9,10 +1734,8,9 +1735,7,10 +1736,9,9 +1737,7,10 +1738,6,9 +1739,5,9 +1740,5,9 +1741,6,11 +1742,6,11 +1743,5,12 +1744,5,12 +1745,7,12 +1746,7,12 +1747,8,12 +1748,9,10 +1749,12,9 +1750,12,7 +1751,11,7 +1752,12,8 +1753,11,9 +1754,7,9 +1755,7,9 +1756,9,10 +1757,8,11 +1758,10,12 +1759,11,12 1760,11,13 1761,10,12 -1762,8,13 -1763,9,12 -1764,6,13 -1765,5,13 -1766,8,13 -1767,7,13 -1768,9,12 -1769,9,11 -1770,10,11 -1771,7,12 -1772,8,12 -1773,7,11 -1774,5,11 +1762,8,12 +1763,10,12 +1764,9,13 +1765,7,14 +1766,10,15 +1767,9,14 +1768,11,14 +1769,11,13 +1770,10,13 +1771,8,14 +1772,9,13 +1773,8,11 +1774,6,11 1775,6,10 -1776,5,10 +1776,6,10 1777,6,10 -1778,7,10 -1779,9,10 -1780,9,10 -1781,8,8 -1782,6,8 -1783,5,7 -1784,9,8 -1785,6,9 -1786,10,10 -1787,11,8 -1788,11,9 -1789,9,10 -1790,8,10 -1791,10,10 -1792,7,10 -1793,8,10 -1794,8,11 -1795,7,11 -1796,9,10 -1797,12,10 -1798,12,9 -1799,12,9 -1800,13,8 -1801,15,8 -1802,18,6 -1803,16,7 -1804,15,7 -1805,13,6 -1806,13,6 -1807,13,7 -1808,13,8 -1809,10,8 -1810,10,8 -1811,12,7 -1812,14,7 -1813,12,8 -1814,10,9 -1815,9,10 -1816,8,10 -1817,10,10 -1818,11,11 -1819,8,12 -1820,10,11 -1821,14,10 -1822,16,10 -1823,15,11 -1824,14,11 -1825,13,13 -1826,13,12 -1827,10,13 -1828,8,14 -1829,7,14 -1830,8,14 -1831,9,14 -1832,9,15 -1833,11,14 -1834,9,14 -1835,11,14 -1836,15,11 -1837,12,11 -1838,13,10 -1839,11,10 -1840,12,10 -1841,10,12 -1842,10,12 -1843,6,11 -1844,7,11 -1845,7,12 -1846,9,12 -1847,6,12 -1848,5,11 -1849,4,11 -1850,4,11 -1851,5,11 -1852,6,11 -1853,5,11 -1854,7,11 -1855,6,11 -1856,8,11 -1857,11,11 -1858,12,11 -1859,8,11 -1860,10,11 -1861,11,12 -1862,9,12 -1863,7,11 -1864,7,11 -1865,8,10 -1866,9,9 -1867,9,8 -1868,9,9 -1869,10,10 -1870,13,10 -1871,11,10 -1872,11,10 -1873,13,11 -1874,12,11 -1875,11,12 -1876,14,13 -1877,13,13 -1878,11,13 -1879,11,13 -1880,12,13 -1881,12,11 -1882,11,12 -1883,11,10 -1884,15,12 -1885,11,13 -1886,11,11 -1887,11,11 -1888,12,11 -1889,12,12 -1890,14,12 -1891,13,12 -1892,12,12 -1893,10,13 -1894,6,15 -1895,5,15 -1896,6,15 -1897,6,16 -1898,6,17 -1899,8,16 -1900,8,16 -1901,8,16 -1902,8,17 -1903,9,15 -1904,8,15 -1905,6,13 -1906,7,13 -1907,6,14 -1908,7,13 -1909,7,13 -1910,9,13 -1911,8,14 -1912,8,14 -1913,6,14 -1914,5,14 -1915,6,13 -1916,4,13 -1917,3,12 -1918,4,11 -1919,4,11 -1920,5,11 -1921,5,10 -1922,6,9 -1923,6,8 -1924,2,8 -1925,2,7 -1926,3,7 -1927,4,7 -1928,4,5 -1929,2,5 -1930,2,5 -1931,5,4 -1932,6,5 -1933,6,4 -1934,4,4 -1935,7,4 -1936,6,4 -1937,6,3 -1938,9,3 -1939,9,3 -1940,10,3 -1941,11,3 -1942,13,3 -1943,13,4 -1944,11,4 -1945,12,4 -1946,10,4 -1947,7,5 -1948,8,5 -1949,10,5 -1950,11,5 -1951,12,4 -1952,12,5 -1953,9,5 -1954,12,6 -1955,12,6 -1956,9,7 -1957,8,7 -1958,6,8 -1959,5,8 -1960,4,8 -1961,4,8 -1962,5,9 -1963,4,9 -1964,3,10 -1965,6,11 -1966,5,11 -1967,5,12 -1968,6,12 -1969,6,12 -1970,6,11 -1971,7,8 -1972,8,8 -1973,8,8 -1974,9,8 -1975,10,9 -1976,8,8 -1977,5,9 -1978,5,8 -1979,3,9 -1980,3,9 -1981,3,8 -1982,4,8 -1983,4,8 -1984,3,8 -1985,3,8 -1986,8,8 -1987,9,7 -1988,9,7 -1989,8,7 -1990,10,7 -1991,7,7 -1992,5,7 -1993,6,6 -1994,8,6 -1995,5,6 -1996,6,6 -1997,6,6 -1998,8,6 -1999,6,6 -2000,6,6 -2001,7,6 -2002,6,6 -2003,7,6 -2004,5,6 -2005,6,6 -2006,8,5 -2007,7,6 -2008,7,7 -2009,6,7 -2010,4,7 -2011,5,7 -2012,5,8 -2013,5,8 -2014,4,8 -2015,2,6 -2016,5,6 -2017,5,6 -2018,7,5 -2019,9,5 -2020,7,6 -2021,6,6 -2022,7,7 -2023,6,6 -2024,7,6 -2025,6,6 -2026,7,6 -2027,6,6 -2028,9,6 -2029,10,6 -2030,13,7 -2031,13,7 -2032,14,8 -2033,14,8 -2034,15,7 -2035,13,7 -2036,12,8 -2037,12,8 -2038,13,8 -2039,8,11 -2040,8,11 -2041,8,11 -2042,5,10 -2043,4,10 -2044,3,10 -2045,6,11 -2046,5,11 -2047,7,10 -2048,8,10 -2049,7,10 -2050,8,9 -2051,8,9 -2052,9,8 -2053,9,9 -2054,9,10 -2055,11,10 -2056,11,9 -2057,11,10 -2058,9,11 -2059,9,10 -2060,7,10 -2061,7,10 -2062,6,10 -2063,10,10 -2064,8,11 -2065,8,11 -2066,9,11 -2067,9,11 -2068,10,10 -2069,8,9 -2070,8,9 -2071,11,9 -2072,12,9 -2073,11,9 -2074,9,10 -2075,6,11 -2076,6,11 -2077,6,10 -2078,6,10 -2079,7,10 -2080,6,10 -2081,7,10 -2082,8,9 -2083,8,9 -2084,7,10 -2085,9,9 -2086,6,10 -2087,6,10 -2088,7,9 -2089,7,9 -2090,5,11 -2091,5,10 -2092,4,9 -2093,6,9 -2094,7,9 -2095,11,9 -2096,9,9 -2097,10,10 -2098,9,10 -2099,9,11 -2100,10,11 -2101,7,11 -2102,6,11 -2103,6,11 -2104,8,11 -2105,10,11 -2106,9,10 -2107,9,11 -2108,7,11 -2109,5,11 -2110,8,11 -2111,7,11 -2112,8,12 -2113,7,10 -2114,8,10 -2115,8,10 -2116,7,10 -2117,8,10 -2118,10,10 -2119,11,9 -2120,9,9 -2121,10,9 -2122,12,9 -2123,13,10 -2124,10,10 -2125,11,10 -2126,9,10 -2127,6,9 -2128,6,9 -2129,7,9 -2130,7,9 -2131,9,8 -2132,8,8 -2133,9,8 -2134,9,8 -2135,10,9 -2136,10,10 -2137,12,10 -2138,9,10 -2139,7,10 -2140,8,10 -2141,7,10 -2142,7,10 -2143,7,10 -2144,8,10 -2145,8,10 -2146,8,10 -2147,7,9 -2148,8,10 -2149,5,12 -2150,3,12 -2151,4,12 -2152,6,11 -2153,6,11 -2154,7,11 -2155,6,11 -2156,5,10 -2157,6,9 -2158,5,9 -2159,8,9 -2160,7,9 -2161,9,9 -2162,5,11 -2163,4,11 -2164,4,10 -2165,3,10 -2166,4,9 -2167,5,10 -2168,5,10 -2169,5,10 -2170,4,11 -2171,6,11 -2172,6,11 -2173,4,11 -2174,5,11 -2175,6,10 -2176,6,10 -2177,6,9 -2178,3,9 -2179,5,9 -2180,4,10 -2181,4,11 -2182,5,11 -2183,6,11 -2184,7,11 -2185,6,10 -2186,5,10 -2187,7,9 -2188,7,8 -2189,8,8 -2190,10,8 -2191,6,7 -2192,6,6 -2193,6,6 -2194,5,6 -2195,6,7 -2196,10,6 -2197,12,6 -2198,9,6 -2199,8,5 -2200,11,3 -2201,9,3 -2202,13,3 -2203,10,4 -2204,11,4 -2205,10,5 -2206,9,5 -2207,11,5 -2208,9,5 -2209,9,6 -2210,7,7 -2211,10,7 -2212,8,9 -2213,8,9 -2214,10,11 -2215,7,12 -2216,9,10 -2217,8,10 -2218,8,10 -2219,10,10 +1778,8,10 +1779,11,9 +1780,12,9 +1781,11,8 +1782,9,8 +1783,8,7 +1784,13,6 +1785,13,7 +1786,12,10 +1787,11,10 +1788,11,11 +1789,10,11 +1790,8,11 +1791,10,11 +1792,8,12 +1793,9,12 +1794,10,11 +1795,8,11 +1796,8,11 +1797,9,10 +1798,9,10 +1799,9,10 +1800,10,10 +1801,10,10 +1802,11,11 +1803,12,10 +1804,11,10 +1805,11,10 +1806,11,9 +1807,9,10 +1808,10,10 +1809,9,10 +1810,8,10 +1811,8,12 +1812,9,13 +1813,9,14 +1814,8,13 +1815,8,13 +1816,7,11 +1817,8,12 +1818,9,13 +1819,5,14 +1820,6,14 +1821,11,12 +1822,11,12 +1823,13,11 +1824,11,11 +1825,11,11 +1826,12,12 +1827,8,12 +1828,8,12 +1829,6,11 +1830,5,13 +1831,6,12 +1832,5,12 +1833,9,12 +1834,8,12 +1835,11,12 +1836,14,11 +1837,10,11 +1838,9,11 +1839,9,12 +1840,10,12 +1841,11,12 +1842,11,12 +1843,8,11 +1844,8,10 +1845,7,11 +1846,11,11 +1847,7,12 +1848,7,12 +1849,6,12 +1850,7,12 +1851,8,11 +1852,9,10 +1853,8,10 +1854,9,10 +1855,8,10 +1856,8,10 +1857,11,10 +1858,13,9 +1859,9,9 +1860,9,10 +1861,9,10 +1862,6,10 +1863,4,10 +1864,3,10 +1865,3,9 +1866,5,8 +1867,5,8 +1868,5,9 +1869,7,9 +1870,9,7 +1871,9,7 +1872,8,7 +1873,10,8 +1874,9,8 +1875,7,10 +1876,10,12 +1877,7,12 +1878,6,12 +1879,7,12 +1880,7,11 +1881,7,11 +1882,6,10 +1883,5,10 +1884,10,11 +1885,7,11 +1886,5,12 +1887,4,13 +1888,5,13 +1889,7,14 +1890,7,16 +1891,6,16 +1892,5,16 +1893,3,13 +1894,1,13 +1895,3,12 +1896,4,12 +1897,5,12 +1898,6,11 +1899,7,12 +1900,6,13 +1901,5,13 +1902,5,14 +1903,6,14 +1904,6,13 +1905,5,13 +1906,5,14 +1907,6,13 +1908,8,11 +1909,8,11 +1910,9,10 +1911,8,10 +1912,8,11 +1913,5,11 +1914,4,11 +1915,5,11 +1916,4,11 +1917,2,11 +1918,3,9 +1919,4,9 +1920,6,9 +1921,7,9 +1922,7,9 +1923,6,7 +1924,4,8 +1925,3,8 +1926,5,8 +1927,6,8 +1928,6,7 +1929,3,6 +1930,2,6 +1931,6,6 +1932,7,7 +1933,7,7 +1934,4,7 +1935,7,7 +1936,7,7 +1937,7,6 +1938,8,7 +1939,9,7 +1940,8,7 +1941,10,7 +1942,11,6 +1943,12,7 +1944,12,7 +1945,13,7 +1946,11,8 +1947,8,8 +1948,9,8 +1949,11,8 +1950,11,8 +1951,12,7 +1952,10,7 +1953,8,7 +1954,12,7 +1955,12,8 +1956,9,8 +1957,10,8 +1958,9,9 +1959,7,9 +1960,6,8 +1961,7,7 +1962,8,7 +1963,6,7 +1964,6,6 +1965,9,7 +1966,7,5 +1967,5,8 +1968,5,7 +1969,6,7 +1970,6,7 +1971,7,7 +1972,6,8 +1973,7,7 +1974,7,6 +1975,6,6 +1976,6,5 +1977,4,6 +1978,3,6 +1979,2,6 +1980,2,6 +1981,2,7 +1982,3,7 +1983,3,7 +1984,4,7 +1985,4,7 +1986,9,6 +1987,9,6 +1988,10,6 +1989,9,6 +1990,11,6 +1991,10,6 +1992,8,4 +1993,9,4 +1994,10,4 +1995,8,2 +1996,9,1 +1997,8,1 +1998,11,1 +1999,9,1 +2000,9,1 +2001,10,1 +2002,8,1 +2003,9,1 +2004,7,1 +2005,7,1 +2006,10,1 +2007,8,1 +2008,8,1 +2009,7,1 +2010,6,2 +2011,6,2 +2012,7,2 +2013,7,2 +2014,7,2 +2015,6,1 +2016,9,1 +2017,8,0 +2018,10,0 +2019,11,1 +2020,9,3 +2021,9,3 +2022,10,3 +2023,8,3 +2024,10,3 +2025,8,3 +2026,8,4 +2027,7,4 +2028,8,4 +2029,10,4 +2030,11,6 +2031,13,6 +2032,15,7 +2033,15,8 +2034,13,9 +2035,10,8 +2036,10,9 +2037,11,9 +2038,11,9 +2039,9,10 +2040,8,10 +2041,8,10 +2042,6,10 +2043,5,10 +2044,5,10 +2045,9,8 +2046,7,8 +2047,6,9 +2048,6,9 +2049,7,8 +2050,7,8 +2051,6,9 +2052,8,8 +2053,9,7 +2054,8,8 +2055,10,8 +2056,9,9 +2057,9,9 +2058,8,8 +2059,7,9 +2060,6,9 +2061,6,8 +2062,5,8 +2063,8,8 +2064,6,9 +2065,6,9 +2066,7,7 +2067,7,7 +2068,8,7 +2069,7,7 +2070,7,7 +2071,9,4 +2072,8,4 +2073,8,4 +2074,6,6 +2075,4,7 +2076,5,7 +2077,5,7 +2078,5,7 +2079,6,7 +2080,5,8 +2081,6,8 +2082,7,8 +2083,7,8 +2084,7,7 +2085,9,7 +2086,8,8 +2087,8,7 +2088,9,7 +2089,8,8 +2090,7,9 +2091,6,9 +2092,5,9 +2093,6,8 +2094,7,7 +2095,10,7 +2096,6,7 +2097,8,8 +2098,9,8 +2099,9,8 +2100,7,7 +2101,5,7 +2102,6,7 +2103,6,7 +2104,7,7 +2105,8,7 +2106,6,8 +2107,8,8 +2108,5,7 +2109,4,8 +2110,7,8 +2111,7,8 +2112,8,8 +2113,8,8 +2114,10,8 +2115,8,7 +2116,8,7 +2117,7,7 +2118,9,7 +2119,8,8 +2120,6,9 +2121,6,9 +2122,5,9 +2123,9,9 +2124,7,8 +2125,8,9 +2126,7,9 +2127,5,9 +2128,5,9 +2129,5,8 +2130,6,8 +2131,8,7 +2132,7,7 +2133,5,7 +2134,5,8 +2135,6,8 +2136,5,9 +2137,7,8 +2138,6,9 +2139,4,9 +2140,6,9 +2141,4,10 +2142,6,9 +2143,6,9 +2144,7,9 +2145,6,9 +2146,6,9 +2147,6,8 +2148,6,8 +2149,5,9 +2150,5,9 +2151,4,8 +2152,4,8 +2153,5,8 +2154,6,9 +2155,4,10 +2156,3,11 +2157,4,10 +2158,4,9 +2159,6,9 +2160,6,9 +2161,7,9 +2162,6,9 +2163,5,9 +2164,4,9 +2165,4,9 +2166,6,9 +2167,7,10 +2168,7,11 +2169,8,12 +2170,6,12 +2171,9,13 +2172,8,14 +2173,5,14 +2174,6,13 +2175,7,13 +2176,7,13 +2177,6,12 +2178,5,12 +2179,8,12 +2180,9,13 +2181,6,15 +2182,6,14 +2183,6,14 +2184,6,14 +2185,5,14 +2186,4,14 +2187,7,13 +2188,7,13 +2189,9,13 +2190,10,12 +2191,7,12 +2192,7,10 +2193,6,11 +2194,5,10 +2195,7,10 +2196,11,10 +2197,9,11 +2198,9,10 +2199,7,10 +2200,10,9 +2201,9,9 +2202,11,9 +2203,8,8 +2204,9,7 +2205,8,7 +2206,8,7 +2207,9,7 +2208,7,8 +2209,6,10 +2210,6,9 +2211,9,9 +2212,9,8 +2213,9,9 +2214,11,9 +2215,9,9 +2216,11,8 +2217,10,9 +2218,12,8 +2219,11,10 2220,10,10 -2221,11,10 -2222,10,9 -2223,5,9 -2224,4,9 -2225,3,8 -2226,3,7 -2227,3,8 -2228,1,8 -2229,3,8 -2230,4,8 -2231,5,9 -2232,3,9 -2233,4,10 -2234,5,10 -2235,8,10 -2236,9,11 -2237,11,11 -2238,11,12 -2239,8,12 -2240,8,11 -2241,8,11 -2242,11,11 -2243,9,11 -2244,9,10 -2245,8,11 -2246,8,12 -2247,9,10 -2248,9,8 -2249,9,8 -2250,10,8 -2251,10,9 -2252,8,10 -2253,6,10 -2254,7,10 -2255,5,10 -2256,5,10 -2257,6,10 -2258,5,11 -2259,7,11 -2260,7,11 -2261,7,10 -2262,6,10 -2263,6,10 -2264,6,11 -2265,5,11 -2266,7,11 -2267,7,11 -2268,7,11 -2269,9,11 -2270,10,10 -2271,10,10 -2272,11,10 -2273,12,10 -2274,12,11 +2221,12,8 +2222,10,7 +2223,7,5 +2224,7,5 +2225,6,5 +2226,6,5 +2227,6,6 +2228,6,6 +2229,8,5 +2230,9,5 +2231,10,5 +2232,7,5 +2233,8,6 +2234,10,5 +2235,12,5 +2236,12,7 +2237,12,7 +2238,13,5 +2239,12,5 +2240,11,5 +2241,10,5 +2242,12,5 +2243,10,5 +2244,8,7 +2245,7,8 +2246,7,9 +2247,8,9 +2248,7,9 +2249,4,9 +2250,5,9 +2251,7,11 +2252,7,9 +2253,6,9 +2254,7,9 +2255,4,10 +2256,4,9 +2257,3,9 +2258,4,9 +2259,7,9 +2260,8,7 +2261,9,7 +2262,9,7 +2263,8,7 +2264,9,8 +2265,9,8 +2266,9,9 +2267,9,8 +2268,10,8 +2269,11,8 +2270,10,8 +2271,10,9 +2272,10,10 +2273,11,10 +2274,12,9 2275,12,9 -2276,10,10 -2277,10,10 -2278,10,10 -2279,9,10 -2280,9,10 -2281,13,10 -2282,13,9 -2283,10,10 -2284,11,10 -2285,13,10 -2286,12,11 -2287,10,12 -2288,12,12 -2289,8,11 -2290,9,11 -2291,10,11 -2292,11,11 -2293,11,10 +2276,11,10 +2277,12,9 +2278,13,9 +2279,12,10 +2280,13,10 +2281,17,10 +2282,15,10 +2283,14,10 +2284,15,9 +2285,16,10 +2286,16,10 +2287,14,10 +2288,13,11 +2289,11,11 +2290,10,10 +2291,10,10 +2292,11,9 +2293,10,10 2294,10,9 -2295,10,8 -2296,12,8 -2297,11,8 -2298,9,8 -2299,10,7 -2300,11,7 -2301,8,6 -2302,9,6 -2303,9,6 -2304,10,8 -2305,12,8 -2306,9,9 -2307,10,10 -2308,10,11 +2295,9,9 +2296,10,9 +2297,10,9 +2298,7,10 +2299,7,10 +2300,9,10 +2301,6,9 +2302,7,9 +2303,7,9 +2304,9,10 +2305,10,11 +2306,7,11 +2307,11,11 +2308,12,12 2309,13,11 -2310,11,12 -2311,8,12 -2312,8,13 -2313,10,13 -2314,9,12 -2315,11,10 -2316,11,11 -2317,13,10 -2318,10,12 -2319,9,12 -2320,7,11 -2321,7,11 -2322,7,10 -2323,8,10 -2324,13,9 -2325,13,9 -2326,12,9 -2327,11,9 -2328,13,9 -2329,13,10 -2330,11,9 -2331,12,9 -2332,13,10 -2333,11,11 -2334,11,12 -2335,11,12 -2336,12,12 -2337,12,12 -2338,9,13 -2339,9,12 -2340,9,11 -2341,6,11 -2342,8,11 -2343,6,11 -2344,6,12 -2345,4,12 -2346,3,12 -2347,3,11 -2348,3,12 -2349,4,9 -2350,4,8 -2351,4,9 -2352,6,9 -2353,6,9 -2354,8,9 -2355,10,9 -2356,10,9 -2357,9,9 -2358,10,9 -2359,11,10 -2360,11,11 -2361,10,12 -2362,10,12 -2363,9,11 -2364,8,11 -2365,7,11 -2366,6,11 -2367,9,11 -2368,9,11 -2369,9,11 -2370,7,13 -2371,8,12 -2372,6,12 -2373,4,12 -2374,6,12 -2375,5,9 -2376,6,9 -2377,7,10 +2310,11,10 +2311,8,10 +2312,9,10 +2313,9,11 +2314,7,11 +2315,8,10 +2316,9,11 +2317,10,10 +2318,10,10 +2319,9,10 +2320,7,10 +2321,6,9 +2322,6,8 +2323,5,9 +2324,10,8 +2325,10,8 +2326,10,7 +2327,9,6 +2328,10,6 +2329,12,6 +2330,8,6 +2331,10,6 +2332,12,6 +2333,10,6 +2334,12,6 +2335,11,6 +2336,11,5 +2337,10,5 +2338,10,6 +2339,10,6 +2340,10,7 +2341,8,8 +2342,9,8 +2343,9,7 +2344,11,7 +2345,11,7 +2346,9,8 +2347,8,8 +2348,8,9 +2349,9,7 +2350,7,7 +2351,7,8 +2352,9,8 +2353,9,8 +2354,11,6 +2355,11,7 +2356,12,7 +2357,11,6 +2358,12,7 +2359,14,7 +2360,10,9 +2361,9,9 +2362,8,8 +2363,8,8 +2364,8,8 +2365,9,9 +2366,8,9 +2367,10,9 +2368,9,9 +2369,9,9 +2370,9,9 +2371,10,8 +2372,9,8 +2373,6,9 +2374,8,8 +2375,6,7 +2376,7,7 +2377,8,9 2378,8,10 2379,7,10 -2380,6,10 +2380,6,9 2381,5,9 -2382,5,9 -2383,5,10 -2384,10,9 -2385,10,8 -2386,13,8 -2387,13,8 -2388,13,8 -2389,11,9 -2390,11,9 -2391,9,9 -2392,12,8 -2393,12,8 -2394,14,9 -2395,14,9 -2396,13,9 -2397,16,8 -2398,16,8 -2399,14,8 -2400,13,8 -2401,11,8 -2402,13,8 -2403,12,8 -2404,10,8 -2405,9,8 -2406,9,7 -2407,9,7 -2408,10,7 -2409,11,8 -2410,9,9 -2411,9,9 -2412,9,9 -2413,9,8 -2414,8,8 -2415,9,8 -2416,8,8 -2417,8,8 -2418,7,8 -2419,8,8 -2420,6,9 -2421,6,9 -2422,9,10 -2423,8,9 -2424,8,9 -2425,9,9 -2426,11,9 -2427,7,8 -2428,5,10 -2429,6,10 -2430,8,10 -2431,8,10 -2432,10,10 -2433,13,10 -2434,10,9 -2435,9,8 -2436,9,9 -2437,7,11 -2438,7,11 -2439,6,10 -2440,6,10 -2441,5,10 -2442,5,11 -2443,6,11 -2444,5,10 -2445,7,10 -2446,8,9 -2447,9,10 -2448,11,11 -2449,8,11 -2450,6,12 -2451,5,13 -2452,7,12 -2453,6,13 -2454,6,12 -2455,6,12 -2456,5,10 -2457,7,10 -2458,8,11 -2459,8,10 -2460,7,9 -2461,10,10 -2462,9,12 -2463,8,12 -2464,5,13 -2465,5,11 -2466,8,11 -2467,8,11 -2468,11,10 -2469,11,11 -2470,14,10 -2471,10,11 -2472,10,11 -2473,8,11 -2474,9,11 -2475,9,11 -2476,9,11 -2477,7,10 -2478,6,11 -2479,9,10 -2480,8,12 -2481,7,12 -2482,8,12 -2483,5,13 -2484,7,14 -2485,10,14 -2486,8,10 -2487,11,9 -2488,14,10 -2489,10,10 -2490,8,10 -2491,8,10 -2492,7,9 -2493,10,10 -2494,10,10 -2495,7,11 -2496,8,11 -2497,11,10 -2498,9,9 -2499,8,9 -2500,9,9 -2501,12,9 -2502,12,9 -2503,9,9 -2504,9,9 -2505,9,9 -2506,10,10 -2507,10,10 -2508,8,9 -2509,8,9 -2510,12,9 -2511,12,10 -2512,14,10 -2513,16,10 -2514,13,9 -2515,13,9 -2516,13,9 -2517,11,10 -2518,12,9 -2519,10,9 -2520,11,8 -2521,9,8 -2522,9,8 -2523,10,8 -2524,12,9 -2525,10,7 +2382,6,8 +2383,5,9 +2384,10,8 +2385,9,8 +2386,12,8 +2387,12,9 +2388,11,10 +2389,9,11 +2390,8,10 +2391,8,9 +2392,11,8 +2393,11,7 +2394,14,6 +2395,15,6 +2396,15,6 +2397,18,5 +2398,18,4 +2399,14,4 +2400,12,4 +2401,9,4 +2402,12,4 +2403,11,3 +2404,9,4 +2405,8,4 +2406,9,3 +2407,8,3 +2408,7,4 +2409,8,5 +2410,5,5 +2411,5,5 +2412,6,5 +2413,7,5 +2414,5,6 +2415,6,6 +2416,6,6 +2417,6,6 +2418,5,7 +2419,6,6 +2420,4,6 +2421,5,6 +2422,11,6 +2423,10,5 +2424,10,5 +2425,10,5 +2426,13,5 +2427,10,6 +2428,8,8 +2429,8,8 +2430,8,8 +2431,7,8 +2432,9,8 +2433,9,9 +2434,7,9 +2435,5,10 +2436,5,10 +2437,4,9 +2438,4,9 +2439,3,9 +2440,4,9 +2441,5,9 +2442,5,9 +2443,4,10 +2444,3,10 +2445,5,10 +2446,5,11 +2447,5,12 +2448,7,13 +2449,5,12 +2450,3,12 +2451,1,13 +2452,4,12 +2453,3,13 +2454,4,13 +2455,3,13 +2456,4,12 +2457,6,12 +2458,8,12 +2459,8,12 +2460,6,12 +2461,9,13 +2462,10,14 +2463,10,14 +2464,9,14 +2465,7,15 +2466,10,14 +2467,10,13 +2468,13,13 +2469,12,14 +2470,14,14 +2471,10,14 +2472,11,14 +2473,11,13 +2474,11,12 +2475,12,12 +2476,12,12 +2477,11,11 +2478,9,12 +2479,11,11 +2480,11,11 +2481,11,11 +2482,11,11 +2483,7,13 +2484,9,14 +2485,12,14 +2486,10,13 +2487,11,14 +2488,12,15 +2489,9,14 +2490,5,14 +2491,5,14 +2492,4,15 +2493,7,15 +2494,8,14 +2495,5,15 +2496,6,13 +2497,9,13 +2498,7,12 +2499,4,13 +2500,5,12 +2501,8,12 +2502,11,12 +2503,8,12 +2504,8,12 +2505,8,12 +2506,7,15 +2507,10,14 +2508,9,14 +2509,7,15 +2510,10,15 +2511,11,16 +2512,12,15 +2513,13,15 +2514,9,14 +2515,9,14 +2516,11,14 +2517,10,11 +2518,8,9 +2519,7,9 +2520,9,9 +2521,8,9 +2522,8,9 +2523,8,8 +2524,10,8 +2525,10,8 2526,10,7 -2527,8,7 -2528,7,9 -2529,7,9 -2530,5,10 -2531,6,10 -2532,6,10 -2533,6,10 -2534,6,10 -2535,6,10 -2536,7,10 -2537,6,10 -2538,7,10 -2539,9,10 -2540,8,9 -2541,8,9 -2542,8,9 -2543,9,9 -2544,9,10 -2545,7,11 -2546,8,11 -2547,8,10 +2527,7,7 +2528,6,8 +2529,4,8 +2530,4,8 +2531,6,8 +2532,6,7 +2533,6,6 +2534,6,7 +2535,7,7 +2536,8,7 +2537,7,7 +2538,8,6 +2539,10,6 +2540,7,6 +2541,8,6 +2542,8,6 +2543,9,6 +2544,9,7 +2545,9,8 +2546,9,8 +2547,8,9 2548,10,9 -2549,9,8 -2550,13,7 -2551,13,7 -2552,12,7 -2553,13,8 -2554,12,7 +2549,8,9 +2550,11,8 +2551,10,8 +2552,9,7 +2553,11,7 +2554,9,7 2555,9,7 -2556,10,7 +2556,11,7 2557,11,7 -2558,12,6 -2559,9,6 -2560,10,7 -2561,11,8 -2562,9,8 -2563,11,8 -2564,9,7 -2565,10,7 -2566,7,8 -2567,6,8 -2568,4,9 -2569,4,9 -2570,4,8 -2571,4,7 -2572,5,7 -2573,5,7 -2574,7,7 -2575,7,9 -2576,9,9 -2577,12,9 -2578,12,9 -2579,11,9 -2580,9,9 -2581,10,10 -2582,8,9 -2583,10,9 -2584,8,9 -2585,11,9 -2586,8,9 -2587,8,9 -2588,10,9 -2589,8,11 -2590,8,9 -2591,9,9 -2592,10,9 -2593,9,10 -2594,13,10 -2595,12,11 -2596,14,11 -2597,12,10 -2598,13,9 -2599,11,7 -2600,12,7 -2601,11,7 -2602,11,7 -2603,10,7 -2604,11,6 -2605,11,7 -2606,8,6 -2607,8,6 -2608,13,6 -2609,13,7 -2610,12,7 -2611,11,8 -2612,16,7 -2613,16,7 -2614,14,7 -2615,12,7 -2616,13,6 -2617,13,6 -2618,16,6 -2619,15,5 -2620,13,4 -2621,8,6 -2622,8,8 -2623,8,7 -2624,9,8 -2625,11,8 -2626,8,9 -2627,7,9 -2628,10,9 -2629,9,8 -2630,8,9 -2631,7,9 -2632,7,9 -2633,7,9 +2558,12,5 +2559,8,5 +2560,9,5 +2561,9,6 +2562,6,6 +2563,8,5 +2564,7,5 +2565,7,6 +2566,5,7 +2567,5,7 +2568,4,7 +2569,3,7 +2570,3,8 +2571,3,8 +2572,6,7 +2573,6,7 +2574,8,7 +2575,7,8 +2576,8,8 +2577,9,8 +2578,11,8 +2579,10,8 +2580,8,8 +2581,9,8 +2582,7,8 +2583,8,8 +2584,5,9 +2585,7,9 +2586,6,10 +2587,6,10 +2588,8,9 +2589,8,10 +2590,5,12 +2591,6,11 +2592,6,11 +2593,6,11 +2594,10,11 +2595,11,12 +2596,13,12 +2597,12,12 +2598,12,11 +2599,15,10 +2600,15,10 +2601,15,10 +2602,12,10 +2603,10,10 +2604,11,10 +2605,10,11 +2606,7,11 +2607,7,10 +2608,11,9 +2609,12,9 +2610,10,8 +2611,9,7 +2612,12,8 +2613,11,7 +2614,10,7 +2615,9,7 +2616,11,7 +2617,10,7 +2618,12,8 +2619,12,9 +2620,11,10 +2621,9,11 +2622,9,12 +2623,9,11 +2624,10,11 +2625,11,12 +2626,9,12 +2627,9,11 +2628,11,11 +2629,9,11 +2630,9,10 +2631,5,8 +2632,6,8 +2633,6,8 2634,6,9 -2635,3,8 -2636,6,7 -2637,6,7 -2638,6,7 -2639,6,6 -2640,4,6 -2641,6,7 -2642,5,8 -2643,5,10 -2644,5,10 -2645,8,10 +2635,4,9 +2636,6,9 +2637,6,8 +2638,5,8 +2639,5,9 +2640,4,9 +2641,7,9 +2642,5,10 +2643,7,11 +2644,5,11 +2645,8,11 2646,8,10 2647,10,11 -2648,12,10 -2649,12,10 -2650,13,10 -2651,13,10 -2652,8,11 -2653,7,11 -2654,9,9 -2655,6,8 -2656,4,7 -2657,6,7 -2658,2,7 -2659,3,6 -2660,5,6 -2661,4,5 -2662,6,5 -2663,5,5 -2664,4,5 -2665,4,6 -2666,3,6 -2667,4,6 -2668,5,6 -2669,6,6 -2670,5,8 -2671,6,9 -2672,8,9 -2673,7,9 -2674,5,8 -2675,6,8 -2676,6,8 -2677,5,8 -2678,6,9 -2679,8,8 -2680,7,7 -2681,10,7 -2682,13,7 -2683,14,7 -2684,14,7 -2685,12,7 -2686,13,5 -2687,15,5 -2688,14,5 -2689,13,5 -2690,11,5 -2691,12,5 -2692,11,5 -2693,13,6 -2694,11,5 -2695,10,6 -2696,12,6 -2697,9,6 -2698,9,5 -2699,9,6 -2700,9,6 -2701,12,6 -2702,14,6 -2703,16,5 -2704,18,4 -2705,16,4 -2706,17,4 -2707,17,4 -2708,18,5 -2709,15,5 -2710,15,5 -2711,13,5 -2712,11,6 -2713,12,5 -2714,13,5 -2715,12,5 -2716,11,7 -2717,13,7 -2718,13,7 -2719,11,7 -2720,7,9 -2721,6,9 -2722,6,10 -2723,7,9 -2724,8,9 -2725,11,9 -2726,11,9 -2727,14,9 -2728,14,10 -2729,15,10 -2730,17,9 -2731,16,8 -2732,14,9 -2733,16,9 -2734,19,9 -2735,27,9 -2736,24,9 -2737,22,10 -2738,15,12 -2739,14,11 -2740,13,12 -2741,12,12 -2742,11,11 -2743,11,10 -2744,9,10 -2745,11,9 -2746,11,10 -2747,11,10 -2748,10,10 -2749,11,9 -2750,11,9 -2751,10,8 -2752,11,6 -2753,7,9 -2754,8,9 -2755,11,9 -2756,9,10 -2757,10,10 -2758,9,10 -2759,12,9 -2760,9,9 -2761,7,7 -2762,7,7 -2763,3,8 -2764,3,7 -2765,4,7 -2766,3,7 -2767,3,6 -2768,3,6 -2769,6,6 -2770,8,6 -2771,9,6 -2772,12,6 -2773,11,7 -2774,11,6 -2775,10,6 -2776,9,6 -2777,9,6 -2778,10,6 -2779,11,7 -2780,11,8 -2781,11,9 -2782,12,8 -2783,10,8 -2784,9,8 -2785,8,8 -2786,9,10 -2787,8,10 -2788,7,10 -2789,8,10 +2648,11,12 +2649,11,10 +2650,12,11 +2651,11,11 +2652,7,10 +2653,7,10 +2654,9,10 +2655,7,10 +2656,5,9 +2657,8,9 +2658,6,8 +2659,5,8 +2660,6,7 +2661,3,7 +2662,5,5 +2663,3,5 +2664,3,5 +2665,3,5 +2666,2,5 +2667,2,5 +2668,3,4 +2669,4,4 +2670,4,6 +2671,4,7 +2672,6,8 +2673,5,8 +2674,4,8 +2675,5,8 +2676,5,8 +2677,3,8 +2678,4,9 +2679,5,11 +2680,4,11 +2681,8,11 +2682,11,11 +2683,12,11 +2684,12,12 +2685,10,12 +2686,10,11 +2687,12,11 +2688,10,11 +2689,9,10 +2690,7,10 +2691,7,10 +2692,8,9 +2693,11,10 +2694,11,10 +2695,11,11 +2696,13,11 +2697,11,11 +2698,9,10 +2699,8,9 +2700,8,7 +2701,11,6 +2702,10,7 +2703,10,6 +2704,11,6 +2705,8,6 +2706,8,7 +2707,9,6 +2708,10,7 +2709,7,8 +2710,7,9 +2711,7,9 +2712,5,8 +2713,7,8 +2714,9,8 +2715,9,8 +2716,8,11 +2717,9,11 +2718,10,12 +2719,7,12 +2720,3,14 +2721,1,14 +2722,1,13 +2723,2,13 +2724,4,12 +2725,7,12 +2726,9,12 +2727,11,12 +2728,8,13 +2729,8,13 +2730,8,13 +2731,6,14 +2732,6,15 +2733,8,16 +2734,10,16 +2735,18,16 +2736,15,15 +2737,14,15 +2738,11,16 +2739,10,15 +2740,8,16 +2741,7,15 +2742,7,15 +2743,6,15 +2744,5,15 +2745,8,14 +2746,8,13 +2747,8,14 +2748,7,14 +2749,8,13 +2750,9,13 +2751,8,13 +2752,9,11 +2753,6,12 +2754,8,12 +2755,9,12 +2756,9,12 +2757,9,11 +2758,9,11 +2759,10,12 +2760,8,12 +2761,8,11 +2762,8,10 +2763,4,11 +2764,4,10 +2765,4,10 +2766,2,10 +2767,2,8 +2768,2,8 +2769,5,8 +2770,7,8 +2771,7,9 +2772,11,9 +2773,9,10 +2774,8,10 +2775,6,10 +2776,6,11 +2777,7,10 +2778,8,9 +2779,10,9 +2780,11,9 +2781,10,10 +2782,11,10 +2783,10,10 +2784,9,10 +2785,8,11 +2786,10,10 +2787,9,10 +2788,8,10 +2789,9,10 2790,9,10 -2791,8,10 -2792,7,10 -2793,5,10 -2794,7,10 -2795,7,10 -2796,7,10 -2797,7,12 -2798,7,12 -2799,7,13 -2800,6,12 -2801,8,11 -2802,7,12 -2803,6,9 -2804,11,9 -2805,13,8 -2806,9,9 -2807,7,10 -2808,7,9 -2809,7,9 -2810,8,9 -2811,10,9 -2812,8,9 -2813,9,10 -2814,11,10 -2815,9,9 -2816,6,8 -2817,5,8 -2818,5,9 -2819,6,9 -2820,8,9 -2821,9,7 -2822,9,7 -2823,9,8 -2824,11,8 -2825,9,7 -2826,8,8 -2827,7,7 -2828,8,7 -2829,9,6 -2830,8,7 -2831,8,8 -2832,8,8 -2833,8,8 -2834,9,8 -2835,10,8 -2836,11,9 -2837,11,8 -2838,9,7 -2839,9,9 -2840,8,10 -2841,10,9 -2842,14,7 -2843,14,6 -2844,12,5 -2845,11,6 -2846,10,8 -2847,8,8 -2848,8,9 -2849,11,9 -2850,12,9 -2851,11,7 -2852,13,7 -2853,13,6 -2854,13,6 -2855,14,7 -2856,13,7 -2857,14,7 -2858,12,7 -2859,13,4 -2860,15,4 -2861,13,4 -2862,13,4 -2863,12,4 -2864,9,4 -2865,7,5 -2866,7,5 -2867,6,5 -2868,7,5 -2869,8,4 -2870,5,5 -2871,8,5 -2872,9,5 -2873,10,5 -2874,11,6 -2875,9,7 -2876,11,7 -2877,12,7 -2878,10,7 -2879,11,7 -2880,9,7 -2881,8,6 -2882,7,6 -2883,8,6 -2884,9,6 -2885,9,6 -2886,10,6 -2887,9,6 -2888,9,7 -2889,11,8 -2890,12,9 -2891,13,9 -2892,14,9 -2893,17,9 -2894,16,10 -2895,13,10 -2896,13,11 -2897,11,13 -2898,12,13 -2899,12,14 -2900,10,15 -2901,9,15 -2902,9,15 -2903,7,16 -2904,8,16 -2905,7,14 -2906,9,14 -2907,8,14 -2908,9,12 -2909,12,11 -2910,13,10 -2911,13,10 -2912,11,9 -2913,11,9 -2914,12,9 -2915,8,10 -2916,9,9 -2917,9,9 -2918,10,9 -2919,11,10 +2791,9,10 +2792,8,10 +2793,6,10 +2794,7,11 +2795,7,9 +2796,5,11 +2797,6,11 +2798,6,10 +2799,6,11 +2800,5,11 +2801,7,11 +2802,5,11 +2803,5,11 +2804,10,11 +2805,12,10 +2806,11,11 +2807,8,13 +2808,8,11 +2809,9,10 +2810,10,9 +2811,11,9 +2812,11,9 +2813,11,10 +2814,13,9 +2815,11,9 +2816,8,9 +2817,6,9 +2818,7,9 +2819,8,8 +2820,9,9 +2821,9,9 +2822,10,8 +2823,12,7 +2824,13,7 +2825,12,7 +2826,11,8 +2827,9,9 +2828,11,9 +2829,12,8 +2830,9,9 +2831,7,9 +2832,7,10 +2833,6,10 +2834,6,11 +2835,5,13 +2836,7,13 +2837,8,13 +2838,7,13 +2839,8,14 +2840,8,14 +2841,10,13 +2842,13,13 +2843,10,14 +2844,7,13 +2845,7,14 +2846,7,13 +2847,6,13 +2848,6,13 +2849,9,11 +2850,8,11 +2851,7,11 +2852,10,11 +2853,11,11 +2854,10,11 +2855,11,11 +2856,10,11 +2857,12,11 +2858,12,9 +2859,12,8 +2860,13,8 +2861,10,8 +2862,11,8 +2863,9,8 +2864,7,8 +2865,7,9 +2866,7,9 +2867,6,9 +2868,7,10 +2869,7,10 +2870,6,10 +2871,8,11 +2872,9,11 +2873,9,11 +2874,11,12 +2875,10,12 +2876,13,10 +2877,13,11 +2878,12,11 +2879,12,11 +2880,11,11 +2881,10,12 +2882,11,11 +2883,10,12 +2884,11,11 +2885,11,11 +2886,11,11 +2887,10,11 +2888,9,12 +2889,10,14 +2890,11,14 +2891,11,14 +2892,11,15 +2893,13,13 +2894,12,12 +2895,9,12 +2896,9,13 +2897,9,14 +2898,10,14 +2899,9,13 +2900,9,13 +2901,9,13 +2902,6,13 +2903,4,14 +2904,4,14 +2905,4,14 +2906,6,13 +2907,6,13 +2908,9,13 +2909,12,13 +2910,14,12 +2911,14,12 +2912,12,12 +2913,11,11 +2914,11,11 +2915,10,12 +2916,11,12 +2917,8,11 +2918,9,11 +2919,10,12 diff --git a/tests/exp_results/rehab_occupancy.csv b/tests/exp_results/rehab_occupancy.csv index d20032c..21480fd 100644 --- a/tests/exp_results/rehab_occupancy.csv +++ b/tests/exp_results/rehab_occupancy.csv @@ -1,18 +1,18 @@ beds,freq,pct,c_pct,prob_delay,1_in_n_delay -3,9,0.004931506849315068,0.004931506849315068,1.0,1.0 -4,25,0.0136986301369863,0.01863013698630137,0.7352941176470588,1.0 -5,74,0.040547945205479455,0.05917808219178082,0.6851851851851852,1.0 -6,147,0.08054794520547945,0.13972602739726026,0.5764705882352942,2.0 -7,176,0.09643835616438357,0.23616438356164382,0.4083526682134571,2.0 -8,247,0.13534246575342465,0.3715068493150685,0.36430678466076694,3.0 -9,308,0.16876712328767124,0.5402739726027397,0.31237322515212984,3.0 -10,331,0.18136986301369862,0.7216438356164383,0.2513287775246773,4.0 -11,220,0.12054794520547946,0.8421917808219177,0.14313597918022122,7.0 -12,117,0.06410958904109589,0.9063013698630136,0.07073760580411124,14.0 -13,71,0.03890410958904109,0.9452054794520547,0.04115942028985507,24.0 -14,46,0.025205479452054796,0.9704109589041094,0.02597402597402598,38.0 -15,24,0.01315068493150685,0.9835616438356163,0.01337047353760446,75.0 -16,14,0.007671232876712329,0.9912328767123286,0.007739082365948039,129.0 -17,7,0.0038356164383561643,0.9950684931506848,0.0038546255506607934,259.0 -18,1,0.000547945205479452,0.9956164383561642,0.0005503577325261421,1817.0 -19,8,0.004383561643835616,0.9999999999999998,0.004383561643835617,228.0 +0,2,0.001095890410958904,0.001095890410958904,1.0,1.0 +1,17,0.009315068493150684,0.010410958904109589,0.8947368421052632,1.0 +2,6,0.0032876712328767125,0.0136986301369863,0.24000000000000002,4.0 +3,18,0.009863013698630137,0.023561643835616437,0.4186046511627907,2.0 +4,30,0.01643835616438356,0.039999999999999994,0.4109589041095891,2.0 +5,66,0.03616438356164384,0.07616438356164383,0.47482014388489213,2.0 +6,106,0.05808219178082192,0.13424657534246576,0.4326530612244898,2.0 +7,234,0.12821917808219177,0.2624657534246575,0.488517745302714,2.0 +8,286,0.1567123287671233,0.41917808219178077,0.37385620915032686,3.0 +9,317,0.1736986301369863,0.592876712328767,0.2929759704251387,3.0 +10,239,0.13095890410958905,0.7238356164383561,0.18092354277062833,6.0 +11,194,0.1063013698630137,0.8301369863013699,0.12805280528052804,8.0 +12,132,0.07232876712328767,0.9024657534246576,0.08014571948998178,12.0 +13,82,0.044931506849315066,0.9473972602739726,0.047426257952573735,21.0 +14,66,0.03616438356164384,0.9835616438356165,0.03676880222841226,27.0 +15,21,0.011506849315068493,0.995068493150685,0.011563876651982379,86.0 +16,9,0.004931506849315068,1.0,0.004931506849315068,203.0 From 10b022d687be99f6be757f26163db716ad3c0eb5 Mon Sep 17 00:00:00 2001 From: amyheather Date: Wed, 21 May 2025 10:39:02 +0100 Subject: [PATCH 23/24] fix(test): set high LOS for stroke mortality in test_long_los, and add 1_in_n_delay to expected output in test_get_occupancy_freq (both of these are related to recent changes in the model, which altered the LOS param and output table) --- tests/test_functionaltest.py | 1 + tests/test_unittest.py | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/test_functionaltest.py b/tests/test_functionaltest.py index aa18d1d..344a2bd 100644 --- a/tests/test_functionaltest.py +++ b/tests/test_functionaltest.py @@ -98,6 +98,7 @@ def test_long_los(stroke_no_esd_mean): param = Param( asu_los=ASULOS(stroke_no_esd_mean=stroke_no_esd_mean, stroke_esd_mean=los, + stroke_mortality_mean=los, tia_mean=los, neuro_mean=los, other_mean=los), diff --git a/tests/test_unittest.py b/tests/test_unittest.py index 18d167a..898f658 100644 --- a/tests/test_unittest.py +++ b/tests/test_unittest.py @@ -231,6 +231,7 @@ def test_get_occupancy_freq(): expected_pct = [0.4, 0.3, 0.2, 0.1] expected_c_pct = [0.4, 0.7, 0.9, 1.0] expected_prob_delay = [1.0, 0.3/0.7, 0.2/0.9, 0.1/1.0] + expected_1_in_n_delay = [1, 2, 4, 10] # Create a Runner instance runner = Runner(None) @@ -240,7 +241,7 @@ def test_get_occupancy_freq(): # Check the structure of the DataFrame assert list(result_df.columns) == [ - "beds", "freq", "pct", "c_pct", "prob_delay"] + "beds", "freq", "pct", "c_pct", "prob_delay", "1_in_n_delay"] # Check the values assert list(result_df["beds"]) == expected_beds @@ -248,8 +249,9 @@ def test_get_occupancy_freq(): assert np.allclose(result_df["pct"], expected_pct) assert np.allclose(result_df["c_pct"], expected_c_pct) - # Check prob_delay calculation + # Check prob_delay and 1 in n delay calculations assert np.allclose(result_df["prob_delay"], expected_prob_delay) + assert np.allclose(result_df["1_in_n_delay"], expected_1_in_n_delay) # ----------------------------------------------------------------------------- From dc1c64a5e9536c75b1f5a7afd2a41e1f18afc7cd Mon Sep 17 00:00:00 2001 From: amyheather Date: Wed, 21 May 2025 10:53:39 +0100 Subject: [PATCH 24/24] style(lint): linting notebooks --- notebooks/analysis.ipynb | 68 +++++++++++++++++++++++++--------- notebooks/parameters_csv.ipynb | 21 ++++++----- 2 files changed, 62 insertions(+), 27 deletions(-) diff --git a/notebooks/analysis.ipynb b/notebooks/analysis.ipynb index 53bcbab..8122974 100644 --- a/notebooks/analysis.ipynb +++ b/notebooks/analysis.ipynb @@ -3850,9 +3850,8 @@ "outputs": [], "source": [ "def make_delay_table(\n", - " scenario, scenario_name, base=base_overall, base_name=\"current\",\n", - " asu_beds=list(range(9,15)), rehab_beds=list(range(10,17))\n", - " ):\n", + " scenario, scenario_name, base, base_name, asu_beds, rehab_beds\n", + "):\n", " \"\"\"\n", " Create table with the probability of delay and 1 in n patients delayed,\n", " for the base case and a provided scenario.\n", @@ -3884,8 +3883,8 @@ " tab_segment = []\n", "\n", " # Loop over base case and scenario...\n", - " for scenario_name, df in {base_name: base[unit_name],\n", - " scenario_name: scenario[unit_name]}.items():\n", + " for name, df in {base_name: base[unit_name],\n", + " scenario_name: scenario[unit_name]}.items():\n", "\n", " # Extract results for specified beds\n", " df = df[df[\"beds\"].isin(unit_beds)][\n", @@ -3893,8 +3892,8 @@ "\n", " # Rename column to be specific to scenario\n", " df = df.rename(columns={\n", - " \"prob_delay\": f\"prob_delay_{scenario_name}\",\n", - " \"1_in_n_delay\": f\"1_in_n_delay_{scenario_name}\"})\n", + " \"prob_delay\": f\"prob_delay_{name}\",\n", + " \"1_in_n_delay\": f\"1_in_n_delay_{name}\"})\n", "\n", " # Save dataframe to list\n", " tab_segment.append(df)\n", @@ -4100,14 +4099,16 @@ "12 37.0 " ] }, - "execution_count": 11, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "full_tab2 = make_delay_table(scenario=s1_overall, scenario_name=\"5%\")\n", - "full_tab2" + "full_tab2 = make_delay_table(\n", + " scenario=s1_overall, scenario_name=\"5%\", base=base_overall,\n", + " base_name=\"current\", asu_beds=list(range(9,15)),\n", + " rehab_beds=list(range(10,17)))\n", + "display(full_tab2)" ] }, { @@ -4546,6 +4547,8 @@ "# Make table\n", "sup_tab1 = make_delay_table(scenario=s4_overall,\n", " scenario_name=\"no_complex_neuro\",\n", + " base=base_overall,\n", + " base_name=\"current\",\n", " asu_beds=list(range(10,16)),\n", " rehab_beds=list(range(12,17)))\n", "\n", @@ -4993,9 +4996,8 @@ "37 40 2 0.000007 1.000000 0.000007 136875.0" ] }, - "execution_count": 16, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ @@ -5007,7 +5009,7 @@ "\n", "# Hijack the get_occupancy_freq() method from runner to calculate stats\n", "pooled_results = base_runner.get_occupancy_freq(combined_audit, unit=\"pooled\")\n", - "pooled_results" + "display(pooled_results)" ] }, { @@ -5075,8 +5077,27 @@ "outputs": [], "source": [ "class PooledDelay:\n", + " \"\"\"\n", + " Class to calculate probability of delays in scenarios with partial pooling\n", + " of acute and rehab beds.\n", + "\n", + " Attributes\n", + " ----------\n", + " asu : pd.Series\n", + " Frequency distribution of ASU bed occupancies.\n", + " rehab : pd.Series\n", + " Frequency distribution of rehab bed occupancies.\n", + " asu_beds : int or float\n", + " Number of dedicated ASU beds (excluding pooled beds).\n", + " rehab_beds : int or float\n", + " Number of dedicated rehab beds (excluding pooled beds).\n", + " pooled_beds : int or float\n", + " Number of beds that can be used by either unit.\n", + " \"\"\"\n", " def __init__(self, base_results):\n", " \"\"\"\n", + " Initialise the PooledDelay object with base simulation results.\n", + "\n", " Parameters\n", " ----------\n", " base_results: dict\n", @@ -5103,8 +5124,6 @@ " occ_freq : pd.Series\n", " Frequencies of each number of beds, with the index representing the\n", " occupancy.\n", - " min_occ : int\n", - " The minimum number of beds for which we want to check probability.\n", " threshold : int\n", " The threshold number of beds for comparison.\n", " comparison : str\n", @@ -5114,7 +5133,8 @@ " Returns\n", " -------\n", " float\n", - " The probability of an occupancy greater than or equal to min_occ.\n", + " Probability that the occupancy meets the specified comparison\n", + " condition.\n", " \"\"\"\n", " # Calculate total frequency\n", " total_freq = occ_freq.sum()\n", @@ -5129,6 +5149,8 @@ " elif comparison == \"lt\":\n", " # Less than\n", " filtered_freq = occ_freq[occ_freq.index < threshold].sum()\n", + " else:\n", + " raise ValueError(f\"Comparison '{comparison}' not valid.\")\n", "\n", " # Calculate and return the probability\n", " return filtered_freq / total_freq\n", @@ -5141,6 +5163,11 @@ " ----------\n", " unit: str\n", " Name of unit to investigate (\"asu\", \"rehab\").\n", + "\n", + " Returns\n", + " -------\n", + " float\n", + " Probability that only the specified unit has delays.\n", " \"\"\"\n", " # Determine name of other unit, depending on which you are focussing on\n", " other_unit = \"rehab\" if unit == \"asu\" else \"asu\"\n", @@ -5262,6 +5289,13 @@ " Number of dedicated rehabilitation beds (excluding pooled beds).\n", " pooled_beds: int\n", " Number of beds that can be used by either unit.\n", + "\n", + " Returns\n", + " -------\n", + " pool_results: dict\n", + " Dictionary containing number of dedicated and pooled beds,\n", + " probability of delay for each unit, and 1 in n patients delayed\n", + " for each unit.\n", " \"\"\"\n", " # Get counts of dedicated and pooled beds\n", " self.asu_beds = asu_beds\n", diff --git a/notebooks/parameters_csv.ipynb b/notebooks/parameters_csv.ipynb index 66bbb3a..f856842 100644 --- a/notebooks/parameters_csv.ipynb +++ b/notebooks/parameters_csv.ipynb @@ -13,6 +13,8 @@ "metadata": {}, "outputs": [], "source": [ + "# pylint: disable=missing-module-docstring\n", + "from IPython.display import display\n", "import pandas as pd\n", "\n", "from simulation.parameters import (\n", @@ -126,28 +128,27 @@ { "data": { "text/plain": [ - "{'asu_arrivals': ,\n", - " 'rehab_arrivals': ,\n", - " 'asu_los': ,\n", - " 'rehab_los': ,\n", - " 'asu_routing': ,\n", - " 'rehab_routing': ,\n", + "{'asu_arrivals': ,\n", + " 'rehab_arrivals': ,\n", + " 'asu_los': ,\n", + " 'rehab_los': ,\n", + " 'asu_routing': ,\n", + " 'rehab_routing': ,\n", " 'warm_up_period': 1095,\n", " 'data_collection_period': 1825,\n", " 'number_of_runs': 150,\n", " 'audit_interval': 1,\n", " 'cores': 1,\n", - " 'logger': ,\n", + " 'logger': ,\n", " '_initialised': True}" ] }, - "execution_count": 3, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "setup_param_from_csv(csv_path=\"../inputs/parameters.csv\").__dict__" + "display(setup_param_from_csv(csv_path=\"../inputs/parameters.csv\").__dict__)" ] } ],