gui-sparim commited on
Commit
5062c5c
·
verified ·
1 Parent(s): 26add87

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +83 -93
  2. charts.py +7 -3
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} | Novos: 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,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} | Novos: 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,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} | Novos: 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,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
- "Outliers anteriores: 0 | Novos: 0 | Total após iteração: 0", # txt_resumo_outliers
 
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
- # Combina listas (sem duplicatas)
1040
- outliers_combinados = list(set((outliers_anteriores or []) + novos_outliers))
 
 
 
 
 
 
 
 
 
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)} | Novos: 0 | Total após iteração: {len(outliers_combinados)}", # txt_resumo_outliers
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, coluna_y, colunas_x):
1130
  """
1131
  Limpa o histórico de outliers e reinicia do zero.
1132
- Recalcula todas as seções (2 em diante) com dados originais.
1133
  """
1134
- # Recalcula estatísticas com dados originais (seção 5)
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
- estatisticas, # tabela_estatisticas
1178
- header_5_update, # header_secao_5
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
- "", # outliers_texto (limpo)
1184
- None, # tabela_metricas (limpa)
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 o campo."""
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
- n_total = len(set((outliers_anteriores or []) + novos_outliers))
 
 
 
1215
 
1216
- return f"Outliers anteriores: {n_anteriores} | Novos: {n_novos} | Total após iteração: {n_total}"
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 | Novos: 0 | Total após iteração: 0",
1823
  interactive=False
1824
  )
1825
 
1826
  with gr.Row():
1827
  btn_reiniciar_iteracao = gr.Button(
1828
- "Aplicar Exclusões e Reiniciar Iteração",
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 o campo
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, dropdown_y, checkboxes_x],
2207
  outputs=[
2208
  estado_outliers_anteriores,
2209
  estado_iteracao,
2210
  estado_df_filtrado,
2211
  tabela_dados,
2212
  tabela_estatisticas,
2213
- header_secao_5,
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
- html_micronumerosidade,
2227
- header_secao_6,
2228
- plot_dispersao,
2229
- header_secao_7,
2230
- busca_html,
2231
- estado_resultados_busca,
2232
- header_secao_8,
 
 
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
- # Colormap se houver coluna de cor
 
 
 
 
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=["#fff3e0", "#ffcc80", "#ff9800", "#ef6c00", "#e65100"],
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' if idx == indice_destacado else COR_PRINCIPAL,
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,