Как сгладить данные JSON формата ответа Gand Pandascore E-Sports, чтобы получить очень чистый фрейм данных в пандах? - PullRequest
1 голос
/ 13 апреля 2019

Я пытаюсь получить хороший файл данных PANDAS из файла JSON, который я получил от REST API PandaScore.Я понимаю, что для этого мне нужно сгладить значения, содержащие списки и словари, но я получаю ошибки.

По этой причине я не был уверен, как именно поступить.Что касается кадра данных, который я получаю от непосредственного чтения файла JSON в пандах, я получаю это.Data Frame Part 1 Data Frame Part 2 Как видно из выходных данных, столбцы содержат списки объектов JSON, и поэтому я хочу сгладить эти списки и объекты, чтобы окончательный кадр данных выглядел гораздо более чистыми интерпретируемый.

Если для этого нужен исходный файл JSON, вы можете получить его здесь. CSGO команды JSON-файла Сначала я использовал curl для вызова API-интерфейса PandaScore, чтобы получить массив объектов JSON для первой страницы команд Counter-Strike Global Offensive.Ответ JSON выглядит следующим образом.

REST API Response

Я все еще плохо знаком с работой с curl, поэтому я не был уверен, как сохранить этот ответ в файлнемедленно, поэтому я просто скопировал ответ и поместил его в файл JSON.После этого;однако формат был не таким, каким я его представлял, поэтому я в итоге отправил содержимое ответа в файле в красиво отформатированный JSON, используя jq в терминале.

После этого я получил файл JSON, который теперь выглядит следующим образом:

JSON Part 1 JSON Part 2 JSON Part 3 Я понимаю, что для сглаживания файла JSON в pandas, вы можете использовать функцию нормализации json из pandas, но я не был уверен, как заставить это работать.Чтобы получить форму словаря, я попытался использовать модуль JSON в Python, чтобы получить словарь, а затем передать этот словарь функции, но он не работал.Я также попытался прочитать исходный кадр данных из панд, используя следующее.

import json 
# Experiment 1
data = str(open("data/cs-go-teams.json")) 
dataDict = json.loads(data)  
import pandas as pd 
from pandas.io.json import normalize_json
# Experiment 2 
data = pd.read_json("cs-go-teams.json") 
dataDict = data.to_dict()
normalizedData = normalize_json(dataDict)

Ошибка 1: Error 1 Ошибка 2: Error 2

Я догадываюсь, что что-то не так в форматировании файла JSON, которое вызывает эту проблему.

Если это что-то еще, я был бы рад узнать из вашего опыта и опыта, как вырасти как разработчик, работающий с данными JSON.

Кроме этих двух экспериментов, я также изучал, как выполнить дальнейшее выравнивание для более сложных структур JSON-объектов.Статья о Medium, написанная Амиром Цзяем, предоставляет пользовательскую функцию, которая рекурсивно выравнивает списки и словари, вложенные в объект.Если это поможет, я предоставлю эту статью в качестве ссылки для вашего удобства.

Средний Артикул

Это все, что я делал до сих пор.Сообщество Stackoverflow, я активно ищу вашу помощь, чтобы выяснить мои недостатки в понимании всего этого процесса от сбора данных до формата JSON и до того, как работает уплощение.

Ответы [ 3 ]

2 голосов
/ 13 апреля 2019
import json 
import pandas as pd 
from pandas.io.json import json_normalize

with open('cs-go-teams.json', 'rb') as file:
    df = json.load(file)

players_data = json_normalize(df, record_path = 'players', meta = ['acronym', 'id','image_url','name','slug'],  meta_prefix = 'team_')

Откройте файл, загрузите его в df, затем изучите данные игроков, затем добавьте данные команды каждому игроку. Вам просто нужно изменить путь к файлу в операторе open ().

1 голос
/ 13 апреля 2019

Спасибо за предоставленный пример JSON.Код ниже работал, чтобы преобразовать его в панд DataFrame.Это без использования функции import json.

# Import Libraries
import numpy as np
import pandas as pd

# Set null equal to None
null = None

Присвойте json переменной

Обратите внимание, что это список, в котором есть несколько словарей.

data = data = [
  {
    "slug": "infinity-esports-cs-go",
    "players": [
      {
        "slug": "cruzn",
        "role": null,
        "name": "CruzN",
        "last_na
...
]

Приведенный ниже код анализирует json и вложенный json для вставки кадра данных

При необходимости столбцы могут быть переименованы

# Create empty lists
list_slug, list_players, list_name, list_image_url, list_id, list_current_videogame, list_acronym = [], [], [], [], [], [], []
df = pd.DataFrame()
for i in range (len(data)):
    list_slug.append(data[i]['slug'])
    list_players.append(data[i]['players'])
    list_name.append(data[i]['name'])
    list_image_url.append(data[i]['image_url'])
    list_current_videogame.append(data[i]['current_videogame'])
    list_acronym.append(data[i]['acronym'])
    list_id.append(data[i]['id'])
    #temp['players'] = data[i]['players']
    #print(data[i]['slug'])


    # Create dataframe for 'current_videogame'
    tvid = pd.DataFrame({'current_videogame_slug':[data[i]['current_videogame']['slug']],
                     'current_videogame_name':[data[i]['current_videogame']['name']],
                     'current_videogame_id':[data[i]['current_videogame']['id']]
                    })
    tvid['flag']=data[i]['slug']

    # Create dataframe for 'players'
    tplayer = pd.DataFrame(data[i]['players'])
    tplayer.columns = ['players_' + str(col) for col in tplayer.columns]
    tplayer['flag'] = data[i]['slug']

    # Merge 'current_videogame' and 'players'
    tjoin = pd.merge(tplayer, tvid, on='flag', how='outer')

    # Merge with main dataframe
    temp = pd.DataFrame({'slug':list_slug, 'name':list_name, 'image_url':list_image_url,'acronym': list_acronym, 'id':id})
    temp2 = pd.merge(temp, tjoin, left_on='slug', right_on='flag', how='outer')

    df = df.append(temp2)
    df = df.drop(columns=['flag'])

Вывод:

enter image description here

0 голосов
/ 13 апреля 2019

это может быть среди ошибок, которые превышены параметром errors='ignore' функции json_normalize - проверьте документы здесь .это доступно только для pandas версии> = 0,20, поэтому проверьте свою версию (pd.__version__)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...