C2MV commited on
Commit
550ed22
verified
1 Parent(s): bb0f327

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +126 -43
app.py CHANGED
@@ -10,36 +10,39 @@ from scipy.stats import t
10
  import gradio as gr
11
 
12
  class RSM_BoxBehnken:
13
- def __init__(self, data):
14
  """
15
  Inicializa la clase con los datos del dise帽o Box-Behnken.
16
 
17
  Args:
18
  data (pd.DataFrame): DataFrame con los datos del experimento.
 
 
 
 
 
 
 
19
  """
20
  self.data = data.copy()
21
- self.data.rename(columns={
22
- 'Glucosa': 'Glucosa',
23
- 'Extracto de Levadura': 'Extracto_de_Levadura',
24
- 'Tript贸fano': 'Triptofano',
25
- 'AIA (ppm)': 'AIA_ppm'
26
- }, inplace=True)
27
 
28
  self.model = None
29
  self.model_simplified = None
30
  self.optimized_results = None
31
  self.optimal_levels = None
32
 
33
- self.x1_name = 'Glucosa'
34
- self.x2_name = 'Extracto_de_Levadura'
35
- self.x3_name = 'Triptofano'
36
- self.y_name = 'AIA_ppm'
37
 
38
  # Niveles originales de las variables
39
- self.x1_levels = [1, 3.5, 5.5] # Glucosa
40
- self.x2_levels = [0.03, 0.2, 0.3] # Extracto de Levadura
41
- self.x3_levels = [0.4, 0.65, 0.9] # Tript贸fano
42
-
 
43
  def get_levels(self, variable_name):
44
  """
45
  Obtiene los niveles para una variable espec铆fica.
@@ -69,7 +72,7 @@ class RSM_BoxBehnken:
69
  self.model = smf.ols(formula, data=self.data).fit()
70
  print("Modelo Completo:")
71
  print(self.model.summary())
72
- self.pareto_chart(self.model, "Pareto - Modelo Completo")
73
 
74
  def fit_simplified_model(self):
75
  """
@@ -80,7 +83,7 @@ class RSM_BoxBehnken:
80
  self.model_simplified = smf.ols(formula, data=self.data).fit()
81
  print("\nModelo Simplificado:")
82
  print(self.model_simplified.summary())
83
- self.pareto_chart(self.model_simplified, "Pareto - Modelo Simplificado")
84
 
85
  def optimize(self, method='Nelder-Mead'):
