본문 바로가기

TFT

TFT 데이터 분석- Summary 위한 데이터프레임 정리

저번 포스트에서 api에서 얻을 수 있는 원데이터에서 경기 데이터를 수집했다.

수집한 데이터를 바탕으로 실제 분석에 사용할 수 있는 유닛, 아이템, 증강체 데이터프레임 만든 과정을 정리했다.

  • 이전 포스트부터 이어지는 이야기이다. 코드 중 이전 포스트 코드가 포함되어 있으니 참고하기.

1. 현재 만든 데이터프레임

현재까지 만든 데이터프레임은 다음과 같다.

하지만 해당 데이터프레임에서는 유닛과, 유닛에 해당하는 성(star)수, 아이템을 뽑기 어렵다. 따라서 해당 데이터프레임에서는 증강체만, unit 데이터프레임을 따로 만들어 두 데이터프레임을 합쳐줄 것이다.

2. 유닛 정보 데이터프레임 만들기

1) unit dataframe 만들기

첫 번째로 unit 데이터프레임을 만들어주어야 한다. player별로 사용한 유닛과 해당 유닛의 성수, 사용 아이템을 열로 하는 데이터프레임을 만들어주었다.

def make_unit_dataframe(unit):
    
        units = pd.DataFrame(unit)
        
        if units.shape[0]==0:
            return pd.DataFrame(columns = ['character_id', 'champ_name', 'rarity', 'tier', 'items', 'item1', 'item2', 'item3'])
        

        item_list = []
        champ_name = []
        for i in range(len(units['character_id'])):
            
            champ_name.append(champ_list[units['character_id'][i]])
            check = units['itemNames'][i]

            check += [0]*(3-len(check))

            item_list.append(check)

        units['items'] = item_list

        item1 = []
        item2 = []
        item3 = []

        for item in item_list:

            check_item = []

            for i in item:
                if i=='None':
                    check_item.append('None')
                else:
                    item_kor = items.loc[items.apiName==i, 'name'].values[0]
                    check_item.append(item_kor)
            item1.append(check_item[0])
            item2.append(check_item[1])
            item3.append(check_item[2])


        units = pd.DataFrame(unit).drop(['itemNames', 'name'], axis=1)

        units['item1'] = item1
        units['item2'] = item2
        units['item3'] = item3
        units['champ_name'] = champ_name

        return units

해당 함수는 이전 포스트에서 유닛 데이터프레임을 직접 만들어주는 함수이다. 특정 플레이어의 유닛 결과를(participants - unit) 입력하면, 다음과 같은 데이터프레임을 얻을 수 있다.

make_unit_dataframe(pd.DataFrame(participants.loc[0, 'units']))

해당 데이터프레임에서 필요한 것은 tier, item1, item2, item3, champ_name이다. 또한 다른 데이터프레임과 합쳐지려면 해당 게임의 datetime, id, 그리고 해당 player_id가 필요하다. 따라서 해당 column들로 이루어진 데이터프레임을 만들어주는 함수를 만들었다.

def make_unit_result(dataframe, number, game_id, datetime):

    unit1 = make_unit_dataframe(dataframe.loc[number, 'units'])
    unit1['Datetime'] = datetime
    unit1['Game_id'] = game_id
    unit1['Player_id'] = dataframe.loc[number, 'puuid']
    unit1 = unit1[['Datetime', 'Game_id', 'Player_id', 'character_id', 'champ_name', 'rarity', 'tier', 'item1', 'item2', 'item3']]
    return unit1

# 코드 실행
make_unit_result(participants, 0, game_summary['Game_id'][0], game_summary['Datetime'][0])

해당 데이터프레임은 한 게임의 한 플레이어의 유닛 결과이다. 게임 플레이어마다 쌓아주면 unit 정보 데이터프레임이 완성된다.

unit_dataframe = pd.DataFrame(dict(Datetime = [], Game_id = [], Player_id = [], character_id = [], champ_name=[], rarity = [], tier = [], item1=[], item2=[], item3=[]))

for i in range(participants.shape[0]):
    check = make_unit_result(participants, i, game_summary['Game_id'][0], game_summary['Datetime'][0])
    unit_dataframe = pd.concat([unit_dataframe, check])
    
    
unit_dataframe = unit_dataframe.reset_index(drop=True)

# 결과 출력

unit_dataframe

2) 도적의 장갑 변환하기

도적의 장갑이나 장난꾸러기의 장갑을 사용할 경우 item1에는 도적의 장갑(또는 장난꾸러기의 장갑)이, item2, item3에는 마지막 라운드에서의 도적의 장갑 아이템이 추출된다. 따라서 도적의 장갑을 가지고 있는 유닛의 나머지 두 아이템은 없는 것으로 처리해야 한다. 위의 unit_dataframe을 입력하면 도적의 장갑 처리를 해주는 함수를 만들었다.

 def change_gloves_item(item_result):
    
    check = np.logical_or(item_result.item1=='도적의 장갑', item_result.item1=='장난꾸러기의 장갑')
    
    item_result.loc[check, 'item2']='None'
    
    item_result.loc[check, 'item3'] = 'None'
                          
    return item_result

# 결과 출력

unit_dataframe = change_gloves_item(unit_dataframe)

unit_dataframe

보이는 것과 같이 index 59에 해당하는 item2, item3가 사라졌다.

3) 착용한 아이템 개수 세기

유닛이 착용한 아이템 수는 해당 유닛이 키 유닛인지 아닌지 판단하는 지표가 될 수 있다. 따라서 unit_dataframe에서 해당 unit이 가지고 있는 아이템의 수를 num_item column으로 만들어주었다.

def check_item_unit_itemver(unit_result):
    
    check = unit_result.apply(lambda x : 3-list(x).count('None'), axis=1)
    
    
    unit_result['num_item'] = check
    
    return unit_result


# 결과 출력

unit_dataframe = check_item_unit_itemver(unit_dataframe)

unit_dataframe

해당 데이터프레임(unit_dataframe)과 이전 포스트에서 만든 게임 결과 데이터프레임(game_summary)을 이용해 유닛, 증강체, 아이템 간 통계 정보를 요약해주는 데이터프레임을 만들 것이다.