C2MV commited on
Commit
9a4cc26
verified
1 Parent(s): aca9c5b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +84 -109
app.py CHANGED
@@ -267,95 +267,58 @@ Fecha: {datetime.now().strftime('%d/%m/%Y %H:%M')}
267
  """
268
  return informe, evaluacion['estado']
269
 
270
- def generar_graficos_actualizados(df_valid, n_replicas, unidad_medida,
271
- palette_puntos, estilo_puntos,
272
- palette_linea_ajuste, estilo_linea_ajuste,
273
- palette_linea_ideal, estilo_linea_ideal,
274
- palette_barras_error,
275
- mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos):
276
- # Funci贸n separada para evitar redundancia
277
- return generar_graficos(df_valid, n_replicas, unidad_medida,
278
- palette_puntos, estilo_puntos,
279
- palette_linea_ajuste, estilo_linea_ajuste,
280
- palette_linea_ideal, estilo_linea_ideal,
281
- palette_barras_error,
282
- mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos)
283
-
284
- def evaluar_puntos_seleccionados(df, puntos_seleccionados):
285
- if not puntos_seleccionados:
286
- return df # Si no se selecciona ning煤n punto, retornar el DataFrame completo
287
-
288
- # Filtrar el DataFrame para incluir solo los puntos seleccionados
289
- df_filtrado = df.iloc[puntos_seleccionados].reset_index(drop=True)
290
- return df_filtrado
291
-
292
- def generar_lista_puntos(df):
293
  """Genera una lista de descripciones de puntos para el CheckboxGroup"""
294
  lista = []
295
  for idx, row in df.iterrows():
296
- descripcion = f"Punto {idx + 1}: Predicha={row['Concentraci贸n Predicha (UFC)']}, Real Promedio={row['Concentraci贸n Real Promedio (UFC)']}"
 
 
297
  lista.append(descripcion)
298
  return lista
299
 
300
- def actualizar_analisis(df, n_replicas, unidad_medida):
301
- if df is None or df.empty:
302
- return "Error en los datos", None, "No se pueden generar an谩lisis", df
303
-
304
- # Calcular promedio y desviaci贸n est谩ndar dependiendo de las r茅plicas
305
- df = calcular_promedio_desviacion(df, n_replicas, unidad_medida)
306
-
307
- col_predicha_num = "Concentraci贸n Predicha Num茅rica"
308
- col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
309
-
310
- # Convertir columnas a num茅rico
311
- df[col_predicha_num] = pd.to_numeric(df[col_predicha_num], errors='coerce')
312
- df[col_real_promedio] = pd.to_numeric(df[col_real_promedio], errors='coerce')
313
-
314
- df_valid = df.dropna(subset=[col_predicha_num, col_real_promedio])
315
-
316
- if len(df_valid) < 2:
317
- return "Se necesitan m谩s datos", None, "Se requieren al menos dos valores reales para el an谩lisis", df
318
-
319
- # Calcular la regresi贸n y agregar 'Ajuste Lineal'
320
- slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_predicha_num], df_valid[col_real_promedio])
321
- df_valid['Ajuste Lineal'] = intercept + slope * df_valid[col_predicha_num]
322
 
323
- # Generar gr谩fico con opciones predeterminadas
324
- fig = generar_graficos(
325
- df_valid, n_replicas, unidad_medida,
326
- palette_puntos='deep', estilo_puntos='o',
327
- palette_linea_ajuste='muted', estilo_linea_ajuste='-',
328
- palette_linea_ideal='bright', estilo_linea_ideal='--',
329
- palette_barras_error='pastel',
330
- mostrar_linea_ajuste=True, mostrar_linea_ideal=True, mostrar_puntos=True
331
- )
332
- informe, estado = generar_informe_completo(df_valid, n_replicas, unidad_medida)
333
 
334
- return estado, fig, informe, df
 
 
 
335
 
336
- def actualizar_graficos(df, n_replicas, unidad_medida,
337
- palette_puntos, estilo_puntos,
338
- palette_linea_ajuste, estilo_linea_ajuste,
339
- palette_linea_ideal, estilo_linea_ideal,
340
- palette_barras_error,
341
- mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos):
342
  if df is None or df.empty:
343
- return None
344
 
345
  # Calcular promedio y desviaci贸n est谩ndar
346
  df = calcular_promedio_desviacion(df, n_replicas, unidad_medida)
347
 
 
 
 
348
  col_predicha_num = "Concentraci贸n Predicha Num茅rica"
349
  col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
350
 
351
  # Convertir columnas a num茅rico
352
- df[col_predicha_num] = pd.to_numeric(df[col_predicha_num], errors='coerce')
353
- df[col_real_promedio] = pd.to_numeric(df[col_real_promedio], errors='coerce')
354
 
355
- df_valid = df.dropna(subset=[col_predicha_num, col_real_promedio])
356
 
357
  if len(df_valid) < 2:
358
- return None
 
 
 
 
359
 
360
  # Generar gr谩fico con opciones seleccionadas
361
  fig = generar_graficos(
@@ -367,56 +330,54 @@ def actualizar_graficos(df, n_replicas, unidad_medida,
367
  mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos
368
  )
369
 
370
- return fig
 
371
 
372
- def recalcular(df, n_replicas, unidad_medida, puntos_seleccionados,
373
- palette_puntos, estilo_puntos,
374
- palette_linea_ajuste, estilo_linea_ajuste,
375
- palette_linea_ideal, estilo_linea_ideal,
376
- palette_barras_error,
377
- mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos):
378
  if df is None or df.empty:
379
- return "Error en los datos", None, "No se pueden generar an谩lisis", df, []
380
 
381
- # Calcular promedio y desviaci贸n est谩ndar
382
  df = calcular_promedio_desviacion(df, n_replicas, unidad_medida)
383
 
384
- # Filtrar los puntos seleccionados
385
- df_filtrado = evaluar_puntos_seleccionados(df, puntos_seleccionados)
386
-
387
  col_predicha_num = "Concentraci贸n Predicha Num茅rica"
388
  col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
389
 
390
  # Convertir columnas a num茅rico
391
- df_filtrado[col_predicha_num] = pd.to_numeric(df_filtrado[col_predicha_num], errors='coerce')
392
- df_filtrado[col_real_promedio] = pd.to_numeric(df_filtrado[col_real_promedio], errors='coerce')
393
 
394
- df_valid = df_filtrado.dropna(subset=[col_predicha_num, col_real_promedio])
395
 
396
  if len(df_valid) < 2:
397
- return "Se necesitan m谩s datos", None, "Se requieren al menos dos valores reales para el an谩lisis", df, []
398
 
399
  # Calcular la regresi贸n y agregar 'Ajuste Lineal'
400
  slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_predicha_num], df_valid[col_real_promedio])
401
  df_valid['Ajuste Lineal'] = intercept + slope * df_valid[col_predicha_num]
402
 
403
- # Generar gr谩fico con opciones seleccionadas
404
  fig = generar_graficos(
405
  df_valid, n_replicas, unidad_medida,
406
- palette_puntos, estilo_puntos,
407
- palette_linea_ajuste, estilo_linea_ajuste,
408
- palette_linea_ideal, estilo_linea_ideal,
409
- palette_barras_error,
410
- mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos
411
  )
412
 
413
  # Generar informe
414
  informe, estado = generar_informe_completo(df_valid, n_replicas, unidad_medida)
415
 
416
  # Generar lista de puntos para selecci贸n
417
- lista_puntos = generar_lista_puntos(df)
418
 
419
- return estado, fig, informe, df, lista_puntos
420
 
421
  def exportar_informe_word(df_valid, informe_md, unidad_medida):
422
  # Crear documento Word
@@ -446,7 +407,10 @@ def exportar_informe_word(df_valid, informe_md, unidad_medida):
446
  leyenda = doc.add_paragraph('Figura 1. Gr谩fico de calibraci贸n.')
447
  leyenda_format = leyenda.paragraph_format
448
  leyenda_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
449
- leyenda.style = doc.styles['Caption']
 
 
 
450
 
451
  # Agregar contenido del informe
452
  doc.add_heading('Resumen Estad铆stico', level=1)
@@ -527,10 +491,10 @@ def exportar_word(df, informe_md, unidad_medida):
527
 
528
  return filename # Retornamos el nombre del archivo
529
 
530
- def exportar_latex(df, informe_md):
531
  df_valid = df.copy()
532
  col_predicha_num = "Concentraci贸n Predicha Num茅rica"
533
- col_real_promedio = [col for col in df_valid.columns if 'Real Promedio' in col][0]
534
 
535
  # Convertir columnas a num茅rico
536
  df_valid[col_predicha_num] = pd.to_numeric(df_valid[col_predicha_num], errors='coerce')
@@ -676,7 +640,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
676
  with gr.Column(scale=3):
677
  graficos_output = gr.Plot(label="Gr谩ficos de An谩lisis")
678
  with gr.Row():
679
- # Opciones y botones debajo del gr谩fico
680
  graficar_btn = gr.Button("馃搳 Graficar", variant="primary")
681
  with gr.Column(scale=1):
682
  puntos_seleccionados = gr.CheckboxGroup(
@@ -744,19 +708,31 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
744
  informe_output = gr.Markdown(elem_id="informe_output")
745
 
746
  # Eventos
747
- input_components = [tabla_output]
748
- output_components = [estado_output, graficos_output, informe_output, tabla_output]
749
 
750
  # Evento al presionar el bot贸n Calcular
751
  calcular_btn.click(
752
  fn=actualizar_analisis,
753
  inputs=[tabla_output, replicas_slider, unidad_input],
754
- outputs=[estado_output, graficos_output, informe_output, tabla_output]
755
  )
756
 
757
  # Evento para graficar con opciones seleccionadas
758
  graficar_btn.click(
759
- fn=actualizar_graficos,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
760
  inputs=[
761
  tabla_output, replicas_slider, unidad_input,
762
  palette_puntos_dropdown, estilo_puntos_dropdown,
@@ -787,20 +763,20 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
787
  limpiar_btn.click(
788
  fn=limpiar_datos,
789
  inputs=[replicas_slider],
790
- outputs=[concentracion_input, unidad_input, filas_slider, tabla_output, estado_output, graficos_output, informe_output]
791
  )
792
 
793
  # Eventos de los botones de ejemplo
794
  ejemplo_ufc_btn.click(
795
  fn=cargar_ejemplo_ufc,
796
  inputs=[replicas_slider],
797
- outputs=[concentracion_input, unidad_input, filas_slider, tabla_output]
798
  )
799
 
800
  ejemplo_od_btn.click(
801
  fn=cargar_ejemplo_od,
802
  inputs=[replicas_slider],
803
- outputs=[concentracion_input, unidad_input, filas_slider, tabla_output]
804
  )
805
 
806
  # Evento para generar datos sint茅ticos
@@ -874,8 +850,8 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
874
  )
875
 
876
  exportar_latex_btn.click(
877
- fn=exportar_latex,
878
- inputs=[tabla_output, informe_output],
879
  outputs=exportar_latex_file
880
  )
881
 
@@ -885,17 +861,16 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
885
  df = generar_tabla(7, 2000000, "UFC", n_replicas)
886
  # Valores reales de ejemplo
887
  df[f"Concentraci贸n Real 1 (UFC)"] = [2000000, 1600000, 1200000, 800000, 400000, 200000, 100000]
888
- estado, fig, informe, df = actualizar_analisis(df, n_replicas, "UFC")
889
- lista_puntos = generar_lista_puntos(df)
890
  return (
891
  2000000,
892
  "UFC",
893
  7,
894
- df,
895
  estado,
896
  fig,
897
  informe,
898
- lista_puntos
899
  )
900
 
901
  interfaz.load(
 
267
  """
