develope_kkyu

[Python] MLB-StatsAPI를 이용한 mlb 기록 사이트 만들기 - 3 본문

Python

[Python] MLB-StatsAPI를 이용한 mlb 기록 사이트 만들기 - 3

developekkyu37 2023. 2. 26. 18:58
728x90

https://developerkkyu37.tistory.com/70

 

[Python] MLB-StatsAPI를 이용한 mlb 기록 사이트 만들기 - 2

https://developerkkyu37.tistory.com/69 [Python] MLB-StatsAPI를 이용한 mlb 기록 사이트 만들기(배포) - 1 MLB-StatsAPI와 streamlit 라이브러리를 이용해서 mlb 기록확인을 할 수 있는 사이트를 만들어보려고 한다. stream

developerkkyu37.tistory.com

MLB 시범경기가 시작하긴 했지만 아직 정식으로 시즌이 시작하지 않았기 때문에 오늘의 경기결과를 보여주는 Home 페이지는 나중에 제작하기로 하고 일단 경기를 검색할 수 있는  Scores페이지를 만들어보도록 한다.

 

처음 목표는 사이드바를 만들고 날짜 선택과 팀 선택을 만드는 것이다.

 

python 기본 모듈인 datetime을 사용한다.

from datetime import datetime

다음으로 날짜를 입력할 수 있는 사이드바를 만든다. date_input은 날짜를 선택할 수 있는 UI함수이다. date에 선택한 날짜가 담긴다.

date = st.sidebar.date_input('날짜 선택')

MLB에는 30개의 팀이 있는데 2개의 리그로 나뉘어지고 또 이 리그는 3개의 지구로 나뉘게 된다. 따라서 팀선택을 위해서는 먼저 리그를 선택하고 다시 그 리그에 대한 지구를 선택해야한다.

league = st.sidebar.selectbox('리그 선택',('내셔널 리그', '아메리칸 리그'))
    if league == '내셔널 리그':
        region = st.sidebar.selectbox('지구 선택',('동부', '중부', '서부'))
        if region == '동부':
            team = st.sidebar.selectbox('팀선택', ('애틀랜타 브레이브스', '마이애미 말린스', '뉴욕 매츠', '필라델피아 필리스', '워싱턴 내셔널스'))
        elif region == '중부':
            team = st.sidebar.selectbox('팀선택', ('시카고 컵스', '신시내티 레즈', '밀워키 브루어스', '피츠버그 파이리츠', '세인트루이스 카디널스'))
        elif region == '서부':
            team = st.sidebar.selectbox('팀선택', ('애리조나 다이아몬드백스', '콜로라도 로키스', '로스앤젤레스 다저스', '샌디에이고 파드리스', '샌프란시스코 자이언츠'))
    elif league == '아메리칸 리그':
        region = st.sidebar.selectbox('지구 선택',('동부', '중부', '서부'))        
        if region == '동부':
            team = st.sidebar.selectbox('팀선택', ('볼티모어 오리올스', '보스턴 레드삭스', '뉴욕 양키스', '템파베이 레이스', '토론토 블루제이스'))
        elif region == '중부':
            team = st.sidebar.selectbox('팀선택', ('시카고 화이트삭스', '클리블랜드 가디언스', '디트로이트 타이거스', '캔자스시티 로열스', '미네소타 트윈스'))
        elif region == '서부':
            team = st.sidebar.selectbox('팀선택', ('휴스턴 애스트로스', '로스앤젤레스 에인절스', '오클랜드 애슬레틱스', '시애틀 매리너스', '텍사스 레인저스'))

MLB-StatsAPI에서 원한는 팀 경기 결과를 검색하기 위해서는 날짜와 팀id를 알아야한다. 

 

팀 id는 이렇게 되있기 때문에 입력받은 값은 팀 id로 바꿔주어야한다.

지구 구단명 Team_Id
아메리칸 리그
동부 볼티모어 오리올스 (Baltimore Orioles) 110
보스턴 레드삭스(Boston Red Sox) 111
뉴욕 양키스(Newyork Yankees) 147
템파베이 레이스 (Tampa Bay Rays) 139
토론토 블루제이스 (Toronto Blue Jays) 141
중부 시카고 화이트삭스 (Chicago White Sox) 145
클리블랜드 가디언즈 (Cleveland Guardians) 114
디트로이트 타이거즈 (Detroit Tigers) 116
캔자스시티 로열스 (Kansas City Royals) 118
미네소타 트윈스 (Minnesota Twins) 142
서부 휴스턴 애스트로스 (Houston Astros) 117
로스엔젤레스 에인절스 (Los Angeles Angels) 108
오클랜드 애슬레틱스 (Oakland Athletics) 133
시애틀 매리너스 (Seattle Mariners) 136
텍사스 레인저스 (Texas Rangers) 140
내셔널 리그
동부 애틀란타 브레이브스 (Atlanta Braves) 144
마이애미 말린스 (Miami Marlins) 146
뉴욕 메츠 (New York Mets) 121
필라델피아 필리스 (Philadelphia Phillies) 143
워싱턴 내셔널스 (Washington Nationals) 120
중부 시카고 컵스 (Chicago Cubs) 112
신시내티 레즈 (Cincinnati Reds) 113
밀워키 브루어스 (Milwaukee Brewers) 158
피츠버그 파이리츠 (Pittsburgh Pirates) 134
세인트루이스 카디널스 (St. Louis Cardinals) 138
서부 애리조나 다이아몬드백스 (Arizona Diamondbacks) 109
로스엔젤레스 다저스 (Los Angeles Dodgers) 119
콜로라도 로키스 (Colorado Rockies) 115
샌디에이고 파드리스 (San Diego Padres) 135
샌프란시스코 자이언츠 (San Francisco Giants) 137

