Skip to content

Move computation #208

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Mar 24, 2020
41 changes: 20 additions & 21 deletions src/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,13 @@
write_footer,
)
from penn_chime.settings import DEFAULTS
from penn_chime.models import sim_sir_df, build_admissions_df, build_census_df
from penn_chime.charts import (additional_projections_chart,
admitted_patients_chart,
new_admissions_chart,
chart_descriptions)
from penn_chime.models import SimSirModel
from penn_chime.charts import (
additional_projections_chart,
admitted_patients_chart,
new_admissions_chart,
chart_descriptions
)

# This is somewhat dangerous:
# Hide the main menu with "Rerun", "run on Save", "clear cache", and "record a screencast"
Expand All @@ -29,49 +31,46 @@
st.markdown(hide_menu_style, unsafe_allow_html=True)

p = display_sidebar(st, DEFAULTS)
m = SimSirModel(p)

display_header(st, p)
display_header(st, m, p)

if st.checkbox("Show more info about this tool"):
notes = "The total size of the susceptible population will be the entire catchment area for Penn Medicine entities (HUP, PAH, PMC, CCH)"
show_more_info_about_this_tool(st=st, parameters=p, inputs=DEFAULTS, notes=notes)


# begin format data
admissions_df = build_admissions_df(p=p) # p.n_days, *p.dispositions)
census_df = build_census_df(admissions_df, parameters=p)
# end format data
show_more_info_about_this_tool(st=st, model=m, parameters=p, defaults=DEFAULTS, notes=notes)

st.subheader("New Admissions")
st.markdown("Projected number of **daily** COVID-19 admissions at Penn hospitals")
new_admit_chart = new_admissions_chart(alt, admissions_df, parameters=p)
new_admit_chart = new_admissions_chart(alt, m.admits_df, parameters=p)
st.altair_chart(
new_admit_chart, use_container_width=True
new_admissions_chart(alt, m.admits_df, parameters=p),
use_container_width=True,
)

st.markdown(chart_descriptions(new_admit_chart))

if st.checkbox("Show Projected Admissions in tabular form"):
draw_projected_admissions_table(st, admissions_df, as_date=p.as_date)
draw_projected_admissions_table(st, m.admits_df, as_date=p.as_date)
st.subheader("Admitted Patients (Census)")
st.markdown(
"Projected **census** of COVID-19 patients, accounting for arrivals and discharges at Penn hospitals"
)
census_chart = admitted_patients_chart(alt=alt, census=census_df, parameters=p)
census_chart = admitted_patients_chart(alt=alt, census=m.census_df, parameters=p)
st.altair_chart(
census_chart, use_container_width=True
admitted_patients_chart(alt=alt, census=m.census_df, parameters=p),
use_container_width=True,
)
st.markdown(chart_descriptions(census_chart, suffix=" Census"))
if st.checkbox("Show Projected Census in tabular form"):
draw_census_table(st, census_df, as_date=p.as_date)
draw_census_table(st, m.census_df, as_date=p.as_date)
st.markdown(
"""**Click the checkbox below to view additional data generated by this simulation**"""
)
if st.checkbox("Show Additional Projections"):
show_additional_projections(
st, alt, additional_projections_chart, parameters=p
st, alt, additional_projections_chart, model=m, parameters=p
)
if st.checkbox("Show Raw SIR Simulation Data"):
draw_raw_sir_simulation_table(st, parameters=p)
draw_raw_sir_simulation_table(st, model=m, parameters=p)
write_definitions(st)
write_footer(st)
22 changes: 7 additions & 15 deletions src/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
from pandas import DataFrame

from penn_chime.parameters import Parameters
from penn_chime.models import SimSirModel
from penn_chime.utils import RateLos
from penn_chime.models import build_admissions_df, build_census_df

class FromFile(Action):
"""From File."""
Expand Down Expand Up @@ -108,30 +108,22 @@ def main():
doubling_time=a.doubling_time,
known_infected=a.known_infected,
market_share=a.market_share,
n_days=a.n_days,
relative_contact_rate=a.relative_contact_rate,
susceptible=a.susceptible,
n_days=a.n_days,