268
  return informe, evaluacion['estado']
269
 
270
+ def generar_lista_puntos(df, unidad_medida):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
271
  """Genera una lista de descripciones de puntos para el CheckboxGroup"""
272
  lista = []
273
  for idx, row in df.iterrows():
274
+ predicha = row.get(f"Concentraci贸n Predicha ({unidad_medida})", "N/A")
275
+ real_promedio = row.get(f"Concentraci贸n Real Promedio ({unidad_medida})", "N/A")
276
+ descripcion = f"Punto {idx + 1}: Predicha={predicha}, Real Promedio={real_promedio}"
277
  lista.append(descripcion)
278
  return lista
279
 
280
+ def evaluar_puntos_seleccionados(df, puntos_seleccionados, unidad_medida):
281
+ if not puntos_seleccionados:
282
+ return df # Si no se selecciona ning煤n punto, retornar el DataFrame completo
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
283
 
284
+ # Crear una lista de descripciones para comparaci贸n
285
+ lista_puntos = generar_lista_puntos(df, unidad_medida)
 
 
 
 
 
 
 
 
286
 
287
+ # Filtrar el DataFrame para incluir solo los puntos seleccionados
288
+ indices_seleccionados = [lista_puntos.index(punto) for punto in puntos_seleccionados if punto in lista_puntos]
289
+ df_filtrado = df.iloc[indices_seleccionados].reset_index(drop=True)
290
+ return df_filtrado
291
 
