프로젝트/빅데이터분석 기말 프로젝트

롤 분류기 (2) - 데이터 수집 노가다

AI쟁이J 2022. 6. 28. 18:27

골드 유저들의 puuid를 수집한 df를 만들고 저장했다. 이제 puuid를 통해 match 정보를 찾아보자.

 

gold_user_df = pd.read_csv('gold_user.csv')
gold_user_df.drop(['Unnamed: 0'], axis = 1, inplace = True)

import time

api_key = "RGAPI-c77f10f5-1674-4d32-a68f-6a6120878077"

puuids = gold_user_df['puuid']

match_ID = []

for puuid in puuids:
    match_url = "https://asia.api.riotgames.com/lol/match/v5/matches/by-puuid/{}/ids?type=ranked&start=0&count=20".format(puuid)
    r = requests.get(match_url, headers = {"X-Riot-Token":api_key})
    match_ID.append(r.json())
    time.sleep(0.9)

이제 이 코드는 각 puuid를 통해 최근 유저들의 20판 경기 정보를 가져와 줄 것이다. 

이렇게 말이다!

 

이 데이터프레임은 이제 각 1 ~ 7936 유저의 20개 게임 데이터를 가진 7936 x 20의 df이다. 근데 이건 여태까지 유저의 각정보가 한 열마다 저장되어있던 것과 달리 20개의 열에 20개의 정보가 담겨버렸다.

괜찮다. 어차피 통합할 유저 데이터에는 이 정보가 쓰이지 않을 것이고 크롤링 용 매치 정보만 담긴 데이터프레임이다.

 

근데.. 모두가 나같은 롤창이 아니라 최근에 20판도 하지 않은 사람이 꽤 많았다. 실은 나도 20판까진 안한다. 그래서 어차피 이런 사람들은 내가 만든 나만의 법칙 n > 20 (원랜 30) 에 벗어나기 때문에 그냥 팀으로 만나면 좋지 않은 사람들이라고 판단해서, no_recent_20_game 으로 따로 분리를 한 후 kda 정보를 수집하지 않고 drop 처리했다.

 

그래서 저 열이 True인 사람들은 따로 kda 정보가 저장되지 않을 것이고, 만나기 싫은 사람으로 분류 될 예정이다.

 

그리고 고문의 시간이 왔다. 전 시간에 말했듯 라이엇은 서버 과부하를 막기 위해 정보 수집에 시간 제한을 둔다.

그리고 각 사람의 20판 게임 경기를 하나하나 다 수집해야 한다. 몇 명? drop 이후에도 7311명. 즉, 146,220개의 경기에서 그 사람의 kda를 뽑아와야 한다 ㅎㅎ

 

일단 이 경우는 함수를 하나 만들어서 함수를 통해 돌려야 장기적으로 헷갈리지 않을 것 같았다. 그래서 puuid와 matchID를 리스트 형태로 20개의 리스트로 넣으면 그 판에서 그 사람의 20판 중 승리 횟수, 그리고 20판 평균 kda를 뽑아주는 함수를 만들었다.

api_key = "RGAPI-7ada1972-a4c0-4802-a750-cfcaacde302c"


def kill_death(puuid, matchID = []):
    win = []
    death = []
    kill = []
    assist = []
    puuid = puuid
    for i in matchID:
        game_url = "https://asia.api.riotgames.com/lol/match/v5/matches/{}".format(i)
        r = requests.get(game_url, headers = {"X-Riot-Token":api_key})
        r = r.json()
        info = r['info']
        part = info['participants']
        for j in range(0,10):
            if part[j]["puuid"] == puuid:
                win.append(part[j]['win'])
                kill.append(part[j]['kills'])
                death.append(part[j]['deaths'])
                assist.append(part[j]['assists'])
    count_win.append(win.count(True))
    mean_kill.append(np.mean(kill))
    mean_death.append(np.mean(death))
    mean_assist.append(np.mean(assist))

매치 데이터인 만큼 10명의 데이터가 다 들어가있었는데, info, participants를 통해 내가 원하는 한 사람의 정보만 찾을 수 있는 것을 또 구글 성님덕에 배웠다.

 

이중 루프문을 통해 10명의 puuid를 돌려서 함수에 넣은 puuid와 같은 사람의 정보를 캐오고, 마지막엔 np.mean과 count를 사용해 20판 중 승리 횟수, 평균 kda까지 반환하게 했다.

 

데이터 수집 후 kda_df를 따로 생성해 join을 위한 키 값 puuid, 그리고 얻은 정보들을 모두 저장하는 df를 만들었다. 저거 12일정도 걸렸다. 컴퓨터도 나도 고생했다. 가끔 자고 일어났는데 새벽동안 오류나서 수집 중단되어있으면 정말 화가 났다. 솔직히 코드를 잘 짜서 예외 케이스를 알아서 skip하고 nan값으로 대체하는 기능까지 구현을 해서 돌렸으면 더 나았을 것을, 급한대로 하다보니 오히려 시간이 더 걸린 것 같아 아쉽긴 했다. 이미 4000개정도 데이터를 수집 했을 때 아 진작 그럴걸 생각이 들었기 때문에..

 

뭐 어쨌든.. 대망의 데이터 병합을 통해 딱! 깔끔하게 내가 원하는 내용만 담아보자

 

gold_user_df.rename(columns = {"wins" : "whole_win"}, inplace = True)
gold_user_df

함수를 통해 얻은 wins 컬럼이 원래의 컬럼에서 이름과 겹친다. 이 사람의 모든 랭크 게임 승 수이므로 이름 바꾸고,

 

data = pd.merge(left = gold_user_df, right = kda_df, how = "left", on ="puuid")
data.drop_duplicates(["puuid"], inplace = True)

left join으루다가 puuid 통해서 병합 해주고, 혹시 모를 중복 케이스 제거

 

다 했다.. 저 평균 kda, 승 수 NaN인 친구들이 20판도 롤을 하지 않은 진심이 아닌 괘씸한 친구들이다. 저 사람들은 분류 모델 생성에서 만나기 싫은 사람으로 분류할 예정이다.