Update app.py
Browse files
app.py
CHANGED
@@ -267,10 +267,16 @@ 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):
|
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 |
|
@@ -303,7 +309,7 @@ def actualizar_analisis(df, n_replicas, unidad_medida):
|
|
303 |
|
304 |
return estado, fig, informe, df
|
305 |
|
306 |
-
def actualizar_graficos(df, n_replicas, unidad_medida,
|
307 |
palette_puntos, estilo_puntos,
|
308 |
palette_linea_ajuste, estilo_linea_ajuste,
|
309 |
palette_linea_ideal, estilo_linea_ideal,
|
@@ -312,6 +318,12 @@ def actualizar_graficos(df, n_replicas, unidad_medida,
|
|
312 |
if df is None or df.empty:
|
313 |
return None
|
314 |
|
|
|
|
|
|
|
|
|
|
|
|
|
315 |
# Asegurarse de que los c谩lculos est茅n actualizados
|
316 |
df = calcular_promedio_desviacion(df, n_replicas, unidad_medida)
|
317 |
|
@@ -430,7 +442,7 @@ def exportar_informe_latex(df_valid, informe_md):
|
|
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})"
|
@@ -499,7 +511,7 @@ def limpiar_datos(n_replicas):
|
|
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 |
|
@@ -512,7 +524,7 @@ def generar_datos_sinteticos_evento(df, n_replicas, unidad_medida):
|
|
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 |
|
@@ -573,6 +585,11 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
573 |
step=1,
|
574 |
label="N煤mero de R茅plicas"
|
575 |
)
|
|
|
|
|
|
|
|
|
|
|
576 |
|
577 |
with gr.Row():
|
578 |
calcular_btn = gr.Button("馃攧 Calcular", variant="primary")
|
@@ -661,7 +678,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
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 |
|
@@ -669,7 +686,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
669 |
graficar_btn.click(
|
670 |
fn=actualizar_graficos,
|
671 |
inputs=[
|
672 |
-
tabla_output, replicas_slider, unidad_input,
|
673 |
palette_puntos_dropdown, estilo_puntos_dropdown,
|
674 |
palette_linea_ajuste_dropdown, estilo_linea_ajuste_dropdown,
|
675 |
palette_linea_ideal_dropdown, estilo_linea_ideal_dropdown,
|
@@ -702,7 +719,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
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,7 +782,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
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 |
|
@@ -781,7 +798,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
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",
|
@@ -789,12 +806,13 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
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
|
|
|
267 |
"""
|
268 |
return informe, evaluacion['estado']
|
269 |
|
270 |
+
def actualizar_analisis(df, n_replicas, unidad_medida, absorbancia_blanco):
|
271 |
if df is None or df.empty:
|
272 |
return "Error en los datos", None, "No se pueden generar an谩lisis", df
|
273 |
|
274 |
+
# Ajustar valores de absorbancia reales por el valor del blanco
|
275 |
+
for i in range(1, n_replicas + 1):
|
276 |
+
col_real = f"Concentraci贸n Real {i} ({unidad_medida})"
|
277 |
+
df[col_real] = pd.to_numeric(df[col_real], errors='coerce')
|
278 |
+
df[col_real] = df[col_real] - absorbancia_blanco
|
279 |
+
|
280 |
# Calcular promedio y desviaci贸n est谩ndar dependiendo de las r茅plicas
|
281 |
df = calcular_promedio_desviacion(df, n_replicas, unidad_medida)
|
282 |
|
|
|
309 |
|
310 |
return estado, fig, informe, df
|
311 |
|
312 |
+
def actualizar_graficos(df, n_replicas, unidad_medida, absorbancia_blanco,
|
313 |
palette_puntos, estilo_puntos,
|
314 |
palette_linea_ajuste, estilo_linea_ajuste,
|
315 |
palette_linea_ideal, estilo_linea_ideal,
|
|
|
318 |
if df is None or df.empty:
|
319 |
return None
|
320 |
|
321 |
+
# Ajustar valores de absorbancia reales por el valor del blanco
|
322 |
+
for i in range(1, n_replicas + 1):
|
323 |
+
col_real = f"Concentraci贸n Real {i} ({unidad_medida})"
|
324 |
+
df[col_real] = pd.to_numeric(df[col_real], errors='coerce')
|
325 |
+
df[col_real] = df[col_real] - absorbancia_blanco
|
326 |
+
|
327 |
# Asegurarse de que los c谩lculos est茅n actualizados
|
328 |
df = calcular_promedio_desviacion(df, n_replicas, unidad_medida)
|
329 |
|
|
|
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})"
|
|
|
511 |
"" # Informe Output
|
512 |
)
|
513 |
|
514 |
+
def generar_datos_sinteticos_evento(df, n_replicas, unidad_medida, absorbancia_blanco):
|
515 |
df = df.copy()
|
516 |
col_predicha_num = "Concentraci贸n Predicha Num茅rica"
|
517 |
|
|
|
524 |
datos_sinteticos = valores_predichos + np.random.normal(0, desviacion_std, size=len(valores_predichos))
|
525 |
datos_sinteticos = np.maximum(0, datos_sinteticos) # Asegurar que no haya valores negativos
|
526 |
datos_sinteticos = np.round(datos_sinteticos, 2)
|
527 |
+
df[col_real] = datos_sinteticos - absorbancia_blanco
|
528 |
|
529 |
return df
|
530 |
|
|
|
585 |
step=1,
|
586 |
label="N煤mero de R茅plicas"
|
587 |
)
|
588 |
+
absorbancia_blanco_input = gr.Number(
|
589 |
+
value=0.0,
|
590 |
+
label="Absorbancia del Blanco",
|
591 |
+
precision=2
|
592 |
+
)
|
593 |
|
594 |
with gr.Row():
|
595 |
calcular_btn = gr.Button("馃攧 Calcular", variant="primary")
|
|
|
678 |
# Evento al presionar el bot贸n Calcular
|
679 |
calcular_btn.click(
|
680 |
fn=actualizar_analisis,
|
681 |
+
inputs=[tabla_output, replicas_slider, unidad_input, absorbancia_blanco_input],
|
682 |
outputs=output_components
|
683 |
)
|
684 |
|
|
|
686 |
graficar_btn.click(
|
687 |
fn=actualizar_graficos,
|
688 |
inputs=[
|
689 |
+
tabla_output, replicas_slider, unidad_input, absorbancia_blanco_input,
|
690 |
palette_puntos_dropdown, estilo_puntos_dropdown,
|
691 |
palette_linea_ajuste_dropdown, estilo_linea_ajuste_dropdown,
|
692 |
palette_linea_ideal_dropdown, estilo_linea_ideal_dropdown,
|
|
|
719 |
# Evento para generar datos sint茅ticos
|
720 |
sinteticos_btn.click(
|
721 |
fn=generar_datos_sinteticos_evento,
|
722 |
+
inputs=[tabla_output, replicas_slider, unidad_input, absorbancia_blanco_input],
|
723 |
outputs=tabla_output
|
724 |
)
|
725 |
|
|
|
782 |
# Eventos de exportar informes
|
783 |
exportar_word_btn.click(
|
784 |
fn=exportar_word,
|
785 |
+
inputs=[tabla_output, informe_output, unidad_input, absorbancia_blanco_input],
|
786 |
outputs=exportar_word_file
|
787 |
)
|
788 |
|
|
|
798 |
df = generar_tabla(7, 2000000, "UFC", n_replicas)
|
799 |
# Valores reales de ejemplo
|
800 |
df[f"Concentraci贸n Real 1 (UFC)"] = [2000000, 1600000, 1200000, 800000, 400000, 200000, 100000]
|
801 |
+
estado, fig, informe, df = actualizar_analisis(df, n_replicas, "UFC", 0.0)
|
802 |
return (
|
803 |
2000000,
|
804 |
"UFC",
|
|
|
806 |
df,
|
807 |
estado,
|
808 |
fig,
|
809 |
+
informe,
|
810 |
+
0.0
|
811 |
)
|
812 |
|
813 |
interfaz.load(
|
814 |
fn=iniciar_con_ejemplo,
|
815 |
+
outputs=[concentracion_input, unidad_input, filas_slider, tabla_output, estado_output, graficos_output, informe_output, absorbancia_blanco_input]
|
816 |
)
|
817 |
|
818 |
# Lanzar la interfaz
|