DavidSB commited on
Commit
f634c90
1 Parent(s): f70de4f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +184 -47
app.py CHANGED
@@ -24,7 +24,7 @@ from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
24
  from docx.shared import Inches
25
  from num2words import num2words
26
  from datetime import datetime
27
- #%matplotlib inline
28
 
29
  #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
30
  # 2) FUNÇÕES ACESSÓRIAS
@@ -140,7 +140,7 @@ def calc_extrapola(df_1, df_2):
140
  #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
141
 
142
  # função para a regressão linear
143
- def gera_model(planilha, name_model, v_d, scv_d,
144
  scv_1, scv_2, scv_3, scv_4,
145
  scv_5, scv_6, scv_7, scv_8,
146
  scv_9, scv_10, scv_11, scv_12,
@@ -151,8 +151,29 @@ def gera_model(planilha, name_model, v_d, scv_d,
151
  lograd="-", munic="-", tipo_imo="-", solic="-", finalidade="-", objetivo="-", press="-",
152
  infra="Água Potável", serv="Coleta de Lixo", uso="Residencial", pad_reg="-", tipo_via="-", obs_gerais="-",
153
  per="Sem destaque", ofe="Sem destaque", liq="Sem destaque", dia="-"):
154
-
 
155
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
  # IMPORTRAÇÃO DA PLANILHA
157
  # Carregando os dados
158
  df_dados = pd.read_excel(planilha.name)
@@ -167,6 +188,7 @@ def gera_model(planilha, name_model, v_d, scv_d,
167
 
168
  df_original = df_dados.copy() ################################### OUTPUT ##########################################
169
 
 
170
  # -----------------------------------------------------------------------------------------------------------------#
171
  # Comentário 1:
172
  # Criação do "df_avalia" para extrair o "df_limites_var" e o "df_dados_utilizados" por meio da seleção de variáveis
@@ -174,7 +196,37 @@ def gera_model(planilha, name_model, v_d, scv_d,
174
  # -----------------------------------------------------------------------------------------------------------------#
175
 
176
  # Dataframe para criação de uma planilha de modelo para avaliação
177
- df_avalia = pd.DataFrame()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
178
  # Iterar sobre as colunas do DataFrame df_filtrado
179
  for i, col in enumerate(df_dados.columns):
180
  # Verificar se a coluna atual deve ser adicionada com base na condição e se ela existe no DataFrame
@@ -242,7 +294,6 @@ def gera_model(planilha, name_model, v_d, scv_d,
242
  # Transformando a lista em uma string separada por vírgula
243
  string_colunas = "\n".join(colunas)################################### OUTPUT ##########################################
244
 
245
-
246
 
247
  # CONVERSÃO DE ESCALAS
248
  # -----------------------------------------------------------------------------------------------------------------#
@@ -316,11 +367,34 @@ def gera_model(planilha, name_model, v_d, scv_d,
316
  # 6) Contagem final da quantidade de linhas do "df_outliers"
317
  # -----------------------------------------------------------------------------------------------------------------#
318
 
319
- # Convertendo a entrada em uma lista de inteiros
320
- dados_out = [int(num.strip()) for num in out.split(",") if num.strip()]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
321
 
322
  # Filtrando o DataFrame para obter os outliers
323
  df_outliers = df_dados[df_dados.iloc[:, 0].isin(dados_out)]
 
 
324
 
325
  # Removendo os outliers do DataFrame df_limites_var para calcular os valores mínimos e máximos de cada variável
326
  df_limites_var = df_limites_var[~df_dados.iloc[:, 0].isin(dados_out)]
@@ -593,7 +667,8 @@ def gera_model(planilha, name_model, v_d, scv_d,
593
 
594
  # Teste Kolmogorov-Smirnov (KS)
595
  ks_test = sm.stats.diagnostic.kstest_normal(residuos)
596
- ks_test_formatted = tuple(round(val, 4) for val in ks_test)
 
597
  # Calculando o teste de Jarque-Bera para os resíduos
598
  jarque_bera_test, p_value, skewness, kurtosis = jarque_bera(residuos)
599
  # Formatando os resultados com 4 casas decimais
@@ -669,20 +744,16 @@ def gera_model(planilha, name_model, v_d, scv_d,
669
  Desvio Padrão: {desvio_padrao_residuos}
670
  Estatística F: {estatistica_F} / Nível de Significância Modelo: {nivel_significancia}
671
  R²: {r_squared} / R² ajustado: {r_squared_adjusted} / Correlação: {coef_correlacao}
672
- Número de observações: {num_observacoes}
673
- Número de dados não utilizados: {num_outliers}
674
  Número de variáveis utilizadas: {n_vars}
675
  Importância Variáveis em % (ExtraTreesRegressor): {feat_importances_list}
676
  ------------------------------------------------------
677
  Testes de normalidade:
678
- 1) Comparação (curva normal):
679
  Ideal 68% - aceitável de 64% a 75%
680
  Ideal 90% - aceitável de 88% a 95%
681
  Ideal 95% - aceitável de 95% a 100%
682
- Percentuais atingidos: {perc_resid}
683
- 2) Teste Kolmogorov-Smirnov (KS)
684
- - Distribuição dos resíduos: {ks_test}
685
- 3) Teste de Jarque-Bera:
686
  - Estatística do teste: {jarque_bera_test}
687
  - Valor-p: {p_value}
688
  - Assimetria (Skewness): {skewness}
@@ -860,9 +931,8 @@ def gera_model(planilha, name_model, v_d, scv_d,
860
  'Número de observações': [num_observacoes],
861
  'Número de dados não utilizados': [num_outliers],
862
  'Número de variáveis utilizadas': [n_vars],
863
- '1) Comparação (curva normal 68% 90% 65%)': [perc_resid],
864
- '2) Teste Kolmogorov-Smirnov (KS)': [ks_test],
865
- '3) Estatística do teste': [jarque_bera_test],
866
  '- Valor-p': [p_value],
867
  '- Assimetria (Skewness)': [skewness],
868
  '- Curtose (Kurtosis)': [kurtosis],
@@ -876,21 +946,33 @@ def gera_model(planilha, name_model, v_d, scv_d,
876
  resultados = resultados.T.reset_index()
877
  # Defina os nomes das colunas do novo DataFrame
878
  resultados.columns = ['Resultado', 'Valor']
879
- resultados.to_excel(writer, sheet_name='Result_gerais', index=False)
880
 
881
  # Salve o DataFrame 'RESULTADOS VARS' na planilha
882
- resultados_vars.to_excel(writer, sheet_name='Result_vars', index=False)
 
 
 
 
 
 
 
 
 
 
883
 
884
  # Salve o DataFrame 'DADOS PARA REGRESSÃO' na planilha
885
- df_exporta_modelo.to_excel(writer, sheet_name='Model', index=False)
886
 
887
  # Salve o DataFrame 'PLANILHA MODELO PARA AVALIAÇÃO' na planilha 'relatório'
888
  df_avalia_copy = df_avalia.copy()
889
  df_avalia_copy = df_avalia_copy.iloc[0:0]
890
  df_avalia_copy.to_excel(writer, sheet_name='avaliando', index=False)
891
 
 
 
892
 
893
-
894
  # PONTOS INFLUENCIANTES
895
  # -----------------------------------------------------------------------------------------------------------------#
896
  # Comentário 16:
@@ -920,7 +1002,7 @@ def gera_model(planilha, name_model, v_d, scv_d,
920
  # -----------------------------------------------------------------------------------------------------------------#
921
 
922
  # Gráfico dos resíduos padronizados
923
- fig, ax1 = plt.subplots(figsize=(8, 5))
924
  ax1.scatter(df_final['Valores Ajustados'], erro_padronizado, color='orange', alpha=0.6)
925
  ax1.axhline(y=0, color='black', linestyle='--', linewidth=1) # Linha zero
926
  ax1.axhline(y=2, color='red', linestyle='-', linewidth=1) # Linhas vermelhas em ±2
@@ -937,7 +1019,7 @@ def gera_model(planilha, name_model, v_d, scv_d,
937
  plt.close(fig) # Fecha a figura para que o próximo gráfico seja independente
938
 
939
  # Histograma dos resíduos padronizados
940
- fig, ax2 = plt.subplots(figsize=(8, 5))
941
  sns.histplot(erro_padronizado, kde=True, color='orange', alpha=0.6, ax=ax2)
942
  ax2.set_title('Histograma dos Resíduos Padronizados')
943
  ax2.set_xlabel('Resíduos Padronizados')
@@ -947,7 +1029,7 @@ def gera_model(planilha, name_model, v_d, scv_d,
947
  plt.close(fig)
948
 
949
  # Gráfico da distância de Cook
950
- fig, ax3 = plt.subplots(figsize=(8, 5))
951
  ax3.plot(distancia_cook, marker='o', linestyle='None', color='orange')
952
  ax3.axhline(y=1, color='red', linestyle='--', linewidth=1)
953
  ax3.set_title('Gráfico da Distância de Cook')
@@ -961,7 +1043,7 @@ def gera_model(planilha, name_model, v_d, scv_d,
961
  plt.close(fig)
962
 
963
  # Gráfico Valores Ajustados vs Preços Observados
964
- fig, ax4 = plt.subplots(figsize=(8, 5))
965
  x_values = df_correl_grafico['Observados']
966
  y_values = df_correl_grafico['Calculados']
967
  slope, intercept = np.polyfit(x_values, y_values, 1)
@@ -975,7 +1057,7 @@ def gera_model(planilha, name_model, v_d, scv_d,
975
  plt.close(fig)
976
 
977
  # Matriz de correlações
978
- fig, ax6 = plt.subplots(figsize=(8, 5))
979
  ax6.set_title('Matriz de Correlação')
980
  palette = sns.light_palette("orange", as_cmap=True)
981
  sns.heatmap(correlation_matrix, annot=True, cmap=palette, linewidths=0.3, ax=ax6, annot_kws={"size": 6},
@@ -988,7 +1070,7 @@ def gera_model(planilha, name_model, v_d, scv_d,
988
  # AVALIAÇÃO
989
  # -----------------------------------------------------------------------------------------------------------------#
990
  # Comentário 18:
991
- # 1) No momento de gerar modelo é é possível, por meio da aba "avaliando" da planilha imputada, fazer uma avalaição
992
  # 2) Criadas duas cópias do "df_aval".
993
  # -----------------------------------------------------------------------------------------------------------------#
994
 
@@ -1001,8 +1083,7 @@ def gera_model(planilha, name_model, v_d, scv_d,
1001
  df_aval_final = df_aval.copy()
1002
  df_aval_original = pd.DataFrame()
1003
 
1004
-
1005
-
1006
  # -----------------------------------------------------------------------------------------------------------------#
1007
  # Comentário 19:
1008
  # 1) O 'df_aval_final' serve como agregador das informações, mantendo a forma original para posterior apresentação
@@ -1054,6 +1135,34 @@ def gera_model(planilha, name_model, v_d, scv_d,
1054
  # 4) Cálculo do Campo de Arbítrio e Intervalo de Confiança de 80%, agregando as colunas ao 'df_aval_original'
1055
  # 5) Cálculo da 'Precisão' e criação de coluna no 'df_aval_original'
1056
  # -----------------------------------------------------------------------------------------------------------------#
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1057
  # alterar escalas (para rodar o modelo)
1058
  aplicar_operacao(df_aval, scv_1, 0)
1059
  aplicar_operacao(df_aval, scv_2, 1)
@@ -1377,8 +1486,34 @@ O mercado imobiliário não se vincula diretamente a índices econômicos e não
1377
  else:
1378
  p.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
1379
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1380
  doc.save('relatorio_avaliacao.doc')
1381
-
1382
 
1383
  # OUTPUTS
1384
  # -----------------------------------------------------------------------------------------------------------------#
@@ -1387,7 +1522,7 @@ O mercado imobiliário não se vincula diretamente a índices econômicos e não
1387
  # -----------------------------------------------------------------------------------------------------------------#
1388
 
1389
  return (
1390
- df_original,
1391
  string_colunas,
1392
  resultados_gerais,
1393
  equacao_modelo,
@@ -1474,9 +1609,10 @@ with gr.Blocks(theme=gr.themes.Monochrome(primary_hue="yellow", secondary_hue="y
1474
  inp_1 = gr.File(label="Upload planilha", type="filepath", scale=1, height=100)
1475
  #inp_1 = gr.File(label="Upload planilha", type="filepath", scale=2, height=100)
1476
  with gr.Row():
 
1477
  inp_2 = gr.Textbox(label="Nome do modelo", scale=1, value='nome modelo')
1478
- inp_3 = gr.Dropdown(['Valor total', 'Valor unitário',], label="VARIÁVEL DEPENDENTE", value='Valor unitário')
1479
- inp_4 = gr.Dropdown(['y', 'lny', '1/y', 'y²'], label="Escala", value='y')
1480
  button_1 = gr.Button("Gerar")
1481
  with gr.Group():
1482
  with gr.Row():
@@ -1549,27 +1685,27 @@ with gr.Blocks(theme=gr.themes.Monochrome(primary_hue="yellow", secondary_hue="y
1549
  button_3 = gr.Button("Gerar")
1550
 
1551
  with gr.Column():
1552
- out_1 = gr.Dataframe(label="Planilha de dados original", height=300)
1553
  out_2 = gr.Textbox(label="Colunas", scale=1)
1554
- out_3 = gr.Textbox(label="Resultados Gerais do Modelo", scale=1)
1555
  out_4 = gr.Textbox(label="Equação do Modelo")
1556
- out_5 = gr.Dataframe(label="Resultados por variável")
1557
- out_6 = gr.Dataframe(label="Planilha Regressão Linear (Variáveis e escalas escolhidas, sem outliers com o comparativo Obs x Calc)", height=300)
1558
  with gr.Group():
1559
  with gr.Row():
1560
  out_7 = gr.Textbox(label="Dados com resíduos padronizados > 2")
1561
  out_8 = gr.Textbox(label="Pontos Influenciantes (Distância de Cook > 1)")
1562
- out_9 = gr.Dataframe(label="Resíduos Padronizados > 2", height=300)
1563
- out_10 = gr.Dataframe(label="Outliers (retirados)", height=300)
1564
- #out_11 = gr.Dataframe(label="Valores Ajustados x Preços Observados", height=300)
1565
- out_12 = gr.Dataframe(label="Máximos e Mínimos por variável", height=300)
1566
- button_4 = gr.Button("Gerar")
1567
  out_13 = gr.Image(show_label=False)
1568
  out_13a = gr.Image(show_label=False)
1569
  out_13b = gr.Image(show_label=False)
1570
  out_13c = gr.Image(show_label=False)
1571
  out_13d = gr.Image(show_label=False)
1572
- out_14 = gr.Dataframe(label="Avaliação", height=300)
1573
  out_15 = gr.components.File(label="Resultado da Avaliação")
1574
  out_16 = gr.components.File(label="Exportar Modelo")
1575
  with gr.Group():
@@ -1599,7 +1735,7 @@ with gr.Blocks(theme=gr.themes.Monochrome(primary_hue="yellow", secondary_hue="y
1599
 
1600
 
1601
  inputs = [
1602
- inp_1, inp_2, inp_3, inp_4, inp_5, inp_6, inp_7, inp_8, inp_9, inp_10, inp_11,
1603
  inp_12, inp_13, inp_14, inp_15, inp_16, inp_17, inp_18, inp_19, inp_20, inp_21,
1604
  lau_1, lau_2, lau_3,
1605
  inf_1, inf_2, inf_3, inf_4, inf_5,
@@ -1609,7 +1745,8 @@ with gr.Blocks(theme=gr.themes.Monochrome(primary_hue="yellow", secondary_hue="y
1609
  ]
1610
 
1611
  outputs = [
1612
- out_1, out_2, out_3, out_4, out_5, out_6, out_7, out_8, out_9, out_10,
 
1613
  out_12, out_13,out_13a,out_13b,out_13c,out_13d, out_14, out_15, out_16, out_17, out_18, out_19, out_20,
1614
  out_21, out_22, out_23, out_24, out_25, out_26,
1615
  out_27, out_28, out_29, out_30, out_31, out_32,
@@ -1619,7 +1756,7 @@ with gr.Blocks(theme=gr.themes.Monochrome(primary_hue="yellow", secondary_hue="y
1619
  button_1.click(gera_model, inputs=inputs, outputs=outputs)
1620
  button_2.click(gera_model, inputs=inputs, outputs=outputs)
1621
  button_3.click(gera_model, inputs=inputs, outputs=outputs)
1622
- button_3.click(gera_model, inputs=inputs, outputs=outputs)
1623
 
1624
  if __name__ == "__main__":
1625
  interface.launch(debug=True)
 
24
  from docx.shared import Inches
25
  from num2words import num2words
26
  from datetime import datetime
27
+ %matplotlib inline
28
 
29
  #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
30
  # 2) FUNÇÕES ACESSÓRIAS
 
140
  #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
141
 
142
  # função para a regressão linear
143
+ def gera_model(planilha, model, name_model, v_d, scv_d,
144
  scv_1, scv_2, scv_3, scv_4,
145
  scv_5, scv_6, scv_7, scv_8,
146
  scv_9, scv_10, scv_11, scv_12,
 
151
  lograd="-", munic="-", tipo_imo="-", solic="-", finalidade="-", objetivo="-", press="-",
152
  infra="Água Potável", serv="Coleta de Lixo", uso="Residencial", pad_reg="-", tipo_via="-", obs_gerais="-",
153
  per="Sem destaque", ofe="Sem destaque", liq="Sem destaque", dia="-"):
154
+
155
+ #ooooooooooooooooooooooooooooooooooooooooooooooooooo CARREGAR oooooooooooooooooooooooooooooooooooooooooooooooooooo#
156
 
157
+ # Criação das listas para as colunas
158
+ svc_list = ['scv_d', 'scv_1', 'scv_2', 'scv_3', 'scv_4', 'scv_5', 'scv_6', 'scv_7',
159
+ 'scv_8', 'scv_9', 'scv_10', 'scv_11', 'scv_12', 'scv_13', 'scv_14', 'scv_15', 'scv_16']
160
+
161
+ var_dep = [v_d, '-', '-', '-', '-', '-', '-', '-',
162
+ '-', '-', '-', '-', '-', '-', '-', '-', '-']
163
+
164
+ escalas_list = [scv_d, scv_1, scv_2, scv_3, scv_4, scv_5, scv_6, scv_7,
165
+ scv_8, scv_9, scv_10, scv_11, scv_12, scv_13, scv_14, scv_15, scv_16]
166
+
167
+
168
+ # Criando o DataFrame com as colunas 'svc' e 'escalas'
169
+ df_scv = pd.DataFrame({
170
+ 'svc': svc_list,
171
+ 'escalas': escalas_list,
172
+ 'var_dep': var_dep
173
+ })
174
+
175
+ #ooooooooooooooooooooooooooooooooooooooooooooooooooo CARREGAR oooooooooooooooooooooooooooooooooooooooooooooooooooo#
176
+
177
  # IMPORTRAÇÃO DA PLANILHA
178
  # Carregando os dados
179
  df_dados = pd.read_excel(planilha.name)
 
188
 
189
  df_original = df_dados.copy() ################################### OUTPUT ##########################################
190
 
191
+
192
  # -----------------------------------------------------------------------------------------------------------------#
193
  # Comentário 1:
194
  # Criação do "df_avalia" para extrair o "df_limites_var" e o "df_dados_utilizados" por meio da seleção de variáveis
 
196
  # -----------------------------------------------------------------------------------------------------------------#
197
 
198
  # Dataframe para criação de uma planilha de modelo para avaliação
199
+ df_avalia = pd.DataFrame()
200
+
201
+ #ooooooooooooooooooooooooooooooooooooooooooooooooooo CARREGAR oooooooooooooooooooooooooooooooooooooooooooooooooooo#
202
+
203
+ if model == "Carregar":
204
+ # Carrega o arquivo Excel da planilha fornecida (ignorando o cabeçalho na primeira linha)
205
+ df_escalas = pd.read_excel(planilha.name, sheet_name="Escalas")
206
+
207
+ # Preenchendo as variáveis com base nos valores da planilha, ajustando para o cabeçalho
208
+ v_d = df_escalas.iloc[0, 2]
209
+
210
+ scv_d = df_escalas.iloc[0, 1]
211
+ scv_1 = df_escalas.iloc[1, 1]
212
+ scv_2 = df_escalas.iloc[2, 1]
213
+ scv_3 = df_escalas.iloc[3, 1]
214
+ scv_4 = df_escalas.iloc[4, 1]
215
+ scv_5 = df_escalas.iloc[5, 1]
216
+ scv_6 = df_escalas.iloc[6, 1]
217
+ scv_7 = df_escalas.iloc[7, 1]
218
+ scv_8 = df_escalas.iloc[8, 1]
219
+ scv_9 = df_escalas.iloc[9, 1]
220
+ scv_10 = df_escalas.iloc[10, 1]
221
+ scv_11 = df_escalas.iloc[11, 1]
222
+ scv_12 = df_escalas.iloc[12, 1]
223
+ scv_13 = df_escalas.iloc[13, 1]
224
+ scv_14 = df_escalas.iloc[14, 1]
225
+ scv_15 = df_escalas.iloc[15, 1]
226
+ scv_16 = df_escalas.iloc[16, 1]
227
+
228
+ #ooooooooooooooooooooooooooooooooooooooooooooooooooo CARREGAR oooooooooooooooooooooooooooooooooooooooooooooooooooo#
229
+
230
  # Iterar sobre as colunas do DataFrame df_filtrado
231
  for i, col in enumerate(df_dados.columns):
232
  # Verificar se a coluna atual deve ser adicionada com base na condição e se ela existe no DataFrame
 
294
  # Transformando a lista em uma string separada por vírgula
295
  string_colunas = "\n".join(colunas)################################### OUTPUT ##########################################
296
 
 
297
 
298
  # CONVERSÃO DE ESCALAS
299
  # -----------------------------------------------------------------------------------------------------------------#
 
367
  # 6) Contagem final da quantidade de linhas do "df_outliers"
368
  # -----------------------------------------------------------------------------------------------------------------#
369
 
370
+ if model == "Carregar":
371
+ # Carrega o arquivo Excel da planilha fornecida
372
+ df_nao_utilizados = pd.read_excel(planilha.name, sheet_name="Dados Não utilizados")
373
+
374
+ # Converte o DataFrame da aba "Dados Não Utilizados" para uma lista de valores da primeira coluna
375
+ out = df_nao_utilizados.iloc[:, 0].values.tolist() # Apenas a primeira coluna
376
+
377
+ # Transformar a lista em uma string separada por vírgulas
378
+ concatenated_data = ",".join([str(item) for item in out if pd.notna(item)])
379
+
380
+ # Convertendo a entrada concatenada em uma lista de números inteiros
381
+ dados_out = []
382
+ for num in concatenated_data.split(","):
383
+ num = num.strip()
384
+ if num: # Verifica se não é uma string vazia
385
+ try:
386
+ # Tenta converter para inteiro
387
+ dados_out.append(int(float(num)))
388
+ except ValueError:
389
+ pass # Ignora valores que não podem ser convertidos
390
+ else:
391
+ # Convertendo a entrada manual em uma lista de inteiros
392
+ dados_out = [int(num.strip()) for num in out.split(",") if num.strip()]
393
 
394
  # Filtrando o DataFrame para obter os outliers
395
  df_outliers = df_dados[df_dados.iloc[:, 0].isin(dados_out)]
396
+
397
+
398
 
399
  # Removendo os outliers do DataFrame df_limites_var para calcular os valores mínimos e máximos de cada variável
400
  df_limites_var = df_limites_var[~df_dados.iloc[:, 0].isin(dados_out)]
 
667
 
668
  # Teste Kolmogorov-Smirnov (KS)
669
  ks_test = sm.stats.diagnostic.kstest_normal(residuos)
670
+ ks_test_formatted = tuple(f"{val:.4f}" for val in ks_test)
671
+
672
  # Calculando o teste de Jarque-Bera para os resíduos
673
  jarque_bera_test, p_value, skewness, kurtosis = jarque_bera(residuos)
674
  # Formatando os resultados com 4 casas decimais
 
744
  Desvio Padrão: {desvio_padrao_residuos}
745
  Estatística F: {estatistica_F} / Nível de Significância Modelo: {nivel_significancia}
746
  R²: {r_squared} / R² ajustado: {r_squared_adjusted} / Correlação: {coef_correlacao}
747
+ Número de observações: {num_observacoes} - Não utilizados: {num_outliers}
 
748
  Número de variáveis utilizadas: {n_vars}
749
  Importância Variáveis em % (ExtraTreesRegressor): {feat_importances_list}
750
  ------------------------------------------------------
751
  Testes de normalidade:
752
+ 1) Comparação (curva normal) - Percentuais atingidos: {perc_resid}
753
  Ideal 68% - aceitável de 64% a 75%
754
  Ideal 90% - aceitável de 88% a 95%
755
  Ideal 95% - aceitável de 95% a 100%
756
+ 2) Teste de Jarque-Bera:
 
 
 
757
  - Estatística do teste: {jarque_bera_test}
758
  - Valor-p: {p_value}
759
  - Assimetria (Skewness): {skewness}
 
931
  'Número de observações': [num_observacoes],
932
  'Número de dados não utilizados': [num_outliers],
933
  'Número de variáveis utilizadas': [n_vars],
934
+ '1) Comparação (curva normal 68% 90% 95%)': [perc_resid],
935
+ '2) Estatística do teste': [jarque_bera_test],
 
936
  '- Valor-p': [p_value],
937
  '- Assimetria (Skewness)': [skewness],
938
  '- Curtose (Kurtosis)': [kurtosis],
 
946
  resultados = resultados.T.reset_index()
947
  # Defina os nomes das colunas do novo DataFrame
948
  resultados.columns = ['Resultado', 'Valor']
949
+ #resultados.to_excel(writer, sheet_name='Result_gerais', index=False)
950
 
951
  # Salve o DataFrame 'RESULTADOS VARS' na planilha
952
+ #resultados_vars.to_excel(writer, sheet_name='Result_vars', index=False)
953
+
954
+ # Combine 'Result_gerais' e 'Result_vars' na aba 'Resultados_estatísticos'
955
+ # Adicione uma coluna vazia entre os DataFrames
956
+ resultados_vars_shifted = pd.concat([pd.DataFrame(columns=['', '']), resultados_vars], axis=1)
957
+
958
+ # Concatenar os dois DataFrames lado a lado
959
+ resultados_estatisticos = pd.concat([resultados, resultados_vars_shifted], axis=1)
960
+
961
+ # Escrever o DataFrame combinado na aba 'Resultados_estatísticos'
962
+ resultados_estatisticos.to_excel(writer, sheet_name='Resultados_estatísticos', index=False)
963
 
964
  # Salve o DataFrame 'DADOS PARA REGRESSÃO' na planilha
965
+ #df_exporta_modelo.to_excel(writer, sheet_name='Model', index=False)
966
 
967
  # Salve o DataFrame 'PLANILHA MODELO PARA AVALIAÇÃO' na planilha 'relatório'
968
  df_avalia_copy = df_avalia.copy()
969
  df_avalia_copy = df_avalia_copy.iloc[0:0]
970
  df_avalia_copy.to_excel(writer, sheet_name='avaliando', index=False)
971
 
972
+ # Acrescente o DataFrame 'df_scv' (svc e escalas) na aba 'Escalas'
973
+ df_scv.to_excel(writer, sheet_name='Escalas', index=False)
974
 
975
+
976
  # PONTOS INFLUENCIANTES
977
  # -----------------------------------------------------------------------------------------------------------------#
978
  # Comentário 16:
 
1002
  # -----------------------------------------------------------------------------------------------------------------#
1003
 
1004
  # Gráfico dos resíduos padronizados
1005
+ fig, ax1 = plt.subplots(figsize=(8, 4))
1006
  ax1.scatter(df_final['Valores Ajustados'], erro_padronizado, color='orange', alpha=0.6)
1007
  ax1.axhline(y=0, color='black', linestyle='--', linewidth=1) # Linha zero
1008
  ax1.axhline(y=2, color='red', linestyle='-', linewidth=1) # Linhas vermelhas em ±2
 
1019
  plt.close(fig) # Fecha a figura para que o próximo gráfico seja independente
1020
 
1021
  # Histograma dos resíduos padronizados
1022
+ fig, ax2 = plt.subplots(figsize=(8, 4))
1023
  sns.histplot(erro_padronizado, kde=True, color='orange', alpha=0.6, ax=ax2)
1024
  ax2.set_title('Histograma dos Resíduos Padronizados')
1025
  ax2.set_xlabel('Resíduos Padronizados')
 
1029
  plt.close(fig)
1030
 
1031
  # Gráfico da distância de Cook
1032
+ fig, ax3 = plt.subplots(figsize=(8, 4))
1033
  ax3.plot(distancia_cook, marker='o', linestyle='None', color='orange')
1034
  ax3.axhline(y=1, color='red', linestyle='--', linewidth=1)
1035
  ax3.set_title('Gráfico da Distância de Cook')
 
1043
  plt.close(fig)
1044
 
1045
  # Gráfico Valores Ajustados vs Preços Observados
1046
+ fig, ax4 = plt.subplots(figsize=(8, 4))
1047
  x_values = df_correl_grafico['Observados']
1048
  y_values = df_correl_grafico['Calculados']
1049
  slope, intercept = np.polyfit(x_values, y_values, 1)
 
1057
  plt.close(fig)
1058
 
1059
  # Matriz de correlações
1060
+ fig, ax6 = plt.subplots(figsize=(8, 4))
1061
  ax6.set_title('Matriz de Correlação')
1062
  palette = sns.light_palette("orange", as_cmap=True)
1063
  sns.heatmap(correlation_matrix, annot=True, cmap=palette, linewidths=0.3, ax=ax6, annot_kws={"size": 6},
 
1070
  # AVALIAÇÃO
1071
  # -----------------------------------------------------------------------------------------------------------------#
1072
  # Comentário 18:
1073
+ # 1) No momento de gerar modelo é possível, por meio da aba "avaliando" da planilha imputada, fazer uma avalaição
1074
  # 2) Criadas duas cópias do "df_aval".
1075
  # -----------------------------------------------------------------------------------------------------------------#
1076
 
 
1083
  df_aval_final = df_aval.copy()
1084
  df_aval_original = pd.DataFrame()
1085
 
1086
+
 
1087
  # -----------------------------------------------------------------------------------------------------------------#
1088
  # Comentário 19:
1089
  # 1) O 'df_aval_final' serve como agregador das informações, mantendo a forma original para posterior apresentação
 
1135
  # 4) Cálculo do Campo de Arbítrio e Intervalo de Confiança de 80%, agregando as colunas ao 'df_aval_original'
1136
  # 5) Cálculo da 'Precisão' e criação de coluna no 'df_aval_original'
1137
  # -----------------------------------------------------------------------------------------------------------------#
1138
+
1139
+ if model == "Carregar":
1140
+ # Carrega o arquivo Excel da planilha fornecida (ignorando o cabeçalho na primeira linha)
1141
+ df_escalas = pd.read_excel(planilha.name, sheet_name="Escalas")
1142
+
1143
+ # Preenchendo as variáveis com base nos valores da planilha, ajustando para o cabeçalho
1144
+ v_d = df_escalas.iloc[0, 2]
1145
+
1146
+ scv_d = df_escalas.iloc[0, 1]
1147
+ scv_1 = df_escalas.iloc[1, 1]
1148
+ scv_2 = df_escalas.iloc[2, 1]
1149
+ scv_3 = df_escalas.iloc[3, 1]
1150
+ scv_4 = df_escalas.iloc[4, 1]
1151
+ scv_5 = df_escalas.iloc[5, 1]
1152
+ scv_6 = df_escalas.iloc[6, 1]
1153
+ scv_7 = df_escalas.iloc[7, 1]
1154
+ scv_8 = df_escalas.iloc[8, 1]
1155
+ scv_9 = df_escalas.iloc[9, 1]
1156
+ scv_10 = df_escalas.iloc[10, 1]
1157
+ scv_11 = df_escalas.iloc[11, 1]
1158
+ scv_12 = df_escalas.iloc[12, 1]
1159
+ scv_13 = df_escalas.iloc[13, 1]
1160
+ scv_14 = df_escalas.iloc[14, 1]
1161
+ scv_15 = df_escalas.iloc[15, 1]
1162
+ scv_16 = df_escalas.iloc[16, 1]
1163
+
1164
+
1165
+
1166
  # alterar escalas (para rodar o modelo)
1167
  aplicar_operacao(df_aval, scv_1, 0)
1168
  aplicar_operacao(df_aval, scv_2, 1)
 
1486
  else:
1487
  p.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
1488
 
1489
+
1490
+ # Adicionando a seção com os dados utilizados como tabela
1491
+ doc.add_heading("Dados Utilizados", level=2)
1492
+
1493
+ # Cria uma tabela no Word com o DataFrame df_dados_utilizados
1494
+ table = doc.add_table(rows=1, cols=len(df_dados_utilizados.columns))
1495
+ hdr_cells = table.rows[0].cells
1496
+
1497
+ # Preenche as colunas da tabela
1498
+ for i, column_name in enumerate(df_dados_utilizados.columns):
1499
+ hdr_cells[i].text = str(column_name)
1500
+ # Ajustando a fonte do cabeçalho
1501
+ paragraph = hdr_cells[i].paragraphs[0]
1502
+ run = paragraph.runs[0]
1503
+ run.font.size = Pt(5) # Define o tamanho da fonte como 5
1504
+
1505
+ # Preenche as linhas da tabela
1506
+ for index, row in df_dados_utilizados.iterrows():
1507
+ row_cells = table.add_row().cells
1508
+ for i, value in enumerate(row):
1509
+ row_cells[i].text = str(value)
1510
+ # Ajustando a fonte das células de dados
1511
+ paragraph = row_cells[i].paragraphs[0]
1512
+ run = paragraph.runs[0]
1513
+ run.font.size = Pt(5) # Define o tamanho da fonte como 5
1514
+
1515
+ # Salva o documento
1516
  doc.save('relatorio_avaliacao.doc')
 
1517
 
1518
  # OUTPUTS
1519
  # -----------------------------------------------------------------------------------------------------------------#
 
1522
  # -----------------------------------------------------------------------------------------------------------------#
1523
 
1524
  return (
1525
+ #df_original,
1526
  string_colunas,
1527
  resultados_gerais,
1528
  equacao_modelo,
 
1609
  inp_1 = gr.File(label="Upload planilha", type="filepath", scale=1, height=100)
1610
  #inp_1 = gr.File(label="Upload planilha", type="filepath", scale=2, height=100)
1611
  with gr.Row():
1612
+ model = gr.Dropdown(['Gerar', 'Carregar',], label="Modelo", value='Gerar', scale=0.5)
1613
  inp_2 = gr.Textbox(label="Nome do modelo", scale=1, value='nome modelo')
1614
+ inp_3 = gr.Dropdown(['Valor total', 'Valor unitário',], label="Var Dependente", value='Valor unitário')
1615
+ inp_4 = gr.Dropdown(['y', 'lny', '1/y', 'y²'], label="Escala", value='y', scale=0.5)
1616
  button_1 = gr.Button("Gerar")
1617
  with gr.Group():
1618
  with gr.Row():
 
1685
  button_3 = gr.Button("Gerar")
1686
 
1687
  with gr.Column():
1688
+ #out_1 = gr.Dataframe(label="Planilha de dados original", height=300)
1689
  out_2 = gr.Textbox(label="Colunas", scale=1)
1690
+ out_3 = gr.Textbox(label="Resultados Gerais do Modelo", scale=1, lines=26) # Define o número de linhas para aumentar a altura
1691
  out_4 = gr.Textbox(label="Equação do Modelo")
1692
+ out_5 = gr.Dataframe(label="Resultados por variável", height=250)
1693
+ out_6 = gr.Dataframe(label="Planilha Regressão Linear (Variáveis e escalas escolhidas, sem outliers com o comparativo Obs x Calc)", height=250)
1694
  with gr.Group():
1695
  with gr.Row():
1696
  out_7 = gr.Textbox(label="Dados com resíduos padronizados > 2")
1697
  out_8 = gr.Textbox(label="Pontos Influenciantes (Distância de Cook > 1)")
1698
+ out_9 = gr.Dataframe(label="Resíduos Padronizados > 2", height=250)
1699
+ out_10 = gr.Dataframe(label="Outliers (retirados)", height=250)
1700
+ #out_11 = gr.Dataframe(label="Valores Ajustados x Preços Observados", height=250)
1701
+ out_12 = gr.Dataframe(label="Máximos e Mínimos por variável", height=250)
1702
+ #button_4 = gr.Button("Gerar")
1703
  out_13 = gr.Image(show_label=False)
1704
  out_13a = gr.Image(show_label=False)
1705
  out_13b = gr.Image(show_label=False)
1706
  out_13c = gr.Image(show_label=False)
1707
  out_13d = gr.Image(show_label=False)
1708
+ out_14 = gr.Dataframe(label="Avaliação", height=250)
1709
  out_15 = gr.components.File(label="Resultado da Avaliação")
1710
  out_16 = gr.components.File(label="Exportar Modelo")
1711
  with gr.Group():
 
1735
 
1736
 
1737
  inputs = [
1738
+ inp_1, model, inp_2, inp_3, inp_4, inp_5, inp_6, inp_7, inp_8, inp_9, inp_10, inp_11,
1739
  inp_12, inp_13, inp_14, inp_15, inp_16, inp_17, inp_18, inp_19, inp_20, inp_21,
1740
  lau_1, lau_2, lau_3,
1741
  inf_1, inf_2, inf_3, inf_4, inf_5,
 
1745
  ]
1746
 
1747
  outputs = [
1748
+ #out_1,
1749
+ out_2, out_3, out_4, out_5, out_6, out_7, out_8, out_9, out_10,
1750
  out_12, out_13,out_13a,out_13b,out_13c,out_13d, out_14, out_15, out_16, out_17, out_18, out_19, out_20,
1751
  out_21, out_22, out_23, out_24, out_25, out_26,
1752
  out_27, out_28, out_29, out_30, out_31, out_32,
 
1756
  button_1.click(gera_model, inputs=inputs, outputs=outputs)
1757
  button_2.click(gera_model, inputs=inputs, outputs=outputs)
1758
  button_3.click(gera_model, inputs=inputs, outputs=outputs)
1759
+ #button_4.click(gera_model, inputs=inputs, outputs=outputs)
1760
 
1761
  if __name__ == "__main__":
1762
  interface.launch(debug=True)