Jump to content

walacealves.mvn

Membros
  • Contagem de Conteúdo

    4
  • Ingressou

  • Última visita

Postagens postado por walacealves.mvn

  1. 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]] 

    image.png

    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()

    image.png     image.png

    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.

    image.png

    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

  2. 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

  3. 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.

    image.png

    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á:  image.png 

    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á image.png

    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

  4. 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

×
×
  • Create New...