def prepare_visualization_group(df: DataFrame = None, **kwargs) -> List[Any]:
    """Creates plot, table and download link for data frame.
    """
    result = [{}, None, None]
    if df is not None and isinstance(df, DataFrame):
        plot_data = plot_dataframe(
            df.dropna().set_index("date").drop(columns=["day"]),
            max_y_axis=kwargs.get("max_y_axis", None),
        )

        table = (
            df_to_html_table(
                build_table(
                    df=df,
                    labels=kwargs.get("labels", df.columns),
                    modulo=kwargs.get("table_mod", 7),
                ),
                format={
                    float: int,
                    (date, datetime): lambda d: d.strftime(DATE_FORMAT),
                },
            )
            # if kwargs.get("show_tables", None)
            # else None
        )

        csv = build_csv_download(df)
        result = [plot_data, table, csv]

    return result
Beispiel #2
0
def build_tables(model, labels):
    '''
    builds CHIME tables
    '''

    tables = list()

    for title, attr in (
        ('New Admissions', 'admits_floor_df'),
        ('Admitted Patients (Census)', 'census_floor_df'),
        ('Susceptible, Infected, and Recovered', 'sim_sir_w_date_floor_df'),
    ):

        df = getattr(model, attr)

        columns = [{'field': c, 'title': c} for c in df.columns]
        data = build_table(df=df, labels=labels)

        tables.append({
            'title': title,
            'id': attr,
            'columns': columns,
            'data': data.to_json(orient='records'),
        })

    return tables
Beispiel #3
0
                                  admits_df=m.admits_df,
                                  max_y_axis=p.max_y_axis)
st.altair_chart(admits_chart, use_container_width=True)
st.markdown(build_descriptions(chart=admits_chart, labels=p.labels))
display_download_link(
    st,
    filename=f"{p.current_date}_projected_admits.csv",
    df=m.admits_df,
)

if st.checkbox("Show Projected Admissions in tabular form"):
    admits_modulo = 1
    if not st.checkbox("Show Daily Counts"):
        admits_modulo = 7
    table_df = build_table(df=m.admits_df,
                           labels=p.labels,
                           modulo=admits_modulo)
    st.table(table_df)

st.subheader("Admitted Patients (Census)")
st.markdown(
    "Projected **census** of COVID-19 patients, accounting for arrivals and discharges at Penn hospitals"
)
census_chart = build_census_chart(alt=alt,
                                  census_df=m.census_df,
                                  max_y_axis=p.max_y_axis)
st.altair_chart(census_chart, use_container_width=True)
st.markdown(
    build_descriptions(chart=census_chart, labels=p.labels, suffix=" Census"))
