Skip to content

Commit 0c0115e

Browse files
authored
Merge pull request #208 from CodeForPhilly/move_computation
Move computation
2 parents 39185aa + ccbc3dd commit 0c0115e

File tree

10 files changed

+293
-342
lines changed

10 files changed

+293
-342
lines changed

src/app.py

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@
1717
write_footer,
1818
)
1919
from penn_chime.settings import DEFAULTS
20-
from penn_chime.models import sim_sir_df, build_admissions_df, build_census_df
21-
from penn_chime.charts import (additional_projections_chart,
22-
admitted_patients_chart,
23-
new_admissions_chart,
24-
chart_descriptions)
20+
from penn_chime.models import SimSirModel
21+
from penn_chime.charts import (
22+
additional_projections_chart,
23+
admitted_patients_chart,
24+
new_admissions_chart,
25+
chart_descriptions
26+
)
2527

2628
# This is somewhat dangerous:
2729
# Hide the main menu with "Rerun", "run on Save", "clear cache", and "record a screencast"
@@ -30,55 +32,52 @@
3032
st.markdown(hide_menu_style, unsafe_allow_html=True)
3133

3234
p = display_sidebar(st, DEFAULTS)
35+
m = SimSirModel(p)
3336

34-
display_header(st, p)
37+
display_header(st, m, p)
3538

3639
if st.checkbox("Show more info about this tool"):
3740
notes = "The total size of the susceptible population will be the entire catchment area for Penn Medicine entities (HUP, PAH, PMC, CCH)"
38-
show_more_info_about_this_tool(st=st, parameters=p, inputs=DEFAULTS, notes=notes)
39-
40-
41-
# begin format data
42-
admissions_df = build_admissions_df(p=p) # p.n_days, *p.dispositions)
43-
census_df = build_census_df(admissions_df, parameters=p)
44-
# end format data
41+
show_more_info_about_this_tool(st=st, model=m, parameters=p, defaults=DEFAULTS, notes=notes)
4542

4643
st.subheader("New Admissions")
4744
st.markdown("Projected number of **daily** COVID-19 admissions at Penn hospitals")
48-
new_admit_chart = new_admissions_chart(alt, admissions_df, parameters=p)
45+
new_admit_chart = new_admissions_chart(alt, m.admits_df, parameters=p)
4946
st.altair_chart(
50-
new_admit_chart, use_container_width=True
47+
new_admissions_chart(alt, m.admits_df, parameters=p),
48+
use_container_width=True,
5149
)
5250

53-
st.markdown(chart_descriptions(new_admit_chart))
51+
st.markdown(chart_descriptions(new_admit_chart, p.labels))
5452

5553
if st.checkbox("Show Projected Admissions in tabular form"):
5654
if st.checkbox("Show Daily Counts"):
57-
draw_projected_admissions_table(st, admissions_df, as_date=p.as_date, daily_count=True)
55+
draw_projected_admissions_table(st, m.admits_df, p.labels, as_date=p.as_date, daily_count=True)
5856
else:
59-
draw_projected_admissions_table(st, admissions_df, as_date=p.as_date, daily_count=False)
57+
draw_projected_admissions_table(st, m.admits_df, p.labels, as_date=p.as_date, daily_count=False)
6058
build_download_link(st,
6159
filename="projected_admissions.csv",
62-
df=admissions_df,
60+
df=m.admits_df,
6361
parameters=p
6462
)
6563
st.subheader("Admitted Patients (Census)")
6664
st.markdown(
6765
"Projected **census** of COVID-19 patients, accounting for arrivals and discharges at Penn hospitals"
6866
)
69-
census_chart = admitted_patients_chart(alt=alt, census=census_df, parameters=p)
67+
census_chart = admitted_patients_chart(alt=alt, census=m.census_df, parameters=p)
7068
st.altair_chart(
71-
census_chart, use_container_width=True
69+
admitted_patients_chart(alt=alt, census=m.census_df, parameters=p),
70+
use_container_width=True,
7271
)
73-
st.markdown(chart_descriptions(census_chart, suffix=" Census"))
72+
st.markdown(chart_descriptions(census_chart, p.labels, suffix=" Census"))
7473
if st.checkbox("Show Projected Census in tabular form"):
7574
if st.checkbox("Show Daily Census Counts"):
76-
draw_census_table(st, admissions_df, as_date=p.as_date, daily_count=True)
75+
draw_census_table(st, m.census_df, p.labels, as_date=p.as_date, daily_count=True)
7776
else:
78-
draw_census_table(st, census_df, as_date=p.as_date, daily_count=False)
77+
draw_census_table(st, m.census_df, p.labels, as_date=p.as_date, daily_count=False)
7978
build_download_link(st,
8079
filename="projected_census.csv",
81-
df=census_df,
80+
df=m.census_df,
8281
parameters=p
8382
)
8483

