칼바람 조합 승률을 예측해보자 - 1
서론
그래픽 카드를 비싼 걸 샀으나 고사양 게임을 자주 하지도 않고 벤치 점수 놀이도 관심이 없어서 어디다 쓰나 생각하는 와중에 머신러닝 야학을 듣게 되었다. 생각보다 간단하게 딥러닝이 돌아가는 것을 보면서 '이 정도면 대충 해볼 만하지 않을까?' 해서 한번 시작해 보게 되었다. 칼바람 조합 승률을 알아보려 하는 이유는 다음과 같다.
- 평소에 궁금했다.(ex 우리팀 문도가 말파이트를 했다면 더 좋은 조합이 아녔을까?, 이 조합으로는 상대 조합을 이길 수 없는 걸까? 등)
- 칼바람을 메인으로 돌리는 유저이기 때문에 결과가 이상해도 잘 해석할 수 있다고 생각한다.
- 만들 때 찾아보니 해외에도 없다.
아마 중간에 실패할 가능성이 높지만 그래도 최선을 다 할 것이다.
계획
학습을 위해서는 많은 데이터와 적절한 모델이 필요하다. 찾아보니 라이엇은 API로 자료들을 찾을 수 있게 해두었다. 로그인하면 24시간 동안 쓸 수 있는 키를 주는데 제품을 등록하면 1초에 20개, 2분에 100개 요청 제한은 똑같지만 키가 안 바뀌나? 사실 다른 블로그에서 개인 연구용으로도 신청 가능하다 하길래 신청했지만 아직 내 제품은 검토 중이기 때문에 뭐가 달라지는지 잘 모르겠다. 어차피 계속 키를 받을 수 있으니 반자동으로 한다고 생각하자.
계획은 이렇다.
- SUMMONER-V4 API로 내 accountId를 얻는다.
- MATCH-V4의 matchlists로 내 accountId로 내 matchlist를 얻는다. 이때 queue 450이 칼바람(무작위 총력전)이고 하는김에 season도 13으로 했다.
- MATCH-V4의 matches 얻은 matchId로 match를 얻어 같은팀과 상대팀의 accountId과 챔피언, 팀의 승패를 받아온다.
- 얻은 accountId로 다시 matchlist를 얻고... 반복한다.
지금 데이터를 수집하는 코드다. pandas와 requests 가 설치되어 있어야 한다. 파일 저장 말고는 인덱스를 유지할 방법을 몰라 account.txt와 match.txt가 있다. 다른 방법을 알면 바꾸자. 쓸데없이 드라이브 수명 먹는 거 같아 기분이 나쁘다.
import requests
import json
import csv
import os
import logging
import time
import pandas as pd
def collectmatch(match_id, token):
url = 'https://kr.api.riotgames.com/lol/match/v4/matches/'
matchId = match_id
url = url + matchId
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36",
"Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
"Accept-Charset": "application/x-www-form-urlencoded; charset=UTF-8",
"Origin": "https://developer.riotgames.com",
"X-Riot-Token": token
}
while True:
response = requests.get(url, headers=headers)
print(str(response.status_code) + ' ' + matchId)
code = response.status_code
if code == 429:
print('time!!!')
time.sleep(60)
print('60!')
time.sleep(30)
print('30!')
time.sleep(30)
if code == 200:
break
json_data = response.json()
print(json_data['gameVersion'])
f = open('./match/match_' + matchId + '.csv', 'w', newline='')
wr = csv.writer(f)
wr.writerow(['game_ver', 'team1', 'team2',
'champion1', 'champion2', 'champion3', 'champion4', 'champion5',
'champion6', 'champion7', 'champion8', 'champion9', 'champion10'])
wr.writerow([json_data['gameVersion'], json_data['teams'][0]['win'], json_data['teams'][1]['win'],
json_data['participants'][0]['championId'], json_data['participants'][1]['championId'],
json_data['participants'][2]['championId'], json_data['participants'][3]['championId'],
json_data['participants'][4]['championId'], json_data['participants'][5]['championId'],
json_data['participants'][6]['championId'], json_data['participants'][7]['championId'],
json_data['participants'][8]['championId'], json_data['participants'][9]['championId']])
f.close()
f = open('D:/riot/accountId/accounts.csv', 'a', newline='')
wr = csv.writer(f)
for j in range(0, 10):
wr.writerow([json_data['participantIdentities']
[j]['player']['accountId']])
f.close()
def matchlist(accId, token):
accountId = accId
url = 'https://kr.api.riotgames.com/lol/match/v4/matchlists/by-account/'
url = url + accountId + '?queue=450&season=13'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36",
"Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
"Accept-Charset": "application/x-www-form-urlencoded; charset=UTF-8",
"Origin": "https://developer.riotgames.com",
"X-Riot-Token": token
}
while True:
response = requests.get(url, headers=headers)
print(str(response.status_code) + ' ' + accountId)
code = response.status_code
if code == 429:
print('time!!!')
time.sleep(60)
print('60!')
time.sleep(30)
print('30!')
time.sleep(30)
if code == 200:
break
json_data = response.json()
f = open('D:/riot/match/match_list.csv', 'a', newline='')
wr = csv.writer(f)
for i in range(0, len(json_data['matches'])):
wr.writerow([json_data['matches'][i]['gameId']])
f.close()
token = "API 키 넣는 곳"
log = open('D:/riot/account.txt', 'r')
account_index = int(log.readline())
log.close()
log = open('D:/riot/match.txt', 'r')
match_index = int(log.readline())
log.close()
while True:
df = pd.read_csv('D:/riot/accountId/accounts.csv', header=None)
df = df.drop_duplicates(keep='first')
df.to_csv('D:/riot/accountId/accounts.csv', header=False, index=False)
for j in range(account_index, len(df)):
matchlist(df.iloc[j][0], token)
account_index = account_index + 1
log = open('./account.txt', 'w')
log.write(str(account_index))
log.close()
df = pd.read_csv('D:/riot/match/match_list.csv', header=None)
df = df.drop_duplicates(keep='first')
df.to_csv('D:/riot/match/match_list.csv', header=False, index=False)
for j in range(match_index, len(df)):
collectmatch(str(df.iloc[j][0]), token)
match_index = match_index + 1
log = open('./match.txt', 'w')
log.write(str(match_index))
log.close()
원래 컴퓨터로 돌리다가 생각보다 데이터가 천천히 모여 라즈베리파이에서 돌리고 있다.
라즈베리파이에서도 pandas와 requests를 설치후 파일 주소를 바꾼 뒤 돌리면!!!
github.com/numpy/numpy/issues/14772
libf77blas.so.3: cannot open shared file: no such file or directory · Issue #14772 · numpy/numpy
-Operating System: Raspbian Stretch (9) -How Python was installed: Python 3.5.3 is default Python3 on Stretch -How numpy was installed: pip installed under virtual environment (version 1.17.3) -Pyt...
github.com
이런 오류를 만날 수 있다.
sudo apt-get install libatlas-base-dev
이걸 하면 되니 큰 걱정하지 말자.
다음글을 쓰려면 오랜 시간이 필요할듯하다.