86
  """
@@ -309,55 +312,135 @@ class RSM_BoxBehnken:
309
 
310
  return fig
311
 
312
- # Crear un DataFrame a partir de la tabla
313
- data = pd.DataFrame({
314
- 'Exp.': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
315
- 'Glucosa': [-1, 1, -1, 1, -1, 1, -1, 1, 0, 0, 0, 0, 0, 0, 0],
316
- 'Extracto de Levadura': [-1, -1, 1, 1, 0, 0, 0, 0, -1, 1, -1, 1, 0, 0, 0],
317
- 'Tript贸fano': [0, 0, 0, 0, -1, -1, 1, 1, -1, -1, 1, 1, 0, 0, 0],
318
- 'AIA (ppm)': [166.594, 177.557, 127.261, 147.573, 188.883, 224.527, 190.238, 226.483, 195.550, 149.493, 187.683, 148.621, 278.951, 297.238, 280.896]
319
- })
320
-
321
- # Crear una instancia de la clase RSM_BoxBehnken
322
- rsm = RSM_BoxBehnken(data)
323
-
324
- # --- Interfaz de Gradio ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
325
 
326
  def fit_and_optimize_model():
327
- rsm.fit_model()
328
- rsm.fit_simplified_model()
 
 
 
329
  rsm.optimize()
330
  model_summary = rsm.model_simplified.summary().as_html()
331
- pareto_fig = rsm.pareto_chart(rsm.model_simplified, "Pareto - Modelo Simplificado")
332
- return model_summary, pareto_fig, f"{rsm.x1_name}: {rsm.optimal_levels[0]:.4f} g/L, {rsm.x2_name}: {rsm.optimal_levels[1]:.4f} g/L, {rsm.x3_name}: {rsm.optimal_levels[2]:.4f} g/L, Valor m谩ximo de {rsm.y_name}: {-rsm.optimized_results.fun:.4f}"
333
 
334
  def generate_rsm_plot(fixed_variable, fixed_level):
 
 
335
  fig = rsm.plot_rsm_individual(fixed_variable, fixed_level)
336
  return fig
337
 
338
- # Crear la interfaz de Gradio
 
339
  with gr.Blocks() as demo:
340
  gr.Markdown("# Optimizaci贸n de la producci贸n de AIA usando RSM Box-Behnken")
 
341
  with gr.Row():
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
342
  with gr.Column():
343
  fit_button = gr.Button("Ajustar Modelo y Optimizar")
344
  model_summary_output = gr.HTML()
345
- pareto_chart_output = gr.Plot()
 
346
  optimization_results_output = gr.Textbox(label="Resultados de la Optimizaci贸n")
347
  with gr.Column():
348
  gr.Markdown("## Generar Gr谩ficos de Superficie de Respuesta")
349
- fixed_variable_input = gr.Dropdown(label="Variable Fija", choices=[rsm.x1_name, rsm.x2_name, rsm.x3_name], value=rsm.x1_name)
350
- fixed_level_input = gr.Slider(label="Nivel de Variable Fija", minimum=rsm.x1_levels[0], maximum=rsm.x1_levels[-1], step=0.01, value=rsm.x1_levels[1])
351
  plot_button = gr.Button("Generar Gr谩fico")
352
  rsm_plot_output = gr.Plot()
353
 
354
- fit_button.click(fit_and_optimize_model, inputs=[], outputs=[model_summary_output, pareto_chart_output, optimization_results_output])
355
- plot_button.click(generate_rsm_plot, inputs=[fixed_variable_input, fixed_level_input], outputs=rsm_plot_output)
 
 
 
 
 
 
356
 
357
  # Ejemplo de uso
358
  gr.Markdown("## Ejemplo de uso")
359
- gr.Markdown("1. Haz clic en 'Ajustar Modelo y Optimizar' para ajustar el modelo y encontrar los niveles 贸ptimos de los factores.")
360
- gr.Markdown("2. Selecciona una variable fija y su nivel en los controles deslizantes.")
361
- gr.Markdown("3. Haz clic en 'Generar Gr谩fico' para generar un gr谩fico de superficie de respuesta.")
 
 
 
362
 
363
  demo.launch()
 
10
  import gradio as gr
11
 
12
  class RSM_BoxBehnken:
13
+ def __init__(self, data, x1_name, x2_name, x3_name, y_name, x1_levels, x2_levels, x3_levels):
14
  """
15
  Inicializa la clase con los datos del dise帽o Box-Behnken.
16
 
17
  Args:
18
  data (pd.DataFrame): DataFrame con los datos del experimento.
19
+ x1_name (str): Nombre de la primera variable independiente.
20
+ x2_name (str): Nombre de la segunda variable independiente.
21
+ x3_name (str): Nombre de la tercera variable independiente.
22
+ y_name (str): Nombre de la variable dependiente.
23
+ x1_levels (list): Niveles de la primera variable independiente.
24
+ x2_levels (list): Niveles de la segunda variable independiente.
25
+ x3_levels (list): Niveles de la tercera variable independiente.
26
  """
27
  self.data = data.copy()
28
+ # Ya no es necesario renombrar las columnas aqu铆, se har谩 al cargar los datos
 
 
 
 
 
29
 
30
  self.model = None
31
  self.model_simplified = None
32
  self.optimized_results = None
33
  self.optimal_levels = None
34
 
35
+ self.x1_name = x1_name
36
+ self.x2_name = x2_name
37
+ self.x3_name = x3_name
38
+ self.y_name = y_name
39
 
40
  # Niveles originales de las variables
41
+ self.x1_levels = x1_levels
42
+ self.x2_levels = x2_levels
43
+ self.x3_levels = x3_levels
44
+
45
+ # Resto de los m茅todos de la clase (sin cambios)
46
  def get_levels(self, variable_name):
47
  """
48
  Obtiene los niveles para una variable espec铆fica.
 
72
  self.model = smf.ols(formula, data=self.data).fit()
73
  print("Modelo Completo:")
74
  print(self.model.summary())
75
+ return self.pareto_chart(self.model, "Pareto - Modelo Completo")
76
 
77
  def fit_simplified_model(self):
78
  """
 
83
  self.model_simplified = smf.ols(formula, data=self.data).fit()
84
  print("\nModelo Simplificado:")
85
  print(self.model_simplified.summary())
86
+ return self.pareto_chart(self.model_simplified, "Pareto - Modelo Simplificado")
87
 
88
  def optimize(self, method='Nelder-Mead'):
89
  """
 
