C2MV commited on
Commit
b2bc06b
verified
1 Parent(s): bf86fb1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +47 -84
app.py CHANGED
@@ -83,13 +83,13 @@ def generar_graficos(df_valid, n_replicas, unidad_medida, palette_puntos, estilo
83
  col_desviacion = f"Desviaci贸n Est谩ndar ({unidad_medida})"
84
 
85
  # Convertir a num茅rico
86
- df_valid.loc[:, col_predicha_num] = df_valid[col_predicha_num].astype(float)
87
- df_valid.loc[:, col_real_promedio] = df_valid[col_real_promedio].astype(float)
88
- df_valid.loc[:, col_desviacion] = df_valid[col_desviacion].fillna(0).astype(float)
89
 
90
  # Calcular regresi贸n lineal
91
  slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_predicha_num], df_valid[col_real_promedio])
92
- df_valid.loc[:, 'Ajuste Lineal'] = intercept + slope * df_valid[col_predicha_num]
93
 
94
  # Configurar estilos
95
  sns.set(style="whitegrid")
@@ -229,8 +229,8 @@ def generar_informe_completo(df_valid, n_replicas, unidad_medida):
229
  col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
230
 
231
  # Convertir a num茅rico
232
- df_valid.loc[:, col_predicha_num] = df_valid[col_predicha_num].astype(float)
233
- df_valid.loc[:, col_real_promedio] = df_valid[col_real_promedio].astype(float)
234
 
235
  # Calcular estad铆sticas
236
  slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_predicha_num], df_valid[col_real_promedio])
