Python을 기반으로 개발을 진행하였습니다.
1. PUBG API를 불러와 팀별 통계하기.
PUBG API의 MATCHES를 불러오는 과정은 아래의 링크 [게임 데이터 분석 #1] PUBG API를 활용한 간단한 통계 에서 첫 부분과 동일합니다.
https://big-data97.tistory.com/52
[게임 데이터 분석 #1] PUBG API를 활용한 간단한 통계
Python을 기반으로 개발을 진행하였습니다. 1. PUBG API 불러와 집계하기 플레이어 ID를 입력하게 되면 해당 palyer의 PLAYERS API json 파일이 반환됩니다. json파일에서 필요한 정보인 ID를 추출하여 DataFrame
big-data97.tistory.com
def get_statistics(username, url, header):
player_df = get_dataframe(url, header)
for index in range(len(player_df)):
match_url = f'https://api.pubg.com/shards/kakao/matches/{player_df["id"][index]}'
match_response = requests.get(match_url, headers=header)
match_json = match_response.json()
participant_list, rank_list = [], [] # 참가자 및 순위 리스트 생성
print(f"\n\n---------------{username}님의 {index+1}번째 판---------------\n")
for entry in match_json['included']:
if entry['type'] == 'participant': # 게임내 데이터를 불러와 리스트안에 dirt형식으로 저장
participant_list.append({'id': entry['id'], **entry['attributes']['stats']})
elif entry['type'] == 'roster':
rank = entry['attributes']['stats']['rank']
data_list = entry['relationships']['participants']['data']
rank_list.extend({'rankx': rank, **data} for data in data_list)
# 데이터프레임 생성 및 병합
participant_df = pd.DataFrame(participant_list)
rank_df = pd.DataFrame(rank_list)
game_result_df = pd.merge(left=participant_df, right=rank_df, how='inner', on='id')
# 순위별 팀원 이름 및 통계 출력
grouped_df = game_result_df.groupby('rankx')
for rank, group in grouped_df:
names = ', '.join(group['name'])
total_kills = group['kills'].sum()
total_assists = group['assists'].sum()
print(f"{rank}등: {names}\n\t총 킬 수: {total_kills}\t총 어시스트 수: {total_assists}")
이전 통계와 동일한 방법을 통해 팀별 통계를 출력할 수 있습니다.
다르게 해야 할 부분은 데이터 프레임을 생성할 때입니다. 한 선수의 총 통계를 보기 위해 서는 모든 데이터가 포함된 데이터 프레임 하나를 만들었습니다. 하지만 판별 팀별 출력을 할 때는 한 판마다 데이터 프레임을 만들고 해당 데이터 프레임에서 그룹화를 하여 집계를 한 뒤 출력을 하는 방식으로 구현하였습니다. 이때 데이터 프레임을 하나만 만들고 출력을 한 뒤 재사용하는 형식으로 구현하였습니다.
2. 코드 실행
---------------breakthebalance님의 1번째 판---------------
1등: Ez_Ratel, breakthebalance, wldwlddlSTAR, NUcabrio
총 킬 수: 13 총 어시스트 수: 8
2등: WangNose, GAMXAfan, fharchi, Okayama_KAMI
총 킬 수: 17 총 어시스트 수: 4
3등: TCN_2ST, wkwogowhtlqkf, anjfqhsiTLqkf, JJi_-vely
총 킬 수: 9 총 어시스트 수: 5
4등: PRADA-_-Armpit, woo_yaaaaaa, Twitch_roads, nan_mangoya
총 킬 수: 0 총 어시스트 수: 0
5등: FM_NaYaNa, FM_coffee, FM_Dosa, FM_BABY
총 킬 수: 4 총 어시스트 수: 3
6등: NaMinKyxxng, 18N_o_m, LWYC_AK, 9x-nov
총 킬 수: 2 총 어시스트 수: 3
7등: NBG_AsH, Ulsan_oVerstacK, NBG_Hyup, NBG_Hyun_
총 킬 수: 3 총 어시스트 수: 2
8등: GarGar_jaecree, DGR_ALICE, BLz_Smoke, Infighter_SD
총 킬 수: 0 총 어시스트 수: 0
9등: RhymeKim, Ingzing-Q-, 1_Deicide, Nps_zzang
총 킬 수: 0 총 어시스트 수: 0
10등: cattower_08, No2Player, 5stin-_-, OMN_Mozzi
총 킬 수: 4 총 어시스트 수: 3
11등: T_Bnb-X2D, T_Bnb-GH, T_Bnb-Bumper, T_Bnb-AimGoo
총 킬 수: 0 총 어시스트 수: 0
12등: Tyrant_Avengers, KJSSJSJSJS, min-jae-Song
총 킬 수: 0 총 어시스트 수: 0
13등: tM_Haram, tM_Ever, tM_DDonge, tM_Boondangbug
총 킬 수: 0 총 어시스트 수: 0
14등: YANGTEMENTS, skwhsskwkfgksek, nakziyeonpotang
총 킬 수: 1 총 어시스트 수: 0
15등: NAZOMSSOZIMA, CLV_Master, dan2ya, CLV_Cobe-
총 킬 수: 2 총 어시스트 수: 2
16등: PICKSTXR, 0070_OTR, lovely-kitty, NCR_BossSanta
총 킬 수: 0 총 어시스트 수: 0
.
.
.
---------------breakthebalance님의 52번째 판---------------
1등: 9x2_waterpunch, MaxiMuM_Full-bal, VSSYA, Spz_Rhinoceros
총 킬 수: 12 총 어시스트 수: 7
2등: penfi
총 킬 수: 4 총 어시스트 수: 0
3등: ZonnaZalhano, tlzmfltgusdnr, breakthebalance, fxxkingmintchoco
총 킬 수: 1 총 어시스트 수: 0
4등: Cosm1ca
총 킬 수: 0 총 어시스트 수: 0
5등: leebbanggu1, Hutsorimaso-_-, Park-cass, red-yong1
총 킬 수: 0 총 어시스트 수: 0
6등: Alc_Vodka-, Gaeggulddora22, qkqldkdwb, god-__-hyuk2
총 킬 수: 10 총 어시스트 수: 5
7등: freeworld313, New_Face_LSM, bibimbapjuSeYo, HxnsxL
총 킬 수: 4 총 어시스트 수: 1
8등: Masitda-_-KHAN, hdcxx, GnB_happy, Only_HABA
총 킬 수: 9 총 어시스트 수: 4
9등: Min_gyu123, HosungA404, pigfffff765, ser_vices
총 킬 수: 5 총 어시스트 수: 2
10등: CHEON_LYANG, sdszsssm, Ader--, Fcup-ssion
총 킬 수: 0 총 어시스트 수: 0
11등: llll-lllllllllll, Killer__Vss, KD_HyunX_X, wldn1255
총 킬 수: 4 총 어시스트 수: 3
12등: 5959ToT, jko2724, SUICIDE_SePark, 13676877
총 킬 수: 1 총 어시스트 수: 0
13등: burger79, king_ppp_hvv, bungsinnun, ares2558
총 킬 수: 0 총 어시스트 수: 0
14등: sexiboy0144, gusry7604-, nambo1124, Touch_12
총 킬 수: 1 총 어시스트 수: 1
15등: FM_QUAD, Y_YOUHOO, XxBbang-_-, 1nOnly___
총 킬 수: 2 총 어시스트 수: 0
16등: Coolwoony, SFD_Hong, hhongyu94
총 킬 수: 1 총 어시스트 수: 0
17등: kar98k_akm_, kar91k_vector_
총 킬 수: 1 총 어시스트 수: 0
3. 이슈
데이터 프레임을 재활용하는 생각을 하지 못하고 한 팀당 하나의 데이터 프레임을 만들어서 그룹화 한뒤 집계하려고 하여서 다중 리스트를 만들어 list[0]이 dataframe1에 들어가는 형식으로 구현을 했습니다.
해당 방법은 다음과 같은 문제를 발생시켰습니다.
1. 메모리 사용량 증가
데이터 프레임은 판수가 많아짐에 따라 그 수가 증가하기 때문에 많은 메모리를 사용하게 되어 비효율적인 방법이 됩니다.
2. 코드 가독성 저해 및 유지보수 어려움
게임 수 만큼의 데이터 프레임을 만들게 되면 코드의 가독성이 떨어지되고, 유지보수에 비용이 더욱 들게됩니다.
3. 변수명 관리 어려움
게임수가 많아 짐에 따라 데이터 프레임 변수명 또한 많아지게 됩니다. 이는 규칙이 있기에 숫자로 표현하면 관리의 어려움을 덜 수있지만 불필요한 데이터 프레임이 많이 만들어지게 되어 1번과 같은 문제를 유발합니다.
4. 컴퓨터 처리 시간 증가
데이터 프레임을 매번 만들어 연산처리를 하게 되면 빈 데이터 프레임의 이름을 정하며 생성하는것 부터 시작이기 때문에
컴퓨터의 처리 시간이 자동적으로 증가 하게됩니다.
기타
추가로 판별 통계를 추가하여 다양한 결과를 출력하게 할 예정입니다.
'게임 데이터 분석' 카테고리의 다른 글
[게임 데이터 분석 #5] MongoDB를 사용한 데이터 저장 (1) | 2023.06.30 |
---|---|
[게임 데이터 분석 #4-1] TELEMETRY API를 활용해 판별 MAP 이미지 위에 이동 경로 그리기 (1) | 2023.06.25 |
[게임 데이터 분석 #4] TELEMETRY API를 활용해 MAP 이미지 위에 이동 경로 그리기 (0) | 2023.06.19 |
[게임 데이터 분석 #3] chicken-dinner를 활용한 리플레이 애니메이션 출력하기 (0) | 2023.06.14 |
[게임 데이터 분석 #1] PUBG API를 활용한 간단한 통계 (0) | 2023.06.10 |