Skip to content

Commit a068838

Browse files
authored
Merge pull request #190 from CodeForPhilly/fix_189
Fix calculation of new infected cases
2 parents 7f7e33e + 9762b81 commit a068838

File tree

5 files changed

+21
-10
lines changed

5 files changed

+21
-10
lines changed

src/penn_chime/charts.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def admitted_patients_chart(
7474

7575
return (
7676
alt.Chart(census.head(plot_projection_days))
77-
.transform_fold(fold=["Hospitalized Census", "ICU Census", "Ventilated Census"])
77+
.transform_fold(fold=["Hospitalized", "ICU", "Ventilated"])
7878
.mark_line(point=True)
7979
.encode(
8080
x=alt.X(**x_kwargs),

src/penn_chime/models.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,10 @@ def sim_sir_df(p) -> pd.DataFrame:
7070

7171

7272
def get_dispositions(
73-
infected: np.ndarray, rates: Tuple[float, ...], market_share: float = 1.0
73+
patient_state: np.ndarray, rates: Tuple[float, ...], market_share: float = 1.0
7474
) -> Tuple[np.ndarray, ...]:
7575
"""Get dispositions of infected adjusted by rate and market_share."""
76-
return (*(infected * rate * market_share for rate in rates),)
77-
76+
return (*(patient_state * rate * market_share for rate in rates),)
7877

7978

8079
def build_admissions_df(p) -> pd.DataFrame:
@@ -86,7 +85,6 @@ def build_admissions_df(p) -> pd.DataFrame:
8685
projection = pd.DataFrame.from_dict(data_dict)
8786
# New cases
8887
projection_admits = projection.iloc[:-1, :] - projection.shift(1)
89-
projection_admits[projection_admits < 0] = 0
9088
projection_admits["day"] = range(projection_admits.shape[0])
9189
return projection_admits
9290

@@ -117,7 +115,7 @@ def build_census_df(
117115
census_df = census_df[["day", "Hospitalized", "ICU", "Ventilated"]]
118116
census_df = census_df.head(n_days)
119117
census_df = census_df.rename(
120-
columns={disposition: f"{disposition} Census"
118+
columns={disposition: f"{disposition}"
121119
for disposition
122120
in ("Hospitalized", "ICU", "Ventilated")}
123121
)

src/penn_chime/parameters.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,13 @@ def n_days(self, n_days: int):
112112
)
113113
self.susceptible_v, self.infected_v, self.recovered_v = s_v, i_v, r_v
114114

115-
self.dispositions = hospitalized_v, icu_v, ventilated_v = \
115+
i_hospitalized_v, i_icu_v, i_ventilated_v = \
116116
get_dispositions(i_v, self.rates, self.market_share)
117+
r_hospitalized_v, r_icu_v, r_ventilated_v = \
118+
get_dispositions(r_v, self.rates, self.market_share)
119+
120+
self.dispositions = (i_hospitalized_v+r_hospitalized_v,
121+
i_icu_v+r_icu_v, i_ventilated_v+r_ventilated_v)
122+
117123
self.hospitalized_v, self.icu_v, self.ventilated_v = \
118-
hospitalized_v, icu_v, ventilated_v
124+
i_hospitalized_v, i_icu_v, i_ventilated_v

src/penn_chime/presentation.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def display_header(st, p):
4444
""",
4545
unsafe_allow_html=True,
4646
)
47+
st.markdown("""**IMPORTANT NOTICE**: Admissions and Census calculations were previously **undercounting**. Please update your reports. See more about this issue [here](https://github.com/CodeForPhilly/chime/pull/190).""")
4748
st.markdown(
4849
"""*This tool was developed by the [Predictive Healthcare team](http://predictivehealthcare.pennmedicine.org/) at
4950
Penn Medicine. For questions on how to use this tool see the [User docs](https://code-for-philly.gitbook.io/chime/). For questions and comments please see our

tests/test_app.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import altair as alt # type: ignore
77

88
from src.penn_chime.charts import new_admissions_chart, admitted_patients_chart
9-
from src.penn_chime.models import sir, sim_sir
9+
from src.penn_chime.models import sir, sim_sir, build_admissions_df
1010
from src.penn_chime.parameters import Parameters
1111
from src.penn_chime.presentation import display_header
1212
from src.penn_chime.settings import DEFAULTS
@@ -228,8 +228,14 @@ def test_parameters():
228228
assert round(param.infected_v[1], 0) == 43735
229229
assert round(param.recovered_v[30], 0) == 224048
230230
assert [d[0] for d in param.dispositions] == [100.0, 40.0, 20.0]
231-
assert [round(d[-1], 0) for d in param.dispositions] == [115.0, 46.0, 23.0]
231+
assert [round(d[-1], 0) for d in param.dispositions] == [1182.0, 473.0, 236.0]
232232

233233
# change n_days, make sure it cascades
234234
param.n_days = 2
235235
assert len(param.susceptible_v) == len(param.infected_v) == len(param.recovered_v) == param.n_days + 1 == 3
236+
237+
# test that admissions are being properly calculated (thanks @PhilMiller)
238+
admissions = build_admissions_df(param)
239+
cumulative_admissions = admissions.cumsum()
240+
diff = cumulative_admissions["Hospitalized"][1:-1] - (0.05*0.05 * (param.infected_v[1:-1] + param.recovered_v[1:-1]) - 100)
241+
assert (diff.abs() < 0.1).all()

0 commit comments

Comments
 (0)