Skip to content

Commit 2e21e01

Browse files
committed
Refactor module
1 parent e5a33a1 commit 2e21e01

18 files changed

+126
-111
lines changed

Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ COPY defaults defaults
99
COPY src src
1010
RUN pip install -q .
1111

12-
CMD ["streamlit", "run", "src/app.py"]
12+
CMD ["streamlit", "run", "st_app.py"]
1313

src/app.py

-65
This file was deleted.

src/penn_chime/cli.py

+3-7
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,18 @@
33
import os
44
import sys
55

6-
from .parameters import Parameters
7-
from .models import SimSirModel as Model
6+
from .model.parameters import Parameters
7+
from .model.sir import Sir
88

99

1010
def main():
1111
"""Main."""
1212
p = Parameters.create(os.environ, sys.argv[1:])
13-
m = Model(p)
13+
m = Sir(p)
1414

1515
for df, name in (
1616
(m.sim_sir_w_date_df, "sim_sir_w_date"),
1717
(m.admits_df, "projected_admits"),
1818
(m.census_df, "projected_census"),
1919
):
2020
df.to_csv(f"{p.current_date}_{name}.csv")
21-
22-
23-
if __name__ == "__main__":
24-
main()

src/penn_chime/parameters.py src/penn_chime/model/parameters.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from sys import stdout
1414
from typing import Dict, List
1515

