DavidSB commited on
Commit
a1bf7ac
1 Parent(s): 3545dc0

Create app.py

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