Jump to content

Dúvida - iniciante


walacealves.mvn
 Compartilhar

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

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

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

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
 Compartilhar

  • Quem está online   0 Membros, 0 Anônimos, 4 Visitantes (Ver lista completa)

    • There are no registered users currently online


Sobre o Fórum

Este é um fórum para todos que fazem parte
do ecossistema de uma Software House!

Bem-vindo(a) ao fórum da Casa do Desenvolvedor, uma comunidade completa, onde desenvolvedores, software houses, profissionais de marketing, experiência e vendas, fornecedores de soluções, aficionados por inovação e tecnologia podem tirar dúvidas, compartilhar novidades e conhecimento, trocar experiências e até postar uns memes que só nós da tecnologia entendemos 😅

Crie agora sua conta e vamos juntos fortalecer
o desenvolvimento de software no Brasil! 🇧🇷

×
×
  • Create New...