Update app.py
Browse files
app.py
CHANGED
|
@@ -41,10 +41,12 @@ def calcular_promedio_desviacion(df, n_replicas, unidad_medida, decimales):
|
|
| 41 |
|
| 42 |
return df
|
| 43 |
|
| 44 |
-
def generar_graficos(df_valid, n_replicas, unidad_medida,
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
|
|
|
|
|
|
| 48 |
col_predicha_num = "Concentraci贸n Predicha Num茅rica"
|
| 49 |
col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
|
| 50 |
col_desviacion = f"Desviaci贸n Est谩ndar ({unidad_medida})"
|
|
@@ -66,16 +68,7 @@ def generar_graficos(df_valid, n_replicas, unidad_medida, palette_puntos, estilo
|
|
| 66 |
|
| 67 |
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
|
| 68 |
|
| 69 |
-
|
| 70 |
-
colors_linea_ajuste = sns.color_palette(palette_linea_ajuste, as_cmap=False)
|
| 71 |
-
colors_linea_ideal = sns.color_palette(palette_linea_ideal, as_cmap=False)
|
| 72 |
-
colors_barras_error = sns.color_palette(palette_barras_error, as_cmap=False)
|
| 73 |
-
|
| 74 |
-
color_puntos = colors_puntos[0]
|
| 75 |
-
color_linea_ajuste = colors_linea_ajuste[0]
|
| 76 |
-
color_linea_ideal = colors_linea_ideal[0]
|
| 77 |
-
color_barras_error = colors_barras_error[0]
|
| 78 |
-
|
| 79 |
if mostrar_puntos:
|
| 80 |
if n_replicas > 1:
|
| 81 |
ax1.errorbar(
|
|
@@ -135,6 +128,7 @@ def generar_graficos(df_valid, n_replicas, unidad_medida, palette_puntos, estilo
|
|
| 135 |
|
| 136 |
ax1.legend(loc='lower right', fontsize=10)
|
| 137 |
|
|
|
|
| 138 |
residuos = df_valid[col_real_promedio] - df_valid['Ajuste Lineal']
|
| 139 |
ax2.scatter(
|
| 140 |
df_valid[col_predicha_num],
|
|
@@ -257,12 +251,13 @@ def actualizar_analisis(df, n_replicas, unidad_medida, filas_seleccionadas, deci
|
|
| 257 |
slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_predicha_num], df_valid[col_real_promedio])
|
| 258 |
df_valid['Ajuste Lineal'] = intercept + slope * df_valid[col_predicha_num]
|
| 259 |
|
|
|
|
| 260 |
fig = generar_graficos(
|
| 261 |
df_valid, n_replicas, unidad_medida,
|
| 262 |
-
|
| 263 |
-
|
| 264 |
-
|
| 265 |
-
|
| 266 |
mostrar_linea_ajuste=True,
|
| 267 |
mostrar_linea_ideal=False,
|
| 268 |
mostrar_puntos=True
|
|
@@ -271,47 +266,6 @@ def actualizar_analisis(df, n_replicas, unidad_medida, filas_seleccionadas, deci
|
|
| 271 |
|
| 272 |
return estado, fig, informe, df
|
| 273 |
|
| 274 |
-
def actualizar_graficos(df, n_replicas, unidad_medida,
|
| 275 |
-
palette_puntos, estilo_puntos,
|
| 276 |
-
palette_linea_ajuste, estilo_linea_ajuste,
|
| 277 |
-
palette_linea_ideal, estilo_linea_ideal,
|
| 278 |
-
palette_barras_error,
|
| 279 |
-
mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos,
|
| 280 |
-
filas_seleccionadas, decimales):
|
| 281 |
-
if df is None or df.empty:
|
| 282 |
-
return None
|
| 283 |
-
|
| 284 |
-
df = calcular_promedio_desviacion(df, n_replicas, unidad_medida, decimales)
|
| 285 |
-
|
| 286 |
-
col_predicha_num = "Concentraci贸n Predicha Num茅rica"
|
| 287 |
-
col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
|
| 288 |
-
|
| 289 |
-
df[col_predicha_num] = pd.to_numeric(df[col_predicha_num], errors='coerce')
|
| 290 |
-
df[col_real_promedio] = pd.to_numeric(df[col_real_promedio], errors='coerce')
|
| 291 |
-
|
| 292 |
-
df_valid = df.dropna(subset=[col_predicha_num, col_real_promedio])
|
| 293 |
-
df_valid.reset_index(drop=True, inplace=True)
|
| 294 |
-
|
| 295 |
-
if not filas_seleccionadas:
|
| 296 |
-
return None
|
| 297 |
-
|
| 298 |
-
indices_seleccionados = [int(s.split(' ')[1]) - 1 for s in filas_seleccionadas]
|
| 299 |
-
df_valid = df_valid.loc[indices_seleccionados]
|
| 300 |
-
|
| 301 |
-
if len(df_valid) < 2:
|
| 302 |
-
return None
|
| 303 |
-
|
| 304 |
-
fig = generar_graficos(
|
| 305 |
-
df_valid, n_replicas, unidad_medida,
|
| 306 |
-
palette_puntos, estilo_puntos,
|
| 307 |
-
palette_linea_ajuste, estilo_linea_ajuste,
|
| 308 |
-
palette_linea_ideal, estilo_linea_ideal,
|
| 309 |
-
palette_barras_error,
|
| 310 |
-
mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos
|
| 311 |
-
)
|
| 312 |
-
|
| 313 |
-
return fig
|
| 314 |
-
|
| 315 |
def exportar_informe_word(df_valid, informe_md, unidad_medida):
|
| 316 |
doc = docx.Document()
|
| 317 |
|
|
@@ -450,13 +404,13 @@ def limpiar_datos(n_replicas):
|
|
| 450 |
"Concentraci贸n Predicha (mg/L)": [2000000/(1/(1/(2**i))) for i in range(7)]
|
| 451 |
})
|
| 452 |
return (
|
| 453 |
-
2000000,
|
| 454 |
-
"UFC",
|
| 455 |
-
7,
|
| 456 |
-
df,
|
| 457 |
-
"",
|
| 458 |
-
None,
|
| 459 |
-
""
|
| 460 |
)
|
| 461 |
|
| 462 |
def generar_datos_sinteticos_evento(df, n_replicas, unidad_medida):
|
|
@@ -526,14 +480,23 @@ def cargar_excel(file):
|
|
| 526 |
|
| 527 |
return concentracion_inicial, unidad_medida, n_filas, n_replicas, df_sistema, "", None, ""
|
| 528 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 529 |
def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas_regresion,
|
| 530 |
-
|
| 531 |
-
|
| 532 |
mostrar_linea_ajuste, mostrar_puntos,
|
| 533 |
legend_location, decimales,
|
| 534 |
titulo_grafico_original, titulo_grafico_personalizado,
|
| 535 |
eje_x_original, eje_y_original,
|
| 536 |
eje_x_personalizado, eje_y_personalizado):
|
|
|
|
| 537 |
if df is None or df.empty:
|
| 538 |
return "Datos insuficientes", None, None, None
|
| 539 |
|
|
@@ -559,7 +522,7 @@ def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas_re
|
|
| 559 |
if not filas_seleccionadas_regresion:
|
| 560 |
return "Se necesitan m谩s datos", None, None, None
|
| 561 |
|
| 562 |
-
indices_seleccionados = [int(s.split(' ')[1]) - 1 for s in filas_seleccionadas_regresion
|
| 563 |
if len(indices_seleccionados) < 2:
|
| 564 |
return "Se requieren al menos dos puntos para calcular la regresi贸n", None, None, None
|
| 565 |
|
|
@@ -570,12 +533,13 @@ def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas_re
|
|
| 570 |
sns.set(style="whitegrid")
|
| 571 |
fig_original, ax_original = plt.subplots(figsize=(8, 6))
|
| 572 |
|
|
|
|
| 573 |
ax_original.errorbar(
|
| 574 |
df_original[col_concentracion],
|
| 575 |
df_original[col_real_promedio],
|
| 576 |
yerr=df_original[col_desviacion],
|
| 577 |
-
fmt=
|
| 578 |
-
color=
|
| 579 |
ecolor='gray',
|
| 580 |
elinewidth=1,
|
| 581 |
capsize=3,
|
|
@@ -587,7 +551,7 @@ def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas_re
|
|
| 587 |
ax_original.plot(
|
| 588 |
df_original[col_concentracion],
|
| 589 |
intercept_all + slope_all * df_original[col_concentracion],
|
| 590 |
-
color=
|
| 591 |
linestyle='-',
|
| 592 |
label='Ajuste Lineal'
|
| 593 |
)
|
|
@@ -606,15 +570,10 @@ def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas_re
|
|
| 606 |
verticalalignment='top'
|
| 607 |
)
|
| 608 |
|
|
|
|
| 609 |
sns.set(style="whitegrid")
|
| 610 |
fig_personalizado, ax_personalizado = plt.subplots(figsize=(8, 6))
|
| 611 |
|
| 612 |
-
colors_puntos = sns.color_palette(palette_puntos, as_cmap=False)
|
| 613 |
-
colors_linea_ajuste = sns.color_palette(palette_linea_ajuste, as_cmap=False)
|
| 614 |
-
|
| 615 |
-
color_puntos = colors_puntos[0]
|
| 616 |
-
color_linea_ajuste = colors_linea_ajuste[0]
|
| 617 |
-
|
| 618 |
if mostrar_puntos:
|
| 619 |
ax_personalizado.errorbar(
|
| 620 |
df_valid[col_concentracion],
|
|
@@ -656,18 +615,35 @@ def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas_re
|
|
| 656 |
|
| 657 |
return "Regresi贸n calculada exitosamente", fig_original, fig_personalizado, df_resumen
|
| 658 |
|
| 659 |
-
def
|
| 660 |
-
|
| 661 |
-
|
| 662 |
-
|
| 663 |
-
|
| 664 |
-
|
| 665 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 666 |
|
|
|
|
|
|
|
| 667 |
with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
| 668 |
gr.Markdown("""
|
| 669 |
# 馃搳 Sistema Avanzado de Calibraci贸n con An谩lisis Estad锟斤拷stico
|
| 670 |
-
|
| 671 |
""")
|
| 672 |
|
| 673 |
with gr.Tab("馃摑 Datos de Calibraci贸n"):
|
|
@@ -733,23 +709,13 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
| 733 |
)
|
| 734 |
|
| 735 |
with gr.Row():
|
| 736 |
-
|
| 737 |
-
|
| 738 |
-
palette_puntos_dropdown = gr.Dropdown(
|
| 739 |
-
choices=paletas_colores,
|
| 740 |
-
value="deep",
|
| 741 |
-
label="Paleta para Puntos"
|
| 742 |
-
)
|
| 743 |
estilo_puntos_dropdown = gr.Dropdown(
|
| 744 |
choices=["o", "s", "^", "D", "v", "<", ">", "h", "H", "p", "*", "X", "d"],
|
| 745 |
value="o",
|
| 746 |
-
label="Estilo de
|
| 747 |
-
)
|
| 748 |
-
palette_linea_ajuste_dropdown = gr.Dropdown(
|
| 749 |
-
choices=paletas_colores,
|
| 750 |
-
value="muted",
|
| 751 |
-
label="Paleta L铆nea de Ajuste"
|
| 752 |
)
|
|
|
|
| 753 |
estilo_linea_ajuste_dropdown = gr.Dropdown(
|
| 754 |
choices=["-", "--", "-.", ":"],
|
| 755 |
value="-",
|
|
@@ -757,27 +723,18 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
| 757 |
)
|
| 758 |
|
| 759 |
with gr.Row():
|
| 760 |
-
|
| 761 |
-
choices=paletas_colores,
|
| 762 |
-
value="bright",
|
| 763 |
-
label="Paleta L铆nea Ideal"
|
| 764 |
-
)
|
| 765 |
estilo_linea_ideal_dropdown = gr.Dropdown(
|
| 766 |
choices=["--", "-", "-.", ":"],
|
| 767 |
value="--",
|
| 768 |
label="Estilo L铆nea Ideal"
|
| 769 |
)
|
| 770 |
-
|
| 771 |
-
choices=paletas_colores,
|
| 772 |
-
value="pastel",
|
| 773 |
-
label="Paleta Barras de Error"
|
| 774 |
-
)
|
| 775 |
mostrar_linea_ajuste = gr.Checkbox(value=True, label="Mostrar L铆nea de Ajuste")
|
| 776 |
mostrar_linea_ideal = gr.Checkbox(value=False, label="Mostrar L铆nea Ideal")
|
| 777 |
mostrar_puntos = gr.Checkbox(value=True, label="Mostrar Puntos")
|
| 778 |
graficar_btn = gr.Button("馃搳 Graficar", variant="primary")
|
| 779 |
|
| 780 |
-
# Bot贸n para recalcular informe
|
| 781 |
recalcular_btn = gr.Button("馃攧 Calcular Otra Vez", variant="secondary")
|
| 782 |
|
| 783 |
with gr.Row():
|
|
@@ -801,29 +758,20 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
| 801 |
)
|
| 802 |
|
| 803 |
with gr.Row():
|
| 804 |
-
|
| 805 |
-
palette_puntos_regresion = gr.Dropdown(
|
| 806 |
-
choices=paletas_colores,
|
| 807 |
-
value="deep",
|
| 808 |
-
label="Paleta para Puntos"
|
| 809 |
-
)
|
| 810 |
estilo_puntos_regresion = gr.Dropdown(
|
| 811 |
choices=["o", "s", "^", "D", "v", "<", ">", "h", "H", "p", "*", "X", "d"],
|
| 812 |
value="o",
|
| 813 |
-
label="Estilo de Puntos"
|
| 814 |
-
)
|
| 815 |
-
palette_linea_ajuste_regresion = gr.Dropdown(
|
| 816 |
-
choices=paletas_colores,
|
| 817 |
-
value="muted",
|
| 818 |
-
label="Paleta L铆nea de Ajuste"
|
| 819 |
)
|
|
|
|
| 820 |
estilo_linea_ajuste_regresion = gr.Dropdown(
|
| 821 |
choices=["-", "--", "-.", ":"],
|
| 822 |
value="-",
|
| 823 |
-
label="Estilo L铆nea de Ajuste"
|
| 824 |
)
|
| 825 |
-
mostrar_linea_ajuste_regresion = gr.Checkbox(value=True, label="Mostrar L铆nea de Ajuste")
|
| 826 |
-
mostrar_puntos_regresion = gr.Checkbox(value=True, label="Mostrar Puntos")
|
| 827 |
|
| 828 |
with gr.Row():
|
| 829 |
legend_location_dropdown = gr.Dropdown(
|
|
@@ -873,6 +821,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
| 873 |
grafico_personalizado_output = gr.Plot(label="Gr谩fico Personalizado")
|
| 874 |
tabla_resumen_output = gr.DataFrame(label="Tabla Resumida")
|
| 875 |
|
|
|
|
| 876 |
tabla_output.change(
|
| 877 |
fn=actualizar_opciones_filas,
|
| 878 |
inputs=[tabla_output],
|
|
@@ -885,21 +834,60 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
| 885 |
outputs=[estado_output, graficos_output, informe_output, tabla_output]
|
| 886 |
)
|
| 887 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 888 |
graficar_btn.click(
|
| 889 |
-
fn=
|
| 890 |
inputs=[
|
| 891 |
tabla_output, replicas_slider, unidad_input,
|
| 892 |
-
|
| 893 |
-
|
| 894 |
-
|
| 895 |
-
|
| 896 |
mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos,
|
| 897 |
filas_seleccionadas, decimales_slider
|
| 898 |
],
|
| 899 |
outputs=graficos_output
|
| 900 |
)
|
| 901 |
|
| 902 |
-
# Nuevo bot贸n "Calcular Otra Vez" para recalcular informe y gr谩fico
|
| 903 |
recalcular_btn.click(
|
| 904 |
fn=actualizar_analisis,
|
| 905 |
inputs=[tabla_output, replicas_slider, unidad_input, filas_seleccionadas, decimales_slider],
|
|
@@ -1037,29 +1025,6 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
| 1037 |
outputs=exportar_latex_file
|
| 1038 |
)
|
| 1039 |
|
| 1040 |
-
def iniciar_con_ejemplo():
|
| 1041 |
-
df = pd.DataFrame({
|
| 1042 |
-
"Soluci贸n": [1.00,0.80,0.67,0.60,0.53,0.47,0.40],
|
| 1043 |
-
"H2O": [0.00,0.20,0.33,0.40,0.47,0.53,0.60],
|
| 1044 |
-
"Factor de Diluci贸n": [1.00,1.25,1.50,1.67,1.87,2.14,2.50],
|
| 1045 |
-
"Concentraci贸n Predicha Num茅rica": [150,120,100,90,80,70,60],
|
| 1046 |
-
"Concentraci贸n Predicha (mg/L)": [150,120,100,90,80,70,60]
|
| 1047 |
-
})
|
| 1048 |
-
df["Concentraci贸n Real 1 (UFC)"] = [1.715,1.089,0.941,0.552,0.703,0.801,0.516]
|
| 1049 |
-
n_replicas = 1
|
| 1050 |
-
estado, fig, informe, df = actualizar_analisis(df, n_replicas, "UFC", [f"Fila {i+1}" for i in df.index], 3)
|
| 1051 |
-
return (
|
| 1052 |
-
2000000,
|
| 1053 |
-
"UFC",
|
| 1054 |
-
7,
|
| 1055 |
-
df,
|
| 1056 |
-
estado,
|
| 1057 |
-
fig,
|
| 1058 |
-
informe,
|
| 1059 |
-
[f"Fila {i+1}" for i in df.index],
|
| 1060 |
-
3
|
| 1061 |
-
)
|
| 1062 |
-
|
| 1063 |
interfaz.load(
|
| 1064 |
fn=iniciar_con_ejemplo,
|
| 1065 |
outputs=[concentracion_input, unidad_input, filas_slider, tabla_output, estado_output, graficos_output, informe_output, filas_seleccionadas, decimales_slider]
|
|
@@ -1069,8 +1034,8 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
| 1069 |
fn=calcular_regresion_tabla_principal,
|
| 1070 |
inputs=[
|
| 1071 |
tabla_output, unidad_input, filas_seleccionadas_regresion,
|
| 1072 |
-
|
| 1073 |
-
|
| 1074 |
mostrar_linea_ajuste_regresion, mostrar_puntos_regresion,
|
| 1075 |
legend_location_dropdown, decimales_slider,
|
| 1076 |
titulo_grafico_original, titulo_grafico_personalizado,
|
|
@@ -1080,5 +1045,6 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
| 1080 |
outputs=[estado_regresion_output, grafico_original_output, grafico_personalizado_output, tabla_resumen_output]
|
| 1081 |
)
|
| 1082 |
|
|
|
|
| 1083 |
if __name__ == "__main__":
|
| 1084 |
interfaz.launch()
|
|
|
|
| 41 |
|
| 42 |
return df
|
| 43 |
|
| 44 |
+
def generar_graficos(df_valid, n_replicas, unidad_medida,
|
| 45 |
+
color_puntos, estilo_puntos,
|
| 46 |
+
color_linea_ajuste, estilo_linea_ajuste,
|
| 47 |
+
color_linea_ideal, estilo_linea_ideal,
|
| 48 |
+
color_barras_error,
|
| 49 |
+
mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos):
|
| 50 |
col_predicha_num = "Concentraci贸n Predicha Num茅rica"
|
| 51 |
col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
|
| 52 |
col_desviacion = f"Desviaci贸n Est谩ndar ({unidad_medida})"
|
|
|
|
| 68 |
|
| 69 |
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
|
| 70 |
|
| 71 |
+
# Gr谩fico principal
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 72 |
if mostrar_puntos:
|
| 73 |
if n_replicas > 1:
|
| 74 |
ax1.errorbar(
|
|
|
|
| 128 |
|
| 129 |
ax1.legend(loc='lower right', fontsize=10)
|
| 130 |
|
| 131 |
+
# Gr谩fico de residuos
|
| 132 |
residuos = df_valid[col_real_promedio] - df_valid['Ajuste Lineal']
|
| 133 |
ax2.scatter(
|
| 134 |
df_valid[col_predicha_num],
|
|
|
|
| 251 |
slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_predicha_num], df_valid[col_real_promedio])
|
| 252 |
df_valid['Ajuste Lineal'] = intercept + slope * df_valid[col_predicha_num]
|
| 253 |
|
| 254 |
+
# Generar gr谩fico con colores por defecto (se actualizar谩n con el bot贸n Graficar)
|
| 255 |
fig = generar_graficos(
|
| 256 |
df_valid, n_replicas, unidad_medida,
|
| 257 |
+
color_puntos="#0000FF", estilo_puntos='o',
|
| 258 |
+
color_linea_ajuste="#00FF00", estilo_linea_ajuste='-',
|
| 259 |
+
color_linea_ideal="#FF0000", estilo_linea_ideal='--',
|
| 260 |
+
color_barras_error="#FFA500",
|
| 261 |
mostrar_linea_ajuste=True,
|
| 262 |
mostrar_linea_ideal=False,
|
| 263 |
mostrar_puntos=True
|
|
|
|
| 266 |
|
| 267 |
return estado, fig, informe, df
|
| 268 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 269 |
def exportar_informe_word(df_valid, informe_md, unidad_medida):
|
| 270 |
doc = docx.Document()
|
| 271 |
|
|
|
|
| 404 |
"Concentraci贸n Predicha (mg/L)": [2000000/(1/(1/(2**i))) for i in range(7)]
|
| 405 |
})
|
| 406 |
return (
|
| 407 |
+
2000000,
|
| 408 |
+
"UFC",
|
| 409 |
+
7,
|
| 410 |
+
df,
|
| 411 |
+
"",
|
| 412 |
+
None,
|
| 413 |
+
""
|
| 414 |
)
|
| 415 |
|
| 416 |
def generar_datos_sinteticos_evento(df, n_replicas, unidad_medida):
|
|
|
|
| 480 |
|
| 481 |
return concentracion_inicial, unidad_medida, n_filas, n_replicas, df_sistema, "", None, ""
|
| 482 |
|
| 483 |
+
def actualizar_opciones_filas(df):
|
| 484 |
+
if df is None or df.empty:
|
| 485 |
+
update = gr.update(choices=[], value=[])
|
| 486 |
+
else:
|
| 487 |
+
opciones = [f"Fila {i+1}" for i in df.index]
|
| 488 |
+
update = gr.update(choices=opciones, value=opciones)
|
| 489 |
+
return update, update
|
| 490 |
+
|
| 491 |
def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas_regresion,
|
| 492 |
+
color_puntos, estilo_puntos,
|
| 493 |
+
color_linea_ajuste, estilo_linea_ajuste,
|
| 494 |
mostrar_linea_ajuste, mostrar_puntos,
|
| 495 |
legend_location, decimales,
|
| 496 |
titulo_grafico_original, titulo_grafico_personalizado,
|
| 497 |
eje_x_original, eje_y_original,
|
| 498 |
eje_x_personalizado, eje_y_personalizado):
|
| 499 |
+
|
| 500 |
if df is None or df.empty:
|
| 501 |
return "Datos insuficientes", None, None, None
|
| 502 |
|
|
|
|
| 522 |
if not filas_seleccionadas_regresion:
|
| 523 |
return "Se necesitan m谩s datos", None, None, None
|
| 524 |
|
| 525 |
+
indices_seleccionados = [int(s.split(' ')[1]) - 1 for s in filas_seleccionadas_regresion]
|
| 526 |
if len(indices_seleccionados) < 2:
|
| 527 |
return "Se requieren al menos dos puntos para calcular la regresi贸n", None, None, None
|
| 528 |
|
|
|
|
| 533 |
sns.set(style="whitegrid")
|
| 534 |
fig_original, ax_original = plt.subplots(figsize=(8, 6))
|
| 535 |
|
| 536 |
+
# Gr谩fico Original
|
| 537 |
ax_original.errorbar(
|
| 538 |
df_original[col_concentracion],
|
| 539 |
df_original[col_real_promedio],
|
| 540 |
yerr=df_original[col_desviacion],
|
| 541 |
+
fmt=estilo_puntos,
|
| 542 |
+
color=color_puntos,
|
| 543 |
ecolor='gray',
|
| 544 |
elinewidth=1,
|
| 545 |
capsize=3,
|
|
|
|
| 551 |
ax_original.plot(
|
| 552 |
df_original[col_concentracion],
|
| 553 |
intercept_all + slope_all * df_original[col_concentracion],
|
| 554 |
+
color=color_linea_ajuste,
|
| 555 |
linestyle='-',
|
| 556 |
label='Ajuste Lineal'
|
| 557 |
)
|
|
|
|
| 570 |
verticalalignment='top'
|
| 571 |
)
|
| 572 |
|
| 573 |
+
# Gr谩fico Personalizado
|
| 574 |
sns.set(style="whitegrid")
|
| 575 |
fig_personalizado, ax_personalizado = plt.subplots(figsize=(8, 6))
|
| 576 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 577 |
if mostrar_puntos:
|
| 578 |
ax_personalizado.errorbar(
|
| 579 |
df_valid[col_concentracion],
|
|
|
|
| 615 |
|
| 616 |
return "Regresi贸n calculada exitosamente", fig_original, fig_personalizado, df_resumen
|
| 617 |
|
| 618 |
+
def iniciar_con_ejemplo():
|
| 619 |
+
df = pd.DataFrame({
|
| 620 |
+
"Soluci贸n": [1.00,0.80,0.67,0.60,0.53,0.47,0.40],
|
| 621 |
+
"H2O": [0.00,0.20,0.33,0.40,0.47,0.53,0.60],
|
| 622 |
+
"Factor de Diluci贸n": [1.00,1.25,1.50,1.67,1.87,2.14,2.50],
|
| 623 |
+
"Concentraci贸n Predicha Num茅rica": [150,120,100,90,80,70,60],
|
| 624 |
+
"Concentraci贸n Predicha (mg/L)": [150,120,100,90,80,70,60],
|
| 625 |
+
"Concentraci贸n Real 1 (UFC)": [1.715,1.089,0.941,0.552,0.703,0.801,0.516]
|
| 626 |
+
})
|
| 627 |
+
n_replicas = 1
|
| 628 |
+
estado, fig, informe, df = actualizar_analisis(df, n_replicas, "UFC", [f"Fila {i+1}" for i in df.index], 3)
|
| 629 |
+
return (
|
| 630 |
+
2000000,
|
| 631 |
+
"UFC",
|
| 632 |
+
7,
|
| 633 |
+
df,
|
| 634 |
+
estado,
|
| 635 |
+
fig,
|
| 636 |
+
informe,
|
| 637 |
+
[f"Fila {i+1}" for i in df.index],
|
| 638 |
+
3
|
| 639 |
+
)
|
| 640 |
|
| 641 |
+
|
| 642 |
+
# Interfaz Gradio
|
| 643 |
with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
| 644 |
gr.Markdown("""
|
| 645 |
# 馃搳 Sistema Avanzado de Calibraci贸n con An谩lisis Estad锟斤拷stico
|
| 646 |
+
Configure los par谩metros, edite los valores en la tabla y luego presione "Calcular" para obtener el an谩lisis.
|
| 647 |
""")
|
| 648 |
|
| 649 |
with gr.Tab("馃摑 Datos de Calibraci贸n"):
|
|
|
|
| 709 |
)
|
| 710 |
|
| 711 |
with gr.Row():
|
| 712 |
+
color_puntos_picker = gr.ColorPicker(label="Color de Puntos", value="#0000FF")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 713 |
estilo_puntos_dropdown = gr.Dropdown(
|
| 714 |
choices=["o", "s", "^", "D", "v", "<", ">", "h", "H", "p", "*", "X", "d"],
|
| 715 |
value="o",
|
| 716 |
+
label="Estilo de Punto"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 717 |
)
|
| 718 |
+
color_linea_ajuste_picker = gr.ColorPicker(label="Color de la L铆nea de Ajuste", value="#00FF00")
|
| 719 |
estilo_linea_ajuste_dropdown = gr.Dropdown(
|
| 720 |
choices=["-", "--", "-.", ":"],
|
| 721 |
value="-",
|
|
|
|
| 723 |
)
|
| 724 |
|
| 725 |
with gr.Row():
|
| 726 |
+
color_linea_ideal_picker = gr.ColorPicker(label="Color L铆nea Ideal", value="#FF0000")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 727 |
estilo_linea_ideal_dropdown = gr.Dropdown(
|
| 728 |
choices=["--", "-", "-.", ":"],
|
| 729 |
value="--",
|
| 730 |
label="Estilo L铆nea Ideal"
|
| 731 |
)
|
| 732 |
+
color_barras_error_picker = gr.ColorPicker(label="Color Barras de Error", value="#FFA500")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 733 |
mostrar_linea_ajuste = gr.Checkbox(value=True, label="Mostrar L铆nea de Ajuste")
|
| 734 |
mostrar_linea_ideal = gr.Checkbox(value=False, label="Mostrar L铆nea Ideal")
|
| 735 |
mostrar_puntos = gr.Checkbox(value=True, label="Mostrar Puntos")
|
| 736 |
graficar_btn = gr.Button("馃搳 Graficar", variant="primary")
|
| 737 |
|
|
|
|
| 738 |
recalcular_btn = gr.Button("馃攧 Calcular Otra Vez", variant="secondary")
|
| 739 |
|
| 740 |
with gr.Row():
|
|
|
|
| 758 |
)
|
| 759 |
|
| 760 |
with gr.Row():
|
| 761 |
+
color_puntos_regresion_picker = gr.ColorPicker(label="Color Puntos Regresi贸n", value="#0000FF")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 762 |
estilo_puntos_regresion = gr.Dropdown(
|
| 763 |
choices=["o", "s", "^", "D", "v", "<", ">", "h", "H", "p", "*", "X", "d"],
|
| 764 |
value="o",
|
| 765 |
+
label="Estilo de Puntos (Regresi贸n)"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 766 |
)
|
| 767 |
+
color_linea_ajuste_regresion_picker = gr.ColorPicker(label="Color L铆nea Ajuste (Regresi贸n)", value="#00FF00")
|
| 768 |
estilo_linea_ajuste_regresion = gr.Dropdown(
|
| 769 |
choices=["-", "--", "-.", ":"],
|
| 770 |
value="-",
|
| 771 |
+
label="Estilo L铆nea de Ajuste (Regresi贸n)"
|
| 772 |
)
|
| 773 |
+
mostrar_linea_ajuste_regresion = gr.Checkbox(value=True, label="Mostrar L铆nea de Ajuste (Regresi贸n)")
|
| 774 |
+
mostrar_puntos_regresion = gr.Checkbox(value=True, label="Mostrar Puntos (Regresi贸n)")
|
| 775 |
|
| 776 |
with gr.Row():
|
| 777 |
legend_location_dropdown = gr.Dropdown(
|
|
|
|
| 821 |
grafico_personalizado_output = gr.Plot(label="Gr谩fico Personalizado")
|
| 822 |
tabla_resumen_output = gr.DataFrame(label="Tabla Resumida")
|
| 823 |
|
| 824 |
+
# Eventos
|
| 825 |
tabla_output.change(
|
| 826 |
fn=actualizar_opciones_filas,
|
| 827 |
inputs=[tabla_output],
|
|
|
|
| 834 |
outputs=[estado_output, graficos_output, informe_output, tabla_output]
|
| 835 |
)
|
| 836 |
|
| 837 |
+
def actualizar_graficos_custom(df, n_replicas, unidad_medida,
|
| 838 |
+
color_puntos, estilo_puntos,
|
| 839 |
+
color_linea_ajuste, estilo_linea_ajuste,
|
| 840 |
+
color_linea_ideal, estilo_linea_ideal,
|
| 841 |
+
color_barras_error,
|
| 842 |
+
mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos,
|
| 843 |
+
filas_seleccionadas, decimales):
|
| 844 |
+
if df is None or df.empty:
|
| 845 |
+
return None
|
| 846 |
+
|
| 847 |
+
df = calcular_promedio_desviacion(df, n_replicas, unidad_medida, decimales)
|
| 848 |
+
|
| 849 |
+
col_predicha_num = "Concentraci贸n Predicha Num茅rica"
|
| 850 |
+
col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
|
| 851 |
+
|
| 852 |
+
df[col_predicha_num] = pd.to_numeric(df[col_predicha_num], errors='coerce')
|
| 853 |
+
df[col_real_promedio] = pd.to_numeric(df[col_real_promedio], errors='coerce')
|
| 854 |
+
|
| 855 |
+
df_valid = df.dropna(subset=[col_predicha_num, col_real_promedio])
|
| 856 |
+
df_valid.reset_index(drop=True, inplace=True)
|
| 857 |
+
|
| 858 |
+
if not filas_seleccionadas:
|
| 859 |
+
return None
|
| 860 |
+
|
| 861 |
+
indices_seleccionados = [int(s.split(' ')[1]) - 1 for s in filas_seleccionadas]
|
| 862 |
+
df_valid = df_valid.loc[indices_seleccionados]
|
| 863 |
+
|
| 864 |
+
if len(df_valid) < 2:
|
| 865 |
+
return None
|
| 866 |
+
|
| 867 |
+
fig = generar_graficos(
|
| 868 |
+
df_valid, n_replicas, unidad_medida,
|
| 869 |
+
color_puntos, estilo_puntos,
|
| 870 |
+
color_linea_ajuste, estilo_linea_ajuste,
|
| 871 |
+
color_linea_ideal, estilo_linea_ideal,
|
| 872 |
+
color_barras_error,
|
| 873 |
+
mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos
|
| 874 |
+
)
|
| 875 |
+
return fig
|
| 876 |
+
|
| 877 |
graficar_btn.click(
|
| 878 |
+
fn=actualizar_graficos_custom,
|
| 879 |
inputs=[
|
| 880 |
tabla_output, replicas_slider, unidad_input,
|
| 881 |
+
color_puntos_picker, estilo_puntos_dropdown,
|
| 882 |
+
color_linea_ajuste_picker, estilo_linea_ajuste_dropdown,
|
| 883 |
+
color_linea_ideal_picker, estilo_linea_ideal_dropdown,
|
| 884 |
+
color_barras_error_picker,
|
| 885 |
mostrar_linea_ajuste, mostrar_linea_ideal, mostrar_puntos,
|
| 886 |
filas_seleccionadas, decimales_slider
|
| 887 |
],
|
| 888 |
outputs=graficos_output
|
| 889 |
)
|
| 890 |
|
|
|
|
| 891 |
recalcular_btn.click(
|
| 892 |
fn=actualizar_analisis,
|
| 893 |
inputs=[tabla_output, replicas_slider, unidad_input, filas_seleccionadas, decimales_slider],
|
|
|
|
| 1025 |
outputs=exportar_latex_file
|
| 1026 |
)
|
| 1027 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1028 |
interfaz.load(
|
| 1029 |
fn=iniciar_con_ejemplo,
|
| 1030 |
outputs=[concentracion_input, unidad_input, filas_slider, tabla_output, estado_output, graficos_output, informe_output, filas_seleccionadas, decimales_slider]
|
|
|
|
| 1034 |
fn=calcular_regresion_tabla_principal,
|
| 1035 |
inputs=[
|
| 1036 |
tabla_output, unidad_input, filas_seleccionadas_regresion,
|
| 1037 |
+
color_puntos_regresion_picker, estilo_puntos_regresion,
|
| 1038 |
+
color_linea_ajuste_regresion_picker, estilo_linea_ajuste_regresion,
|
| 1039 |
mostrar_linea_ajuste_regresion, mostrar_puntos_regresion,
|
| 1040 |
legend_location_dropdown, decimales_slider,
|
| 1041 |
titulo_grafico_original, titulo_grafico_personalizado,
|
|
|
|
| 1045 |
outputs=[estado_regresion_output, grafico_original_output, grafico_personalizado_output, tabla_resumen_output]
|
| 1046 |
)
|
| 1047 |
|
| 1048 |
+
|
| 1049 |
if __name__ == "__main__":
|
| 1050 |
interfaz.launch()
|