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",
|