Modelling a Hospital¶
Now you’ve seen how to use and name different disease stages, we can put all of this together to fully model a hospital.
Disease files¶
First, we will create a set of disease files for the different demographics;
First, lurgy_home.json
{
    "stage"            : [ "E1", "E2", "I1", "I2", "I3", "R" ],
    "beta"             : [  0.0,  0.0,  0.2,  0.5,  0.5, 0.0 ],
    "progress"         : [  1.0,  1.0,  0.2,  0.5,  0.5, 0.0 ],
    "too_ill_to_move"  : [  0.0,  0.0,  0.0,  0.5,  0.8, 1.0 ],
    "contrib_foi"      : [  1.0,  1.0,  1.0,  1.0,  1.0, 0.0 ],
    "start_symptom"    : 3
}
This is the same as lurgy4.json except we have now named the individual
disease stages. This will be used to model the disease in the general
population and in hospital staff.
Next, lurgy_hospital.json, used to model hospital patients;
{
    "stage"            : [ "H1", "H2" ],
    "beta"             : [  0.2, 0.2  ],
    "progress"         : [  0.2, 0.2  ],
    "too_ill_to_move"  : [  1.0, 1.0  ],
    "contrib_foi"      : [  1.0, 1.0  ],
    "start_symptom"    : 1
}
Next, lurgy_icu.json, used to model intensive care patients;
{
    "stage"            : [ "ICU", "R" ],
    "beta"             : [  0.2,  0.0 ],
    "progress"         : [  0.2,  0.0 ],
    "too_ill_to_move"  : [  1.0,  1.0 ],
    "contrib_foi"      : [  1.0,  0.0 ],
    "start_symptom"    : 1
}
And, finally, we need to have an overall disease file that defines the
stages that we want to use for mapping. This just names the mapping
stages, in the order we want to see them reported. This is in
lurgy_overall.json;
{ "stage" : ["E", "I", "H", "ICU", "R"] }
Note
We don’t need to set any disease parameters as these are set by the disease files used by the different demographics.
Demographics¶
Next, we need to update the demographics.json file to read;
{
    "demographics" : ["home", "staff", "patients", "icu"],
    "work_ratios"  : [ 0.99,   0.01,     0.00,     0.00 ],
    "play_ratios"  : [ 1.00,   0.00,     0.00,     0.00 ],
    "diseases"     : [ "lurgy_home", "lurgy_home",
                       "lurgy_hospital", "lurgy_icu" ]
}
Here, we’ve set the home and staff demographics to use lurgy_home,
while patients will use lurgy_hospital and icu will use
lurgy_icu.
Mixers, movers and extractors¶
We can use the same mixer as before, e.g. mix_hospital.py should be;
from metawards.mixers import merge_using_matrix
def mix_shield(network, **kwargs):
    matrix = [ [1.0, 1.0, 0.0, 0.0],
               [0.0, 0.1, 0.1, 0.1],
               [0.0, 0.1, 0.0, 0.0],
               [0.0, 0.1, 0.0, 0.0] ]
    network.demographics.interaction_matrix = matrix
    return [merge_using_matrix]
We can use the same mover as before, except we can now take advantage
of the named disease stages to specify the moves using demographic and
disease name. This is significantly less error-prone than using indexes,
e.g. update move_hospital.py to read;
from metawards.movers import go_stage
def move_hospital(**kwargs):
    # move 20% of I2 home/staff population to H1 patients
    func1 = lambda **kwargs: go_stage(go_from=["home", "staff"],
                                      go_to="patients",
                                      from_stage="I2",
                                      to_stage="H1",
                                      fraction=0.2,
                                      **kwargs)
    # move 10% of H2 patients to ICU1 ICU
    func2 = lambda **kwargs: go_stage(go_from="patients",
                                      go_to="icu",
                                      from_stage="H2",
                                      to_stage="ICU",
                                      fraction=0.1,
                                       **kwargs)
    # move the remainder of H2 patients to home R
    func3 = lambda **kwargs: go_stage(go_from="patients",
                                      go_to="home",
                                      from_stage="H2",
                                      to_stage="R",
                                      fraction=1.0,
                                      **kwargs)
    # move R ICU and H2 patients to home R
    func4 = lambda **kwargs: go_stage(go_from=["patients", "icu"],
                                      go_to="home",
                                      from_stage=["H2", "R"],
                                      to_stage="R",
                                      fraction=1.0,
                                      **kwargs)
    return [func1, func2, func3, func4]
