C2MV commited on
Commit
1c36a23
1 Parent(s): 68fa249

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +71 -34
app.py CHANGED
@@ -489,7 +489,7 @@ def load_data(x1_name, x2_name, x3_name, y_name, x1_levels_str, x2_levels_str, x
489
  data_str (str): Datos del experimento en formato CSV, separados por comas.
490
 
491
  Returns:
492
- tuple: (pd.DataFrame, str, str, str, str, list, list, list, gr.update)
493
  """
494
  try:
495
  # Convertir los niveles a listas de números
@@ -516,11 +516,10 @@ def load_data(x1_name, x2_name, x3_name, y_name, x1_levels_str, x2_levels_str, x
516
  except Exception as e:
517
  return None, "", "", "", "", [], [], [], gr.update(visible=False), f"Error: {e}"
518
 
519
- def fit_and_optimize_model():
520
  if 'rsm' not in globals():
521
- return None, None, None, None, None, None, None, None, None, "Error: Carga los datos primero."
522
 
523
- global rsm_plots
524
  model_completo, pareto_completo = rsm.fit_model()
525
  model_simplificado, pareto_simplificado = rsm.fit_simplified_model()
526
  optimization_table = rsm.optimize()
@@ -536,22 +535,35 @@ def fit_and_optimize_model():
536
  equation_formatted = equation.replace(" + ", "<br>+ ").replace(" ** ", "^").replace("*", " × ")
537
  equation_formatted = f"### Ecuación del Modelo Simplificado:<br>{equation_formatted}"
538
 
539
- return model_completo.summary().tables[0].as_html(), pareto_completo, model_completo.summary().tables[1].as_html(), model_simplificado.summary().as_html(), pareto_simplificado, equation_formatted, optimization_table, prediction_table, contribution_table, anova_table, rsm_plots, gr.update(visible=True, maximum=len(rsm_plots) -1)
 
 
 
 
 
 
 
 
 
 
 
 
 
540
 
541
- def generate_rsm_plot(plot_index):
542
- if 'rsm_plots' not in globals() or not rsm_plots:
543
  return None, gr.update(visible=False), "Error: Genera los gráficos primero."
544
 
545
  plot_index = int(plot_index)
546
- if 0 <= plot_index < len(rsm_plots):
547
- selected_plot = rsm_plots[plot_index]
548
- return selected_plot, gr.update(visible=True, value=plot_index)
549
  else:
550
  return None, gr.update(visible=False), "Error: Índice de gráfico fuera de rango."
551
 
552
  def download_excel():
553
  if 'rsm' not in globals():
554
- return None, "Error: Carga los datos y ajusta el modelo primero."
555
 
556
  output = io.BytesIO()
557
  with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
@@ -567,27 +579,27 @@ def download_excel():
567
  href = f'<a download="resultados_rsm.xlsx" href="data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,{b64}">Descargar Excel</a>'
568
  return href
569
 
570
- def download_selected_image(plot_index):
571
- if 'rsm_plots' not in globals() or not rsm_plots:
572
- return None, "Error: Genera los gráficos primero."
573
 
574
  plot_index = int(plot_index)
575
- if 0 <= plot_index < len(rsm_plots):
576
- selected_plot = rsm_plots[plot_index]
577
  img_bytes = selected_plot.to_image(format="png")
578
  b64 = b64encode(img_bytes).decode('utf-8')
579
  href = f'<a download="grafico_rsm_{plot_index}.png" href="data:image/png;base64,{b64}">Descargar Gráfico {plot_index}</a>'
580
  return href
581
  else:
582
- return None, "Error: Índice de gráfico fuera de rango."
583
 
584
- def download_all_images():
585
- if 'rsm_plots' not in globals() or not rsm_plots:
586
- return None, "Error: Genera los gráficos primero."
587
 
588
  zip_output = io.BytesIO()
589
  with zipfile.ZipFile(zip_output, 'w') as zipf:
590
- for i, fig in enumerate(rsm_plots):
591
  img_bytes = fig.to_image(format="png")
592
  zipf.writestr(f"grafico_rsm_{i}.png", img_bytes)
593
 
@@ -633,6 +645,9 @@ with gr.Blocks() as demo:
633
  gr.Markdown("## Datos Cargados")
634
  data_output = gr.Dataframe(label="Tabla de Datos")
635
 
 
 
 
636
  # Hacer que la sección de análisis y gráficos sea visible solo después de cargar los datos
637
  with gr.Row(visible=False) as analysis_row:
638
  with gr.Column():
@@ -674,30 +689,52 @@ with gr.Blocks() as demo:
674
 
675
  fit_button.click(
676
  fit_and_optimize_model,
677
- outputs=[model_completo_output1, pareto_completo_output, model_completo_output2, model_simplificado_output, pareto_simplificado_output, equation_output, optimization_table_output, prediction_table_output, contribution_table_output, anova_table_output, rsm_plots, plot_index_slider]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
678
  )
679
 
680
  previous_plot_button.click(
 
 
 
 
681
  generate_rsm_plot,
682
- inputs=[plot_index_slider],
683
- outputs=[rsm_plot_output, plot_index_slider]
684
- ).then(lambda x: x - 1 if x > 0 else x, plot_index_slider, plot_index_slider)
685
 
686
  next_plot_button.click(
 
 
 
 
687
  generate_rsm_plot,
688
- inputs=[plot_index_slider],
689
- outputs=[rsm_plot_output, plot_index_slider]
690
- ).then(lambda x: x + 1 if x < 8 else x, plot_index_slider, plot_index_slider)
691
 
692
  plot_index_slider.change(
693
  generate_rsm_plot,
694
- inputs=[plot_index_slider],
695
- outputs=[rsm_plot_output, plot_index_slider]
696
  )
697
 
698
- download_excel_button.click(download_excel, outputs=[download_excel_button])
699
- download_image_button.click(download_selected_image, inputs=[plot_index_slider], outputs=[download_image_button])
700
- download_all_images_button.click(download_all_images, outputs=[download_all_images_button])
701
 
702
  # Ejemplo de uso
703
  gr.Markdown("## Ejemplo de uso")
@@ -710,4 +747,4 @@ with gr.Blocks() as demo:
710
  gr.Markdown("7. Haz clic en 'Descargar Gráfico' para descargar la imagen del gráfico actual.")
711
  gr.Markdown("8. Haz clic en 'Descargar Todos los Gráficos' para descargar un archivo zip con todas las imágenes de los gráficos.")
712
 
713
- demo.launch()
 
489
  data_str (str): Datos del experimento en formato CSV, separados por comas.
490
 
491
  Returns:
492
+ tuple: (pd.DataFrame, str, str, str, str, list, list, list, gr.update, list)
493
  """
494
  try:
495
  # Convertir los niveles a listas de números
 
516
  except Exception as e:
517
  return None, "", "", "", "", [], [], [], gr.update(visible=False), f"Error: {e}"
518
 
519
+ def fit_and_optimize_model(rsm_plots_state=None):
520
  if 'rsm' not in globals():
521
+ return (None, None, None, None, None, None, None, None, None, None, [], "Error: Carga los datos primero.")
522
 
 
523
  model_completo, pareto_completo = rsm.fit_model()
524
  model_simplificado, pareto_simplificado = rsm.fit_simplified_model()
525
  optimization_table = rsm.optimize()
 
535
  equation_formatted = equation.replace(" + ", "<br>+ ").replace(" ** ", "^").replace("*", " × ")
536
  equation_formatted = f"### Ecuación del Modelo Simplificado:<br>{equation_formatted}"
537
 
538
+ return (
539
+ model_completo.summary().tables[0].as_html(),
540
+ pareto_completo,
541
+ model_completo.summary().tables[1].as_html(),
542
+ model_simplificado.summary().as_html(),
543
+ pareto_simplificado,
544
+ equation_formatted,
545
+ optimization_table,
546
+ prediction_table,
547
+ contribution_table,
548
+ anova_table,
549
+ rsm_plots, # Esto se asignará al estado
550
+ gr.update(visible=True, maximum=len(rsm_plots) -1) if rsm_plots else gr.update()
551
+ )
552
 
553
+ def generate_rsm_plot(plot_index, rsm_plots_state):
554
+ if not rsm_plots_state:
555
  return None, gr.update(visible=False), "Error: Genera los gráficos primero."
556
 
557
  plot_index = int(plot_index)
558
+ if 0 <= plot_index < len(rsm_plots_state):
559
+ selected_plot = rsm_plots_state[plot_index]
560
+ return selected_plot, gr.update(visible=True, value=plot_index), ""
561
  else:
562
  return None, gr.update(visible=False), "Error: Índice de gráfico fuera de rango."
563
 
564
  def download_excel():
565
  if 'rsm' not in globals():
566
+ return "Error: Carga los datos y ajusta el modelo primero."
567
 
568
  output = io.BytesIO()
569
  with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
 
579
  href = f'<a download="resultados_rsm.xlsx" href="data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,{b64}">Descargar Excel</a>'
580
  return href
581
 
582
+ def download_selected_image(plot_index, rsm_plots_state):
583
+ if not rsm_plots_state:
584
+ return "Error: Genera los gráficos primero."
585
 
586
  plot_index = int(plot_index)
587
+ if 0 <= plot_index < len(rsm_plots_state):
588
+ selected_plot = rsm_plots_state[plot_index]
589
  img_bytes = selected_plot.to_image(format="png")
590
  b64 = b64encode(img_bytes).decode('utf-8')
591
  href = f'<a download="grafico_rsm_{plot_index}.png" href="data:image/png;base64,{b64}">Descargar Gráfico {plot_index}</a>'
592
  return href
593
  else:
594
+ return "Error: Índice de gráfico fuera de rango."
595
 
596
+ def download_all_images(rsm_plots_state):
597
+ if not rsm_plots_state:
598
+ return "Error: Genera los gráficos primero."
599
 
600
  zip_output = io.BytesIO()
601
  with zipfile.ZipFile(zip_output, 'w') as zipf:
602
+ for i, fig in enumerate(rsm_plots_state):
603
  img_bytes = fig.to_image(format="png")
604
  zipf.writestr(f"grafico_rsm_{i}.png", img_bytes)
605
 
 
645
  gr.Markdown("## Datos Cargados")
646
  data_output = gr.Dataframe(label="Tabla de Datos")
647
 
648
+ # Definir el estado para rsm_plots
649
+ rsm_plots_state = gr.State([])
650
+
651
  # Hacer que la sección de análisis y gráficos sea visible solo después de cargar los datos
652
  with gr.Row(visible=False) as analysis_row:
653
  with gr.Column():
 
689
 
690
  fit_button.click(
691
  fit_and_optimize_model,
692
+ inputs=None,
693
+ outputs=[
694
+ model_completo_output1,
695
+ pareto_completo,
696
+ model_completo_output2,
697
+ model_simplificado_output,
698
+ pareto_simplificado_output,
699
+ equation_output,
700
+ optimization_table_output,
701
+ prediction_table_output,
702
+ contribution_table_output,
703
+ anova_table_output,
704
+ rsm_plots_state,
705
+ plot_index_slider
706
+ ]
707
  )
708
 
709
  previous_plot_button.click(
710
+ lambda x: x - 1 if x > 0 else x,
711
+ inputs=plot_index_slider,
712
+ outputs=plot_index_slider
713
+ ).then(
714
  generate_rsm_plot,
715
+ inputs=[plot_index_slider, rsm_plots_state],
716
+ outputs=[rsm_plot_output, plot_index_slider, gr.Textbox()]
717
+ )
718
 
719
  next_plot_button.click(
720
+ lambda x: x + 1 if x < 8 else x,
721
+ inputs=plot_index_slider,
722
+ outputs=plot_index_slider
723
+ ).then(
724
  generate_rsm_plot,
725
+ inputs=[plot_index_slider, rsm_plots_state],
726
+ outputs=[rsm_plot_output, plot_index_slider, gr.Textbox()]
727
+ )
728
 
729
  plot_index_slider.change(
730
  generate_rsm_plot,
731
+ inputs=[plot_index_slider, rsm_plots_state],
732
+ outputs=[rsm_plot_output, plot_index_slider, gr.Textbox()]
733
  )
734
 
735
+ download_excel_button.click(download_excel, outputs=download_excel_button)
736
+ download_image_button.click(download_selected_image, inputs=[plot_index_slider, rsm_plots_state], outputs=download_image_button)
737
+ download_all_images_button.click(download_all_images, inputs=[rsm_plots_state], outputs=download_all_images_button)
738
 
739
  # Ejemplo de uso
740
  gr.Markdown("## Ejemplo de uso")
 
747
  gr.Markdown("7. Haz clic en 'Descargar Gráfico' para descargar la imagen del gráfico actual.")
748
  gr.Markdown("8. Haz clic en 'Descargar Todos los Gráficos' para descargar un archivo zip con todas las imágenes de los gráficos.")
749
 
750
+ demo.launch()