Mais que um portfólio, um Blog Novos posts todos os dias Compartilhando conhecimento e aprendizados

#14 – Separando Múltiplos Valores em Linhas

Resumo

Neste post detalho sobre os campos recebidos da API que possuem múltiplos valores e o código de separação em cada linha.

Post 14 - Imagem Post

Resposta JSON com múltiplos valores

Para alguns casos, a resposta JSON da consulta à API do IGDB em alguns campos vinham com múltiplos valores. Por exemplo para o Counter-Strike, foi retornado da consulta múltiplos valores de empresas envolvidas e datas de lançamento.

[
    {
        "id": 241,
        "involved_companies": [
            5830,
            5831,
            211860
        ],
        "name": "Counter-Strike",
        "release_dates": [
            377412,
            296958,
            296959
        ],
    }
]

Nesses casos, os campos recebidos da API são armazenados como um único dado e são retornados apenas códigos / números. No caso, apenas com o valor não identificamos qual a data ou qual a empresa.

Portanto, esses códigos retornados são na verdade IDs a serem utilizados na consulta de outras APIs. Somente assim que teremos as informações no formato que conseguimos compreender.

No entanto, como são armazenados como um único dado, a informação seria:

"involved_companies":  [5830, 5831, 211860]
"release_dates":  [377412, 296958, 296959]

Caso fosse realizar a consulta API dessa maneira, daria erro pois o valor do dicionário / vetor inteiro seria enviado. O correto seria enviar um ID por vez:

"involved_companies":  5830
"involved_companies":  5831
"involved_companies":  211860

"release_dates":  377412
"release_dates":  296958
"release_dates":  296959

E essa separação por linhas de múltiplos valores que é o que o código abaixo faz, sem a necessidade de consultar a API.

#Tabelas Base para Relacional - não precisa de API, só retorna em linhas separadas as ids

#Opção de selecionar Tabela

#Auxiliar para o While
aux = 0

#Roda função até usuário selecionar tabela disponível.
while aux == 0:

    # Exibir opções para o usuário
    print("Escolha uma das tabelas abaixo:")

    #Exibe os valores no name de cada tabela
    for key, value in tabelas_config.items():
        print(f"{key}: {value['name']}")

    #Recebe valor selecionado pelo usuário
    tabela_id  = int(input("Digite o número da tabela desejada: "))

    #Verifica condição, Tabela 8 não está disponível
    #Se for 8, pede para usuário selecionar outra
    if (tabela_id == 8):
        print("Tabela não disponível. Selecione outra.")

    #Ao escolher uma das opções disponíveis
    else:
        #Salva em config
        config = tabelas_config[tabela_id]
        #Altera valor de aux para sair do loop
        aux = 1

#----------------------------------------------------------------------------------#

# Leitura dos arquivos
df_base = pd.read_csv(os.path.join(caminho_tabelas, config["base"]), sep=",", encoding='utf-8-sig')

#Para o df_base, pode ser que tenham ID_IGDB vazios (já consultados e salvos previamente).
#É aplicado a função lambda para não necessitar reconsulta de API, preenchendo o vazio por 'NA'
df_base['ID_IGDB'] = df_base['ID_IGDB'].apply(lambda x: str(x) if pd.notna(x) else 'NA')
df_base[config["colunas"]] = df_base[config["colunas"]].apply(lambda x: str(x) if pd.notna(x) else 'NA')

# Remove duplicados de base e atualizado
df_base = df_base.drop_duplicates(subset='ID_IGDB', keep='first')

#Faz a cópia para evitar perda de informações no df
df_base = df_base.copy()

#----------------------------------------------------------------------------------#

# Função para converter uma string para lista
# Garante que a coluna config["colunas"] esteja no formato correto (lista)
def safe_literal_eval(value):
    try:
        # Converte a string para uma lista
        return ast.literal_eval(value) if isinstance(value, str) else value
    except (ValueError, SyntaxError):
        # Se der erro, retorna como uma lista vazia
        #print(f"[Aviso] Valor inválido para conversão: {value}")
        return []

#----------------------------------------------------------------------------------#

# Função para expandir a coluna 'id_informação' em várias linhas
def expand_info_rows(df, coluna_df):
    # Cria nova lista de linhas para salvar informação provisóriamente
    expanded_rows = []
    for _, row in df.iterrows():
        # Para cada linha, expandir os valores de coluna_df
        for info in row[coluna_df]:
            expanded_rows.append({
                'ID_IGDB': row['ID_IGDB'],
                coluna_df: info
            })

    # Cria um novo DataFrame com as linhas expandidas
    expanded_df = pd.DataFrame(expanded_rows)
    return expanded_df

#----------------------------------------------------------------------------------#

# Chamada de função
df_base[config["colunas"]] = df_base[config["colunas"]].apply(safe_literal_eval)

# Chamada de função
df_expanded = expand_info_rows(df_base, config["colunas"])

#Salvar df para csv
df_expanded.to_csv(os.path.join(caminho_tabelas, config["rel"]), index=False, encoding='utf-8-sig')

df_expanded

Após essa separação que é feita a consulta à API das informações específicas como Datas de Lançamento, Empresas e Classificação Indicativa.

No próximo post irei explicar sobre o que foi feito com os dados ausentes recebidos das APIs.

Nos vemos no próximo post!

Gostou do Conteúdo? Compartilhe

Também pode te interessar:

Blog NanaData

Autora Blog NanaData

Naomi Oikawa

Analista de BI e dados.

Oi, eu sou a Naomi, mas me chamam de Nana (Naná). ADORO tecnologia, matemática, estatística, análises e AMO jogar e fazer artesanato como hobbies. Sou formada em Engenharia e estou fazendo uma especialização em Business Intelligence. Criei este Blog como um espaço para compartilhar meus projetos, descobertas e aprendizados na área de dados. Seja bem-vindo (a) – e boa leitura!

Posts Recentes

  • All Post
  • Aprendizados
  • Ferramentas
  • Hobbies
  • Jogos
  • Livros
  • Projetos
  • Sem categoria
    •   Back
    • Acadêmicos
    • Profissionais
    • Pessoais
    •   Back
    • Power BI
    • Python
    • Automação
    •   Back
    • Cursos
    • Experiências pessoais
    • Experiências profissionais
    •   Back
    • Lazer
    • Outros Hobbies
Edit Template

Sobre

Aqui compartilho minhas experiências, insights e pensamentos sobre meus projetos de Análise de Dados e BI. Espero que seja enriquecedor para você, assim como é para mim. Aproveite a leitura e se quiser, me siga para acompanhar cada postagem!

Blog NanaData – Copyright ® 2025 – Todos os Direitos Reservados.

© 2025 Created with Royal Elementor Addons

error: