나는 TFT의 상위 플레이어가 사용한 시너지, 증강체, 아이템, 캐릭터, 등수 등의 데이터로 분석 연습을 하고자 한다. 데이터 분석을 하기 위해서는 데이터가 있어야 하니 우선 TFT 매치 데이터를 수집해보자.
지금부터 Python과 Riot API를 이용해 TFT(롤토체스)의 데이터를 모아볼 것이다.
LOL-TFT의 데이터를 얻을 수 있는 다양한 경로가 있다. TFT 데이터 분석을 해보자 마음 먹고 제일 처음 찾은 것은 Kaggle의 어느 유저가 공유한 데이터였는데, 예전 시즌의 데이터라 그런지 흥미가 생기지 않았다. 가장 최근의 패치가 적용된 경기 데이터를 어디서 얻을 수 있을까 알아보던중 Riot에서도 API를 이용해 데이터를 받을 수 있다는 사실을 발견했다. 방법도 생각보다 간단하다. LOL을 하는 유저라면 따로 아이디를 만들 필요 없이 Riot-Developer 포탈에 로그인을 하고 메일 인증만 하면 정말 정말 쉽게 api key를 받을 수 있다.
API Key 발급 방법
해당 사이트(https://developer.riotgames.com/)에 로그인 -> REGISTER PRODUCT -> PERSONAL API KEY(Production API Key는 아무나 받을 수 없다.)
Key 바로 아래 'Expires : ~요일, ~월 ~일, 202x @ ~시간'은 Key의 만료일이며 그 옆에 남에 시간이 나오는데, 해당 시간이 지나면 다시 발급받아서 사용하면 된다. 재발급은 맨 아래 "REGENERATE API KEY"를 누르면 된다. Rate Limits을 보면 1초에 20 requests, 2분에 100 requests 제한이 있다. Production API에 비하면 매우 작다. 자세한 사항은 (https://developer.riotgames.com/docs/portal#web-apis_rate-limiting) 이곳을 보면 된다.
데이터를 가져오는 과정
한번에 내가 원하는 데이터를 가져올 수 없다. 앞으로 할 과정을 미리 요약하면 다음과 같다.
한국(KR)서버의 챌린저 티어의 경기 데이터를 가져오길 원하는 경우,
(1) KR서버에서 챌린저 티어에 있는 플레이어들의 "summonerId" 가져오기.
(2) 챌린저 ID를 이용해 해당 ID 각각의 puuid 가져오기. (input: summonerId -> output: puuid)
(3) puuid로 각 플레이어가 진행했던 matchID 가져오기. (input: puuid -> output: matchid)
(4) matchID에 해당하는 match data 가져오기. (input: matchid -> output: match data)
*puuid: Riot에서는 소환사ID, 계정ID, 그리고 PUUID 라는 총 3가지 ID를 사용한다. 소환사ID나 계정ID는 각 서버의 region(나라)이 다르다면 중복이 가능하나 PUUID는 모든 서버에서 중복되지 않는 ID이다.
*matchid: 만약 내가 오늘 5판 롤체를 했다면, 다섯 경기에 대하여 각각 한 개의 id(총 5개)가 생성된다.
-아래는 API key를 발급 받은 후의 과정이다.-
1. 메모장에 API Key 저장
포탈에서 받은 API key를 복사한다. 바로 파이썬 스크립트에서 직접 변수로 넣을 수도 있으나, 편의를 위해 python 작업 위치에 메모장으로 저장하자. 이어지는 코드를 이용하면 메모장에 저장된 API 번호를 Python에 그대로 불러올 수 있다.
2. Key를 변수에 넣기
저장해둔 메모장의 API Key를 getAPIkey() 함수를 이용해 변수로 가져왔다. open 함수 안에는 "저장위치/메모장이름.txt"를 넣는다.
def getAPIkey():
f = open("./riot_api.txt","r")
return f.read()
key = getAPIkey()
3. 챌린저 티어에 있는 아이디 가져오기
내가 원하는 데이터는 상위 티어 플레이어들의 경기 데이터이다.
우선 함수로 만들었는데, 인수로 key, tier, country를 넣으면 된다. 사실 생각해둔 지역과 티어가 있다면 인수로 만들 필요는 없다. 나는 나중에 다른 국가로도 데이터를 받아볼까 하여 인수로 남겨 놓았다.
key 인수에는 발급 받은 API key가 들어가며, tier는 challenger, master, ... 중 선택, country는 KR, JP1, NA1, RU, ... 중 선택하면 된다. 인수로 가능한 tier와 country는 Riot Developer에 들어가면 확인 가능하다.
import pandas as pd
import requests
import json
from pandas import json_normalize
def league_summoner(key, tier,country='kr',):
request =requests.get(f'https://{country}.api.riotgames.com/tft/league/v1/{tier}?api_key={key}')
return json.loads(request.content)
ch_summoner = league_summoner(key , tier='challenger')
ch_summoner
함수를 실행하면 아래와 같은 JSON 형태의 데이터가 들어온다.
json_normalize()함수는 json형태의 데이터를 flat table형태로 변환해준다. json_normalize(ch_summoner)하여 확인해보자. 데이터에 대한 자세한 사항은 디벨로퍼 포탈에서 확인해 볼 수 있다.
'entries' 내의 데이터를 보기 편한 형태로 데이터를 확인 해봤다. entries 외 데이터는 필요 없기 때문에 기존 변수에 덮어쓰고 확인해보자. 300 row x 10 col이다. 총 300명의 챌린저 플레이어에 대한 10가지 정보가 들어왔다.
ch_summoner = json_normalize(ch_summoner['entries'])
ch_summoner
다음으로 puuid를 얻기 위해서 summonerId가 필요하다.
summonerId = ch_summoner['summonerId']
summonerId
4. summonerId 로 puuid 가져오기
지금 보니 내가 왜 두 함수로 나눴는지 모르겠다.
rate limit 때문에 100번의 request마다 120초 동안 동작을 멈추게 했는데, 이 때문에 대략 8분의 시간이 소요됐다.
def summoner_info(summonerId , key, country='kr'):
request =requests.get(f'https://{country}.api.riotgames.com/tft/summoner/v1/summoners/{summonerId}?api_key={key}')
return json.loads(request.content)
from time import sleep
def summoner_puuid(summonerId):
summ_puuid = pd.Series([])
l = 100
for i in summonerId:
l += 1
if l%100 == 0:
sleep(120)
si = summoner_info(i,key,'kr')
si = json_normalize(si)
summ_puuid = summ_puuid.append(si['puuid'],ignore_index = True)
return summ_puuid
puuid = summoner_puuid(summonerId)
puuid
나머지는 다음에 이어서...
'데이터 분석 - Python' 카테고리의 다른 글
[데이터 분석]네이버 웹툰 콘텐츠 기반 필터링 with python (0) | 2022.12.16 |
---|---|
TFT 롤토체스 데이터 분석 #3 (0) | 2022.12.12 |
[데이터 분석] 네이버 웹툰 데이터 크롤링 with python (0) | 2022.10.17 |
TFT 롤토체스 데이터 분석 #2 (0) | 2022.03.30 |