@@ -267,22 +267,10 @@ Fecha: {datetime.now().strftime('%d/%m/%Y %H:%M')}
267
  """
268
  return informe, evaluacion['estado']
269
 
270
- def actualizar_analisis(df, n_replicas, unidad_medida, absorbancia_blanco, *replicas):
271
  if df is None or df.empty:
272
  return "Error en los datos", None, "No se pueden generar an谩lisis", df
273
 
274
- # Actualizar los valores de las r茅plicas desde los cuadros de texto
275
- for i, replica in enumerate(replicas):
276
- if replica is not None:
277
- col_real = f"Concentraci贸n Real {i + 1} ({unidad_medida})"
278
- df.loc[0, col_real] = replica
279
-
280
- # Ajustar valores de absorbancia reales por el valor del blanco
281
- for i in range(1, n_replicas + 1):
282
- col_real = f"Concentraci贸n Real {i} ({unidad_medida})"
283
- df.loc[:, col_real] = pd.to_numeric(df[col_real], errors='coerce')
284
- df.loc[:, col_real] = df[col_real] - absorbancia_blanco
285
-
286
  # Calcular promedio y desviaci贸n est谩ndar dependiendo de las r茅plicas
287
  df = calcular_promedio_desviacion(df, n_replicas, unidad_medida)
288
 
@@ -290,8 +278,8 @@ def actualizar_analisis(df, n_replicas, unidad_medida, absorbancia_blanco, *repl
290
  col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
291
 
292
  # Convertir columnas a num茅rico
293
- df.loc[:, col_predicha_num] = pd.to_numeric(df[col_predicha_num], errors='coerce')
294
- df.loc[:, col_real_promedio] = pd.to_numeric(df[col_real_promedio], errors='coerce')
295
 
296
  df_valid = df.dropna(subset=[col_predicha_num, col_real_promedio])
297
 
@@ -300,7 +288,7 @@ def actualizar_analisis(df, n_replicas, unidad_medida, absorbancia_blanco, *repl
300
 
301
  # Calcular la regresi贸n y agregar 'Ajuste Lineal'
302
  slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_predicha_num], df_valid[col_real_promedio])
303
- df_valid.loc[:, 'Ajuste Lineal'] = intercept + slope * df_valid[col_predicha_num]
304
 
305
  # Generar gr谩fico con opciones predeterminadas
306
  fig = generar_graficos(
@@ -331,8 +319,8 @@ def actualizar_graficos(df, n_replicas, unidad_medida,
331
  col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
332
 
333
  # Convertir columnas a num茅rico
334
- df.loc[:, col_predicha_num] = pd.to_numeric(df[col_predicha_num], errors='coerce')
335
- df.loc[:, col_real_promedio] = pd.to_numeric(df[col_real_promedio], errors='coerce')
336
 
337
  df_valid = df.dropna(subset=[col_predicha_num, col_real_promedio])
338
 
@@ -442,14 +430,14 @@ def exportar_informe_latex(df_valid, informe_md):
442
  f.write(informe_tex)
443
  return filename
444
 
445
- def exportar_word(df, informe_md, unidad_medida, absorbancia_blanco):
446
  df_valid = df.copy()
447
  col_predicha_num = "Concentraci贸n Predicha Num茅rica"
448
  col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
449
 
450
  # Convertir columnas a num茅rico
451
- df_valid.loc[:, col_predicha_num] = pd.to_numeric(df_valid[col_predicha_num], errors='coerce')
452
- df_valid.loc[:, col_real_promedio] = pd.to_numeric(df_valid[col_real_promedio], errors='coerce')
453
 
454
  df_valid = df_valid.dropna(subset=[col_predicha_num, col_real_promedio])
455
 
@@ -466,8 +454,8 @@ def exportar_latex(df, informe_md):
466
  col_real_promedio = [col for col in df_valid.columns if 'Real Promedio' in col][0]
467
 
468
  # Convertir columnas a num茅rico
469
- df_valid.loc[:, col_predicha_num] = pd.to_numeric(df_valid[col_predicha_num], errors='coerce')
470
- df_valid.loc[:, col_real_promedio] = pd.to_numeric(df_valid[col_real_promedio], errors='coerce')
471
 
472
  df_valid = df_valid.dropna(subset=[col_predicha_num, col_real_promedio])
473
 
@@ -478,26 +466,6 @@ def exportar_latex(df, informe_md):
478
 
479
  return filename # Retornamos el nombre del archivo
480
 
481
- def limpiar_datos(n_replicas):
482
- df = generar_tabla(7, 1.0, "OD", n_replicas)
483
- return (
484
- 1.0, # Concentraci贸n Inicial
485
- "OD", # Unidad de Medida
486
- 7, # N煤mero de filas
487
- df, # Tabla Output
488
- "", # Estado Output
489
- None, # Gr谩ficos Output
490
- "" # Informe Output
491
- )
492
-
493
- def subir_datos_replica(df, n_replicas, unidad_medida, datos_replica):
494
- df = df.copy()
495
- for i, dato in enumerate(datos_replica):
496
- if dato is not None:
497
- col_real = f"Concentraci贸n Real {i + 1} ({unidad_medida})"
498
- df.loc[0, col_real] = dato
499
- return df
500
-
501
  # Funciones de ejemplo
502
  def cargar_ejemplo_ufc(n_replicas):
503
  df = generar_tabla(7, 2000000, "UFC", n_replicas)
@@ -519,20 +487,32 @@ def cargar_ejemplo_od(n_replicas):
519
  df[f"Concentraci贸n Real {i} (OD)"] = valores_reales
520
  return 1.0, "OD", 7, df
521
 
522
- def generar_datos_sinteticos_evento(df, n_replicas, unidad_medida, absorbancia_blanco):
 
 
 
 
 
 
 
 
 
 
 
 
523
  df = df.copy()
524
  col_predicha_num = "Concentraci贸n Predicha Num茅rica"
525
 
526
  # Generar datos sint茅ticos para cada r茅plica
527
  for i in range(1, n_replicas + 1):
528
  col_real = f"Concentraci贸n Real {i} ({unidad_medida})"
529
- df.loc[:, col_predicha_num] = pd.to_numeric(df[col_predicha_num], errors='coerce')
530
  desviacion_std = 0.05 * df[col_predicha_num].mean() # 5% de la media como desviaci贸n est谩ndar
531
  valores_predichos = df[col_predicha_num].astype(float).values
532
  datos_sinteticos = valores_predichos + np.random.normal(0, desviacion_std, size=len(valores_predichos))
533
  datos_sinteticos = np.maximum(0, datos_sinteticos) # Asegurar que no haya valores negativos
534
  datos_sinteticos = np.round(datos_sinteticos, 2)
535
- df.loc[:, col_real] = datos_sinteticos - absorbancia_blanco
536
 
537
  return df
538
 
@@ -546,7 +526,7 @@ def actualizar_tabla_evento(df, n_filas, concentracion, unidad, n_replicas):
546
 
547
  # Reemplazar valores existentes en "Concentraci贸n Real"
548
  for col_new, col_old in zip(col_real_new, col_real_old):
549
- df_new.loc[:, col_new] = None
550
  for idx in df_new.index:
551
  if idx in df.index:
552
  df_new.at[idx, col_new] = df.at[idx, col_old]
@@ -563,14 +543,14 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
563
  with gr.Tab("馃摑 Datos de Calibraci贸n"):
564
  with gr.Row():
565
  concentracion_input = gr.Number(
566
- value=1.0,
567
  label="Concentraci贸n Inicial",
568
- precision=2
569
  )
570
  unidad_input = gr.Textbox(
571
- value="OD",
572
  label="Unidad de Medida",
573
- placeholder="OD, UFC, etc..."
574
  )
575
  filas_slider = gr.Slider(
576
  minimum=1,
@@ -593,26 +573,17 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
593
  step=1,
594
  label="N煤mero de R茅plicas"
595
  )
596
- absorbancia_blanco_input = gr.Number(
597
- value=0.0,
598
- label="Absorbancia del Blanco",
599
- precision=2
600
- )
601
 
602
  with gr.Row():
603
  calcular_btn = gr.Button("馃攧 Calcular", variant="primary")
604
  limpiar_btn = gr.Button("馃棏 Limpiar Datos", variant="secondary")
605
  ajustar_decimales_btn = gr.Button("馃洜 Ajustar Decimales", variant="secondary")
606
- subir_datos_btn = gr.Button("馃摛 Subir Datos de R茅plica", variant="secondary")
607
 
608
  with gr.Row():
609
  ejemplo_ufc_btn = gr.Button("馃搵 Cargar Ejemplo UFC", variant="secondary")
610
  ejemplo_od_btn = gr.Button("馃搵 Cargar Ejemplo OD", variant="secondary")
611
  sinteticos_btn = gr.Button("馃И Generar Datos Sint茅ticos", variant="secondary")
612
 
613
- with gr.Row():
614
- replica_inputs = [gr.Textbox(label=f"R茅plica {i + 1}") for i in range(10)]
615
-
616
  tabla_output = gr.DataFrame(
617
  wrap=True,
618
  label="Tabla de Datos",
@@ -690,7 +661,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
690
  # Evento al presionar el bot贸n Calcular
691
  calcular_btn.click(
692
  fn=actualizar_analisis,
693
- inputs=[tabla_output, replicas_slider, unidad_input, absorbancia_blanco_input, *replica_inputs],
694
  outputs=output_components
695
  )
696
 
@@ -715,13 +686,6 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
715
  outputs=[concentracion_input, unidad_input, filas_slider, tabla_output, estado_output, graficos_output, informe_output]
716
  )
717
 
718
- # Evento para subir datos de r茅plica
719
- subir_datos_btn.click(
720
- fn=subir_datos_replica,
721
- inputs=[tabla_output, replicas_slider, unidad_input, *replica_inputs],
722
- outputs=tabla_output
723
- )
724
-
725
  # Eventos de los botones de ejemplo
726
  ejemplo_ufc_btn.click(
727
  fn=cargar_ejemplo_ufc,
@@ -738,7 +702,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
738
  # Evento para generar datos sint茅ticos
739
  sinteticos_btn.click(
740
  fn=generar_datos_sinteticos_evento,
741
- inputs=[tabla_output, replicas_slider, unidad_input, absorbancia_blanco_input],
742
  outputs=tabla_output
743
  )
744
 
@@ -801,7 +765,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
801
  # Eventos de exportar informes
802
  exportar_word_btn.click(
803
  fn=exportar_word,
804
- inputs=[tabla_output, informe_output, unidad_input, absorbancia_blanco_input],
805
  outputs=exportar_word_file
806
  )
807
 
@@ -814,24 +778,23 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
814
  # Inicializar la interfaz con el ejemplo base
815
  def iniciar_con_ejemplo():
816
  n_replicas = 1
817
- df = generar_tabla(7, 1.0, "OD", n_replicas)
818
  # Valores reales de ejemplo
819
- df[f"Concentraci贸n Real 1 (OD)"] = [1.00, 0.80, 0.60, 0.40, 0.20, 0.10, 0.05]
820
- estado, fig, informe, df = actualizar_analisis(df, n_replicas, "OD", 0.0)
821
  return (
822
- 1.0,
823
- "OD",
824
  7,
825
  df,
826
  estado,
827
  fig,
828
- informe,
829
- 0.0
830
  )
831
 
832
  interfaz.load(
833
  fn=iniciar_con_ejemplo,
834
- outputs=[concentracion_input, unidad_input, filas_slider, tabla_output, estado_output, graficos_output, informe_output, absorbancia_blanco_input]
835
  )
836
 
837
  # Lanzar la interfaz
 
83
  col_desviacion = f"Desviaci贸n Est谩ndar ({unidad_medida})"
84
 
85
  # Convertir a num茅rico
86
+ df_valid[col_predicha_num] = df_valid[col_predicha_num].astype(float)
87
+ df_valid[col_real_promedio] = df_valid[col_real_promedio].astype(float)
88
+ df_valid[col_desviacion] = df_valid[col_desviacion].fillna(0).astype(float)
89
 
90
  # Calcular regresi贸n lineal
91
  slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_predicha_num], df_valid[col_real_promedio])
92
+ df_valid['Ajuste Lineal'] = intercept + slope * df_valid[col_predicha_num]
93
 
94
  # Configurar estilos
95
  sns.set(style="whitegrid")
 
229
  col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
230
 
231
  # Convertir a num茅rico
232
+ df_valid[col_predicha_num] = df_valid[col_predicha_num].astype(float)
233
+ df_valid[col_real_promedio] = df_valid[col_real_promedio].astype(float)
234
 
235
  # Calcular estad铆sticas
236
  slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_predicha_num], df_valid[col_real_promedio])
 
267
  """
