Update app.py
Browse files
app.py
CHANGED
|
@@ -3,7 +3,6 @@ import pandas as pd
|
|
| 3 |
import statsmodels.formula.api as smf
|
| 4 |
import statsmodels.api as sm
|
| 5 |
import plotly.graph_objects as go
|
| 6 |
-
from plotly.subplots import make_subplots
|
| 7 |
from scipy.optimize import minimize
|
| 8 |
import plotly.express as px
|
| 9 |
from scipy.stats import t, f
|
|
@@ -568,11 +567,13 @@ def load_data(x1_name, x2_name, x3_name, y_name, x1_levels_str, x2_levels_str, x
|
|
| 568 |
return data.round(3), x1_name, x2_name, x3_name, y_name, x1_levels, x2_levels, x3_levels, gr.update(visible=True)
|
| 569 |
|
| 570 |
except Exception as e:
|
| 571 |
-
|
|
|
|
|
|
|
| 572 |
|
| 573 |
def fit_and_optimize_model():
|
| 574 |
if 'rsm' not in globals():
|
| 575 |
-
return None,
|
| 576 |
|
| 577 |
# Ajustar modelos y optimizar
|
| 578 |
model_completo, pareto_completo = rsm.fit_model()
|
|
@@ -601,26 +602,23 @@ def fit_and_optimize_model():
|
|
| 601 |
contribution_table,
|
| 602 |
anova_table,
|
| 603 |
rsm.all_figures, # Devuelve todas las figuras generadas
|
| 604 |
-
|
| 605 |
)
|
| 606 |
|
| 607 |
-
def
|
| 608 |
if not all_figures:
|
| 609 |
return None, "No hay gráficos disponibles.", current_index
|
| 610 |
-
|
| 611 |
selected_fig = all_figures[current_index]
|
| 612 |
plot_info_text = f"Gráfico {current_index + 1} de {len(all_figures)}"
|
| 613 |
-
|
| 614 |
return selected_fig, plot_info_text, current_index
|
| 615 |
|
| 616 |
-
def navigate_plot(direction, current_index,
|
| 617 |
"""
|
| 618 |
Navega entre los gráficos.
|
| 619 |
|
| 620 |
Args:
|
| 621 |
direction (str): 'left' o 'right'.
|
| 622 |
current_index (int): Índice actual.
|
| 623 |
-
total_plots (int): Total de gráficos.
|
| 624 |
all_figures (list): Lista de todas las figuras.
|
| 625 |
|
| 626 |
Returns:
|
|
@@ -630,14 +628,14 @@ def navigate_plot(direction, current_index, total_plots, all_figures):
|
|
| 630 |
return None, "No hay gráficos disponibles.", current_index
|
| 631 |
|
| 632 |
if direction == 'left':
|
| 633 |
-
new_index = (current_index - 1) %
|
| 634 |
elif direction == 'right':
|
| 635 |
-
new_index = (current_index + 1) %
|
| 636 |
else:
|
| 637 |
new_index = current_index
|
| 638 |
|
| 639 |
selected_fig = all_figures[new_index]
|
| 640 |
-
plot_info_text = f"Gráfico {new_index + 1} de {
|
| 641 |
|
| 642 |
return selected_fig, plot_info_text, new_index
|
| 643 |
|
|
@@ -762,13 +760,15 @@ with gr.Blocks() as demo:
|
|
| 762 |
download_plot_button = gr.DownloadButton("Descargar Gráfico Actual (PNG)")
|
| 763 |
download_all_plots_button = gr.DownloadButton("Descargar Todos los Gráficos (ZIP)")
|
| 764 |
current_index_state = gr.State(0) # Estado para el índice actual
|
| 765 |
-
|
|
|
|
| 766 |
load_button.click(
|
| 767 |
load_data,
|
| 768 |
inputs=[x1_name_input, x2_name_input, x3_name_input, y_name_input, x1_levels_input, x2_levels_input, x3_levels_input, data_input],
|
| 769 |
outputs=[data_output, x1_name_input, x2_name_input, x3_name_input, y_name_input, x1_levels_input, x2_levels_input, x3_levels_input, analysis_row]
|
| 770 |
)
|
| 771 |
|
|
|
|
| 772 |
fit_button.click(
|
| 773 |
fit_and_optimize_model,
|
| 774 |
inputs=[],
|
|
@@ -783,75 +783,48 @@ with gr.Blocks() as demo:
|
|
| 783 |
contribution_table_output,
|
| 784 |
anova_table_output,
|
| 785 |
gr.State(), # all_figures
|
| 786 |
-
gr.State() # current_index
|
| 787 |
]
|
| 788 |
)
|
| 789 |
|
|
|
|
| 790 |
plot_button.click(
|
| 791 |
-
lambda: (
|
| 792 |
-
inputs=[],
|
| 793 |
outputs=[rsm_plot_output, plot_info, current_index_state]
|
| 794 |
)
|
| 795 |
|
| 796 |
# Navegación de gráficos
|
| 797 |
left_button.click(
|
| 798 |
-
navigate_plot,
|
| 799 |
-
inputs=[
|
| 800 |
outputs=[rsm_plot_output, plot_info, current_index_state]
|
| 801 |
)
|
| 802 |
right_button.click(
|
| 803 |
-
navigate_plot,
|
| 804 |
-
inputs=[
|
| 805 |
outputs=[rsm_plot_output, plot_info, current_index_state]
|
| 806 |
)
|
| 807 |
|
| 808 |
-
# Función para actualizar y mostrar el gráfico actual
|
| 809 |
-
def update_plot(direction, current_index, total_plots, all_figures):
|
| 810 |
-
return navigate_plot(direction, current_index, int(total_plots), all_figures)
|
| 811 |
-
|
| 812 |
# Descargar gráfico actual
|
| 813 |
download_plot_button.click(
|
| 814 |
download_current_plot,
|
| 815 |
inputs=[gr.State(), current_index_state],
|
| 816 |
-
outputs=[
|
| 817 |
)
|
| 818 |
|
| 819 |
# Descargar todos los gráficos en ZIP
|
| 820 |
download_all_plots_button.click(
|
| 821 |
download_all_plots_zip,
|
| 822 |
inputs=[gr.State()],
|
| 823 |
-
outputs=[
|
| 824 |
)
|
| 825 |
|
| 826 |
# Descargar todas las tablas en Excel
|
| 827 |
download_excel_button.click(
|
| 828 |
download_all_tables_excel,
|
| 829 |
inputs=[],
|
| 830 |
-
outputs=[
|
| 831 |
-
)
|
| 832 |
-
|
| 833 |
-
# Mostrar el primer gráfico después de generar todos
|
| 834 |
-
def show_first_plot(all_figures):
|
| 835 |
-
if not all_figures:
|
| 836 |
-
return None, "No hay gráficos disponibles.", 0
|
| 837 |
-
return all_figures[0], "Gráfico 1 de 9", 0
|
| 838 |
-
|
| 839 |
-
plot_button.click(
|
| 840 |
-
lambda: (None, "Gráfico 1 de 9", 0), # Placeholder para reiniciar el índice
|
| 841 |
-
inputs=[],
|
| 842 |
-
outputs=[rsm_plot_output, plot_info, current_index_state]
|
| 843 |
-
)
|
| 844 |
-
|
| 845 |
-
# Actualizar gráficos al navegar
|
| 846 |
-
left_button.click(
|
| 847 |
-
update_plot,
|
| 848 |
-
inputs=["left", current_index_state, gr.Number(value=9), gr.State()],
|
| 849 |
-
outputs=[rsm_plot_output, plot_info, current_index_state]
|
| 850 |
-
)
|
| 851 |
-
right_button.click(
|
| 852 |
-
update_plot,
|
| 853 |
-
inputs=["right", current_index_state, gr.Number(value=9), gr.State()],
|
| 854 |
-
outputs=[rsm_plot_output, plot_info, current_index_state]
|
| 855 |
)
|
| 856 |
|
| 857 |
# Ejemplo de uso
|
|
|
|
| 3 |
import statsmodels.formula.api as smf
|
| 4 |
import statsmodels.api as sm
|
| 5 |
import plotly.graph_objects as go
|
|
|
|
| 6 |
from scipy.optimize import minimize
|
| 7 |
import plotly.express as px
|
| 8 |
from scipy.stats import t, f
|
|
|
|
| 567 |
return data.round(3), x1_name, x2_name, x3_name, y_name, x1_levels, x2_levels, x3_levels, gr.update(visible=True)
|
| 568 |
|
| 569 |
except Exception as e:
|
| 570 |
+
# Nota: Para mostrar mensajes de error, Gradio necesita manejarlo de manera diferente
|
| 571 |
+
# Aquí, simplemente retornamos nada y ocultamos la sección de análisis
|
| 572 |
+
return None, "", "", "", "", [], [], [], gr.update(visible=False)
|
| 573 |
|
| 574 |
def fit_and_optimize_model():
|
| 575 |
if 'rsm' not in globals():
|
| 576 |
+
return [None]*10, 0
|
| 577 |
|
| 578 |
# Ajustar modelos y optimizar
|
| 579 |
model_completo, pareto_completo = rsm.fit_model()
|
|
|
|
| 602 |
contribution_table,
|
| 603 |
anova_table,
|
| 604 |
rsm.all_figures, # Devuelve todas las figuras generadas
|
| 605 |
+
0 # Inicializar el índice actual
|
| 606 |
)
|
| 607 |
|
| 608 |
+
def show_plot(all_figures, current_index):
|
| 609 |
if not all_figures:
|
| 610 |
return None, "No hay gráficos disponibles.", current_index
|
|
|
|
| 611 |
selected_fig = all_figures[current_index]
|
| 612 |
plot_info_text = f"Gráfico {current_index + 1} de {len(all_figures)}"
|
|
|
|
| 613 |
return selected_fig, plot_info_text, current_index
|
| 614 |
|
| 615 |
+
def navigate_plot(direction, current_index, all_figures):
|
| 616 |
"""
|
| 617 |
Navega entre los gráficos.
|
| 618 |
|
| 619 |
Args:
|
| 620 |
direction (str): 'left' o 'right'.
|
| 621 |
current_index (int): Índice actual.
|
|
|
|
| 622 |
all_figures (list): Lista de todas las figuras.
|
| 623 |
|
| 624 |
Returns:
|
|
|
|
| 628 |
return None, "No hay gráficos disponibles.", current_index
|
| 629 |
|
| 630 |
if direction == 'left':
|
| 631 |
+
new_index = (current_index - 1) % len(all_figures)
|
| 632 |
elif direction == 'right':
|
| 633 |
+
new_index = (current_index + 1) % len(all_figures)
|
| 634 |
else:
|
| 635 |
new_index = current_index
|
| 636 |
|
| 637 |
selected_fig = all_figures[new_index]
|
| 638 |
+
plot_info_text = f"Gráfico {new_index + 1} de {len(all_figures)}"
|
| 639 |
|
| 640 |
return selected_fig, plot_info_text, new_index
|
| 641 |
|
|
|
|
| 760 |
download_plot_button = gr.DownloadButton("Descargar Gráfico Actual (PNG)")
|
| 761 |
download_all_plots_button = gr.DownloadButton("Descargar Todos los Gráficos (ZIP)")
|
| 762 |
current_index_state = gr.State(0) # Estado para el índice actual
|
| 763 |
+
|
| 764 |
+
# Cargar datos
|
| 765 |
load_button.click(
|
| 766 |
load_data,
|
| 767 |
inputs=[x1_name_input, x2_name_input, x3_name_input, y_name_input, x1_levels_input, x2_levels_input, x3_levels_input, data_input],
|
| 768 |
outputs=[data_output, x1_name_input, x2_name_input, x3_name_input, y_name_input, x1_levels_input, x2_levels_input, x3_levels_input, analysis_row]
|
| 769 |
)
|
| 770 |
|
| 771 |
+
# Ajustar modelo y optimizar
|
| 772 |
fit_button.click(
|
| 773 |
fit_and_optimize_model,
|
| 774 |
inputs=[],
|
|
|
|
| 783 |
contribution_table_output,
|
| 784 |
anova_table_output,
|
| 785 |
gr.State(), # all_figures
|
| 786 |
+
gr.State() # current_index
|
| 787 |
]
|
| 788 |
)
|
| 789 |
|
| 790 |
+
# Generar y mostrar el primer gráfico
|
| 791 |
plot_button.click(
|
| 792 |
+
lambda all_figures: show_plot(all_figures, 0),
|
| 793 |
+
inputs=[gr.State()],
|
| 794 |
outputs=[rsm_plot_output, plot_info, current_index_state]
|
| 795 |
)
|
| 796 |
|
| 797 |
# Navegación de gráficos
|
| 798 |
left_button.click(
|
| 799 |
+
lambda current_index, all_figures: navigate_plot('left', current_index, all_figures),
|
| 800 |
+
inputs=[current_index_state, gr.State()],
|
| 801 |
outputs=[rsm_plot_output, plot_info, current_index_state]
|
| 802 |
)
|
| 803 |
right_button.click(
|
| 804 |
+
lambda current_index, all_figures: navigate_plot('right', current_index, all_figures),
|
| 805 |
+
inputs=[current_index_state, gr.State()],
|
| 806 |
outputs=[rsm_plot_output, plot_info, current_index_state]
|
| 807 |
)
|
| 808 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 809 |
# Descargar gráfico actual
|
| 810 |
download_plot_button.click(
|
| 811 |
download_current_plot,
|
| 812 |
inputs=[gr.State(), current_index_state],
|
| 813 |
+
outputs=[gr.File()]
|
| 814 |
)
|
| 815 |
|
| 816 |
# Descargar todos los gráficos en ZIP
|
| 817 |
download_all_plots_button.click(
|
| 818 |
download_all_plots_zip,
|
| 819 |
inputs=[gr.State()],
|
| 820 |
+
outputs=[gr.File()]
|
| 821 |
)
|
| 822 |
|
| 823 |
# Descargar todas las tablas en Excel
|
| 824 |
download_excel_button.click(
|
| 825 |
download_all_tables_excel,
|
| 826 |
inputs=[],
|
| 827 |
+
outputs=[gr.File()]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 828 |
)
|
| 829 |
|
| 830 |
# Ejemplo de uso
|