프로젝트/Riot LoL

인게임 데이터에서 챔피언 조합과 포지션 정보 취합하기

SigmoidFunction 2021. 8. 23. 12:00
728x90

지난 포스팅에서 매치아이디를 가지고 유저들의 게임정보를 수집하였다.

 

이 정보를 가지고 어떤 것을 할 지에 대해 고민을 해야하는데...챔피언 조합 추천이 어떨까 생각을 해보았다.

 

그래서 각 게임마다 블루팀과 레드팀의 조합을 추출하고 각 챔피언이 어떤 라인에 섰는 지까지 뽑아보는 코드를 작성해보았다.

 

import pandas as pd

df = pd.read_csv("C:/RiotProject/aaa.csv", encoding='CP949')
# df2 = pd.read_csv("C:/RiotProject/practice/Champtag_All.csv")
df3 = pd.DataFrame({'Win':[],
                    'Lose':[],
                    'Win_Position':[],
                    'Lose_Position':[]})

먼저 인게임데이터를 불러오고 새로운 데이터 프레임을 만들어주었다.

 

Win에는 승리팀 조합이 Lose에는 패배팀 조합, 그리고 각 팀별 포지션이 순차적으로 들어갈 수 있도록 구성하였다.

 

데이터프레임으로 csv파일을 읽어왔기 때문에 무작정 넣어버리면 한줄한줄 읽는 것이 아니게 된다. 그래서 enumerate를 통해 한 행마다의 정보를 읽어올 수 있도록 하였다.

 

import pandas as pd

df = pd.read_csv("C:/RiotProject/aaa.csv", encoding='CP949')
df2 = pd.read_csv("C:/RiotProject/practice/Champtag_All.csv")
df3 = pd.DataFrame({'Win':[],
                    'Lose':[],
                    'Win_Position':[],
                    'Lose_Position':[]})

for i, j in enumerate(df["win_team"]):
    print(i)
    if j == 100:
        win_temp = []
        lose_temp = []
        result = []
        position = []
        win_position = []
        lose_position = []
        for k in range(5):
            win_temp.append(df.loc[i][f"player_{k}.championId"])
            if df.loc[i][f'player_{k}.individualPosition'] == 'TOP':
                win_position.append(1)
            elif df.loc[i][f'player_{k}.individualPosition'] == 'JUNGLE':
                win_position.append(2)
            elif df.loc[i][f'player_{k}.individualPosition'] == 'MIDDLE':
                win_position.append(3)
            elif df.loc[i][f'player_{k}.individualPosition'] == 'BOTTOM':
                win_position.append(4)
            elif df.loc[i][f'player_{k}.individualPosition'] == 'UTILITY':
                win_position.append(5)
            else:
                win_position.append(0)
        for k in range(5,10):
            lose_temp.append(df.loc[i][f"player_{k}.championId"])
            if df.loc[i][f'player_{k}.individualPosition'] == 'TOP':
                lose_position.append(1)
            elif df.loc[i][f'player_{k}.individualPosition'] == 'JUNGLE':
                lose_position.append(2)
            elif df.loc[i][f'player_{k}.individualPosition'] == 'MIDDLE':
                lose_position.append(3)
            elif df.loc[i][f'player_{k}.individualPosition'] == 'BOTTOM':
                lose_position.append(4)
            elif df.loc[i][f'player_{k}.individualPosition'] == 'UTILITY':
                lose_position.append(5)
            else:
                lose_position.append(0)

        result.append(win_temp)
        result.append(lose_temp)
        result.append(win_position)
        result.append(lose_position)
        df3 = df3.append(pd.Series(result, index=df3.columns), ignore_index=True)

    else:
        win_temp = []
        lose_temp = []
        result = []
        position = []
        win_position = []
        lose_position = []
        for k in range(5, 10):
            win_temp.append(df.loc[i][f"player_{k}.championId"])
            if df.loc[i][f'player_{k}.individualPosition'] == 'TOP':
                win_position.append(1)
            elif df.loc[i][f'player_{k}.individualPosition'] == 'JUNGLE':
                win_position.append(2)
            elif df.loc[i][f'player_{k}.individualPosition'] == 'MIDDLE':
                win_position.append(3)
            elif df.loc[i][f'player_{k}.individualPosition'] == 'BOTTOM':
                win_position.append(4)
            elif df.loc[i][f'player_{k}.individualPosition'] == 'UTILITY':
                win_position.append(5)
            else:
                win_position.append(0)
        for k in range(5):
            lose_temp.append(df.loc[i][f"player_{k}.championId"])
            if df.loc[i][f'player_{k}.individualPosition'] == 'TOP':
                lose_position.append(1)
            elif df.loc[i][f'player_{k}.individualPosition'] == 'JUNGLE':
                lose_position.append(2)
            elif df.loc[i][f'player_{k}.individualPosition'] == 'MIDDLE':
                lose_position.append(3)
            elif df.loc[i][f'player_{k}.individualPosition'] == 'BOTTOM':
                lose_position.append(4)
            elif df.loc[i][f'player_{k}.individualPosition'] == 'UTILITY':
                lose_position.append(5)
            else:
                lose_position.append(0)

        result.append(win_temp)
        result.append(lose_temp)
        result.append(win_position)
        result.append(lose_position)
        df3 = df3.append(pd.Series(result, index=df3.columns), ignore_index=True)



df3.to_csv("C:/RiotProject/TeamCombination_position.csv")

win_temp는 [1,2,3,4,5]식으로 적혀있을 것이다. 이걸 그대로 데이터프레임이 append한다면 열의 길이도 맞지 않고 열의 길이가 맞다하더라도 하나씩 들어가기 때문에 리스트 속의 리스트를 만들어서 넣게 되면 이쁘게 들어가게 되었다. 

 

df3에 Win, Lose, Win_position, Lose_position이 있기 때문에 

 

result = [[win정보],[Lose정보],][Win_position정보],[Lose_position]]의 형태로 넣어주고 df3에 append하면 

 

각 컬럼에 알맞게 들어가게 된다. 

 

실제로 실행해보면 

 

 

이런 식으로 완성된다!!!

 

 

 

챔피언넘버를 추출하는 방법은 다음과 같다.

 

import requests
import pandas as pd


r = requests.get('https://ddragon.leagueoflegends.com/api/versions.json')
current_version = r.json()[0] #최신 버전
print('버전확인',current_version)

r = requests.get('http://d dragon.leagueoflegends.com/cdn/{}/data/ko_KR/champion.json'.format(current_version))
parsed_data = r.json()
info_df = pd.DataFrame(parsed_data)

champ_dic = {}
for i, champ in enumerate(info_df.data):
    champ_dic[i] = pd.Series(champ)

champ_df = pd.DataFrame(champ_dic).T
champ_df = champ_df.drop(['version', 'image', 'info', 'stats','title','blurb','tags','partype'], axis=1)
champ_df.to_csv('Champion_list.csv', encoding='utf-8-sig')

라이엇에서 제공하는 Json데이터를 가지고 확인할 수 있다.

 

다음은 챔피언을 직접 분류하고 이 데이터를 어떻게 활용할 것인지에 대해서 생각해보아야할 것 같다.

728x90