표 출처 : https://minding-deep-learning.tistory.com/64

 

[MLB Stats API] 파이썬 패키지로 MLB Stats API 사용해보기

Fangraph나 MLB savant 홈페이지에서 직접 csv, DB파일을 다운로드 받는 것이 아닌 MLB서버에 연결된 API로 손쉽게 데이터를 구할 수 있는 방법을 야구공작소 글을 보며 알게되었다. 그 중 파이썬으로 API

minding-deep-learning.tistory.com

if team == '애틀랜타 브레이브스':
        team_id = 144
    elif team == '마이애미 말린스':
        team_id = 146
    elif team == '뉴욕 매츠':
        team_id = 121
    elif team == '필라델피아 필리스':
        team_id = 143
    elif team == '워싱턴 내셔널스':
        team_id = 120
    elif team == '시카고 컵스':
        team_id = 112
    elif team == '신시내티 레즈':
        team_id = 113
    elif team == '밀워키 브루어스':
        team_id = 158
    elif team == '피츠버그 파이리츠':
        team_id = 134
    elif team == '세인트루이스 카디널스':
        team_id = 138
    elif team == '애리조나 다이아몬드백스':
        team_id = 109
    elif team == '콜로라도 로키스':
        team_id = 115
    elif team == '로스앤젤레스 다저스':
        team_id = 119
    elif team == '샌디에이고 파드리스':
        team_id = 135
    elif team == '샌프란시스코 자이언츠':
        team_id = 137
    elif team == '볼티모어 오리올스':
        team_id = 110
    elif team == '보스턴 레드삭스':
        team_id = 111
    elif team == '뉴욕 양키스':
        team_id = 147
    elif team == '템파베이 레이스':
        team_id = 139
    elif team == '토론토 블루제이스':
        team_id = 141
    elif team == '시카고 화이트삭스':
        team_id = 145
    elif team == '클리블랜드 가디언스':
        team_id = 114
    elif team == '디트로이트 타이거스':
        team_id = 116
    elif team == '캔자스시티 로열스':
        team_id = 118
    elif team == '미네소타 트윈스':
        team_id = 142
    elif team == '휴스턴 애스트로스':
        team_id = 117
    elif team == '로스앤젤레스 에인절스':
        team_id = 108
    elif team == '오클랜드 애슬레틱스':
        team_id = 133
    elif team == '시애틀 매리너스':
        team_id = 136
    elif team == '텍사스 레인저스':
        team_id = 140

날짜도 미국식으로 바꿔주어야 하기 때문에 앞서 입력 받은 date를 변환해준다. strftime 함수를 이용해 날짜 형식을 바꿔준다.

date = date.strftime("%m/%d/%Y")
statsapi.schedule 함수를 이용하면 그날의 경기 결과를 가져올 수 있다.
scores = statsapi.schedule(start_date=date,team=team_id)

2022년 8월 31일 샌디에이고의 경기 정보

[
0:{
"game_id":662033
"game_datetime":"2022-08-31T19:45:00Z"
"game_date":"2022-08-31"
"game_type":"R"
"status":"Final"
"away_name":"San Diego Padres"
"home_name":"San Francisco Giants"
"away_id":135
"home_id":137
"doubleheader":"N"
"game_num":1
"home_probable_pitcher":"Alex Wood"
"away_probable_pitcher":"Joe Musgrove"
"home_pitcher_note":""
"away_pitcher_note":""
"away_score":5
"home_score":4
"current_inning":9
"inning_state":"Bottom"
"venue_id":2395
"venue_name":"Oracle Park"
"national_broadcasts":[]
"series_status":"SD wins 3-0"
"winning_team":"San Diego Padres"
"losing_team":"San Francisco Giants"
"winning_pitcher":"Joe Musgrove"
"losing_pitcher":"Alex Wood"
"save_pitcher":"Josh Hader"
"summary":"2022-08-31 - San Diego Padres (5) @ San Francisco Giants (4) (Final)"
}
]

728x90