import json import pathlib import pandas as pd import streamlit as st from utils import call_subprocess from components import add_toggle_vertical def read_data(data): if data is not None: df = pd.read_csv(data) return df else: return None @st.cache_data def read_data_cached(data): return read_data(data) def generate_data(out_path, num_classes, num_observations, seed) -> None: call_subprocess( f"Rscript generate_data.R --out_path {out_path} --num_classes {num_classes} --num_observations {num_observations} --seed {seed}", message="Data generation script", return_output=True, encoding="UTF-8", ) class DownloadHeader: """ Class for showing header and download button (for an image file) in the same row. """ @staticmethod def slider_and_image_download( filepath, slider_label, toggle_label, download_label="Download", slider_min=0.0, slider_max=2.0, slider_value=1.0, slider_step=0.1, slider_help=None, toggle_value=False, toggle_cols=[2, 5], download_help="Download plot", key=None, ) -> int: col1, col2, col3, col4 = st.columns([2, 6, 3, 3]) with col2: # Image viewing size slider image_col_size = st.slider( slider_label, min_value=slider_min, max_value=slider_max, value=slider_value, step=slider_step, help=slider_help, key=key + "_slider" if key is not None else key, ) with col3: toggle_state = add_toggle_vertical( label=toggle_label, key=key + "_toggle" if key is not None else key, default=toggle_value, cols=toggle_cols, ) with col4: st.write("") with open(filepath, "rb") as img: st.download_button( label=download_label, data=img, file_name=pathlib.Path(filepath).name, mime="image/png", key=key + "_download" if key is not None else key, help=download_help, ) return image_col_size, toggle_state @staticmethod def _convert_df_to_csv(data, **kwargs): return data.to_csv(**kwargs).encode("utf-8") @staticmethod def header_and_data_download( header, data, file_name, col_sizes=[9, 2], key=None, label="Download", help="Download data", ): col1, col2 = st.columns(col_sizes) with col1: st.subheader(header) with col2: st.write("") st.download_button( label=label, data=DownloadHeader._convert_df_to_csv(data, index=False), file_name=file_name, key=key, help=help, ) @staticmethod def centered_json_download( data: dict, file_name, download_col_size=5, key=None, label="Download", help="Download json file", ): col1, col2, col1 = st.columns([5, download_col_size, 5]) with col2: data_json = json.dumps(data) st.download_button( label=label, data=data_json, file_name=file_name, key=key, mime="application/json", help=help, )