Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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 |
-
|
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 |
-
|
320 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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(
|
|
|
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 |
-
|
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%
|
864 |
-
'2)
|
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,
|
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,
|
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,
|
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,
|
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,
|
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 é
|
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="
|
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=
|
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=
|
1563 |
-
out_10 = gr.Dataframe(label="Outliers (retirados)", height=
|
1564 |
-
#out_11 = gr.Dataframe(label="Valores Ajustados x Preços Observados", height=
|
1565 |
-
out_12 = gr.Dataframe(label="Máximos e Mínimos por variável", height=
|
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=
|
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,
|
|
|
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 |
-
|
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)
|