292
+ def recalcular(df, n_replicas, unidad_medida, puntos_seleccionados,
293
+ palette_puntos, estilo_puntos,
294
+ palette_linea_ajuste, estilo_linea_ajuste,
295
+ palette_linea_ideal, estilo_linea_ideal,
296
+ palette_barras_error,
297
+ mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos):
298
  if df is None or df.empty:
299
+ return "Error en los datos", None, "No se pueden generar an谩lisis", df, gr.CheckboxGroup.update(choices=[], value=[])
300
 
301
  # Calcular promedio y desviaci贸n est谩ndar
302
  df = calcular_promedio_desviacion(df, n_replicas, unidad_medida)
303
 
304
+ # Filtrar los puntos seleccionados
305
+ df_filtrado = evaluar_puntos_seleccionados(df, puntos_seleccionados, unidad_medida)
306
+
307
  col_predicha_num = "Concentraci贸n Predicha Num茅rica"
308
  col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
309
 
310
  # Convertir columnas a num茅rico
311
+ df_filtrado[col_predicha_num] = pd.to_numeric(df_filtrado[col_predicha_num], errors='coerce')
312
+ df_filtrado[col_real_promedio] = pd.to_numeric(df_filtrado[col_real_promedio], errors='coerce')
313
 
314
+ df_valid = df_filtrado.dropna(subset=[col_predicha_num, col_real_promedio])
315
 
