Update app.py
Browse files
app.py
CHANGED
|
@@ -47,16 +47,16 @@ def generar_tabla(n_filas, concentracion_inicial, unidad_medida, n_replicas):
|
|
| 47 |
|
| 48 |
def ajustar_decimales_evento(df, decimales):
|
| 49 |
df = df.copy()
|
| 50 |
-
#
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
return df
|
| 61 |
|
| 62 |
def calcular_promedio_desviacion(df, n_replicas, unidad_medida):
|
|
@@ -77,7 +77,7 @@ def calcular_promedio_desviacion(df, n_replicas, unidad_medida):
|
|
| 77 |
|
| 78 |
return df
|
| 79 |
|
| 80 |
-
def generar_graficos(df_valid, n_replicas, unidad_medida):
|
| 81 |
col_predicha_num = "Concentraci贸n Predicha Num茅rica"
|
| 82 |
col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
|
| 83 |
col_desviacion = f"Desviaci贸n Est谩ndar ({unidad_medida})"
|
|
@@ -95,6 +95,16 @@ def generar_graficos(df_valid, n_replicas, unidad_medida):
|
|
| 95 |
sns.set(style="whitegrid")
|
| 96 |
plt.rcParams.update({'figure.autolayout': True})
|
| 97 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 98 |
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
|
| 99 |
|
| 100 |
# Gr谩fico de dispersi贸n con l铆nea de regresi贸n
|
|
@@ -105,8 +115,8 @@ def generar_graficos(df_valid, n_replicas, unidad_medida):
|
|
| 105 |
df_valid[col_real_promedio],
|
| 106 |
yerr=df_valid[col_desviacion],
|
| 107 |
fmt='o',
|
| 108 |
-
color=
|
| 109 |
-
ecolor=
|
| 110 |
elinewidth=2,
|
| 111 |
capsize=3,
|
| 112 |
label='Datos Reales'
|
|
@@ -115,7 +125,7 @@ def generar_graficos(df_valid, n_replicas, unidad_medida):
|
|
| 115 |
ax1.scatter(
|
| 116 |
df_valid[col_predicha_num],
|
| 117 |
df_valid[col_real_promedio],
|
| 118 |
-
color=
|
| 119 |
s=100,
|
| 120 |
label='Datos Reales',
|
| 121 |
marker='o'
|
|
@@ -125,7 +135,7 @@ def generar_graficos(df_valid, n_replicas, unidad_medida):
|
|
| 125 |
ax1.plot(
|
| 126 |
df_valid[col_predicha_num],
|
| 127 |
df_valid['Ajuste Lineal'],
|
| 128 |
-
color=
|
| 129 |
label='Ajuste Lineal',
|
| 130 |
linewidth=2
|
| 131 |
)
|
|
@@ -163,7 +173,7 @@ def generar_graficos(df_valid, n_replicas, unidad_medida):
|
|
| 163 |
ax2.scatter(
|
| 164 |
df_valid[col_predicha_num],
|
| 165 |
residuos,
|
| 166 |
-
color=
|
| 167 |
s=100,
|
| 168 |
marker='D',
|
| 169 |
label='Residuos'
|
|
@@ -251,7 +261,7 @@ Fecha: {datetime.now().strftime('%d/%m/%Y %H:%M')}
|
|
| 251 |
"""
|
| 252 |
return informe, evaluacion['estado']
|
| 253 |
|
| 254 |
-
def actualizar_analisis(df, n_replicas, unidad_medida):
|
| 255 |
if df is None or df.empty:
|
| 256 |
return "Error en los datos", None, "No se pueden generar an谩lisis", df
|
| 257 |
|
|
@@ -274,7 +284,7 @@ def actualizar_analisis(df, n_replicas, unidad_medida):
|
|
| 274 |
slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_predicha_num], df_valid[col_real_promedio])
|
| 275 |
df_valid['Ajuste Lineal'] = intercept + slope * df_valid[col_predicha_num]
|
| 276 |
|
| 277 |
-
fig = generar_graficos(df_valid, n_replicas, unidad_medida)
|
| 278 |
informe, estado = generar_informe_completo(df_valid, n_replicas, unidad_medida)
|
| 279 |
|
| 280 |
return estado, fig, informe, df
|
|
@@ -524,6 +534,13 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
| 524 |
ejemplo_od_btn = gr.Button("馃搵 Cargar Ejemplo OD", variant="secondary")
|
| 525 |
sinteticos_btn = gr.Button("馃И Generar Datos Sint茅ticos", variant="secondary")
|
| 526 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 527 |
tabla_output = gr.DataFrame(
|
| 528 |
wrap=True,
|
| 529 |
label="Tabla de Datos",
|
|
@@ -551,7 +568,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
| 551 |
# Evento al presionar el bot贸n Calcular
|
| 552 |
calcular_btn.click(
|
| 553 |
fn=actualizar_analisis,
|
| 554 |
-
inputs=[tabla_output, replicas_slider, unidad_input],
|
| 555 |
outputs=output_components
|
| 556 |
)
|
| 557 |
|
|
@@ -657,7 +674,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
|
|
| 657 |
df = generar_tabla(7, 2000000, "UFC", n_replicas)
|
| 658 |
# Valores reales de ejemplo
|
| 659 |
df[f"Concentraci贸n Real 1 (UFC)"] = [2000000, 1600000, 1200000, 800000, 400000, 200000, 100000]
|
| 660 |
-
estado, fig, informe, df = actualizar_analisis(df, n_replicas, "UFC")
|
| 661 |
return (
|
| 662 |
2000000,
|
| 663 |
"UFC",
|
|
|
|
| 47 |
|
| 48 |
def ajustar_decimales_evento(df, decimales):
|
| 49 |
df = df.copy()
|
| 50 |
+
# Ajustar decimales en todas las columnas num茅ricas
|
| 51 |
+
for col in df.columns:
|
| 52 |
+
if df[col].dtype in [np.float64, np.int64, float, int]:
|
| 53 |
+
df[col] = df[col].round(decimales)
|
| 54 |
+
else:
|
| 55 |
+
# Intentar convertir a num茅rico y luego redondear
|
| 56 |
+
try:
|
| 57 |
+
df[col] = pd.to_numeric(df[col], errors='ignore').round(decimales)
|
| 58 |
+
except:
|
| 59 |
+
pass
|
| 60 |
return df
|
| 61 |
|
| 62 |
def calcular_promedio_desviacion(df, n_replicas, unidad_medida):
|
|
|
|
| 77 |
|
| 78 |
return df
|
| 79 |
|
| 80 |
+
def generar_graficos(df_valid, n_replicas, unidad_medida, estilo_grafico):
|
| 81 |
col_predicha_num = "Concentraci贸n Predicha Num茅rica"
|
| 82 |
col_real_promedio = f"Concentraci贸n Real Promedio ({unidad_medida})"
|
| 83 |
col_desviacion = f"Desviaci贸n Est谩ndar ({unidad_medida})"
|
|
|
|
| 95 |
sns.set(style="whitegrid")
|
| 96 |
plt.rcParams.update({'figure.autolayout': True})
|
| 97 |
|
| 98 |
+
# Definir estilos de gr谩ficos
|
| 99 |
+
estilos = {
|
| 100 |
+
"Estilo 1": {"color_puntos": "blue", "color_linea": "green", "color_error": "lightgray"},
|
| 101 |
+
"Estilo 2": {"color_puntos": "red", "color_linea": "orange", "color_error": "pink"},
|
| 102 |
+
"Estilo 3": {"color_puntos": "purple", "color_linea": "cyan", "color_error": "gray"},
|
| 103 |
+
"Estilo 4": {"color_puntos": "black", "color_linea": "yellow", "color_error": "darkgray"}
|
| 104 |
+
}
|
| 105 |
+
|
| 106 |
+
estilo = estilos.get(estilo_grafico, estilos["Estilo 1"])
|
| 107 |
+
|
| 108 |
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
|
| 109 |
|
| 110 |
# Gr谩fico de dispersi贸n con l铆nea de regresi贸n
|
|
|
|
| 115 |
df_valid[col_real_promedio],
|
| 116 |
yerr=df_valid[col_desviacion],
|
| 117 |
fmt='o',
|
| 118 |
+
color=estilo["color_puntos"],
|
| 119 |
+
ecolor=estilo["color_error"],
|
| 120 |
elinewidth=2,
|
| 121 |
capsize=3,
|
| 122 |
label='Datos Reales'
|
|
|
|
| 125 |
ax1.scatter(
|
| 126 |
df_valid[col_predicha_num],
|
| 127 |
df_valid[col_real_promedio],
|
| 128 |
+
color=estilo["color_puntos"],
|
| 129 |
s=100,
|
| 130 |
label='Datos Reales',
|
| 131 |
marker='o'
|
|
|
|
| 135 |
ax1.plot(
|
| 136 |
df_valid[col_predicha_num],
|
| 137 |
df_valid['Ajuste Lineal'],
|
| 138 |
+
color=estilo["color_linea"],
|
| 139 |
label='Ajuste Lineal',
|
| 140 |
linewidth=2
|
| 141 |
)
|
|
|
|
| 173 |
ax2.scatter(
|
| 174 |
df_valid[col_predicha_num],
|
| 175 |
residuos,
|
| 176 |
+
color=estilo["color_puntos"],
|
| 177 |
s=100,
|
| 178 |
marker='D',
|
| 179 |
label='Residuos'
|
|
|
|
| 261 |
"""
|
| 262 |
return informe, evaluacion['estado']
|
| 263 |
|
| 264 |
+
def actualizar_analisis(df, n_replicas, unidad_medida, estilo_grafico):
|
| 265 |
if df is None or df.empty:
|
| 266 |
return "Error en los datos", None, "No se pueden generar an谩lisis", df
|
| 267 |
|
|
|
|
| 284 |
slope, intercept, r_value, p_value, std_err = stats.linregress(df_valid[col_predicha_num], df_valid[col_real_promedio])
|
| 285 |
df_valid['Ajuste Lineal'] = intercept + slope * df_valid[col_predicha_num]
|
| 286 |
|
| 287 |
+
fig = generar_graficos(df_valid, n_replicas, unidad_medida, estilo_grafico)
|
| 288 |
informe, estado = generar_informe_completo(df_valid, n_replicas, unidad_medida)
|
| 289 |
|
| 290 |
return estado, fig, informe, df
|
|
|
|
| 534 |
ejemplo_od_btn = gr.Button("馃搵 Cargar Ejemplo OD", variant="secondary")
|
| 535 |
sinteticos_btn = gr.Button("馃И Generar Datos Sint茅ticos", variant="secondary")
|
| 536 |
|
| 537 |
+
with gr.Row():
|
| 538 |
+
estilo_grafico_dropdown = gr.Dropdown(
|
| 539 |
+
choices=["Estilo 1", "Estilo 2", "Estilo 3", "Estilo 4"],
|
| 540 |
+
value="Estilo 1",
|
| 541 |
+
label="Estilo del Gr谩fico"
|
| 542 |
+
)
|
| 543 |
+
|
| 544 |
tabla_output = gr.DataFrame(
|
| 545 |
wrap=True,
|
| 546 |
label="Tabla de Datos",
|
|
|
|
| 568 |
# Evento al presionar el bot贸n Calcular
|
| 569 |
calcular_btn.click(
|
| 570 |
fn=actualizar_analisis,
|
| 571 |
+
inputs=[tabla_output, replicas_slider, unidad_input, estilo_grafico_dropdown],
|
| 572 |
outputs=output_components
|
| 573 |
)
|
| 574 |
|
|
|
|
| 674 |
df = generar_tabla(7, 2000000, "UFC", n_replicas)
|
| 675 |
# Valores reales de ejemplo
|
| 676 |
df[f"Concentraci贸n Real 1 (UFC)"] = [2000000, 1600000, 1200000, 800000, 400000, 200000, 100000]
|
| 677 |
+
estado, fig, informe, df = actualizar_analisis(df, n_replicas, "UFC", "Estilo 1")
|
| 678 |
return (
|
| 679 |
2000000,
|
| 680 |
"UFC",
|