My end goal is to create a pandas DataFrame
from a multilevel dict as seen in this tutorial . However, I am receiving a KeyError stating that one of the keys is not in the dict. Here is a subset of the multilevel dict:
{
"draftDetail": {
"drafted": True,
"inProgress": False
},
"gameId": 1,
"id": 862068,
"schedule": [
{
"away": {
"adjustment": 0.0,
"cumulativeScore": {
"losses": 0,
"statBySlot": NULL,
"ties": 0,
"wins": 0
},
"pointsByScoringPeriod": {
"1": 126.82
},
"teamId": 1,
"tiebreak": 0.0,
"totalPoints": 126.82
},
"home": {
"adjustment": 0.0,
"cumulativeScore": {
"losses": 0,
"statBySlot": NULL,
"ties": 0,
"wins": 0
},
"pointsByScoringPeriod": {
"1": 115.52
},
"teamId": 15,
"tiebreak": 0.0,
"totalPoints": 115.52
},
"id": 0,
"matchupPeriodId": 1,
"playoffTierType": "NULL",
"winner": "AWAY"
},
{
"away": {
"adjustment": 0.0,
"cumulativeScore": {
"losses": 0,
"statBySlot": NULL,
"ties": 0,
"wins": 0
},
"pointsByScoringPeriod": {
"1": 183.4
},
"teamId": 16,
"tiebreak": 0.0,
"totalPoints": 183.4
},
"home": {
"adjustment": 0.0,
"cumulativeScore": {
"losses": 0,
"statBySlot": NULL,
"ties": 0,
"wins": 0
},
"pointsByScoringPeriod": {
"1": 115.08
},
"teamId": 6,
"tiebreak": 0.0,
"totalPoints": 115.08
},
"id": 1,
"matchupPeriodId": 1,
"playoffTierType": "NULL",
"winner": "AWAY"
}
]
}
Then to create the df I'm using the below code:
df = [[
game['matchupPeriodId'],
game['home']['teamId'], game['home']['totalPoints'],
game['away']['teamId'], game['away']['totalPoints']
] for game in d['schedule']]
df = pd.DataFrame(df, columns=['Week', 'Team1', 'Score1', 'Team2', 'Score2', 'PlayoffTier'])
df.head()
However, I get this error:
Traceback (most recent call last):
File "<ipython-input-65-adda3411722d>", line 5, in <module>
] for game in d['schedule']]
File "<ipython-input-65-adda3411722d>", line 5, in <listcomp>
] for game in d['schedule']]
KeyError: 'away'
I've also tried to see if the key can be identified in the dict using:
if 'away' in d['schedule']:
print('will execute')
else:
print('wont execute')
which is returning wont execute.
Any suggestions on how to fix the error? For further context, I'm connecting to ESPN's Fantasy Football API to initially retrieve the data, and can share the code preceding the error.
Thanks in advance!
You'll have to handle what to do when there is no "away" key. This is caused by the playoff bracket having a bye for 2 teams:
import requests
import pprint
import pandas as pd
#set the leagueID and year info for ESPN league:
league_id = 123456 (example to not give out private league info)
year = 2019
#set the url with params and cookies:
url = "https://fantasy.espn.com/apis/v3/games/ffl/leagueHistory/" + \
str(league_id) + "?seasonId=" + str(year)
SWID = "{BF2E3A9D-093E-425E-B4A2-7DD5D4ABCAB1}"
Cookies = "AEB8LR5rfxLehSJOeku1TOugWAJfebsbk%2F5wBfrldGZ5svoy8Au1Ic%2BZX6P1y%2BWMcScgyoyuwvoRDv%2FqDfIAQRnjd9amDBSdk4Nze4hdTlTUFAa7Y9QJL4IAY0YNtrSPlFjVDGRugXRn309EpQeVWj5akI75GQjx%2FoGLtQ30UHzEdk4A8qBuxqjJ3oy9eIDPYOooncwVJ0AxbAAwuhSpqoEZOHwn8XAoCKyp4yU6H5HvyEGBUU9DiSHV6nvjLCZahWSAfd3TaY%2FMDQUutdaK5HcC"
#make request to API
r = requests.get(url, params={"view":"mMatchupScore"}, cookies={"swid":SWID, "espn_2": Cookies})
#set request as JSON
d = r.json()[0]
#explore JSON formatting
print(d)
#following the tutorial, create dataframe from MMatchScore end point:
#Option 1: insert the away key with teamId and totalPoints values of null
import numpy as np
for each in d['schedule']:
if 'away' not in each.keys():
each.update({'away': {'teamId':np.nan, 'totalPoints':np.nan}})
df = [[
game['matchupPeriodId'],
game['home']['teamId'], game['home']['totalPoints'],
game['away']['teamId'], game['away']['totalPoints'],
game['playoffTierType']
] for game in d['schedule']] #returning keyerror: 'away'
df = pd.DataFrame(df, columns=['Week', 'Team1', 'Score1', 'Team2', 'Score2', 'PlayoffTier'])
df['Type'] = ['Regular' if w<14 else 'Playoff' for w in df['Week']]
df.head()
df.shape
# Option 2: use a regular for loop in stead of list comprehension to deal with
# if "away" not in key
weekList = []
team1List = []
score1List = []
team2List = []
score2List = []
playoffTierList = []
for game in d['schedule']:
playoffTierList.append(game['playoffTierType'])
weekList.append(game['matchupPeriodId'])
team1List.append(game['home']['teamId'])
score1List.append(game['home']['totalPoints'])
if 'away' not in game.keys():
team2List.append(np.nan)
score2List.append(np.nan)
else:
team2List.append(game['away']['teamId'])
score2List.append(game['away']['totalPoints'])
df = pd.DataFrame({'Week':weekList, 'Team1':team1List, 'Score1': score1List,
'Team2':team2List, 'Score2':score2List, 'PlayoffTier':playoffTierList})
df['Type'] = ['Regular' if w<14 else 'Playoff' for w in df['Week']]
df.head()
df.shape
Output:
print (df)
Week Team1 Score1 Team2 Score2 PlayoffTier Type
0 1 15 115.52 1.0 126.82 NONE Regular
1 1 6 115.08 16.0 183.40 NONE Regular
2 1 2 155.32 5.0 129.60 NONE Regular
3 1 17 133.86 13.0 109.04 NONE Regular
4 1 11 107.26 7.0 133.02 NONE Regular
5 1 12 108.14 8.0 66.26 NONE Regular
6 2 1 106.66 16.0 157.06 NONE Regular
7 2 5 102.80 15.0 119.56 NONE Regular
8 2 2 116.38 6.0 121.72 NONE Regular
9 2 13 104.76 7.0 111.52 NONE Regular
10 2 8 104.30 17.0 118.30 NONE Regular
11 2 12 83.62 11.0 104.02 NONE Regular
12 3 5 92.20 1.0 131.20 NONE Regular
13 3 16 162.54 2.0 116.48 NONE Regular
14 3 15 153.64 6.0 131.22 NONE Regular
15 3 8 114.84 13.0 113.34 NONE Regular
16 3 7 141.06 12.0 114.02 NONE Regular
17 3 17 123.36 11.0 123.32 NONE Regular
18 4 1 122.58 2.0 142.18 NONE Regular
19 4 6 96.84 5.0 117.10 NONE Regular
20 4 15 92.70 16.0 137.72 NONE Regular
21 4 13 98.10 12.0 124.38 NONE Regular
22 4 11 84.20 8.0 153.10 NONE Regular
23 4 17 62.78 7.0 108.10 NONE Regular
24 5 6 116.24 1.0 139.14 NONE Regular
25 5 2 119.74 15.0 193.54 NONE Regular
26 5 5 158.88 16.0 115.62 NONE Regular
27 5 11 82.04 13.0 92.62 NONE Regular
28 5 12 139.00 17.0 121.90 NONE Regular
29 5 8 118.92 7.0 130.14 NONE Regular
.. ... ... ... ... ... ... ...
67 12 17 51.14 15.0 123.02 NONE Regular
68 12 7 125.68 16.0 119.52 NONE Regular
69 12 8 96.00 5.0 105.80 NONE Regular
70 12 12 165.98 2.0 128.06 NONE Regular
71 12 11 90.66 6.0 136.04 NONE Regular
72 13 15 108.24 13.0 81.44 NONE Regular
73 13 16 118.22 17.0 127.48 NONE Regular
74 13 5 109.90 7.0 82.22 NONE Regular
75 13 2 130.94 8.0 149.90 NONE Regular
76 13 6 105.86 12.0 91.50 NONE Regular
77 13 1 139.22 11.0 79.86 NONE Regular
78 14 7 148.16 NaN NaN WINNERS_BRACKET Playoff
79 14 16 125.16 1.0 76.00 WINNERS_BRACKET Playoff
80 14 5 153.42 6.0 120.96 WINNERS_BRACKET Playoff
81 14 15 144.68 NaN NaN WINNERS_BRACKET Playoff
82 14 2 149.00 8.0 90.10 LOSERS_CONSOLATION_LADDER Playoff
83 14 12 85.62 17.0 129.72 LOSERS_CONSOLATION_LADDER Playoff
84 14 11 91.34 13.0 67.16 LOSERS_CONSOLATION_LADDER Playoff
85 15 7 182.56 16.0 165.62 WINNERS_BRACKET Playoff
86 15 15 148.62 5.0 136.62 WINNERS_BRACKET Playoff
87 15 1 88.42 6.0 99.48 WINNERS_CONSOLATION_LADDER Playoff
88 15 2 136.68 17.0 121.90 LOSERS_CONSOLATION_LADDER Playoff
89 15 8 145.04 11.0 112.60 LOSERS_CONSOLATION_LADDER Playoff
90 15 12 125.40 13.0 123.02 LOSERS_CONSOLATION_LADDER Playoff
91 16 7 123.42 15.0 80.16 WINNERS_BRACKET Playoff
92 16 5 109.40 16.0 123.40 WINNERS_CONSOLATION_LADDER Playoff
93 16 1 128.94 6.0 128.96 WINNERS_CONSOLATION_LADDER Playoff
94 16 2 102.02 8.0 99.26 LOSERS_CONSOLATION_LADDER Playoff
95 16 12 83.74 17.0 151.46 LOSERS_CONSOLATION_LADDER Playoff
96 16 11 84.46 13.0 80.04 LOSERS_CONSOLATION_LADDER Playoff
[97 rows x 7 columns]
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.