DavidSB commited on
Commit
5f8e924
1 Parent(s): 2b019ba

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +1253 -0
app.py ADDED
@@ -0,0 +1,1253 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ import gradio as gr
3
+ from gradio import components
4
+ from gradio import Interface
5
+ import numpy as np
6
+ import statsmodels
7
+ import statsmodels.api as sm
8
+ from statsmodels.stats.stattools import jarque_bera
9
+ import plotly.express as px
10
+ import plotly.graph_objects as go
11
+ import matplotlib.pyplot as plt
12
+ import seaborn as sns
13
+ import sklearn
14
+ from sklearn.preprocessing import MinMaxScaler
15
+ from sklearn.ensemble import ExtraTreesRegressor
16
+ import xlsxwriter
17
+ #%matplotlib inline
18
+
19
+ #--------------------------------------------------FUNÇÕES ASSESSÓRIAS--------------------------------------------------------#
20
+
21
+ # função para conversão da escala das variáveis:
22
+ def aplicar_operacao(df, scv, col_index):
23
+ if scv == 'x':
24
+ pass
25
+ elif scv == 'lnx':
26
+ df.iloc[:, col_index] = round(np.log(df.iloc[:, col_index]), 8)
27
+ elif scv == '1/x':
28
+ df.iloc[:, col_index] = round(1 / df.iloc[:, col_index], 8)
29
+ elif scv == 'x²':
30
+ df.iloc[:, col_index] = round(df.iloc[:, col_index] ** 2, 8)
31
+ elif scv == 'y':
32
+ pass
33
+ elif scv == 'lny':
34
+ df.iloc[:, col_index] = round(np.log(df.iloc[:, col_index]), 8)
35
+ elif scv == '1/y':
36
+ df.iloc[:, col_index] = round(1 / df.iloc[:, col_index], 8)
37
+ elif scv == 'y²':
38
+ df.iloc[:, col_index] = round(df.iloc[:, col_index] ** 2, 8)
39
+
40
+ # função para renomear as colunas com as escalas:
41
+ def renomeia_colunas(df_dados, posicao_coluna, scv):
42
+ if posicao_coluna < len(df_dados.columns):
43
+ old_column_name = df_dados.columns[posicao_coluna]
44
+
45
+ new_column_name = old_column_name # Inicializa com o mesmo nome da coluna original
46
+ if scv == 'x':
47
+ pass
48
+ elif scv == 'lnx':
49
+ new_column_name = 'ln(' + old_column_name + ')'
50
+ elif scv == '1/x':
51
+ new_column_name = '1/(' + old_column_name + ')'
52
+ elif scv == 'x²':
53
+ new_column_name = '(' + old_column_name + ')²'
54
+ if scv == 'y':
55
+ pass
56
+ elif scv == 'lny':
57
+ new_column_name = 'ln(' + old_column_name + ')'
58
+ elif scv == '1/y':
59
+ new_column_name = '1/(' + old_column_name + ')'
60
+ elif scv == 'y²':
61
+ new_column_name = '(' + old_column_name + ')²'
62
+
63
+ df_dados.rename(columns={old_column_name: new_column_name}, inplace=True)
64
+
65
+ # função para plotagem dos gráficos de dispersão:
66
+ def criar_grafico_dispersao(df, x_column, y_column, hover_name, trendline_color):
67
+ # Calculando a correlação entre as variáveis x e y
68
+ correlacao = df[x_column].corr(df[y_column])
69
+
70
+ # Criando o gráfico de dispersão com a linha de tendência
71
+ fig = px.scatter(df, x=x_column, y=y_column, hover_name=hover_name, trendline="ols", height=300)
72
+ # Definindo a cor de fundo e do papel
73
+ fig.update_layout(
74
+ plot_bgcolor='rgb(240, 240, 240)',
75
+ paper_bgcolor='rgb(240, 240, 240)',
76
+
77
+ )
78
+ # Definindo a cor dos pontos
79
+ fig.update_traces(marker=dict(color=trendline_color, size=5))
80
+ # Definindo a cor da linha de tendência
81
+ fig.update_traces(line=dict(color="black"))
82
+ # Adicionando o texto com a correlação na linha de tendência
83
+ fig.add_annotation(
84
+ x=df[x_column].max(),
85
+ y=df[y_column].max(),
86
+ text=f"Correlação: {correlacao:.2f}",
87
+ showarrow=False,
88
+ font=dict(color="black")
89
+ )
90
+ return fig
91
+
92
+ #--------------------------------------------FUNÇÃO PRINCIPAL DE GERAÇÃO DE MODELOS--------------------------------------------#
93
+
94
+ # função para a regressão linear
95
+ def gera_model(planilha, name_model, v_d, scv_d,
96
+ v_1, scv_1, v_2, scv_2,
97
+ v_3, scv_3, v_4, scv_4,
98
+ v_5, scv_5, v_6, scv_6,
99
+ v_7, scv_7, v_8, scv_8,
100
+ v_9, scv_9, v_10, scv_10,
101
+ v_11, scv_11, v_12, scv_12,
102
+ v_13, scv_13, v_14, scv_14,
103
+ v_15, scv_15, v_16, scv_16,
104
+ out):
105
+
106
+ # ---------------------------------Planilha------------------------------#
107
+
108
+ # Carregando os dados
109
+ df_dados = pd.read_excel(planilha.name)
110
+ df_dados = df_dados.round(4)
111
+
112
+ # Convertendo os cabeçalhos para strings
113
+ df_dados.columns = [str(col) for col in df_dados.columns]
114
+
115
+ df_dados[df_dados.columns[1]] = df_dados[df_dados.columns[1]].astype(float)
116
+ df_dados[df_dados.columns[2]] = df_dados[df_dados.columns[2]].astype(float)
117
+ df_original = df_dados.copy()
118
+
119
+ # Dataframe para criação de uma planilha de modelo para avaliação
120
+ df_avalia = pd.DataFrame()
121
+ # Iterar sobre as colunas do DataFrame df_filtrado
122
+ for i, col in enumerate(df_dados.columns):
123
+ # Verificar se a coluna atual deve ser adicionada com base na condição e se ela existe no DataFrame
124
+ if (i == 3 and v_1) or \
125
+ (i == 4 and v_2) or \
126
+ (i == 5 and v_3) or \
127
+ (i == 6 and v_4) or \
128
+ (i == 7 and v_5) or \
129
+ (i == 8 and v_6) or \
130
+ (i == 9 and v_7) or \
131
+ (i == 10 and v_8) or \
132
+ (i == 11 and v_9) or \
133
+ (i == 12 and v_10) or \
134
+ (i == 13 and v_11) or \
135
+ (i == 14 and v_12) or \
136
+ (i == 15 and v_13) or \
137
+ (i == 16 and v_14) or \
138
+ (i == 17 and v_15) or \
139
+ (i == 18 and v_16):
140
+ if i < len(df_dados.columns):
141
+ df_avalia[col] = df_dados.iloc[:, i]
142
+
143
+ # Adicionar a coluna de índice 0 de df_dados em df_avalia
144
+ df_limites_var = df_avalia
145
+ df_limites_var[df_dados.columns[0]] = df_dados.iloc[:, 0]
146
+
147
+ # ---------------------------Nome das variáveis--------------------------#
148
+
149
+ # Obtenha os nomes das colunas, excluindo a primeira ou a segunda
150
+
151
+ if v_d == "Valor total":
152
+ nomes_colunas = df_original.drop(columns=[df_original.columns[0], df_original.columns[2]]).columns
153
+ else:
154
+ nomes_colunas = df_original.drop(columns=[df_original.columns[0], df_original.columns[1]]).columns
155
+
156
+ # Crie a lista de strings com os cabeçalhos formatados
157
+ colunas = [f'Var dependente = {nomes_colunas[0]}'] + [f'Var {i} = {coluna}' for i, coluna in enumerate(nomes_colunas[1:], start=1)]
158
+ # Transformando a lista em uma string separada por vírgula
159
+ string_colunas = ", ".join(colunas)
160
+
161
+ #-----------------------------------Escalas------------------------------#
162
+ # dados
163
+ if v_d == "Valor total":
164
+ aplicar_operacao(df_dados, scv_d, 1)
165
+ else:
166
+ aplicar_operacao(df_dados, scv_d, 2)
167
+ aplicar_operacao(df_dados, scv_1, 3)
168
+ aplicar_operacao(df_dados, scv_2, 4)
169
+ aplicar_operacao(df_dados, scv_3, 5)
170
+ aplicar_operacao(df_dados, scv_4, 6)
171
+ aplicar_operacao(df_dados, scv_5, 7)
172
+ aplicar_operacao(df_dados, scv_6, 8)
173
+ aplicar_operacao(df_dados, scv_7, 9)
174
+ aplicar_operacao(df_dados, scv_8, 10)
175
+ aplicar_operacao(df_dados, scv_9, 11)
176
+ aplicar_operacao(df_dados, scv_10, 12)
177
+ aplicar_operacao(df_dados, scv_11, 13)
178
+ aplicar_operacao(df_dados, scv_12, 14)
179
+ aplicar_operacao(df_dados, scv_13, 15)
180
+ aplicar_operacao(df_dados, scv_14, 16)
181
+ aplicar_operacao(df_dados, scv_15, 17)
182
+ aplicar_operacao(df_dados, scv_16, 18)
183
+
184
+ #----------------------------Renomear colunas----------------------------#
185
+
186
+ #dados
187
+ if v_d == "Valor total":
188
+ renomeia_colunas(df_dados, 1, scv_d)
189
+ else:
190
+ renomeia_colunas(df_dados, 2, scv_d)
191
+ renomeia_colunas(df_dados, 3, scv_1)
192
+ renomeia_colunas(df_dados, 4, scv_2)
193
+ renomeia_colunas(df_dados, 5, scv_3)
194
+ renomeia_colunas(df_dados, 6, scv_4)
195
+ renomeia_colunas(df_dados, 7, scv_5)
196
+ renomeia_colunas(df_dados, 8, scv_6)
197
+ renomeia_colunas(df_dados, 9, scv_7)
198
+ renomeia_colunas(df_dados, 10, scv_8)
199
+ renomeia_colunas(df_dados, 11, scv_9)
200
+ renomeia_colunas(df_dados, 12, scv_10)
201
+ renomeia_colunas(df_dados, 13, scv_11)
202
+ renomeia_colunas(df_dados, 14, scv_12)
203
+ renomeia_colunas(df_dados, 15, scv_13)
204
+ renomeia_colunas(df_dados, 16, scv_14)
205
+ renomeia_colunas(df_dados, 17, scv_15)
206
+ renomeia_colunas(df_dados, 18, scv_16)
207
+
208
+ #----------------Manipulação das linhas (dados / outiliers)----------------#
209
+
210
+ # Convertendo a entrada em uma lista de inteiros
211
+ dados_out = [int(num.strip()) for num in out.split(",") if num.strip()]
212
+
213
+ # Filtrando o DataFrame para obter os outliers
214
+ df_outliers = df_dados[df_dados.iloc[:, 0].isin(dados_out)]
215
+
216
+ # Removendo os outliers do DataFrame df_limites_var para calcular os valores mínimos e máximos de cada variável
217
+ df_limites_var = df_limites_var[~df_limites_var.iloc[:, 0].isin(dados_out)]
218
+ # Selecionar colunas excluindo a primeira coluna (índice 0)
219
+ limites = df_limites_var.columns[1:]
220
+ # Calcular o valor mínimo e máximo para cada coluna selecionada
221
+ minimos = df_limites_var[limites].min()
222
+ maximos = df_limites_var[limites].max()
223
+ # Criar o DataFrame df_limites_var com os valores mínimos e máximos
224
+ df_limites_var = pd.DataFrame({'Min': minimos, 'Max': maximos})
225
+ # Se desejar transpor para que as colunas sejam 'Min' e 'Max', e os índices sejam as colunas originais do df_dados
226
+ df_limites_var = df_limites_var.transpose()
227
+
228
+ # Removendo os outliers do DataFrame original
229
+ df_filtrado = df_dados[~df_dados.iloc[:, 0].isin(dados_out)]
230
+
231
+ # Resetando o índice de ambos os DataFrames
232
+ df_filtrado.reset_index(drop=True, inplace=True)
233
+ df_outliers.reset_index(drop=True, inplace=True)
234
+
235
+ # Contagem de linhas no DataFrame resultante
236
+ num_outliers = df_outliers.shape[0]
237
+
238
+ #----------------Manipulação das Colunas (variáveis)-----------------------#
239
+
240
+ # Variáveis independentes
241
+ X = pd.DataFrame()
242
+
243
+ # Iterar sobre as colunas do DataFrame df_filtrado
244
+ for i, col in enumerate(df_filtrado.columns):
245
+ # Verificar se a coluna atual deve ser adicionada com base na condição e se ela existe no DataFrame
246
+ if (i == 3 and v_1) or \
247
+ (i == 4 and v_2) or \
248
+ (i == 5 and v_3) or \
249
+ (i == 6 and v_4) or \
250
+ (i == 7 and v_5) or \
251
+ (i == 8 and v_6) or \
252
+ (i == 9 and v_7) or \
253
+ (i == 10 and v_8) or \
254
+ (i == 11 and v_9) or \
255
+ (i == 12 and v_10) or \
256
+ (i == 13 and v_11) or \
257
+ (i == 14 and v_12) or \
258
+ (i == 15 and v_13) or \
259
+ (i == 16 and v_14) or \
260
+ (i == 17 and v_15) or \
261
+ (i == 18 and v_16):
262
+ if i < len(df_filtrado.columns):
263
+ X[col] = df_filtrado.iloc[:, i]
264
+
265
+ #X.to_excel("X.xlsx", index=False) ---> Linha de verificação
266
+
267
+ #---------------------------Gráficos de dispersão--------------------------#
268
+
269
+
270
+ df_filtrado.to_excel("df_filtrado.xlsx", index=False) # isso pode ser retirado!
271
+
272
+ fig_v1 = None
273
+ fig_v2 = None
274
+ fig_v3 = None
275
+ fig_v4 = None
276
+ fig_v5 = None
277
+ fig_v6 = None
278
+ fig_v7 = None
279
+ fig_v8 = None
280
+ fig_v9 = None
281
+ fig_v10 = None
282
+ fig_v11 = None
283
+ fig_v12 = None
284
+ fig_v13 = None
285
+ fig_v14 = None
286
+ fig_v15 = None
287
+ fig_v16 = None
288
+
289
+ if v_1:
290
+ if v_d == "Valor total":
291
+ fig_v1 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[3], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
292
+ else:
293
+ fig_v1 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[3], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
294
+ if v_2:
295
+ if v_d == "Valor total":
296
+ fig_v2 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[4], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
297
+ else:
298
+ fig_v2 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[4], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
299
+ if v_3:
300
+ if v_d == "Valor total":
301
+ fig_v3 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[5], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
302
+ else:
303
+ fig_v3 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[5], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
304
+ if v_4:
305
+ if v_d == "Valor total":
306
+ fig_v4 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[6], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
307
+ else:
308
+ fig_v4 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[6], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
309
+ if v_5:
310
+ if v_d == "Valor total":
311
+ fig_v5 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[7], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
312
+ else:
313
+ fig_v5 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[7], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
314
+ if v_6:
315
+ if v_d == "Valor total":
316
+ fig_v6 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[8], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
317
+ else:
318
+ fig_v6 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[8], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
319
+ if v_7:
320
+ if v_d == "Valor total":
321
+ fig_v7 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[9], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
322
+ else:
323
+ fig_v7 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[9], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
324
+ if v_8:
325
+ if v_d == "Valor total":
326
+ fig_v8 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[10], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
327
+ else:
328
+ fig_v8 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[10], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
329
+ if v_9:
330
+ if v_d == "Valor total":
331
+ fig_v9 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[11], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
332
+ else:
333
+ fig_v9 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[11], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
334
+ if v_10:
335
+ if v_d == "Valor total":
336
+ fig_v10 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[12], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
337
+ else:
338
+ fig_v10 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[12], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
339
+ if v_11:
340
+ if v_d == "Valor total":
341
+ fig_v11 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[13], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
342
+ else:
343
+ fig_v11 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[13], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
344
+ if v_12:
345
+ if v_d == "Valor total":
346
+ fig_v12 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[14], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
347
+ else:
348
+ fig_v12 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[14], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
349
+ if v_13:
350
+ if v_d == "Valor total":
351
+ fig_v13 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[15], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
352
+ else:
353
+ fig_v13 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[15], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
354
+ if v_14:
355
+ if v_d == "Valor total":
356
+ fig_v14 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[16], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
357
+ else:
358
+ fig_v14 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[16], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
359
+ if v_15:
360
+ if v_d == "Valor total":
361
+ fig_v15 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[17], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
362
+ else:
363
+ fig_v15 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[17], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
364
+ if v_16:
365
+ if v_d == "Valor total":
366
+ fig_v16 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[18], df_filtrado.columns[1], df_filtrado.columns[0], "orange")
367
+ else:
368
+ fig_v16 = criar_grafico_dispersao(df_filtrado, df_filtrado.columns[18], df_filtrado.columns[2], df_filtrado.columns[0], "orange")
369
+
370
+ #--------------------------Regressão Linerar------------------------------#
371
+
372
+ # Variável dependente
373
+ if v_d == "Valor total":
374
+ y = df_filtrado.iloc[:, 1:2]
375
+ else:
376
+ y = df_filtrado.iloc[:, 2:3]
377
+
378
+ #y.to_excel("y.xlsx", index=False) ---> Linha de verificação
379
+
380
+ #---------------------ExtraTreesRegressor--------------------#
381
+
382
+ scaler_x = MinMaxScaler()
383
+ scaler_y = MinMaxScaler()
384
+
385
+ input_scaler = scaler_x.fit(X)
386
+ output_scaler = scaler_y.fit(y)
387
+
388
+ x_norm = input_scaler.transform(X)
389
+ y_norm = output_scaler.transform(np.array(y).reshape(-1, 1))
390
+
391
+ x_norm = pd.DataFrame(x_norm, columns=X.columns)
392
+
393
+ new_y = np.ravel(y_norm)
394
+
395
+ model = ExtraTreesRegressor()
396
+ model.fit(x_norm,new_y)
397
+
398
+ # Criando o gráfico de influência das variáveis
399
+ feat_importances = pd.Series(model.feature_importances_, index=X.columns)
400
+
401
+ #----------------------------Modelo----------------------------#
402
+
403
+ # Adicionando uma constante às variáveis independentes (intercepto)
404
+ X = sm.add_constant(X)
405
+
406
+ # Inicializando o modelo de regressão linear
407
+ modelo = sm.OLS(y, X)
408
+
409
+ # Ajustando o modelo aos dados
410
+ resultado = modelo.fit()
411
+
412
+ # Calculando os resíduos do modelo
413
+ residuos = resultado.resid
414
+ # Calculando Desvio Padrão dos Resíduos
415
+ #desvio_padrao_residuos = round(np.std(resultado.resid), 8)
416
+ desvio_padrao_residuos = round(np.std(residuos), 8)
417
+ # Calculando o erro padronizado
418
+ erro_padronizado = round(residuos / desvio_padrao_residuos, 5)
419
+ # Calculando Estatística F
420
+ estatistica_F = round(resultado.fvalue, 8)
421
+ # Obtendo Nível de Significância do Modelo
422
+ nivel_significancia = round(resultado.f_pvalue, 8)
423
+ # Calculando R²
424
+ r_squared = round(resultado.rsquared, 8)
425
+ # Calculando R² ajustado
426
+ r_squared_adjusted = round(resultado.rsquared_adj, 8)
427
+ # Obtendo Número de Observações
428
+ num_observacoes = int(round(resultado.nobs, 0))
429
+ # Calculando Coeficiente de Correlação
430
+ coef_correlacao = round(np.sqrt(r_squared), 8)
431
+
432
+ # Comparação com a curva normal de resíduos
433
+ intervalos = [(-1.00, 1.00), (-1.64, 1.64), (-1.96, 1.96)]
434
+ # Inicializando a lista para armazenar os percentuais
435
+ percentuais = []
436
+ # Contando o número de resíduos dentro de cada intervalo
437
+ for intervalo in intervalos:
438
+ min_intervalo, max_intervalo = intervalo
439
+ count = np.sum((erro_padronizado >= min_intervalo) & (erro_padronizado <= max_intervalo))
440
+ percentual = round(count / len(erro_padronizado) * 100, 0)
441
+ percentuais.append(f"{percentual:.0f}%")
442
+ # Criando a string de saída
443
+ perc_resid = ", ".join(percentuais)
444
+
445
+ # Teste Kolmogorov-Smirnov (KS)
446
+ ks_test = sm.stats.diagnostic.kstest_normal(residuos)
447
+ ks_test_formatted = tuple(round(val, 4) for val in ks_test)
448
+ # Calculando o teste de Jarque-Bera para os resíduos
449
+ jarque_bera_test, p_value, skewness, kurtosis = jarque_bera(residuos)
450
+ # Formatando os resultados com 4 casas decimais
451
+ jarque_bera_test = round(jarque_bera_test, 8)
452
+ p_value = round(p_value, 8)
453
+ skewness = round(skewness, 8)
454
+ kurtosis = round(kurtosis, 8)
455
+ # Extrair os coeficientes da regress��o
456
+ coeficientes = resultado.params
457
+ # Calcular a distância de Cook
458
+ distancia_cook = resultado.get_influence().cooks_distance[0]
459
+
460
+ # String com os resultados
461
+ resultados_gerais = f"""
462
+ Desvio Padrão: {desvio_padrao_residuos}
463
+ Estatística F: {estatistica_F}
464
+ Nível de Significância do Modelo: {nivel_significancia}
465
+
466
+ R²: {r_squared}
467
+ R² ajustado: {r_squared_adjusted}
468
+ Correlação: {coef_correlacao}
469
+ Número de observações: {num_observacoes}
470
+ Número de dados não utilizados: {num_outliers}
471
+ Testes de normalidade:
472
+ 1) Comparação (curva normal):
473
+ Ideal 68% - aceitável de 64% a 75%
474
+ Ideal 90% - aceitável de 88% a 95%
475
+ Ideal 95% - aceitável de 95% a 100%
476
+ Percentuais atingidos: {perc_resid}
477
+ 2) Teste Kolmogorov-Smirnov (KS)
478
+ - Distribuição dos resíduos: {ks_test}
479
+ 3) Teste de Jarque-Bera:
480
+ - Estatística do teste: {jarque_bera_test}
481
+ - Valor-p: {p_value}
482
+ - Assimetria (Skewness): {skewness}
483
+ - Curtose (Kurtosis): {kurtosis}
484
+ """
485
+
486
+ # Equação do modelo
487
+ if v_d == "Valor total":
488
+ equacao_modelo = df_filtrado.columns[1] + '='
489
+ else:
490
+ equacao_modelo = df_filtrado.columns[2] + '='
491
+
492
+ # Iterar sobre os coeficientes estimados
493
+ for nome_coluna, coeficiente in zip(X.columns, coeficientes):
494
+ # Se o nome da coluna for 'const', adicione apenas o coeficiente
495
+ if nome_coluna == 'const':
496
+ equacao_modelo += f" {coeficiente:.8f} +"
497
+ else:
498
+ # Adicionar o termo à equação do modelo
499
+ equacao_modelo += f" {coeficiente:.8f} * {nome_coluna} +"
500
+
501
+ # Remover o último sinal de adição
502
+ equacao_modelo = equacao_modelo[:-1]
503
+
504
+ # Exibindo estatísticas do modelo
505
+ resultado_summary = resultado.summary()
506
+ resultado_html = resultado.summary().tables[1].as_html()
507
+
508
+ #----------------------------df_final (regressão)----------------------------#
509
+
510
+ # Adicionando a primeira coluna de df_filtrado ao início de df_final
511
+ ordem = df_filtrado[[df_filtrado.columns[0]]].copy()
512
+ df_final = pd.concat([ordem, y, X], axis=1)
513
+
514
+ # Exporta modelo
515
+ df_exporta_modelo = df_final.copy()
516
+
517
+ df_final = df_final.drop(columns=['const'])
518
+
519
+ # Matriz de correlações
520
+ # Calculando correlações
521
+ correlation_matrix = df_final.corr()
522
+ # Removendo a primeira coluna, assumindo que seja a primeira
523
+ correlation_matrix = correlation_matrix.iloc[1:, 1:]
524
+
525
+ #--------------------df_final (adiciona o erro_padronizado)------------------#
526
+
527
+
528
+ # Adicionando a coluna de erro padronizado ao df_final
529
+ df_final['Erro Padronizado'] = erro_padronizado
530
+
531
+ #-------------------df_maiores_que_2 (possíveis outliers)--------------------#
532
+
533
+ # Criar DataFrame apenas com os dados cujo erro padronizado é maior que 2
534
+ df_maiores_que_2 = df_final[abs(df_final['Erro Padronizado']) > 2]
535
+ df_maiores_que_2['Erro Abs'] = abs(df_maiores_que_2['Erro Padronizado'])
536
+
537
+ # Listagem de pontos com resíduos > 2
538
+ Listagem_df_maiores_que_2 = ", ".join(map(str, df_maiores_que_2.iloc[:, 0].tolist()))
539
+
540
+ #------------df_correl (Valores Ajustados x Preços Observados)---------------#
541
+
542
+ # Obtendo os valores previstos
543
+ # Dados
544
+ valores_previstos = resultado.predict(X)
545
+
546
+ # Adicionando os valores previstos como uma nova coluna ao df_final
547
+ df_final['Valores Ajustados'] = round(valores_previstos, 8)
548
+ # Criando uma dataframe para os Valores Ajustados x Preços Observados
549
+ if v_d == "Valor total":
550
+ df_correl = df_final[[df_filtrado.columns[0], df_filtrado.columns[1], 'Valores Ajustados']]
551
+ df_correl = df_correl.rename(columns={df_filtrado.columns[1]: 'Preços Observados'})
552
+ else:
553
+ df_correl = df_final[[df_filtrado.columns[0], df_filtrado.columns[2], 'Valores Ajustados']]
554
+ df_correl = df_correl.rename(columns={df_filtrado.columns[2]: 'Preços Observados'})
555
+
556
+ df_correl_grafico = df_correl.copy()
557
+ # Desfazendo a conversão da escala
558
+ if scv_d == 'lny':
559
+ df_correl['Valores Ajustados'] = round(np.exp(df_correl['Valores Ajustados']), 8)
560
+ df_correl['Preços Observados'] = round(np.exp(df_correl['Preços Observados']), 8)
561
+ elif scv_d == '1/y':
562
+ df_correl['Valores Ajustados'] = round(1 / df_correl['Valores Ajustados'], 8)
563
+ df_correl['Preços Observados'] = round(1 / df_correl['Preços Observados'], 8)
564
+ elif scv_d == 'y²':
565
+ df_correl['Valores Ajustados'] = round(np.sqrt(df_correl['Valores Ajustados']), 8)
566
+ df_correl['Preços Observados'] = round(np.sqrt(df_correl['Preços Observados']), 8)
567
+ else:
568
+ pass # Nenhuma transformação é necessária
569
+
570
+ df_correl['Diferença %'] = round(((df_correl['Valores Ajustados']/df_correl['Preços Observados'])-1)*100, 8)
571
+
572
+ #-------------------------------Modelo para EXCEL---------------------------#
573
+
574
+ output_file = 'modelo.xlsx'
575
+ output_file = output_file.replace('modelo', name_model)
576
+ with pd.ExcelWriter(output_file, engine='xlsxwriter') as writer:
577
+ # Salve o DataFrame 'DADOS INICIAIS' na planilha 'relatório'
578
+ df_original.to_excel(writer, sheet_name='Dados Originais', index=False)
579
+ # Salve o DataFrame 'DADOS NÃO UTILIZADOS' na planilha 'relatório'
580
+ df_outliers.to_excel(writer, sheet_name='Dados Não utilizados', index=False)
581
+ # Salve o DataFrame 'PLANILHA OBS X CALC' na planilha 'relatório'
582
+ df_correl.to_excel(writer, sheet_name='Obs x Calc', index=False)
583
+
584
+ # String com os resultados
585
+ resultados = pd.DataFrame({
586
+ 'Desvio Padrão': [desvio_padrao_residuos],
587
+ 'Estatística F': [estatistica_F],
588
+ 'Nível de Significância do Modelo': [nivel_significancia],
589
+ 'R²': [r_squared],
590
+ 'R² ajustado': [r_squared_adjusted],
591
+ 'Correlação': [coef_correlacao],
592
+ 'Número de observações': [num_observacoes],
593
+ 'Número de dados não utilizados': [num_outliers],
594
+ '- Estatística Jarque-Bera': [jarque_bera_test],
595
+ '- Valor-p': [p_value],
596
+ '- Assimetria (Skewness)': [skewness],
597
+ '- Curtose (Kurtosis)': [kurtosis],
598
+ })
599
+
600
+ # Transponha o DataFrame
601
+ resultados = resultados.T.reset_index()
602
+ # Defina os nomes das colunas do novo DataFrame
603
+ resultados.columns = ['Nome da Coluna', 'Valor']
604
+ resultados.to_excel(writer, sheet_name='Resultados', index=False)
605
+
606
+ # Salve o DataFrame 'DADOS PARA REGRESSÃO' na planilha 'relatório'
607
+ df_exporta_modelo.to_excel(writer, sheet_name='Model', index=False)
608
+
609
+ # Salve o DataFrame 'PLANILHA MODELO PARA AVALIAÇÃO' na planilha 'relatório'
610
+ df_avalia.to_excel(writer, sheet_name='avaliando', index=False)
611
+
612
+ #----------------------------------Avaliação--------------------------------#
613
+
614
+ try:
615
+ # Carregando o(s) avaliando(s)
616
+ df_aval = pd.read_excel(planilha.name, 'avaliando')
617
+ #df_aval_original = df_aval.copy()
618
+
619
+ # avaliando(s)
620
+ df_aval_final = df_aval.copy()
621
+
622
+ df_aval_original = pd.DataFrame()
623
+
624
+ # Para criar um dataframe final sem as escalas convertidas e apenas com as variáveis escolhidas
625
+ for i, col in enumerate(df_aval_final.columns):
626
+ # Verificar se a coluna atual deve ser adicionada com base na condição e se ela existe no DataFrame
627
+ if (i == 0 and v_1) or \
628
+ (i == 1 and v_2) or \
629
+ (i == 2 and v_3) or \
630
+ (i == 3 and v_4) or \
631
+ (i == 4 and v_5) or \
632
+ (i == 5 and v_6) or \
633
+ (i == 6 and v_7) or \
634
+ (i == 7 and v_8) or \
635
+ (i == 8 and v_9) or \
636
+ (i == 9 and v_10) or \
637
+ (i == 10 and v_11) or \
638
+ (i == 11 and v_12) or \
639
+ (i == 12 and v_13) or \
640
+ (i == 13 and v_14) or \
641
+ (i == 14 and v_15) or \
642
+ (i == 15 and v_16):
643
+
644
+ if i < len(df_aval_final.columns):
645
+ df_aval_original[col] = df_aval_final.iloc[:, i]
646
+
647
+ # alterar escalas (para rodar o modelo)
648
+ aplicar_operacao(df_aval, scv_1, 0)
649
+ aplicar_operacao(df_aval, scv_2, 1)
650
+ aplicar_operacao(df_aval, scv_3, 2)
651
+ aplicar_operacao(df_aval, scv_4, 3)
652
+ aplicar_operacao(df_aval, scv_5, 4)
653
+ aplicar_operacao(df_aval, scv_6, 5)
654
+ aplicar_operacao(df_aval, scv_7, 6)
655
+ aplicar_operacao(df_aval, scv_8, 7)
656
+ aplicar_operacao(df_aval, scv_9, 8)
657
+ aplicar_operacao(df_aval, scv_10, 9)
658
+ aplicar_operacao(df_aval, scv_11, 10)
659
+ aplicar_operacao(df_aval, scv_12, 11)
660
+ aplicar_operacao(df_aval, scv_13, 12)
661
+ aplicar_operacao(df_aval, scv_14, 13)
662
+ aplicar_operacao(df_aval, scv_15, 14)
663
+ aplicar_operacao(df_aval, scv_16, 15)
664
+
665
+ # Criando um dataframe apenas com as variáveis escolhidas e com as escalas convertidas.
666
+ X_aval = pd.DataFrame()
667
+ # Iterar sobre as colunas do DataFrame para fazer a predição de valor
668
+ for i, col in enumerate(df_aval.columns):
669
+ # Verificar se a coluna atual deve ser adicionada com base na condição e se ela existe no DataFrame
670
+ if (i == 0 and v_1) or \
671
+ (i == 1 and v_2) or \
672
+ (i == 2 and v_3) or \
673
+ (i == 3 and v_4) or \
674
+ (i == 4 and v_5) or \
675
+ (i == 5 and v_6) or \
676
+ (i == 6 and v_7) or \
677
+ (i == 7 and v_8) or \
678
+ (i == 8 and v_9) or \
679
+ (i == 9 and v_10) or \
680
+ (i == 10 and v_11) or \
681
+ (i == 11 and v_12) or \
682
+ (i == 12 and v_13) or \
683
+ (i == 13 and v_14) or \
684
+ (i == 14 and v_15) or \
685
+ (i == 15 and v_16):
686
+
687
+ if i < len(df_aval.columns):
688
+ X_aval[col] = df_aval.iloc[:, i]
689
+
690
+ X_aval.insert(0, 'const', 1)
691
+
692
+ # Avaliando(s)
693
+ valores_previstos_aval = resultado.predict(X_aval)
694
+ df_aval_original['VALOR'] = round(valores_previstos_aval, 8)
695
+
696
+ if scv_d == 'lny':
697
+ df_aval_original['VALOR'] = round(np.exp(df_aval_original['VALOR']), 8)
698
+ elif scv_d == '1/y':
699
+ df_aval_original['VALOR'] = round(1 / df_aval_original['VALOR'], 8)
700
+ elif scv_d == 'y²':
701
+ df_aval_original['VALOR'] = round(np.sqrt(df_aval_original['VALOR']), 8)
702
+ else:
703
+ pass # Nenhuma transformação é necessária
704
+
705
+ # Campo de arbítrio
706
+ df_aval_original['LI_CA'] = round((df_aval_original['VALOR']*0.85), 2)
707
+ df_aval_original['LS_CA'] = round((df_aval_original['VALOR']*1.15), 2)
708
+
709
+ # Intervalo de Confiança de 80%
710
+ # Calcular os intervalos de confiança para a média prevista
711
+ intervalo_confianca = resultado.get_prediction(X_aval).summary_frame(alpha=0.2)
712
+ # Extrair os limites inferior e superior do intervalo de confiança
713
+ limite_inferior = intervalo_confianca['mean_ci_lower']
714
+ limite_superior = intervalo_confianca['mean_ci_upper']
715
+ # Adicionar as colunas ao DataFrame df_aval_original
716
+ df_aval_original['LI_IC'] = limite_inferior.values
717
+ df_aval_original['LS_IC'] = limite_superior.values
718
+
719
+ if scv_d == 'lny':
720
+ df_aval_original['LI_IC'] = round(np.exp(df_aval_original['LI_IC']), 2)
721
+ df_aval_original['LS_IC'] = round(np.exp(df_aval_original['LS_IC']), 2)
722
+ elif scv_d == '1/y':
723
+ df_aval_original['LI_IC'] = round(1 / df_aval_original['LI_IC'], 2)
724
+ df_aval_original['LS_IC'] = round(1 / df_aval_original['LS_IC'], 2)
725
+ elif scv_d == 'y²':
726
+ df_aval_original['LI_IC'] = round(np.sqrt(df_aval_original['LI_IC']), 2)
727
+ df_aval_original['LS_IC'] = round(np.sqrt(df_aval_original['LS_IC']), 2)
728
+ else:
729
+ pass # Nenhuma transformação é necessária
730
+
731
+ df_aval_original['LI_IC_%'] = round(((df_aval_original['VALOR']-df_aval_original['LI_IC'])/df_aval_original['VALOR'])*100, 2)
732
+ df_aval_original['LS_IC_%'] = round(((df_aval_original['LS_IC']-df_aval_original['VALOR'])/df_aval_original['VALOR'])*100, 2)
733
+ df_aval_original['TOTAL_IC_%'] = round(df_aval_original['LI_IC_%'] + df_aval_original['LS_IC_%'], 2)
734
+
735
+ # Aplicação das condições para determinar 'PRECISÃO'
736
+ df_aval_original['PRECISÃO'] = "" # Inicializa a coluna 'PRECISÃO'
737
+ df_aval_original.loc[df_aval_original['TOTAL_IC_%'] <= 30, 'PRECISÃO'] = "Grau III"
738
+ df_aval_original.loc[(df_aval_original['TOTAL_IC_%'] > 30) & (df_aval_original['TOTAL_IC_%'] <= 40), 'PRECISÃO'] = "Grau II"
739
+ df_aval_original.loc[(df_aval_original['TOTAL_IC_%'] > 40) & (df_aval_original['TOTAL_IC_%'] <= 50), 'PRECISÃO'] = "Grau I"
740
+ df_aval_original.loc[df_aval_original['TOTAL_IC_%'] > 50, 'PRECISÃO'] = "Fora dos critérios"
741
+
742
+ # Retirando as colunas valor total e valor unitário
743
+ #df_aval_original = df_aval_original.drop(df_aval_original.columns[[1, 2]], axis=1)
744
+ # Salve o DataFrame 'result' em uma planilha
745
+ df_aval_original.to_excel("planilha_aval.xlsx", index=False)
746
+
747
+ except:
748
+ # Se a aba não existir, crie um DataFrame vazio
749
+ df_aval_original = pd.DataFrame()
750
+
751
+ # Salve o DataFrame em uma planilha
752
+ df_aval_original.to_excel("planilha_aval.xlsx", index=False)
753
+
754
+ #-----------------------------------------------Gráficos-------------------------------------------------#
755
+
756
+ # Criando subplots
757
+ fig, (ax1, ax2, ax3, ax4, ax5, ax6) = plt.subplots(6, 1, figsize=(15, 40))
758
+
759
+ # Gráfico dos resíduos padronizados
760
+ ax1.scatter(df_final['Valores Ajustados'], erro_padronizado, color='orange', alpha=0.6)
761
+ ax1.axhline(y=0, color='black', linestyle='--', linewidth=1) # Linha zero
762
+ ax1.axhline(y=2, color='red', linestyle='-', linewidth=1) # Linhas vermelhas em ±2
763
+ ax1.axhline(y=-2, color='red', linestyle='-', linewidth=1)
764
+ ax1.set_title('Gráfico de Resíduos Padronizados')
765
+ ax1.set_xlabel('Valores Ajustados')
766
+ ax1.set_ylabel('Resíduos Padronizados')
767
+ ax1.grid(True)
768
+ # Adicionando rótulos aos pontos com resíduos padronizados > 2
769
+ for i, txt in enumerate(df_final.iloc[:, 0]):
770
+ if abs(erro_padronizado[i]) > 2:
771
+ ax1.annotate(txt, (df_final['Valores Ajustados'][i], erro_padronizado[i]), xytext=(5,5),
772
+ textcoords='offset points', fontsize=20, color='darkred')
773
+
774
+ # Histograma dos resíduos padronizados
775
+ sns.histplot(erro_padronizado, kde=True, color='orange', alpha=0.6, ax=ax2)
776
+ ax2.set_title('Histograma dos Resíduos Padronizados')
777
+ ax2.set_xlabel('Resíduos Padronizados')
778
+ ax2.set_ylabel('Frequência')
779
+ ax2.grid(True)
780
+
781
+ # Gráfico da distância de Cook
782
+ ax3.plot(distancia_cook, marker='o', linestyle='None', color='orange')
783
+ ax3.axhline(y=1, color='red', linestyle='--', linewidth=1)
784
+ ax3.set_title('Gráfico da Distância de Cook')
785
+ ax3.set_xlabel('Número da Observação')
786
+ ax3.set_ylabel('Distância de Cook')
787
+ ax3.grid(True)
788
+
789
+ # Gráfico Valores Ajustados vs Preços Observados
790
+ # Extrair os valores dos dados
791
+ x_values = df_correl_grafico['Preços Observados']
792
+ y_values = df_correl_grafico['Valores Ajustados']
793
+ # Calcular a linha de tendência (regressão linear)
794
+ slope, intercept = np.polyfit(x_values, y_values, 1)
795
+
796
+ # Plotar o gráfico de dispersão no eixo ax4
797
+ ax4.scatter(x_values, y_values, color='black')
798
+ # Plotar a linha de tendência no eixo ax4
799
+ ax4.plot(x_values, slope * x_values + intercept, color='orange', linestyle='--', linewidth=2)
800
+ # Adicionar título e rótulos dos eixos em ax4
801
+ ax4.set_title('Valores Ajustados vs Preços Observados')
802
+ ax4.set_xlabel('Preços Observados')
803
+ ax4.set_ylabel('Valores Ajustados')
804
+ ax4.grid(True)
805
+
806
+ # Criando o gráfico de influência das variáveis
807
+ feat_importances.nlargest(16).plot(kind='barh', color='orange', ax=ax5)
808
+ ax5.set_title('Influência das Variáveis')
809
+ ax5.set_xlabel('Importância')
810
+ ax5.set_ylabel('Variáveis')
811
+ ax5.grid(True)
812
+
813
+ # Plotando o gráfico de correlações
814
+ ax6.set_title('Matriz de Correlação')
815
+ # Definindo uma paleta de cores laranjas
816
+ palette = sns.light_palette("orange", as_cmap=True)
817
+ # Plotando o gráfico de correlações com a paleta de cores laranjas
818
+ sns.heatmap(correlation_matrix, annot=True, cmap=palette, linewidths=0.5, ax=ax6, annot_kws={"size": 12})
819
+
820
+
821
+ # Ajustando a posição dos subplots
822
+ plt.tight_layout()
823
+
824
+ # Exibindo os subplots
825
+ plt.show()
826
+ #----------------------------------------------Pontos Influenciantes-------------------------------------------------#
827
+
828
+ # Listagem de pontos discrepantes
829
+ #limite_cook = 4 / (len(df_final) - len(resultado.params))
830
+ #pontos_discrepantes = []
831
+ #for i, cook_dist in enumerate(distancia_cook):
832
+ #if cook_dist > limite_cook:
833
+ #pontos_discrepantes.append(df_final.iloc[i, 0]) # Usando a primeira coluna como rótulo
834
+ # Listagem de pontos influentes
835
+ limite_cook = 1
836
+ pontos_influentes = []
837
+ for i, cook_dist in enumerate(distancia_cook):
838
+ if cook_dist > limite_cook:
839
+ pontos_influentes.append(df_final.iloc[i, 0]) # Usando a primeira coluna como rótulo
840
+
841
+ # Transformando a lista em uma string separada por vírgula
842
+ string_pontos_influentes = ", ".join(map(str, pontos_influentes))
843
+
844
+ #---------------------------------------Outputs----------------------------------#
845
+
846
+ return (
847
+ df_original,
848
+ string_colunas,
849
+ resultados_gerais,
850
+ equacao_modelo,
851
+ resultado_html,
852
+ df_final,
853
+ Listagem_df_maiores_que_2,
854
+ string_pontos_influentes,
855
+ df_maiores_que_2,
856
+ df_outliers,
857
+ df_correl,
858
+ df_limites_var,
859
+ fig_v1,
860
+ fig_v2,
861
+ fig_v3,
862
+ fig_v4,
863
+ fig_v5,
864
+ fig_v6,
865
+ fig_v7,
866
+ fig_v8,
867
+ fig_v9,
868
+ fig_v10,
869
+ fig_v11,
870
+ fig_v12,
871
+ fig_v13,
872
+ fig_v14,
873
+ fig_v15,
874
+ fig_v16,
875
+ plt,
876
+ df_aval_original,
877
+ 'planilha_aval.xlsx',
878
+ output_file,
879
+ 'df_filtrado.xlsx',
880
+
881
+
882
+ #X_aval,
883
+ #X,
884
+ #y,
885
+ #'X.xlsx',
886
+ #'y.xlsx',
887
+ )
888
+
889
+
890
+ #-----------------------------------------FUNÇÃO PRINCIPAL DE CARREGAMENTO DE MODELOS-----------------------------------------#
891
+
892
+ # função para a regressão linear
893
+ def carrega_model(planilha):
894
+
895
+ #----------------------------Carregando modelo--------------------------------#
896
+
897
+ df_model = pd.read_excel(planilha.name, 'Model')
898
+
899
+ y = df_model.iloc[:, 1:2]
900
+ # Para converter os valores calculados posteriormente
901
+ cabecalho_lista = list(y.columns)
902
+ cabecalho_lista_transformado = ['lny' if 'ln(' in col else '1/y' if '1/(' in col else 'y²' if '(' in col and ')' in col and '²' in col else 'y' for col in cabecalho_lista]
903
+ scv_d = cabecalho_lista_transformado[0]
904
+
905
+
906
+ X_model = df_model.drop(df_model.columns[[0, 1]], axis=1)
907
+ cabecalho_lista = list(X_model.columns)
908
+ cabecalho_lista_transformado = ['lnx' if 'ln(' in col else '1/x' if '1/(' in col else 'x²' if '(' in col and ')' in col and '²' in col else 'x' for col in cabecalho_lista]
909
+ const = cabecalho_lista_transformado[0]
910
+ v = cabecalho_lista_transformado[1:] # Exclui o primeiro elemento da lista
911
+ # Atribuindo os valores restantes a variáveis v_1, v_2, v_3, ...
912
+ for i, valor in enumerate(v, start=1):
913
+ globals()[f"scv_{i}"] = valor
914
+ # Imprimindo os valores armazenados
915
+ print("const:", const)
916
+ for i in range(1, len(v) + 1):
917
+ print(f"scv_{i}:", globals()[f"scv_{i}"])
918
+
919
+ # Inicializando o modelo de regressão linear
920
+ modelo = sm.OLS(y, X_model)
921
+
922
+ # Ajustando o modelo aos dados
923
+ resultado = modelo.fit()
924
+
925
+ # Calculando os resíduos do modelo
926
+ residuos = resultado.resid
927
+ # Calculando Desvio Padrão dos Resíduos
928
+ #desvio_padrao_residuos = round(np.std(resultado.resid), 8)
929
+ desvio_padrao_residuos = round(np.std(residuos), 8)
930
+ # Calculando o erro padronizado
931
+ erro_padronizado = round(residuos / desvio_padrao_residuos, 5)
932
+ # Calculando Estatística F
933
+ estatistica_F = round(resultado.fvalue, 8)
934
+ # Obtendo Nível de Significância do Modelo
935
+ nivel_significancia = round(resultado.f_pvalue, 8)
936
+ # Calculando R²
937
+ r_squared = round(resultado.rsquared, 8)
938
+ # Calculando R² ajustado
939
+ r_squared_adjusted = round(resultado.rsquared_adj, 8)
940
+ # Obtendo Número de Observações
941
+ num_observacoes = int(round(resultado.nobs, 0))
942
+ # Calculando Coeficiente de Correlação
943
+ coef_correlacao = round(np.sqrt(r_squared), 8)
944
+
945
+ # Comparação com a curva normal de resíduos
946
+ intervalos = [(-1.00, 1.00), (-1.64, 1.64), (-1.96, 1.96)]
947
+ # Inicializando a lista para armazenar os percentuais
948
+ percentuais = []
949
+ # Contando o número de resíduos dentro de cada intervalo
950
+ for intervalo in intervalos:
951
+ min_intervalo, max_intervalo = intervalo
952
+ count = np.sum((erro_padronizado >= min_intervalo) & (erro_padronizado <= max_intervalo))
953
+ percentual = round(count / len(erro_padronizado) * 100, 0)
954
+ percentuais.append(f"{percentual:.0f}%")
955
+ # Criando a string de saída
956
+ perc_resid = ", ".join(percentuais)
957
+
958
+ # Teste Kolmogorov-Smirnov (KS)
959
+ ks_test = sm.stats.diagnostic.kstest_normal(residuos)
960
+ ks_test_formatted = tuple(round(val, 4) for val in ks_test)
961
+ # Calculando o teste de Jarque-Bera para os resíduos
962
+ jarque_bera_test, p_value, skewness, kurtosis = jarque_bera(residuos)
963
+ # Formatando os resultados com 4 casas decimais
964
+ jarque_bera_test = round(jarque_bera_test, 8)
965
+ p_value = round(p_value, 8)
966
+ skewness = round(skewness, 8)
967
+ kurtosis = round(kurtosis, 8)
968
+ # Extrair os coeficientes da regressão
969
+ coeficientes = resultado.params
970
+ # Calcular a distância de Cook
971
+ distancia_cook = resultado.get_influence().cooks_distance[0]
972
+
973
+ # String com os resultados
974
+ resultados_gerais = f"""
975
+ Desvio Padrão: {desvio_padrao_residuos}
976
+ Estatística F: {estatistica_F}
977
+ Nível de Significância do Modelo: {nivel_significancia}
978
+
979
+ R²: {r_squared}
980
+ R² ajustado: {r_squared_adjusted}
981
+ Correlação: {coef_correlacao}
982
+ Número de observações: {num_observacoes}
983
+ Testes de normalidade:
984
+ 1) Comparação (curva normal):
985
+ Ideal 68% - aceitável de 64% a 75%
986
+ Ideal 90% - aceitável de 88% a 95%
987
+ Ideal 95% - aceitável de 95% a 100%
988
+ Percentuais atingidos: {perc_resid}
989
+ 2) Teste Kolmogorov-Smirnov (KS)
990
+ - Distribuição dos resíduos: {ks_test}
991
+ 3) Teste de Jarque-Bera:
992
+ - Estatística do teste: {jarque_bera_test}
993
+ - Valor-p: {p_value}
994
+ - Assimetria (Skewness): {skewness}
995
+ - Curtose (Kurtosis): {kurtosis}
996
+ """
997
+
998
+ # Exibindo estatísticas do modelo
999
+ resultado_summary = resultado.summary()
1000
+ resultado_html = resultado.summary().tables[1].as_html()
1001
+
1002
+ #-------------------------------Carregando avaliando(s)----------------------------------#
1003
+
1004
+ try:
1005
+ # Carregando o(s) avaliando(s)
1006
+ df_aval = pd.read_excel(planilha.name, 'avaliando')
1007
+
1008
+ X_avalia = df_aval.copy()
1009
+ X_avalia.insert(0, 'const', 1)
1010
+
1011
+ num_colunas = len(X_avalia.columns)
1012
+
1013
+ # Iterando sobre as colunas preenchidas
1014
+ for col_index in range(1, num_colunas + 1):
1015
+ # Obtendo o nome do SCV correspondente a esta coluna
1016
+ scv_nome = f"scv_{col_index}"
1017
+
1018
+ # Verificando se o SCV correspondente existe
1019
+ if scv_nome in globals():
1020
+ scv = globals()[scv_nome]
1021
+ aplicar_operacao(X_avalia, scv, col_index)
1022
+
1023
+ # Avaliando(s)
1024
+ valores_previstos_aval = resultado.predict(X_avalia)
1025
+ y_pred = pd.DataFrame(valores_previstos_aval, columns=['VALOR'])
1026
+
1027
+ df_avalia = pd.concat([df_aval, y_pred], axis=1)
1028
+
1029
+ if scv_d == 'lny':
1030
+ df_avalia['VALOR'] = round(np.exp(df_avalia['VALOR']), 8)
1031
+ elif scv_d == '1/y':
1032
+ df_avalia['VALOR'] = round(1 / df_avalia['VALOR'], 8)
1033
+ elif scv_d == 'y²':
1034
+ df_avalia['VALOR'] = round(np.sqrt(df_avalia['VALOR']), 8)
1035
+ else:
1036
+ pass # Nenhuma transformação é necessária
1037
+
1038
+ # Campo de arbítrio
1039
+ df_avalia['LI_CA'] = round((df_avalia['VALOR']*0.85), 2)
1040
+ df_avalia['LS_CA'] = round((df_avalia['VALOR']*1.15), 2)
1041
+
1042
+ # Intervalo de Confiança de 80%
1043
+ # Calcular os intervalos de confiança para a média prevista
1044
+ intervalo_confianca = resultado.get_prediction(X_avalia).summary_frame(alpha=0.2)
1045
+ # Extrair os limites inferior e superior do intervalo de confiança
1046
+ limite_inferior = intervalo_confianca['mean_ci_lower']
1047
+ limite_superior = intervalo_confianca['mean_ci_upper']
1048
+ # Adicionar as colunas ao DataFrame df_aval_original
1049
+ df_avalia['LI_IC'] = limite_inferior.values
1050
+ df_avalia['LS_IC'] = limite_superior.values
1051
+
1052
+ if scv_d == 'lny':
1053
+ df_avalia['LI_IC'] = round(np.exp(df_avalia['LI_IC']), 2)
1054
+ df_avalia['LS_IC'] = round(np.exp(df_avalia['LS_IC']), 2)
1055
+ elif scv_d == '1/y':
1056
+ df_avalia['LI_IC'] = round(1 / df_avalia['LI_IC'], 2)
1057
+ df_avalia['LS_IC'] = round(1 / df_avalia['LS_IC'], 2)
1058
+ elif scv_d == 'y²':
1059
+ df_avalia['LI_IC'] = round(np.sqrt(df_avalia['LI_IC']), 2)
1060
+ df_avalia['LS_IC'] = round(np.sqrt(df_avalia['LS_IC']), 2)
1061
+ else:
1062
+ pass # Nenhuma transformação é necessária
1063
+
1064
+ df_avalia['LI_IC_%'] = round(((df_avalia['VALOR']-df_avalia['LI_IC'])/df_avalia['VALOR'])*100, 2)
1065
+ df_avalia['LS_IC_%'] = round(((df_avalia['LS_IC']-df_avalia['VALOR'])/df_avalia['VALOR'])*100, 2)
1066
+ df_avalia['TOTAL_IC_%'] = round(df_avalia['LI_IC_%'] + df_avalia['LS_IC_%'], 2)
1067
+
1068
+ # Aplicação das condições para determinar 'PRECISÃO'
1069
+ df_avalia['PRECISÃO'] = "" # Inicializa a coluna 'PRECISÃO'
1070
+ df_avalia.loc[df_avalia['TOTAL_IC_%'] <= 30, 'PRECISÃO'] = "Grau III"
1071
+ df_avalia.loc[(df_avalia['TOTAL_IC_%'] > 30) & (df_avalia['TOTAL_IC_%'] <= 40), 'PRECISÃO'] = "Grau II"
1072
+ df_avalia.loc[(df_avalia['TOTAL_IC_%'] > 40) & (df_avalia['TOTAL_IC_%'] <= 50), 'PRECISÃO'] = "Grau I"
1073
+ df_avalia.loc[df_avalia['TOTAL_IC_%'] > 50, 'PRECISÃO'] = "Fora dos critérios"
1074
+
1075
+ # Salve o DataFrame 'result' em uma planilha
1076
+ df_avalia.to_excel("planilha_aval.xlsx", index=False)
1077
+
1078
+ except:
1079
+ # Se a aba não existir, crie um DataFrame vazio
1080
+ df_avalia = pd.DataFrame()
1081
+
1082
+ # Salve o DataFrame em uma planilha
1083
+ df_avalia.to_excel("planilha_aval.xlsx", index=False)
1084
+
1085
+ #----------------------------------------Outpus------------------------------------------#
1086
+
1087
+ return (
1088
+ df_model,
1089
+ #y,
1090
+ #X_model,
1091
+ resultados_gerais,
1092
+ resultado_html,
1093
+ #X_avalia,
1094
+ df_avalia,
1095
+ 'planilha_aval.xlsx'
1096
+ )
1097
+
1098
+ #----------------------------------------------------------INTERFACES----------------------------------------------------------#
1099
+
1100
+ with gr.Blocks(theme=gr.themes.Monochrome(primary_hue="yellow", secondary_hue="yellow",)) as interface:
1101
+ gr.Markdown(f"""
1102
+ <p style="text-align: left;">
1103
+ <b><span style='color: grey; font-size: 35px;'>aval</span></b>
1104
+ <b><span style='color: orange; font-size: 35px;'>ia</span></b>
1105
+ <b><span style='color: grey; font-size: 35px;'>.se</span></b>
1106
+ </p
1107
+ <p style="text-align: left;"></span>Aplicativo MCDDM com tratamento científico / Você pode fazer um download de uma planilha de exemplo <a href='https://huggingface.co/spaces/DavidSB/avalia.se_RL_Tabs_v4/resolve/main/BD_MODELO.xlsx' download='BD_MODELO.xlsx'>aqui</a><br><br></p>
1108
+ """)
1109
+ with gr.Tab("Gera Modelo"):
1110
+ with gr.Row():
1111
+ with gr.Column():
1112
+ with gr.Row():
1113
+ #inp_1 = gr.File(label="Upload planilha", type="file", scale=2, height=100)
1114
+ inp_1 = gr.File(label="Upload planilha", type="filepath", scale=2, height=100)
1115
+ with gr.Row():
1116
+ inp_37 = gr.Textbox(label="Nome do modelo", scale=1)
1117
+ inp_2 = gr.Dropdown(['Valor total', 'Valor unitário',], label="VARIÁVEL DEPENDENTE", value='Valor unitário')
1118
+ inp_3 = gr.Dropdown(['y', 'lny', '1/y', 'y²'], label="Escala", value='y')
1119
+ button_1 = gr.Button("Calcular")
1120
+ with gr.Row():
1121
+ inp_4 = gr.Checkbox(value=True, label="Var 1", scale=1)
1122
+ inp_5 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
1123
+ inp_6 = gr.Checkbox(value=True, label="Var 2", scale=1)
1124
+ inp_7 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
1125
+ with gr.Row():
1126
+ inp_8 = gr.Checkbox(value=False, label="Var 3", scale=1)
1127
+ inp_9 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
1128
+ inp_10 = gr.Checkbox(value=False, label="Var 4", scale=1)
1129
+ inp_11 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
1130
+ with gr.Row():
1131
+ inp_12 = gr.Checkbox(value=False, label="Var 5", scale=1)
1132
+ inp_13 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
1133
+ inp_14 = gr.Checkbox(value=False, label="Var 6", scale=1)
1134
+ inp_15 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
1135
+ with gr.Row():
1136
+ inp_16 = gr.Checkbox(value=False, label="Var 7", scale=1)
1137
+ inp_17 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
1138
+ inp_18 = gr.Checkbox(value=False, label="Var 8", scale=1)
1139
+ inp_19 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
1140
+ with gr.Row():
1141
+ inp_20 = gr.Checkbox(value=False, label="Var 9", scale=1)
1142
+ inp_21 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
1143
+ inp_22 = gr.Checkbox(value=False, label="Var 10", scale=1)
1144
+ inp_23 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
1145
+ with gr.Row():
1146
+ inp_24 = gr.Checkbox(value=False, label="Var 11", scale=1)
1147
+ inp_25 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
1148
+ inp_26 = gr.Checkbox(value=False, label="Var 12", scale=1)
1149
+ inp_27 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
1150
+ with gr.Row():
1151
+ inp_28 = gr.Checkbox(value=False, label="Var 13", scale=1)
1152
+ inp_29 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
1153
+ inp_30 = gr.Checkbox(value=False, label="Var 14", scale=1)
1154
+ inp_31 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
1155
+ with gr.Row():
1156
+ inp_32 = gr.Checkbox(value=False, label="Var 15", scale=1)
1157
+ inp_33 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
1158
+ inp_34 = gr.Checkbox(value=False, label="Var 16", scale=1)
1159
+ inp_35 = gr.Dropdown(['x', 'lnx', '1/x', 'x²'], show_label=False, value='x', scale=1)
1160
+ button_2 = gr.Button("Calcular")
1161
+ inp_36 = gr.Textbox(label="Manipular dados (separados por vírgula)", type="text", info = "Após rodar o modelo a primeira vez, por meio deste campo podem ser retirados outliers, pontos influenciantes, etc")
1162
+
1163
+ with gr.Column():
1164
+ out_1 = gr.Dataframe(label="Planilha de dados original", height=300)
1165
+ out_2 = gr.Textbox(label="Colunas", scale=1)
1166
+ out_3 = gr.Textbox(label="Resultados Gerais do Modelo", scale=1)
1167
+ out_4 = gr.Textbox(label="Equação do Modelo")
1168
+ out_5 = gr.HTML(label="Resultados por variável")
1169
+ out_6 = gr.Dataframe(label="Planilha Regressão Linear (Variáveis e escalas escolhidas e sem outliers)", height=300)
1170
+ with gr.Row():
1171
+ out_7 = gr.Textbox(label="Dados com resíduos padronizados > 2")
1172
+ out_8 = gr.Textbox(label="Pontos Influenciantes (Distância de Cook > 1)")
1173
+ out_9 = gr.Dataframe(label="Resíduos Padronizados > 2", height=300)
1174
+ out_10 = gr.Dataframe(label="Outliers (retirados)", height=300)
1175
+ out_11 = gr.Dataframe(label="Valores Ajustados x Preços Observados", height=300)
1176
+ out_34 = gr.Dataframe(label="Máximos e Mínimos por variável", height=300)
1177
+ button_3 = gr.Button("Calcular")
1178
+ out_12 = gr.Plot(label="Gráfico Dispersão var 1")
1179
+ out_13 = gr.Plot(label="Gráfico Dispersão var 2")
1180
+ out_14 = gr.Plot(label="Gráfico Dispersão var 3")
1181
+ out_15 = gr.Plot(label="Gráfico Dispersão var 4")
1182
+ out_16 = gr.Plot(label="Gráfico Dispersão var 5")
1183
+ out_17 = gr.Plot(label="Gráfico Dispersão var 6")
1184
+ out_18 = gr.Plot(label="Gráfico Dispersão var 7")
1185
+ out_19 = gr.Plot(label="Gráfico Dispersão var 8")
1186
+ out_20 = gr.Plot(label="Gráfico Dispersão var 9")
1187
+ out_21 = gr.Plot(label="Gráfico Dispersão var 10")
1188
+ out_22 = gr.Plot(label="Gráfico Dispersão var 11")
1189
+ out_23 = gr.Plot(label="Gráfico Dispersão var 12")
1190
+ out_24 = gr.Plot(label="Gráfico Dispersão var 13")
1191
+ out_25 = gr.Plot(label="Gráfico Dispersão var 14")
1192
+ out_26 = gr.Plot(label="Gráfico Dispersão var 15")
1193
+ out_27 = gr.Plot(label="Gráfico Dispersão var 16")
1194
+ #out_28 = gr.Image(show_label=False)
1195
+ out_29 = gr.Plot(show_label=False)
1196
+ out_30 = gr.Dataframe(label="Avaliação", height=300)
1197
+ out_31 = gr.components.File(label="Resultado da Avaliação")
1198
+ out_32 = gr.components.File(label="Exportar Modelo")
1199
+ out_33 = gr.components.File(label="df_filtrado")
1200
+
1201
+ # outputs de verificação
1202
+ #out_off_1 = gr.Dataframe(label="X_aval", height=300)
1203
+ #out_off_2 = gr.Dataframe(label="X", height=300)
1204
+ #out_off_3 = gr.Dataframe(label="y", height=300)
1205
+ #out_off_4 = gr.components.File(label="X")
1206
+ #out_off_5 = gr.components.File(label="y")
1207
+
1208
+ inputs = [
1209
+ inp_1, inp_37, inp_2, inp_3, inp_4, inp_5, inp_6, inp_7, inp_8, inp_9, inp_10,
1210
+ inp_11, inp_12, inp_13, inp_14, inp_15, inp_16, inp_17, inp_18, inp_19, inp_20,
1211
+ inp_21, inp_22, inp_23, inp_24, inp_25, inp_26, inp_27, inp_28, inp_29, inp_30,
1212
+ inp_31, inp_32, inp_33, inp_34, inp_35, inp_36
1213
+ ]
1214
+
1215
+ outputs = [
1216
+ out_1, out_2, out_3, out_4, out_5, out_6, out_7, out_8, out_9, out_10,
1217
+ out_11, out_34, out_12, out_13, out_14, out_15, out_16, out_17, out_18, out_19, out_20,
1218
+ out_21, out_22, out_23, out_24, out_25, out_26, out_27, out_29, out_30,
1219
+ out_31, out_32, out_33
1220
+ ] #[out_off_1, out_off_2, out_off_3, out_off_4, out_off_5] , out_28
1221
+
1222
+ button_1.click(gera_model, inputs=inputs, outputs=outputs)
1223
+ button_2.click(gera_model, inputs=inputs, outputs=outputs)
1224
+ button_3.click(gera_model, inputs=inputs, outputs=outputs)
1225
+
1226
+ #--------------------------------------------#
1227
+ with gr.Tab("Carrega Modelo / Avaliação"):
1228
+ with gr.Row():
1229
+ with gr.Column():
1230
+ with gr.Row():
1231
+ #inp_1 = gr.File(label="Upload planilha (MODELO)", type="file", scale=1, height=100)
1232
+ inp_1 = gr.File(label="Upload planilha (MODELO)", type="filepath", scale=1, height=100)
1233
+ button = gr.Button("Calcular")
1234
+
1235
+ with gr.Column():
1236
+ out_1 = gr.Dataframe(label="Dados utilizados no modelo", height=300)
1237
+ #out_2 = gr.Dataframe(label="y", height=300)
1238
+ #out_3 = gr.Dataframe(label="X", height=300)
1239
+ out_4 = gr.Textbox(label="Resultados Gerais do Modelo", scale=1)
1240
+ out_5 = gr.HTML(label="Resultados por variável")
1241
+ #out_6 = gr.Dataframe(label="X_avalia", height=300)
1242
+ out_7 = gr.Dataframe(label="Planilha Avaliação", height=300)
1243
+ out_8 = gr.components.File(label="Resultado da Avaliação")
1244
+
1245
+ inputs = [inp_1]
1246
+
1247
+ outputs = [out_1, out_4, out_5, out_7, out_8] # outputs de verificação out_2, out_3, out_6
1248
+
1249
+ button.click(carrega_model, inputs=inputs, outputs=outputs)
1250
+
1251
+
1252
+ if __name__ == "__main__":
1253
+ interface.launch(debug=True)