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()
|