import requests
import json
import pandas as pd
import numpy as np
from geopy import geocoders
from geopy.geocoders import Nominatim
r = requests.get('https://statsapi.web.nhl.com/api/v1/game/2019021017/feed/live')
def jprint(obj):
# create a formatted string of the Python JSON object
text = json.dumps(obj, sort_keys=True, indent=4)
print(text)
def geo(location):
g = geocoders.Nominatim(user_agent='MSGT_Lab5', timeout=None)
try:
loc = g.geocode(location)
return loc.latitude, loc.longitude
except:
return 0,0
x = r.json()
df = pd.DataFrame(x['liveData']['plays']['allPlays'])
df
data = x['liveData']['plays']['allPlays']
data
results_df = pd.json_normalize(data)
results_df
coords = df.iloc[:,2]
events = df.iloc[:,0][3:]
coords_df = pd.json_normalize(coords)
coords_df
event_df = pd.json_normalize(events)
latitude = []
longitude = []
for i in coords:
if coords_df['x'] is not None:
lat = coords_df['y']
lon = coords_df['x']
for i in [lat]:
latitude.append(i)
for i in [lon]:
longitude.append(i)
coordinates_df = pd.DataFrame(list(zip(results_df['result.event'],results_df['result.description'],lat,lon)), columns = ['Event','Description','Lat','Lon'])
coordinates_df = coordinates_df.dropna()
coordinates_df
coordinates_df.to_csv('events.csv', header = True, mode = 'a')
import plotly.graph_objects as go
import pandas as pd
import plotly.express as px
mapbox_access_token = open("mapbox_token.txt").read() # Create a local file with mapbox token
df = pd.read_csv('events.csv')
events_lat = df.Lat
events_lon = df.Lon
locations_name = df.Event
hits = df[df['Event'].str.contains('Hit')]
hits_lat = df[df['Event'].str.contains('Hit')]['Lat']
hits_lon = df[df['Event'].str.contains('Hit')]['Lon']
hits_text = df[df['Event'].str.contains('Hit')]['Event']
shots = df[df['Event'].str.contains('Shot')]
shots_lat = df[df['Event'].str.contains('Shot')]['Lat']
shots_lon = df[df['Event'].str.contains('Shot')]['Lon']
shots_text = df[df['Event'].str.contains('Shot')]['Event']
fig = go.Figure()
fig.add_trace(go.Scattermapbox(
lat=events_lat,
lon=events_lon,
mode='markers',
marker=go.scattermapbox.Marker(
size=17,
color='rgb(255, 0, 0)',
opacity=0.7
),
text=locations_name,
hoverinfo='text',
name="All Events"
))
fig.add_trace(go.Scattermapbox(
lat=hits_lat,
lon=hits_lon,
mode='markers',
marker=go.scattermapbox.Marker(
size=10,
color='rgb(255,255,0)',
opacity=0.7
),
text=hits_text,
hoverinfo='text',
name="Hits"
))
fig.add_trace(go.Scattermapbox(
lat=shots_lat,
lon=shots_lon,
mode='markers',
marker=go.scattermapbox.Marker(
size=10,
color='rgb(0, 0, 255)',
opacity=0.7
),
text=shots_text,
hoverinfo='text',
name="Shots"
))
fig.update_layout(
title='Events',
autosize=True,
hovermode='closest',
showlegend=True,
legend_title='<b> Layers </b>',
legend_orientation="h",
legend=dict(
x=.1,
y=1.2,
traceorder="normal",
font=dict(
family="sans-serif",
size=12,
color="black"
),
bgcolor="LightSteelBlue",
bordercolor="Black",
borderwidth=4
),
mapbox=dict(
accesstoken=mapbox_access_token,
bearing=0,
center=dict(
lat=0,
lon=0
),
pitch=0,
zoom=1,
style='mapbox://styles/isaacv/ck7aposk400za1ip6rwingtiz'
),
)
fig.show()
There are a number of things I can do from here:
-Can style each point based on their type of event
-Can display a media item based on the event
-Can group together the types of events and show them relative to time