Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Não está ocorrendo a fusão dos dados no script

Boa tarde, meu script quando roda não está fundindo os dados, vou colocar o código que escrevi, e depois uma foto de como fica no terminal quando roda. Estou na etapa: 05.Criando funções-> Combinando os dados

import json
import csv

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

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

def leitura_dados(path, tipo_arquivo):
    dados = []

if tipo_arquivo == 'csv': 
    dados = leitura_csv(path)

elif tipo_arquivo == 'json':
    dados = leitura_json(path)

return dados

def get_columns(dados):
    return list(dados[0].keys())    

def rename_columns(dados, key_mapping):
    new_dados_csv = []

for old_dict in dados:
    dict_temp = {}
    for old_key, value in old_dict.items():
        dict_temp[key_mapping[old_key]] = value
    new_dados_csv.append(dict_temp)
        
    return new_dados_csv

def size_data(dados):  
    return len(dados)

def join(dadosA, dadosB):
    combined_list = []
    combined_list.extend(dadosA)
    combined_list.extend(dadosB)
    return combined_list

path_json = 'data_raw/dados_empresaA.json'
path_csv = 'data_raw/dados_empresaB.csv'

Iniciando a Leitura

dados_json = leitura_dados(path_json, 'json')
nome_colunas_json = get_columns(dados_json)
tamanho_dados_json = size_data(dados_json)

print(f"Nome colunas dados json: {nome_colunas_json}")
print(f"Tamanho dos dados json: {tamanho_dados_json}")

dados_csv = leitura_dados(path_csv, 'csv')
nome_colunas_csv = get_columns(dados_csv)
tamanho_dados_csv = size_data(dados_csv)
print(nome_colunas_csv)
print(tamanho_dados_csv)

#Transformação dos dados
key_mapping = {'Nome do Item': 'Nome do Produto',
                            'Classificação do Produto': 'Categoria do Produto',
                            'Valor em Reais (R$)': 'Preço do Produto (R$)',
                            'Quantidade em Estoque': 'Quantidade em Estoque',
                            'Nome da Loja': 'Filial',
                            'Data da Venda': 'Data da Venda'}


dados_csv = rename_columns(dados_csv, key_mapping)
nome_colunas_csv = get_columns(dados_csv)
print(nome_colunas_csv)

dados_fusao = join(dados_json, dados_csv)
nome_colunas_fusao = get_columns(dados_fusao)
tamanho_dados_fusao = size_data(dados_fusao)
print(nome_colunas_fusao)
print(tamanho_dados_fusao)

O resultado que retorna é o seguinte: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta
solução!

Oii, Marcelo! Como você está?

Testei o seu código e realizei algumas modificações para que combinar os dados que queremos. Segue os passos feitos:

Primeira edição

  • 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

Segunda edição

  • 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 as duas partes dos códigos que você enviou para ver o retorno de dados_fusão. Segue a saída:

Nome colunas dados json: ['Nome do Produto', 'Categoria do Produto', 'Preço do Produto (R$)', 'Quantidade em Estoque', 'Filial']
Tamanho dos dados json: 3123
['Nome do Item', 'Classificação do Produto', 'Valor em Reais (R$)', 'Quantidade em Estoque', 'Nome da Loja', 'Data da Venda']
1323
['Nome do Produto', 'Categoria do Produto', 'Preço do Produto (R$)', 'Quantidade em Estoque', 'Filial', 'Data da Venda']
['Nome do Produto', 'Categoria do Produto', 'Preço do Produto (R$)', 'Quantidade em Estoque', 'Filial']
4446

Deixo aqui o link do notebook que usei para o teste:

Fique à vontade para copiar o código e realizar o teste em seu notebook, observe se funciona como esperado e qualquer dúvida, compartilhar no fórum para podermos te ajudar.

Bons estudos, Marcelo!