hospitalized=RateLos(a.hospitalized_rate, a.hospitalized_los),
icu=RateLos(a.icu_rate, a.icu_los),
ventilated=RateLos(a.ventilated_rate, a.ventilated_los),
)

raw_df = DataFrame(
{
"Susceptible": p.susceptible_v,
"Infected": p.infected_v,
"Recovered": p.recovered_v,
}
)

admits_df = build_admissions_df(p)
census_df = build_census_df(admits_df, p)
m = SimSirModel(p)

prefix = a.prefix
for df, name in (
(raw_df, "raw"),
(admits_df, "admits"),
(census_df, "census"),
(m.raw_df, "raw"),
(m.admits_df, "admits"),
(m.census_df, "census"),
):
df.to_csv(prefix + name + ".csv")

Expand Down
22 changes: 13 additions & 9 deletions src/penn_chime/charts.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@

from math import ceil
import datetime

from altair import Chart # type: ignore
import pandas as pd # type: ignore
import numpy as np # type: ignore

from .parameters import Parameters
from .utils import add_date_column
Expand Down Expand Up @@ -32,7 +32,7 @@ def new_admissions_chart(

return (
alt.Chart(projection_admits.head(plot_projection_days))
.transform_fold(fold=["Hospitalized", "ICU", "Ventilated"])
.transform_fold(fold=["hospitalized", "icu", "ventilated"])
.mark_line(point=True)
.encode(
x=alt.X(**x_kwargs),
Expand Down Expand Up @@ -72,7 +72,7 @@ def admitted_patients_chart(

return (
alt.Chart(census.head(plot_projection_days))
.transform_fold(fold=["Hospitalized", "ICU", "Ventilated"])
.transform_fold(fold=["hospitalized", "icu", "ventilated"])
.mark_line(point=True)
.encode(
x=alt.X(**x_kwargs),
Expand All @@ -89,11 +89,15 @@ def admitted_patients_chart(


def additional_projections_chart(
alt, parameters: Parameters
alt, model, parameters
) -> Chart:
i = parameters.infected_v
r = parameters.recovered_v
dat = pd.DataFrame({"Infected": i, "Recovered": r})

# TODO use subselect of df_raw instead of creating a new df
raw_df = model.raw_df
dat = pd.DataFrame({
"infected": raw_df.infected,
"recovered": raw_df.recovered
})
dat["day"] = dat.index

as_date = parameters.as_date
Expand All @@ -113,7 +117,7 @@ def additional_projections_chart(

return (
alt.Chart(dat)
.transform_fold(fold=["Infected", "Recovered"])
.transform_fold(fold=["infected", "recovered"])
.mark_line()
.encode(
x=alt.X(**x_kwargs),
Expand All @@ -136,7 +140,7 @@ def chart_descriptions(chart: Chart, suffix: str = ""):
"""
messages = []

cols = ["Hospitalized", "ICU", "Ventilated"]
cols = ["hospitalized", "icu", "ventilated"]
asterisk = False
day = "date" if "date" in chart.data.columns else "day"

Expand Down
15 changes: 12 additions & 3 deletions src/penn_chime/defaults.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,25 +25,34 @@ def __init__(
current_hospitalized: int,
doubling_time: int,
known_infected: int,
n_days: int,
relative_contact_rate: int,
region: Regions,

hospitalized: RateLos,
icu: RateLos,
ventilated: RateLos,

as_date: bool = False,
market_share: float = 1.0,
max_y_axis: int = None,
n_days: int = 60,
recovery_days: int = 14,
):
self.region = region
self.known_infected = known_infected
self.current_hospitalized = current_hospitalized
self.known_infected = known_infected
self.doubling_time = doubling_time
self.market_share = market_share
self.relative_contact_rate = relative_contact_rate

self.hospitalized = hospitalized
self.icu = icu
self.ventilated = ventilated

self.as_date = as_date
self.market_share = market_share
self.max_y_axis = max_y_axis
self.n_days = n_days
self.recovery_days = recovery_days

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