Skip to content

Commit bc69118

Browse files
authored
Changes_for_v1_1_1
Changes for v1.1.1 with model changes.
2 parents 2315561 + 971f363 commit bc69118

File tree

9 files changed

+78
-46
lines changed

9 files changed

+78
-46
lines changed

e2e/cypress/integration/tests/steppers.spec.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ context('Increment steppers', () => {
66
});
77

88
it('Increment regional population', () => {
9-
cy.contains('Hospitalized Admissions peaks at 301');
9+
cy.contains('Hospitalized Admissions peaks at 300');
1010

1111
cy.get('input.st-al').eq(0)
1212
.should('has.value', '3600000');
@@ -16,11 +16,11 @@ context('Increment steppers', () => {
1616
cy.get('input.st-al').eq(0)
1717
.should('has.value', '3600001');
1818

19-
cy.contains('Hospitalized Admissions peaks at 301');
19+
cy.contains('Hospitalized Admissions peaks at 300');
2020
});
2121

2222
it('Increment hospital market share', () => {
23-
cy.contains('Hospitalized Admissions peaks at 301');
23+
cy.contains('Hospitalized Admissions peaks at 300');
2424

2525
cy.get('input.st-al').eq(1)
2626
.should('has.value', '15');
@@ -30,11 +30,11 @@ context('Increment steppers', () => {
3030
cy.get('input.st-al').eq(1)
3131
.should('has.value', '15.1');
3232

33-
cy.contains('Hospitalized Admissions peaks at 303');
33+
cy.contains('Hospitalized Admissions peaks at 302');
3434
});
3535

3636
it('Increment doubling time', () => {
37-
cy.contains('Hospitalized Admissions peaks at 301');
37+
cy.contains('Hospitalized Admissions peaks at 300');
3838

3939
cy.get('input.st-al').eq(3)
4040
.should('has.value', '4');
@@ -44,6 +44,6 @@ context('Increment steppers', () => {
4444
cy.get('input.st-al').eq(3)
4545
.should('has.value', '4.25');
4646

47-
cy.contains('Hospitalized Admissions peaks at 273');
47+
cy.contains('Hospitalized Admissions peaks at 272');
4848
});
4949
});

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Setup file for chime
22
"""
3-
__version__ = "1.1.0"
3+
__version__ = "1.1.1"
44
__author__ = "Predictive Healthcare @ Penn Medicine"
55

66
from os import path

src/app.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040

4141
st.subheader("New Admissions")
4242
st.markdown("Projected number of **daily** COVID-19 admissions. \n\n _NOTE: Now including estimates of prior admissions for comparison._")
43-
admits_chart = build_admits_chart(alt=alt, admits_df=m.admits_df, max_y_axis=p.max_y_axis)
43+
admits_chart = build_admits_chart(alt=alt, admits_floor_df=m.admits_floor_df, max_y_axis=p.max_y_axis)
4444
st.altair_chart(admits_chart, use_container_width=True)
4545
st.markdown(build_descriptions(chart=admits_chart, labels=p.labels, suffix=" Admissions"))
4646
display_download_link(
@@ -54,15 +54,15 @@
5454
if not st.checkbox("Show Daily Counts"):
5555
admits_modulo = 7
5656
table_df = build_table(
57-
df=m.admits_df,
57+
df=m.admits_floor_df,
5858
labels=p.labels,
5959
modulo=admits_modulo)
6060
st.table(table_df)
6161

6262

6363
st.subheader("Admitted Patients (Census)")
6464
st.markdown("Projected **census** of COVID-19 patients, accounting for arrivals and discharges \n\n _NOTE: Now including estimates of prior census for comparison._")
65-
census_chart = build_census_chart(alt=alt, census_df=m.census_df, max_y_axis=p.max_y_axis)
65+
census_chart = build_census_chart(alt=alt, census_floor_df=m.census_floor_df, max_y_axis=p.max_y_axis)
6666
st.altair_chart(census_chart, use_container_width=True)
6767
st.markdown(build_descriptions(chart=census_chart, labels=p.labels, suffix=" Census"))
6868
display_download_link(
@@ -76,15 +76,15 @@
7676
if not st.checkbox("Show Daily Census Counts"):
7777
census_modulo = 7
7878
table_df = build_table(
79-
df=m.census_df,
79+
df=m.census_floor_df,
8080
labels=p.labels,
8181
modulo=census_modulo)
8282
st.table(table_df)
8383

8484

8585
st.subheader("Susceptible, Infected, and Recovered")
8686
st.markdown("The number of susceptible, infected, and recovered individuals in the hospital catchment region at any given moment")
87-
sim_sir_w_date_chart = build_sim_sir_w_date_chart(alt=alt, sim_sir_w_date_df=m.sim_sir_w_date_df)
87+
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)
8888
st.altair_chart(sim_sir_w_date_chart, use_container_width=True)
8989
display_download_link(
9090
st,
@@ -94,7 +94,7 @@
9494

9595
if st.checkbox("Show SIR Simulation in tabular form"):
9696
table_df = build_table(
97-
df=m.sim_sir_w_date_df,
97+
df=m.sim_sir_w_date_floor_df,
9898
labels=p.labels)
9999
st.table(table_df)
100100

src/penn_chime/charts.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,14 @@
1414
def build_admits_chart(
1515
*,
1616
alt,
17-
admits_df: pd.DataFrame,
17+
admits_floor_df: pd.DataFrame,
1818
max_y_axis: Optional[int] = None,
1919
) -> Chart:
2020
"""Build admits chart."""
2121
y_scale = alt.Scale()
2222
if max_y_axis is not None:
2323
y_scale.domain = (0, max_y_axis)
2424

25-
ceil_df = admits_df.copy()
26-
ceil_df.hospitalized = np.ceil(ceil_df.hospitalized)
27-
ceil_df.icu = np.ceil(ceil_df.icu)
28-
ceil_df.ventilated = np.ceil(ceil_df.ventilated)
29-
3025
x = dict(shorthand="date:T", title="Date", axis=alt.Axis(format=(DATE_FORMAT)))
3126
y = dict(shorthand="value:Q", title="Daily admissions", scale=y_scale)
3227
color = "key:N"
@@ -45,14 +40,14 @@ def build_admits_chart(
4540
.transform_filter(alt.datum.day == 0)
4641
.mark_rule(color="black", opacity=0.35, size=2)
4742
)
48-
return alt.layer(points, bar, data=ceil_df)
43+
return alt.layer(points, bar, data=admits_floor_df)
4944

5045

5146

5247
def build_census_chart(
5348
*,
5449
alt,
55-
census_df: pd.DataFrame,
50+
census_floor_df: pd.DataFrame,
5651
max_y_axis: Optional[int] = None,
5752
) -> Chart:
5853
"""Build census chart."""
@@ -78,13 +73,13 @@ def build_census_chart(
7873
.transform_filter(alt.datum.day == 0)
7974
.mark_rule(color="black", opacity=0.35, size=2)
8075
)
81-
return alt.layer(points, bar, data=census_df)
76+
return alt.layer(points, bar, data=census_floor_df)
8277

8378

8479
def build_sim_sir_w_date_chart(
8580
*,
8681
alt,
87-
sim_sir_w_date_df: pd.DataFrame,
82+
sim_sir_w_date_floor_df: pd.DataFrame,
8883
max_y_axis: Optional[int] = None,
8984
) -> Chart:
9085
"""Build sim sir w date chart."""
@@ -110,7 +105,7 @@ def build_sim_sir_w_date_chart(
110105
.transform_filter(alt.datum.day == 0)
111106
.mark_rule(color="black", opacity=0.35, size=2)
112107
)
113-
return alt.layer(points, bar, data=sim_sir_w_date_df)
108+
return alt.layer(points, bar, data=sim_sir_w_date_floor_df)
114109

115110

116111
def build_descriptions(
@@ -162,5 +157,6 @@ def build_table(
162157
modulo: int = 1,
163158
) -> pd.DataFrame:
164159
table_df = df[np.mod(df.day, modulo) == 0].copy()
160+
table_df.date = table_df.date.dt.strftime(DATE_FORMAT)
165161
table_df.rename(labels)
166162
return table_df

src/penn_chime/constants.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
longer match current results, indicating when users should
88
re-run their reports
99
"""
10-
CHANGE_DATE = date(year=2020, month=3, day=30)
10+
CHANGE_DATE = date(year=2020, month=4, day=1)
1111

1212
DATE_FORMAT = "%b, %d" # see https://strftime.org
1313
DOCS_URL = "https://code-for-philly.gitbook.io/chime"

src/penn_chime/models.py

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from datetime import date, datetime, timedelta
1010
from logging import INFO, basicConfig, getLogger
1111
from sys import stdout
12-
from typing import Dict, Generator, Tuple, Optional
12+
from typing import Dict, Generator, Tuple, Sequence,Optional
1313

1414
import numpy as np
1515
import pandas as pd
@@ -40,6 +40,8 @@ def __init__(self, p: Parameters):
4040
for key, d in p.dispositions.items()
4141
}
4242

43+
self.keys = ("susceptible", "infected", "recovered")
44+
4345
# Note: this should not be an integer.
4446
# We're appoximating infected from what we do know.
4547
# TODO market_share > 0, hosp_rate > 0
@@ -153,7 +155,11 @@ def __init__(self, p: Parameters):
153155
self.beta_t * susceptible - gamma + 1)
154156
self.doubling_time_t = doubling_time_t
155157

156-
self.sim_sir_w_date_df = build_sim_sir_w_date_df(self.raw_df, p.current_date)
158+
self.sim_sir_w_date_df = build_sim_sir_w_date_df(self.raw_df, p.current_date, self.keys)
159+
160+
self.sim_sir_w_date_floor_df = build_floor_df(self.sim_sir_w_date_df, self.keys)
161+
self.admits_floor_df = build_floor_df(self.admits_df, p.dispositions.keys())
162+
self.census_floor_df = build_floor_df(self.census_df, p.dispositions.keys())
157163

158164
self.daily_growth_rate = get_growth_rate(p.doubling_time)
159165
self.daily_growth_rate_t = get_growth_rate(self.doubling_time_t)
@@ -252,7 +258,8 @@ def gen_sir(
252258

253259

254260
def sim_sir_df(
255-
s: float, i: float, r: float, gamma: float, i_day: int, *args
261+
s: float, i: float, r: float,
262+
gamma: float, i_day: int, *args
256263
) -> pd.DataFrame:
257264
"""Simulate the SIR model forward in time."""
258265
return pd.DataFrame(
@@ -264,14 +271,28 @@ def sim_sir_df(
264271
def build_sim_sir_w_date_df(
265272
raw_df: pd.DataFrame,
266273
current_date: datetime,
274+
keys: Sequence[str],
267275
) -> pd.DataFrame:
268276
day = raw_df.day
269277
return pd.DataFrame({
270278
"day": day,
271279
"date": day.astype('timedelta64[D]') + np.datetime64(current_date),
272-
"susceptible": raw_df.susceptible,
273-
"infected": raw_df.infected,
274-
"recovered": raw_df.recovered,
280+
**{
281+
key: raw_df[key]
282+
for key in keys
283+
}
284+
})
285+
286+
287+
def build_floor_df(df, keys):
288+
"""Build floor sim sir w date."""
289+
return pd.DataFrame({
290+
"day": df.day,
291+
"date": df.date,
292+
**{
293+
key: np.floor(df[key])
294+
for key in keys
295+
}
275296
})
276297

277298

@@ -314,7 +335,7 @@ def build_census_df(
314335
key: (
315336
admits_df[key].cumsum()
316337
- admits_df[key].cumsum().shift(los).fillna(0)
317-
).apply(np.ceil)
338+
)
318339
for key, los in lengths_of_stay.items()
319340
}
320341
})

src/penn_chime/presentation.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,9 @@ def display_sidebar(st, d: Parameters) -> Parameters:
279279

280280
# Build in desired order
281281
st.sidebar.markdown(
282-
"""**CHIME [v1.1.0](https://github.com/CodeForPhilly/chime/releases/tag/v1.1.0) (2020/03/30)**"""
282+
"""**CHIME [v1.1.1](https://github.com/CodeForPhilly/chime/releases/tag/v1.1.1) ({change_date})**""".format(
283+
change_date=CHANGE_DATE
284+
)
283285
)
284286

285287
st.sidebar.markdown(

tests/conftest.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
Disposition,
99
Regions,
1010
)
11-
from src.penn_chime.models import SimSirModel
11+
from src.penn_chime.models import SimSirModel, build_floor_df
1212

1313

1414
class MockStreamlit:
@@ -107,8 +107,18 @@ def admits_df():
107107
)
108108

109109

110+
@pytest.fixture
111+
def admits_floor_df(param, admits_df):
112+
return build_floor_df(admits_df, param.dispositions.keys())
113+
114+
110115
@pytest.fixture
111116
def census_df():
112117
return pd.read_csv(
113118
"tests/by_doubling_time/2020-03-28_projected_census.csv", parse_dates=["date"]
114119
)
120+
121+
@pytest.fixture
122+
def census_floor_df(param, census_df):
123+
return build_floor_df(census_df, param.dispositions.keys())
124+

tests/penn_chime/test_charts.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,21 @@
1313
# TODO add test for asterisk
1414

1515

16-
def test_admits_chart(admits_df):
17-
chart = build_admits_chart(alt=alt, admits_df=admits_df)
16+
DISPOSITION_KEYS = ("hospitalized", "icu", "ventilated")
17+
18+
19+
def test_admits_chart(admits_floor_df):
20+
chart = build_admits_chart(alt=alt, admits_floor_df=admits_floor_df)
1821
assert isinstance(chart, (alt.Chart, alt.LayerChart))
19-
assert round(chart.data.iloc[40].icu, 0) == 39
22+
assert round(chart.data.iloc[40].icu, 0) == 38
2023

2124
# test fx call with no params
2225
with pytest.raises(TypeError):
2326
build_admits_chart()
2427

2528

26-
def test_build_descriptions(admits_df, param):
27-
chart = build_admits_chart(alt=alt, admits_df=admits_df)
29+
def test_build_descriptions(admits_floor_df, param):
30+
chart = build_admits_chart(alt=alt, admits_floor_df=admits_floor_df)
2831
description = build_descriptions(chart=chart, labels=param.labels)
2932

3033
hosp, icu, vent = description.split("\n\n") # break out the description into lines
@@ -33,16 +36,16 @@ def test_build_descriptions(admits_df, param):
3336
assert str(ceil(max_hosp)) in hosp
3437

3538

36-
def test_no_asterisk(admits_df, param):
39+
def test_no_asterisk(admits_floor_df, param):
3740
param.n_days = 600
3841

39-
chart = build_admits_chart(alt=alt, admits_df=admits_df)
42+
chart = build_admits_chart(alt=alt, admits_floor_df=admits_floor_df)
4043
description = build_descriptions(chart=chart, labels=param.labels)
4144
assert "*" not in description
4245

4346

44-
def test_census(census_df, param):
45-
chart = build_census_chart(alt=alt, census_df=census_df)
47+
def test_census(census_floor_df, param):
48+
chart = build_census_chart(alt=alt, census_floor_df=census_floor_df)
4649
description = build_descriptions(chart=chart, labels=param.labels)
4750

4851
assert str(ceil(chart.data["ventilated"].max())) in description
@@ -53,12 +56,12 @@ def test_census(census_df, param):
5356
)
5457

5558

56-
def test_census_chart(census_df):
57-
chart = build_census_chart(alt=alt, census_df=census_df)
59+
def test_census_chart(census_floor_df):
60+
chart = build_census_chart(alt=alt, census_floor_df=census_floor_df)
5861
assert isinstance(chart, (alt.Chart, alt.LayerChart))
5962
assert chart.data.iloc[1].hospitalized == 3
6063
assert chart.data.iloc[49].ventilated == 365
6164

6265
# test fx call with no params
6366
with pytest.raises(TypeError):
64-
build_census_chart()
67+
build_census_chart()

0 commit comments

Comments
 (0)