들어가며
오늘은 라이엇게임즈의 오픈 API를 이용해서 데이터를 전처리해보고자 한다. 이후 이 데이터를 이용해 슈퍼셋의 대시보드를 구성해 보고자 한다. 이전글에서는 슈퍼셋을 설치하는 방법을 소개했다.
2023.05.17 - [데이터분석] - 에어비앤비가 사용하는 Open BI툴, 슈퍼셋을 사용해보자 - 슈퍼셋(SuperSet) 연결(1)
우선 오픈API의 데이터를 추출하는 방식은 구글링으로 도움을 많이 받을 수 있었고, 해당 과정을 나만의 방식으로 글을 작성해보려고 한다.
1. API키 발급받기 (사이트)
이제 발급받은 API KEY를 이용해 라이엇게임즈의 오픈 API를 마음껏 이용하면 된다.
2. 이후 전략적 팀 전투(TFT)의 그랜드마스터 경기 데이터를 추출한다. 그리고 추출한 API_KEY를 이용해 TFT의 그랜드마스터 티어 경기 데이터를 추출한다. 다만, puuid라는 고유 id를 추출하여 유저의 경기 데이터를 봐야 한다.(코드)
import pandas as pd
import json
import requests
from tqdm import tqdm
API_KEY = '발급받은 API_KEY'
# TFT 그랜드마스터 티어 경기 수집
url = 'https://kr.api.riotgames.com/tft/league/v1/grandmaster?api_key=' + API_KEY
summonerId = {}
r = requests.get(url)
r = r.json()['entries'] # 매치 내 유저 데이터
num = 0
for i in r:
summonerId[i['summonerName']] = i['summonerId']
num += 1
print(num)
# 매치 내 유저 데이터에서는 puuid가 존재하지 않기 때문에, 매핑하여 puuid를 추출함
puuid = {}
for i,j in zip(tqdm(summonerId.values()),summonerId.keys()):
url2 = 'https://kr.api.riotgames.com/tft/summoner/v1/summoners/by-name/' + i + '?API_KEY=' + API_KEY
r = requests.get(url2)
if r.status_code == 200:
pass
elif r.status_code == 429: # 에러코드 수신 시 무한 루프로 데이터를 무조건 수집하도록 설정
print('api cost full : infinite loop start')
print('loop location : ',i)
start_time = time.time()
while True:
if r.status_code == 429:
print('try 120 second wait time')
time.sleep(120)
r = requests.get(url2)
print(r.status_code)
elif r.status_code == 200:
print('total wait time : ', time.time() - start_time)
print('recovery api cost')
break
elif r.status_code == 404 or r.status_code == 401:
try:
puuid = r.json()['puuid']
except:
print('404 에러')
pid = r.json()['puuid']
puuid.append(pid)
df_puuid = pd.DataFrame(puuid, index = [0])
df_puuid.columns = ['puuid']
3. 유저의 고유 id인 puuid를 추출하고, 해당 유저의 최근 경기 데이터를 추출한다. (코드)
matchId = []
for i in tqdm(df_puuid['puuid']):
# count의 값을 변경하여 추출하기 원하는 경기 수를 조절
url_match = 'https://asia.api.riotgames.com/tft/match/v1/matches/by-puuid/'+ i +'/ids?start=0&count=10&api_key='+API_KEY
r_match = requests.get(url_match)
if r_match.status_code == 200:
pass
elif r_match.status_code == 429:
print('api cost full : infinite loop start')
print('loop location : ',i)
start_time = time.time()
matchId.extend(requests.get(url_match).json())
len(matchId)
# 중복 제거
match_set = set(matchId)
match_list = list(match_set)
len(match_list)
4. 경기의 데이터를 중복 제거 후에 매치 데이터 내에 정보를 뽑는다.(코드)
matchdata = {}
num = 0
for i in tqdm(match_list):
if num%7 == 0:
time.sleep(4)
elif num%100 == 0:
print('Wait 121s')
time.sleep(121)
num += 1
url4 = 'https://asia.api.riotgames.com/tft/match/v1/matches/' + str(i) +'?api_key=' + API_KEY
r = requests.get(url4)
if r.status_code == 200:
pass
elif r.status_code == 429:
print('api cost full : infinite loop start')
print('loop location : ',i)
start_time = time.time()
while True:
if r.status_code == 429:
print('try 120 second wait time')
time.sleep(120)
r = requests.get(url2)
print(r.status_code)
elif r.status_code == 200:
print('total wait time : ', time.time() - start_time)
print('recovery api cost')
break
try:
r = r.json()['info']['participants']
matchdata[i] = r
except:
print("기타 에러")
with open('./matchdata.json','w') as f:
json.dump(matchdata, f, ensure_ascii=False, indent=4)
5. 게임 내 데이터를 데이터프레임에 넣어 수집한다.
# 빈 데이터프레임 만들기
temp_df = pd.DataFrame(columns=['no','gameNo','playerNo','companion',
'gold_left',
'last_round',
'level',
'placement',
'players_eliminated',
'puuid',
'time_eliminated',
'total_damage_to_players',
'traits',
'units'])
# for 문으로 데이터 추출
i=0
for j in tqdm(list(matchdata.keys())):
for k in range(0,10):
temp_df.loc[i*10+k] = [i, j, k, matchdata[j][k]["companion"],
matchdata[j][k]["gold_left"],
matchdata[j][k]["last_round"],
matchdata[j][k]["level"],
matchdata[j][k]["placement"],
matchdata[j][k]["players_eliminated"],
matchdata[j][k]["puuid"],
matchdata[j][k]["time_eliminated"],
matchdata[j][k]["total_damage_to_players"],
matchdata[j][k]["traits"],
matchdata[j][k]["units"]]
i += 1
정리하며
라이엇게임즈의 오픈 API 데이터를 이용해 데이터를 추출하는 작업을 해보았다. 실제로 데이터를 받아서 대시보드를 만들어보았지만(다음글에서 다룰 예정) 생각보다 데이터가 굉장히 잘 정재 되어있었다.
슈퍼셋에서는 DB연결뿐만 아니라 csv파일 업로드 기능도 존재하기 때문에 데이터가 잘 추출된다면 얼마든지 대시보드로 표현이 가능하지 않을까 싶다. 특히 TFT의 경우 게임에 대한 이해도가 높기 때문에 대시보드를 만드는 시간이 재미있기도 했다.(추출하는 과정은 재미가 없었다..)
이번글에 대한 회고를 잠깐 해보자면 개인적인 문제점이 있기도 했다.
먼저, 파이썬에 익숙하지 않기 때문에 추출하기가 어려웠다. 특히 for문이나 while의 작동법이나 그 안에서 list를 활용하는 방법에서 이해도 차이가 있었다.
마지막으로 다음글에서는 추출한 데이터를 토대로 슈퍼셋의 대시보드를 이용해 보고, 리뷰를 해볼 예정이다.
'데이터분석' 카테고리의 다른 글
ChatGPT와 파이썬을 활용한 데이터 사이언티스트 및 데이터 분석 수강 후기 (2) | 2024.02.16 |
---|---|
첫 게임 분석 프로젝트 회고..를 회고하다! (내가 자처한 회고) (4) | 2023.12.22 |
유저가 찾는 대시보드의 특징 : 개인화 대시보드 (0) | 2023.07.15 |
에어비앤비가 사용하는 Open BI툴, 슈퍼셋을 사용해보자 - 라이엇 오픈 API 데이터 (2) (0) | 2023.06.17 |
에어비앤비가 사용하는 Open BI툴, 슈퍼셋을 사용해보자 - 슈퍼셋(SuperSet) 연결(1) (0) | 2023.05.17 |