Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -607,12 +607,16 @@ def cargar_excel(file):
|
|
607 |
return concentracion_inicial, unidad_medida, n_filas, n_replicas, df_base, "", None, ""
|
608 |
|
609 |
# Funci贸n para calcular la regresi贸n y generar el gr谩fico usando la tabla principal
|
610 |
-
def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas
|
|
|
|
|
|
|
611 |
if df is None or df.empty:
|
612 |
-
return "Datos insuficientes", None
|
613 |
|
614 |
col_concentracion = "Concentraci贸n Predicha Num茅rica"
|
615 |
col_absorbancia = f"Concentraci贸n Real Promedio ({unidad_medida})"
|
|
|
616 |
|
617 |
# Calcular promedio y desviaci贸n est谩ndar si es necesario
|
618 |
n_replicas = len([col for col in df.columns if 'Concentraci贸n Real' in col and 'Promedio' not in col and 'Desviaci贸n' not in col])
|
@@ -621,6 +625,7 @@ def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas):
|
|
621 |
# Convertir columnas a num茅rico
|
622 |
df[col_concentracion] = pd.to_numeric(df[col_concentracion], errors='coerce')
|
623 |
df[col_absorbancia] = pd.to_numeric(df[col_absorbancia], errors='coerce')
|
|
|
624 |
|
625 |
df_valid = df.dropna(subset=[col_concentracion, col_absorbancia])
|
626 |
|
@@ -629,7 +634,7 @@ def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas):
|
|
629 |
|
630 |
# Convertir filas_seleccionadas a 铆ndices
|
631 |
if not filas_seleccionadas:
|
632 |
-
return "Se necesitan m谩s datos", None
|
633 |
|
634 |
indices_seleccionados = [int(s.split(' ')[1]) - 1 for s in filas_seleccionadas]
|
635 |
|
@@ -637,22 +642,22 @@ def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas):
|
|
637 |
df_valid = df_valid.loc[indices_seleccionados]
|
638 |
|
639 |
if len(df_valid) < 2:
|
640 |
-
return "Se requieren al menos dos puntos para calcular la regresi贸n", None
|
641 |
|
642 |
# Calcular regresi贸n lineal
|
643 |
slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_concentracion], df_valid[col_absorbancia])
|
644 |
|
645 |
-
# Generar gr谩fico
|
646 |
-
|
647 |
-
|
648 |
-
|
649 |
-
|
650 |
-
|
651 |
-
|
652 |
-
|
653 |
|
654 |
# A帽adir ecuaci贸n y R虏 en el gr谩fico
|
655 |
-
|
656 |
f'y = {intercept:.4f} + {slope:.4f}x\n$R^2$ = {r_value**2:.4f}',
|
657 |
xy=(0.05, 0.95),
|
658 |
xycoords='axes fraction',
|
@@ -661,7 +666,59 @@ def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas):
|
|
661 |
verticalalignment='top'
|
662 |
)
|
663 |
|
664 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
665 |
|
666 |
# Interfaz Gradio
|
667 |
with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
@@ -795,11 +852,39 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
795 |
with gr.Tab("馃搱 Regresi贸n Absorbancia vs Concentraci贸n"):
|
796 |
gr.Markdown("## Ajuste de Regresi贸n utilizando datos de la Tabla Principal")
|
797 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
798 |
calcular_regresion_btn = gr.Button("Calcular Regresi贸n")
|
799 |
|
800 |
# Salidas
|
801 |
estado_regresion_output = gr.Textbox(label="Estado de la Regresi贸n", interactive=False)
|
802 |
-
|
|
|
|
|
803 |
|
804 |
# Eventos para actualizar las opciones de filas
|
805 |
def actualizar_opciones_filas(df):
|
@@ -968,8 +1053,13 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
968 |
# Evento al presionar el bot贸n de calcular regresi贸n
|
969 |
calcular_regresion_btn.click(
|
970 |
fn=calcular_regresion_tabla_principal,
|
971 |
-
inputs=[
|
972 |
-
|
|
|
|
|
|
|
|
|
|
|
973 |
)
|
974 |
|
975 |
# Lanzar la interfaz
|
|
|
607 |
return concentracion_inicial, unidad_medida, n_filas, n_replicas, df_base, "", None, ""
|
608 |
|
609 |
# Funci贸n para calcular la regresi贸n y generar el gr谩fico usando la tabla principal
|
610 |
+
def calcular_regresion_tabla_principal(df, unidad_medida, filas_seleccionadas,
|
611 |
+
palette_puntos, estilo_puntos,
|
612 |
+
palette_linea_ajuste, estilo_linea_ajuste,
|
613 |
+
mostrar_linea_ajuste, mostrar_puntos):
|
614 |
if df is None or df.empty:
|
615 |
+
return "Datos insuficientes", None, None
|
616 |
|
617 |
col_concentracion = "Concentraci贸n Predicha Num茅rica"
|
618 |
col_absorbancia = f"Concentraci贸n Real Promedio ({unidad_medida})"
|
619 |
+
col_desviacion = f"Desviaci贸n Est谩ndar ({unidad_medida})"
|
620 |
|
621 |
# Calcular promedio y desviaci贸n est谩ndar si es necesario
|
622 |
n_replicas = len([col for col in df.columns if 'Concentraci贸n Real' in col and 'Promedio' not in col and 'Desviaci贸n' not in col])
|
|
|
625 |
# Convertir columnas a num茅rico
|
626 |
df[col_concentracion] = pd.to_numeric(df[col_concentracion], errors='coerce')
|
627 |
df[col_absorbancia] = pd.to_numeric(df[col_absorbancia], errors='coerce')
|
628 |
+
df[col_desviacion] = pd.to_numeric(df[col_desviacion], errors='coerce')
|
629 |
|
630 |
df_valid = df.dropna(subset=[col_concentracion, col_absorbancia])
|
631 |
|
|
|
634 |
|
635 |
# Convertir filas_seleccionadas a 铆ndices
|
636 |
if not filas_seleccionadas:
|
637 |
+
return "Se necesitan m谩s datos", None, None
|
638 |
|
639 |
indices_seleccionados = [int(s.split(' ')[1]) - 1 for s in filas_seleccionadas]
|
640 |
|
|
|
642 |
df_valid = df_valid.loc[indices_seleccionados]
|
643 |
|
644 |
if len(df_valid) < 2:
|
645 |
+
return "Se requieren al menos dos puntos para calcular la regresi贸n", None, None
|
646 |
|
647 |
# Calcular regresi贸n lineal
|
648 |
slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_concentracion], df_valid[col_absorbancia])
|
649 |
|
650 |
+
# Generar gr谩fico original
|
651 |
+
fig_original, ax_original = plt.subplots(figsize=(8, 6))
|
652 |
+
ax_original.scatter(df_valid[col_concentracion], df_valid[col_absorbancia], color='blue', label='Datos')
|
653 |
+
ax_original.plot(df_valid[col_concentracion], intercept + slope * df_valid[col_concentracion], 'r', label='Ajuste Lineal')
|
654 |
+
ax_original.set_xlabel('Concentraci贸n Predicha Num茅rica')
|
655 |
+
ax_original.set_ylabel(f'Concentraci贸n Real Promedio ({unidad_medida})')
|
656 |
+
ax_original.set_title('Regresi贸n Lineal: Concentraci贸n Real vs Concentraci贸n Predicha (Original)')
|
657 |
+
ax_original.legend()
|
658 |
|
659 |
# A帽adir ecuaci贸n y R虏 en el gr谩fico
|
660 |
+
ax_original.annotate(
|
661 |
f'y = {intercept:.4f} + {slope:.4f}x\n$R^2$ = {r_value**2:.4f}',
|
662 |
xy=(0.05, 0.95),
|
663 |
xycoords='axes fraction',
|
|
|
666 |
verticalalignment='top'
|
667 |
)
|
668 |
|
669 |
+
# Generar gr谩fico personalizado
|
670 |
+
sns.set(style="whitegrid")
|
671 |
+
fig_personalizado, ax_personalizado = plt.subplots(figsize=(8, 6))
|
672 |
+
|
673 |
+
# Obtener colores de las paletas
|
674 |
+
colors_puntos = sns.color_palette(palette_puntos, as_cmap=False)
|
675 |
+
colors_linea_ajuste = sns.color_palette(palette_linea_ajuste, as_cmap=False)
|
676 |
+
|
677 |
+
color_puntos = colors_puntos[0]
|
678 |
+
color_linea_ajuste = colors_linea_ajuste[0]
|
679 |
+
|
680 |
+
if mostrar_puntos:
|
681 |
+
ax_personalizado.errorbar(
|
682 |
+
df_valid[col_concentracion],
|
683 |
+
df_valid[col_absorbancia],
|
684 |
+
yerr=df_valid[col_desviacion],
|
685 |
+
fmt=estilo_puntos,
|
686 |
+
color=color_puntos,
|
687 |
+
ecolor='gray',
|
688 |
+
elinewidth=1,
|
689 |
+
capsize=3,
|
690 |
+
label='Datos'
|
691 |
+
)
|
692 |
+
|
693 |
+
if mostrar_linea_ajuste:
|
694 |
+
ax_personalizado.plot(
|
695 |
+
df_valid[col_concentracion],
|
696 |
+
intercept + slope * df_valid[col_concentracion],
|
697 |
+
color=color_linea_ajuste,
|
698 |
+
linestyle=estilo_linea_ajuste,
|
699 |
+
label='Ajuste Lineal'
|
700 |
+
)
|
701 |
+
|
702 |
+
ax_personalizado.set_xlabel('Concentraci贸n Predicha Num茅rica')
|
703 |
+
ax_personalizado.set_ylabel(f'Concentraci贸n Real Promedio ({unidad_medida})')
|
704 |
+
ax_personalizado.set_title('Regresi贸n Lineal Personalizada')
|
705 |
+
ax_personalizado.legend()
|
706 |
+
|
707 |
+
# A帽adir ecuaci贸n y R虏 en el gr谩fico
|
708 |
+
ax_personalizado.annotate(
|
709 |
+
f'y = {intercept:.4f} + {slope:.4f}x\n$R^2$ = {r_value**2:.4f}',
|
710 |
+
xy=(0.05, 0.95),
|
711 |
+
xycoords='axes fraction',
|
712 |
+
fontsize=12,
|
713 |
+
backgroundcolor='white',
|
714 |
+
verticalalignment='top'
|
715 |
+
)
|
716 |
+
|
717 |
+
# Crear tabla resumida
|
718 |
+
df_resumen = df_valid[[col_concentracion, col_absorbancia, col_desviacion]].copy()
|
719 |
+
df_resumen.columns = ['Concentraci贸n Predicha', 'Absorbancia Promedio', 'Desviaci贸n Est谩ndar']
|
720 |
+
|
721 |
+
return "Regresi贸n calculada exitosamente", fig_original, fig_personalizado, df_resumen
|
722 |
|
723 |
# Interfaz Gradio
|
724 |
with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
|
852 |
with gr.Tab("馃搱 Regresi贸n Absorbancia vs Concentraci贸n"):
|
853 |
gr.Markdown("## Ajuste de Regresi贸n utilizando datos de la Tabla Principal")
|
854 |
|
855 |
+
# Opciones de personalizaci贸n
|
856 |
+
with gr.Row():
|
857 |
+
paletas_colores = ["deep", "muted", "pastel", "bright", "dark", "colorblind", "Set1", "Set2", "Set3"]
|
858 |
+
palette_puntos_regresion = gr.Dropdown(
|
859 |
+
choices=paletas_colores,
|
860 |
+
value="deep",
|
861 |
+
label="Paleta para Puntos"
|
862 |
+
)
|
863 |
+
estilo_puntos_regresion = gr.Dropdown(
|
864 |
+
choices=["o", "s", "^", "D", "v", "<", ">", "h", "H", "p", "*", "X", "d"],
|
865 |
+
value="o",
|
866 |
+
label="Estilo de Puntos"
|
867 |
+
)
|
868 |
+
palette_linea_ajuste_regresion = gr.Dropdown(
|
869 |
+
choices=paletas_colores,
|
870 |
+
value="muted",
|
871 |
+
label="Paleta L铆nea de Ajuste"
|
872 |
+
)
|
873 |
+
estilo_linea_ajuste_regresion = gr.Dropdown(
|
874 |
+
choices=["-", "--", "-.", ":"],
|
875 |
+
value="-",
|
876 |
+
label="Estilo L铆nea de Ajuste"
|
877 |
+
)
|
878 |
+
mostrar_linea_ajuste_regresion = gr.Checkbox(value=True, label="Mostrar L铆nea de Ajuste")
|
879 |
+
mostrar_puntos_regresion = gr.Checkbox(value=True, label="Mostrar Puntos")
|
880 |
+
|
881 |
calcular_regresion_btn = gr.Button("Calcular Regresi贸n")
|
882 |
|
883 |
# Salidas
|
884 |
estado_regresion_output = gr.Textbox(label="Estado de la Regresi贸n", interactive=False)
|
885 |
+
grafico_original_output = gr.Plot(label="Gr谩fico Original")
|
886 |
+
grafico_personalizado_output = gr.Plot(label="Gr谩fico Personalizado")
|
887 |
+
tabla_resumen_output = gr.DataFrame(label="Tabla Resumida")
|
888 |
|
889 |
# Eventos para actualizar las opciones de filas
|
890 |
def actualizar_opciones_filas(df):
|
|
|
1053 |
# Evento al presionar el bot贸n de calcular regresi贸n
|
1054 |
calcular_regresion_btn.click(
|
1055 |
fn=calcular_regresion_tabla_principal,
|
1056 |
+
inputs=[
|
1057 |
+
tabla_output, unidad_input, filas_seleccionadas,
|
1058 |
+
palette_puntos_regresion, estilo_puntos_regresion,
|
1059 |
+
palette_linea_ajuste_regresion, estilo_linea_ajuste_regresion,
|
1060 |
+
mostrar_linea_ajuste_regresion, mostrar_puntos_regresion
|
1061 |
+
],
|
1062 |
+
outputs=[estado_regresion_output, grafico_original_output, grafico_personalizado_output, tabla_resumen_output]
|
1063 |
)
|
1064 |
|
1065 |
# Lanzar la interfaz
|