Ответ API в виде списка для Pandas DataFrame

avatar
Tim R
8 августа 2021 в 20:21
152
1
0

У меня возникли проблемы с пониманием того, как анализировать значения из ответа API в виде списка для фрейма данных.

Ответ API 'games' представляет собой список, но он очень похож на JSON. В других примерах мне удалось создать файл dict. Этот список имеет несколько уровней, и создать диктофон не так просто. Я учусь на ходу и буду признателен за любую помощь.

Ссылка: https://github.com/CFBD/cfbd-python/blob/master/docs/GamesApi.md#get_team_game_stats

Питон

from __future__ import print_function
import time
import cfbd
from cfbd.rest import ApiException
from pprint import pprint
import pandas as pd
from pandas.io.json import json_normalize
import json
import numpy as np
from datetime import datetime

# Configure API key authorization: ApiKeyAuth
configuration = cfbd.Configuration()
configuration.api_key['Authorization'] = 'xxxxxx'
configuration.api_key_prefix['Authorization'] = 'Bearer'
api_instance = cfbd.BettingApi(cfbd.ApiClient(configuration))

now = datetime.now()
start_year = 2020
end_year = now.year

for x,y in zip(range(start_year, end_year), range(1, 18)):
    year = x # int | Year filter
    week = y # int | Week filter (optional)

    try:
        api_instance = cfbd.GamesApi(cfbd.ApiClient(configuration))
        games = api_instance.get_team_game_stats(year=year, week=week)
        #game_stats_df = pd.DataFrame.from_records([dict(id = g.id, conference = g.conference, homeAway = g.homeAway) for g in games])

    except ApiException as e:
        print("Exception when calling BettingApi->get_calendar: %s\n" % e)

Ответ API

 {'id': 401238035,
 'teams': [{'conference': None,
            'homeAway': 'away',
            'points': 35,
            'school': 'Central Arkansas',
            'stats': [{'category': 'tacklesForLoss', 'stat': '8'},
                      {'category': 'defensiveTDs', 'stat': '1'},
                      {'category': 'tackles', 'stat': '61'},
                      {'category': 'sacks', 'stat': '0'},
                      {'category': 'qbHurries', 'stat': '1'},
                      {'category': 'passesDeflected', 'stat': '0'},
                      {'category': 'fumblesRecovered', 'stat': '2'},
                      {'category': 'rushingTDs', 'stat': '1'},
                      {'category': 'puntReturnYards', 'stat': '2'},
                      {'category': 'puntReturnTDs', 'stat': '0'},
                      {'category': 'puntReturns', 'stat': '2'},
                      {'category': 'passingTDs', 'stat': '3'},
                      {'category': 'kickReturnYards', 'stat': '116'},
                      {'category': 'kickReturnTDs', 'stat': '0'},
                      {'category': 'kickReturns', 'stat': '4'},
                      {'category': 'kickingPoints', 'stat': '5'},
                      {'category': 'interceptionYards', 'stat': '34'},
                      {'category': 'interceptionTDs', 'stat': '0'},
                      {'category': 'passesIntercepted', 'stat': '1'},
                      {'category': 'interceptions', 'stat': '1'},
                      {'category': 'fumblesLost', 'stat': '2'},
                      {'category': 'turnovers', 'stat': '3'},
                      {'category': 'totalPenaltiesYards', 'stat': '0-0'},
                      {'category': 'yardsPerRushAttempt', 'stat': '4.8'},
                      {'category': 'rushingAttempts', 'stat': '21'},
                      {'category': 'rushingYards', 'stat': '100'},
                      {'category': 'yardsPerPass', 'stat': '4.2'},
                      {'category': 'completionAttempts', 'stat': '25-46'},
                      {'category': 'netPassingYards', 'stat': '193'},
                      {'category': 'totalYards', 'stat': '293'},
                      {'category': 'fourthDownEff', 'stat': '0-0'},
                      {'category': 'thirdDownEff', 'stat': '0-0'},
                      {'category': 'firstDowns', 'stat': '0'}]},
           {'conference': 'Conference USA',
            'homeAway': 'home',
            'points': 45,
            'school': 'UAB',
            'stats': [{'category': 'tacklesForLoss', 'stat': '5'},
                      {'category': 'defensiveTDs', 'stat': '0'},
                      {'category': 'tackles', 'stat': '39'},
                      {'category': 'sacks', 'stat': '2'},
                      {'category': 'qbHurries', 'stat': '5'},
                      {'category': 'passesDeflected', 'stat': '5'},
                      {'category': 'fumblesRecovered', 'stat': '2'},
                      {'category': 'rushingTDs', 'stat': '3'},
                      {'category': 'puntReturnYards', 'stat': '-2'},
                      {'category': 'puntReturnTDs', 'stat': '0'},
                      {'category': 'puntReturns', 'stat': '1'},
                      {'category': 'passingTDs', 'stat': '3'},
                      {'category': 'kickReturnYards', 'stat': '49'},
                      {'category': 'kickReturnTDs', 'stat': '0'},
                      {'category': 'kickReturns', 'stat': '3'},
                      {'category': 'kickingPoints', 'stat': '9'},
                      {'category': 'interceptionYards', 'stat': '19'},
                      {'category': 'interceptionTDs', 'stat': '0'},
                      {'category': 'passesIntercepted', 'stat': '1'},
                      {'category': 'interceptions', 'stat': '1'},
                      {'category': 'fumblesLost', 'stat': '2'},
                      {'category': 'turnovers', 'stat': '3'},
                      {'category': 'totalPenaltiesYards', 'stat': '0-0'},
                      {'category': 'yardsPerRushAttempt', 'stat': '4.8'},
                      {'category': 'rushingAttempts', 'stat': '49'},
                      {'category': 'rushingYards', 'stat': '233'},
                      {'category': 'yardsPerPass', 'stat': '6.6'},
                      {'category': 'completionAttempts', 'stat': '24-34'},
                      {'category': 'netPassingYards', 'stat': '226'},
                      {'category': 'totalYards', 'stat': '459'},
                      {'category': 'fourthDownEff', 'stat': '0-0'},
                      {'category': 'thirdDownEff', 'stat': '0-0'},
                      {'category': 'firstDowns', 'stat': '0'}]}]}]
