C2MV commited on
Commit
911746c
·
verified ·
1 Parent(s): 862aaf6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +40 -52
app.py CHANGED
@@ -14,7 +14,6 @@ from zipfile import ZipFile
14
 
15
  class RSM_BoxBehnken:
16
  def __init__(self, data, x1_name, x2_name, x3_name, y_name, x1_levels, x2_levels, x3_levels):
17
- # ... (El código de la clase RSM_BoxBehnken se mantiene igual, solo se modifican las funciones que generan dataframes o strings)
18
  self.data = data.copy()
19
  self.model = None
20
  self.model_simplified = None
@@ -177,14 +176,10 @@ class RSM_BoxBehnken:
177
  return fig
178
 
179
  def generate_all_plots(self):
180
- """
181
- Genera todas las gráficas de RSM, variando la variable fija y sus niveles usando el modelo simplificado.
182
- """
183
  if self.model_simplified is None:
184
  print("Error: Ajusta el modelo simplificado primero.")
185
  return
186
 
187
- # Niveles naturales para graficar
188
  levels_to_plot_natural = {
189
  self.x1_name: self.x1_levels,
190
  self.x2_name: self.x2_levels,
@@ -193,7 +188,6 @@ class RSM_BoxBehnken:
193
 
194
  figs = []
195
 
196
- # Generar y mostrar gráficos individuales
197
  for fixed_variable in [self.x1_name, self.x2_name, self.x3_name]:
198
  for level in levels_to_plot_natural[fixed_variable]:
199
  fig = self.plot_rsm_individual(fixed_variable, level)
@@ -268,7 +262,6 @@ class RSM_BoxBehnken:
268
  self.data['Predicho'] = self.model_simplified.predict(self.data)
269
  self.data['Residual'] = self.data[self.y_name] - self.data['Predicho']
270
 
271
- # Redondear a 3 decimales en la tabla de predicciones
272
  prediction_table = self.data[[self.y_name, 'Predicho', 'Residual']].copy()
273
  prediction_table[self.y_name] = prediction_table[self.y_name].round(3)
274
  prediction_table['Predicho'] = prediction_table['Predicho'].round(3)
@@ -403,7 +396,7 @@ def fit_and_optimize_model():
403
  prediction_table = rsm.generate_prediction_table()
404
  contribution_table = rsm.calculate_contribution_percentage()
405
  anova_table = rsm.calculate_detailed_anova()
406
-
407
  equation_formatted = equation.replace(" + ", "<br>+ ").replace(" ** ", "^").replace("*", " × ")
408
  equation_formatted = f"### Ecuación del Modelo Simplificado:<br>{equation_formatted}"
409
 
@@ -414,19 +407,16 @@ def generate_rsm_plot(fixed_variable, fixed_level):
414
  if 'rsm' not in globals():
415
  return None, "Error: Carga los datos primero."
416
 
417
- # Generar todas las gráficas
418
  all_figs = rsm.generate_all_plots()
419
 
420
- # Crear una lista de figuras para la salida
421
- plot_outputs = []
422
- for fig in all_figs:
423
- # Convertir la figura a una imagen en formato PNG
424
- img_bytes = fig.to_image(format="png")
425
- plot_outputs.append(img_bytes)
426
 
427
- # Retornar la lista de imágenes
428
- return plot_outputs
429
 
 
430
  def download_excel():
431
  if 'rsm' not in globals():
432
  return None, "Error: Carga los datos y ajusta el modelo primero."
@@ -435,42 +425,31 @@ def download_excel():
435
  with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
436
  rsm.data.to_excel(writer, sheet_name='Datos', index=False)
437
  rsm.generate_prediction_table().to_excel(writer, sheet_name='Predicciones', index=False)
438
- rsm.optimize().to_excel(writer, sheet_name='Optimizacion', index=False)
439
- rsm.calculate_contribution_percentage().to_excel(writer, sheet_name='Contribucion', index=False)
440
  rsm.calculate_detailed_anova().to_excel(writer, sheet_name='ANOVA', index=False)
441
 
442
  output.seek(0)
443
- return gr.File.update(value=output, visible=True, filename="resultados_rsm.xlsx")
 
 
444
 
 
445
  def download_images():
446
  if 'rsm' not in globals():
447
  return None, "Error: Carga los datos y ajusta el modelo primero."
448
 
449
- # Crear un directorio temporal para guardar las imágenes
450
- temp_dir = "temp_images"
451
- os.makedirs(temp_dir, exist_ok=True)
 
 
 
 
 
452
 
453
- # Generar todas las gráficas y guardarlas como imágenes PNG
454
- all_figs = rsm.generate_all_plots()
455
- for i, fig in enumerate(all_figs):
456
- img_path = os.path.join(temp_dir, f"plot_{i}.png")
457
- fig.write_image(img_path)
458
-
459
- # Comprimir las imágenes en un archivo ZIP
460
- zip_buffer = io.BytesIO()
461
- with ZipFile(zip_buffer, "w") as zip_file:
462
- for filename in os.listdir(temp_dir):
463
- file_path = os.path.join(temp_dir, filename)
464
- zip_file.write(file_path, arcname=filename)
465
-
466
- # Eliminar el directorio temporal
467
- for filename in os.listdir(temp_dir):
468
- file_path = os.path.join(temp_dir, filename)
469
- os.remove(file_path)
470
- os.rmdir(temp_dir)
471
-
472
- zip_buffer.seek(0)
473
- return gr.File.update(value=zip_buffer, visible=True, filename="graficos_rsm.zip")
474
 
475
  # --- Crear la interfaz de Gradio ---
476
 
@@ -513,8 +492,6 @@ with gr.Blocks() as demo:
513
  with gr.Row(visible=False) as analysis_row:
514
  with gr.Column():
515
  fit_button = gr.Button("Ajustar Modelo y Optimizar")
516
- download_excel_button = gr.Button("Descargar Tablas en Excel")
517
- download_images_button = gr.Button("Descargar Gráficos en ZIP")
518
  gr.Markdown("**Modelo Completo**")
519
  model_completo_output = gr.HTML()
520
  pareto_completo_output = gr.Plot()
@@ -526,12 +503,22 @@ with gr.Blocks() as demo:
526
  prediction_table_output = gr.Dataframe(label="Tabla de Predicciones")
527
  contribution_table_output = gr.Dataframe(label="Tabla de % de Contribución")
528
  anova_table_output = gr.Dataframe(label="Tabla ANOVA Detallada")
 
 
 
 
 
 
 
 
529
  with gr.Column():
530
  gr.Markdown("## Generar Gráficos de Superficie de Respuesta")
531
  fixed_variable_input = gr.Dropdown(label="Variable Fija", choices=["Glucosa", "Extracto_de_Levadura", "Triptofano"], value="Glucosa")
532
  fixed_level_input = gr.Slider(label="Nivel de Variable Fija", minimum=0, maximum=1, step=0.01, value=0.5)
533
  plot_button = gr.Button("Generar Gráfico")
534
- rsm_plot_output = gr.Gallery(label="Gráficos RSM", columns=3, preview=True, height="auto")
 
 
535
 
536
  load_button.click(
537
  load_data,
@@ -541,10 +528,11 @@ with gr.Blocks() as demo:
541
 
542
  fit_button.click(fit_and_optimize_model, outputs=[model_completo_output, pareto_completo_output, model_simplificado_output, pareto_simplificado_output, equation_output, optimization_table_output, prediction_table_output, contribution_table_output, anova_table_output])
543
 
544
- plot_button.click(generate_rsm_plot, inputs=[fixed_variable_input, fixed_level_input], outputs=[rsm_plot_output])
545
 
546
- download_excel_button.click(download_excel, outputs=[gr.File()])
547
- download_images_button.click(download_images, outputs=[gr.File()])
 
548
 
549
  # Ejemplo de uso
550
  gr.Markdown("## Ejemplo de uso")
@@ -554,7 +542,7 @@ with gr.Blocks() as demo:
554
  gr.Markdown("4. Haz clic en 'Ajustar Modelo y Optimizar' para ajustar el modelo y encontrar los niveles óptimos de los factores.")
555
  gr.Markdown("5. Selecciona una variable fija y su nivel en los controles deslizantes.")
556
  gr.Markdown("6. Haz clic en 'Generar Gráfico' para generar un gráfico de superficie de respuesta.")
557
- gr.Markdown("7. Haz clic en 'Descargar Tablas en Excel' para obtener un archivo Excel con todas las tablas generadas.")
558
- gr.Markdown("8. Haz clic en 'Descargar Gráficos en ZIP' para obtener un archivo ZIP con todos los gráficos generados.")
559
 
560
  demo.launch()
 
14
 
15
  class RSM_BoxBehnken:
16
  def __init__(self, data, x1_name, x2_name, x3_name, y_name, x1_levels, x2_levels, x3_levels):
 
17
  self.data = data.copy()
18
  self.model = None
19
  self.model_simplified = None
 
176
  return fig
177
 
178
  def generate_all_plots(self):
 
 
 
179
  if self.model_simplified is None:
180
  print("Error: Ajusta el modelo simplificado primero.")
181
  return
182
 
 
183
  levels_to_plot_natural = {
184
  self.x1_name: self.x1_levels,
185
  self.x2_name: self.x2_levels,
 
188
 
189
  figs = []
190
 
 
191
  for fixed_variable in [self.x1_name, self.x2_name, self.x3_name]:
192
  for level in levels_to_plot_natural[fixed_variable]:
193
  fig = self.plot_rsm_individual(fixed_variable, level)
 
262
  self.data['Predicho'] = self.model_simplified.predict(self.data)
263
  self.data['Residual'] = self.data[self.y_name] - self.data['Predicho']
264
 
 
265
  prediction_table = self.data[[self.y_name, 'Predicho', 'Residual']].copy()
266
  prediction_table[self.y_name] = prediction_table[self.y_name].round(3)
267
  prediction_table['Predicho'] = prediction_table['Predicho'].round(3)
 
396
  prediction_table = rsm.generate_prediction_table()
397
  contribution_table = rsm.calculate_contribution_percentage()
398
  anova_table = rsm.calculate_detailed_anova()
399
+
400
  equation_formatted = equation.replace(" + ", "<br>+ ").replace(" ** ", "^").replace("*", " × ")
401
  equation_formatted = f"### Ecuación del Modelo Simplificado:<br>{equation_formatted}"
402
 
 
407
  if 'rsm' not in globals():
408
  return None, "Error: Carga los datos primero."
409
 
410
+ # Obtener todas las gráficas
411
  all_figs = rsm.generate_all_plots()
412
 
413
+ # Convertir la figura seleccionada a bytes
414
+ img_bytes = all_figs[0].to_image(format="png")
 
 
 
 
415
 
416
+ # Devolver la lista de figuras y la imagen en bytes
417
+ return all_figs, img_bytes
418
 
419
+ # Función para descargar el Excel con todas las tablas
420
  def download_excel():
421
  if 'rsm' not in globals():
422
  return None, "Error: Carga los datos y ajusta el modelo primero."
 
425
  with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
426
  rsm.data.to_excel(writer, sheet_name='Datos', index=False)
427
  rsm.generate_prediction_table().to_excel(writer, sheet_name='Predicciones', index=False)
428
+ rsm.optimize().to_excel(writer, sheet_name='Optimización', index=False)
429
+ rsm.calculate_contribution_percentage().to_excel(writer, sheet_name='Contribución', index=False)
430
  rsm.calculate_detailed_anova().to_excel(writer, sheet_name='ANOVA', index=False)
431
 
432
  output.seek(0)
433
+
434
+ # Modificar para usar gr.File
435
+ return gr.File(value=output, visible=True, filename="resultados_rsm.xlsx")
436
 
437
+ # Función para descargar las imágenes
438
  def download_images():
439
  if 'rsm' not in globals():
440
  return None, "Error: Carga los datos y ajusta el modelo primero."
441
 
442
+ zip_output = io.BytesIO()
443
+ with ZipFile(zip_output, 'w') as zipf:
444
+ for fixed_variable in [rsm.x1_name, rsm.x2_name, rsm.x3_name]:
445
+ for level in rsm.get_levels(fixed_variable):
446
+ fig = rsm.plot_rsm_individual(fixed_variable, level)
447
+ img_bytes = fig.to_image(format="png")
448
+ img_path = f"{fixed_variable}_{level}.png"
449
+ zipf.writestr(img_path, img_bytes)
450
 
451
+ zip_output.seek(0)
452
+ return gr.File(value=zip_output, visible=True, filename="graficos_rsm.zip")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
453
 
454
  # --- Crear la interfaz de Gradio ---
455
 
 
492
  with gr.Row(visible=False) as analysis_row:
493
  with gr.Column():
494
  fit_button = gr.Button("Ajustar Modelo y Optimizar")
 
 
495
  gr.Markdown("**Modelo Completo**")
496
  model_completo_output = gr.HTML()
497
  pareto_completo_output = gr.Plot()
 
503
  prediction_table_output = gr.Dataframe(label="Tabla de Predicciones")
504
  contribution_table_output = gr.Dataframe(label="Tabla de % de Contribución")
505
  anova_table_output = gr.Dataframe(label="Tabla ANOVA Detallada")
506
+
507
+ # Botones de descarga
508
+ with gr.Row():
509
+ download_excel_button = gr.Button("Descargar Tablas en Excel")
510
+ download_images_button = gr.Button("Descargar Gráficos en ZIP")
511
+ excel_file_output = gr.File(label="Descargar Excel")
512
+ zip_file_output = gr.File(label="Descargar ZIP")
513
+
514
  with gr.Column():
515
  gr.Markdown("## Generar Gráficos de Superficie de Respuesta")
516
  fixed_variable_input = gr.Dropdown(label="Variable Fija", choices=["Glucosa", "Extracto_de_Levadura", "Triptofano"], value="Glucosa")
517
  fixed_level_input = gr.Slider(label="Nivel de Variable Fija", minimum=0, maximum=1, step=0.01, value=0.5)
518
  plot_button = gr.Button("Generar Gráfico")
519
+ # Usar Gallery para mostrar las imágenes
520
+ gallery = gr.Gallery(label="Gráficos RSM").style(preview=False, grid=(3,3), height="auto")
521
+ image_output = gr.Image(label="Descargar Gráfico")
522
 
523
  load_button.click(
524
  load_data,
 
528
 
529
  fit_button.click(fit_and_optimize_model, outputs=[model_completo_output, pareto_completo_output, model_simplificado_output, pareto_simplificado_output, equation_output, optimization_table_output, prediction_table_output, contribution_table_output, anova_table_output])
530
 
531
+ plot_button.click(generate_rsm_plot, inputs=[fixed_variable_input, fixed_level_input], outputs=[gallery, image_output])
532
 
533
+ # Asociar las funciones de descarga a los botones
534
+ download_excel_button.click(download_excel, outputs=excel_file_output)
535
+ download_images_button.click(download_images, outputs=zip_file_output)
536
 
537
  # Ejemplo de uso
538
  gr.Markdown("## Ejemplo de uso")
 
542
  gr.Markdown("4. Haz clic en 'Ajustar Modelo y Optimizar' para ajustar el modelo y encontrar los niveles óptimos de los factores.")
543
  gr.Markdown("5. Selecciona una variable fija y su nivel en los controles deslizantes.")
544
  gr.Markdown("6. Haz clic en 'Generar Gráfico' para generar un gráfico de superficie de respuesta.")
545
+ gr.Markdown("7. Haz clic en 'Descargar Tablas en Excel' para obtener un archivo .xlsx con todas las tablas generadas.")
546
+ gr.Markdown("8. Haz clic en 'Descargar Gráficos en ZIP' para obtener un archivo .zip con todas las imágenes de los gráficos.")
547
 
548
  demo.launch()