Skip to content

Commit d99d75f

Browse files
authored
Merge branch 'develop' into fix_parameters
2 parents e4717e8 + fa8b692 commit d99d75f

File tree

12 files changed

+227
-119
lines changed

12 files changed

+227
-119
lines changed

src/app.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
st.markdown("Projected number of **daily** COVID-19 admissions. \n\n _NOTE: Now including estimates of prior admissions for comparison._")
3939
admits_chart = build_admits_chart(alt=alt, admits_floor_df=m.admits_floor_df, max_y_axis=p.max_y_axis)
4040
st.altair_chart(admits_chart, use_container_width=True)
41-
st.markdown(build_descriptions(chart=admits_chart, labels=p.labels, suffix=" Admissions"))
41+
st.markdown(build_descriptions(chart=admits_chart, labels=p.labels, prefix="admits_", suffix=" Admissions"))
4242
display_download_link(
4343
st,
4444
filename=f"{p.current_date}_projected_admits.csv",
@@ -60,7 +60,7 @@
6060
st.markdown("Projected **census** of COVID-19 patients, accounting for arrivals and discharges \n\n _NOTE: Now including estimates of prior census for comparison._")
6161
census_chart = build_census_chart(alt=alt, census_floor_df=m.census_floor_df, max_y_axis=p.max_y_axis)
6262
st.altair_chart(census_chart, use_container_width=True)
63-
st.markdown(build_descriptions(chart=census_chart, labels=p.labels, suffix=" Census"))
63+
st.markdown(build_descriptions(chart=census_chart, labels=p.labels, prefix="census_", suffix=" Census"))
6464
display_download_link(
6565
st,
6666
filename=f"{p.current_date}_projected_census.csv",

src/chime_dash/app/services/callbacks.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,14 @@ def handle_model_change(i, sidebar_data):
3838
if sidebar_data:
3939
pars = parameters_deserializer(sidebar_data["parameters"])
4040
model = SimSirModel(pars)
41+
vis = i.components.get("visualizations", None) if i else None
42+
vis_content = vis.content if vis else None
43+
4144
viz_kwargs = dict(
4245
labels=pars.labels,
4346
table_mod=7,
4447
max_y_axis=pars.max_y_axis,
48+
content=vis_content
4549
)
4650
result.extend(i.components["intro"].build(model, pars))
4751
for df_key in ["admits_df", "census_df", "sim_sir_w_date_df"]:

src/chime_dash/app/services/plotting.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,17 @@
77
from pandas import DataFrame
88

99

10-
def plot_dataframe(dataframe: DataFrame, max_y_axis: int = None,) -> Dict[str, Any]:
11-
"""
10+
def plot_dataframe(
11+
dataframe: DataFrame,
12+
max_y_axis: int = None,
13+
) -> Dict[str, Any]:
14+
"""Returns dictionary used for plotly graphs
15+
16+
Arguments:
17+
dataframe: The dataframe to plot. Plots all columns as y, index is x.
18+
max_y_axis: Maximal value on y-axis.
1219
"""
20+
1321
if max_y_axis is None:
1422
yaxis = {}
1523
else:

src/chime_dash/app/templates/en/visualizations.yml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,20 @@ hosp: Hospitalized
1616
icu: ICU
1717
vent: Ventalized
1818

19+
# Admits df column translations
20+
admits_hospitalized: Hospitalized
21+
admits_icu: ICU
22+
admits_ventilated: Ventilated
23+
24+
# Admits df column translations
25+
census_hospitalized: Hospitalized
26+
census_icu: ICU
27+
census_ventilated: Ventilated
28+
29+
# SIR df column translations
30+
susceptible: Susceptible
31+
infected: Infected
32+
recovered: Recovered
33+
1934
# Date Localization
2035
date-format: "%m%d%Y"

src/chime_dash/app/utils/__init__.py

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,18 +117,50 @@ def get_n_switch_values(input_value, elements_to_update) -> List[bool]:
117117

118118
def prepare_visualization_group(df: DataFrame = None, **kwargs) -> List[Any]:
119119
"""Creates plot, table and download link for data frame.
120+
121+
Arguments:
122+
df: The Dataframe to plot
123+
content: Dict[str, str]
124+
Mapping for translating columns and index.
125+
max_y_axis: int
126+
Maximal value on y-axis
127+
labels: List[str]
128+
Columns to display
129+
table_mod: int
130+
Displays only each `table_mod` row in table
131+
120132
"""
121133
result = [{}, None, None]
122134
if df is not None and isinstance(df, DataFrame):
135+
136+
date_column = "date"
137+
day_column = "day"
138+
139+
# Translate column and index if specified
140+
content = kwargs.get("content", None)
141+
if content:
142+
columns = {col: content[col] for col in df.columns if col in content}
143+
index = (
144+
{df.index.name: content[df.index.name]}
145+
if df.index.name and df.index.name in content
146+
else None
147+
)
148+
df = df.rename(columns=columns, index=index)
149+
date_column = content.get(date_column, date_column)
150+
day_column = content.get(day_column, day_column)
151+
123152
plot_data = plot_dataframe(
124-
df.dropna().set_index("date").drop(columns=["day"]),
153+
df.dropna().set_index(date_column).drop(columns=[day_column]),
125154
max_y_axis=kwargs.get("max_y_axis", None),
126155
)
127156

157+
158+
# translate back for backwards compability of build_table
159+
column_map = {day_column: "day", date_column: "date"}
128160
table = (
129161
df_to_html_table(
130162
build_table(
131-
df=df,
163+
df=df.rename(columns=column_map),
132164
labels=kwargs.get("labels", df.columns),
133165
modulo=kwargs.get("table_mod", 7),
134166
),
@@ -141,7 +173,9 @@ def prepare_visualization_group(df: DataFrame = None, **kwargs) -> List[Any]:
141173
# else None
142174
)
143175

144-
csv = build_csv_download(df)
176+
# Convert columnnames to lowercase
177+
column_map = {col: col.lower() for col in df.columns}
178+
csv = build_csv_download(df.rename(columns=column_map))
145179
result = [plot_data, table, csv]
146180

147181
return result
@@ -154,4 +188,5 @@ def get_instance(*args, **kwargs):
154188
if class_ not in instances:
155189
instances[class_] = class_(*args, **kwargs)
156190
return instances[class_]
191+
157192
return get_instance

src/penn_chime/charts.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def build_admits_chart(
2626
# TODO fix the fold to allow any number of dispositions
2727
points = (
2828
alt.Chart()
29-
.transform_fold(fold=["hospitalized", "icu", "ventilated"])
29+
.transform_fold(fold=["admits_hospitalized", "admits_icu", "admits_ventilated"])
3030
.encode(x=alt.X(**x), y=alt.Y(**y), color=color, tooltip=tooltip)
3131
.mark_line(point=True)
3232
.encode(
@@ -65,7 +65,7 @@ def build_census_chart(
6565
# TODO fix the fold to allow any number of dispositions
6666
points = (
6767
alt.Chart()
68-
.transform_fold(fold=["hospitalized", "icu", "ventilated"])
68+
.transform_fold(fold=["census_hospitalized", "census_icu", "census_ventilated"])
6969
.encode(x=alt.X(**x), y=alt.Y(**y), color=color, tooltip=tooltip)
7070
.mark_line(point=True)
7171
.encode(
@@ -128,7 +128,11 @@ def build_sim_sir_w_date_chart(
128128

129129

130130
def build_descriptions(
131-
*, chart: Chart, labels: Dict[str, str], suffix: str = ""
131+
*,
132+
chart: Chart,
133+
labels: Dict[str, str],
134+
prefix: str = "",
135+
suffix: str = ""
132136
) -> str:
133137
"""
134138
@@ -145,17 +149,17 @@ def build_descriptions(
145149
day = "date" if "date" in chart.data.columns else "day"
146150

147151
for col in cols:
148-
if chart.data[col].idxmax() + 1 == len(chart.data):
152+
if chart.data[prefix+col].idxmax() + 1 == len(chart.data):
149153
asterisk = True
150154

151155
# todo: bring this to an optional arg / i18n
152-
on = datetime.strftime(chart.data[day][chart.data[col].idxmax()], "%b %d")
156+
on = datetime.strftime(chart.data[day][chart.data[prefix+col].idxmax()], "%b %d")
153157

154158
messages.append(
155159
"{}{} peaks at {:,} on {}{}".format(
156160
labels[col],
157161
suffix,
158-
ceil(chart.data[col].max()),
162+
ceil(chart.data[prefix+col].max()),
159163
on,
160164
"*" if asterisk else "",
161165
)

0 commit comments

Comments
 (0)