display_download_link(
    st,
Beispiel #4
0
def display_body_charts(m, p: "Parameters", d: "Parameters",
                        actuals: "pd.DataFrame", mode: "Mode"):

    st.subheader("New Hospital Admissions")
    admits_chart = build_admits_chart(alt=alt,
                                      admits_floor_df=m.admits_floor_df,
                                      p=p,
                                      actuals=actuals)
    st.altair_chart(admits_chart, use_container_width=True)
    zero_admits_warning(p)
    st.markdown(
        build_descriptions(
            chart=admits_chart,
            labels=p.admits_patient_chart_desc,
        ))
    display_download_link(
        filename=f"{p.current_date}_projected_admits.csv",
        df=m.admits_df,
    )

    if st.checkbox("Show Projected Admissions in tabular form"):
        admits_modulo = 1
        if not st.checkbox("Show Daily Counts"):
            admits_modulo = 7
        table_df = build_table(df=m.admits_floor_df,
                               labels=p.labels,
                               modulo=admits_modulo)
        st.table(table_df)

    st.subheader("Hospital Census")
    census_chart = build_census_chart(alt=alt,
                                      census_floor_df=m.census_floor_df,
                                      p=p,
                                      actuals=actuals)
    st.altair_chart(census_chart, use_container_width=True)
    # Display census mismatch message if appropriate
    census_mismatch_message(parameters=p, actuals=actuals, st=st)
    st.markdown(
        build_descriptions(
            chart=census_chart,
            labels=p.census_patient_chart_desc,
        ))
    display_download_link(
        filename=f"{p.current_date}_projected_census.csv",
        df=m.census_df,
    )
    if st.checkbox("Show Projected Census in tabular form"):
        census_modulo = 1
        if not st.checkbox("Show Daily Census Counts"):
            census_modulo = 7
        table_df = build_table(df=m.census_floor_df,
                               labels=p.labels,
                               modulo=census_modulo)
        st.table(table_df)

    st.subheader("COVID-19 Capacity")
    beds_chart = build_beds_chart(alt=alt,
                                  beds_floor_df=m.beds_df,
                                  parameters=p)
    st.altair_chart(beds_chart, use_container_width=True)
    st.markdown(
        build_bed_descriptions(chart=beds_chart, labels=p.beds_chart_desc))
    display_download_link(
        filename=f"{p.current_date}_projected_capacity.csv",
        df=m.beds_df,
    )

    if st.checkbox("Show Projected Capacity in tabular form"):
        beds_modulo = 1
        if not st.checkbox("Show Daily Capacity Counts"):
            beds_modulo = 7
        table_df = build_table(df=m.beds_floor_df,
                               labels=p.labels,
                               modulo=beds_modulo)
        st.table(table_df)

    st.subheader("Susceptible, Infected, and Recovered")
    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,
        actuals=actuals,
        p=p)
    st.altair_chart(sim_sir_w_date_chart, use_container_width=True)
    display_download_link(
        filename=f"{p.current_date}_sim_sir_w_date.csv",
        df=m.sim_sir_w_date_df,
    )

    if st.checkbox("Show SIR Simulation in tabular form"):
        table_df = build_table(df=m.sim_sir_w_date_floor_df, labels=p.labels)
        st.table(table_df)

    ### PPE Section
    st.subheader("Personal Protection Equipment")
    show_ppe_section = st.checkbox("Show PPE Charts", value=p.show_ppe_section)
    p.show_ppe_section = show_ppe_section
    if show_ppe_section:
        st.markdown("Quantity of PPE required per day")
        for pc in list(p.ppe_labels.keys())[3:]:
            ppe_chart = build_ppe_chart(alt=alt,
                                        ppe_floor_df=m.ppe_floor_df,
                                        p=p,
                                        plot_columns=pc)
            st.altair_chart(ppe_chart, use_container_width=True)
            st.markdown(
                build_ppe_descriptions(chart=ppe_chart,
                                       label=p.ppe_labels[pc]["label"]))
            st.markdown("  \n  \n")
        display_download_link(
            filename=f"{p.current_date}_projected_ppe_required.csv",
            df=m.ppe_df,
        )
        if st.checkbox("Show Projected PPE Required in tabular form"):
            ppe_modulo = 1
            if not st.checkbox("Show Daily PPE Required"):
                ppe_modulo = 7
            table_df = build_table(df=m.ppe_floor_df,
                                   labels=p.labels,
                                   modulo=ppe_modulo)
            st.dataframe(table_df)

    ### Staffing Section
    st.subheader("Staffing")
    show_staffing_section = st.checkbox("Show Staffing Charts",
                                        value=p.show_staffing_section)
    p.show_staffing_section = show_staffing_section
    if show_staffing_section:
        st.markdown("Number of staff required per day")
        for pc in list(p.staffing_labels.keys())[3:]:
            staffing_chart = build_staffing_chart(
                alt=alt,
                staffing_floor_df=m.staffing_floor_df,
                p=p,
                plot_columns=pc)
            st.altair_chart(staffing_chart, use_container_width=True)
            st.markdown(
                build_staffing_descriptions(
                    chart=staffing_chart,
                    label=p.staffing_labels[pc]["label"],
                    shift_duration=p.shift_duration))
            st.markdown("  \n  \n")
        display_download_link(
            filename=f"{p.current_date}_projected_staffing_required.csv",
            df=m.staffing_df,
        )
        if st.checkbox("Show Projected Staffing Required in tabular form"):
            staffing_modulo = 1
            if not st.checkbox("Show Daily Staffing Required"):
                staffing_modulo = 7
            table_df = build_table(df=m.staffing_floor_df,
                                   labels=p.labels,
                                   modulo=staffing_modulo)
            st.dataframe(table_df)

    ### Export Full Data and Parameters
    st.header("Export Full Data and Parameters")
    df = build_data_and_params(projection_admits=m.admits_df,
                               census_df=m.census_df,
                               beds_df=m.beds_df,
                               ppe_df=m.ppe_df,
                               staffing_df=m.staffing_df,
                               model=m,
                               parameters=p)

    if st.checkbox("Show full data and parameters to be exported"):
        st.dataframe(df)

    filename = "Data" + "_" + p.author + "_" + p.scenario + "_" + (
        datetime.datetime.utcnow() -
        datetime.timedelta(hours=6)).isoformat() + ".csv"
    csv = dataframe_to_base64(df)
    st.markdown("""
            <a download="{filename}" href="data:text/plain;base64,{csv}">Download full table as CSV</a>
    """.format(csv=csv, filename=filename),
                unsafe_allow_html=True)

    if actuals is not None:
        if st.checkbox("Display Uploaded Actuals"):
            st.dataframe(actuals)
Beispiel #5
0
def prepare_visualization_group(df: DataFrame = None, **kwargs) -> List[Any]:
    """Creates plot, table and download link for data frame.

    Arguments:
        df: The Dataframe to plot
        content: Dict[str, str]
            Mapping for translating columns and index.
        max_y_axis:  int
            Maximal value on y-axis
        labels: List[str]
            Columns to display
        table_mod: int
            Displays only each `table_mod` row in table

    """
    result = [{}, None, None]
    if df is not None and isinstance(df, DataFrame):

        date_column = "date"
        day_column = "day"

        # Translate column and index if specified
        content = kwargs.get("content", None)
        if content:
            columns = {
                col: content[col]
                for col in df.columns if col in content
            }
            index = ({
                df.index.name: content[df.index.name]
            } if df.index.name and df.index.name in content else None)
            df = df.rename(columns=columns, index=index)
            date_column = content.get(date_column, date_column)
            day_column = content.get(day_column, day_column)

        plot_data = plot_dataframe(
            df.dropna().set_index(date_column).drop(columns=[day_column]),
            max_y_axis=kwargs.get("max_y_axis", None),
        )

        # translate back for backwards compability of build_table
        column_map = {day_column: "day", date_column: "date"}
        table = (
            df_to_html_table(
                build_table(
                    df=df.rename(columns=column_map),
                    labels=kwargs.get("labels", df.columns),
                    modulo=kwargs.get("table_mod", 7),
                ),
                formats={
                    float: int,
                    (date, datetime): lambda d: d.strftime(DATE_FORMAT),
                },
            )
            # if kwargs.get("show_tables", None)
            # else None
        )

        # Convert columnnames to lowercase
        column_map = {col: col.lower() for col in df.columns}
        csv = build_csv_download(df.rename(columns=column_map))
        result = [plot_data, table, csv]

    return result