walacealves.mvn Posted May 30, 2022 Share Posted May 30, 2022 Olá vejam a tabela EDOCTIPOVALOR 02021AM28439.5 12018/60612AM1024811.0 22018/60612CF1158510.96 32019/13866AM380307.65 42019/13866CF1495193.7 enquanto o edoc for o mesmo(exenplo 2018/60612) preciso fazer uma operação, pegar o valor do tipo am e / pelo do cf, no ex será: 1024811.0/1158510.96= 0,88 e num novov dataframe exibir o edoc o valor da operação e compará-lo com a seguinte referencia <0,80 = ruim; >=0,81<= 0,85 = aceitável e; >0,86 bom. desta forma EDOC SITUAÇÃO STATUS 2018/60612 88% bom MUITO OBRIGADO Walace Link to comment Share on other sites More sharing options...
Pessoal da TecnoSpeed Thanael Posted June 3, 2022 Pessoal da TecnoSpeed Share Posted June 3, 2022 Olá @walacealves.mvn, tudo bem? Desculpa a demora para responder 😅, vou tentar lhe ajudar, fiquei um pouco com dúvida em relação a como é essa tabela, ela seria um dataframe? Código para criar este DataFrame, caso sua tabela já seja este DataFrame pode desconsiderar esse trecho de código abaixo. import pandas as pd tabela = ['02021AM28439.5', '12018/60612AM1024811.0', '22018/60612CF1158510.96', '32019/13866AM380307.65', '42019/13866CF1495193.7',] #Criar cada coluna edoc,tipo,valor = [],[],[] for item in tabela: #Criar uma tratativa para retirar o que queremos if item.find('AM') != -1: tipo_doc = 'AM' elif item.find('CF') != -1: tipo_doc = 'CF' # Armazenar a posição do tipo ou seja do AM ou CF index_tipo = item.find(tipo_doc) # Adicionar esses valores as suas respectivas listas tipo.append(tipo_doc) edoc.append(item[1 : index_tipo]) valor.append(item[index_tipo+2 :]) df = pd.DataFrame(data = {'edoc':edoc,'tipo':tipo,'valor':valor}) Esse DataFrame possui essa visualização. Código para realizar o que você pediu. # Obter os edoc que aparecem em mais registros lista = df['edoc'].value_counts() duplicados = lista[lista >= 2].keys() # Criar o DataFrame dos resultados. df_result = pd.DataFrame({'edoc':[],'situacao':[],'status':[]}) # Percorrer pelo edoc que possuem mais do 1 registro for edoc in duplicados: valores = [] # percorrer pelos registros cujo edoc sejam iguais for index, item in df[df['edoc']==edoc].iterrows(): # Armazenar os valores do AM e do CF valores.append(float(item['valor'])) resultado = valores[0] / valores[1] # Classificação para o status if resultado < 0.80: status = 'ruim' elif resultado >= 0.81 and resultado <= 0.85: status = 'aceitavel' elif resultado > 0.86: status = 'bom' df_result = df_result.append({'edoc':edoc,'situacao':resultado,'status':status},ignore_index=True) O resultado disto será: Caso queira deixar a situação em % basta alterar a ultima linha do código ali para df_result = df_result.append({'edoc':edoc,'situacao':f'{(resultado*100):.2f}%','status':status},ignore_index=True) é o resultado será Espero que isso resolva sua dúvida. Também estou a disposição para lhe ajudar caso fique com quaisquer dúvidas. 👍 1 Link to comment Share on other sites More sharing options...
walacealves.mvn Posted June 3, 2022 Author Share Posted June 3, 2022 2 minutos atrás, Thanael disse: Olá @walacealves.mvn, tudo bem? Desculpa a demora para responder 😅, vou tentar lhe ajudar, fiquei um pouco com dúvida em relação a como é essa tabela, ela seria um dataframe? Código para criar este DataFrame, caso sua tabela já seja este DataFrame pode desconsiderar esse trecho de código abaixo. import pandas as pd tabela = ['02021AM28439.5', '12018/60612AM1024811.0', '22018/60612CF1158510.96', '32019/13866AM380307.65', '42019/13866CF1495193.7',] #Criar cada coluna edoc,tipo,valor = [],[],[] for item in tabela: #Criar uma tratativa para retirar o que queremos if item.find('AM') != -1: tipo_doc = 'AM' elif item.find('CF') != -1: tipo_doc = 'CF' # Armazenar a posição do tipo ou seja do AM ou CF index_tipo = item.find(tipo_doc) # Adicionar esses valores as suas respectivas listas tipo.append(tipo_doc) edoc.append(item[1 : index_tipo]) valor.append(item[index_tipo+2 :]) df = pd.DataFrame(data = {'edoc':edoc,'tipo':tipo,'valor':valor}) Esse DataFrame possui essa visualização. Código para realizar o que você pediu. # Obter os edoc que aparecem em mais registros lista = df['edoc'].value_counts() duplicados = lista[lista >= 2].keys() # Criar o DataFrame dos resultados. df_result = pd.DataFrame({'edoc':[],'situacao':[],'status':[]}) # Percorrer pelo edoc que possuem mais do 1 registro for edoc in duplicados: valores = [] # percorrer pelos registros cujo edoc sejam iguais for index, item in df[df['edoc']==edoc].iterrows(): # Armazenar os valores do AM e do CF valores.append(float(item['valor'])) resultado = valores[0] / valores[1] # Classificação para o status if resultado < 0.80: status = 'ruim' elif resultado >= 0.81 and resultado <= 0.85: status = 'aceitavel' elif resultado > 0.86: status = 'bom' df_result = df_result.append({'edoc':edoc,'situacao':resultado,'status':status},ignore_index=True) O resultado disto será: Caso queira deixar a situação em % basta alterar a ultima linha do código ali para df_result = df_result.append({'edoc':edoc,'situacao':f'{(resultado*100):.2f}%','status':status},ignore_index=True) é o resultado será Espero que isso resolva sua dúvida. Também estou a disposição para lhe ajudar caso fique com quaisquer dúvidas. 👍 Muito obrigado, vou testar já! grande abraço Walace Link to comment Share on other sites More sharing options...
walacealves.mvn Posted June 22, 2022 Author Share Posted June 22, 2022 olá Thanael, tentei implementar e não deu certo, o código só fazia a operação nos edocs repetidos. coloquei todos que eram maior de 1 e mesmo assim não deu. estou te enviando o arquivo com todos od edocs que tenho. Pode me ajudar? abraços Walace testepython.xlsx Link to comment Share on other sites More sharing options...
Pessoal da TecnoSpeed Thanael Posted June 22, 2022 Pessoal da TecnoSpeed Share Posted June 22, 2022 Opa @walacealves.mvn tudo certo? Estou dando uma olhada aqui, realizei alguns testes abaixo. Este código abaixo é uma tratativa dos dados para criar um dataframe onde possa trabalhar. import pandas as pd df = pd.read_excel('testepython.xlsx') # Renomear as colunas df.columns = df.loc[1] # Obter somente as colunas corretas df = df.iloc[2:,[1,2,3,4,5,6,7]] Após esta tratativa dos dados, foi realizado a obtenção dos EDOC que possuem mais de 1 valor igual. # Criar lista com os EDOOC lista = df['EDOC'].value_counts() # Obter somente os que possuem duplicações duplicados = lista[lista >= 2].keys() Após isso criei uma função com os ifs para verificar a situação. def verifica_situacao(situacao): if situacao < 0.80: return 'ruim' elif situacao >= 0.81 and situacao <= 0.86: return 'aceitavel' elif situacao > 0.86: return 'bom' E criei o LOOP com os EDOC onde é realizado todo o processo para criar o dataframe dos resultados df_result = pd.DataFrame({'edoc':[],'situacao':[],'status':[]}) for duplicado in duplicados: edoc = duplicado #Obter o edoc df_edoc = df[df['EDOC'] == edoc] #Criar a situacao TRY por conta de existirem registros sem o CF, ou seja divisão por 0 try: # Obter a situação AM / CF e arredondar situacao = df_edoc[df_edoc['TIPO'] == 'AM']['VALOR'].sum() / df_edoc[df_edoc['TIPO'] == 'CF']['VALOR'].sum() situacao = round(situacao,2) # Obter o status status = verifica_situacao(situacao) # Caso CF seja 0 except: situacao = 'divisao por 0' status = 'divisao por 0' # Adiciona ao df_result df_result = df_result.append({'edoc':edoc,'situacao':situacao,'status':status},ignore_index=True) Com base nisso teremos o seguinte resultado. Lembrando que dentro do dataframe existem resultados cujo CF era 0, então neste dataframe aparecerão como 'divisao por 0'. Também existem registros onde vem muitos EDOC AM para poucos EDOC CF e vice versa. Vou deixar aqui em anexo o notebook com o código caso tu queira baixar e entender ou testar novas coisas, caso tenha ficado com alguma dúvida ficarei feliz em ajudar. 👍 walace.ipynb Link to comment Share on other sites More sharing options...
walacealves.mvn Posted June 29, 2022 Author Share Posted June 29, 2022 Em 22/06/2022 at 18:14, Thanael disse: Opa @walacealves.mvn tudo certo? Estou dando uma olhada aqui, realizei alguns testes abaixo. Este código abaixo é uma tratativa dos dados para criar um dataframe onde possa trabalhar. import pandas as pd df = pd.read_excel('testepython.xlsx') # Renomear as colunas df.columns = df.loc[1] # Obter somente as colunas corretas df = df.iloc[2:,[1,2,3,4,5,6,7]] Após esta tratativa dos dados, foi realizado a obtenção dos EDOC que possuem mais de 1 valor igual. # Criar lista com os EDOOC lista = df['EDOC'].value_counts() # Obter somente os que possuem duplicações duplicados = lista[lista >= 2].keys() Após isso criei uma função com os ifs para verificar a situação. def verifica_situacao(situacao): if situacao < 0.80: return 'ruim' elif situacao >= 0.81 and situacao <= 0.86: return 'aceitavel' elif situacao > 0.86: return 'bom' E criei o LOOP com os EDOC onde é realizado todo o processo para criar o dataframe dos resultados df_result = pd.DataFrame({'edoc':[],'situacao':[],'status':[]}) for duplicado in duplicados: edoc = duplicado #Obter o edoc df_edoc = df[df['EDOC'] == edoc] #Criar a situacao TRY por conta de existirem registros sem o CF, ou seja divisão por 0 try: # Obter a situação AM / CF e arredondar situacao = df_edoc[df_edoc['TIPO'] == 'AM']['VALOR'].sum() / df_edoc[df_edoc['TIPO'] == 'CF']['VALOR'].sum() situacao = round(situacao,2) # Obter o status status = verifica_situacao(situacao) # Caso CF seja 0 except: situacao = 'divisao por 0' status = 'divisao por 0' # Adiciona ao df_result df_result = df_result.append({'edoc':edoc,'situacao':situacao,'status':status},ignore_index=True) Com base nisso teremos o seguinte resultado. Lembrando que dentro do dataframe existem resultados cujo CF era 0, então neste dataframe aparecerão como 'divisao por 0'. Também existem registros onde vem muitos EDOC AM para poucos EDOC CF e vice versa. Vou deixar aqui em anexo o notebook com o código caso tu queira baixar e entender ou testar novas coisas, caso tenha ficado com alguma dúvida ficarei feliz em ajudar. 👍 walace.ipynb 12 kB · 1 download Oi Thanael deu tudo certo agora, pode sõ me esclarecer uma outra dúvida: é possível fazer um executável no pycharm utilizandoum arquivo com macro? Porque aquele arquivo que te envei, eu slavei só uma parte dele o original tem macros e eu queria fazer um executávl e li que no pycharm fica mais leve porque usa o ambiente virtual. abraços walace Link to comment Share on other sites More sharing options...
Pessoal da TecnoSpeed Thanael Posted June 29, 2022 Pessoal da TecnoSpeed Share Posted June 29, 2022 Olá Walace, tudo bem? Não possuo muito conhecimento em criar arquivos executáveis (.exe) pelo python, geralmente eu rodo o arquivo .py normal. Em relação ao Pycharm eu utilizei um pouco, porém como utilizo python mais focado em ciência de dados prefiro utilizar os notebooks (jupyter ou colab) por conta da execução por células. Poderia me explicar um pouco mais sobre esse arquivo com macro? não entendo muito sobre esse conceito, mas se você me explicar posso tentar lhe ajudar mesmo assim. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now