Jump to content

Dúvida - iniciante


walacealves.mvn

Postagens Recomendadas

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
Compartilhe em outros sites

  • Pessoal da TecnoSpeed

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

  • Curtir 1
Link to comment
Compartilhe em outros sites

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

Link to comment
Compartilhe em outros sites

  • 3 weeks later...
  • Pessoal da TecnoSpeed

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

Link to comment
Compartilhe em outros sites

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

Link to comment
Compartilhe em outros sites

  • Pessoal da TecnoSpeed

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
Compartilhe em outros sites

Crie uma conta ou entre para comentar 😀

Você precisa ser um membro para deixar um comentário.

Crie a sua conta

Participe da nossa comunidade, crie sua conta.
É bem rápido!

Criar minha conta agora

Entrar

Você já tem uma conta?
Faça o login agora.

Entrar agora


×
×
  • Create New...