import requests
import json
= requests.get('https://api-web.nhle.com/v1/standings/now') # pull data
test = test.text # get just the data
test_data = json.loads(test_data) # parse the JSON data into a Python dictionary
parse_json print(json.dumps(parse_json, indent=4)) # print the new dictionary object
Today we’re going to practice Python coding and API usage by exploring data for the National Hockey League.
While watching my favorite team this year (the Philadelphia Flyers), I’ve felt like I barely know the players. It seems like there was a lot of turnover in the roster over the past couple of years.
Can we quantify this roster turnover? Which seasons did the Flyers roster experience the most turnover?
To answer this question, we will turn to the NHL’s own stats database. Unfortunately, we can only download 50 records at a time using their nice web browser interface. So instead, we’ll need to use an Application Programming Interface, or API.
Fortunately, some folks have put together nice documentation here and here for the NHL API.
To start, we’ll use the requests
and json
Python libraries. Make sure you have them installed.
Let’s do a toy example where we pull the current NHL standings. I’m pulling heavily from this tutorial.
{
"wildCardIndicator": false,
"standings": [
{
"conferenceAbbrev": "W",
"conferenceHomeSequence": 4,
"conferenceL10Sequence": 1,
"conferenceName": "Western",
"conferenceRoadSequence": 2,
"conferenceSequence": 1,
"date": "2024-01-06",
"divisionAbbrev": "C",
"divisionHomeSequence": 2,
"divisionL10Sequence": 1,
"divisionName": "Central",
"divisionRoadSequence": 1,
"divisionSequence": 1,
"gameTypeId": 2,
"gamesPlayed": 38,
"goalDifferential": 34,
"goalDifferentialPctg": 0.894737,
"goalAgainst": 92,
"goalFor": 126,
"goalsForPctg": 3.315789,
"homeGamesPlayed": 20,
"homeGoalDifferential": 19,
"homeGoalsAgainst": 51,
"homeGoalsFor": 70,
"homeLosses": 5,
"homeOtLosses": 2,
"homePoints": 28,
"homeRegulationPlusOtWins": 13,
"homeRegulationWins": 13,
"homeTies": 0,
"homeWins": 13,
"l10GamesPlayed": 10,
"l10GoalDifferential": 17,
"l10GoalsAgainst": 18,
"l10GoalsFor": 35,
"l10Losses": 0,
"l10OtLosses": 2,
"l10Points": 18,
"l10RegulationPlusOtWins": 8,
"l10RegulationWins": 8,
"l10Ties": 0,
"l10Wins": 8,
"leagueHomeSequence": 4,
"leagueL10Sequence": 1,
"leagueRoadSequence": 5,
"leagueSequence": 1,
"losses": 9,
"otLosses": 4,
"placeName": {
"default": "Winnipeg"
},
"pointPctg": 0.710526,
"points": 54,
"regulationPlusOtWinPctg": 0.657895,
"regulationPlusOtWins": 25,
"regulationWinPctg": 0.605263,
"regulationWins": 23,
"roadGamesPlayed": 18,
"roadGoalDifferential": 15,
"roadGoalsAgainst": 41,
"roadGoalsFor": 56,
"roadLosses": 4,
"roadOtLosses": 2,
"roadPoints": 26,
"roadRegulationPlusOtWins": 12,
"roadRegulationWins": 10,
"roadTies": 0,
"roadWins": 12,
"seasonId": 20232024,
"shootoutLosses": 1,
"shootoutWins": 0,
"streakCode": "W",
"streakCount": 5,
"teamName": {
"default": "Winnipeg Jets",
"fr": "Jets de Winnipeg"
},
"teamCommonName": {
"default": "Jets"
},
"teamAbbrev": {
"default": "WPG"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/WPG_light.svg",
"ties": 0,
"waiversSequence": 31,
"wildcardSequence": 0,
"winPctg": 0.657895,
"wins": 25
},
{
"conferenceAbbrev": "E",
"conferenceHomeSequence": 1,
"conferenceL10Sequence": 4,
"conferenceName": "Eastern",
"conferenceRoadSequence": 2,
"conferenceSequence": 1,
"date": "2024-01-06",
"divisionAbbrev": "M",
"divisionHomeSequence": 1,
"divisionL10Sequence": 3,
"divisionName": "Metropolitan",
"divisionRoadSequence": 1,
"divisionSequence": 1,
"gameTypeId": 2,
"gamesPlayed": 37,
"goalDifferential": 24,
"goalDifferentialPctg": 0.648649,
"goalAgainst": 102,
"goalFor": 126,
"goalsForPctg": 3.405405,
"homeGamesPlayed": 18,
"homeGoalDifferential": 11,
"homeGoalsAgainst": 53,
"homeGoalsFor": 64,
"homeLosses": 5,
"homeOtLosses": 0,
"homePoints": 26,
"homeRegulationPlusOtWins": 12,
"homeRegulationWins": 11,
"homeTies": 0,
"homeWins": 13,
"l10GamesPlayed": 10,
"l10GoalDifferential": 13,
"l10GoalsAgainst": 24,
"l10GoalsFor": 37,
"l10Losses": 3,
"l10OtLosses": 0,
"l10Points": 14,
"l10RegulationPlusOtWins": 7,
"l10RegulationWins": 5,
"l10Ties": 0,
"l10Wins": 7,
"leagueHomeSequence": 5,
"leagueL10Sequence": 9,
"leagueRoadSequence": 3,
"leagueSequence": 2,
"losses": 10,
"otLosses": 1,
"placeName": {
"default": "NY Rangers"
},
"pointPctg": 0.716216,
"points": 53,
"regulationPlusOtWinPctg": 0.675676,
"regulationPlusOtWins": 25,
"regulationWinPctg": 0.567568,
"regulationWins": 21,
"roadGamesPlayed": 19,
"roadGoalDifferential": 13,
"roadGoalsAgainst": 49,
"roadGoalsFor": 62,
"roadLosses": 5,
"roadOtLosses": 1,
"roadPoints": 27,
"roadRegulationPlusOtWins": 13,
"roadRegulationWins": 10,
"roadTies": 0,
"roadWins": 13,
"seasonId": 20232024,
"shootoutLosses": 1,
"shootoutWins": 1,
"streakCode": "W",
"streakCount": 1,
"teamName": {
"default": "New York Rangers",
"fr": "Rangers de New York"
},
"teamCommonName": {
"default": "Rangers"
},
"teamAbbrev": {
"default": "NYR"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/NYR_light.svg",
"ties": 0,
"waiversSequence": 32,
"wildcardSequence": 0,
"winPctg": 0.702703,
"wins": 26
},
{
"conferenceAbbrev": "W",
"conferenceHomeSequence": 1,
"conferenceL10Sequence": 3,
"conferenceName": "Western",
"conferenceRoadSequence": 5,
"conferenceSequence": 2,
"date": "2024-01-06",
"divisionAbbrev": "C",
"divisionHomeSequence": 1,
"divisionL10Sequence": 2,
"divisionName": "Central",
"divisionRoadSequence": 3,
"divisionSequence": 2,
"gameTypeId": 2,
"gamesPlayed": 40,
"goalDifferential": 21,
"goalDifferentialPctg": 0.525,
"goalAgainst": 127,
"goalFor": 148,
"goalsForPctg": 3.7,
"homeGamesPlayed": 21,
"homeGoalDifferential": 28,
"homeGoalsAgainst": 63,
"homeGoalsFor": 91,
"homeLosses": 5,
"homeOtLosses": 0,
"homePoints": 32,
"homeRegulationPlusOtWins": 16,
"homeRegulationWins": 15,
"homeTies": 0,
"homeWins": 16,
"l10GamesPlayed": 10,
"l10GoalDifferential": 8,
"l10GoalsAgainst": 33,
"l10GoalsFor": 41,
"l10Losses": 2,
"l10OtLosses": 1,
"l10Points": 15,
"l10RegulationPlusOtWins": 7,
"l10RegulationWins": 5,
"l10Ties": 0,
"l10Wins": 7,
"leagueHomeSequence": 1,
"leagueL10Sequence": 5,
"leagueRoadSequence": 13,
"leagueSequence": 3,
"losses": 12,
"otLosses": 3,
"placeName": {
"default": "Colorado"
},
"pointPctg": 0.6625,
"points": 53,
"regulationPlusOtWinPctg": 0.6,
"regulationPlusOtWins": 24,
"regulationWinPctg": 0.55,
"regulationWins": 22,
"roadGamesPlayed": 19,
"roadGoalDifferential": -7,
"roadGoalsAgainst": 64,
"roadGoalsFor": 57,
"roadLosses": 7,
"roadOtLosses": 3,
"roadPoints": 21,
"roadRegulationPlusOtWins": 8,
"roadRegulationWins": 7,
"roadTies": 0,
"roadWins": 9,
"seasonId": 20232024,
"shootoutLosses": 1,
"shootoutWins": 1,
"streakCode": "L",
"streakCount": 1,
"teamName": {
"default": "Colorado Avalanche",
"fr": "Avalanche du Colorado"
},
"teamCommonName": {
"default": "Avalanche"
},
"teamAbbrev": {
"default": "COL"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/COL_light.svg",
"ties": 0,
"waiversSequence": 27,
"wildcardSequence": 0,
"winPctg": 0.625,
"wins": 25
},
{
"conferenceAbbrev": "E",
"conferenceHomeSequence": 3,
"conferenceL10Sequence": 7,
"conferenceName": "Eastern",
"conferenceRoadSequence": 3,
"conferenceSequence": 2,
"date": "2024-01-06",
"divisionAbbrev": "A",
"divisionHomeSequence": 1,
"divisionL10Sequence": 3,
"divisionName": "Atlantic",
"divisionRoadSequence": 2,
"divisionSequence": 1,
"gameTypeId": 2,
"gamesPlayed": 37,
"goalDifferential": 25,
"goalDifferentialPctg": 0.675676,
"goalAgainst": 98,
"goalFor": 123,
"goalsForPctg": 3.324324,
"homeGamesPlayed": 17,
"homeGoalDifferential": 15,
"homeGoalsAgainst": 42,
"homeGoalsFor": 57,
"homeLosses": 3,
"homeOtLosses": 3,
"homePoints": 25,
"homeRegulationPlusOtWins": 10,
"homeRegulationWins": 9,
"homeTies": 0,
"homeWins": 11,
"l10GamesPlayed": 10,
"l10GoalDifferential": 4,
"l10GoalsAgainst": 31,
"l10GoalsFor": 35,
"l10Losses": 3,
"l10OtLosses": 2,
"l10Points": 12,
"l10RegulationPlusOtWins": 4,
"l10RegulationWins": 4,
"l10Ties": 0,
"l10Wins": 5,
"leagueHomeSequence": 8,
"leagueL10Sequence": 16,
"leagueRoadSequence": 4,
"leagueSequence": 4,
"losses": 8,
"otLosses": 6,
"placeName": {
"default": "Boston"
},
"pointPctg": 0.702703,
"points": 52,
"regulationPlusOtWinPctg": 0.567568,
"regulationPlusOtWins": 21,
"regulationWinPctg": 0.513514,
"regulationWins": 19,
"roadGamesPlayed": 20,
"roadGoalDifferential": 10,
"roadGoalsAgainst": 56,
"roadGoalsFor": 66,
"roadLosses": 5,
"roadOtLosses": 3,
"roadPoints": 27,
"roadRegulationPlusOtWins": 11,
"roadRegulationWins": 10,
"roadTies": 0,
"roadWins": 12,
"seasonId": 20232024,
"shootoutLosses": 0,
"shootoutWins": 2,
"streakCode": "L",
"streakCount": 1,
"teamName": {
"default": "Boston Bruins",
"fr": "Bruins de Boston"
},
"teamCommonName": {
"default": "Bruins"
},
"teamAbbrev": {
"default": "BOS"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/BOS_light.svg",
"ties": 0,
"waiversSequence": 30,
"wildcardSequence": 0,
"winPctg": 0.621622,
"wins": 23
},
{
"conferenceAbbrev": "E",
"conferenceHomeSequence": 5,
"conferenceL10Sequence": 1,
"conferenceName": "Eastern",
"conferenceRoadSequence": 1,
"conferenceSequence": 3,
"date": "2024-01-06",
"divisionAbbrev": "A",
"divisionHomeSequence": 3,
"divisionL10Sequence": 1,
"divisionName": "Atlantic",
"divisionRoadSequence": 1,
"divisionSequence": 2,
"gameTypeId": 2,
"gamesPlayed": 39,
"goalDifferential": 24,
"goalDifferentialPctg": 0.615385,
"goalAgainst": 99,
"goalFor": 123,
"goalsForPctg": 3.153846,
"homeGamesPlayed": 17,
"homeGoalDifferential": 10,
"homeGoalsAgainst": 46,
"homeGoalsFor": 56,
"homeLosses": 5,
"homeOtLosses": 0,
"homePoints": 24,
"homeRegulationPlusOtWins": 12,
"homeRegulationWins": 11,
"homeTies": 0,
"homeWins": 12,
"l10GamesPlayed": 10,
"l10GoalDifferential": 16,
"l10GoalsAgainst": 22,
"l10GoalsFor": 38,
"l10Losses": 2,
"l10OtLosses": 0,
"l10Points": 16,
"l10RegulationPlusOtWins": 8,
"l10RegulationWins": 8,
"l10Ties": 0,
"l10Wins": 8,
"leagueHomeSequence": 10,
"leagueL10Sequence": 3,
"leagueRoadSequence": 1,
"leagueSequence": 5,
"losses": 12,
"otLosses": 2,
"placeName": {
"default": "Florida",
"fr": "Floride"
},
"pointPctg": 0.666667,
"points": 52,
"regulationPlusOtWinPctg": 0.641026,
"regulationPlusOtWins": 25,
"regulationWinPctg": 0.589744,
"regulationWins": 23,
"roadGamesPlayed": 22,
"roadGoalDifferential": 14,
"roadGoalsAgainst": 53,
"roadGoalsFor": 67,
"roadLosses": 7,
"roadOtLosses": 2,
"roadPoints": 28,
"roadRegulationPlusOtWins": 13,
"roadRegulationWins": 12,
"roadTies": 0,
"roadWins": 13,
"seasonId": 20232024,
"shootoutLosses": 1,
"shootoutWins": 0,
"streakCode": "W",
"streakCount": 7,
"teamName": {
"default": "Florida Panthers",
"fr": "Panthers de la Floride"
},
"teamCommonName": {
"default": "Panthers"
},
"teamAbbrev": {
"default": "FLA"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/FLA_light.svg",
"ties": 0,
"waiversSequence": 28,
"wildcardSequence": 0,
"winPctg": 0.641026,
"wins": 25
},
{
"conferenceAbbrev": "W",
"conferenceHomeSequence": 2,
"conferenceL10Sequence": 5,
"conferenceName": "Western",
"conferenceRoadSequence": 4,
"conferenceSequence": 3,
"date": "2024-01-06",
"divisionAbbrev": "P",
"divisionHomeSequence": 1,
"divisionL10Sequence": 3,
"divisionName": "Pacific",
"divisionRoadSequence": 2,
"divisionSequence": 1,
"gameTypeId": 2,
"gamesPlayed": 38,
"goalDifferential": 45,
"goalDifferentialPctg": 1.184211,
"goalAgainst": 98,
"goalFor": 143,
"goalsForPctg": 3.763158,
"homeGamesPlayed": 19,
"homeGoalDifferential": 33,
"homeGoalsAgainst": 43,
"homeGoalsFor": 76,
"homeLosses": 4,
"homeOtLosses": 1,
"homePoints": 29,
"homeRegulationPlusOtWins": 14,
"homeRegulationWins": 13,
"homeTies": 0,
"homeWins": 14,
"l10GamesPlayed": 10,
"l10GoalDifferential": 11,
"l10GoalsAgainst": 25,
"l10GoalsFor": 36,
"l10Losses": 2,
"l10OtLosses": 2,
"l10Points": 14,
"l10RegulationPlusOtWins": 6,
"l10RegulationWins": 6,
"l10Ties": 0,
"l10Wins": 6,
"leagueHomeSequence": 2,
"leagueL10Sequence": 8,
"leagueRoadSequence": 11,
"leagueSequence": 6,
"losses": 11,
"otLosses": 3,
"placeName": {
"default": "Vancouver"
},
"pointPctg": 0.671053,
"points": 51,
"regulationPlusOtWinPctg": 0.631579,
"regulationPlusOtWins": 24,
"regulationWinPctg": 0.605263,
"regulationWins": 23,
"roadGamesPlayed": 19,
"roadGoalDifferential": 12,
"roadGoalsAgainst": 55,
"roadGoalsFor": 67,
"roadLosses": 7,
"roadOtLosses": 2,
"roadPoints": 22,
"roadRegulationPlusOtWins": 10,
"roadRegulationWins": 10,
"roadTies": 0,
"roadWins": 10,
"seasonId": 20232024,
"shootoutLosses": 1,
"shootoutWins": 0,
"streakCode": "L",
"streakCount": 1,
"teamName": {
"default": "Vancouver Canucks",
"fr": "Canucks de Vancouver"
},
"teamCommonName": {
"default": "Canucks"
},
"teamAbbrev": {
"default": "VAN"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/VAN_light.svg",
"ties": 0,
"waiversSequence": 29,
"wildcardSequence": 0,
"winPctg": 0.631579,
"wins": 24
},
{
"conferenceAbbrev": "W",
"conferenceHomeSequence": 5,
"conferenceL10Sequence": 6,
"conferenceName": "Western",
"conferenceRoadSequence": 3,
"conferenceSequence": 4,
"date": "2024-01-06",
"divisionAbbrev": "C",
"divisionHomeSequence": 3,
"divisionL10Sequence": 3,
"divisionName": "Central",
"divisionRoadSequence": 2,
"divisionSequence": 3,
"gameTypeId": 2,
"gamesPlayed": 37,
"goalDifferential": 19,
"goalDifferentialPctg": 0.513514,
"goalAgainst": 116,
"goalFor": 135,
"goalsForPctg": 3.648649,
"homeGamesPlayed": 20,
"homeGoalDifferential": 11,
"homeGoalsAgainst": 70,
"homeGoalsFor": 81,
"homeLosses": 6,
"homeOtLosses": 2,
"homePoints": 26,
"homeRegulationPlusOtWins": 11,
"homeRegulationWins": 6,
"homeTies": 0,
"homeWins": 12,
"l10GamesPlayed": 10,
"l10GoalDifferential": 8,
"l10GoalsAgainst": 32,
"l10GoalsFor": 40,
"l10Losses": 2,
"l10OtLosses": 2,
"l10Points": 14,
"l10RegulationPlusOtWins": 6,
"l10RegulationWins": 3,
"l10Ties": 0,
"l10Wins": 6,
"leagueHomeSequence": 7,
"leagueL10Sequence": 10,
"leagueRoadSequence": 10,
"leagueSequence": 7,
"losses": 10,
"otLosses": 5,
"placeName": {
"default": "Dallas"
},
"pointPctg": 0.662162,
"points": 49,
"regulationPlusOtWinPctg": 0.540541,
"regulationPlusOtWins": 20,
"regulationWinPctg": 0.405405,
"regulationWins": 15,
"roadGamesPlayed": 17,
"roadGoalDifferential": 8,
"roadGoalsAgainst": 46,
"roadGoalsFor": 54,
"roadLosses": 4,
"roadOtLosses": 3,
"roadPoints": 23,
"roadRegulationPlusOtWins": 9,
"roadRegulationWins": 9,
"roadTies": 0,
"roadWins": 10,
"seasonId": 20232024,
"shootoutLosses": 1,
"shootoutWins": 2,
"streakCode": "OT",
"streakCount": 1,
"teamName": {
"default": "Dallas Stars",
"fr": "Stars de Dallas"
},
"teamCommonName": {
"default": "Stars"
},
"teamAbbrev": {
"default": "DAL"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/DAL_light.svg",
"ties": 0,
"waiversSequence": 26,
"wildcardSequence": 0,
"winPctg": 0.594595,
"wins": 22
},
{
"conferenceAbbrev": "W",
"conferenceHomeSequence": 3,
"conferenceL10Sequence": 14,
"conferenceName": "Western",
"conferenceRoadSequence": 6,
"conferenceSequence": 5,
"date": "2024-01-06",
"divisionAbbrev": "P",
"divisionHomeSequence": 2,
"divisionL10Sequence": 7,
"divisionName": "Pacific",
"divisionRoadSequence": 3,
"divisionSequence": 2,
"gameTypeId": 2,
"gamesPlayed": 39,
"goalDifferential": 18,
"goalDifferentialPctg": 0.461538,
"goalAgainst": 110,
"goalFor": 128,
"goalsForPctg": 3.282051,
"homeGamesPlayed": 19,
"homeGoalDifferential": 20,
"homeGoalsAgainst": 45,
"homeGoalsFor": 65,
"homeLosses": 4,
"homeOtLosses": 2,
"homePoints": 28,
"homeRegulationPlusOtWins": 10,
"homeRegulationWins": 9,
"homeTies": 0,
"homeWins": 13,
"l10GamesPlayed": 10,
"l10GoalDifferential": -13,
"l10GoalsAgainst": 41,
"l10GoalsFor": 28,
"l10Losses": 7,
"l10OtLosses": 0,
"l10Points": 6,
"l10RegulationPlusOtWins": 3,
"l10RegulationWins": 2,
"l10Ties": 0,
"l10Wins": 3,
"leagueHomeSequence": 3,
"leagueL10Sequence": 30,
"leagueRoadSequence": 15,
"leagueSequence": 8,
"losses": 12,
"otLosses": 5,
"placeName": {
"default": "Vegas"
},
"pointPctg": 0.628205,
"points": 49,
"regulationPlusOtWinPctg": 0.461538,
"regulationPlusOtWins": 18,
"regulationWinPctg": 0.410256,
"regulationWins": 16,
"roadGamesPlayed": 20,
"roadGoalDifferential": -2,
"roadGoalsAgainst": 65,
"roadGoalsFor": 63,
"roadLosses": 8,
"roadOtLosses": 3,
"roadPoints": 21,
"roadRegulationPlusOtWins": 8,
"roadRegulationWins": 7,
"roadTies": 0,
"roadWins": 9,
"seasonId": 20232024,
"shootoutLosses": 1,
"shootoutWins": 4,
"streakCode": "L",
"streakCount": 2,
"teamName": {
"default": "Vegas Golden Knights",
"fr": "Golden Knights de Vegas"
},
"teamCommonName": {
"default": "Golden Knights"
},
"teamAbbrev": {
"default": "VGK"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/VGK_light.svg",
"ties": 0,
"waiversSequence": 24,
"wildcardSequence": 0,
"winPctg": 0.564103,
"wins": 22
},
{
"conferenceAbbrev": "E",
"conferenceHomeSequence": 6,
"conferenceL10Sequence": 2,
"conferenceName": "Eastern",
"conferenceRoadSequence": 6,
"conferenceSequence": 4,
"date": "2024-01-06",
"divisionAbbrev": "M",
"divisionHomeSequence": 3,
"divisionL10Sequence": 1,
"divisionName": "Metropolitan",
"divisionRoadSequence": 3,
"divisionSequence": 2,
"gameTypeId": 2,
"gamesPlayed": 39,
"goalDifferential": 16,
"goalDifferentialPctg": 0.410256,
"goalAgainst": 120,
"goalFor": 136,
"goalsForPctg": 3.487179,
"homeGamesPlayed": 16,
"homeGoalDifferential": 10,
"homeGoalsAgainst": 51,
"homeGoalsFor": 61,
"homeLosses": 3,
"homeOtLosses": 3,
"homePoints": 23,
"homeRegulationPlusOtWins": 10,
"homeRegulationWins": 8,
"homeTies": 0,
"homeWins": 10,
"l10GamesPlayed": 10,
"l10GoalDifferential": 14,
"l10GoalsAgainst": 28,
"l10GoalsFor": 42,
"l10Losses": 1,
"l10OtLosses": 3,
"l10Points": 15,
"l10RegulationPlusOtWins": 6,
"l10RegulationWins": 6,
"l10Ties": 0,
"l10Wins": 6,
"leagueHomeSequence": 14,
"leagueL10Sequence": 4,
"leagueRoadSequence": 8,
"leagueSequence": 9,
"losses": 13,
"otLosses": 4,
"placeName": {
"default": "Carolina",
"fr": "Caroline"
},
"pointPctg": 0.615385,
"points": 48,
"regulationPlusOtWinPctg": 0.538462,
"regulationPlusOtWins": 21,
"regulationWinPctg": 0.461538,
"regulationWins": 18,
"roadGamesPlayed": 23,
"roadGoalDifferential": 6,
"roadGoalsAgainst": 69,
"roadGoalsFor": 75,
"roadLosses": 10,
"roadOtLosses": 1,
"roadPoints": 25,
"roadRegulationPlusOtWins": 11,
"roadRegulationWins": 10,
"roadTies": 0,
"roadWins": 12,
"seasonId": 20232024,
"shootoutLosses": 2,
"shootoutWins": 1,
"streakCode": "W",
"streakCount": 5,
"teamName": {
"default": "Carolina Hurricanes",
"fr": "Hurricanes de la Caroline"
},
"teamCommonName": {
"default": "Hurricanes"
},
"teamAbbrev": {
"default": "CAR"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/CAR_light.svg",
"ties": 0,
"waiversSequence": 22,
"wildcardSequence": 0,
"winPctg": 0.564103,
"wins": 22
},
{
"conferenceAbbrev": "W",
"conferenceHomeSequence": 13,
"conferenceL10Sequence": 11,
"conferenceName": "Western",
"conferenceRoadSequence": 1,
"conferenceSequence": 6,
"date": "2024-01-06",
"divisionAbbrev": "P",
"divisionHomeSequence": 6,
"divisionL10Sequence": 5,
"divisionName": "Pacific",
"divisionRoadSequence": 1,
"divisionSequence": 3,
"gameTypeId": 2,
"gamesPlayed": 35,
"goalDifferential": 32,
"goalDifferentialPctg": 0.914286,
"goalAgainst": 87,
"goalFor": 119,
"goalsForPctg": 3.4,
"homeGamesPlayed": 19,
"homeGoalDifferential": 1,
"homeGoalsAgainst": 56,
"homeGoalsFor": 57,
"homeLosses": 7,
"homeOtLosses": 5,
"homePoints": 19,
"homeRegulationPlusOtWins": 7,
"homeRegulationWins": 7,
"homeTies": 0,
"homeWins": 7,
"l10GamesPlayed": 10,
"l10GoalDifferential": 0,
"l10GoalsAgainst": 27,
"l10GoalsFor": 27,
"l10Losses": 4,
"l10OtLosses": 2,
"l10Points": 10,
"l10RegulationPlusOtWins": 3,
"l10RegulationWins": 3,
"l10Ties": 0,
"l10Wins": 4,
"leagueHomeSequence": 26,
"leagueL10Sequence": 23,
"leagueRoadSequence": 2,
"leagueSequence": 10,
"losses": 9,
"otLosses": 6,
"placeName": {
"default": "Los Angeles"
},
"pointPctg": 0.657143,
"points": 46,
"regulationPlusOtWinPctg": 0.542857,
"regulationPlusOtWins": 19,
"regulationWinPctg": 0.514286,
"regulationWins": 18,
"roadGamesPlayed": 16,
"roadGoalDifferential": 31,
"roadGoalsAgainst": 31,
"roadGoalsFor": 62,
"roadLosses": 2,
"roadOtLosses": 1,
"roadPoints": 27,
"roadRegulationPlusOtWins": 12,
"roadRegulationWins": 11,
"roadTies": 0,
"roadWins": 13,
"seasonId": 20232024,
"shootoutLosses": 4,
"shootoutWins": 1,
"streakCode": "OT",
"streakCount": 1,
"teamName": {
"default": "Los Angeles Kings",
"fr": "Kings de Los Angeles"
},
"teamCommonName": {
"default": "Kings"
},
"teamAbbrev": {
"default": "LAK"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/LAK_light.svg",
"ties": 0,
"waiversSequence": 25,
"wildcardSequence": 0,
"winPctg": 0.571429,
"wins": 20
},
{
"conferenceAbbrev": "E",
"conferenceHomeSequence": 2,
"conferenceL10Sequence": 8,
"conferenceName": "Eastern",
"conferenceRoadSequence": 11,
"conferenceSequence": 5,
"date": "2024-01-06",
"divisionAbbrev": "M",
"divisionHomeSequence": 2,
"divisionL10Sequence": 5,
"divisionName": "Metropolitan",
"divisionRoadSequence": 7,
"divisionSequence": 3,
"gameTypeId": 2,
"gamesPlayed": 38,
"goalDifferential": -6,
"goalDifferentialPctg": -0.157895,
"goalAgainst": 125,
"goalFor": 119,
"goalsForPctg": 3.131579,
"homeGamesPlayed": 20,
"homeGoalDifferential": -4,
"homeGoalsAgainst": 65,
"homeGoalsFor": 61,
"homeLosses": 4,
"homeOtLosses": 6,
"homePoints": 26,
"homeRegulationPlusOtWins": 10,
"homeRegulationWins": 8,
"homeTies": 0,
"homeWins": 10,
"l10GamesPlayed": 10,
"l10GoalDifferential": -3,
"l10GoalsAgainst": 35,
"l10GoalsFor": 32,
"l10Losses": 3,
"l10OtLosses": 3,
"l10Points": 11,
"l10RegulationPlusOtWins": 4,
"l10RegulationWins": 4,
"l10Ties": 0,
"l10Wins": 4,
"leagueHomeSequence": 6,
"leagueL10Sequence": 17,
"leagueRoadSequence": 17,
"leagueSequence": 11,
"losses": 10,
"otLosses": 10,
"placeName": {
"default": "NY Islanders"
},
"pointPctg": 0.605263,
"points": 46,
"regulationPlusOtWinPctg": 0.447368,
"regulationPlusOtWins": 17,
"regulationWinPctg": 0.368421,
"regulationWins": 14,
"roadGamesPlayed": 18,
"roadGoalDifferential": -2,
"roadGoalsAgainst": 60,
"roadGoalsFor": 58,
"roadLosses": 6,
"roadOtLosses": 4,
"roadPoints": 20,
"roadRegulationPlusOtWins": 7,
"roadRegulationWins": 6,
"roadTies": 0,
"roadWins": 8,
"seasonId": 20232024,
"shootoutLosses": 3,
"shootoutWins": 1,
"streakCode": "W",
"streakCount": 1,
"teamName": {
"default": "New York Islanders",
"fr": "Islanders de New York"
},
"teamCommonName": {
"default": "Islanders"
},
"teamAbbrev": {
"default": "NYI"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/NYI_light.svg",
"ties": 0,
"waiversSequence": 21,
"wildcardSequence": 0,
"winPctg": 0.473684,
"wins": 18
},
{
"conferenceAbbrev": "E",
"conferenceHomeSequence": 10,
"conferenceL10Sequence": 9,
"conferenceName": "Eastern",
"conferenceRoadSequence": 4,
"conferenceSequence": 6,
"date": "2024-01-06",
"divisionAbbrev": "M",
"divisionHomeSequence": 6,
"divisionL10Sequence": 6,
"divisionName": "Metropolitan",
"divisionRoadSequence": 2,
"divisionSequence": 4,
"gameTypeId": 2,
"gamesPlayed": 39,
"goalDifferential": 7,
"goalDifferentialPctg": 0.179487,
"goalAgainst": 109,
"goalFor": 116,
"goalsForPctg": 2.974359,
"homeGamesPlayed": 18,
"homeGoalDifferential": -4,
"homeGoalsAgainst": 52,
"homeGoalsFor": 48,
"homeLosses": 7,
"homeOtLosses": 2,
"homePoints": 20,
"homeRegulationPlusOtWins": 8,
"homeRegulationWins": 6,
"homeTies": 0,
"homeWins": 9,
"l10GamesPlayed": 10,
"l10GoalDifferential": -3,
"l10GoalsAgainst": 30,
"l10GoalsFor": 27,
"l10Losses": 3,
"l10OtLosses": 3,
"l10Points": 11,
"l10RegulationPlusOtWins": 4,
"l10RegulationWins": 3,
"l10Ties": 0,
"l10Wins": 4,
"leagueHomeSequence": 21,
"leagueL10Sequence": 19,
"leagueRoadSequence": 6,
"leagueSequence": 12,
"losses": 13,
"otLosses": 6,
"placeName": {
"default": "Philadelphia",
"fr": "Philadelphie"
},
"pointPctg": 0.589744,
"points": 46,
"regulationPlusOtWinPctg": 0.435897,
"regulationPlusOtWins": 17,
"regulationWinPctg": 0.358974,
"regulationWins": 14,
"roadGamesPlayed": 21,
"roadGoalDifferential": 11,
"roadGoalsAgainst": 57,
"roadGoalsFor": 68,
"roadLosses": 6,
"roadOtLosses": 4,
"roadPoints": 26,
"roadRegulationPlusOtWins": 9,
"roadRegulationWins": 8,
"roadTies": 0,
"roadWins": 11,
"seasonId": 20232024,
"shootoutLosses": 2,
"shootoutWins": 3,
"streakCode": "W",
"streakCount": 1,
"teamName": {
"default": "Philadelphia Flyers",
"fr": "Flyers de Philadelphie"
},
"teamCommonName": {
"default": "Flyers"
},
"teamAbbrev": {
"default": "PHI"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/PHI_light.svg",
"ties": 0,
"waiversSequence": 19,
"wildcardSequence": 1,
"winPctg": 0.512821,
"wins": 20
},
{
"conferenceAbbrev": "E",
"conferenceHomeSequence": 11,
"conferenceL10Sequence": 11,
"conferenceName": "Eastern",
"conferenceRoadSequence": 5,
"conferenceSequence": 7,
"date": "2024-01-06",
"divisionAbbrev": "A",
"divisionHomeSequence": 5,
"divisionL10Sequence": 4,
"divisionName": "Atlantic",
"divisionRoadSequence": 3,
"divisionSequence": 3,
"gameTypeId": 2,
"gamesPlayed": 36,
"goalDifferential": 10,
"goalDifferentialPctg": 0.277778,
"goalAgainst": 119,
"goalFor": 129,
"goalsForPctg": 3.583333,
"homeGamesPlayed": 18,
"homeGoalDifferential": 3,
"homeGoalsAgainst": 66,
"homeGoalsFor": 69,
"homeLosses": 7,
"homeOtLosses": 2,
"homePoints": 20,
"homeRegulationPlusOtWins": 5,
"homeRegulationWins": 4,
"homeTies": 0,
"homeWins": 9,
"l10GamesPlayed": 10,
"l10GoalDifferential": 0,
"l10GoalsAgainst": 35,
"l10GoalsFor": 35,
"l10Losses": 4,
"l10OtLosses": 2,
"l10Points": 10,
"l10RegulationPlusOtWins": 4,
"l10RegulationWins": 3,
"l10Ties": 0,
"l10Wins": 4,
"leagueHomeSequence": 22,
"leagueL10Sequence": 21,
"leagueRoadSequence": 7,
"leagueSequence": 13,
"losses": 10,
"otLosses": 7,
"placeName": {
"default": "Toronto"
},
"pointPctg": 0.625,
"points": 45,
"regulationPlusOtWinPctg": 0.416667,
"regulationPlusOtWins": 15,
"regulationWinPctg": 0.305556,
"regulationWins": 11,
"roadGamesPlayed": 18,
"roadGoalDifferential": 7,
"roadGoalsAgainst": 53,
"roadGoalsFor": 60,
"roadLosses": 3,
"roadOtLosses": 5,
"roadPoints": 25,
"roadRegulationPlusOtWins": 10,
"roadRegulationWins": 7,
"roadTies": 0,
"roadWins": 10,
"seasonId": 20232024,
"shootoutLosses": 1,
"shootoutWins": 4,
"streakCode": "W",
"streakCount": 2,
"teamName": {
"default": "Toronto Maple Leafs",
"fr": "Maple Leafs de Toronto"
},
"teamCommonName": {
"default": "Maple Leafs"
},
"teamAbbrev": {
"default": "TOR"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/TOR_light.svg",
"ties": 0,
"waiversSequence": 23,
"wildcardSequence": 0,
"winPctg": 0.527778,
"wins": 19
},
{
"conferenceAbbrev": "E",
"conferenceHomeSequence": 12,
"conferenceL10Sequence": 5,
"conferenceName": "Eastern",
"conferenceRoadSequence": 7,
"conferenceSequence": 8,
"date": "2024-01-06",
"divisionAbbrev": "M",
"divisionHomeSequence": 7,
"divisionL10Sequence": 4,
"divisionName": "Metropolitan",
"divisionRoadSequence": 4,
"divisionSequence": 5,
"gameTypeId": 2,
"gamesPlayed": 37,
"goalDifferential": 1,
"goalDifferentialPctg": 0.027027,
"goalAgainst": 130,
"goalFor": 131,
"goalsForPctg": 3.540541,
"homeGamesPlayed": 19,
"homeGoalDifferential": -6,
"homeGoalsAgainst": 69,
"homeGoalsFor": 63,
"homeLosses": 8,
"homeOtLosses": 2,
"homePoints": 20,
"homeRegulationPlusOtWins": 9,
"homeRegulationWins": 7,
"homeTies": 0,
"homeWins": 9,
"l10GamesPlayed": 10,
"l10GoalDifferential": 3,
"l10GoalsAgainst": 34,
"l10GoalsFor": 37,
"l10Losses": 3,
"l10OtLosses": 1,
"l10Points": 13,
"l10RegulationPlusOtWins": 6,
"l10RegulationWins": 5,
"l10Ties": 0,
"l10Wins": 6,
"leagueHomeSequence": 23,
"leagueL10Sequence": 12,
"leagueRoadSequence": 9,
"leagueSequence": 14,
"losses": 14,
"otLosses": 2,
"placeName": {
"default": "New Jersey"
},
"pointPctg": 0.594595,
"points": 44,
"regulationPlusOtWinPctg": 0.567568,
"regulationPlusOtWins": 21,
"regulationWinPctg": 0.459459,
"regulationWins": 17,
"roadGamesPlayed": 18,
"roadGoalDifferential": 7,
"roadGoalsAgainst": 61,
"roadGoalsFor": 68,
"roadLosses": 6,
"roadOtLosses": 0,
"roadPoints": 24,
"roadRegulationPlusOtWins": 12,
"roadRegulationWins": 10,
"roadTies": 0,
"roadWins": 12,
"seasonId": 20232024,
"shootoutLosses": 1,
"shootoutWins": 0,
"streakCode": "W",
"streakCount": 2,
"teamName": {
"default": "New Jersey Devils",
"fr": "Devils du New Jersey"
},
"teamCommonName": {
"default": "Devils"
},
"teamAbbrev": {
"default": "NJD"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/NJD_light.svg",
"ties": 0,
"waiversSequence": 20,
"wildcardSequence": 2,
"winPctg": 0.567568,
"wins": 21
},
{
"conferenceAbbrev": "W",
"conferenceHomeSequence": 8,
"conferenceL10Sequence": 10,
"conferenceName": "Western",
"conferenceRoadSequence": 9,
"conferenceSequence": 7,
"date": "2024-01-06",
"divisionAbbrev": "C",
"divisionHomeSequence": 6,
"divisionL10Sequence": 6,
"divisionName": "Central",
"divisionRoadSequence": 4,
"divisionSequence": 4,
"gameTypeId": 2,
"gamesPlayed": 39,
"goalDifferential": 0,
"goalDifferentialPctg": 0.0,
"goalAgainst": 122,
"goalFor": 122,
"goalsForPctg": 3.128205,
"homeGamesPlayed": 22,
"homeGoalDifferential": 0,
"homeGoalsAgainst": 66,
"homeGoalsFor": 66,
"homeLosses": 10,
"homeOtLosses": 0,
"homePoints": 24,
"homeRegulationPlusOtWins": 12,
"homeRegulationWins": 9,
"homeTies": 0,
"homeWins": 12,
"l10GamesPlayed": 10,
"l10GoalDifferential": -2,
"l10GoalsAgainst": 34,
"l10GoalsFor": 32,
"l10Losses": 4,
"l10OtLosses": 1,
"l10Points": 11,
"l10RegulationPlusOtWins": 4,
"l10RegulationWins": 3,
"l10Ties": 0,
"l10Wins": 5,
"leagueHomeSequence": 13,
"leagueL10Sequence": 18,
"leagueRoadSequence": 20,
"leagueSequence": 15,
"losses": 17,
"otLosses": 1,
"placeName": {
"default": "Nashville"
},
"pointPctg": 0.551282,
"points": 43,
"regulationPlusOtWinPctg": 0.487179,
"regulationPlusOtWins": 19,
"regulationWinPctg": 0.384615,
"regulationWins": 15,
"roadGamesPlayed": 17,
"roadGoalDifferential": 0,
"roadGoalsAgainst": 56,
"roadGoalsFor": 56,
"roadLosses": 7,
"roadOtLosses": 1,
"roadPoints": 19,
"roadRegulationPlusOtWins": 7,
"roadRegulationWins": 6,
"roadTies": 0,
"roadWins": 9,
"seasonId": 20232024,
"shootoutLosses": 0,
"shootoutWins": 2,
"streakCode": "L",
"streakCount": 1,
"teamName": {
"default": "Nashville Predators",
"fr": "Predators de Nashville"
},
"teamCommonName": {
"default": "Predators"
},
"teamAbbrev": {
"default": "NSH"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/NSH_light.svg",
"ties": 0,
"waiversSequence": 15,
"wildcardSequence": 1,
"winPctg": 0.538462,
"wins": 21
},
{
"conferenceAbbrev": "E",
"conferenceHomeSequence": 4,
"conferenceL10Sequence": 6,
"conferenceName": "Eastern",
"conferenceRoadSequence": 14,
"conferenceSequence": 9,
"date": "2024-01-06",
"divisionAbbrev": "A",
"divisionHomeSequence": 2,
"divisionL10Sequence": 2,
"divisionName": "Atlantic",
"divisionRoadSequence": 7,
"divisionSequence": 4,
"gameTypeId": 2,
"gamesPlayed": 40,
"goalDifferential": -5,
"goalDifferentialPctg": -0.125,
"goalAgainst": 136,
"goalFor": 131,
"goalsForPctg": 3.275,
"homeGamesPlayed": 19,
"homeGoalDifferential": 12,
"homeGoalsAgainst": 55,
"homeGoalsFor": 67,
"homeLosses": 5,
"homeOtLosses": 3,
"homePoints": 25,
"homeRegulationPlusOtWins": 11,
"homeRegulationWins": 10,
"homeTies": 0,
"homeWins": 11,
"l10GamesPlayed": 10,
"l10GoalDifferential": 5,
"l10GoalsAgainst": 30,
"l10GoalsFor": 35,
"l10Losses": 4,
"l10OtLosses": 0,
"l10Points": 12,
"l10RegulationPlusOtWins": 5,
"l10RegulationWins": 5,
"l10Ties": 0,
"l10Wins": 6,
"leagueHomeSequence": 9,
"leagueL10Sequence": 15,
"leagueRoadSequence": 24,
"leagueSequence": 16,
"losses": 16,
"otLosses": 5,
"placeName": {
"default": "Tampa Bay"
},
"pointPctg": 0.5375,
"points": 43,
"regulationPlusOtWinPctg": 0.45,
"regulationPlusOtWins": 18,
"regulationWinPctg": 0.4,
"regulationWins": 16,
"roadGamesPlayed": 21,
"roadGoalDifferential": -17,
"roadGoalsAgainst": 81,
"roadGoalsFor": 64,
"roadLosses": 11,
"roadOtLosses": 2,
"roadPoints": 18,
"roadRegulationPlusOtWins": 7,
"roadRegulationWins": 6,
"roadTies": 0,
"roadWins": 8,
"seasonId": 20232024,
"shootoutLosses": 0,
"shootoutWins": 1,
"streakCode": "W",
"streakCount": 1,
"teamName": {
"default": "Tampa Bay Lightning",
"fr": "Lightning de Tampa Bay"
},
"teamCommonName": {
"default": "Lightning"
},
"teamAbbrev": {
"default": "TBL"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/TBL_light.svg",
"ties": 0,
"waiversSequence": 12,
"wildcardSequence": 3,
"winPctg": 0.475,
"wins": 19
},
{
"conferenceAbbrev": "E",
"conferenceHomeSequence": 9,
"conferenceL10Sequence": 3,
"conferenceName": "Eastern",
"conferenceRoadSequence": 8,
"conferenceSequence": 10,
"date": "2024-01-06",
"divisionAbbrev": "M",
"divisionHomeSequence": 5,
"divisionL10Sequence": 2,
"divisionName": "Metropolitan",
"divisionRoadSequence": 5,
"divisionSequence": 6,
"gameTypeId": 2,
"gamesPlayed": 37,
"goalDifferential": 14,
"goalDifferentialPctg": 0.378378,
"goalAgainst": 102,
"goalFor": 116,
"goalsForPctg": 3.135135,
"homeGamesPlayed": 18,
"homeGoalDifferential": 8,
"homeGoalsAgainst": 44,
"homeGoalsFor": 52,
"homeLosses": 7,
"homeOtLosses": 1,
"homePoints": 21,
"homeRegulationPlusOtWins": 9,
"homeRegulationWins": 9,
"homeTies": 0,
"homeWins": 10,
"l10GamesPlayed": 10,
"l10GoalDifferential": 6,
"l10GoalsAgainst": 31,
"l10GoalsFor": 37,
"l10Losses": 2,
"l10OtLosses": 1,
"l10Points": 15,
"l10RegulationPlusOtWins": 5,
"l10RegulationWins": 5,
"l10Ties": 0,
"l10Wins": 7,
"leagueHomeSequence": 19,
"leagueL10Sequence": 6,
"leagueRoadSequence": 12,
"leagueSequence": 17,
"losses": 14,
"otLosses": 4,
"placeName": {
"default": "Pittsburgh"
},
"pointPctg": 0.567568,
"points": 42,
"regulationPlusOtWinPctg": 0.459459,
"regulationPlusOtWins": 17,
"regulationWinPctg": 0.432432,
"regulationWins": 16,
"roadGamesPlayed": 19,
"roadGoalDifferential": 6,
"roadGoalsAgainst": 58,
"roadGoalsFor": 64,
"roadLosses": 7,
"roadOtLosses": 3,
"roadPoints": 21,
"roadRegulationPlusOtWins": 8,
"roadRegulationWins": 7,
"roadTies": 0,
"roadWins": 9,
"seasonId": 20232024,
"shootoutLosses": 1,
"shootoutWins": 2,
"streakCode": "W",
"streakCount": 1,
"teamName": {
"default": "Pittsburgh Penguins",
"fr": "Penguins de Pittsburgh"
},
"teamCommonName": {
"default": "Penguins"
},
"teamAbbrev": {
"default": "PIT"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/PIT_light.svg",
"ties": 0,
"waiversSequence": 18,
"wildcardSequence": 4,
"winPctg": 0.513514,
"wins": 19
},
{
"conferenceAbbrev": "E",
"conferenceHomeSequence": 8,
"conferenceL10Sequence": 13,
"conferenceName": "Eastern",
"conferenceRoadSequence": 10,
"conferenceSequence": 11,
"date": "2024-01-06",
"divisionAbbrev": "M",
"divisionHomeSequence": 4,
"divisionL10Sequence": 8,
"divisionName": "Metropolitan",
"divisionRoadSequence": 6,
"divisionSequence": 7,
"gameTypeId": 2,
"gamesPlayed": 37,
"goalDifferential": -24,
"goalDifferentialPctg": -0.648649,
"goalAgainst": 114,
"goalFor": 90,
"goalsForPctg": 2.432432,
"homeGamesPlayed": 19,
"homeGoalDifferential": -11,
"homeGoalsAgainst": 56,
"homeGoalsFor": 45,
"homeLosses": 6,
"homeOtLosses": 4,
"homePoints": 22,
"homeRegulationPlusOtWins": 7,
"homeRegulationWins": 5,
"homeTies": 0,
"homeWins": 9,
"l10GamesPlayed": 10,
"l10GoalDifferential": -13,
"l10GoalsAgainst": 35,
"l10GoalsFor": 22,
"l10Losses": 4,
"l10OtLosses": 2,
"l10Points": 10,
"l10RegulationPlusOtWins": 3,
"l10RegulationWins": 1,
"l10Ties": 0,
"l10Wins": 4,
"leagueHomeSequence": 17,
"leagueL10Sequence": 25,
"leagueRoadSequence": 16,
"leagueSequence": 18,
"losses": 13,
"otLosses": 6,
"placeName": {
"default": "Washington"
},
"pointPctg": 0.567568,
"points": 42,
"regulationPlusOtWinPctg": 0.405405,
"regulationPlusOtWins": 15,
"regulationWinPctg": 0.324324,
"regulationWins": 12,
"roadGamesPlayed": 18,
"roadGoalDifferential": -13,
"roadGoalsAgainst": 58,
"roadGoalsFor": 45,
"roadLosses": 7,
"roadOtLosses": 2,
"roadPoints": 20,
"roadRegulationPlusOtWins": 8,
"roadRegulationWins": 7,
"roadTies": 0,
"roadWins": 9,
"seasonId": 20232024,
"shootoutLosses": 4,
"shootoutWins": 3,
"streakCode": "L",
"streakCount": 2,
"teamName": {
"default": "Washington Capitals",
"fr": "Capitals de Washington"
},
"teamCommonName": {
"default": "Capitals"
},
"teamAbbrev": {
"default": "WSH"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/WSH_light.svg",
"ties": 0,
"waiversSequence": 17,
"wildcardSequence": 5,
"winPctg": 0.486486,
"wins": 18
},
{
"conferenceAbbrev": "E",
"conferenceHomeSequence": 7,
"conferenceL10Sequence": 15,
"conferenceName": "Eastern",
"conferenceRoadSequence": 12,
"conferenceSequence": 12,
"date": "2024-01-06",
"divisionAbbrev": "A",
"divisionHomeSequence": 4,
"divisionL10Sequence": 7,
"divisionName": "Atlantic",
"divisionRoadSequence": 5,
"divisionSequence": 5,
"gameTypeId": 2,
"gamesPlayed": 39,
"goalDifferential": 7,
"goalDifferentialPctg": 0.179487,
"goalAgainst": 134,
"goalFor": 141,
"goalsForPctg": 3.615385,
"homeGamesPlayed": 20,
"homeGoalDifferential": 7,
"homeGoalsAgainst": 68,
"homeGoalsFor": 75,
"homeLosses": 7,
"homeOtLosses": 3,
"homePoints": 23,
"homeRegulationPlusOtWins": 9,
"homeRegulationWins": 8,
"homeTies": 0,
"homeWins": 10,
"l10GamesPlayed": 10,
"l10GoalDifferential": -6,
"l10GoalsAgainst": 40,
"l10GoalsFor": 34,
"l10Losses": 6,
"l10OtLosses": 0,
"l10Points": 8,
"l10RegulationPlusOtWins": 2,
"l10RegulationWins": 1,
"l10Ties": 0,
"l10Wins": 4,
"leagueHomeSequence": 15,
"leagueL10Sequence": 27,
"leagueRoadSequence": 21,
"leagueSequence": 19,
"losses": 16,
"otLosses": 4,
"placeName": {
"default": "Detroit"
},
"pointPctg": 0.538462,
"points": 42,
"regulationPlusOtWinPctg": 0.435897,
"regulationPlusOtWins": 17,
"regulationWinPctg": 0.358974,
"regulationWins": 14,
"roadGamesPlayed": 19,
"roadGoalDifferential": 0,
"roadGoalsAgainst": 66,
"roadGoalsFor": 66,
"roadLosses": 9,
"roadOtLosses": 1,
"roadPoints": 19,
"roadRegulationPlusOtWins": 8,
"roadRegulationWins": 6,
"roadTies": 0,
"roadWins": 9,
"seasonId": 20232024,
"shootoutLosses": 0,
"shootoutWins": 2,
"streakCode": "W",
"streakCount": 2,
"teamName": {
"default": "Detroit Red Wings",
"fr": "Red Wings de Detroit"
},
"teamCommonName": {
"default": "Red Wings"
},
"teamAbbrev": {
"default": "DET"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/DET_light.svg",
"ties": 0,
"waiversSequence": 13,
"wildcardSequence": 6,
"winPctg": 0.487179,
"wins": 19
},
{
"conferenceAbbrev": "W",
"conferenceHomeSequence": 11,
"conferenceL10Sequence": 2,
"conferenceName": "Western",
"conferenceRoadSequence": 7,
"conferenceSequence": 8,
"date": "2024-01-06",
"divisionAbbrev": "P",
"divisionHomeSequence": 4,
"divisionL10Sequence": 1,
"divisionName": "Pacific",
"divisionRoadSequence": 4,
"divisionSequence": 4,
"gameTypeId": 2,
"gamesPlayed": 39,
"goalDifferential": -9,
"goalDifferentialPctg": -0.230769,
"goalAgainst": 115,
"goalFor": 106,
"goalsForPctg": 2.717949,
"homeGamesPlayed": 20,
"homeGoalDifferential": 2,
"homeGoalsAgainst": 57,
"homeGoalsFor": 59,
"homeLosses": 8,
"homeOtLosses": 3,
"homePoints": 21,
"homeRegulationPlusOtWins": 8,
"homeRegulationWins": 7,
"homeTies": 0,
"homeWins": 9,
"l10GamesPlayed": 10,
"l10GoalDifferential": 18,
"l10GoalsAgainst": 14,
"l10GoalsFor": 32,
"l10Losses": 0,
"l10OtLosses": 2,
"l10Points": 18,
"l10RegulationPlusOtWins": 8,
"l10RegulationWins": 7,
"l10Ties": 0,
"l10Wins": 8,
"leagueHomeSequence": 20,
"leagueL10Sequence": 2,
"leagueRoadSequence": 18,
"leagueSequence": 20,
"losses": 14,
"otLosses": 9,
"placeName": {
"default": "Seattle"
},
"pointPctg": 0.525641,
"points": 41,
"regulationPlusOtWinPctg": 0.384615,
"regulationPlusOtWins": 15,
"regulationWinPctg": 0.307692,
"regulationWins": 12,
"roadGamesPlayed": 19,
"roadGoalDifferential": -11,
"roadGoalsAgainst": 58,
"roadGoalsFor": 47,
"roadLosses": 6,
"roadOtLosses": 6,
"roadPoints": 20,
"roadRegulationPlusOtWins": 7,
"roadRegulationWins": 5,
"roadTies": 0,
"roadWins": 7,
"seasonId": 20232024,
"shootoutLosses": 4,
"shootoutWins": 1,
"streakCode": "W",
"streakCount": 6,
"teamName": {
"default": "Seattle Kraken",
"fr": "Kraken de Seattle"
},
"teamCommonName": {
"default": "Kraken"
},
"teamAbbrev": {
"default": "SEA"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/SEA_light.svg",
"ties": 0,
"waiversSequence": 10,
"wildcardSequence": 2,
"winPctg": 0.410256,
"wins": 16
},
{
"conferenceAbbrev": "W",
"conferenceHomeSequence": 7,
"conferenceL10Sequence": 9,
"conferenceName": "Western",
"conferenceRoadSequence": 11,
"conferenceSequence": 9,
"date": "2024-01-06",
"divisionAbbrev": "C",
"divisionHomeSequence": 5,
"divisionL10Sequence": 5,
"divisionName": "Central",
"divisionRoadSequence": 5,
"divisionSequence": 5,
"gameTypeId": 2,
"gamesPlayed": 37,
"goalDifferential": 4,
"goalDifferentialPctg": 0.108108,
"goalAgainst": 108,
"goalFor": 112,
"goalsForPctg": 3.027027,
"homeGamesPlayed": 19,
"homeGoalDifferential": 10,
"homeGoalsAgainst": 52,
"homeGoalsFor": 62,
"homeLosses": 7,
"homeOtLosses": 0,
"homePoints": 24,
"homeRegulationPlusOtWins": 11,
"homeRegulationWins": 9,
"homeTies": 0,
"homeWins": 12,
"l10GamesPlayed": 10,
"l10GoalDifferential": -2,
"l10GoalsAgainst": 26,
"l10GoalsFor": 24,
"l10Losses": 4,
"l10OtLosses": 0,
"l10Points": 12,
"l10RegulationPlusOtWins": 6,
"l10RegulationWins": 5,
"l10Ties": 0,
"l10Wins": 6,
"leagueHomeSequence": 12,
"leagueL10Sequence": 14,
"leagueRoadSequence": 25,
"leagueSequence": 21,
"losses": 16,
"otLosses": 2,
"placeName": {
"default": "Arizona"
},
"pointPctg": 0.540541,
"points": 40,
"regulationPlusOtWinPctg": 0.459459,
"regulationPlusOtWins": 17,
"regulationWinPctg": 0.405405,
"regulationWins": 15,
"roadGamesPlayed": 18,
"roadGoalDifferential": -6,
"roadGoalsAgainst": 56,
"roadGoalsFor": 50,
"roadLosses": 9,
"roadOtLosses": 2,
"roadPoints": 16,
"roadRegulationPlusOtWins": 6,
"roadRegulationWins": 6,
"roadTies": 0,
"roadWins": 7,
"seasonId": 20232024,
"shootoutLosses": 0,
"shootoutWins": 2,
"streakCode": "L",
"streakCount": 2,
"teamName": {
"default": "Arizona Coyotes",
"fr": "Coyotes de l'Arizona"
},
"teamCommonName": {
"default": "Coyotes"
},
"teamAbbrev": {
"default": "ARI"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/ARI_light.svg",
"ties": 0,
"waiversSequence": 14,
"wildcardSequence": 3,
"winPctg": 0.513514,
"wins": 19
},
{
"conferenceAbbrev": "W",
"conferenceHomeSequence": 10,
"conferenceL10Sequence": 4,
"conferenceName": "Western",
"conferenceRoadSequence": 10,
"conferenceSequence": 10,
"date": "2024-01-06",
"divisionAbbrev": "P",
"divisionHomeSequence": 3,
"divisionL10Sequence": 2,
"divisionName": "Pacific",
"divisionRoadSequence": 6,
"divisionSequence": 5,
"gameTypeId": 2,
"gamesPlayed": 35,
"goalDifferential": 16,
"goalDifferentialPctg": 0.457143,
"goalAgainst": 112,
"goalFor": 128,
"goalsForPctg": 3.657143,
"homeGamesPlayed": 17,
"homeGoalDifferential": 13,
"homeGoalsAgainst": 51,
"homeGoalsFor": 64,
"homeLosses": 6,
"homeOtLosses": 1,
"homePoints": 21,
"homeRegulationPlusOtWins": 9,
"homeRegulationWins": 8,
"homeTies": 0,
"homeWins": 10,
"l10GamesPlayed": 10,
"l10GoalDifferential": 12,
"l10GoalsAgainst": 28,
"l10GoalsFor": 40,
"l10Losses": 3,
"l10OtLosses": 0,
"l10Points": 14,
"l10RegulationPlusOtWins": 6,
"l10RegulationWins": 6,
"l10Ties": 0,
"l10Wins": 7,
"leagueHomeSequence": 18,
"leagueL10Sequence": 7,
"leagueRoadSequence": 23,
"leagueSequence": 22,
"losses": 15,
"otLosses": 1,
"placeName": {
"default": "Edmonton"
},
"pointPctg": 0.557143,
"points": 39,
"regulationPlusOtWinPctg": 0.485714,
"regulationPlusOtWins": 17,
"regulationWinPctg": 0.457143,
"regulationWins": 16,
"roadGamesPlayed": 18,
"roadGoalDifferential": 3,
"roadGoalsAgainst": 61,
"roadGoalsFor": 64,
"roadLosses": 9,
"roadOtLosses": 0,
"roadPoints": 18,
"roadRegulationPlusOtWins": 8,
"roadRegulationWins": 8,
"roadTies": 0,
"roadWins": 9,
"seasonId": 20232024,
"shootoutLosses": 0,
"shootoutWins": 2,
"streakCode": "W",
"streakCount": 6,
"teamName": {
"default": "Edmonton Oilers",
"fr": "Oilers d'Edmonton"
},
"teamCommonName": {
"default": "Oilers"
},
"teamAbbrev": {
"default": "EDM"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/EDM_light.svg",
"ties": 0,
"waiversSequence": 16,
"wildcardSequence": 4,
"winPctg": 0.542857,
"wins": 19
},
{
"conferenceAbbrev": "W",
"conferenceHomeSequence": 6,
"conferenceL10Sequence": 8,
"conferenceName": "Western",
"conferenceRoadSequence": 12,
"conferenceSequence": 11,
"date": "2024-01-06",
"divisionAbbrev": "C",
"divisionHomeSequence": 4,
"divisionL10Sequence": 4,
"divisionName": "Central",
"divisionRoadSequence": 6,
"divisionSequence": 6,
"gameTypeId": 2,
"gamesPlayed": 37,
"goalDifferential": -12,
"goalDifferentialPctg": -0.324324,
"goalAgainst": 119,
"goalFor": 107,
"goalsForPctg": 2.891892,
"homeGamesPlayed": 18,
"homeGoalDifferential": 6,
"homeGoalsAgainst": 57,
"homeGoalsFor": 63,
"homeLosses": 6,
"homeOtLosses": 0,
"homePoints": 24,
"homeRegulationPlusOtWins": 11,
"homeRegulationWins": 10,
"homeTies": 0,
"homeWins": 12,
"l10GamesPlayed": 10,
"l10GoalDifferential": 0,
"l10GoalsAgainst": 31,
"l10GoalsFor": 31,
"l10Losses": 4,
"l10OtLosses": 0,
"l10Points": 12,
"l10RegulationPlusOtWins": 6,
"l10RegulationWins": 5,
"l10Ties": 0,
"l10Wins": 6,
"leagueHomeSequence": 11,
"leagueL10Sequence": 13,
"leagueRoadSequence": 27,
"leagueSequence": 23,
"losses": 17,
"otLosses": 1,
"placeName": {
"default": "St Louis"
},
"pointPctg": 0.527027,
"points": 39,
"regulationPlusOtWinPctg": 0.486486,
"regulationPlusOtWins": 18,
"regulationWinPctg": 0.432432,
"regulationWins": 16,
"roadGamesPlayed": 19,
"roadGoalDifferential": -18,
"roadGoalsAgainst": 62,
"roadGoalsFor": 44,
"roadLosses": 11,
"roadOtLosses": 1,
"roadPoints": 15,
"roadRegulationPlusOtWins": 7,
"roadRegulationWins": 6,
"roadTies": 0,
"roadWins": 7,
"seasonId": 20232024,
"shootoutLosses": 1,
"shootoutWins": 1,
"streakCode": "W",
"streakCount": 1,
"teamName": {
"default": "St. Louis Blues",
"fr": "Blues de St. Louis"
},
"teamCommonName": {
"default": "Blues"
},
"teamAbbrev": {
"default": "STL"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/STL_light.svg",
"ties": 0,
"waiversSequence": 11,
"wildcardSequence": 5,
"winPctg": 0.513514,
"wins": 19
},
{
"conferenceAbbrev": "W",
"conferenceHomeSequence": 12,
"conferenceL10Sequence": 7,
"conferenceName": "Western",
"conferenceRoadSequence": 8,
"conferenceSequence": 12,
"date": "2024-01-06",
"divisionAbbrev": "P",
"divisionHomeSequence": 5,
"divisionL10Sequence": 4,
"divisionName": "Pacific",
"divisionRoadSequence": 5,
"divisionSequence": 6,
"gameTypeId": 2,
"gamesPlayed": 39,
"goalDifferential": -9,
"goalDifferentialPctg": -0.230769,
"goalAgainst": 127,
"goalFor": 118,
"goalsForPctg": 3.025641,
"homeGamesPlayed": 17,
"homeGoalDifferential": 1,
"homeGoalsAgainst": 49,
"homeGoalsFor": 50,
"homeLosses": 7,
"homeOtLosses": 1,
"homePoints": 19,
"homeRegulationPlusOtWins": 9,
"homeRegulationWins": 7,
"homeTies": 0,
"homeWins": 9,
"l10GamesPlayed": 10,
"l10GoalDifferential": 8,
"l10GoalsAgainst": 23,
"l10GoalsFor": 31,
"l10Losses": 3,
"l10OtLosses": 1,
"l10Points": 13,
"l10RegulationPlusOtWins": 6,
"l10RegulationWins": 6,
"l10Ties": 0,
"l10Wins": 6,
"leagueHomeSequence": 25,
"leagueL10Sequence": 11,
"leagueRoadSequence": 19,
"leagueSequence": 24,
"losses": 17,
"otLosses": 5,
"placeName": {
"default": "Calgary"
},
"pointPctg": 0.5,
"points": 39,
"regulationPlusOtWinPctg": 0.435897,
"regulationPlusOtWins": 17,
"regulationWinPctg": 0.358974,
"regulationWins": 14,
"roadGamesPlayed": 22,
"roadGoalDifferential": -10,
"roadGoalsAgainst": 78,
"roadGoalsFor": 68,
"roadLosses": 10,
"roadOtLosses": 4,
"roadPoints": 20,
"roadRegulationPlusOtWins": 8,
"roadRegulationWins": 7,
"roadTies": 0,
"roadWins": 8,
"seasonId": 20232024,
"shootoutLosses": 4,
"shootoutWins": 0,
"streakCode": "L",
"streakCount": 1,
"teamName": {
"default": "Calgary Flames",
"fr": "Flames de Calgary"
},
"teamCommonName": {
"default": "Flames"
},
"teamAbbrev": {
"default": "CGY"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/CGY_light.svg",
"ties": 0,
"waiversSequence": 9,
"wildcardSequence": 6,
"winPctg": 0.435897,
"wins": 17
},
{
"conferenceAbbrev": "E",
"conferenceHomeSequence": 16,
"conferenceL10Sequence": 12,
"conferenceName": "Eastern",
"conferenceRoadSequence": 9,
"conferenceSequence": 13,
"date": "2024-01-06",
"divisionAbbrev": "A",
"divisionHomeSequence": 8,
"divisionL10Sequence": 5,
"divisionName": "Atlantic",
"divisionRoadSequence": 4,
"divisionSequence": 6,
"gameTypeId": 2,
"gamesPlayed": 38,
"goalDifferential": -27,
"goalDifferentialPctg": -0.710526,
"goalAgainst": 134,
"goalFor": 107,
"goalsForPctg": 2.815789,
"homeGamesPlayed": 19,
"homeGoalDifferential": -20,
"homeGoalsAgainst": 71,
"homeGoalsFor": 51,
"homeLosses": 10,
"homeOtLosses": 2,
"homePoints": 16,
"homeRegulationPlusOtWins": 6,
"homeRegulationWins": 3,
"homeTies": 0,
"homeWins": 7,
"l10GamesPlayed": 10,
"l10GoalDifferential": -6,
"l10GoalsAgainst": 37,
"l10GoalsFor": 31,
"l10Losses": 4,
"l10OtLosses": 2,
"l10Points": 10,
"l10RegulationPlusOtWins": 4,
"l10RegulationWins": 3,
"l10Ties": 0,
"l10Wins": 4,
"leagueHomeSequence": 29,
"leagueL10Sequence": 22,
"leagueRoadSequence": 14,
"leagueSequence": 25,
"losses": 17,
"otLosses": 5,
"placeName": {
"default": "Montr\u00e9al"
},
"pointPctg": 0.486842,
"points": 37,
"regulationPlusOtWinPctg": 0.342105,
"regulationPlusOtWins": 13,
"regulationWinPctg": 0.210526,
"regulationWins": 8,
"roadGamesPlayed": 19,
"roadGoalDifferential": -7,
"roadGoalsAgainst": 63,
"roadGoalsFor": 56,
"roadLosses": 7,
"roadOtLosses": 3,
"roadPoints": 21,
"roadRegulationPlusOtWins": 7,
"roadRegulationWins": 5,
"roadTies": 0,
"roadWins": 9,
"seasonId": 20232024,
"shootoutLosses": 3,
"shootoutWins": 3,
"streakCode": "L",
"streakCount": 1,
"teamName": {
"default": "Montr\u00e9al Canadiens",
"fr": "Canadiens de Montr\u00e9al"
},
"teamCommonName": {
"default": "Canadiens"
},
"teamAbbrev": {
"default": "MTL"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/MTL_light.svg",
"ties": 0,
"waiversSequence": 8,
"wildcardSequence": 7,
"winPctg": 0.421053,
"wins": 16
},
{
"conferenceAbbrev": "W",
"conferenceHomeSequence": 9,
"conferenceL10Sequence": 12,
"conferenceName": "Western",
"conferenceRoadSequence": 14,
"conferenceSequence": 13,
"date": "2024-01-06",
"divisionAbbrev": "C",
"divisionHomeSequence": 7,
"divisionL10Sequence": 7,
"divisionName": "Central",
"divisionRoadSequence": 7,
"divisionSequence": 7,
"gameTypeId": 2,
"gamesPlayed": 37,
"goalDifferential": -8,
"goalDifferentialPctg": -0.216216,
"goalAgainst": 120,
"goalFor": 112,
"goalsForPctg": 3.027027,
"homeGamesPlayed": 19,
"homeGoalDifferential": -2,
"homeGoalsAgainst": 63,
"homeGoalsFor": 61,
"homeLosses": 7,
"homeOtLosses": 2,
"homePoints": 22,
"homeRegulationPlusOtWins": 7,
"homeRegulationWins": 6,
"homeTies": 0,
"homeWins": 10,
"l10GamesPlayed": 10,
"l10GoalDifferential": -2,
"l10GoalsAgainst": 30,
"l10GoalsFor": 28,
"l10Losses": 5,
"l10OtLosses": 0,
"l10Points": 10,
"l10RegulationPlusOtWins": 4,
"l10RegulationWins": 2,
"l10Ties": 0,
"l10Wins": 5,
"leagueHomeSequence": 16,
"leagueL10Sequence": 24,
"leagueRoadSequence": 29,
"leagueSequence": 26,
"losses": 17,
"otLosses": 4,
"placeName": {
"default": "Minnesota"
},
"pointPctg": 0.486486,
"points": 36,
"regulationPlusOtWinPctg": 0.351351,
"regulationPlusOtWins": 13,
"regulationWinPctg": 0.297297,
"regulationWins": 11,
"roadGamesPlayed": 18,
"roadGoalDifferential": -6,
"roadGoalsAgainst": 57,
"roadGoalsFor": 51,
"roadLosses": 10,
"roadOtLosses": 2,
"roadPoints": 14,
"roadRegulationPlusOtWins": 6,
"roadRegulationWins": 5,
"roadTies": 0,
"roadWins": 6,
"seasonId": 20232024,
"shootoutLosses": 2,
"shootoutWins": 3,
"streakCode": "L",
"streakCount": 4,
"teamName": {
"default": "Minnesota Wild",
"fr": "Wild du Minnesota"
},
"teamCommonName": {
"default": "Wild"
},
"teamAbbrev": {
"default": "MIN"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/MIN_light.svg",
"ties": 0,
"waiversSequence": 7,
"wildcardSequence": 7,
"winPctg": 0.432432,
"wins": 16
},
{
"conferenceAbbrev": "E",
"conferenceHomeSequence": 15,
"conferenceL10Sequence": 14,
"conferenceName": "Eastern",
"conferenceRoadSequence": 13,
"conferenceSequence": 14,
"date": "2024-01-06",
"divisionAbbrev": "A",
"divisionHomeSequence": 7,
"divisionL10Sequence": 6,
"divisionName": "Atlantic",
"divisionRoadSequence": 6,
"divisionSequence": 7,
"gameTypeId": 2,
"gamesPlayed": 39,
"goalDifferential": -16,
"goalDifferentialPctg": -0.410256,
"goalAgainst": 133,
"goalFor": 117,
"goalsForPctg": 3.0,
"homeGamesPlayed": 18,
"homeGoalDifferential": -7,
"homeGoalsAgainst": 59,
"homeGoalsFor": 52,
"homeLosses": 9,
"homeOtLosses": 1,
"homePoints": 17,
"homeRegulationPlusOtWins": 8,
"homeRegulationWins": 6,
"homeTies": 0,
"homeWins": 8,
"l10GamesPlayed": 10,
"l10GoalDifferential": -4,
"l10GoalsAgainst": 37,
"l10GoalsFor": 33,
"l10Losses": 5,
"l10OtLosses": 1,
"l10Points": 9,
"l10RegulationPlusOtWins": 4,
"l10RegulationWins": 3,
"l10Ties": 0,
"l10Wins": 4,
"leagueHomeSequence": 28,
"leagueL10Sequence": 26,
"leagueRoadSequence": 22,
"leagueSequence": 27,
"losses": 19,
"otLosses": 4,
"placeName": {
"default": "Buffalo"
},
"pointPctg": 0.461538,
"points": 36,
"regulationPlusOtWinPctg": 0.410256,
"regulationPlusOtWins": 16,
"regulationWinPctg": 0.358974,
"regulationWins": 14,
"roadGamesPlayed": 21,
"roadGoalDifferential": -9,
"roadGoalsAgainst": 74,
"roadGoalsFor": 65,
"roadLosses": 10,
"roadOtLosses": 3,
"roadPoints": 19,
"roadRegulationPlusOtWins": 8,
"roadRegulationWins": 8,
"roadTies": 0,
"roadWins": 8,
"seasonId": 20232024,
"shootoutLosses": 1,
"shootoutWins": 0,
"streakCode": "W",
"streakCount": 1,
"teamName": {
"default": "Buffalo Sabres",
"fr": "Sabres de Buffalo"
},
"teamCommonName": {
"default": "Sabres"
},
"teamAbbrev": {
"default": "BUF"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/BUF_light.svg",
"ties": 0,
"waiversSequence": 6,
"wildcardSequence": 8,
"winPctg": 0.410256,
"wins": 16
},
{
"conferenceAbbrev": "E",
"conferenceHomeSequence": 14,
"conferenceL10Sequence": 10,
"conferenceName": "Eastern",
"conferenceRoadSequence": 15,
"conferenceSequence": 15,
"date": "2024-01-06",
"divisionAbbrev": "M",
"divisionHomeSequence": 8,
"divisionL10Sequence": 7,
"divisionName": "Metropolitan",
"divisionRoadSequence": 8,
"divisionSequence": 8,
"gameTypeId": 2,
"gamesPlayed": 40,
"goalDifferential": -23,
"goalDifferentialPctg": -0.575,
"goalAgainst": 146,
"goalFor": 123,
"goalsForPctg": 3.075,
"homeGamesPlayed": 22,
"homeGoalDifferential": -12,
"homeGoalsAgainst": 76,
"homeGoalsFor": 64,
"homeLosses": 11,
"homeOtLosses": 3,
"homePoints": 19,
"homeRegulationPlusOtWins": 8,
"homeRegulationWins": 7,
"homeTies": 0,
"homeWins": 8,
"l10GamesPlayed": 10,
"l10GoalDifferential": -4,
"l10GoalsAgainst": 40,
"l10GoalsFor": 36,
"l10Losses": 3,
"l10OtLosses": 3,
"l10Points": 11,
"l10RegulationPlusOtWins": 3,
"l10RegulationWins": 1,
"l10Ties": 0,
"l10Wins": 4,
"leagueHomeSequence": 27,
"leagueL10Sequence": 20,
"leagueRoadSequence": 26,
"leagueSequence": 28,
"losses": 19,
"otLosses": 8,
"placeName": {
"default": "Columbus"
},
"pointPctg": 0.425,
"points": 34,
"regulationPlusOtWinPctg": 0.3,
"regulationPlusOtWins": 12,
"regulationWinPctg": 0.225,
"regulationWins": 9,
"roadGamesPlayed": 18,
"roadGoalDifferential": -11,
"roadGoalsAgainst": 70,
"roadGoalsFor": 59,
"roadLosses": 8,
"roadOtLosses": 5,
"roadPoints": 15,
"roadRegulationPlusOtWins": 4,
"roadRegulationWins": 2,
"roadTies": 0,
"roadWins": 5,
"seasonId": 20232024,
"shootoutLosses": 1,
"shootoutWins": 1,
"streakCode": "W",
"streakCount": 1,
"teamName": {
"default": "Columbus Blue Jackets",
"fr": "Blue Jackets de Columbus"
},
"teamCommonName": {
"default": "Blue Jackets"
},
"teamAbbrev": {
"default": "CBJ"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/CBJ_light.svg",
"ties": 0,
"waiversSequence": 5,
"wildcardSequence": 9,
"winPctg": 0.325,
"wins": 13
},
{
"conferenceAbbrev": "E",
"conferenceHomeSequence": 13,
"conferenceL10Sequence": 16,
"conferenceName": "Eastern",
"conferenceRoadSequence": 16,
"conferenceSequence": 16,
"date": "2024-01-06",
"divisionAbbrev": "A",
"divisionHomeSequence": 6,
"divisionL10Sequence": 8,
"divisionName": "Atlantic",
"divisionRoadSequence": 8,
"divisionSequence": 8,
"gameTypeId": 2,
"gamesPlayed": 34,
"goalDifferential": -7,
"goalDifferentialPctg": -0.205882,
"goalAgainst": 122,
"goalFor": 115,
"goalsForPctg": 3.382353,
"homeGamesPlayed": 20,
"homeGoalDifferential": 1,
"homeGoalsAgainst": 67,
"homeGoalsFor": 68,
"homeLosses": 10,
"homeOtLosses": 0,
"homePoints": 20,
"homeRegulationPlusOtWins": 9,
"homeRegulationWins": 7,
"homeTies": 0,
"homeWins": 10,
"l10GamesPlayed": 10,
"l10GoalDifferential": -10,
"l10GoalsAgainst": 44,
"l10GoalsFor": 34,
"l10Losses": 7,
"l10OtLosses": 0,
"l10Points": 6,
"l10RegulationPlusOtWins": 3,
"l10RegulationWins": 2,
"l10Ties": 0,
"l10Wins": 3,
"leagueHomeSequence": 24,
"leagueL10Sequence": 29,
"leagueRoadSequence": 31,
"leagueSequence": 29,
"losses": 20,
"otLosses": 0,
"placeName": {
"default": "Ottawa"
},
"pointPctg": 0.411765,
"points": 28,
"regulationPlusOtWinPctg": 0.382353,
"regulationPlusOtWins": 13,
"regulationWinPctg": 0.323529,
"regulationWins": 11,
"roadGamesPlayed": 14,
"roadGoalDifferential": -8,
"roadGoalsAgainst": 55,
"roadGoalsFor": 47,
"roadLosses": 10,
"roadOtLosses": 0,
"roadPoints": 8,
"roadRegulationPlusOtWins": 4,
"roadRegulationWins": 4,
"roadTies": 0,
"roadWins": 4,
"seasonId": 20232024,
"shootoutLosses": 0,
"shootoutWins": 1,
"streakCode": "L",
"streakCount": 2,
"teamName": {
"default": "Ottawa Senators",
"fr": "S\u00e9nateurs d'Ottawa"
},
"teamCommonName": {
"default": "Senators",
"fr": "S\u00e9nateurs"
},
"teamAbbrev": {
"default": "OTT"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/OTT_light.svg",
"ties": 0,
"waiversSequence": 4,
"wildcardSequence": 10,
"winPctg": 0.411765,
"wins": 14
},
{
"conferenceAbbrev": "W",
"conferenceHomeSequence": 16,
"conferenceL10Sequence": 13,
"conferenceName": "Western",
"conferenceRoadSequence": 13,
"conferenceSequence": 14,
"date": "2024-01-06",
"divisionAbbrev": "P",
"divisionHomeSequence": 8,
"divisionL10Sequence": 6,
"divisionName": "Pacific",
"divisionRoadSequence": 7,
"divisionSequence": 7,
"gameTypeId": 2,
"gamesPlayed": 38,
"goalDifferential": -32,
"goalDifferentialPctg": -0.842105,
"goalAgainst": 127,
"goalFor": 95,
"goalsForPctg": 2.5,
"homeGamesPlayed": 22,
"homeGoalDifferential": -19,
"homeGoalsAgainst": 71,
"homeGoalsFor": 52,
"homeLosses": 15,
"homeOtLosses": 1,
"homePoints": 13,
"homeRegulationPlusOtWins": 5,
"homeRegulationWins": 4,
"homeTies": 0,
"homeWins": 6,
"l10GamesPlayed": 10,
"l10GoalDifferential": -10,
"l10GoalsAgainst": 31,
"l10GoalsFor": 21,
"l10Losses": 6,
"l10OtLosses": 1,
"l10Points": 7,
"l10RegulationPlusOtWins": 3,
"l10RegulationWins": 3,
"l10Ties": 0,
"l10Wins": 3,
"leagueHomeSequence": 32,
"leagueL10Sequence": 28,
"leagueRoadSequence": 28,
"leagueSequence": 30,
"losses": 24,
"otLosses": 1,
"placeName": {
"default": "Anaheim"
},
"pointPctg": 0.355263,
"points": 27,
"regulationPlusOtWinPctg": 0.315789,
"regulationPlusOtWins": 12,
"regulationWinPctg": 0.236842,
"regulationWins": 9,
"roadGamesPlayed": 16,
"roadGoalDifferential": -13,
"roadGoalsAgainst": 56,
"roadGoalsFor": 43,
"roadLosses": 9,
"roadOtLosses": 0,
"roadPoints": 14,
"roadRegulationPlusOtWins": 7,
"roadRegulationWins": 5,
"roadTies": 0,
"roadWins": 7,
"seasonId": 20232024,
"shootoutLosses": 0,
"shootoutWins": 1,
"streakCode": "L",
"streakCount": 1,
"teamName": {
"default": "Anaheim Ducks",
"fr": "Ducks d'Anaheim"
},
"teamCommonName": {
"default": "Ducks"
},
"teamAbbrev": {
"default": "ANA"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/ANA_light.svg",
"ties": 0,
"waiversSequence": 3,
"wildcardSequence": 8,
"winPctg": 0.342105,
"wins": 13
},
{
"conferenceAbbrev": "W",
"conferenceHomeSequence": 14,
"conferenceL10Sequence": 15,
"conferenceName": "Western",
"conferenceRoadSequence": 15,
"conferenceSequence": 15,
"date": "2024-01-06",
"divisionAbbrev": "C",
"divisionHomeSequence": 8,
"divisionL10Sequence": 8,
"divisionName": "Central",
"divisionRoadSequence": 8,
"divisionSequence": 8,
"gameTypeId": 2,
"gamesPlayed": 39,
"goalDifferential": -58,
"goalDifferentialPctg": -1.487179,
"goalAgainst": 148,
"goalFor": 90,
"goalsForPctg": 2.307692,
"homeGamesPlayed": 17,
"homeGoalDifferential": -9,
"homeGoalsAgainst": 52,
"homeGoalsFor": 43,
"homeLosses": 9,
"homeOtLosses": 1,
"homePoints": 15,
"homeRegulationPlusOtWins": 7,
"homeRegulationWins": 5,
"homeTies": 0,
"homeWins": 7,
"l10GamesPlayed": 10,
"l10GoalDifferential": -20,
"l10GoalsAgainst": 43,
"l10GoalsFor": 23,
"l10Losses": 7,
"l10OtLosses": 1,
"l10Points": 5,
"l10RegulationPlusOtWins": 2,
"l10RegulationWins": 1,
"l10Ties": 0,
"l10Wins": 2,
"leagueHomeSequence": 30,
"leagueL10Sequence": 31,
"leagueRoadSequence": 30,
"leagueSequence": 31,
"losses": 26,
"otLosses": 2,
"placeName": {
"default": "Chicago"
},
"pointPctg": 0.307692,
"points": 24,
"regulationPlusOtWinPctg": 0.282051,
"regulationPlusOtWins": 11,
"regulationWinPctg": 0.205128,
"regulationWins": 8,
"roadGamesPlayed": 22,
"roadGoalDifferential": -49,
"roadGoalsAgainst": 96,
"roadGoalsFor": 47,
"roadLosses": 17,
"roadOtLosses": 1,
"roadPoints": 9,
"roadRegulationPlusOtWins": 4,
"roadRegulationWins": 3,
"roadTies": 0,
"roadWins": 4,
"seasonId": 20232024,
"shootoutLosses": 1,
"shootoutWins": 0,
"streakCode": "L",
"streakCount": 4,
"teamName": {
"default": "Chicago Blackhawks",
"fr": "Blackhawks de Chicago"
},
"teamCommonName": {
"default": "Blackhawks"
},
"teamAbbrev": {
"default": "CHI"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/CHI_light.svg",
"ties": 0,
"waiversSequence": 2,
"wildcardSequence": 9,
"winPctg": 0.282051,
"wins": 11
},
{
"conferenceAbbrev": "W",
"conferenceHomeSequence": 15,
"conferenceL10Sequence": 16,
"conferenceName": "Western",
"conferenceRoadSequence": 16,
"conferenceSequence": 16,
"date": "2024-01-06",
"divisionAbbrev": "P",
"divisionHomeSequence": 7,
"divisionL10Sequence": 8,
"divisionName": "Pacific",
"divisionRoadSequence": 8,
"divisionSequence": 8,
"gameTypeId": 2,
"gamesPlayed": 39,
"goalDifferential": -81,
"goalDifferentialPctg": -2.076923,
"goalAgainst": 160,
"goalFor": 79,
"goalsForPctg": 2.025641,
"homeGamesPlayed": 19,
"homeGoalDifferential": -34,
"homeGoalsAgainst": 73,
"homeGoalsFor": 39,
"homeLosses": 11,
"homeOtLosses": 2,
"homePoints": 14,
"homeRegulationPlusOtWins": 6,
"homeRegulationWins": 6,
"homeTies": 0,
"homeWins": 6,
"l10GamesPlayed": 10,
"l10GoalDifferential": -28,
"l10GoalsAgainst": 43,
"l10GoalsFor": 15,
"l10Losses": 10,
"l10OtLosses": 0,
"l10Points": 0,
"l10RegulationPlusOtWins": 0,
"l10RegulationWins": 0,
"l10Ties": 0,
"l10Wins": 0,
"leagueHomeSequence": 31,
"leagueL10Sequence": 32,
"leagueRoadSequence": 32,
"leagueSequence": 32,
"losses": 27,
"otLosses": 3,
"placeName": {
"default": "San Jose"
},
"pointPctg": 0.269231,
"points": 21,
"regulationPlusOtWinPctg": 0.230769,
"regulationPlusOtWins": 9,
"regulationWinPctg": 0.179487,
"regulationWins": 7,
"roadGamesPlayed": 20,
"roadGoalDifferential": -47,
"roadGoalsAgainst": 87,
"roadGoalsFor": 40,
"roadLosses": 16,
"roadOtLosses": 1,
"roadPoints": 7,
"roadRegulationPlusOtWins": 3,
"roadRegulationWins": 1,
"roadTies": 0,
"roadWins": 3,
"seasonId": 20232024,
"shootoutLosses": 3,
"shootoutWins": 0,
"streakCode": "L",
"streakCount": 10,
"teamName": {
"default": "San Jose Sharks",
"fr": "Sharks de San Jose"
},
"teamCommonName": {
"default": "Sharks"
},
"teamAbbrev": {
"default": "SJS"
},
"teamLogo": "https://assets.nhle.com/logos/nhl/svg/SJS_light.svg",
"ties": 0,
"waiversSequence": 1,
"wildcardSequence": 10,
"winPctg": 0.230769,
"wins": 9
}
]
}
Ok, this is cool! We can see all of the data is in the standings
item. But it’s difficult to scroll through the whole data structure.
Let’s see if we can figure out how many wins the Philadelphia Flyers have this year. We’ll go step by step, but you could write most of this code as a single line.
= parse_json['standings'] # get the standings
standings = next(item for item in standings if item['teamName']['default'] == 'Philadelphia Flyers') # find the list item with teamName 'Philadelphia Flyers'
flyers = flyers['wins'] # find the wins item in the Flyers dictionary
flyers_wins print("The Philadelphia Flyers have", flyers_wins, "wins")
The Philadelphia Flyers have 20 wins
Nice! So that’s the basics of how to navigate these data structures in Python. Let’s try something more involved.
Let’s pull the current roster for the Philadelphia Flyers
= requests.get('https://api-web.nhle.com/v1/roster/PHI/current') # pull current roster
roster = roster.text # get just the data
roster_data = json.loads(roster_data) # parse the JSON data into a Python dictionary
roster_dict print(json.dumps(roster_dict, indent=4)) # print the new dictionary object
{
"forwards": [
{
"id": 8474715,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8474715.png",
"firstName": {
"default": "Cam"
},
"lastName": {
"default": "Atkinson"
},
"sweaterNumber": 89,
"positionCode": "R",
"shootsCatches": "R",
"heightInInches": 68,
"weightInPounds": 175,
"heightInCentimeters": 173,
"weightInKilograms": 79,
"birthDate": "1989-06-05",
"birthCity": {
"default": "Riverside"
},
"birthCountry": "USA",
"birthStateProvince": {
"default": "Connecticut"
}
},
{
"id": 8481553,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8481553.png",
"firstName": {
"default": "Bobby"
},
"lastName": {
"default": "Brink"
},
"sweaterNumber": 10,
"positionCode": "R",
"shootsCatches": "R",
"heightInInches": 68,
"weightInPounds": 169,
"heightInCentimeters": 173,
"weightInKilograms": 77,
"birthDate": "2001-07-08",
"birthCity": {
"default": "Minnetonka"
},
"birthCountry": "USA",
"birthStateProvince": {
"default": "Minnesota"
}
},
{
"id": 8480220,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8480220.png",
"firstName": {
"default": "Noah"
},
"lastName": {
"default": "Cates"
},
"sweaterNumber": 27,
"positionCode": "L",
"shootsCatches": "L",
"heightInInches": 74,
"weightInPounds": 194,
"heightInCentimeters": 188,
"weightInKilograms": 88,
"birthDate": "1999-02-05",
"birthCity": {
"default": "Stillwater"
},
"birthCountry": "USA",
"birthStateProvince": {
"default": "Minnesota"
}
},
{
"id": 8476461,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8476461.png",
"firstName": {
"default": "Sean"
},
"lastName": {
"default": "Couturier"
},
"sweaterNumber": 14,
"positionCode": "C",
"shootsCatches": "L",
"heightInInches": 76,
"weightInPounds": 210,
"heightInCentimeters": 193,
"weightInKilograms": 95,
"birthDate": "1992-12-07",
"birthCity": {
"default": "Phoenix"
},
"birthCountry": "USA",
"birthStateProvince": {
"default": "Arizona"
}
},
{
"id": 8475235,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8475235.png",
"firstName": {
"default": "Nicolas"
},
"lastName": {
"default": "Deslauriers"
},
"sweaterNumber": 44,
"positionCode": "L",
"shootsCatches": "L",
"heightInInches": 73,
"weightInPounds": 218,
"heightInCentimeters": 185,
"weightInKilograms": 99,
"birthDate": "1991-02-22",
"birthCity": {
"default": "LaSalle"
},
"birthCountry": "CAN",
"birthStateProvince": {
"default": "Quebec",
"fr": "Qu\u00e9bec"
}
},
{
"id": 8480797,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8480797.png",
"firstName": {
"default": "Joel"
},
"lastName": {
"default": "Farabee"
},
"sweaterNumber": 86,
"positionCode": "L",
"shootsCatches": "L",
"heightInInches": 72,
"weightInPounds": 186,
"heightInCentimeters": 183,
"weightInKilograms": 84,
"birthDate": "2000-02-25",
"birthCity": {
"default": "Syracuse"
},
"birthCountry": "USA",
"birthStateProvince": {
"default": "New York"
}
},
{
"id": 8482159,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8482159.png",
"firstName": {
"default": "Tyson"
},
"lastName": {
"default": "Foerster"
},
"sweaterNumber": 71,
"positionCode": "R",
"shootsCatches": "R",
"heightInInches": 74,
"weightInPounds": 215,
"heightInCentimeters": 188,
"weightInKilograms": 98,
"birthDate": "2002-01-18",
"birthCity": {
"default": "Alliston"
},
"birthCountry": "CAN",
"birthStateProvince": {
"default": "Ontario"
}
},
{
"id": 8480028,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8480028.png",
"firstName": {
"default": "Morgan"
},
"lastName": {
"default": "Frost"
},
"sweaterNumber": 48,
"positionCode": "C",
"shootsCatches": "L",
"heightInInches": 72,
"weightInPounds": 193,
"heightInCentimeters": 183,
"weightInKilograms": 88,
"birthDate": "1999-05-14",
"birthCity": {
"default": "Aurora"
},
"birthCountry": "CAN",
"birthStateProvince": {
"default": "Ontario"
}
},
{
"id": 8477903,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8477903.png",
"firstName": {
"default": "Garnet"
},
"lastName": {
"default": "Hathaway"
},
"sweaterNumber": 19,
"positionCode": "R",
"shootsCatches": "R",
"heightInInches": 74,
"weightInPounds": 212,
"heightInCentimeters": 188,
"weightInKilograms": 96,
"birthDate": "1991-11-23",
"birthCity": {
"default": "Naples"
},
"birthCountry": "USA",
"birthStateProvince": {
"default": "Florida",
"fr": "Floride"
}
},
{
"id": 8478439,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8478439.png",
"firstName": {
"default": "Travis"
},
"lastName": {
"default": "Konecny"
},
"sweaterNumber": 11,
"positionCode": "R",
"shootsCatches": "R",
"heightInInches": 70,
"weightInPounds": 192,
"heightInCentimeters": 178,
"weightInKilograms": 87,
"birthDate": "1997-03-11",
"birthCity": {
"default": "London",
"sk": "Lond\u00fdn"
},
"birthCountry": "CAN",
"birthStateProvince": {
"default": "Ontario"
}
},
{
"id": 8476872,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8476872.png",
"firstName": {
"default": "Scott"
},
"lastName": {
"default": "Laughton"
},
"sweaterNumber": 21,
"positionCode": "C",
"shootsCatches": "L",
"heightInInches": 73,
"weightInPounds": 191,
"heightInCentimeters": 185,
"weightInKilograms": 87,
"birthDate": "1994-05-30",
"birthCity": {
"default": "Oakville"
},
"birthCountry": "CAN",
"birthStateProvince": {
"default": "Ontario"
}
},
{
"id": 8480068,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8480068.png",
"firstName": {
"default": "Ryan"
},
"lastName": {
"default": "Poehling"
},
"sweaterNumber": 25,
"positionCode": "C",
"shootsCatches": "L",
"heightInInches": 74,
"weightInPounds": 204,
"heightInCentimeters": 188,
"weightInKilograms": 93,
"birthDate": "1999-01-03",
"birthCity": {
"default": "Lakeville"
},
"birthCountry": "USA",
"birthStateProvince": {
"default": "Minnesota"
}
},
{
"id": 8480015,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8480015.png",
"firstName": {
"default": "Owen"
},
"lastName": {
"default": "Tippett"
},
"sweaterNumber": 74,
"positionCode": "R",
"shootsCatches": "R",
"heightInInches": 73,
"weightInPounds": 210,
"heightInCentimeters": 185,
"weightInKilograms": 95,
"birthDate": "1999-02-16",
"birthCity": {
"default": "Peterborough"
},
"birthCountry": "CAN",
"birthStateProvince": {
"default": "Ontario"
}
}
],
"defensemen": [
{
"id": 8475176,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8475176.png",
"firstName": {
"default": "Ryan"
},
"lastName": {
"default": "Ellis"
},
"sweaterNumber": 94,
"positionCode": "D",
"shootsCatches": "R",
"heightInInches": 70,
"weightInPounds": 180,
"heightInCentimeters": 178,
"weightInKilograms": 82,
"birthDate": "1991-01-03",
"birthCity": {
"default": "Hamilton"
},
"birthCountry": "CAN",
"birthStateProvince": {
"default": "Ontario"
}
},
{
"id": 8477499,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8477499.png",
"firstName": {
"default": "Rasmus"
},
"lastName": {
"default": "Ristolainen"
},
"sweaterNumber": 55,
"positionCode": "D",
"shootsCatches": "R",
"heightInInches": 76,
"weightInPounds": 208,
"heightInCentimeters": 193,
"weightInKilograms": 94,
"birthDate": "1994-10-27",
"birthCity": {
"default": "Turku",
"sv": "\u00c5bo"
},
"birthCountry": "FIN"
},
{
"id": 8477948,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8477948.png",
"firstName": {
"default": "Travis"
},
"lastName": {
"default": "Sanheim"
},
"sweaterNumber": 6,
"positionCode": "D",
"shootsCatches": "L",
"heightInInches": 76,
"weightInPounds": 222,
"heightInCentimeters": 193,
"weightInKilograms": 101,
"birthDate": "1996-03-29",
"birthCity": {
"default": "Elkhorn"
},
"birthCountry": "CAN",
"birthStateProvince": {
"default": "Manitoba"
}
},
{
"id": 8476372,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8476372.png",
"firstName": {
"default": "Nick"
},
"lastName": {
"default": "Seeler"
},
"sweaterNumber": 24,
"positionCode": "D",
"shootsCatches": "L",
"heightInInches": 75,
"weightInPounds": 197,
"heightInCentimeters": 191,
"weightInKilograms": 89,
"birthDate": "1993-06-03",
"birthCity": {
"default": "Eden Prairie"
},
"birthCountry": "USA",
"birthStateProvince": {
"default": "Minnesota"
}
},
{
"id": 8471686,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8471686.png",
"firstName": {
"default": "Marc"
},
"lastName": {
"default": "Staal"
},
"sweaterNumber": 18,
"positionCode": "D",
"shootsCatches": "L",
"heightInInches": 76,
"weightInPounds": 208,
"heightInCentimeters": 193,
"weightInKilograms": 94,
"birthDate": "1987-01-13",
"birthCity": {
"default": "Thunder Bay"
},
"birthCountry": "CAN",
"birthStateProvince": {
"default": "Ontario"
}
},
{
"id": 8480336,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8480336.png",
"firstName": {
"default": "Sean"
},
"lastName": {
"default": "Walker"
},
"sweaterNumber": 26,
"positionCode": "D",
"shootsCatches": "R",
"heightInInches": 71,
"weightInPounds": 191,
"heightInCentimeters": 180,
"weightInKilograms": 87,
"birthDate": "1994-11-13",
"birthCity": {
"default": "Keswick"
},
"birthCountry": "CAN",
"birthStateProvince": {
"default": "Ontario"
}
},
{
"id": 8481546,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8481546.png",
"firstName": {
"default": "Cam"
},
"lastName": {
"default": "York"
},
"sweaterNumber": 8,
"positionCode": "D",
"shootsCatches": "L",
"heightInInches": 72,
"weightInPounds": 194,
"heightInCentimeters": 183,
"weightInKilograms": 88,
"birthDate": "2001-01-05",
"birthCity": {
"default": "Anaheim"
},
"birthCountry": "USA",
"birthStateProvince": {
"default": "California",
"fr": "Californie",
"sk": "Kalifornia",
"sv": "Kalifornien"
}
},
{
"id": 8481178,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8481178.png",
"firstName": {
"default": "Egor",
"cs": "Jegor",
"de": "Yegor",
"es": "Yegor",
"fi": "Yegor",
"sk": "Jegor",
"sv": "Yegor"
},
"lastName": {
"default": "Zamula"
},
"sweaterNumber": 5,
"positionCode": "D",
"shootsCatches": "L",
"heightInInches": 75,
"weightInPounds": 200,
"heightInCentimeters": 191,
"weightInKilograms": 91,
"birthDate": "2000-03-30",
"birthCity": {
"default": "Chelyabinsk",
"cs": "\u010celjabinsk",
"fi": "T\u0161eljabinsk",
"sk": "\u010celjabinsk"
},
"birthCountry": "RUS"
}
],
"goalies": [
{
"id": 8481035,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8481035.png",
"firstName": {
"default": "Samuel"
},
"lastName": {
"default": "Ersson"
},
"sweaterNumber": 33,
"positionCode": "G",
"shootsCatches": "L",
"heightInInches": 75,
"weightInPounds": 194,
"heightInCentimeters": 191,
"weightInKilograms": 88,
"birthDate": "1999-10-20",
"birthCity": {
"default": "Falun"
},
"birthCountry": "SWE"
},
{
"id": 8479394,
"headshot": "https://assets.nhle.com/mugs/nhl/20232024/PHI/8479394.png",
"firstName": {
"default": "Carter"
},
"lastName": {
"default": "Hart"
},
"sweaterNumber": 79,
"positionCode": "G",
"shootsCatches": "L",
"heightInInches": 74,
"weightInPounds": 196,
"heightInCentimeters": 188,
"weightInKilograms": 89,
"birthDate": "1998-08-13",
"birthCity": {
"default": "Sherwood Park"
},
"birthCountry": "CAN",
"birthStateProvince": {
"default": "Alberta"
}
}
]
}
Pretty messy. How about we just identify the keys in the dictionary?
roster_dict.keys()
dict_keys(['forwards', 'defensemen', 'goalies'])
Nice, so now let’s access the forwards
element, then try to spit out the first player name.
= roster_dict['forwards'][0]['lastName']['default'] # access the 1st (0th) element of the forwards list, then get their last name
lastName = roster_dict['forwards'][0]['firstName']['default'] # access the 1st (0th) element of the forwards list, then get their first name
firstName print("Let's meet our first Flyers forward: ", firstName, " ", lastName, "!", sep='') # sep='' prints the output without spaces between the elements
Let's meet our first Flyers forward: Cam Atkinson!
Now let’s try printing a list of all Flyers players on the current roster.
print("Introducing the full Flyers lineup!")
print("")
print("FORWARDS:")
for x in roster_dict['forwards']: # loop through all items in the roster_dict forwards list
print(x['firstName']['default'], x['lastName']['default'])
print("")
print("DEFENSEMEN:")
for x in roster_dict['defensemen']: # loop through all items in the roster_dict defensemen list
print(x['firstName']['default'], x['lastName']['default'])
print("")
print("GOALIES:")
for x in roster_dict['goalies']: # loop through all items in the roster_dict goalies list
print(x['firstName']['default'], x['lastName']['default'])
Introducing the full Flyers lineup!
FORWARDS:
Cam Atkinson
Bobby Brink
Noah Cates
Sean Couturier
Nicolas Deslauriers
Joel Farabee
Tyson Foerster
Morgan Frost
Garnet Hathaway
Travis Konecny
Scott Laughton
Ryan Poehling
Owen Tippett
DEFENSEMEN:
Ryan Ellis
Rasmus Ristolainen
Travis Sanheim
Nick Seeler
Marc Staal
Sean Walker
Cam York
Egor Zamula
GOALIES:
Samuel Ersson
Carter Hart
After a bit of digging here, it looks like we can access historic team rosters in a similar manner.
= requests.get('https://api-web.nhle.com/v1/roster/PHI/19931994') # pull roster for 1993-1994 season
roster = roster.text # get just the data
roster_data = json.loads(roster_data) # parse the JSON data into a Python dictionary
roster_dict
print("Introducing the 1993-1994 Flyers lineup!")
print("")
print("FORWARDS:")
for x in roster_dict['forwards']: # loop through all items in the roster_dict forwards list
print(x['firstName']['default'], x['lastName']['default'])
print("")
print("DEFENSEMEN:")
for x in roster_dict['defensemen']: # loop through all items in the roster_dict defensemen list
print(x['firstName']['default'], x['lastName']['default'])
print("")
print("GOALIES:")
for x in roster_dict['goalies']: # loop through all items in the roster_dict goalies list
print(x['firstName']['default'], x['lastName']['default'])
Introducing the 1993-1994 Flyers lineup!
FORWARDS:
Josef Beranek
Claude Boivin
Rod Brind'Amour
Dave Brown
Viacheslav Butsayev
John Conroy
Jim Cummins
Rob DiMaio
Kevin Dineen
Pelle Eklund
Andre Faust
Brent Fedyk
Todd Hlushko
Dan Kordic
Mark Lamb
Eric Lindros
Mark Recchi
Mikael Renberg
Dave Tippett
Claude Vilgrain
Chris Winnes
DEFENSEMEN:
Jason Bowen
Aris Brimanis
Jeff Finley
Garry Galley
Greg Hawgood
Milos Holan
Stewart Malgunas
Ryan Mcgill
Yves Racine
Rob Ramage
Bob Wilkie
Dmitry Yushkevich
Rob Zettler
GOALIES:
Frederic Chabot
Dominic Roussel
Tommy Soderstrom
Now for the real question. How much turnover does the Flyers roster have from year to year? When did we see peak turnover?
For this, we’ll need to loop through all of the Flyers seasons, pull the rosters, and compare with the previous year’s roster.
Let’s start by just looping through rosters year-by-year. The Flyers first season was in 1967-1968.
The NHL API uses the format YEARYEAR to name its seasons. E.g. the season starting in 1967 is 19671968
.
Also, let’s start in 1968, since there was no roster continuity for the 1967 season.
Lastly, we’ll need to skip the 2004-2005 season, as it was canceled due to a player lockout. Let’s just pretend there were not roster changes that season.
for i in range(1968, 2024):
= i + 1 # get next year
j = i - 1 # get previous year
k = str(i) + str(j)
season = str(k) + str(i)
prev_season
if i == 2004:
= prev_roster_dict
roster_dict
else:
= requests.get('https://api-web.nhle.com/v1/roster/PHI/' + season) # pull roster
roster = roster.text # get just the data
roster_data = json.loads(roster_data) # parse the JSON data into a Python dictionary
roster_dict
if season == 1968: # use a conditional to skip this pull request for future years
= requests.get('https://api-web.nhle.com/v1/roster/PHI/' + season) # pull previous season roster
prev_roster = prev_roster.text # get just the data
prev_roster_data = json.loads(prev_roster_data) # parse the JSON data into a Python dictionary
prev_roster_dict
= roster_dict['forwards'][0]['lastName']['default'] # access the 1st (0th) element of the forwards list, then get their last name
lastName = roster_dict['forwards'][0]['firstName']['default'] # access the 1st (0th) element of the forwards list, then get their first name
firstName
print(i, "-", j, " season: ", firstName, " ", lastName, sep='')
= roster prev_roster
1968-1969 season: Serge Bernier ID = 8445446
1969-1970 season: Serge Bernier ID = 8445446
1970-1971 season: Serge Bernier ID = 8445446
1971-1972 season: Serge Bernier ID = 8445446
1972-1973 season: Bill Barber ID = 8445252
1973-1974 season: Bill Barber ID = 8445252
1974-1975 season: Bill Barber ID = 8445252
1975-1976 season: Bill Barber ID = 8445252
1976-1977 season: Bill Barber ID = 8445252
1977-1978 season: Bill Barber ID = 8445252
1978-1979 season: Bill Barber ID = 8445252
1979-1980 season: Bill Barber ID = 8445252
1980-1981 season: Greg Adams ID = 8444898
1981-1982 season: Greg Adams ID = 8444898
1982-1983 season: Ray Allison ID = 8444913
1983-1984 season: Ray Allison ID = 8444913
1984-1985 season: Ray Allison ID = 8444913
1985-1986 season: Bo Berglund ID = 8445434
1986-1987 season: Ray Allison ID = 8444913
1987-1988 season: Craig Berube ID = 8445440
1988-1989 season: Keith Acton ID = 8444897
1989-1990 season: Keith Acton ID = 8444897
1990-1991 season: Keith Acton ID = 8444897
1991-1992 season: Keith Acton ID = 8444897
1992-1993 season: Keith Acton ID = 8444897
1993-1994 season: Josef Beranek ID = 8455575
1994-1995 season: Shawn Antoski ID = 8445017
1995-1996 season: Shawn Antoski ID = 8445017
1996-1997 season: Rod Brind'Amour ID = 8445735
1997-1998 season: Rod Brind'Amour ID = 8445735
1998-1999 season: Mikael Andersson ID = 8444963
1999-2000 season: Mikael Andersson ID = 8444963
2000-2001 season: Tomas Divisek ID = 8467500
2001-2002 season: Jesse Boulerice ID = 8465067
2002-2003 season: Tony Amonte ID = 8455429
2003-2004 season: Tony Amonte ID = 8455429
2004-2005 season: Tony Amonte ID = 8455429
2005-2006 season: Donald Brashear ID = 8459246
2006-2007 season: Dimitri Afanasenkov ID = 8467397
2007-2008 season: Jesse Boulerice ID = 8465067
2008-2009 season: Arron Asham ID = 8465025
2009-2010 season: Arron Asham ID = 8465025
2010-2011 season: Blair Betts ID = 8467361
2011-2012 season: Daniel Brière ID = 8464975
2012-2013 season: Jason Akeson ID = 8475917
2013-2014 season: Jason Akeson ID = 8475917
2014-2015 season: Jason Akeson ID = 8475917
2015-2016 season: Pierre-Edouard Bellemare ID = 8477930
2016-2017 season: Pierre-Edouard Bellemare ID = 8477930
2017-2018 season: Sean Couturier ID = 8476461
2018-2019 season: Nicolas Aube-Kubel ID = 8477979
2019-2020 season: Andy Andreoff ID = 8476404
2020-2021 season: Wade Allison ID = 8479322
2021-2022 season: Wade Allison ID = 8479322
2022-2023 season: Wade Allison ID = 8479322
2023-2024 season: Cam Atkinson ID = 8474715
Looking good. However, it will be annoying to compare first and last names every season. Also, what if two players have the same name?
Fortunately, the NHL API assigns each player a unique id
attribute, so we can use those instead of names.
= {} # dict to save percent of returning roster year by year
perc_returning_dict
for i in range(1968, 2024):
= i + 1 # get next year
j = i - 1 # get previous year
k = str(i) + str(j)
season = str(k) + str(i)
prev_season
if i == 2004:
= prev_roster_dict
roster_dict
else:
= requests.get('https://api-web.nhle.com/v1/roster/PHI/' + season) # pull roster
roster = roster.text # get just the data
roster_data = json.loads(roster_data) # parse the JSON data into a Python dictionary
roster_dict
if season == 1968: # use a conditional to skip this pull request for future years
= requests.get('https://api-web.nhle.com/v1/roster/PHI/' + season) # pull previous season roster
prev_roster = prev_roster.text # get just the data
prev_roster_data = json.loads(prev_roster_data) # parse the JSON data into a Python dictionary
prev_roster_dict
= [] # create list to contain previous year roster player IDs
prev_roster_ids for x in prev_roster_dict: # loop through the dictionary
for y in prev_roster_dict[x]: # loop through each player
'id']) # and extract ID
prev_roster_ids.append(y[
= 0 # keep track of how many players are on the roster
count = 0 # keep track of how many players returned from the previous season
returning for x in roster_dict:
for y in roster_dict[x]: # loop through each player
#print(y['id'])
if y['id'] in prev_roster_ids:
= returning + 1
returning = count + 1
count
= round(returning / count * 100, 1)
perc_returning print(perc_returning, "% of players returned for the ", i, "-", j, " season", sep="")
= perc_returning # append each year's values to the dictionary
perc_returning_dict[i]
= roster_dict # do this to avoid extra data pull requests prev_roster_dict
70.0% of players returned for the 1968-1969 season
69.2% of players returned for the 1969-1970 season
63.3% of players returned for the 1970-1971 season
53.8% of players returned for the 1971-1972 season
75.0% of players returned for the 1972-1973 season
83.3% of players returned for the 1973-1974 season
70.4% of players returned for the 1974-1975 season
78.6% of players returned for the 1975-1976 season
68.8% of players returned for the 1976-1977 season
75.9% of players returned for the 1977-1978 season
64.7% of players returned for the 1978-1979 season
65.5% of players returned for the 1979-1980 season
71.0% of players returned for the 1980-1981 season
62.9% of players returned for the 1981-1982 season
64.7% of players returned for the 1982-1983 season
74.2% of players returned for the 1983-1984 season
65.6% of players returned for the 1984-1985 season
73.5% of players returned for the 1985-1986 season
62.5% of players returned for the 1986-1987 season
73.2% of players returned for the 1987-1988 season
69.4% of players returned for the 1988-1989 season
68.3% of players returned for the 1989-1990 season
74.3% of players returned for the 1990-1991 season
47.6% of players returned for the 1991-1992 season
44.1% of players returned for the 1992-1993 season
51.4% of players returned for the 1993-1994 season
51.5% of players returned for the 1994-1995 season
60.5% of players returned for the 1995-1996 season
66.7% of players returned for the 1996-1997 season
71.9% of players returned for the 1997-1998 season
42.2% of players returned for the 1998-1999 season
66.7% of players returned for the 1999-2000 season
52.8% of players returned for the 2000-2001 season
51.4% of players returned for the 2001-2002 season
48.8% of players returned for the 2002-2003 season
58.5% of players returned for the 2003-2004 season
100.0% of players returned for the 2004-2005 season
42.5% of players returned for the 2005-2006 season
46.9% of players returned for the 2006-2007 season
55.6% of players returned for the 2007-2008 season
51.4% of players returned for the 2008-2009 season
54.5% of players returned for the 2009-2010 season
61.3% of players returned for the 2010-2011 season
51.5% of players returned for the 2011-2012 season
56.4% of players returned for the 2012-2013 season
66.7% of players returned for the 2013-2014 season
54.5% of players returned for the 2014-2015 season
75.9% of players returned for the 2015-2016 season
69.7% of players returned for the 2016-2017 season
62.5% of players returned for the 2017-2018 season
60.5% of players returned for the 2018-2019 season
58.8% of players returned for the 2019-2020 season
75.0% of players returned for the 2020-2021 season
47.6% of players returned for the 2021-2022 season
71.4% of players returned for the 2022-2023 season
65.2% of players returned for the 2023-2024 season
So now that we have a dictionary with our data values, let’s make some figures! We’ll use the plotly
Python library. We’ll also need the pandas
library to format our data as a DataFrame object.
import plotly.express as px
import pandas as pd
= pd.DataFrame(perc_returning_dict.items(), columns=['Year', '% Roster Returning']) # convert dictionary to two column data frame
df
= px.bar(df, x='Year', y='% Roster Returning', title = "Philadelphia Flyers Roster Continuity")
fig
fig.update_layout(=dict(l=20, r=20, b=20))
margin
fig.show()
Pretty bare bones. Let’s make it prettier. Let’s also drop the 2004-2005 season, since it was a lockout year.
import plotly.express as px
import pandas as pd
2004] = None
perc_returning_dict[
= pd.DataFrame(perc_returning_dict.items(), columns=['Year', '% Roster Returning']) # convert dictionary to two column data frame
df
= px.bar(df, x='Year', y='% Roster Returning', title = "Philadelphia Flyers Roster Continuity", template="plotly_dark") # use a dark template for contrast
fig = "#F74902") # make the bars "Flyers orange"
fig.update_traces(marker_color
fig.update_layout(=dict(l=20, r=20, b=20))
margin
fig.show()
How well does roster continuity correlated with team performance? Do years with higher continuity also have more wins?
The NHL API does not have an easy way to pull team win-loss records for each season. To get win percentage per season, let’s pull league standings on the season end date from every year. Note that have to look at only regulation wins, since the NHL used to allow ties.
= requests.get('https://api-web.nhle.com/v1/standings-season')
s = s.text # get just the data
s_data = json.loads(s_data) # parse the JSON data into a Python dictionary
s_dict = s_dict['seasons']
s_seasons
= {} # dict to contain win percentage for each year
flyers_win_perc
for i in range(1968, 2024):
= i + 1 # get next year
j = int(str(i) + str(j))
year if i != 2004: # skip the lockout year
= next(item for item in s_seasons if item['id'] == year) # find the flyers in this seasons standings
season = season['standingsEnd']
season_end = requests.get('https://api-web.nhle.com/v1/standings/' + season_end) # pull data from the end of the season
stand = json.loads(stand.text) # convert to dict
stand_dict = next(item for item in stand_dict['standings'] if item['teamName']['default'] == 'Philadelphia Flyers') # find the list item with teamName 'Philadelphia Flyers'
flyers = flyers['regulationWinPctg'] # find the regulation win percentage item in the Flyers dictionary
flyers_winP #print(json.dumps(flyers, indent=4)) # print the new dictionary object
print(i, "-", j, " season win %: ", round(flyers_winP * 100, 1), sep="")
= round(flyers_winP * 100, 1)
flyers_win_perc[i] else:
= None flyers_win_perc[i]
1968-1969 season win %: 26.3
1969-1970 season win %: 22.4
1970-1971 season win %: 35.9
1971-1972 season win %: 33.3
1972-1973 season win %: 47.4
1973-1974 season win %: 64.1
1974-1975 season win %: 63.7
1975-1976 season win %: 63.7
1976-1977 season win %: 60.0
1977-1978 season win %: 56.2
1978-1979 season win %: 50.0
1979-1980 season win %: 60.0
1980-1981 season win %: 51.2
1981-1982 season win %: 47.5
1982-1983 season win %: 61.3
1983-1984 season win %: 51.2
1984-1985 season win %: 65.0
1985-1986 season win %: 61.3
1986-1987 season win %: 56.2
1987-1988 season win %: 46.2
1988-1989 season win %: 43.8
1989-1990 season win %: 35.0
1990-1991 season win %: 40.0
1991-1992 season win %: 37.5
1992-1993 season win %: 38.1
1993-1994 season win %: 38.1
1994-1995 season win %: 52.1
1995-1996 season win %: 50.0
1996-1997 season win %: 51.2
1997-1998 season win %: 47.6
1998-1999 season win %: 42.7
1999-2000 season win %: 47.6
2000-2001 season win %: 46.3
2001-2002 season win %: 47.6
2002-2003 season win %: 47.6
2003-2004 season win %: 46.3
2005-2006 season win %: 41.5
2006-2007 season win %: 22.0
2007-2008 season win %: 43.9
2008-2009 season win %: 41.5
2009-2010 season win %: 42.7
2010-2011 season win %: 50.0
2011-2012 season win %: 45.1
2012-2013 season win %: 41.7
2013-2014 season win %: 42.7
2014-2015 season win %: 30.5
2015-2016 season win %: 34.1
2016-2017 season win %: 30.5
2017-2018 season win %: 37.8
2018-2019 season win %: 34.1
2019-2020 season win %: 44.9
2020-2021 season win %: 30.4
2021-2022 season win %: 24.4
2022-2023 season win %: 31.7
2023-2024 season win %: 35.9
Now let’s plot regulation win percentage by season.
import plotly.express as px
import pandas as pd
= pd.DataFrame(flyers_win_perc.items(), columns=['Year', 'Regulation Win %']) # convert dictionary to two column data frame
df
= px.bar(df, x='Year', y='Regulation Win %', title = "Philadelphia Flyers Season Performance", template="plotly_dark") # use a dark template for contrast
fig = "white") # make the bars "Flyers orange"
fig.update_traces(marker_color
# reduce margin size (for better viewing on mobile)
fig.update_layout(=dict(l=20, r=20, b=20))
margin
fig.show()
What about regulation win percentage vs roster retention?
import plotly.express as px
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
2004] = None
perc_returning_dict[
= pd.DataFrame(flyers_win_perc.items(), columns=['Year', 'Regulation Win %']) # convert dictionary to two column data frame
df_1
= pd.DataFrame(perc_returning_dict.items(), columns=['Year', '% Roster Returning']) # convert dictionary to two column data frame
df_2
= pd.merge(df_1, df_2, on="Year")
df
= make_subplots(specs=[[{"secondary_y": True}]])
fig
# Add traces
=df["Year"], y=df['Regulation Win %'], name="Regulation Win %", marker = dict(color = 'white')), secondary_y=False)
fig.add_trace(go.Scatter(x
=df['Year'], y=df['% Roster Returning'], name="% Roster Returning", marker = dict(color="#F74902")), secondary_y=True)
fig.add_trace(go.Scatter(x
# Add figure title
="Philadelphia Flyers Roster Continuity vs Wins")
fig.update_layout(title_text
# Set x-axis title
="Year")
fig.update_xaxes(title_text
# Set y-axes titles
="Regulation Win %", secondary_y=False)
fig.update_yaxes(title_text="% Roster Returning", secondary_y=True)
fig.update_yaxes(title_text
# theme, hide grid lines, put legend on top
# also reduce margin size (for better viewing on mobile)
# automargin increases the margin size to prevent ticklabels from being cut off or overlapping with axis titles
= "plotly_dark",
fig.update_layout(template =dict(showgrid=False),
yaxis2=dict(showgrid=False),
yaxis=dict(l=20, r=20,b=20),
margin=dict(orientation="h",
legend="bottom",
yanchor=1.02,
y="right",
xanchor=1))
x
fig.show()
Neat! We can see the Flyer’s “Broad Street Bullies” period in the 70s and early 80s where they had a dominant win percentage, thanks in no small part to their consistent roster.
We can also see a few cases where there’s a lag between winning and roster retention. The Flyers winning percentage drops for 5 straight seasons from 1984-1989 and bottoms out around 40% until 1994. But roster retention stays high until 1990, when the Flyers enter a period of roster turmoil. In fact, Wikipedia lists 1991-1994 as the “Rebuilding years.”
How about another performance metric, like goal differential proportion? This is a team’s goal differential (goals for - goals against) divided by the number of games played. So the larger this number, the more the team is outscoring opponents on average. Negative goal differential proportion means opposing teams outscored the Flyers, while positive values indicate the Flyers outscored other teams.
First let’s gather the data.
= requests.get('https://api-web.nhle.com/v1/standings-season')
s = s.text # get just the data
s_data = json.loads(s_data) # parse the JSON data into a Python dictionary
s_dict = s_dict['seasons']
s_seasons
= {} # dict to contain win percentage for each year
flyers_goalP_dict
for i in range(1968, 2024):
= i + 1 # get next year
j = int(str(i) + str(j))
year if i != 2004: # skip the lockout year
= next(item for item in s_seasons if item['id'] == year) # find the flyers in this seasons standings
season = season['standingsEnd']
season_end = requests.get('https://api-web.nhle.com/v1/standings/' + season_end) # pull data from the end of the season
stand = json.loads(stand.text) # convert to dict
stand_dict = next(item for item in stand_dict['standings'] if item['teamName']['default'] == 'Philadelphia Flyers') # find the list item with teamName 'Philadelphia Flyers'
flyers = flyers['goalDifferentialPctg'] # find the regulation win percentage item in the Flyers dictionary
flyers_goalP #print(json.dumps(flyers, indent=4)) # print the new dictionary object
print(i, "-", j, " goal differential proportion: ", flyers_goalP, sep="")
= flyers_goalP
flyers_goalP_dict[i] else:
= None flyers_goalP_dict[i]
1968-1969 goal differential proportion: -0.671053
1969-1970 goal differential proportion: -0.368421
1970-1971 goal differential proportion: -0.230769
1971-1972 goal differential proportion: -0.461538
1972-1973 goal differential proportion: 0.512821
1973-1974 goal differential proportion: 1.397436
1974-1975 goal differential proportion: 1.4
1975-1976 goal differential proportion: 1.7375
1976-1977 goal differential proportion: 1.375
1977-1978 goal differential proportion: 1.2
1978-1979 goal differential proportion: 0.4125
1979-1980 goal differential proportion: 0.9125
1980-1981 goal differential proportion: 0.8
1981-1982 goal differential proportion: 0.15
1982-1983 goal differential proportion: 1.075
1983-1984 goal differential proportion: 0.75
1984-1985 goal differential proportion: 1.3375
1985-1986 goal differential proportion: 1.175
1986-1987 goal differential proportion: 0.8125
1987-1988 goal differential proportion: 0.0
1988-1989 goal differential proportion: 0.275
1989-1990 goal differential proportion: -0.0875
1990-1991 goal differential proportion: -0.1875
1991-1992 goal differential proportion: -0.2625
1992-1993 goal differential proportion: 0.0
1993-1994 goal differential proportion: -0.238095
1994-1995 goal differential proportion: 0.375
1995-1996 goal differential proportion: 0.902439
1996-1997 goal differential proportion: 0.695122
1997-1998 goal differential proportion: 0.597561
1998-1999 goal differential proportion: 0.426829
1999-2000 goal differential proportion: 0.707317
2000-2001 goal differential proportion: 0.402439
2001-2002 goal differential proportion: 0.512195
2002-2003 goal differential proportion: 0.54878
2003-2004 goal differential proportion: 0.52439
2005-2006 goal differential proportion: 0.097561
2006-2007 goal differential proportion: -1.085366
2007-2008 goal differential proportion: 0.182927
2008-2009 goal differential proportion: 0.317073
2009-2010 goal differential proportion: 0.134146
2010-2011 goal differential proportion: 0.439024
2011-2012 goal differential proportion: 0.390244
2012-2013 goal differential proportion: -0.166667
2013-2014 goal differential proportion: 0.012195
2014-2015 goal differential proportion: -0.231707
2015-2016 goal differential proportion: -0.04878
2016-2017 goal differential proportion: -0.207317
2017-2018 goal differential proportion: 0.097561
2018-2019 goal differential proportion: -0.45122
2019-2020 goal differential proportion: 0.521739
2020-2021 goal differential proportion: -0.678571
2021-2022 goal differential proportion: -1.060976
2022-2023 goal differential proportion: -0.670732
2023-2024 goal differential proportion: 0.179487
Now let’s plot goal differential and win percentage together.
# make a bar plot
import plotly.express as px
import pandas as pd
import numpy as np
= pd.DataFrame(flyers_win_perc.items(), columns=['Year', 'Regulation Win %']) # convert dictionary to two column data frame
df_1
= pd.DataFrame(perc_returning_dict.items(), columns=['Year', '% Roster Returning']) # convert dictionary to two column data frame
df_2
= pd.DataFrame(flyers_goalP_dict.items(), columns=['Year', 'Goal Differential Proportion']) # convert dictionary to two column data frame
df_3
= pd.merge(pd.merge(df_1, df_2, on="Year"), df_3, on="Year")
df
= df.dropna()
df
= px.bar(df, x='Year', y='Goal Differential Proportion', color="Regulation Win %", title = "Philadelphia Flyers Season Performance", template="plotly_dark") # use a dark template for contrast
fig
="Goal Differential per Game")
fig.update_yaxes(title_text
=dict(colorbar=dict(orientation='h', y=-0.5, xanchor="right", x=1, yanchor="bottom")))
fig.update_layout(coloraxis
fig.update_layout(=dict(l=20, r=20, b=20))
margin
fig.show()
Oof, 2006-2007 was a rough season. In fact, the Flyers finished dead last in the standings that year.
Ok, let’s try combining all of this information in one figure.
import plotly.express as px
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
2004] = None
perc_returning_dict[
= pd.DataFrame(flyers_win_perc.items(), columns=['Year', 'Regulation Win %']) # convert dictionary to two column data frame
df_1
= pd.DataFrame(perc_returning_dict.items(), columns=['Year', '% Roster Returning']) # convert dictionary to two column data frame
df_2
= pd.DataFrame(flyers_goalP_dict.items(), columns=['Year', 'Goal Differential Proportion']) # convert dictionary to two column data frame
df_3
= pd.merge(pd.merge(df_1, df_2, on="Year"), df_3, on="Year")
df
= px.scatter(df, x='Regulation Win %', y='Goal Differential Proportion', color='% Roster Returning', template="plotly_dark", color_continuous_scale="Viridis", hover_name="Year", title="Philadelphia Flyers Season Stats")
fig
=dict(size=10, line=dict(width=0.5, color='white'))) # add white outline around points
fig.update_traces(marker
="Goal Differential per Game")
fig.update_yaxes(title_text
=dict(l=20, r=20, b=20),
fig.update_layout(margin=dict(colorbar=dict(orientation='h', y=-0.5, xanchor="right", x=1, yanchor="bottom")))
coloraxis
fig.show()
This figure shows the expected strong positive relationship between winning percentage and goal differential. However, the relationship between team performance and roster continuity is less clear.
The Flyers’ best seasons all had relatively high roster continuity. But the Flyers also had relatively good seasons with high roster turnover.
For example, in 1998, the Flyers had a positive goal differential, won 43% of their games in regulation, and placed 7th overall in the league. But that season had their lowest ever roster retention, with only 42% of players returning.
Well I think that’s enough for this dataset. See you in the next post!