프로젝트/Riot LoL

챔피언 별 밴픽률을 구해보자

SigmoidFunction 2021. 9. 24. 14:11
728x90

플레티넘 1,2,3의 유저정보를 빅쿼리에 저장해두었다. 플레 1,2,3의 챔프 밴픽률을 구해보자

 

from google.cloud import bigquery
from google.oauth2 import service_account
from google.cloud import storage
import ast
import numpy as np
import pyarrow

credentials = service_account.Credentials.from_service_account_file('admin.json')
bigquery_client = bigquery.Client(credentials=credentials, project='빅쿼리프로젝트')
storage_client = storage.Client(credentials=credentials, project='빅쿼리프로젝트')

# 쿼리 결과 불러서 변수로 저장하기
def bigquery_select(qry) :
    query_job = bigquery_client.query(qry)
    results = query_job.result()
    final_rst = []
    for rst in results:
        final_rst.append(rst[0])
    return final_rst

일단 빅쿼리를 불러오는 코드를 선입력해줍시다!

 

밴리스트를 DB에 저장할때 [1,2,3,4,5] 형태로 넣어버렸더니 string으로 들어갔다.

DB설계의 중요성을 알 수 있는...ㅠㅠ 

 

 

다음엔 DB에서 유저들이 어떤 챔피언을 선택했는지 보아야한다.

역시 DB를 이쁘게 만들었으면 쿼리를 이쁘게 날릴텐데...

DB설계의 중요성 2...

 


# target_game_data 가져와서 데이터프레임으로
qry = "SELECT win_team, player_0_championId, player_1_championId, player_2_championId, player_3_championId, player_4_championId, player_5_championId, player_6_championId, player_7_championId, player_8_championId, player_9_championId from `target_game_data` "
df = bigquery_client.query(qry).to_dataframe()

# 픽된 챔피언 데이터프레임을 리스트로 변환
df2 = df.drop('win_team', axis=1)
df3 = np.array(df2)
df4 = np.array(df3).flatten().tolist()

rst_all = []

blue_qry = "select blue_ban_list from `target_game_data` "
result = bigquery_select(blue_qry)
for i in result:
	rst_all = rst_all + ast.literal_eval(i)

red_qry = "select red_ban_list from `target_game_data` "
result = bigquery_select(red_qry)
for i in result:
	rst_all = rst_all + ast.literal_eval(i)

result = df4 + rst_all

쿼리를 날리고 받아온 데이터를 dataframe형태로 바꿔주었다. 그게 처리하기 쉬워서 그렇게 했다.

win_team columns을 날려주고 array로 변환한다음에 list로 바꿔주자

사실 애초에 쿼리에 win_team을 호출안해도 되긴 한다. 근데 다른 작업때문에 호출했다.

저건 개인적으로 슥삭 지우면 해결된다.

어찌되었든 저게 숫자하나하나 array로 되어있어서 저런 작업이 필요하다.

 

그리고 밴리스트는 승패 상관없이 다 불러와서 넣자!

근데 string이라서 숫자로 바꿔서 작업했다.

 

결국 result에는 픽된 챔프 + 밴된 챔프들이 모두 들어가게 된다.

 

여기서 밴픽률을 어떻게 구할 것인가?

 

챔프들이름으로 딕셔너리화해서 나온 챔프들을 카운트하고 경기 수로 나누어 주었다.

한게임당 10개의 챔프가 나오니까 대충 픽된 챔프 리스트를 10으로 나누어주면 경기 수가 작성된다.

 

banpick_result = {}
for k in set(result):
	banpick_result[k] = (((rst_all.count(k) + df4.count(k)) / (len(df4)/10)) * 100)

요로코롬

 

 

근데 이렇게하면 champion number로 나오기 때문에

{777:50.23234, 2:23.231321 ...} 이런 형태로 나오게 된다.

 

그래서 준비한 것이

 

챔피언 정보가 들어있는 DB!!

 

요거 뽑아오는 방법은 http://ddragon.leagueoflegends.com 여기서 제공하는 api를 통해 json형식으로 받아온다.

 

qry = "select id, key from cslee.ChampData"
champdata = bigquery_client.query(qry).to_dataframe()


champname = champdata.drop('key', axis=1)
allcham = champdata.drop('id', axis=1)
allcham2 = np.array(allcham)
chamlist = np.array(allcham2).flatten().tolist()
champname = np.array(champname)
champname = np.array(champname).flatten().tolist()

요롷게 챔프이름이랑 번호를 정리해주고

score = {}
for i, j in zip(chamlist,champname):
  try:
 	 score[j] = banpick_result[i]
  except:
  	print('데이터가 없습니다.')

print(score)

 

이렇게 나온다. 비에고가 69.5로 꽤나 점수가 높다.

728x90