Источник

Ответы (1)

avatar
thenarfer
8 августа 2021 в 20:56
0

Вчера я пытался помочь другому человеку. Решением может быть использование импорта json_normalize следующим образом: from pandas import json_normalize

Мне удалось немного подчистить ответ API с помощью https://jsonformatter.curiousconcept.com. В котором также говорится, что это данные RFC 8259 (ничего не знаю об этом, но, возможно, это поможет):

data = {
   "id":401238035,
   "teams":[
      {
         "conference":"None",
         "homeAway":"away",
         "points":35,
         "school":"Central Arkansas",
         "stats":[
            {
               "category":"tacklesForLoss",
               "stat":"8"
            },
            {
               "category":"defensiveTDs",
               "stat":"1"
            },
            {
               "category":"tackles",
               "stat":"61"
            },
            {
               "category":"sacks",
               "stat":"0"
            },
            {
               "category":"qbHurries",
               "stat":"1"
            },
            {
               "category":"passesDeflected",
               "stat":"0"
            },
            {
               "category":"fumblesRecovered",
               "stat":"2"
            },
            {
               "category":"rushingTDs",
               "stat":"1"
            },
            {
               "category":"puntReturnYards",
               "stat":"2"
            },
            {
               "category":"puntReturnTDs",
               "stat":"0"
            },
            {
               "category":"puntReturns",
               "stat":"2"
            },
            {
               "category":"passingTDs",
               "stat":"3"
            },
            {
               "category":"kickReturnYards",
               "stat":"116"
            },
            {
               "category":"kickReturnTDs",
               "stat":"0"
            },
            {
               "category":"kickReturns",
               "stat":"4"
            },
            {
               "category":"kickingPoints",
               "stat":"5"
            },
            {
               "category":"interceptionYards",
               "stat":"34"
            },
            {
               "category":"interceptionTDs",
               "stat":"0"
            },
            {
               "category":"passesIntercepted",
               "stat":"1"
            },
            {
               "category":"interceptions",
               "stat":"1"
            },
            {
               "category":"fumblesLost",
               "stat":"2"
            },
            {
               "category":"turnovers",
               "stat":"3"
            },
            {
               "category":"totalPenaltiesYards",
               "stat":"0-0"
            },
            {
               "category":"yardsPerRushAttempt",
               "stat":"4.8"
            },
            {
               "category":"rushingAttempts",
               "stat":"21"
            },
            {
               "category":"rushingYards",
               "stat":"100"
            },
            {
               "category":"yardsPerPass",
               "stat":"4.2"
            },
            {
               "category":"completionAttempts",
               "stat":"25-46"
            },
            {
               "category":"netPassingYards",
               "stat":"193"
            },
            {
               "category":"totalYards",
               "stat":"293"
            },
            {
               "category":"fourthDownEff",
               "stat":"0-0"
            },
            {
               "category":"thirdDownEff",
               "stat":"0-0"
            },
            {
               "category":"firstDowns",
               "stat":"0"
            }
         ]
      },
      {
         "conference":"Conference USA",
         "homeAway":"home",
         "points":45,
         "school":"UAB",
         "stats":[
            {
               "category":"tacklesForLoss",
               "stat":"5"
            },
            {
               "category":"defensiveTDs",
               "stat":"0"
            },
            {
               "category":"tackles",
               "stat":"39"
            },
            {
               "category":"sacks",
               "stat":"2"
            },
            {
               "category":"qbHurries",
               "stat":"5"
            },
            {
               "category":"passesDeflected",
               "stat":"5"
            },
            {
               "category":"fumblesRecovered",
               "stat":"2"
            },
            {
               "category":"rushingTDs",
               "stat":"3"
            },
            {
               "category":"puntReturnYards",
               "stat":"-2"
            },
            {
               "category":"puntReturnTDs",
               "stat":"0"
            },
            {
               "category":"puntReturns",
               "stat":"1"
            },
            {
               "category":"passingTDs",
               "stat":"3"
            },
            {
               "category":"kickReturnYards",
               "stat":"49"
            },
            {
               "category":"kickReturnTDs",
               "stat":"0"
            },
            {
               "category":"kickReturns",
               "stat":"3"
            },
            {
               "category":"kickingPoints",
               "stat":"9"
            },
            {
               "category":"interceptionYards",
               "stat":"19"
            },
            {
               "category":"interceptionTDs",
               "stat":"0"
            },
            {
               "category":"passesIntercepted",
               "stat":"1"
            },
            {
               "category":"interceptions",
               "stat":"1"
            },
            {
               "category":"fumblesLost",
               "stat":"2"
            },
            {
               "category":"turnovers",
               "stat":"3"
            },
            {
               "category":"totalPenaltiesYards",
               "stat":"0-0"
            },
            {
               "category":"yardsPerRushAttempt",
               "stat":"4.8"
            },
            {
               "category":"rushingAttempts",
               "stat":"49"
            },
            {
               "category":"rushingYards",
               "stat":"233"
            },
            {
               "category":"yardsPerPass",
               "stat":"6.6"
            },
            {
               "category":"completionAttempts",
               "stat":"24-34"
            },
            {
               "category":"netPassingYards",
               "stat":"226"
            },
            {
               "category":"totalYards",
               "stat":"459"
            },
            {
               "category":"fourthDownEff",
               "stat":"0-0"
            },
            {
               "category":"thirdDownEff",
               "stat":"0-0"
            },
            {
               "category":"firstDowns",
               "stat":"0"
            }
         ]
      }
   ]
}

