def todos_dados(): conn = jaydebeapi.connect("com.dremio.jdbc.Driver", "jdbc:dremio:direct=bdata01.tce.go.gov.br:31010", [usr_dremio, pswd_dremio], pathDremioJDBC) curs = conn.cursor() curs.execute(sqlEOF+' WHERE c."Exercício do orçamento (Ano)" >= 2015') nomeCampos = [i[0] for i in curs.description] df = pd.DataFrame(curs.fetchall(),columns=nomeCampos) pickles.criarPickle(df,"df") return df
def tratarDados(data, opcao): # Trata o nome das colunas para trabalhar melhor com os dados data.columns = [c.lower().replace(' ', '_') for c in data.columns] data.columns = [tratar_texto.removerCaracteresEspeciais(c)for c in data.columns] data.columns = [tratar_texto.tratarnomecolunas(c)for c in data.columns] identificador_empenho = pd.DataFrame(data['empenho_sequencial_empenho']) pickles.criarPickle(identificador_empenho,"modelos_tratamentos/identificador_empenho") # Deleta colunas que atraves de analise foram identificadas como nao uteis data = data.drop(['exercicio_do_orcamento_ano','classificacao_orcamentaria_descricao', 'natureza_despesa_nome', 'valor_estorno_anulacao_empenho','valor_anulacao_cancelamento_empenho', 'fonte_recurso_cod','elemento_despesa','grupo_despesa', 'empenho_sequencial_empenho'], axis='columns') # rotulo label = data['natureza_despesa_cod'] label = pd.DataFrame(label) data = data.drop('natureza_despesa_cod',axis = 1) # tfidf textoTratado = tratar_texto.cleanTextData(data["empenho_historico"]) # Função que gera o TF-IDF do texto tratado with open('pickles/modelos_tratamentos/tfidf_modelo'+'.pk', 'rb') as pickle_file: tfidf_modelo = pickle.load(pickle_file) tfidf = pd.DataFrame.sparse.from_spmatrix(tfidf_modelo.transform(textoTratado)) del textoTratado data = data.drop('empenho_historico',axis = 1) # Tratamento dos dados data = tratamento_especifico(data.copy()) # Normalizando colunas numéricas colunas = data.columns for col in colunas: if(data[col].dtype != "O"): with open('pickles/modelos_tratamentos/'+"normalization_"+col+'.pk', 'rb') as pickle_file: min_max_scaler = pickle.load(pickle_file) data[col] = pd.DataFrame(min_max_scaler.transform(data[col].values.reshape(-1,1))) # OHE data = one_hot_encoding.aplyOHE(data) if(opcao == "OHE"): return data, label elif(opcao == "tfidf"): return tfidf, label else: aux = sparse.hstack((csr_matrix(data),csr_matrix(tfidf) )) data = pd.DataFrame.sparse.from_spmatrix(aux) return data, label
def tratamentoDados(data, escolha): # Trata o nome das colunas para trabalhar melhor com os dados data.columns = [c.lower().replace(' ', '_') for c in data.columns] data.columns = [ tratar_texto.removerCaracteresEspeciais(c) for c in data.columns ] data.columns = [tratar_texto.tratarnomecolunas(c) for c in data.columns] data = filtro(data.copy()) # Deleta colunas que atraves de analise foram identificadas como nao uteis data = data.drop([ 'exercicio_do_orcamento_ano', 'classificacao_orcamentaria_descricao', 'natureza_despesa_nome', 'valor_estorno_anulacao_empenho', 'valor_anulacao_cancelamento_empenho', 'fonte_recurso_cod', 'elemento_despesa', 'grupo_despesa', 'empenho_sequencial_empenho' ], axis='columns') # Funcao que separa o rotulo do dataset e retorna as linhas com as naturezas de despesa que so aparecem em 1 empenho label, linhas_label_unica = tratar_label.tratarLabel(data) label = pd.DataFrame(label) # Excluindo as naturezas de despesas que so tem 1 empenho do dataset data = data.drop(linhas_label_unica, axis=0) data.reset_index(drop=True, inplace=True) del linhas_label_unica if (escolha == "dropar"): return data["analise"] if (escolha == "tfidf"): # Funcao que limpa o texto retira stopwords acentos pontuacao etc. textoTratado = tratar_texto.cleanTextData(data["empenho_historico"]) # Função que gera o TF-IDF do texto tratado tfidf = tratar_texto.calculaTFIDF(textoTratado) del textoTratado pickles.criarPickle(tfidf, 'tfidf') return 0 # Tratamento dos dados data = tratamento_especifico(data.copy()) # Normalizando colunas numéricas min_max_scaler = preprocessing.MinMaxScaler() colunas = data.columns for col in colunas: if (data[col].dtype != "O"): min_max_scaler.fit(data[col].values.reshape(-1, 1)) with open( 'pickles/modelos_tratamentos/' + "normalization_" + col + '.pk', 'wb') as fin: pickle.dump(min_max_scaler, fin) data[col] = pd.DataFrame( min_max_scaler.transform(data[col].values.reshape(-1, 1))) # Excluindo as colunas que ja foram tratadas data = data.drop(['empenho_historico', 'natureza_despesa_cod'], axis='columns') if (escolha == "OHE"): # Aplicando a estrategia One Hot Encoding data = one_hot_encoding.oneHotEncoding(data) #data = pd.concat([data,tfidf_beneficiario],axis = 1) pickles.criarPickle(data, 'data') pickles.criarPickle(label, 'label') else: return None
def range_dados(valor = 0, orgao = 0): conn = jaydebeapi.connect("com.dremio.jdbc.Driver", "jdbc:dremio:direct=bdata01.tce.go.gov.br:31010", [usr_dremio, pswd_dremio], pathDremioJDBC) curs = conn.cursor() # Se nao receber parametros avalia a ultima data (ultima data e o dia anterior) if(valor == 0): valor = (date.today()-timedelta(days=1)).strftime('%Y/%m/%d') valor = "\'"+valor+"\'" curs.execute(sqlEOF+' WHERE c."Período (Dia/Mes/Ano)" = dia'.replace("dia",valor)) elif("a" in valor and orgao !=0): inicio = valor.split(" ")[0] fim =valor.split(" ")[2] curs.execute(sqlEOF+' WHERE c."Período (Dia/Mes/Ano)" >= inicio and "Período (Dia/Mes/Ano)" <= fim and "Órgão (Código/Nome)" = orgao'.replace("inicio",inicio).replace("fim",fim).replace("orgao",orgao)) elif("a" in valor and orgao ==0): inicio = valor.split(" ")[0] fim =valor.split(" ")[2] curs.execute(sqlEOF+' WHERE c."Período (Dia/Mes/Ano)" >= inicio and "Período (Dia/Mes/Ano)" <= fim'.replace("inicio",inicio).replace("fim",fim)) elif(orgao ==0): curs.execute(sqlEOF+' WHERE c."Período (Dia/Mes/Ano)" = dia'.replace("dia",valor)) else: curs.execute(sqlEOF+' WHERE c."Período (Dia/Mes/Ano)" = dia and "Órgão (Código/Nome)" = orgao'.replace("dia",valor).replace("orgao",orgao)) nomeCampos = [i[0] for i in curs.description] df = pd.DataFrame(curs.fetchall(),columns=nomeCampos) pickles.criarPickle(df,"dados_teste") return df
def tratarDados(data, opcao = "visao dupla"): # Trata o nome das colunas para trabalhar melhor com os dados data.columns = [c.lower().replace(' ', '_') for c in data.columns] data.columns = [tratar_texto.removerCaracteresEspeciais(c)for c in data.columns] data.columns = [tratar_texto.tratarnomecolunas(c)for c in data.columns] identificador_empenho = pd.DataFrame(data['empenho_sequencial_empenho']) pickles.criarPickle(identificador_empenho,"modelos_tratamentos/identificador_empenho") # Deleta colunas que atraves de analise foram identificadas como nao uteis data = data.drop(['exercicio_do_orcamento_ano','classificacao_orcamentaria_descricao', 'natureza_despesa_nome', 'valor_estorno_anulacao_empenho','valor_anulacao_cancelamento_empenho', 'fonte_recurso_cod','elemento_despesa','grupo_despesa', 'empenho_sequencial_empenho'], axis='columns') # rotulo label = data['natureza_despesa_cod'] label = pd.DataFrame(label) if(opcao == "Modelo 2"): opcao = "OHE" else: data = data.drop('natureza_despesa_cod',axis = 1) # tfidf textoTratado = tratar_texto.cleanTextData(data["empenho_historico"]) # Função que gera o TF-IDF do texto tratado with open('pickles/modelos_tratamentos/tfidf_modelo'+'.pk', 'rb') as pickle_file: tfidf_modelo = pickle.load(pickle_file) tfidf = pd.DataFrame.sparse.from_spmatrix(tfidf_modelo.transform(textoTratado)) del textoTratado data = data.drop('empenho_historico',axis = 1) # Tratamento dos dados data = tratamento_especifico(data.copy()) # Tratando o beneficiario nome nome = [""]*data.shape[0] for i in range(data.shape[0]): if(data['pessoa_juridica'].iloc[i]): nome[i] = data["beneficiario_nome"].iloc[i] else: nome[i] = "pessoafisica" data["beneficiario_nome"] = nome # Tratando o campo beneficiario nome como texto livre e fazendo TFIDF texto_beneficiario = tratar_texto.cleanTextData(data["beneficiario_nome"]) with open('pickles/modelos_tratamentos/tfidf_beneficiario'+'.pk', 'rb') as pickle_file: tfidf_beneficiario = pickle.load(pickle_file) data_cv = tfidf_beneficiario.transform(texto_beneficiario) tfidf_beneficiario = pd.DataFrame.sparse.from_spmatrix(data_cv, columns = tfidf_beneficiario.get_feature_names()) data = data.drop("beneficiario_nome", axis='columns') pickles.criarPickle(tfidf_beneficiario,"dados_tfidf_beneficiario") # Normalizando colunas numéricas colunas = data.columns for col in colunas: if(data[col].dtype != "O"): with open('pickles/modelos_tratamentos/'+"normalization_"+col+'.pk', 'rb') as pickle_file: min_max_scaler = pickle.load(pickle_file) data[col] = pd.DataFrame(min_max_scaler.transform(data[col].values.reshape(-1,1))) # OHE if(opcao == "OHE"): data = one_hot_encoding.aplyOHE(data) tfidf_beneficiario = pickles.carregarPickle("dados_tfidf_beneficiario") data = pd.concat([data, tfidf_beneficiario], axis = 1) return data, label elif(opcao == "tfidf"): return tfidf, label else: data = one_hot_encoding.aplyOHE(data) tfidf_beneficiario = pickles.carregarPickle("dados_tfidf_beneficiario") data = pd.concat([data, tfidf_beneficiario], axis = 1) data = sparse.hstack((csr_matrix(data),csr_matrix(tfidf) )) data = pd.DataFrame.sparse.from_spmatrix(data) return data, label
del data_teste, label_teste label_treino.reset_index(drop=True, inplace=True) # Acha o melhor conjunto de hiperparametros para o algoritmo modelo_validado = SVC(kernel="linear", random_state=0) hiperparametros = {'C': [0.1, 1, 10, 100]} espalhamento = 3 melhor_c = refinamento_hiperparametros(data_treino, label_treino, modelo_validado, hiperparametros, espalhamento)["C"] modelo_validado = SVC(kernel="linear", random_state=0, C=melhor_c) modelo_validado.fit(data_validado, label_validado.values.ravel()) with open('pickles/modelos_tratamentos/modelo_SVM_validado.pk', 'wb') as fin: pickle.dump(modelo_validado, fin) # Salvando o rotulo validado pickles.criarPickle(label_validado, "label_validado") else: label = pickles.carregarPickle("label") label_validado = pickles.carregarPickle("label_validado") with open('pickles/modelos_tratamentos/modelo_SVM.pk', 'rb') as pickle_file: modelo = pickle.load(pickle_file) with open('pickles/modelos_tratamentos/modelo_SVM_validado.pk', 'rb') as pickle_file: modelo_validado = pickle.load(pickle_file) # Pega os novos dados if (len(sys.argv) == 1): dados_novos = range_dados() elif (len(sys.argv) == 3): dados_novos = range_dados(sys.argv[2])