@@ -87,9 +86,9 @@
8786
)
8887
if st.checkbox("Show Additional Projections"):
8988
show_additional_projections(
90-
st, alt, additional_projections_chart, parameters=p
89+
st, alt, additional_projections_chart, model=m, parameters=p
9190
)
9291
if st.checkbox("Show Raw SIR Simulation Data"):
93-
draw_raw_sir_simulation_table(st, parameters=p)
92+
draw_raw_sir_simulation_table(st, model=m, parameters=p)
9493
write_definitions(st)
9594
write_footer(st)

src/cli.py

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
from pandas import DataFrame
1010

1111
from penn_chime.parameters import Parameters
12+
from penn_chime.models import SimSirModel
1213
from penn_chime.utils import RateLos
13-
from penn_chime.models import build_admissions_df, build_census_df
1414

1515
class FromFile(Action):
1616
"""From File."""
@@ -108,30 +108,22 @@ def main():
108108
doubling_time=a.doubling_time,
109109
known_infected=a.known_infected,
110110
market_share=a.market_share,
111+
n_days=a.n_days,
111112
relative_contact_rate=a.relative_contact_rate,
112113
susceptible=a.susceptible,
113-
n_days=a.n_days,
114+
114115
hospitalized=RateLos(a.hospitalized_rate, a.hospitalized_los),
115116
icu=RateLos(a.icu_rate, a.icu_los),
116117
ventilated=RateLos(a.ventilated_rate, a.ventilated_los),
117118
)
118119

119-
raw_df = DataFrame(
120-
{
121-
"Susceptible": p.susceptible_v,
122-
"Infected": p.infected_v,
123-
"Recovered": p.recovered_v,
124-
}
125-
)
126-
127-
admits_df = build_admissions_df(p)
128-
census_df = build_census_df(admits_df, p)
120+
m = SimSirModel(p)
129121

130122
prefix = a.prefix
131123
for df, name in (
132-
(raw_df, "raw"),
133-
(admits_df, "admits"),
134-
(census_df, "census"),
124+
(m.raw_df, "raw"),
125+
(m.admits_df, "admits"),
126+
(m.census_df, "census"),
135127
):
136128
df.to_csv(prefix + name + ".csv")
137129

src/penn_chime/charts.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11

22
from math import ceil
33
import datetime
4+
45
from altair import Chart # type: ignore
56
import pandas as pd # type: ignore
6-
import numpy as np # type: ignore
77