312
 
313
  return fig
314
 
315
+ # --- Funciones para la interfaz de Gradio ---
316
+
317
+ def load_data(x1_name, x2_name, x3_name, y_name, x1_levels_str, x2_levels_str, x3_levels_str, data_str):
318
+ """
319
+ Carga los datos del dise帽o Box-Behnken desde cajas de texto y crea la instancia de RSM_BoxBehnken.
320
+
321
+ Args:
322
+ x1_name (str): Nombre de la primera variable independiente.
323
+ x2_name (str): Nombre de la segunda variable independiente.
324
+ x3_name (str): Nombre de la tercera variable independiente.
325
+ y_name (str): Nombre de la variable dependiente.
326
+ x1_levels_str (str): Niveles de la primera variable, separados por comas.
327
+ x2_levels_str (str): Niveles de la segunda variable, separados por comas.
328
+ x3_levels_str (str): Niveles de la tercera variable, separados por comas.
329
+ data_str (str): Datos del experimento en formato CSV, separados por comas.
330
+
331
+ Returns:
332
+ tuple: (pd.DataFrame, str, str, str, str, list, list, list, gr.update)
333
+ """
334
+ try:
335
+ # Convertir los niveles a listas de n煤meros
336
+ x1_levels = [float(x.strip()) for x in x1_levels_str.split(',')]
337
+ x2_levels = [float(x.strip()) for x in x2_levels_str.split(',')]
338
+ x3_levels = [float(x.strip()) for x in x3_levels_str.split(',')]
339
+
340
+ # Crear DataFrame a partir de la cadena de datos
341
+ data_list = [row.split(',') for row in data_str.strip().split('\n')]
342
+ column_names = ['Exp.', x1_name, x2_name, x3_name, y_name]
343
+ data = pd.DataFrame(data_list, columns=column_names)
344
+ data = data.apply(pd.to_numeric, errors='coerce') # Convertir a num茅rico
345
+
346
+ # Validar que el DataFrame tenga las columnas correctas
347
+ if not all(col in data.columns for col in column_names):
348
+ raise ValueError("El formato de los datos no es correcto.")
349
+
350
+ # Crear la instancia de RSM_BoxBehnken
351
+ global rsm
352
+ rsm = RSM_BoxBehnken(data, x1_name, x2_name, x3_name, y_name, x1_levels, x2_levels, x3_levels)
353
+
354
+ return data, x1_name, x2_name, x3_name, y_name, x1_levels, x2_levels, x3_levels, gr.update(visible=True)
355
+
356
+ except Exception as e:
357
+ return None, "", "", "", "", [], [], [], gr.update(visible=False), f"Error: {e}"
358
 
359
  def fit_and_optimize_model():
360
+ if 'rsm' not in globals():
361
+ return None, None, "Error: Carga los datos primero."
362
+
363
+ pareto_completo = rsm.fit_model()
364
+ pareto_simplificado = rsm.fit_simplified_model()
365
  rsm.optimize()
366
  model_summary = rsm.model_simplified.summary().as_html()
367
+
368
+ return model_summary, pareto_completo, pareto_simplificado, f"{rsm.x1_name}: {rsm.optimal_levels[0]:.4f}, {rsm.x2_name}: {rsm.optimal_levels[1]:.4f}, {rsm.x3_name}: {rsm.optimal_levels[2]:.4f}, Valor m谩ximo de {rsm.y_name}: {-rsm.optimized_results.fun:.4f}"
369
 
370
  def generate_rsm_plot(fixed_variable, fixed_level):
371
+ if 'rsm' not in globals():
372
+ return None, "Error: Carga los datos primero."
373
  fig = rsm.plot_rsm_individual(fixed_variable, fixed_level)
374
  return fig
375
 
376
+ # --- Crear la interfaz de Gradio ---
377
+
378
  with gr.Blocks() as demo:
379
  gr.Markdown("# Optimizaci贸n de la producci贸n de AIA usando RSM Box-Behnken")
380
+
381
  with gr.Row():
