Spaces:
Sleeping
Sleeping
| # Example taken from here - https://shinylive.io/py/examples/#map | |
| import os | |
| import io | |
| from shiny import reactive, render, ui, App | |
| from plot_utils import show_one_plot, show_two_plots | |
| from data_utils import prepare_data, process_data_trees_to_temp, process_data_temp_to_trees | |
| import pandas as pd | |
| import geopandas as gpd | |
| import numpy as np | |
| og_file = "example.csv" | |
| # original_df, df, X, Y, T = prepare_data(og_file) | |
| app_ui = ui.page_fluid( | |
| ui.row( | |
| ui.column(8, | |
| ui.input_radio_buttons("tab_choice", "Seleccionar p谩gina:", ["Efecto de los 谩rboles en la temperatura", "Efecto de la temperatura en los 谩rboles"]), | |
| ui.output_ui("tab_slider"), | |
| ui.tooltip( | |
| ui.input_radio_buttons( | |
| "split_filter", | |
| "驴Aplicar filtro?", | |
| choices=["Sin filtro", "Filtro"], | |
| selected="Sin filtro" | |
| ), | |
| "Indica exceso de cobertura: marr贸n = l铆mite por construcci贸n, rojo = m谩s del 100%.", | |
| placement="right" | |
| ) | |
| ), | |
| ui.column(4, | |
| ui.input_file("csv_upload", "Subir archivo CSV", accept=[".csv"]), | |
| ui.input_radio_buttons( | |
| "simulation_mode", "Modo de simulaci贸n:", | |
| choices=["Usar control deslizante", "Usar simulaci贸n personalizada del CSV"], | |
| selected="Usar control deslizante" | |
| ), | |
| ui.download_button("download_csv", "Descargar simulaci贸n (CSV)") | |
| ) | |
| ), | |
| ui.row(ui.column(12, | |
| ui.output_ui("page_ui"))) | |
| ) | |
| def server(input, output, session): | |
| def tab_slider(): | |
| if input.tab_choice() == "Efecto de los 谩rboles en la temperatura": | |
| return ui.input_slider("tree_pct", "Aumento de cobertura arb贸rea (%)", min=0, max=100, value=40, step=5) | |
| else: # "Effect of temperature on trees" | |
| return ui.input_slider("temp_goal", "Disminuci贸n de la temperatura (掳C)", min=0, max=2, value=0.5, step=0.1) | |
| def user_data(): | |
| file_info = input.csv_upload() | |
| if file_info is None: | |
| return prepare_data(og_file) | |
| else: | |
| with open(file_info[0]["datapath"], "r", encoding="utf-8") as f: | |
| return prepare_data(f) | |
| def uploaded_filename(): | |
| file_info = input.csv_upload() | |
| if file_info is None: | |
| return "example_provided.csv" | |
| return file_info[0]["name"] | |
| def get_gdf_trees(): | |
| value_trees = input.tree_pct() | |
| simulation_mode = input.simulation_mode() | |
| print(f"value inputed is {value_trees}") | |
| original_df, df, X, Y, T = user_data() | |
| return process_data_trees_to_temp(value_trees, simulation_mode, original_df, df, X, Y, T) | |
| def get_gdf_temp(): | |
| value_temp = input.temp_goal() | |
| simulation_mode = input.simulation_mode() | |
| print(f"value inputed is {value_temp}") | |
| original_df, df, X, Y, T = user_data() | |
| return process_data_temp_to_trees(value_temp, simulation_mode, original_df, df, X, Y, T) | |
| def page_ui(): | |
| if input.tab_choice() == "Efecto de los 谩rboles en la temperatura": | |
| return ui.div( | |
| ui.h2("Visualizador de simulaci贸n: Aumento de la cobertura arb贸rea", class_="text-center"), | |
| ui.div(ui.output_plot("temp_after_treatment"), style="display: flex; justify-content: center;"), | |
| ui.div(ui.output_plot("temp_change"), style="display: flex; justify-content: center;"), | |
| ) | |
| else: #Effect of temperature on trees | |
| return ui.div( | |
| ui.h2("Visualizador de simulaci贸n: disminuir la temperatura", class_="text-center"), | |
| ui.div(ui.output_plot("trees_after_decrease"), style="display: flex; justify-content: center;"), | |
| ui.div(ui.output_plot("tree_coverage_change"), style="display: flex; justify-content: center;"), | |
| ) | |
| def temp_after_treatment(): | |
| gdf_trees = get_gdf_trees() | |
| value_trees = input.tree_pct() | |
| apply_filter = input.split_filter() | |
| if apply_filter == "Filtro": | |
| split = 'pct_total_trees' | |
| else: | |
| split = False | |
| min_temp = 15 | |
| max_temp = 35 | |
| simulation_mode = input.simulation_mode() | |
| title = "Temperatura estimada despu茅s del aumento de cobertura arb贸rea\n(simulaci贸n personalizada del CSV)" | |
| if simulation_mode == "Usar control deslizante": | |
| title = f"Temperatura estimada despu茅s del aumento de cobertura arb贸rea (+{value_trees}%)" | |
| try: | |
| fig = show_two_plots(gdf_trees, 'new_temp', 'LST', | |
| min_temp, max_temp, 'coolwarm',title, | |
| "Temperatura antes",'Temperatura (掳C)',split=split) | |
| return fig | |
| except Exception as e: | |
| print("Plotting error:", e) | |
| raise e | |
| def temp_change(): | |
| gdf_trees = get_gdf_trees() | |
| value_trees = input.tree_pct() | |
| most_temp_change = -2 | |
| no_temp_change = 0 | |
| simulation_mode = input.simulation_mode() | |
| title = "Disminuci贸n de la temperatura despu茅s del aumento de cobertura arb贸rea\n(simulaci贸n personalizada del CSV)" | |
| if simulation_mode == "Usar control deslizante": | |
| title = f"Disminuci贸n de la temperatura despu茅s del aumento de cobertura arb贸rea (+{value_trees}%) " | |
| fig = show_one_plot(gdf_trees, 'temp_decrease', most_temp_change, no_temp_change, | |
| 'PuBu_r', title, | |
| "Cambio de temperatura (掳C)") | |
| return fig | |
| def trees_after_decrease(): | |
| gdf_temp = get_gdf_temp() | |
| value_temp = input.temp_goal() | |
| apply_filter = input.split_filter() | |
| if apply_filter == "Filtro": | |
| split = 'pct_total_trees' | |
| else: | |
| split = False | |
| min_cobertura_veg = 5 | |
| max_cobertura = 100 | |
| simulation_mode = input.simulation_mode() | |
| title = "Estimaci贸n de cobertura arb贸rea necesaria para la disminuci贸n de temperatura\n(simulaci贸n personalizada del CSV)" | |
| if simulation_mode == "Usar control deslizante": | |
| title = f"Estimaci贸n de cobertura arb贸rea necesaria para una disminuci贸n de {value_temp}掳C" | |
| try: | |
| fig = show_two_plots(gdf_temp, 'pct_total_trees', 'Pct_CoberturaVeg', | |
| min_cobertura_veg, max_cobertura, 'YlGn', | |
| title,"Cobertura arb贸rea antes", | |
| "Cobertura arb贸rea (%)", split=split) | |
| return fig | |
| except Exception as e: | |
| print("Plotting error:", e) | |
| raise e | |
| def tree_coverage_change(): | |
| gdf_temp = get_gdf_temp() | |
| value_temp = input.temp_goal() | |
| min_tree_increase = 0 | |
| max_tree_increase = 90 | |
| simulation_mode = input.simulation_mode() | |
| title = "Aumento de cobertura arb贸rea necesario para la disminuci贸n de temperatura\n(simulaci贸n personalizada del CSV)" | |
| if simulation_mode == "Usar control deslizante": | |
| title = f"Aumento de cobertura arb贸rea necesario para disminuci贸n de {value_temp}掳C" | |
| fig = show_one_plot(gdf_temp, 'pp_trees_increase', min_tree_increase, | |
| max_tree_increase, 'Greens', | |
| title, | |
| "Cambio en cobertura arb贸rea (%pt)") | |
| return fig | |
| def get_filename(): | |
| simulation_mode = input.simulation_mode() | |
| uploaded_name = uploaded_filename() | |
| print(uploaded_name) | |
| if simulation_mode == "Usar control deslizante": | |
| if input.tab_choice() == "Efecto de los 谩rboles en la temperatura": | |
| filename = f"simulacion_arboles_{input.tree_pct()}pct.csv" | |
| else: | |
| filename = f"simulacion_temp_{input.temp_goal()}C.csv" | |
| else: | |
| if input.tab_choice() == "Efecto de los 谩rboles en la temperatura": | |
| filename = f"simulacion_arboles_desde_{uploaded_name}" | |
| else: | |
| filename = f"simulacion_temp_desde_{uploaded_name}" | |
| return filename | |
| def download_csv(): | |
| if input.tab_choice() == "Efecto de los 谩rboles en la temperatura": | |
| df = get_gdf_trees() | |
| else: | |
| df = get_gdf_temp() | |
| if not hasattr(df, "to_csv"): | |
| raise ValueError("Expected a DataFrame or GeoDataFrame") | |
| df = df.drop(columns="geometry", errors="ignore") | |
| buffer = io.StringIO() | |
| df.to_csv(buffer, index=False) | |
| buffer.seek(0) | |
| return buffer | |
| app = App(app_ui, server) | |