develope_kkyu

[Python] plotly를 이용해 MLB 내셔널리그 서부 순위 변동 그래프 만들기 본문

Python

[Python] plotly를 이용해 MLB 내셔널리그 서부 순위 변동 그래프 만들기

developekkyu37 2023. 1. 26. 12:24
728x90

패키지 설치 및 임포트

pip install plotly
pip install MLB-StatsAPI

import statsapi
import pandas as pd

팀 순위 정보 검색

statsapi.standings_data를 활용하면 해당날짜의 팀 순위 정보를 가져올 수 있다.
  • 리그 아이디 103은 아메리칸 리그, 104는 내셔널 리그
  • 내셔널리그 서부, 동부, 중부의 딕셔너리 번호는 각각 203, 204, 205
  • 메이저리그 정규리그는 2022년 4월 7일부터 10월 5일까지 
statsapi.standings_data(leagueId=104,date='04/07/2022')[203]
# statsapi.standings_data(leagueId=104,date='10/05/2022')[203]

{'div_name': 'National League West',
 'teams': [{'name': 'Arizona Diamondbacks',
   'div_rank': '1',
   'w': 1,
   'l': 0,
   'gb': '-',
   'wc_rank': '-',
   'wc_gb': '-',
   'wc_elim_num': '-',
   'elim_num': '-',
   'team_id': 109,
   'league_rank': '1',
   'sport_rank': '1'},
  {'name': 'Colorado Rockies',
   'div_rank': '2',
   'w': 0,
   'l': 0,
   'gb': '0.5',
   'wc_rank': '4',
   'wc_gb': '-',
   'wc_elim_num': '-',
   'elim_num': '162',
   'team_id': 115,
   'league_rank': '6',
   'sport_rank': '6'},
  {'name': 'Los Angeles Dodgers',
   'div_rank': '3',
   'w': 0,
   'l': 0,
   'gb': '0.5',
   'wc_rank': '5',
   'wc_gb': '-',
   'wc_elim_num': '-',
   'elim_num': '162',
   'team_id': 119,
   'league_rank': '7',
   'sport_rank': '7'},
  {'name': 'San Francisco Giants',
   'div_rank': '4',
   'w': 0,
   'l': 0,
   'gb': '0.5',
   'wc_rank': '8',
   'wc_gb': '-',
   'wc_elim_num': '-',
   'elim_num': '162',
   'team_id': 137,
   'league_rank': '10',
   'sport_rank': '10'},
  {'name': 'San Diego Padres',
   'div_rank': '5',
   'w': 0,
   'l': 1,
   'gb': '1.0',
   'wc_rank': '12',
   'wc_gb': '0.5',
   'wc_elim_num': '162',
   'elim_num': '161',
   'team_id': 135,
   'league_rank': '14',
   'sport_rank': '14'}]}

데이터 프레임 만들기

4월 7일부터 10월 5일까지 팀들의 순위를 알 수 있는 데이터프레임 만들기

  • 6일마다 바뀌는 순위를 보여준다
from datetime import datetime, timedelta

# 시작일,종료일 설정
start = "04/07/2022"
last = "10/05/2022"

# 시작일, 종료일 datetime 으로 변환
start_date = datetime.strptime(start, "%m/%d/%Y")
last_date = datetime.strptime(last, "%m/%d/%Y")

# 종료일 까지 반복
date = []
dodgers = []
padres = []
giants = []
rockies = []
diamondbacks = []

while start_date <= last_date:
    dates = start_date.strftime("%m/%d/%Y")
    dt = start_date.strftime("%m/%d")
    date.append(dt)
    teams = statsapi.standings_data(leagueId=104,date=dates)[203]['teams']

    lad = (item for item in teams if item['name'] == "Los Angeles Dodgers")
    dict = next(lad, False)
    dodgers.append(dict['div_rank'])

    sd = (item2 for item2 in teams if item2['name'] == "San Diego Padres")
    dict2 = next(sd, False)
    padres.append(dict2['div_rank'])

    sf = (item3 for item3 in teams if item3['name'] == "San Francisco Giants")
    dict3 = next(sf, False)
    giants.append(dict3['div_rank'])

    cr = (item4 for item4 in teams if item4['name'] == "Colorado Rockies")
    dict4 = next(cr, False)
    rockies.append(dict4['div_rank'])

    ad = (item5 for item5 in teams if item5['name'] == "Arizona Diamondbacks")
    dict5 = next(ad, False)
    diamondbacks.append(dict5['div_rank'])

    # 6일 마다
    start_date += timedelta(days=6)
st = pd.DataFrame({'Los Angeles Dodgers' : dodgers, 'San Diego Padres' : padres, "San Francisco Giants" : giants, "Colorado Rockies" : rockies, "Arizona Diamondbacks" : diamondbacks}, index = date)
st

시각화

plotly를 이용해 꺾은선 그래프로 표현

import plotly.express as px

idx = st.index.to_list()
col = st.columns

fig = px.line(st, 
              x = idx,
              y = col,
              title = "내셔널리그 서부 순위 변동"
              ).update_layout(
    xaxis_title="날짜", yaxis_title="순위"
)
fig.show()

y값인 순위가 정렬이 안되는 문제 발생

fig.update_yaxes(categoryorder="category descending")

y값을 내림차순으로 정렬해주는 코드

import plotly.express as px

idx = st.index.to_list()
col = st.columns

fig = px.line(st, 
              x = idx,
              y = col,
              title = "내셔널리그 서부 순위 변동"
              ).update_layout(
    xaxis_title="날짜", yaxis_title="순위"
)
fig.update_yaxes(categoryorder="category descending")
fig.show()

같은 방식으로 아메리칸리그 동부 순위 변동 그래프도 만들 수 있다.

728x90