4
respostas

[Dúvida] Atributo dados não está sendo chamado pelo DadosB [Novo tópico]

Dando continuidade no tópico do @Hermeson

Eu estou enfrentando o mesmo problema e, com o código semelhante.

import json
import csv

class Dados:

    def __init__(self, path, tipo_dados):
        self.path = path
        self.tipo_dados = tipo_dados
        self.dados = self.leitura_dados()
        self.nome_colunas = self.get_columns()
        self.qtd_linhas = self.size_data()

        # leitura json
    def leitura_json(self):
        dados_json = []
        with open(self.path, 'r') as file:
            dados_json = json.load(file)
        return dados_json

    # leitura csv
    def leitura_csv(self):
        dados_csv = []
        with open(self.path, 'r') as file:
            spamreader = csv.DictReader(file, delimiter=',')
            for row in spamreader:
                dados_csv.append(row)
        return dados_csv

    # criando a funcao que irá juntar as duas demais funcoes
    def leitura_dados(self):
        dados = []

        if self.tipo_dados == 'csv':
            dados = self.leitura_csv()
        elif self.tipo_dados == 'json':
            dados = self.leitura_json()
        elif self.tipo_dados == 'list':
            dados = self.path
            self.path = 'lista em memoria'
        
        return dados
    
    # criando a funcao para listar as colunas
    def get_columns (self):
        return list(self.dados[-1].keys())
    
    # funcao para renomear colunas do arquivo csv
    def rename_columns(self, key_mapping):
        new_dados = []

        for old_dict in self.dados:
            dict_temp = {}
            for old_key, value in old_dict.items():
                dict_temp[key_mapping[old_key]] = value
        new_dados.append(dict_temp)
    
        self.dados = new_dados
        self.nome_colunas = self.get_columns()

    # funcao para calculo do tamanho dos arquivos - quantidade de registros
    def size_data(self):
        return len(self.dados)
    
    # funcao para unir os dois arquivos
    def join (dadosA, dadosB):
        combined_list = []
        combined_list.extend(dadosA.dados)
        combined_list.extend(dadosB.dados)
        
        return Dados(combined_list, 'list')

e quando executo, retorna apenas os dados da empresa A, não da B.

dados_fusao = Dados.join(dados_empresaA, dados_empresaB)
# print(dados_fusao)

print(dados_fusao.qtd_linhas)
print(dados_fusao.nome_colunas) 

retornando

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

4 respostas

Oii, Rafael! Como você está?

A causa dos dados da empresa B não aparecerem podem ter vários motivos, os dois mais comuns são: a junção das duas empresas e a não inicialização dos dados da empresa B.

Sendo assim, recomendo que revise se os dados da empresa B estão sendo inicializados certinho para que os dados sejam carregados. E outra sugestão é tentar uma alternativa de código para o join. Tente adicionar um operador para concatenar as listas e aplicar o decorador @sataticmethod antes de def join (dadosA, dadosB.

Espero que a sugestão te ajude. Caso o problema persista, peço que compartilhe o link do seu Github contendo o código completo para podermos buscar outras soluções.

Bons estudos e até mais!

Olá Nathalia, tudo joia! E com você?

Tentei aqui, mas nada ainda...

    # funcao para unir os dois arquivos
    @staticmethod
    def join (dadosA, dadosB):
        combined_list = []
        combined_list.extend(dadosA.dados)
        combined_list.extend(dadosB.dados)
        
        return Dados(combined_list,'list')

continuo recebendo o mesmo resultado.

Como seria a inicialização da empresa B, no caso?

Podem me ajudar? os dados estão salvos em: https://github.com/rafaelgustavofurlan/pipeline_dados

Oii, Rafael!

Peço desculpas pela demora, estava realizando alguns testes.

Para podermos ver os dados da empresaB, teremos que fazer alguns reajustes no código. Por aqui foi testado da seguinte maneira:

  • No Google Colab subi os arquivos da atividade, salvo com a extensão .csv e outro com .json.
  • Copie o seu código do arquivo processamento_dados.py e verifiquei se os nomes dos arquivos estavam corretos tanto no código quanto no upload para inicializar os dados certinho.

Captura de tela mostrando uma célula do código escrito: path_json = 'dados_empresaA.json' e path_csv = 'dados_empresaB.csv'. Na lateral esquerda da imagem, contém dois arquivos upados na seção de upload, chamados: dados_empresaA.json e dados_empresaB.csv

Tudo certo, vamos para a próxima parte!

  • Para que a quantidade de registros funcione, no qual unimos os dados da empresaAe empresaB, é preciso alterar o seu código das funções: rename_columns e get_columns.
    • Em def get_columns ficou assim:
def get_columns(self):
        colunas = set()
        for item in self.dados:
            colunas.update(item.keys())
        return list(colunas)

Traduzindo: Cria-se um conjunto vazio chamado colunas, itera-se sobre cada item em self.dados. Depois adiciona todas as chaves de cada item ao conjunto de colunas e retorna o conjunto convertido em lista. Coleta todas as chaves únicas presentes em um dicionário e retorna elas como lista.

  • E no rename_columns faremos o seguinte:
def rename_columns(self, key_mapping):
        new_dados = []
 
        for old_dict in self.dados:
            dict_temp = {}
            for old_key, value in old_dict.items():
                new_key = key_mapping.get(old_key, old_key)
                dict_temp[new_key] = value
            new_dados.append(dict_temp)
        
        self.dados = new_dados
        self.nome_colunas = self.get_columns()

Traduzindo: neste código renomeamos as colunas (chaves) dos dicionários em self.dados de acordo com a especificação dada no key_mapping, mantendo os valores originais.

Feito isso, rode a célula para ver o retorno de dados_fusão. Segue a saída:

O nome das colunas da empresa A são: ['Nome do Produto', 'Preço do Produto (R$)', 'Filial', 'Categoria do Produto', 'Quantidade em Estoque'].
A quantidade de registros da empresa A é de 3123 registros.
O nome das colunas da empresa B são: ['Valor em Reais (R$)', 'Data da Venda', 'Classificação do Produto', 'Nome da Loja', 'Nome do Item', 'Quantidade em Estoque'].
A quantidade de registros da empresa B é de 1323 registros.
['Nome do Produto', 'Preço do Produto (R$)', 'Filial', 'Categoria do Produto', 'Data da Venda', 'Quantidade em Estoque']
O nome das colunas da base fundida são: ['Nome do Produto', 'Preço do Produto (R$)', 'Filial', 'Categoria do Produto', 'Data da Venda', 'Quantidade em Estoque'].
A quantidade de registros da base fundida é de 4446 registros.

E, caso queira converter esses dados para um dataframe, podemos rodar o código seguinte:

import pandas as pd
 
df_fusao = pd.DataFrame(dados_fusao.dados)
 
df_fusao

Pronto, o df será gerado. Faça os testes por aí e observe se funciona como esperado. Deixo aqui o link do notebook com o teste:

Espero ter ajudado. Qualquer dúvida, conte conosco.

Bons estudos, Rafael!