16-
from .constants import (
16+
from ..constants import (
1717
CHANGE_DATE,
1818
VERSION,
1919
)

src/penn_chime/models.py src/penn_chime/model/sir.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@
66

77
from __future__ import annotations
88

9-
from datetime import date, datetime, timedelta
9+
from datetime import datetime, timedelta
1010
from logging import INFO, basicConfig, getLogger
1111
from sys import stdout
12-
from typing import Dict, Generator, Tuple, Sequence, Optional
12+
from typing import Dict, Tuple, Sequence, Optional
1313

1414
import numpy as np
1515
import pandas as pd
1616

17-
from .constants import EPSILON, CHANGE_DATE
1817
from .parameters import Parameters
1918

2019

@@ -26,7 +25,7 @@
2625
logger = getLogger(__name__)
2726

2827

29-
class SimSirModel:
28+
class Sir:
3029

3130
def __init__(self, p: Parameters):
3231

src/penn_chime/validators/__init__.py src/penn_chime/model/validators/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""the callable validator design pattern"""
22

3-
from ..constants import EPSILON
3+
from ...constants import EPSILON
44
from .validators import (
55
OptionalValue as ValOptionalValue,
66
Bounded as ValBounded,
File renamed without changes.

src/penn_chime/charts.py src/penn_chime/view/charts.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
1-
from datetime import datetime
2-
from math import ceil
31
from typing import Dict, Optional
42

53
from altair import Chart
64
import pandas as pd
75
import numpy as np
86

9-
from .constants import DATE_FORMAT
10-
from .parameters import Parameters
7+
from ..constants import DATE_FORMAT
118

129

1310
def build_admits_chart(
File renamed without changes.

src/penn_chime/view/st_app.py

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
"""App."""
2+
3+
import os
4+
5+
import altair as alt # type: ignore
6+
import streamlit as st # type: ignore
7+
8+
from ..model.parameters import Parameters
9+
from ..model.sir import Sir
10+
from .charts import (
11+
build_admits_chart,
12+
build_census_chart,
13+
build_sim_sir_w_date_chart,
14+
)
15+
from .display import (
16+
display_download_link,
17+
display_footer,
18+
display_header,
19+
display_sidebar,
20+
hide_menu_style,
21+
)
22+
23+
24+
def main():
25+
# This is somewhat dangerous:
26+
# Hide the main menu with "Rerun", "run on Save", "clear cache", and "record a screencast"
27+
# This should not be hidden in prod, but removed
28+
# In dev, this should be shown
29+
st.markdown(hide_menu_style, unsafe_allow_html=True)
30+
31+
d = Parameters.create(os.environ, [])
32+
p = display_sidebar(st, d)
33+
m = Sir(p)
34+
35+
display_header(st, m, p)
36+
37+
st.subheader("New Admissions")
38+
st.markdown("Projected number of **daily** COVID-19 admissions.")
39+
admits_chart = build_admits_chart(alt=alt, admits_floor_df=m.admits_floor_df, max_y_axis=p.max_y_axis)
40+
st.altair_chart(admits_chart, use_container_width=True)
41+
display_download_link(
42+
st,
43+
filename=f"{p.current_date}_projected_admits.csv",
44+
df=m.admits_df,
45+
)
46+
47+
st.subheader("Admitted Patients (Census)")
48+
st.markdown("Projected **census** of COVID-19 patients, accounting for arrivals and discharges.")
49+
census_chart = build_census_chart(alt=alt, census_floor_df=m.census_floor_df, max_y_axis=p.max_y_axis)
50+
st.altair_chart(census_chart, use_container_width=True)
51+
display_download_link(
52+
st,
53+
filename=f"{p.current_date}_projected_census.csv",
54+
df=m.census_df,
55+
)
56+
57+
st.subheader("Susceptible, Infected, and Recovered")
58+
st.markdown("The number of susceptible, infected, and recovered individuals in the hospital catchment region at any given moment")
59+
sim_sir_w_date_chart = build_sim_sir_w_date_chart(alt=alt, sim_sir_w_date_floor_df=m.sim_sir_w_date_floor_df)
60+
st.altair_chart(sim_sir_w_date_chart, use_container_width=True)
61+
display_download_link(
62+
st,
63+
filename=f"{p.current_date}_sim_sir_w_date.csv",
64+
df=m.sim_sir_w_date_df,
65+
)
66+
display_footer(st)

src/penn_chime/presentation.py src/penn_chime/view/st_display.py

+23-16
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,21 @@
1-
"""effectful functions for streamlit io"""
1+
"""Streamlit display."""
22

3-
from typing import Optional
4-
from datetime import date
5-
6-
import altair as alt
7-
import numpy as np
83
import os
94
import json
5+
106
import pandas as pd
11-
import penn_chime.spreadsheet as sp
12-
from .constants import (
7+
8+
from ..constants import (
139
CHANGE_DATE,
1410
DOCS_URL,
1511
EPSILON,
1612
FLOAT_INPUT_MIN,
1713
FLOAT_INPUT_STEP,
1814
VERSION,
1915
)
20-
21-
from .utils import dataframe_to_base64
22-
from .parameters import Parameters, Disposition
23-
from .models import SimSirModel as Model
16+
from ..model.parameters import Parameters, Disposition
17+
from ..utils import dataframe_to_base64
18+
from .spreadsheet import spreadsheet
2419

2520
hide_menu_style = """
2621
<style>
@@ -130,7 +125,11 @@ def __init__(
130125
key=None,
131126
):
132127
kwargs = dict(
133-
min_value=min_value, max_value=max_value, step=step, format=format, key=key
128+
min_value=min_value,
129+
max_value=max_value,
130+
step=step,
131+
format=format,
132+
key=key,
134133
)
135134
super().__init__(st_obj.number_input, label, value, kwargs)
136135

@@ -154,7 +153,14 @@ def __init__(
154153
key=None,
155154
):
156155
super().__init__(
157-
st_obj, label, min_value, max_value, value * 100.0, step, format, key
156+
st_obj,
157+
label,
158+
min_value,
159+
max_value,
160+
value * 100.0,
161+
step,
162+
format,
163+
key,
158164
)
159165

160166
def __call__(self):
@@ -226,7 +232,8 @@ def display_sidebar(st, d: Parameters) -> Parameters:
226232
min_value=FLOAT_INPUT_MIN,
227233
max_value=100.0
228234
)
229-
icu_pct_input = PercentInput(st_obj,
235+
icu_pct_input = PercentInput(
236+
st_obj,
230237
"ICU %(total infections)",
231238
min_value=0.0,
232239
value=d.icu.rate,
@@ -442,7 +449,7 @@ def subscribe(st_obj):
442449
def send_subscription_to_google_sheet(st_obj, row):
443450
json_secret = readGoogleApiSecretsDict()
444451
#print(json_secret)
445-
spr = sp.spreadsheet (st_obj, json_secret)
452+
spr = spreadsheet(st_obj, json_secret)
446453
spr.writeToSheet("CHIME Form Submissions", row)
447454

448455
def display_footer(st):

st_app.py

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
"""
2+
Run the streamlit app.
3+
4+
`pip install .` is required.
5+
6+
Module is in site-packages, and does not reflect any modifications made in the src directory.
7+
"""
8+
9+
from penn_chime.view.st_app import main
10+
11+
12+
if __name__ == '__main__':
13+
main()

tests/conftest.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
import pytest
44
import pandas as pd
55

6-
from src.penn_chime.parameters import (
6+
from penn_chime.model.parameters import (
77
Parameters,
88
Disposition,
99
Regions,
1010
)
11-
from src.penn_chime.models import SimSirModel, build_floor_df
11+
from penn_chime.model.sir import (
12+
Sir,
13+
build_floor_df,
14+
)
1215

1316

1417
class MockStreamlit:
@@ -100,12 +103,12 @@ def halving_param():
100103

101104
@pytest.fixture
102105
def model(param):
103-
return SimSirModel(param)
106+
return Sir(param)
104107

105108

106109
@pytest.fixture
107110
def halving_model(halving_param):
108-
return SimSirModel(halving_param)
111+
return Sir(halving_param)
109112

110113

111114
@pytest.fixture

tests/penn_chime/test_parameters.py tests/penn_chime/model/test_parameters.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Test Parameters."""
22

3-
from penn_chime.parameters import Parameters
3+
from penn_chime.model.parameters import Parameters
44

55

66
def test_cypress_defaults():

tests/penn_chime/test_models.py tests/penn_chime/model/test_sir.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,14 @@
55
import numpy as np
66
from datetime import timedelta
77

8-
from penn_chime.models import (
8+
from penn_chime.constants import EPSILON
9+
from penn_chime.model.sir import (
910
sir,
1011
sim_sir,
1112
get_growth_rate,
12-
SimSirModel,
13+
Sir,
1314
)
1415

15-
from src.penn_chime.constants import EPSILON
16-
1716

1817
def test_sir():
1918
"""
@@ -104,7 +103,7 @@ def test_model_first_hosp_fit(param):
104103
param.date_first_hospitalized = param.current_date - timedelta(days=43)
105104
param.doubling_time = None
106105

107-
my_model = SimSirModel(param)
106+
my_model = Sir(param)
108107

109108
assert abs(my_model.intrinsic_growth_rate - 0.123) / 0.123 < 0.01
110109
assert abs(my_model.beta - 4.21501347256401e-07) < EPSILON

tests/penn_chime/test_charts.py tests/penn_chime/view/test_charts.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import altair as alt
22
import pytest
33

4-
from penn_chime.charts import (
4+
from penn_chime.view.charts import (
55
build_admits_chart,
66
build_census_chart,
77
)

0 commit comments

Comments
 (0)