개발은 처음이라 개발새발
21/22시즌 손흥민 경기당 공격 지표를 구해보자 [python/pandas] 본문
안녕하세요. 이제 22/23 PL 개막이 5일 정도 남았는데요. D-5 기념으로 지난 시즌 프리미어리그 득점순위 탑 5 선수들의 경기당 주요 공격 지표에 대해 알아보겠습니다. 제목은 리그 Top 5 득점자들의 경기당 주요 공격지표로 하겠습니다. 근데 이제 파이썬을 곁들인...
늘 그랬듯이 활용한 스탯은 모두 fotmob 사이트(https://www.fotmob.com/)를 통해 모았습니다. 우선 잘 모은 데이터를 한번 확인해보겠습니다. 데이터를 불러오죠.
import pandas as pd
import numpy as np
df= pd.read_excel('epl.xlsx',sheet_name='Sheet1')
print(df)
print('\n')
league season team name assist goals totalshot ontarget winningGoal keypass Successdribbles bigChanceCreated bigChanceMissed
0 Premier League 2021/2022 Manchester United Cristiano Ronaldo 0 2 6 2 1 1 0 0 0
1 Premier League 2021/2022 Manchester United Cristiano Ronaldo 0 1 7 5 0 0 0 0 2
2 Premier League 2021/2022 Manchester United Cristiano Ronaldo 0 0 4 0 0 1 1 0 0
3 Premier League 2021/2022 Manchester United Cristiano Ronaldo 0 0 1 0 0 1 0 0 0
4 Premier League 2021/2022 Manchester United Cristiano Ronaldo 0 0 3 1 0 1 1 0 0
.. ... ... ... ... ... ... ... ... ... ... ... ... ...
166 Premier League 2021/2022 Tottenham Hotspur Son Heung-Min 0 0 0 0 0 2 5 0 0
167 Premier League 2021/2022 Tottenham Hotspur Son Heung-Min 1 2 3 3 1 4 1 1 1
168 Premier League 2021/2022 Tottenham Hotspur Son Heung-Min 0 1 2 1 0 2 0 0 0
169 Premier League 2021/2022 Tottenham Hotspur Son Heung-Min 0 0 2 2 0 4 1 0 1
170 Premier League 2021/2022 Tottenham Hotspur Son Heung-Min 0 2 7 5 0 1 1 0 3
네 이렇게 지난 시즌 득점 탑 5인 손흥민,살라, 케인, 마네, 호날두의 득점, 어시스트, 슈팅, 유효슈팅, 결승득점, 결승득점, 키패스(기회창출(chance created)), 빅찬스 크레이티드, 빅찬스 미스 데이터를 모아서 표출해봤습니다. 이제 경기당 기록을 만들기 위해서는 이 선수들의 출장 경기수와 선수별 데이터 합산이 필요합니다. 출장 경기수는 결국 특정 이름의 데이터가 몇개나 있는지와 맥락이 같은데요. 이는 value_counts()함수를 사용하면 됩니다. 그리고 합산 데이터는 groupby를 사용하겠습니다. 이 두가지를 하기 전에 득점+어시스트인 공격 포인트 항목이 없으니 이것도 추가를 해보겠습니다.
#공격포인트 만들기
df['attPoint'] = df['goals']+df['assist']
print(df)
print('\n')
#합산 데이터 만들기
df1 = df.groupby(['league','season','team','name']).sum()
print(df1)
#경기수 생성
game = df['name'].value_counts()
print('\n')
print(game)
assist goals totalshot ontarget winningGoal keypass Successdribbles bigChanceCreated bigChanceMissed attPoint
league season team name
Premier League 2021/2022 Liverpool Mohamed Salah 13 23 139 60 7 63 53 18 17 36
S. Mané 2 16 98 39 5 41 47 9 13 18
Manchester United Cristiano Ronaldo 3 18 110 43 7 26 20 7 13 21
Tottenham Hotspur H. Kane 9 17 133 55 4 50 54 19 18 26
Son Heung-Min 7 23 86 49 6 72 51 10 17 30
H. Kane 37
Mohamed Salah 35
Son Heung-Min 35
S. Mané 34
Cristiano Ronaldo 30
Name: name, dtype: int64
네 이렇게 합산 데이터와 선수들의 경기수를 구했습니다. groupby를 통해 구한 데이터의 합산을 보면 인덱스가 리그, 시즌, 팀, 이름까지 다중 인덱스로 돼 있는 모습을 보입니다. 이렇게 되면 반복문과 조건문을 통해 계산을 하는데 문제가 발생할 수도 있는데요. 이걸 해결하기 위해서는 reset_index()함수를 통해 인덱스를 다시 번호로 되돌리면 됩니다.
#인덱스 초기화
df1.reset_index(drop=False, inplace=True)
print(df1)
league season team name assist goals totalshot ontarget winningGoal keypass Successdribbles bigChanceCreated bigChanceMissed attPoint
0 Premier League 2021/2022 Liverpool Mohamed Salah 13 23 139 60 7 63 53 18 17 36
1 Premier League 2021/2022 Liverpool S. Mané 2 16 98 39 5 41 47 9 13 18
2 Premier League 2021/2022 Manchester United Cristiano Ronaldo 3 18 110 43 7 26 20 7 13 21
3 Premier League 2021/2022 Tottenham Hotspur H. Kane 9 17 133 55 4 50 54 19 18 26
4 Premier League 2021/2022 Tottenham Hotspur Son Heung-Min 7 23 86 49 6 72 51 10 17 30
네 이제 재료들을 모두 완성이 됐으니 반복문과 조건문을 통해 경기당 지표들을 만들어보겠습니다.
for i in range(len(df1)):
if df1.iloc[i]['name'] == "Mohamed Salah":
df1.at[i,'per_goals'] = round (df1.iloc[i]['goals']/game.iloc[1],2)
df1.at[i,'per_assist'] = round(df1.iloc[i]['assist']/game.iloc[1],2)
df1.at[i,'per_attpoint'] = round(df1.iloc[i]['attPoint']/game.iloc[1],2)
df1.at[i,'per_totalshot'] =round (df1.iloc[i]['totalshot']/game.iloc[1],2)
df1.at[i,'per_ontarget'] = round(df1.iloc[i]['ontarget']/game.iloc[1],2)
df1.at[i,'per_keypass'] = round(df1.iloc[i]['keypass']/game.iloc[1],2)
df1.at[i,'per_dribble'] = round(df1.iloc[i]['Successdribbles']/game.iloc[1],2)
df1.at[i,'per_bigChance'] = round(df1.iloc[i]['bigChanceCreated']/game.iloc[1],2)
df1.at[i,'per_bigMiss'] = round(df1.iloc[i]['bigChanceMissed']/game.iloc[1],2)
elif df1.iloc[i]['name'] == "S. Mané":
df1.at[i,'per_goals'] = round (df1.iloc[i]['goals']/game.iloc[3],2)
df1.at[i,'per_assist'] = round(df1.iloc[i]['assist']/game.iloc[3],2)
df1.at[i,'per_attpoint'] = round(df1.iloc[i]['attPoint']/game.iloc[3],2)
df1.at[i,'per_totalshot'] =round (df1.iloc[i]['totalshot']/game.iloc[3],2)
df1.at[i,'per_ontarget'] = round(df1.iloc[i]['ontarget']/game.iloc[3],2)
df1.at[i,'per_keypass'] = round(df1.iloc[i]['keypass']/game.iloc[3],2)
df1.at[i,'per_dribble'] = round(df1.iloc[i]['Successdribbles']/game.iloc[3],2)
df1.at[i,'per_bigChance'] = round(df1.iloc[i]['bigChanceCreated']/game.iloc[3],2)
df1.at[i,'per_bigMiss'] = round(df1.iloc[i]['bigChanceMissed']/game.iloc[3],2)
elif df1.iloc[i]['name'] == "Cristiano Ronaldo":
df1.at[i,'per_goals'] = round (df1.iloc[i]['goals']/game.iloc[4],2)
df1.at[i,'per_assist'] = round(df1.iloc[i]['assist']/game.iloc[4],2)
df1.at[i,'per_attpoint'] = round(df1.iloc[i]['attPoint']/game.iloc[4],2)
df1.at[i,'per_totalshot'] =round (df1.iloc[i]['totalshot']/game.iloc[4],2)
df1.at[i,'per_ontarget'] = round(df1.iloc[i]['ontarget']/game.iloc[4],2)
df1.at[i,'per_keypass'] = round(df1.iloc[i]['keypass']/game.iloc[4],2)
df1.at[i,'per_dribble'] = round(df1.iloc[i]['Successdribbles']/game.iloc[4],2)
df1.at[i,'per_bigChance'] = round(df1.iloc[i]['bigChanceCreated']/game.iloc[4],2)
df1.at[i,'per_bigMiss'] = round(df1.iloc[i]['bigChanceMissed']/game.iloc[4],2)
elif df1.iloc[i]['name'] == "H. Kane":
df1.at[i,'per_goals'] = round (df1.iloc[i]['goals']/game.iloc[0],2)
df1.at[i,'per_assist'] = round(df1.iloc[i]['assist']/game.iloc[0],2)
df1.at[i,'per_attpoint'] = round(df1.iloc[i]['attPoint']/game.iloc[0],2)
df1.at[i,'per_totalshot'] =round (df1.iloc[i]['totalshot']/game.iloc[0],2)
df1.at[i,'per_ontarget'] = round(df1.iloc[i]['ontarget']/game.iloc[0],2)
df1.at[i,'per_keypass'] = round(df1.iloc[i]['keypass']/game.iloc[0],2)
df1.at[i,'per_dribble'] = round(df1.iloc[i]['Successdribbles']/game.iloc[0],2)
df1.at[i,'per_bigChance'] = round(df1.iloc[i]['bigChanceCreated']/game.iloc[0],2)
df1.at[i,'per_bigMiss'] = round(df1.iloc[i]['bigChanceMissed']/game.iloc[0],2)
elif df1.iloc[i]['name'] == "Son Heung-Min":
df1.at[i,'per_goals'] = round (df1.iloc[i]['goals']/game.iloc[2],2)
df1.at[i,'per_assist'] = round(df1.iloc[i]['assist']/game.iloc[2],2)
df1.at[i,'per_attpoint'] = round(df1.iloc[i]['attPoint']/game.iloc[2],2)
df1.at[i,'per_totalshot'] =round (df1.iloc[i]['totalshot']/game.iloc[2],2)
df1.at[i,'per_ontarget'] = round(df1.iloc[i]['ontarget']/game.iloc[2],2)
df1.at[i,'per_keypass'] = round(df1.iloc[i]['keypass']/game.iloc[2],2)
df1.at[i,'per_dribble'] = round(df1.iloc[i]['Successdribbles']/game.iloc[2],2)
df1.at[i,'per_bigChance'] = round(df1.iloc[i]['bigChanceCreated']/game.iloc[2],2)
df1.at[i,'per_bigMiss'] = round(df1.iloc[i]['bigChanceMissed']/game.iloc[2],2)
print('\n')
df2 = df1.drop(df1.columns[4:14],axis=1)
print(df2)
league season team name per_goals per_assist per_attpoint per_totalshot per_ontarget per_keypass per_dribble per_bigChance per_bigMiss
0 Premier League 2021/2022 Liverpool Mohamed Salah 0.66 0.37 1.03 3.97 1.71 1.80 1.51 0.51 0.49
1 Premier League 2021/2022 Liverpool S. Mané 0.47 0.06 0.53 2.88 1.15 1.21 1.38 0.26 0.38
2 Premier League 2021/2022 Manchester United Cristiano Ronaldo 0.60 0.10 0.70 3.67 1.43 0.87 0.67 0.23 0.43
3 Premier League 2021/2022 Tottenham Hotspur H. Kane 0.46 0.24 0.70 3.59 1.49 1.35 1.46 0.51 0.49
4 Premier League 2021/2022 Tottenham Hotspur Son Heung-Min 0.66 0.20 0.86 2.46 1.40 2.06 1.46 0.29 0.49
네 이렇게 21/22 시즌 탑 스코어러 5명의 경기당 주요 공격 지표를 구해봤습니다.
'축구' 카테고리의 다른 글
PL 21/22시즌 크로스 TOP10 (0) | 2022.08.10 |
---|---|
PL 21/22시즌 경합왕을 찾아라! (0) | 2022.08.10 |
PL 홈구장 지도를 만들어보자![python/folium] (3) | 2022.07.17 |
아놀드의 21/22시즌의 기회 창출과 패스 성공률[python/pandas] (1) | 2022.07.16 |