API 데이터 땡겨오기
먼저 라이엇게임즈의 API 사이트에서 API Key를 발급받습니다. 발급방법은 아래글에서 보실 수 있습니다!
2023.06.03 - [데이터분석] - 라이엇 게임즈 오픈 API 데이터 전처리
라이엇 게임즈 오픈 API 데이터 전처리
들어가며 오늘은 라이엇게임즈의 오픈 API를 이용해서 데이터를 전처리해보고자 한다. 이후 이 데이터를 이용해 슈퍼셋의 대시보드를 구성해 보고자 한다. 이전글에서는 슈퍼셋을 설치하는 방
holateo.tistory.com
API Key를 발급받았다면 이제 라이엇게임즈의 오픈데이터를 이용할 수 있는 "자유이용권"을 얻었습니다.
저는 데이터 분석가이기 때문에 자유이용권으로 파이썬 코드를 짜서 TFT(롤토체스)를 잘하는 사람은 어떻게 플레이하는지에 대한 궁금증을 풀어보고자 합니다.
하지만 저는 지금부터 파이썬을 아예 다룰 줄 모르는 데이터 분석가입니다. 대신 Chat-GPT가 저를 도와줄 겁니다. Chat GPT 3.5 버전으로 작성할 예정입니다. (4.0 버전을 이용하기 위해 개인적으로 구독하였지만, 속도가 아직 느렸습니다..)
먼저, 롤을 플레이했던 기록 정보인 매치 ID(Match_id)를 구합니다. ("롤을 잘하는"의 기준은 그랜드마스터 티어라고 하겠습니다.)
한 매치에 있었던 플레이어의 고유 ID를 구하기 위해 Chat-GPT에게 역할을 부여하고, 코드를 짜게 해 줍니다. 그리고 정확한 코드를 위해 예시 URL까지 미리 제공해 둡니다. 아래처럼 Chat-GPT에게 자세히 질문한다면 한 번에 정확한 코드를 아래처럼 가져와줍니다.
유데미에서 감사히도 지원해 주셔서 Chat-GPT로 파이썬 데이터분석을 하는 강의를 들었었는데 해당 강의 내용에서 GPT에게 역할을 부여하고, 질문을 재차 하며 더 구체적으로 할수록 좋은 결과를 얻을 수 있다는 점을 이용했습니다. 추후 강의에 대한 후기를 쓸 예정이고, GPT에게 의사결정을 더 효과적으로 하게 하는 방법 등 많은 꿀팁을 가지고 올 예정입니다.
Chat-GPT가 대답한 Match_ID를 가져오는 코드
import requests
# Riot Games API 키
api_key = XXX # 직접 발급받은 API KEY 입력
# 그랜드마스터 티어 유저들의 summoner_id 가져오기
grandmaster_url = f'https://kr.api.riotgames.com/tft/league/v1/grandmaster?queue=RANKED_TFT&api_key={api_key}'
response = requests.get(grandmaster_url)
if response.status_code == 200:
grandmaster_data = response.json()
summoner_ids = [entry['summonerId'] for entry in grandmaster_data['entries']]
else:
print(f'Failed to fetch grandmaster data. Status code: {response.status_code}')
summoner_ids = []
# summoner_id를 puuid로 변환하고 match_id 가져오기
match_ids = []
for summoner_id in summoner_ids:
summoner_url = f'https://kr.api.riotgames.com/tft/summoner/v1/summoners/{summoner_id}?api_key={api_key}'
response = requests.get(summoner_url)
if response.status_code == 200:
summoner_data = response.json()
puuid = summoner_data['puuid']
match_url = f'https://asia.api.riotgames.com/tft/match/v1/matches/by-puuid/{puuid}/ids?start=0&count=20&api_key={api_key}'
response = requests.get(match_url)
if response.status_code == 200:
match_ids.extend(response.json())
else:
print(f'Failed to fetch match data for summoner {summoner_id}. Status code: {response.status_code}')
else:
print(f'Failed to fetch summoner data for summoner {summoner_id}. Status code: {response.status_code}')
# 중복 제거
unique_match_ids = list(set(match_ids))
print(f'Total unique match IDs for Grandmaster players in Korea: {len(unique_match_ids)}')
Match_id로 얻을 수 있는 API의 정보를 정리해 봤습니다. 해당 정보를 통해 ERD를 작성하고, 데이터를 집계하여 이용할 예정입니다.
- Summoner 정보:
- puuid: 유저의 고유 식별자
- gold_left: 게임 종료 시 남은 골드
- last_round: 게임 종료 시 유저의 마지막 라운드
- level: 게임 종료 시 유저의 레벨
- placement: 게임 종료 시 유저의 순위
- players_eliminated: 게임 종료 시 유저가 제거한 플레이어 수
- time_eliminated: 게임 종료 시간
- total_damage_to_players: 전체 플레이어에게 입힌 피해량
- 아이템 정보:
- 플레이어가 가지고 있는 아이템 목록
- 각 아이템은 고유한 ID로 식별
- 챔피언(유닛) 정보:
- character_id: 챔피언의 고유 ID
- name: 챔피언의 이름 (예시에서는 비어 있음)
- rarity: 챔피언의 희귀도 (1부터 5까지, 높을수록 레어)
- tier: 챔피언의 티어 (1부터 5까지, 레벨업한 경우 티어 상승)
- itemNames: 챔피언이 가지고 있는 아이템 목록
- 증강체(Traits) 정보:
- name: 증강체의 이름
- num_units: 해당 증강체를 가진 챔피언의 수
- style: 증강체 스타일
- tier_current: 현재 증강체의 티어
- tier_total: 증강체의 총 티어 수
- 컴패니언(Companion) 정보:
- content_ID: 컴패니언의 고유 ID
- item_ID: 컴패니언의 아이템 ID
- skin_ID: 컴패니언의 스킨 ID
- species: 컴패니언의 종류
여기서 이제 원하는 정보를 모아서 증강체, 유닛, 장착 아이템 등에 대한 분석을 실시해 봅시다!
API에 접근 시 429 에러가 날 때는 요청제한이 왔다는 뜻이므로 대기하는 시간을 코드에 첨부하고, 추가로 위 코드를 실행 시에 났던 에러 역시 그대로 질문해서 GPT로 해결할 수 있습니다.
아래는 에러를 해결하면서 원하는 코드를 짜준 Chat-GPT의 코드입니다.
# 모든 match_id가 저장된 리스트 (unique_match_ids에 해당)
match_ids = unique_match_ids
# 데이터프레임 초기화
augments_df = pd.DataFrame(columns=['match_id', 'first_augments', 'second_augments', 'third_augments'])
# API 요청 시 일정 횟수만큼 대기하는 함수
def wait_for_rate_limit():
time.sleep(10) # 10초 대기
for match_id in match_ids:
# match_id를 이용하여 API 요청 보내기
match_url = f'https://asia.api.riotgames.com/tft/match/v1/matches/{match_id}?api_key={api_key}'
response = requests.get(match_url)
if response.status_code == 200:
match_data = response.json()
participants = match_data['info']['participants']
# 각 플레이어의 첫 번째, 두 번째, 세 번째 augments 가져오기
first_augments = [player['augments'][0] if player['augments'] else None for player in participants]
second_augments = [player['augments'][1] if len(player['augments']) > 1 else None for player in participants]
third_augments = [player['augments'][2] if len(player['augments']) > 2 else None for player in participants]
# 데이터프레임에 데이터 추가
data = {'match_id': match_id, 'first_augments': first_augments, 'second_augments': second_augments, 'third_augments': third_augments}
augments_df = pd.concat([augments_df, pd.DataFrame(data)], ignore_index=True)
elif response.status_code == 429:
# 429 오류 발생 시 일정 시간 대기 후 다시 시도
print(f'Rate limit exceeded. Waiting for 10 seconds...')
wait_for_rate_limit()
else:
print(f'Failed to fetch data for match_id {match_id}. Status code: {response.status_code}')
# 데이터프레임 출력
print(augments_df)
ERD 구성 및 테이블 생성
위 코드로 구성된 TFT ERD를 간단하게 구성해 봤습니다. 해당 API를 작정하고 사용할게 아니지만, ERD를 구성했을 때 데이터를 더 넓게 볼 수 있고, 더 최적화된 모델을 구성할 수 있지 않을까에 대한 생각을 하게 되어서 새로운 데이터를 수집할 때는 ERD를 작성하는 편입니다.
하지만 소환사 테이블에 있는 유저 하나에 챔피언과 증강체는 평균적으로 8개 정도가 들어갈 수 있기 때문에 예시 데이터 분석하기에는 너무 무거웠습니다.
그래서 아이템 테이블에는 최종 순위가 1~2위인 경우만 추출하도록 했고, 아이템이 장착되지 않은 챔피언은 데이터로 적재하지 않도록 조건을 주었습니다. 증강체 테이블에도 실버증강체까지 모두 포함할 경우 너무 많은 데이터를 적재해야 하기 때문에 골드, 플레티넘 증강체 적용 시에만 데이터를 적용하도록 했습니다.
GPT가 작성해 준 코드로 API 추출해 본 후기
Chat-GPT로 데이터를 추출하는 데 API에 대한 허들이 존재했습니다. 하지만 GPT에게 구체적으로 원하는 답이 나올 때까지(10번 넘게 수정해서 재질문을 한 적도 있었습니다.) 질문을 해서 코드를 쉽게 실행할 수 있었습니다.
데이터 분석에서는 결국 뿌리인 데이터를 어떻게 수집/적재할 것인가에 대한 부분도 굉장히 중요한데, 이 부분에 대해서 비용효율적으로 접근이 가능하다는 사실을 알게 되었습니다!
이제 다음 글에서 생성된 데이터셋을 가지고, 그랜드마스터의 경기에 대한 몇 가지 EDA를 진행해 보겠습니다! 역시 Chat-GPT로 진행해 보겠습니다.