382
+ with gr.Column():
383
+ gr.Markdown("## Configuraci贸n del Dise帽o")
384
+ x1_name_input = gr.Textbox(label="Nombre de la Variable X1 (ej. Glucosa)", value="Glucosa")
385
+ x2_name_input = gr.Textbox(label="Nombre de la Variable X2 (ej. Extracto de Levadura)", value="Extracto de Levadura")
386
+ x3_name_input = gr.Textbox(label="Nombre de la Variable X3 (ej. Tript贸fano)", value="Tript贸fano")
387
+ y_name_input = gr.Textbox(label="Nombre de la Variable Dependiente (ej. AIA (ppm))", value="AIA (ppm)")
388
+ x1_levels_input = gr.Textbox(label="Niveles de X1 (separados por comas)", value="1, 3.5, 5.5")
389
+ x2_levels_input = gr.Textbox(label="Niveles de X2 (separados por comas)", value="0.03, 0.2, 0.3")
390
+ x3_levels_input = gr.Textbox(label="Niveles de X3 (separados por comas)", value="0.4, 0.65, 0.9")
391
+ data_input = gr.Textbox(label="Datos del Experimento (formato CSV)", lines=5, value="""1,-1,-1,0,166.594
392
+ 2,1,-1,0,177.557
393
+ 3,-1,1,0,127.261
394
+ 4,1,1,0,147.573
395
+ 5,-1,0,-1,188.883
396
+ 6,1,0,-1,224.527
397
+ 7,-1,0,1,190.238
398
+ 8,1,0,1,226.483
399
+ 9,0,-1,-1,195.550
400
+ 10,0,1,-1,149.493
401
+ 11,0,-1,1,187.683
402
+ 12,0,1,1,148.621
403
+ 13,0,0,0,278.951
404
+ 14,0,0,0,297.238
405
+ 15,0,0,0,280.896""")
406
+ load_button = gr.Button("Cargar Datos")
407
+
408
+
409
+ with gr.Column():
410
+ gr.Markdown("## Datos Cargados")
411
+ data_output = gr.Dataframe(label="Tabla de Datos")
412
+
413
+ # Hacer que la secci贸n de an谩lisis sea visible solo despu茅s de cargar los datos
414
+ with gr.Row(visible=False) as analysis_row:
415
  with gr.Column():
416
  fit_button = gr.Button("Ajustar Modelo y Optimizar")
417
  model_summary_output = gr.HTML()
418
+ pareto_chart_completo = gr.Plot()
419
+ pareto_chart_simplificado = gr.Plot()
420
  optimization_results_output = gr.Textbox(label="Resultados de la Optimizaci贸n")
421
  with gr.Column():
422
  gr.Markdown("## Generar Gr谩ficos de Superficie de Respuesta")
423
+ fixed_variable_input = gr.Dropdown(label="Variable Fija", choices=["Glucosa", "Extracto de Levadura", "Tript贸fano"], value="Glucosa")
424
+ fixed_level_input = gr.Slider(label="Nivel de Variable Fija", minimum=0, maximum=1, step=0.01, value=0.5)
425
  plot_button = gr.Button("Generar Gr谩fico")
426
  rsm_plot_output = gr.Plot()
427
 
428
+ load_button.click(
429
+ load_data,
430
+ inputs=[x1_name_input, x2_name_input, x3_name_input, y_name_input, x1_levels_input, x2_levels_input, x3_levels_input, data_input],
431
+ 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]
432
+ )
433
+
434
+ fit_button.click(fit_and_optimize_model, outputs=[model_summary_output, pareto_chart_completo, pareto_chart_simplificado, optimization_results_output])
435
+ plot_button.click(generate_rsm_plot, inputs=[fixed_variable_input, fixed_level_input], outputs=[rsm_plot_output])
436
 
437
  # Ejemplo de uso
438
  gr.Markdown("## Ejemplo de uso")
439
+ gr.Markdown("1. Introduce los nombres de las variables y sus niveles en las cajas de texto correspondientes.")
440
+ gr.Markdown("2. Copia y pega los datos del experimento en la caja de texto 'Datos del Experimento'.")
441
+ gr.Markdown("3. Haz clic en 'Cargar Datos' para cargar los datos en la tabla.")
442
+ gr.Markdown("4. Haz clic en 'Ajustar Modelo y Optimizar' para ajustar el modelo y encontrar los niveles 贸ptimos de los factores.")
443
+ gr.Markdown("5. Selecciona una variable fija y su nivel en los controles deslizantes.")
444
+ gr.Markdown("6. Haz clic en 'Generar Gr谩fico' para generar un gr谩fico de superficie de respuesta.")
445
 
446
  demo.launch()