88
from .parameters import Parameters
99
from .utils import add_date_column
@@ -31,9 +31,10 @@ def new_admissions_chart(
3131
else:
3232
x_kwargs = {"shorthand": "day", "title": "Days from today"}
3333

34+
# TODO fix the fold to allow any number of dispositions
3435
return (
3536
alt.Chart(projection_admits.head(plot_projection_days))
36-
.transform_fold(fold=["Hospitalized", "ICU", "Ventilated"])
37+
.transform_fold(fold=["hospitalized", "icu", "ventilated"])
3738
.mark_line(point=True)
3839
.encode(
3940
x=alt.X(**x_kwargs),
@@ -71,9 +72,10 @@ def admitted_patients_chart(
7172
y_scale.domain = (0, max_y_axis)
7273
y_scale.clamp = True
7374

75+
# TODO fix the fold to allow any number of dispositions
7476
return (
7577
alt.Chart(census.head(plot_projection_days))
76-
.transform_fold(fold=["Hospitalized", "ICU", "Ventilated"])
78+
.transform_fold(fold=["hospitalized", "icu", "ventilated"])
7779
.mark_line(point=True)
7880
.encode(
7981
x=alt.X(**x_kwargs),
@@ -90,11 +92,15 @@ def admitted_patients_chart(
9092

9193

9294
def additional_projections_chart(
93-
alt, parameters: Parameters
95+
alt, model, parameters
9496
) -> Chart:
95-
i = parameters.infected_v
96-
r = parameters.recovered_v
97-
dat = pd.DataFrame({"Infected": i, "Recovered": r})
97+
98+
# TODO use subselect of df_raw instead of creating a new df
99+
raw_df = model.raw_df
100+
dat = pd.DataFrame({
101+
"infected": raw_df.infected,
102+
"recovered": raw_df.recovered
103+
})
98104
dat["day"] = dat.index
99105

100106
as_date = parameters.as_date
@@ -114,7 +120,7 @@ def additional_projections_chart(
114120

115121
return (
116122
alt.Chart(dat)
117-
.transform_fold(fold=["Infected", "Recovered"])
123+
.transform_fold(fold=["infected", "recovered"])
118124
.mark_line()
119125
.encode(
120126
x=alt.X(**x_kwargs),
@@ -126,7 +132,7 @@ def additional_projections_chart(
126132
)
127133

128134

129-
def chart_descriptions(chart: Chart, suffix: str = ""):
135+
def chart_descriptions(chart: Chart, labels, suffix: str = ""):
130136
"""
131137
132138
:param chart: Chart: The alt chart to be used in finding max points
@@ -137,7 +143,7 @@ def chart_descriptions(chart: Chart, suffix: str = ""):
137143
"""
138144
messages = []
139145

140-
cols = ["Hospitalized", "ICU", "Ventilated"]
146+
cols = ["hospitalized", "icu", "ventilated"]
141147
asterisk = False
142148
day = "date" if "date" in chart.data.columns else "day"
143149

@@ -153,7 +159,7 @@ def chart_descriptions(chart: Chart, suffix: str = ""):
153159

154160
messages.append(
155161
"{}{} peaks at {:,} on day {}{}".format(
156-
col,
162+
labels[col],
157163
suffix,
158164
ceil(chart.data[col].max()),
159165
on,

src/penn_chime/defaults.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,34 @@ def __init__(
2525
current_hospitalized: int,
2626
doubling_time: int,
2727
known_infected: int,
28-
n_days: int,
2928
relative_contact_rate: int,
3029
region: Regions,
30+
3131
hospitalized: RateLos,
3232
icu: RateLos,
3333
ventilated: RateLos,
34+
35+
as_date: bool = False,
3436
market_share: float = 1.0,
37+
max_y_axis: int = None,
38+
n_days: int = 60,
39+
recovery_days: int = 14,
3540
):
3641
self.region = region
37-
self.known_infected = known_infected
3842
self.current_hospitalized = current_hospitalized
43+
self.known_infected = known_infected
3944
self.doubling_time = doubling_time
40-
self.market_share = market_share
4145
self.relative_contact_rate = relative_contact_rate
4246

4347
self.hospitalized = hospitalized
4448
self.icu = icu
4549
self.ventilated = ventilated
50+
51+
self.as_date = as_date
52+
self.market_share = market_share
53+
self.max_y_axis = max_y_axis
4654
self.n_days = n_days
55+
self.recovery_days = recovery_days
4756

4857
def __repr__(self) -> str:
4958
return f"Constants(susceptible_default: {self.region.susceptible}, known_infected: {self.known_infected})"

0 commit comments

Comments
 (0)