As for the extractor, well we don’t really need to use it now as the data for each stage will be written already into the summary and individual output files.
Running the job¶
Run metawards using;
metawards -D demographics.json -d lurgy_overall --mixer mix_hospital --mover move_hospital -a ExtraSeedsLondon.dat --nsteps 40
Note
We’ve limited here to running just 40 steps to enable a quick demonstration. Feel free to run the full model if you have time.
You should see that statistics for the mapped disease stages for all of the demographics are written nicely to the screen, e.g.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Day 36 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
S: 56079510  E: 632  I: 1246  H: 117  ICU: 7  R: 565  IW: 509  POPULATION: 56082077
┏━━━━━━━━━━┳━━━━━━━━━━┳━━━━━┳━━━━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━━━━━━━━━┓
┃          ┃    S     ┃  E  ┃  I   ┃  H  ┃ ICU ┃  R  ┃ IW  ┃ POPULATION ┃
┡━━━━━━━━━━╇━━━━━━━━━━╇━━━━━╇━━━━━━╇━━━━━╇━━━━━╇━━━━━╇━━━━━╇━━━━━━━━━━━━┩
│   home   │ 55975294 │ 626 │ 1240 │     │     │ 560 │ 298 │  55977720  │
│  staff   │  104216  │  6  │  6   │     │     │  5  │  1  │   104233   │
│ patients │    0     │     │      │ 117 │     │     │ 86  │    117     │
│   icu    │    0     │     │      │     │  7  │  0  │  7  │     7      │
├──────────┼──────────┼─────┼──────┼─────┼─────┼─────┼─────┼────────────┤
│  total   │ 56079510 │ 632 │ 1246 │ 117 │  7  │ 565 │ 509 │  56082077  │
└──────────┴──────────┴─────┴──────┴─────┴─────┴─────┴─────┴────────────┘
Number of infections: 2002
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Day 37 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
S: 56079060  E: 795  I: 1415  H: 148  ICU: 6  R: 653  IW: 622  POPULATION: 56082077
┏━━━━━━━━━━┳━━━━━━━━━━┳━━━━━┳━━━━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━━━━━━━━━┓
┃          ┃    S     ┃  E  ┃  I   ┃  H  ┃ ICU ┃  R  ┃ IW  ┃ POPULATION ┃
┡━━━━━━━━━━╇━━━━━━━━━━╇━━━━━╇━━━━━━╇━━━━━╇━━━━━╇━━━━━╇━━━━━╇━━━━━━━━━━━━┩
│   home   │ 55974849 │ 789 │ 1405 │     │     │ 645 │ 381 │  55977688  │
│  staff   │  104211  │  6  │  10  │     │     │  6  │  5  │   104233   │
│ patients │    0     │     │      │ 148 │     │     │ 103 │    148     │
│   icu    │    0     │     │      │     │  6  │  2  │  6  │     8      │
├──────────┼──────────┼─────┼──────┼─────┼─────┼─────┼─────┼────────────┤
│  total   │ 56079060 │ 795 │ 1415 │ 148 │  6  │ 653 │ 622 │  56082077  │
└──────────┴──────────┴─────┴──────┴─────┴─────┴─────┴─────┴────────────┘
Number of infections: 2364
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Day 38 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
S: 56078586  E: 924  I: 1625  H: 168  ICU: 9  R: 765  IW: 696  POPULATION: 56082077
┏━━━━━━━━━━┳━━━━━━━━━━┳━━━━━┳━━━━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━━━━━━━━━┓
┃          ┃    S     ┃  E  ┃  I   ┃  H  ┃ ICU ┃  R  ┃ IW  ┃ POPULATION ┃
┡━━━━━━━━━━╇━━━━━━━━━━╇━━━━━╇━━━━━━╇━━━━━╇━━━━━╇━━━━━╇━━━━━╇━━━━━━━━━━━━┩
│   home   │ 55974378 │ 916 │ 1614 │     │     │ 758 │ 392 │  55977666  │
│  staff   │  104208  │  8  │  11  │     │     │  6  │  3  │   104233   │
│ patients │    0     │     │      │ 168 │     │     │ 115 │    168     │
│   icu    │    0     │     │      │     │  9  │  1  │  9  │     10     │
├──────────┼──────────┼─────┼──────┼─────┼─────┼─────┼─────┼────────────┤
│  total   │ 56078586 │ 924 │ 1625 │ 168 │  9  │ 765 │ 696 │  56082077  │
└──────────┴──────────┴─────┴──────┴─────┴─────┴─────┴─────┴────────────┘
Number of infections: 2726
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Day 39 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
S: 56078059  E: 1001  I: 1914  H: 189  ICU: 11  R: 903  IW: 763  POPULATION: 56082077
┏━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━┳━━━━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━━━━━━━━━┓
┃          ┃    S     ┃  E   ┃  I   ┃  H  ┃ ICU ┃  R  ┃ IW  ┃ POPULATION ┃
┡━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━╇━━━━━━╇━━━━━╇━━━━━╇━━━━━╇━━━━━╇━━━━━━━━━━━━┩
│   home   │ 55973854 │ 995  │ 1899 │     │     │ 894 │ 440 │  55977642  │
│  staff   │  104205  │  6   │  15  │     │     │  7  │  3  │   104233   │
│ patients │    0     │      │      │ 189 │     │     │ 135 │    189     │
│   icu    │    0     │      │      │     │ 11  │  2  │ 11  │     13     │
├──────────┼──────────┼──────┼──────┼─────┼─────┼─────┼─────┼────────────┤
│  total   │ 56078059 │ 1001 │ 1914 │ 189 │ 11  │ 903 │ 763 │  56082077  │
└──────────┴──────────┴──────┴──────┴─────┴─────┴─────┴─────┴────────────┘
Number of infections: 3115
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Day 40 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
S: 56077432  E: 1154  I: 2225  H: 210  ICU: 12  R: 1044  IW: 874  POPULATION: 56082077
┏━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━┳━━━━━━┳━━━━━┳━━━━━┳━━━━━━┳━━━━━┳━━━━━━━━━━━━┓
┃          ┃    S     ┃  E   ┃  I   ┃  H  ┃ ICU ┃  R   ┃ IW  ┃ POPULATION ┃
┡━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━╇━━━━━━╇━━━━━╇━━━━━╇━━━━━━╇━━━━━╇━━━━━━━━━━━━┩
│   home   │ 55973231 │ 1147 │ 2208 │     │     │ 1033 │ 525 │  55977619  │
│  staff   │  104201  │  7   │  17  │     │     │  7   │  4  │   104232   │
│ patients │    0     │      │      │ 210 │     │      │ 147 │    210     │
│   icu    │    0     │      │      │     │ 12  │  4   │ 12  │     16     │
├──────────┼──────────┼──────┼──────┼─────┼─────┼──────┼─────┼────────────┤
│  total   │ 56077432 │ 1154 │ 2225 │ 210 │ 12  │ 1044 │ 874 │  56082077  │
└──────────┴──────────┴──────┴──────┴─────┴─────┴──────┴─────┴────────────┘
Number of infections: 3601
Equally, you will find the individual ICU and R populations for
the icu demographic is output/total_infections_icu.csv.bz2,
and the individual populations for H1 and H2 in the
patients demographic in output/total_infections_patients.csv.bz2.
In addition, the output/results.csv.bz2 and output/trajectory.csv.bz2
files record the totals in the H and ICU stages, as well as the
traditional S, E, I and R, e.g.
>>> import pandas as pd
>>> df = pd.read_csv("output/results.csv.bz2")
>>> df.head()
   fingerprint  repeat  day        date         S  E  I  H  ICU  R  IW   UV
 0      REPEAT       1    0  2020-06-23  56082077  0  0  0    0  0   0  1.0
 1      REPEAT       1    1  2020-06-24  56082072  5  0  0    0  0   1  1.0
 2      REPEAT       1    2  2020-06-25  56082072  0  5  0    0  0   0  1.0
 3      REPEAT       1    3  2020-06-26  56082071  1  5  0    0  0   1  1.0
 4      REPEAT       1    4  2020-06-27  56082069  3  5  0    0  0   3  1.0