Spaces:
Sleeping
Sleeping
Upload 2 files
Browse files
app.py
CHANGED
|
@@ -497,7 +497,7 @@ def ajustar_modelo_callback(df, coluna_y, colunas_x, transformacao_y, outliers_a
|
|
| 497 |
None, None, None, None, None, # gráficos
|
| 498 |
None, # tabela_metricas
|
| 499 |
None, # estado_metricas
|
| 500 |
-
f"Outliers anteriores: {len(outliers_anteriores) if outliers_anteriores else 0} |
|
| 501 |
*secoes_ocultas, # seções 10-14 ocultas
|
| 502 |
*filtro_var_updates # atualiza dropdowns de filtro
|
| 503 |
)
|
|
@@ -521,7 +521,7 @@ def ajustar_modelo_callback(df, coluna_y, colunas_x, transformacao_y, outliers_a
|
|
| 521 |
None, None, None, None, None, # gráficos
|
| 522 |
None, # tabela_metricas
|
| 523 |
None, # estado_metricas
|
| 524 |
-
f"Outliers anteriores: {len(outliers_anteriores) if outliers_anteriores else 0} |
|
| 525 |
*secoes_ocultas, # seções 10-14 ocultas
|
| 526 |
*filtro_var_updates # atualiza dropdowns de filtro
|
| 527 |
)
|
|
@@ -562,7 +562,7 @@ def ajustar_modelo_callback(df, coluna_y, colunas_x, transformacao_y, outliers_a
|
|
| 562 |
|
| 563 |
# Resumo de outliers
|
| 564 |
n_anteriores = len(outliers_anteriores) if outliers_anteriores else 0
|
| 565 |
-
resumo = f"Outliers anteriores: {n_anteriores} |
|
| 566 |
|
| 567 |
# Updates para seções 10-15 visíveis com timestamp nos headers
|
| 568 |
secoes_visiveis = (
|
|
@@ -963,7 +963,8 @@ def _valores_reset_secoes_4_a_15():
|
|
| 963 |
gr.update(value=criar_header_secao(14, "Exclusão de Outliers")), # header_secao_14
|
| 964 |
gr.update(visible=False), # accordion_secao_14
|
| 965 |
"", # outliers_texto
|
| 966 |
-
"
|
|
|
|
| 967 |
# Section 15 (exportar)
|
| 968 |
gr.update(value=criar_header_secao(15, "Exportar Modelo")), # header_secao_15
|
| 969 |
gr.update(visible=False), # accordion_secao_15
|
|
@@ -1023,9 +1024,9 @@ def atualizar_estatisticas_auto(df_filtrado, coluna_y, colunas_x):
|
|
| 1023 |
return estatisticas.round(4), timestamp
|
| 1024 |
|
| 1025 |
|
| 1026 |
-
def reiniciar_iteracao_callback(df_original, outliers_anteriores, outliers_texto, iteracao_atual, coluna_y, colunas_x):
|
| 1027 |
"""
|
| 1028 |
-
Combina outliers anteriores com novos, atualiza estado e reinicia análise.
|
| 1029 |
Recalcula todas as seções (2 em diante) considerando a ausência dos outliers.
|
| 1030 |
"""
|
| 1031 |
# Parse dos novos outliers
|
|
@@ -1036,8 +1037,17 @@ def reiniciar_iteracao_callback(df_original, outliers_anteriores, outliers_texto
|
|
| 1036 |
except:
|
| 1037 |
pass
|
| 1038 |
|
| 1039 |
-
#
|
| 1040 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1041 |
outliers_combinados.sort()
|
| 1042 |
|
| 1043 |
# Incrementa iteração
|
|
@@ -1108,10 +1118,11 @@ def reiniciar_iteracao_callback(df_original, outliers_anteriores, outliers_texto
|
|
| 1108 |
txt_lista, # txt_lista_outliers_anteriores
|
| 1109 |
gr.update(visible=accordion_visivel), # accordion_outliers_anteriores
|
| 1110 |
"", # outliers_texto (limpo)
|
|
|
|
| 1111 |
None, # tabela_metricas (limpa)
|
| 1112 |
None, # estado_metricas (limpo)
|
| 1113 |
gr.update(value=criar_header_secao(13, "Analisar Outliers")), # header_secao_13
|
| 1114 |
-
f"Outliers anteriores: {len(outliers_combinados)} |
|
| 1115 |
mapa_html, # mapa_html atualizado
|
| 1116 |
# Novos outputs para seções 2, 6, 7, 8
|
| 1117 |
header_2_update, # header_secao_2
|
|
@@ -1126,81 +1137,31 @@ def reiniciar_iteracao_callback(df_original, outliers_anteriores, outliers_texto
|
|
| 1126 |
)
|
| 1127 |
|
| 1128 |
|
| 1129 |
-
def limpar_historico_callback(df_original
|
| 1130 |
"""
|
| 1131 |
Limpa o histórico de outliers e reinicia do zero.
|
| 1132 |
-
|
| 1133 |
"""
|
| 1134 |
-
|
| 1135 |
-
estatisticas, timestamp = atualizar_estatisticas_auto(df_original, coluna_y, colunas_x)
|
| 1136 |
-
|
| 1137 |
-
# Recalcula micronumerosidade (seção 6)
|
| 1138 |
-
try:
|
| 1139 |
-
resultado_micro = testar_micronumerosidade(df_original, list(colunas_x))
|
| 1140 |
-
html_micro = formatar_micronumerosidade_html(resultado_micro)
|
| 1141 |
-
except Exception as e:
|
| 1142 |
-
html_micro = f"<p style='color: red;'>Erro ao calcular micronumerosidade: {e}</p>"
|
| 1143 |
-
|
| 1144 |
-
# Recalcula gráficos de dispersão originais (seção 7)
|
| 1145 |
-
try:
|
| 1146 |
-
X = df_original[list(colunas_x)]
|
| 1147 |
-
y = df_original[coluna_y]
|
| 1148 |
-
fig_dispersao = criar_graficos_dispersao(X, y)
|
| 1149 |
-
except Exception as e:
|
| 1150 |
-
fig_dispersao = None
|
| 1151 |
-
|
| 1152 |
-
# Recalcula busca de transformações (seção 8)
|
| 1153 |
-
try:
|
| 1154 |
-
busca_html_result, resultados_busca, _, *btn_updates = buscar_transformacoes_callback(
|
| 1155 |
-
df_original, coluna_y, colunas_x
|
| 1156 |
-
)
|
| 1157 |
-
except Exception as e:
|
| 1158 |
-
busca_html_result = f"<p style='color: red;'>Erro na busca: {e}</p>"
|
| 1159 |
-
resultados_busca = []
|
| 1160 |
-
btn_updates = [gr.update(visible=False) for _ in range(5)]
|
| 1161 |
-
|
| 1162 |
-
# Mapa com dados originais
|
| 1163 |
-
mapa_html = criar_mapa(df_original)
|
| 1164 |
-
|
| 1165 |
-
# Header updates com timestamp
|
| 1166 |
-
header_2_update = gr.update(value=criar_header_secao(2, "Visualizar Dados", timestamp))
|
| 1167 |
-
header_5_update = gr.update(value=criar_header_secao(5, "Estatísticas das Variáveis Selecionadas", timestamp))
|
| 1168 |
-
header_6_update = gr.update(value=criar_header_secao(6, "Teste de Micronumerosidade (NBR 14.653-2)", timestamp))
|
| 1169 |
-
header_7_update = gr.update(value=criar_header_secao(7, "Gráficos de Dispersão das Variáveis Independentes", timestamp))
|
| 1170 |
-
header_8_update = gr.update(value=criar_header_secao(8, "Transformações Sugeridas", timestamp))
|
| 1171 |
|
| 1172 |
return (
|
| 1173 |
[], # estado_outliers_anteriores (vazio)
|
| 1174 |
1, # estado_iteracao (reinicia)
|
| 1175 |
df_original, # estado_df_filtrado (dados originais)
|
| 1176 |
arredondar_df(df_original), # tabela_dados
|
| 1177 |
-
|
| 1178 |
-
|
| 1179 |
"Iteração: 1", # txt_iteracao_atual
|
| 1180 |
"0 outliers excluídos", # txt_n_outliers_anteriores
|
| 1181 |
"", # txt_lista_outliers_anteriores
|
| 1182 |
gr.update(visible=False), # accordion_outliers_anteriores (esconde)
|
| 1183 |
-
"",
|
| 1184 |
-
|
| 1185 |
-
None, # estado_metricas (limpo)
|
| 1186 |
-
gr.update(value=criar_header_secao(13, "Analisar Outliers")), # header_secao_13
|
| 1187 |
-
"Outliers anteriores: 0 | Novos: 0 | Total após iteração: 0", # txt_resumo_outliers
|
| 1188 |
-
mapa_html, # mapa_html
|
| 1189 |
-
# Novos outputs para seções 2, 6, 7, 8
|
| 1190 |
-
header_2_update, # header_secao_2
|
| 1191 |
-
html_micro, # html_micronumerosidade
|
| 1192 |
-
header_6_update, # header_secao_6
|
| 1193 |
-
fig_dispersao, # plot_dispersao
|
| 1194 |
-
header_7_update, # header_secao_7
|
| 1195 |
-
busca_html_result, # busca_html
|
| 1196 |
-
resultados_busca, # estado_resultados_busca
|
| 1197 |
-
header_8_update, # header_secao_8
|
| 1198 |
-
*btn_updates, # botões adotar (5 botões)
|
| 1199 |
)
|
| 1200 |
|
| 1201 |
|
| 1202 |
-
def atualizar_resumo_outliers(outliers_anteriores, outliers_texto):
|
| 1203 |
-
"""Atualiza o resumo de outliers quando o usuário edita
|
| 1204 |
n_anteriores = len(outliers_anteriores) if outliers_anteriores else 0
|
| 1205 |
|
| 1206 |
novos_outliers = []
|
|
@@ -1210,10 +1171,20 @@ def atualizar_resumo_outliers(outliers_anteriores, outliers_texto):
|
|
| 1210 |
except:
|
| 1211 |
pass
|
| 1212 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1213 |
n_novos = len(novos_outliers)
|
| 1214 |
-
|
|
|
|
|
|
|
|
|
|
| 1215 |
|
| 1216 |
-
return f"Outliers anteriores: {n_anteriores} |
|
| 1217 |
|
| 1218 |
|
| 1219 |
def aplicar_selecao_callback(df, coluna_y, colunas_x, outliers_anteriores):
|
|
@@ -1815,17 +1786,22 @@ def criar_interface():
|
|
| 1815 |
placeholder="Ex: 5, 12, 23",
|
| 1816 |
scale=3
|
| 1817 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1818 |
|
| 1819 |
with gr.Row():
|
| 1820 |
txt_resumo_outliers = gr.Textbox(
|
| 1821 |
label="Resumo",
|
| 1822 |
-
value="Outliers anteriores: 0 |
|
| 1823 |
interactive=False
|
| 1824 |
)
|
| 1825 |
|
| 1826 |
with gr.Row():
|
| 1827 |
btn_reiniciar_iteracao = gr.Button(
|
| 1828 |
-
"Aplicar
|
| 1829 |
variant="primary",
|
| 1830 |
scale=2
|
| 1831 |
)
|
|
@@ -1904,7 +1880,7 @@ def criar_interface():
|
|
| 1904 |
header_secao_11, accordion_secao_11, diagnosticos_html, tabela_coef, tabela_obs_calc,
|
| 1905 |
header_secao_12, accordion_secao_12, plot_obs_calc, plot_residuos, plot_hist, plot_cook, plot_corr,
|
| 1906 |
header_secao_13, accordion_secao_13, tabela_metricas,
|
| 1907 |
-
header_secao_14, accordion_secao_14, outliers_texto, txt_resumo_outliers,
|
| 1908 |
header_secao_15, accordion_secao_15, nome_arquivo, status_exportar,
|
| 1909 |
]
|
| 1910 |
|
|
@@ -2030,17 +2006,23 @@ def criar_interface():
|
|
| 2030 |
outputs=[estado_n_filtros] + filtro_rows + filtro_vars + filtro_ops + filtro_vals + [outliers_texto]
|
| 2031 |
)
|
| 2032 |
|
| 2033 |
-
# Atualizar resumo de outliers quando usuário edita
|
| 2034 |
outliers_texto.change(
|
| 2035 |
atualizar_resumo_outliers,
|
| 2036 |
-
inputs=[estado_outliers_anteriores, outliers_texto],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2037 |
outputs=[txt_resumo_outliers]
|
| 2038 |
)
|
| 2039 |
|
| 2040 |
# Aplicar filtro também atualiza o resumo
|
| 2041 |
btn_aplicar_filtro.click(
|
| 2042 |
atualizar_resumo_outliers,
|
| 2043 |
-
inputs=[estado_outliers_anteriores, outliers_texto],
|
| 2044 |
outputs=[txt_resumo_outliers]
|
| 2045 |
)
|
| 2046 |
|
|
@@ -2136,7 +2118,7 @@ def criar_interface():
|
|
| 2136 |
btn_reiniciar_iteracao.click(
|
| 2137 |
reiniciar_iteracao_callback,
|
| 2138 |
inputs=[
|
| 2139 |
-
estado_df, estado_outliers_anteriores, outliers_texto,
|
| 2140 |
estado_iteracao, dropdown_y, checkboxes_x
|
| 2141 |
],
|
| 2142 |
outputs=[
|
|
@@ -2151,6 +2133,7 @@ def criar_interface():
|
|
| 2151 |
txt_lista_outliers_anteriores,
|
| 2152 |
accordion_outliers_anteriores,
|
| 2153 |
outliers_texto,
|
|
|
|
| 2154 |
tabela_metricas,
|
| 2155 |
estado_metricas,
|
| 2156 |
header_secao_13,
|
|
@@ -2198,39 +2181,46 @@ def criar_interface():
|
|
| 2198 |
header_secao_14, accordion_secao_14,
|
| 2199 |
header_secao_15, accordion_secao_15,
|
| 2200 |
] + filtro_vars
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2201 |
)
|
| 2202 |
|
| 2203 |
# Limpar histórico de outliers
|
| 2204 |
btn_limpar_historico.click(
|
| 2205 |
limpar_historico_callback,
|
| 2206 |
-
inputs=[estado_df
|
| 2207 |
outputs=[
|
| 2208 |
estado_outliers_anteriores,
|
| 2209 |
estado_iteracao,
|
| 2210 |
estado_df_filtrado,
|
| 2211 |
tabela_dados,
|
| 2212 |
tabela_estatisticas,
|
| 2213 |
-
|
| 2214 |
txt_iteracao_atual,
|
| 2215 |
txt_n_outliers_anteriores,
|
| 2216 |
txt_lista_outliers_anteriores,
|
| 2217 |
accordion_outliers_anteriores,
|
| 2218 |
-
outliers_texto,
|
| 2219 |
-
tabela_metricas,
|
| 2220 |
-
estado_metricas,
|
| 2221 |
-
header_secao_13,
|
| 2222 |
-
txt_resumo_outliers,
|
| 2223 |
-
mapa_html,
|
| 2224 |
-
# Novos outputs para seções 2, 6, 7, 8
|
| 2225 |
header_secao_2,
|
| 2226 |
-
|
| 2227 |
-
|
| 2228 |
-
|
| 2229 |
-
|
| 2230 |
-
|
| 2231 |
-
|
| 2232 |
-
|
|
|
|
|
|
|
| 2233 |
btn_adotar_1, btn_adotar_2, btn_adotar_3, btn_adotar_4, btn_adotar_5,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2234 |
]
|
| 2235 |
)
|
| 2236 |
|
|
|
|
| 497 |
None, None, None, None, None, # gráficos
|
| 498 |
None, # tabela_metricas
|
| 499 |
None, # estado_metricas
|
| 500 |
+
f"Outliers anteriores: {len(outliers_anteriores) if outliers_anteriores else 0} | Excluir: 0 | Reincluir: 0 | Total após iteração: {len(outliers_anteriores) if outliers_anteriores else 0}", # txt_resumo_outliers
|
| 501 |
*secoes_ocultas, # seções 10-14 ocultas
|
| 502 |
*filtro_var_updates # atualiza dropdowns de filtro
|
| 503 |
)
|
|
|
|
| 521 |
None, None, None, None, None, # gráficos
|
| 522 |
None, # tabela_metricas
|
| 523 |
None, # estado_metricas
|
| 524 |
+
f"Outliers anteriores: {len(outliers_anteriores) if outliers_anteriores else 0} | Excluir: 0 | Reincluir: 0 | Total: {len(outliers_anteriores) if outliers_anteriores else 0}",
|
| 525 |
*secoes_ocultas, # seções 10-14 ocultas
|
| 526 |
*filtro_var_updates # atualiza dropdowns de filtro
|
| 527 |
)
|
|
|
|
| 562 |
|
| 563 |
# Resumo de outliers
|
| 564 |
n_anteriores = len(outliers_anteriores) if outliers_anteriores else 0
|
| 565 |
+
resumo = f"Outliers anteriores: {n_anteriores} | Excluir: 0 | Reincluir: 0 | Total após iteração: {n_anteriores}"
|
| 566 |
|
| 567 |
# Updates para seções 10-15 visíveis com timestamp nos headers
|
| 568 |
secoes_visiveis = (
|
|
|
|
| 963 |
gr.update(value=criar_header_secao(14, "Exclusão de Outliers")), # header_secao_14
|
| 964 |
gr.update(visible=False), # accordion_secao_14
|
| 965 |
"", # outliers_texto
|
| 966 |
+
"", # reincluir_texto
|
| 967 |
+
"Outliers anteriores: 0 | Excluir: 0 | Reincluir: 0 | Total após iteração: 0", # txt_resumo_outliers
|
| 968 |
# Section 15 (exportar)
|
| 969 |
gr.update(value=criar_header_secao(15, "Exportar Modelo")), # header_secao_15
|
| 970 |
gr.update(visible=False), # accordion_secao_15
|
|
|
|
| 1024 |
return estatisticas.round(4), timestamp
|
| 1025 |
|
| 1026 |
|
| 1027 |
+
def reiniciar_iteracao_callback(df_original, outliers_anteriores, outliers_texto, reincluir_texto, iteracao_atual, coluna_y, colunas_x):
|
| 1028 |
"""
|
| 1029 |
+
Combina outliers anteriores com novos (excluindo reincluídos), atualiza estado e reinicia análise.
|
| 1030 |
Recalcula todas as seções (2 em diante) considerando a ausência dos outliers.
|
| 1031 |
"""
|
| 1032 |
# Parse dos novos outliers
|
|
|
|
| 1037 |
except:
|
| 1038 |
pass
|
| 1039 |
|
| 1040 |
+
# Parse dos índices a reincluir
|
| 1041 |
+
reincluir = []
|
| 1042 |
+
if reincluir_texto and reincluir_texto.strip():
|
| 1043 |
+
try:
|
| 1044 |
+
reincluir = [int(x.strip()) for x in reincluir_texto.split(",") if x.strip()]
|
| 1045 |
+
except:
|
| 1046 |
+
pass
|
| 1047 |
+
|
| 1048 |
+
# Remove reincluídos dos anteriores, depois combina com novos (sem duplicatas)
|
| 1049 |
+
anteriores_atualizados = [i for i in (outliers_anteriores or []) if i not in reincluir]
|
| 1050 |
+
outliers_combinados = list(set(anteriores_atualizados + novos_outliers))
|
| 1051 |
outliers_combinados.sort()
|
| 1052 |
|
| 1053 |
# Incrementa iteração
|
|
|
|
| 1118 |
txt_lista, # txt_lista_outliers_anteriores
|
| 1119 |
gr.update(visible=accordion_visivel), # accordion_outliers_anteriores
|
| 1120 |
"", # outliers_texto (limpo)
|
| 1121 |
+
"", # reincluir_texto (limpo)
|
| 1122 |
None, # tabela_metricas (limpa)
|
| 1123 |
None, # estado_metricas (limpo)
|
| 1124 |
gr.update(value=criar_header_secao(13, "Analisar Outliers")), # header_secao_13
|
| 1125 |
+
f"Outliers anteriores: {len(outliers_combinados)} | Excluir: 0 | Reincluir: 0 | Total após iteração: {len(outliers_combinados)}", # txt_resumo_outliers
|
| 1126 |
mapa_html, # mapa_html atualizado
|
| 1127 |
# Novos outputs para seções 2, 6, 7, 8
|
| 1128 |
header_2_update, # header_secao_2
|
|
|
|
| 1137 |
)
|
| 1138 |
|
| 1139 |
|
| 1140 |
+
def limpar_historico_callback(df_original):
|
| 1141 |
"""
|
| 1142 |
Limpa o histórico de outliers e reinicia do zero.
|
| 1143 |
+
Reseta tudo como se o arquivo tivesse acabado de ser carregado.
|
| 1144 |
"""
|
| 1145 |
+
mapa = criar_mapa(df_original)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1146 |
|
| 1147 |
return (
|
| 1148 |
[], # estado_outliers_anteriores (vazio)
|
| 1149 |
1, # estado_iteracao (reinicia)
|
| 1150 |
df_original, # estado_df_filtrado (dados originais)
|
| 1151 |
arredondar_df(df_original), # tabela_dados
|
| 1152 |
+
gr.update(value=None), # tabela_estatisticas (limpa)
|
| 1153 |
+
mapa, # mapa_html
|
| 1154 |
"Iteração: 1", # txt_iteracao_atual
|
| 1155 |
"0 outliers excluídos", # txt_n_outliers_anteriores
|
| 1156 |
"", # txt_lista_outliers_anteriores
|
| 1157 |
gr.update(visible=False), # accordion_outliers_anteriores (esconde)
|
| 1158 |
+
gr.update(value=criar_header_secao(2, "Visualizar Dados")), # header_secao_2
|
| 1159 |
+
*_valores_reset_secoes_4_a_15(), # reset completo seções 4-15
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1160 |
)
|
| 1161 |
|
| 1162 |
|
| 1163 |
+
def atualizar_resumo_outliers(outliers_anteriores, outliers_texto, reincluir_texto):
|
| 1164 |
+
"""Atualiza o resumo de outliers quando o usuário edita os campos."""
|
| 1165 |
n_anteriores = len(outliers_anteriores) if outliers_anteriores else 0
|
| 1166 |
|
| 1167 |
novos_outliers = []
|
|
|
|
| 1171 |
except:
|
| 1172 |
pass
|
| 1173 |
|
| 1174 |
+
reincluir = []
|
| 1175 |
+
if reincluir_texto and reincluir_texto.strip():
|
| 1176 |
+
try:
|
| 1177 |
+
reincluir = [int(x.strip()) for x in reincluir_texto.split(",") if x.strip()]
|
| 1178 |
+
except:
|
| 1179 |
+
pass
|
| 1180 |
+
|
| 1181 |
n_novos = len(novos_outliers)
|
| 1182 |
+
n_reincluir = len(reincluir)
|
| 1183 |
+
# Calcula total: anteriores menos reincluídos, mais novos
|
| 1184 |
+
anteriores_atualizados = [i for i in (outliers_anteriores or []) if i not in reincluir]
|
| 1185 |
+
n_total = len(set(anteriores_atualizados + novos_outliers))
|
| 1186 |
|
| 1187 |
+
return f"Outliers anteriores: {n_anteriores} | Excluir: {n_novos} | Reincluir: {n_reincluir} | Total após iteração: {n_total}"
|
| 1188 |
|
| 1189 |
|
| 1190 |
def aplicar_selecao_callback(df, coluna_y, colunas_x, outliers_anteriores):
|
|
|
|
| 1786 |
placeholder="Ex: 5, 12, 23",
|
| 1787 |
scale=3
|
| 1788 |
)
|
| 1789 |
+
reincluir_texto = gr.Textbox(
|
| 1790 |
+
label="Índices a Reincluir nesta Iteração",
|
| 1791 |
+
placeholder="Ex: 5, 12",
|
| 1792 |
+
scale=3
|
| 1793 |
+
)
|
| 1794 |
|
| 1795 |
with gr.Row():
|
| 1796 |
txt_resumo_outliers = gr.Textbox(
|
| 1797 |
label="Resumo",
|
| 1798 |
+
value="Outliers anteriores: 0 | Excluir: 0 | Reincluir: 0 | Total após iteração: 0",
|
| 1799 |
interactive=False
|
| 1800 |
)
|
| 1801 |
|
| 1802 |
with gr.Row():
|
| 1803 |
btn_reiniciar_iteracao = gr.Button(
|
| 1804 |
+
"Aplicar Modificações e Reiniciar Iteração",
|
| 1805 |
variant="primary",
|
| 1806 |
scale=2
|
| 1807 |
)
|
|
|
|
| 1880 |
header_secao_11, accordion_secao_11, diagnosticos_html, tabela_coef, tabela_obs_calc,
|
| 1881 |
header_secao_12, accordion_secao_12, plot_obs_calc, plot_residuos, plot_hist, plot_cook, plot_corr,
|
| 1882 |
header_secao_13, accordion_secao_13, tabela_metricas,
|
| 1883 |
+
header_secao_14, accordion_secao_14, outliers_texto, reincluir_texto, txt_resumo_outliers,
|
| 1884 |
header_secao_15, accordion_secao_15, nome_arquivo, status_exportar,
|
| 1885 |
]
|
| 1886 |
|
|
|
|
| 2006 |
outputs=[estado_n_filtros] + filtro_rows + filtro_vars + filtro_ops + filtro_vals + [outliers_texto]
|
| 2007 |
)
|
| 2008 |
|
| 2009 |
+
# Atualizar resumo de outliers quando usuário edita os campos
|
| 2010 |
outliers_texto.change(
|
| 2011 |
atualizar_resumo_outliers,
|
| 2012 |
+
inputs=[estado_outliers_anteriores, outliers_texto, reincluir_texto],
|
| 2013 |
+
outputs=[txt_resumo_outliers]
|
| 2014 |
+
)
|
| 2015 |
+
|
| 2016 |
+
reincluir_texto.change(
|
| 2017 |
+
atualizar_resumo_outliers,
|
| 2018 |
+
inputs=[estado_outliers_anteriores, outliers_texto, reincluir_texto],
|
| 2019 |
outputs=[txt_resumo_outliers]
|
| 2020 |
)
|
| 2021 |
|
| 2022 |
# Aplicar filtro também atualiza o resumo
|
| 2023 |
btn_aplicar_filtro.click(
|
| 2024 |
atualizar_resumo_outliers,
|
| 2025 |
+
inputs=[estado_outliers_anteriores, outliers_texto, reincluir_texto],
|
| 2026 |
outputs=[txt_resumo_outliers]
|
| 2027 |
)
|
| 2028 |
|
|
|
|
| 2118 |
btn_reiniciar_iteracao.click(
|
| 2119 |
reiniciar_iteracao_callback,
|
| 2120 |
inputs=[
|
| 2121 |
+
estado_df, estado_outliers_anteriores, outliers_texto, reincluir_texto,
|
| 2122 |
estado_iteracao, dropdown_y, checkboxes_x
|
| 2123 |
],
|
| 2124 |
outputs=[
|
|
|
|
| 2133 |
txt_lista_outliers_anteriores,
|
| 2134 |
accordion_outliers_anteriores,
|
| 2135 |
outliers_texto,
|
| 2136 |
+
reincluir_texto,
|
| 2137 |
tabela_metricas,
|
| 2138 |
estado_metricas,
|
| 2139 |
header_secao_13,
|
|
|
|
| 2181 |
header_secao_14, accordion_secao_14,
|
| 2182 |
header_secao_15, accordion_secao_15,
|
| 2183 |
] + filtro_vars
|
| 2184 |
+
).then(
|
| 2185 |
+
fn=None,
|
| 2186 |
+
inputs=None,
|
| 2187 |
+
outputs=None,
|
| 2188 |
+
js="() => { window.scrollTo({top: 0, behavior: 'smooth'}); }"
|
| 2189 |
)
|
| 2190 |
|
| 2191 |
# Limpar histórico de outliers
|
| 2192 |
btn_limpar_historico.click(
|
| 2193 |
limpar_historico_callback,
|
| 2194 |
+
inputs=[estado_df],
|
| 2195 |
outputs=[
|
| 2196 |
estado_outliers_anteriores,
|
| 2197 |
estado_iteracao,
|
| 2198 |
estado_df_filtrado,
|
| 2199 |
tabela_dados,
|
| 2200 |
tabela_estatisticas,
|
| 2201 |
+
mapa_html,
|
| 2202 |
txt_iteracao_atual,
|
| 2203 |
txt_n_outliers_anteriores,
|
| 2204 |
txt_lista_outliers_anteriores,
|
| 2205 |
accordion_outliers_anteriores,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2206 |
header_secao_2,
|
| 2207 |
+
# Reset seções 4-15 (states)
|
| 2208 |
+
estado_modelo, estado_metricas, estado_resultados_busca,
|
| 2209 |
+
# Headers, accordions e conteúdo das seções 4-15
|
| 2210 |
+
header_secao_4, accordion_secao_4,
|
| 2211 |
+
header_secao_5, accordion_secao_5,
|
| 2212 |
+
header_secao_6, accordion_secao_6, html_micronumerosidade,
|
| 2213 |
+
header_secao_7, accordion_secao_7, plot_dispersao,
|
| 2214 |
+
header_secao_8, accordion_secao_8, busca_html,
|
| 2215 |
+
header_secao_9, accordion_secao_9, transformacao_y,
|
| 2216 |
btn_adotar_1, btn_adotar_2, btn_adotar_3, btn_adotar_4, btn_adotar_5,
|
| 2217 |
+
] + transf_x_rows + transf_x_columns + transf_x_labels + transf_x_dropdowns + [
|
| 2218 |
+
header_secao_10, accordion_secao_10, plot_dispersao_transf,
|
| 2219 |
+
header_secao_11, accordion_secao_11, diagnosticos_html, tabela_coef, tabela_obs_calc,
|
| 2220 |
+
header_secao_12, accordion_secao_12, plot_obs_calc, plot_residuos, plot_hist, plot_cook, plot_corr,
|
| 2221 |
+
header_secao_13, accordion_secao_13, tabela_metricas,
|
| 2222 |
+
header_secao_14, accordion_secao_14, outliers_texto, reincluir_texto, txt_resumo_outliers,
|
| 2223 |
+
header_secao_15, accordion_secao_15, nome_arquivo, status_exportar,
|
| 2224 |
]
|
| 2225 |
)
|
| 2226 |
|
charts.py
CHANGED
|
@@ -474,13 +474,17 @@ def criar_mapa(df, lat_col="lat", lon_col="lon", cor_col=None, indice_destacado=
|
|
| 474 |
folium.TileLayer(tiles="OpenStreetMap", name="OpenStreetMap", control=True).add_to(m)
|
| 475 |
folium.TileLayer(tiles="CartoDB positron", name="Positron", control=True).add_to(m)
|
| 476 |
|
| 477 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
| 478 |
colormap = None
|
| 479 |
if cor_col and cor_col in df_mapa.columns:
|
| 480 |
vmin = df_mapa[cor_col].min()
|
| 481 |
vmax = df_mapa[cor_col].max()
|
| 482 |
colormap = cm.LinearColormap(
|
| 483 |
-
colors=["#
|
| 484 |
vmin=vmin,
|
| 485 |
vmax=vmax,
|
| 486 |
caption=cor_col
|
|
@@ -532,7 +536,7 @@ def criar_mapa(df, lat_col="lat", lon_col="lon", cor_col=None, indice_destacado=
|
|
| 532 |
location=[row[lat_real], row[lon_real]],
|
| 533 |
radius=raio,
|
| 534 |
popup=folium.Popup(popup_html, max_width=300),
|
| 535 |
-
color='black'
|
| 536 |
weight=peso,
|
| 537 |
fill=True,
|
| 538 |
fillColor=cor,
|
|
|
|
| 474 |
folium.TileLayer(tiles="OpenStreetMap", name="OpenStreetMap", control=True).add_to(m)
|
| 475 |
folium.TileLayer(tiles="CartoDB positron", name="Positron", control=True).add_to(m)
|
| 476 |
|
| 477 |
+
# Se tamanho_col fornecido mas cor_col não, usa mesma variável para cor
|
| 478 |
+
if tamanho_col and not cor_col:
|
| 479 |
+
cor_col = tamanho_col
|
| 480 |
+
|
| 481 |
+
# Colormap se houver coluna de cor (verde → vermelho)
|
| 482 |
colormap = None
|
| 483 |
if cor_col and cor_col in df_mapa.columns:
|
| 484 |
vmin = df_mapa[cor_col].min()
|
| 485 |
vmax = df_mapa[cor_col].max()
|
| 486 |
colormap = cm.LinearColormap(
|
| 487 |
+
colors=["#2ecc71", "#a8e06c", "#f1c40f", "#e67e22", "#e74c3c"],
|
| 488 |
vmin=vmin,
|
| 489 |
vmax=vmax,
|
| 490 |
caption=cor_col
|
|
|
|
| 536 |
location=[row[lat_real], row[lon_real]],
|
| 537 |
radius=raio,
|
| 538 |
popup=folium.Popup(popup_html, max_width=300),
|
| 539 |
+
color='black',
|
| 540 |
weight=peso,
|
| 541 |
fill=True,
|
| 542 |
fillColor=cor,
|