Возможно, это поможет:

import json
import pandas as pd
from pandas import json_normalize

new_data = data['teams'][0]

dict_data = dict(new_data)

result = json_normalize(new_data, ['stats'], record_prefix='_', errors='ignore')

result 

Вывод:

_category _stat
0 tacklesForLoss 8
1 оборонительные ТД 1
2 снасти 61
3 мешки 0
4 qbHurries 1
5 пасы отклонены 0
6 fumblesRecovered 2
7 rushingTDs 1
8 puntReturnYards 2
9 puntReturnTDs 0
10 puntReturns 2
11 прохождение TD 3
12 kickReturnYards 116
13 kickReturnTDs 0
14 kickReturns 4
15 kickingPoints 5
16 ярды перехвата 34
17 перехватTDs 0
18 passesIntercepted 1
19 перехваты 1
20 fumblesLost 2
21 оборот 3
22 общее количество пенальтиярдов 0-0
23 ярдовPerRushAttempt 4,8
24 спешные попытки 21
25 мчащиеся ярды 100
26 ярдов на проход 4.2
27 завершениеПопытки 25-46
28 netPassingYards 193
29 общее количество ярдов 293
30 четвертыйDownEff 0-0
31 третийDownEff 0-0
32 firstDowns 0
Tim R
8 августа 2021 в 23:04
0

Я думаю, что моя главная путаница в том, что данные возвращаются в виде списка типов. games = api_instance.get_team_game_stats(year=year, week=week) type(games) <class 'list'> Я попробовал предложенное вами и получил следующую ошибку: Traceback (последний последний вызов): файл "test4.py", строка 34, в <module> new_data = games['teams'][0] TypeError: индексы списка должны быть целыми числами или фрагментами, а не st. Я работал с JSON в подобных сценариях и никогда не сталкивался с этой проблемой.