268
  return informe, evaluacion['estado']
269
 
270
+ def actualizar_analisis(df, n_replicas, unidad_medida):
271
  if df is None or df.empty:
272
  return "Error en los datos", None, "No se pueden generar an谩lisis", df
273
 
 
 
 
 
 
 
 
 
 
 
 
 
274
  # Calcular promedio y desviaci贸n est谩ndar dependiendo de las r茅plicas
275
  df = calcular_promedio_desviacion(df, n_replicas, unidad_medida)
276
 
 
278
  col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
279
 
280
  # Convertir columnas a num茅rico
281
+ df[col_predicha_num] = pd.to_numeric(df[col_predicha_num], errors='coerce')
282
+ df[col_real_promedio] = pd.to_numeric(df[col_real_promedio], errors='coerce')
283
 
284
  df_valid = df.dropna(subset=[col_predicha_num, col_real_promedio])
285
 
 
288
 
289
  # Calcular la regresi贸n y agregar 'Ajuste Lineal'
290
  slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_predicha_num], df_valid[col_real_promedio])
291
+ df_valid['Ajuste Lineal'] = intercept + slope * df_valid[col_predicha_num]
292
 
293
  # Generar gr谩fico con opciones predeterminadas
294
  fig = generar_graficos(
 
319
  col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
320
 
321
  # Convertir columnas a num茅rico
322
+ df[col_predicha_num] = pd.to_numeric(df[col_predicha_num], errors='coerce')
323
+ df[col_real_promedio] = pd.to_numeric(df[col_real_promedio], errors='coerce')
324
 
325
  df_valid = df.dropna(subset=[col_predicha_num, col_real_promedio])
326
 
 
430
  f.write(informe_tex)
431
  return filename
432
 
433
+ def exportar_word(df, informe_md, unidad_medida):
434
  df_valid = df.copy()
435
  col_predicha_num = "Concentraci贸n Predicha Num茅rica"
436
  col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
437
 
438
  # Convertir columnas a num茅rico
439
+ df_valid[col_predicha_num] = pd.to_numeric(df_valid[col_predicha_num], errors='coerce')
440
+ df_valid[col_real_promedio] = pd.to_numeric(df_valid[col_real_promedio], errors='coerce')
441
 
442
  df_valid = df_valid.dropna(subset=[col_predicha_num, col_real_promedio])
443
 
 
454
  col_real_promedio = [col for col in df_valid.columns if 'Real Promedio' in col][0]
455
 
456
  # Convertir columnas a num茅rico
457
+ df_valid[col_predicha_num] = pd.to_numeric(df_valid[col_predicha_num], errors='coerce')
458
+ df_valid[col_real_promedio] = pd.to_numeric(df_valid[col_real_promedio], errors='coerce')
459
 
460
  df_valid = df_valid.dropna(subset=[col_predicha_num, col_real_promedio])
461
 
 
466
 
467
  return filename # Retornamos el nombre del archivo
468
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
469
  # Funciones de ejemplo
470
  def cargar_ejemplo_ufc(n_replicas):
471
  df = generar_tabla(7, 2000000, "UFC", n_replicas)
 
487
  df[f"Concentraci贸n Real {i} (OD)"] = valores_reales
488
  return 1.0, "OD", 7, df
489
 
490
+ def limpiar_datos(n_replicas):
491
+ df = generar_tabla(7, 2000000, "UFC", n_replicas)
492
+ return (
493
+ 2000000, # Concentraci贸n Inicial
494
+ "UFC", # Unidad de Medida
495
+ 7, # N煤mero de filas
496
+ df, # Tabla Output
497
+ "", # Estado Output
498
+ None, # Gr谩ficos Output
499
+ "" # Informe Output
500
+ )
501
+
502
+ def generar_datos_sinteticos_evento(df, n_replicas, unidad_medida):
503
  df = df.copy()
504
  col_predicha_num = "Concentraci贸n Predicha Num茅rica"
505
 
506
  # Generar datos sint茅ticos para cada r茅plica
507
  for i in range(1, n_replicas + 1):
508
  col_real = f"Concentraci贸n Real {i} ({unidad_medida})"
509
+ df[col_predicha_num] = pd.to_numeric(df[col_predicha_num], errors='coerce')
510
  desviacion_std = 0.05 * df[col_predicha_num].mean() # 5% de la media como desviaci贸n est谩ndar
511
  valores_predichos = df[col_predicha_num].astype(float).values
512
  datos_sinteticos = valores_predichos + np.random.normal(0, desviacion_std, size=len(valores_predichos))
513
  datos_sinteticos = np.maximum(0, datos_sinteticos) # Asegurar que no haya valores negativos
514
  datos_sinteticos = np.round(datos_sinteticos, 2)
515
+ df[col_real] = datos_sinteticos
516
 
517
  return df
518
 
 
526
 
527
  # Reemplazar valores existentes en "Concentraci贸n Real"
528
  for col_new, col_old in zip(col_real_new, col_real_old):
529
+ df_new[col_new] = None
530
  for idx in df_new.index:
531
  if idx in df.index:
532
  df_new.at[idx, col_new] = df.at[idx, col_old]
 
543
  with gr.Tab("馃摑 Datos de Calibraci贸n"):
544
  with gr.Row():
545
  concentracion_input = gr.Number(
546
+ value=2000000,
547
  label="Concentraci贸n Inicial",
548
+ precision=0
549
  )
550
  unidad_input = gr.Textbox(
551
+ value="UFC",
552
  label="Unidad de Medida",
553
+ placeholder="UFC, OD, etc..."
554
  )
555
  filas_slider = gr.Slider(
556
  minimum=1,
 
573
  step=1,
574
  label="N煤mero de R茅plicas"
575
  )
 
 
 
 
 
576
 
577
  with gr.Row():
578
  calcular_btn = gr.Button("馃攧 Calcular", variant="primary")
579
  limpiar_btn = gr.Button("馃棏 Limpiar Datos", variant="secondary")
580
  ajustar_decimales_btn = gr.Button("馃洜 Ajustar Decimales", variant="secondary")
 
581
 
582
  with gr.Row():
583
  ejemplo_ufc_btn = gr.Button("馃搵 Cargar Ejemplo UFC", variant="secondary")
584
  ejemplo_od_btn = gr.Button("馃搵 Cargar Ejemplo OD", variant="secondary")
585
  sinteticos_btn = gr.Button("馃И Generar Datos Sint茅ticos", variant="secondary")
586
 
 
 
 
587
  tabla_output = gr.DataFrame(
588
  wrap=True,
589
  label="Tabla de Datos",
 
661
  # Evento al presionar el bot贸n Calcular
662
  calcular_btn.click(
663
  fn=actualizar_analisis,
664
+ inputs=[tabla_output, replicas_slider, unidad_input],
665
  outputs=output_components
666
  )
667
 
 
686
  outputs=[concentracion_input, unidad_input, filas_slider, tabla_output, estado_output, graficos_output, informe_output]
687
  )
688
 
 
 
 
 
 
 
 
689
  # Eventos de los botones de ejemplo
690
  ejemplo_ufc_btn.click(
691
  fn=cargar_ejemplo_ufc,
 
702
  # Evento para generar datos sint茅ticos
703
  sinteticos_btn.click(
704
  fn=generar_datos_sinteticos_evento,
705
+ inputs=[tabla_output, replicas_slider, unidad_input],
706
  outputs=tabla_output
707
  )
708
 
 
765
  # Eventos de exportar informes
766
  exportar_word_btn.click(
767
  fn=exportar_word,
768
+ inputs=[tabla_output, informe_output, unidad_input],
769
  outputs=exportar_word_file
770
  )
771
 
 
778
  # Inicializar la interfaz con el ejemplo base
779
  def iniciar_con_ejemplo():
780
  n_replicas = 1
781
+ df = generar_tabla(7, 2000000, "UFC", n_replicas)
782
  # Valores reales de ejemplo
783
+ df[f"Concentraci贸n Real 1 (UFC)"] = [2000000, 1600000, 1200000, 800000, 400000, 200000, 100000]
784
+ estado, fig, informe, df = actualizar_analisis(df, n_replicas, "UFC")
785
  return (
786
+ 2000000,
787
+ "UFC",
788
  7,
789
  df,
790
  estado,
791
  fig,
792
+ informe
 
793
  )
794
 
795
  interfaz.load(
796
  fn=iniciar_con_ejemplo,
797
+ outputs=[concentracion_input, unidad_input, filas_slider, tabla_output, estado_output, graficos_output, informe_output]
798
  )
799
 
800
  # Lanzar la interfaz