Neste post detalho sobre os campos recebidos da API que possuem múltiplos valores e o código de separação em cada linha.
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.

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": 296959E 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_expandedApó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!

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