316
  if len(df_valid) < 2:
317
+ return "Se necesitan m谩s datos", None, "Se requieren al menos dos valores reales para el an谩lisis", df, gr.CheckboxGroup.update(choices=[], value=[])
318
+
319
+ # Calcular la regresi贸n y agregar 'Ajuste Lineal'
320
+ slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_predicha_num], df_valid[col_real_promedio])
321
+ df_valid['Ajuste Lineal'] = intercept + slope * df_valid[col_predicha_num]
322
 
323
  # Generar gr谩fico con opciones seleccionadas
324
  fig = generar_graficos(
 
330
  mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos
331
  )
332
 
333
+ # Generar informe
334
+ informe, estado = generar_informe_completo(df_valid, n_replicas, unidad_medida)
335
 
336
+ # Generar lista de puntos para selecci贸n
337
+ lista_puntos = generar_lista_puntos(df, unidad_medida)
338
+
339
+ return estado, fig, informe, df, gr.CheckboxGroup.update(choices=lista_puntos, value=puntos_seleccionados)
340
+
341
+ def actualizar_analisis(df, n_replicas, unidad_medida):
342
  if df is None or df.empty:
343
+ return "Error en los datos", None, "No se pueden generar an谩lisis", df
344
 
345
+ # Calcular promedio y desviaci贸n est谩ndar dependiendo de las r茅plicas
346
  df = calcular_promedio_desviacion(df, n_replicas, unidad_medida)
347
 
 
 
 
348
  col_predicha_num = "Concentraci贸n Predicha Num茅rica"
349
  col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
350
 
351
  # Convertir columnas a num茅rico
352
+ df[col_predicha_num] = pd.to_numeric(df[col_predicha_num], errors='coerce')
353
+ df[col_real_promedio] = pd.to_numeric(df[col_real_promedio], errors='coerce')
354
 
355
+ df_valid = df.dropna(subset=[col_predicha_num, col_real_promedio])
356
 
357
  if len(df_valid) < 2:
358
+ return "Se necesitan m谩s datos", None, "Se requieren al menos dos valores reales para el an谩lisis", df
359
 
360
  # Calcular la regresi贸n y agregar 'Ajuste Lineal'
361
  slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_predicha_num], df_valid[col_real_promedio])
362
  df_valid['Ajuste Lineal'] = intercept + slope * df_valid[col_predicha_num]
363
 
364
+ # Generar gr谩fico con opciones predeterminadas
365
  fig = generar_graficos(
366
  df_valid, n_replicas, unidad_medida,
367
+ palette_puntos='deep', estilo_puntos='o',
368
+ palette_linea_ajuste='muted', estilo_linea_ajuste='-',
369
+ palette_linea_ideal='bright', estilo_linea_ideal='--',
370
+ palette_barras_error='pastel',
371
+ mostrar_linea_ajuste=True, mostrar_linea_ideal=True, mostrar_puntos=True
372
  )
373
 
374
  # Generar informe
375
  informe, estado = generar_informe_completo(df_valid, n_replicas, unidad_medida)
376
 
377
  # Generar lista de puntos para selecci贸n
378
+ lista_puntos = generar_lista_puntos(df, unidad_medida)
379
 
380
+ return estado, fig, informe, df, gr.CheckboxGroup.update(choices=lista_puntos, value=lista_puntos)
381
 
382
  def exportar_informe_word(df_valid, informe_md, unidad_medida):
383
  # Crear documento Word
 
407
  leyenda = doc.add_paragraph('Figura 1. Gr谩fico de calibraci贸n.')
408
  leyenda_format = leyenda.paragraph_format
409
  leyenda_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
410
+ if 'Caption' in doc.styles:
411
+ leyenda.style = doc.styles['Caption']
412
+ else:
413
+ leyenda.style = doc.styles['Normal'] # Fallback si no existe 'Caption'
414
 
415
  # Agregar contenido del informe
416
  doc.add_heading('Resumen Estad铆stico', level=1)
 
491
 
492
  return filename # Retornamos el nombre del archivo
493
 
494
+ def exportar_latex(df, informe_md, unidad_medida):
495
  df_valid = df.copy()
496
  col_predicha_num = "Concentraci贸n Predicha Num茅rica"
497
+ col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
498
 
499
  # Convertir columnas a num茅rico
500
  df_valid[col_predicha_num] = pd.to_numeric(df_valid[col_predicha_num], errors='coerce')
 
640
  with gr.Column(scale=3):
641
  graficos_output = gr.Plot(label="Gr谩ficos de An谩lisis")
642
  with gr.Row():
643
+ # Botones debajo del gr谩fico
644
  graficar_btn = gr.Button("馃搳 Graficar", variant="primary")
645
  with gr.Column(scale=1):
646
  puntos_seleccionados = gr.CheckboxGroup(
 
708
  informe_output = gr.Markdown(elem_id="informe_output")
709
 
710
  # Eventos
 
 
711
 
712
  # Evento al presionar el bot贸n Calcular
713
  calcular_btn.click(
714
  fn=actualizar_analisis,
715
  inputs=[tabla_output, replicas_slider, unidad_input],
716
+ outputs=[estado_output, graficos_output, informe_output, tabla_output, puntos_seleccionados]
717
  )
718
 
719
  # Evento para graficar con opciones seleccionadas
720
  graficar_btn.click(
721
+ fn=lambda df, n_replicas, unidad_medida, pal_p, est_p, pal_aj, est_aj, pal_id, est_id, pal_be, m_aj, m_id, m_p: generar_graficos(
722
+ calcular_promedio_desviacion(df, n_replicas, unidad_medida),
723
+ n_replicas,
724
+ unidad_medida,
725
+ pal_p,
726
+ est_p,
727
+ pal_aj,
728
+ est_aj,
729
+ pal_id,
730
+ est_id,
731
+ pal_be,
732
+ m_aj,
733
+ m_id,
734
+ m_p
735
+ ),
736
  inputs=[
737
  tabla_output, replicas_slider, unidad_input,
738
  palette_puntos_dropdown, estilo_puntos_dropdown,
 
763
  limpiar_btn.click(
764
  fn=limpiar_datos,
765
  inputs=[replicas_slider],
766
+ outputs=[concentracion_input, unidad_input, filas_slider, tabla_output, estado_output, graficos_output, informe_output, puntos_seleccionados]
767
  )
768
 
769
  # Eventos de los botones de ejemplo
770
  ejemplo_ufc_btn.click(
771
  fn=cargar_ejemplo_ufc,
772
  inputs=[replicas_slider],
773
+ outputs=[concentracion_input, unidad_input, filas_slider, tabla_output, puntos_seleccionados]
774
  )
775
 
776
  ejemplo_od_btn.click(
777
  fn=cargar_ejemplo_od,
778
  inputs=[replicas_slider],
779
+ outputs=[concentracion_input, unidad_input, filas_slider, tabla_output, puntos_seleccionados]
780
  )
781
 
782
  # Evento para generar datos sint茅ticos
 
850
  )
851
 
852
  exportar_latex_btn.click(
853
+ fn=lambda df, informe_md, unidad_medida: exportar_latex(df, informe_md, unidad_medida),
854
+ inputs=[tabla_output, informe_output, unidad_input],
855
  outputs=exportar_latex_file
856
  )
857
 
 
861
  df = generar_tabla(7, 2000000, "UFC", n_replicas)
862
  # Valores reales de ejemplo
863
  df[f"Concentraci贸n Real 1 (UFC)"] = [2000000, 1600000, 1200000, 800000, 400000, 200000, 100000]
864
+ estado, fig, informe, df_actualizado, lista_puntos_update = actualizar_analisis(df, n_replicas, "UFC")
 
865
  return (
866
  2000000,
867
  "UFC",
868
  7,
869
+ df_actualizado,
870
  estado,
871
  fig,
872
  informe,
873
+ lista_puntos_update
874
  )
875
 
876
  interfaz.load(