본문 바로가기
문송충의 코딩하기/NBA 분석 With Python

LA 레이커스의 빅2 르브론 제임스과 앤서니 데이비스 분석

by 동장군님 2020. 8. 26.
728x90
반응형

ㅇㅅㄹㅅ이라는 말을 들어본적이 있는가? "역시릅신"이라는 NBA 최고 스타 르브론 제임스를 위해 NBA 팬들이 만든 용어이다. NBA 커뮤니티, 실시간 경기 댓글창, 뉴스 댓글 들어가보면 르브론 얘기만 나오면 항상 ㅇㅅㄹㅅ은 빠지지 않고 등장한다. 르브론이 멋진 플레이를 해도 ㅇㅅㄹㅅ이고, 어처구니 없는 실수를 해도 ㅇㅅㄹㅅ이다. 여튼 이번 시간에는 ㅇㅅㄹㅅ인 르브론 제임스과 LA 레이커스에서 환상적인 호흡을 보이고 있는 갈매기 앤서니 데이비스에 대해 파이썬으로 분석하고자 한다. 분석 내용은 다음과 같이 아주 간단하다.

  • 르브론 제임스와 앤서니 데이비스가 만든 합산 득점
  • 팀 전체 득점에서 두 선수가 차지하는 비중
  • 팀 경기 승리/패배 별 두 선수 평균 경기 스탯의 차이

 


1. 르브론 제임스과 앤서니 데이비스의 19/20 시즌 경기별 스탯 데이타 가져오기

이번에도 역시나 Basketball-reference 사이트에서 선수의 경기별 데이타 기록을 가져와보도록 하겠다. 저번 크리스폴 관련 내용과 유사해서 자세한 내용은 넘어가겠다. 코드도 그렇게 어렵지 않다. 필요한 데이타만 볼 수 있도록 전처리만 잘 해주면 된다. 

import pandas as pd

lbj=pd.read_html('https://www.basketball-reference.com/players/j/jamesle01/gamelog/2020/')
ad=pd.read_html('https://www.basketball-reference.com/players/d/davisan02/gamelog/2020/')

#사이트 내 7번째 테이블에 원하는 경기별 스탯이 있다
lebron_df=lbj[7]
ad_df=ad[7]

#전처리 과정
lebron_df2=lebron_df[lebron_df['Date']!='Date']
ad_df2=ad_df[ad_df['Date']!='Date']

#뛰지 않은 경기의 기록은 0으로 변환
lebron_df2=lebron_df2.replace('Inactive','0')
lebron_df2=lebron_df2.replace('Did Not Dress','0')
ad_df2=ad_df2.replace('Inactive','0')
ad_df2=ad_df2.replace('Did Not Dress','0')

# 경기 날짜, 총 리바운드 수, 어시스트 수, 득점 수, 경기 뛴 시간 컬럼만 가져오기
lebron_df3=lebron_df2[['Date','TRB','AST','PTS','MP']]
ad_df3=ad_df2[['Date','TRB','AST','PTS','MP']]

# 르브론/앤서니 경기 기록을 Total_df 데이터프레임에서 합쳐서 넣기
# 문자열로 있다보니 기록은 숫자형으로 변환이 필요하다
total_df=pd.DataFrame()
total_df['Date']=lebron_df3['Date']
total_df['TRB']=lebron_df3['TRB'].astype(int) + ad_df3['TRB'].astype(int)
total_df['AST']=lebron_df3['AST'].astype(int) + ad_df3['AST'].astype(int)
total_df['PTS']=lebron_df3['PTS'].astype(int) + ad_df3['PTS'].astype(int)
total_df['MP']=lebron_df3['MP'].apply(lambda x: int(x.split(':')[0]))+ ad_df3['MP'].apply(lambda x: int(x.split(':')[0]))

total_df 데이타를 출력하면 아래와 같은 결과를 얻을 수 있다. 총 71 경기 동안 르브론 제임스와 앤서니 데이비스의 경기스탯을 합친 결과이다. 

2. LA LAKERS의 시즌 경기 기록 가져오기

이번 데이타는 ESPN에서 가져오도록 하겠다. 전처리 과정이 귀찮기는 하나 어렵지는 않다. 

la_lakers=pd.read_html('https://www.espn.com/nba/team/schedule/_/name/lal/seasontype/2',header=0)
df=la_lakers[0]

# 코비의 사망으로 연기된 경기는 제외
df=df[df['RESULT']!='Postponed']

#승리/패배 별 경기 기록을 구분하기 위한 작업
Score=[]
for x in df['RESULT']:
    if x[0] =='W':
        W=x[1:].split('-')[0]
        Score.append(W)
    elif x[0] =='L':
        L=x[1:].split('-')[1]
        Score.append(L)
        
df['W/L']=df['RESULT'].apply(lambda x: x[0])
df['Score']=Score
        
df2=df[['OPPONENT','W/L','Score','RESULT']]

위 코드 작업 후 df2를 출력하면 아래와 같은 결과를 얻을 수 있다. 경기 승리 패배 여부, 경기 득점 기록, 레이커스 총 득점 결과 딱 필요한 데이타만 가져왔다. 

3. 위 2 데이터 프레임 합치기

total_df=total_df.reset_index()
df2=df2.reset_index()
final=pd.concat([df2,total_df],axis=1)

위 테이블 처럼 두 데이터프레임이 아무 문제 없이 합쳐진것을 볼 수 있다. 지금까지는 데이터 전처리 과정이었다면 다음 시간에 이어서 내가 처음에 말하고자 한 내용을 본격적으로 해보겠다. 

728x90
반응형

댓글