Top Bowlers and Top Fielders Analysis

In [1]:
import pandas as pd
import numpy as np
import seaborn as sn
import plotly.express as px
import plotly.graph_objects as go
import plotly.offline as py
from plotly.subplots import make_subplots
import matplotlib.pyplot as plt
%matplotlib inline
In [2]:
deliveries = pd.read_csv('deliveries.csv')
pd.set_option('display.max_columns',None)
deliveries.head()
Out[2]:
match_id inning batting_team bowling_team over ball batsman non_striker bowler is_super_over wide_runs bye_runs legbye_runs noball_runs penalty_runs batsman_runs extra_runs total_runs player_dismissed dismissal_kind fielder
0 1 1 Sunrisers Hyderabad Royal Challengers Bangalore 1 1 DA Warner S Dhawan TS Mills 0 0 0 0 0 0 0 0 0 NaN NaN NaN
1 1 1 Sunrisers Hyderabad Royal Challengers Bangalore 1 2 DA Warner S Dhawan TS Mills 0 0 0 0 0 0 0 0 0 NaN NaN NaN
2 1 1 Sunrisers Hyderabad Royal Challengers Bangalore 1 3 DA Warner S Dhawan TS Mills 0 0 0 0 0 0 4 0 4 NaN NaN NaN
3 1 1 Sunrisers Hyderabad Royal Challengers Bangalore 1 4 DA Warner S Dhawan TS Mills 0 0 0 0 0 0 0 0 0 NaN NaN NaN
4 1 1 Sunrisers Hyderabad Royal Challengers Bangalore 1 5 DA Warner S Dhawan TS Mills 0 2 0 0 0 0 0 2 2 NaN NaN NaN
In [3]:
df_csk = deliveries[(deliveries['bowling_team']=='Chennai Super Kings')]
df_mi = deliveries[(deliveries['bowling_team']=='Mumbai Indians')]
df_rcb = deliveries[(deliveries['bowling_team']=='Royal Challengers Bangalore')]
df_kkr = deliveries[(deliveries['bowling_team']=='Kolkata Knight Riders')]
df_rr = deliveries[(deliveries['bowling_team']=='Rajasthan Royals')]
df_kxip = deliveries[(deliveries['bowling_team']=='Kings XI Punjab')]
df_dd = deliveries[(deliveries['bowling_team']=='Delhi Daredevils')]
df_srh = deliveries[(deliveries['bowling_team']=='Sunrisers Hyderabad')]
df_csk[(df_csk['batsman']==df_csk['player_dismissed'])].style.background_gradient('plasma')
In [4]:
teams = ['csk','mi','rcb','kkr','rr','kxip','dd','srh']
In [5]:
df_csk = df_csk[(df_csk['batsman']==df_csk['player_dismissed'])]
df_mi = df_mi[(df_mi['batsman']==df_mi['player_dismissed'])]
df_rcb = df_rcb[(df_rcb['batsman']==df_rcb['player_dismissed'])]
df_kkr = df_kkr[(df_kkr['batsman']==df_kkr['player_dismissed'])]
df_rr = df_rr[(df_rr['batsman']==df_rr['player_dismissed'])]
df_kxip = df_kxip[(df_kxip['batsman']==df_kxip['player_dismissed'])]
df_dd = df_dd[(df_dd['batsman']==df_dd['player_dismissed'])]
df_srh = df_srh[(df_srh['batsman']==df_srh['player_dismissed'])]
In [6]:
df_srh.shape
Out[6]:
(627, 21)
In [7]:
def getmap(df):
    bowler = list(df['bowler'])
    bowler_map = dict(zip(bowler,map(bowler.count,bowler)))
    bowler_map = dict(sorted(bowler_map.items(),key = lambda x:x[1],reverse=True))
    bowler_map = dict(list(bowler_map.items())[:5])
    keys = []
    values = []
    for key,value in bowler_map.items():
        keys.append(key)
        values.append(value)
    df = pd.DataFrame()
    df['Player'] = keys
    df['TotalWickets'] = values
    return df
In [8]:
top_bowl_csk = getmap(df_csk)
top_bowl_mi  = getmap(df_mi)
top_bowl_rcb = getmap(df_rcb)
top_bowl_kkr = getmap(df_kkr)
top_bowl_rr = getmap(df_rr)
top_bowl_kxip = getmap(df_kxip)
top_bowl_dd = getmap(df_dd)
top_bowl_srh = getmap(df_srh)
In [9]:
top_bowl_csk
Out[9]:
Player TotalWickets
0 DJ Bravo 114
1 R Ashwin 94
2 RA Jadeja 84
3 JA Morkel 80
4 MM Sharma 59
In [10]:
teams = ['csk','mi','rcb','kkr','rr','kxip','dd','srh']

fig = make_subplots(rows=4,cols=2,subplot_titles=('CSK','MI','RCB','KKR',
                                                 'RR','KXIP','DD','SRH'),start_cell = 'top-left',
                                  specs=[[{'type':'polar'},{'type':'polar'}],
                                         [{'type':'polar'},{'type':'polar'}],
                                         [{'type':'polar'},{'type':'polar'}],
                                         [{'type':'polar'},{'type':'polar'}]],shared_yaxes=True)

# fig = make_subplots(rows=4,cols=2,specs=[[{'type':'polar'},{'type':'polar'}],
#                                          [{'type':'polar'},{'type':'polar'}],
#                                          [{'type':'polar'},{'type':'polar'}],
#                                          [{'type':'polar'},{'type':'polar'}]])

fig.add_trace(go.Barpolar(theta=list(top_bowl_csk['Player'].unique()),r = list(top_bowl_csk['TotalWickets'].unique())),1,1)

fig.add_trace(go.Barpolar(theta=list(top_bowl_mi['Player'].unique()),r = list(top_bowl_mi['TotalWickets'].unique())),1,2)

fig.add_trace(go.Barpolar(theta=list(top_bowl_rcb['Player'].unique()),r = list(top_bowl_rcb['TotalWickets'].unique())),2,1)

fig.add_trace(go.Barpolar(theta=list(top_bowl_kkr['Player'].unique()),r = list(top_bowl_kkr['TotalWickets'].unique())),2,2)

fig.add_trace(go.Barpolar(theta=list(top_bowl_rr['Player'].unique()),r = list(top_bowl_rr['TotalWickets'].unique())),3,1)

fig.add_trace(go.Barpolar(theta=list(top_bowl_kxip['Player'].unique()),r = list(top_bowl_kxip['TotalWickets'].unique())),3,2)

fig.add_trace(go.Barpolar(theta=list(top_bowl_dd['Player'].unique()),r = list(top_bowl_dd['TotalWickets'].unique())),4,1)

fig.add_trace(go.Barpolar(theta=list(top_bowl_srh['Player'].unique()),r = list(top_bowl_srh['TotalWickets'].unique())),4,2)


# fig.update_traces(hoverinfo="label+percent+name")

# fig.update_layout(
#     title_text="Global Emissions 1990-2011",
#     # Add annotations in the center of the donut pies.
#     annotations=[dict(text='GHG', x=0.18, y=0.5, font_size=20, showarrow=False),
#                  dict(text='CO2', x=0.82, y=0.5, font_size=20, showarrow=False),
#                 dict(text='CO2', x=0.82, y=0.5, font_size=20, showarrow=False),
#                 dict(text='CO2', x=0.82, y=0.5, font_size=20, showarrow=False),
#                 dict(text='CO2', x=0.82, y=0.5, font_size=20, showarrow=False),
#                 dict(text='CO2', x=0.82, y=0.5, font_size=20, showarrow=False),
#                 dict(text='CO2', x=0.82, y=0.5, font_size=20, showarrow=False),
#                 dict(text='CO2', x=0.82, y=0.5, font_size=20, showarrow=False)])

fig.update_layout(height =1600,width = 1000,title_text = "Top Performing Bowlers From Each team")
# annot =list(fig.layout.annotations)
# fig.layout.annotations = annot
fig.show()
In [11]:
df_csk.head()
Out[11]:
match_id inning batting_team bowling_team over ball batsman non_striker bowler is_super_over wide_runs bye_runs legbye_runs noball_runs penalty_runs batsman_runs extra_runs total_runs player_dismissed dismissal_kind fielder
14246 61 2 Kings XI Punjab Chennai Super Kings 6 6 K Goel JR Hopes MS Gony 0 0 0 0 0 0 0 0 0 K Goel caught PA Patel
14275 61 2 Kings XI Punjab Chennai Super Kings 11 2 JR Hopes KC Sangakkara P Amarnath 0 0 0 0 0 0 0 0 0 JR Hopes caught Joginder Sharma
14300 61 2 Kings XI Punjab Chennai Super Kings 15 2 Yuvraj Singh KC Sangakkara Joginder Sharma 0 0 0 0 0 0 0 0 0 Yuvraj Singh caught P Amarnath
14320 61 2 Kings XI Punjab Chennai Super Kings 18 4 KC Sangakkara SM Katich M Muralitharan 0 0 0 0 0 0 0 0 0 KC Sangakkara caught Joginder Sharma
15636 67 2 Mumbai Indians Chennai Super Kings 4 4 ST Jayasuriya RV Uthappa MS Gony 0 0 0 0 0 0 0 0 0 ST Jayasuriya caught Joginder Sharma
In [12]:
teams = ['csk','mi','rcb','kkr','rr','kxip','dd','srh']
csk_bowler = list(top_bowl_csk['Player'].unique())
mi_bowler = list(top_bowl_mi['Player'].unique())
rcb_bowler = list(top_bowl_rcb['Player'].unique())
kkr_bowler = list(top_bowl_kkr['Player'].unique())
rr_bowler = list(top_bowl_rr['Player'].unique())
kxip_bowler = list(top_bowl_kxip['Player'].unique())
dd_bowler = list(top_bowl_dd['Player'].unique())
srh_bowler = list(top_bowl_srh['Player'].unique())
In [13]:
temp = df_csk[(df_csk['bowler']=='DJ Bravo')]
temp.shape
Out[13]:
(114, 21)
In [14]:
deliveries['dismissal_kind'].unique()
Out[14]:
array([nan, 'caught', 'bowled', 'run out', 'lbw', 'caught and bowled',
       'stumped', 'retired hurt', 'hit wicket', 'obstructing the field'],
      dtype=object)
In [15]:
dismissal_kind = list(temp['dismissal_kind'])
dismissal_mapper = dict(zip(dismissal_kind,map(dismissal_kind.count,dismissal_kind)))
dismissal_mapper
Out[15]:
{'caught': 85, 'caught and bowled': 4, 'bowled': 11, 'lbw': 4, 'run out': 10}
In [16]:
def getmap(df,bowler):
    temp = df[(df['bowler']==bowler)]
    dismissal_kind = list(temp['dismissal_kind'])
    dismissal_mapper = dict(zip(dismissal_kind,map(dismissal_kind.count,dismissal_kind)))
    to_use = ['caught','caught and bowled','bowled','lbw','stumped','hit wicket']
    mapper = {}
    for key,val in dismissal_mapper.items():
        if key in to_use:
            mapper[key] = val
            
    return mapper


a = getmap(df_csk,'DJ Bravo')
a
Out[16]:
{'caught': 85, 'caught and bowled': 4, 'bowled': 11, 'lbw': 4}
In [17]:
csk_bowler
Out[17]:
['DJ Bravo', 'R Ashwin', 'RA Jadeja', 'JA Morkel', 'MM Sharma']
In [18]:
teams = ['csk','mi','rcb','kkr','rr','kxip','dd','srh']
In [19]:
teams = [csk_bowler,mi_bowler,rcb_bowler,kkr_bowler,rr_bowler,kxip_bowler,dd_bowler,srh_bowler]
In [20]:
def getdetails(df,player_list):
    final_mapper = {}
    for player in player_list:
        temp = df[(df['bowler']==player)]
        dismissal_kind = list(temp['dismissal_kind'])
        dismissal_mapper = dict(zip(dismissal_kind,map(dismissal_kind.count,dismissal_kind)))
        to_use = ['caught','caught and bowled','bowled','lbw','stumped','hit wicket']
        mapper = {}
        for key,val in dismissal_mapper.items():
            if key in to_use:
                mapper[key] = val
                
                
        final_mapper[player] = mapper
        temp = pd.DataFrame(final_mapper)
        temp = temp.T
        temp = temp.fillna(0)
        temp = temp.astype('int32')
        temp['Player'] = temp.index
        temp = temp.reset_index()
        temp = temp.drop(['index'],axis = 1)
        
    return temp
In [21]:
teams = ['csk','mi','rcb','kkr','rr','kxip','dd','srh']
In [22]:
bowl_csk = getdetails(df_csk,csk_bowler)
bowl_mi = getdetails(df_mi,mi_bowler)
bowl_rcb = getdetails(df_rcb,rcb_bowler)
bowl_kkr = getdetails(df_kkr,kkr_bowler)
bowl_rr = getdetails(df_rr,rr_bowler)
bowl_kxip = getdetails(df_kxip,kxip_bowler)
bowl_dd = getdetails(df_dd,dd_bowler)
bowl_srh = getdetails(df_srh,srh_bowler)
In [23]:
bowl_csk
Out[23]:
caught caught and bowled bowled lbw stumped hit wicket Player
0 85 4 11 4 0 0 DJ Bravo
1 56 3 16 8 7 0 R Ashwin
2 47 3 20 6 5 0 RA Jadeja
3 53 2 15 5 0 1 JA Morkel
4 42 0 12 4 0 0 MM Sharma
In [24]:
bowl_csk.columns
Out[24]:
Index(['caught', 'caught and bowled', 'bowled', 'lbw', 'stumped', 'hit wicket',
       'Player'],
      dtype='object')
In [25]:
def getnameandruns(df_i):
    final = []
    for i in range(df_i.shape[0]):
        first = df_i.iloc[[i]]
        temp = []
        for i in first.columns:
            a = []
            a.append(list(first[i]))
            a = sum(a,[])
            temp.append(a)

        final.append(temp)


    final = sum(final,[])
    final = sum(final,[])
    name = [i for i in final if type(i)!=int]
    runs = [i for i in final if type(i)==int]
    final_runs = []
    start = 0
    end = 5
    while end<=len(runs):
        temp = runs[start:end]
        final_runs.append(temp)
        start = end
        end+=5
        
    return name,final_runs
In [26]:
csk_name,csk_bowl = getnameandruns(bowl_csk)
mi_name,mi_bowl = getnameandruns(bowl_mi)
rcb_name,rcb_bowl = getnameandruns(bowl_rcb)
kkr_name,kkr_bowl = getnameandruns(bowl_kkr)
rr_name,rr_bowl = getnameandruns(bowl_rr)
kxip_name,kxip_bowl = getnameandruns(bowl_kxip)
dd_name,dd_bowl = getnameandruns(bowl_dd)
srh_name,srh_bowl = getnameandruns(bowl_srh)
In [ ]:
 
In [27]:
def drawplots(player_wickets,player_names,player_name,top_bowl,text):
    
    wickets =  ['caught', 'caught and bowled', 'bowled', 'lbw', 'stumped', 'hit wicket']
    fig = make_subplots(rows=2,cols = 3,subplot_titles=tuple(player_names),
                       specs=[[{'type':'domain'},{'type':'domain'},{'type':'domain'}],
                              [{'type':'domain'},{'type':'domain'},{'type':'domain'}]],shared_yaxes=True)
    
    fig.add_trace(go.Pie(labels=wickets,values=player_wickets[0],name = player_names[0]),1,1)
    fig.add_trace(go.Pie(labels=wickets,values=player_wickets[1],name = player_names[1]),1,2)
    fig.add_trace(go.Pie(labels=wickets,values=player_wickets[2],name = player_names[2]),1,3)
    fig.add_trace(go.Pie(labels=wickets,values=player_wickets[3],name = player_names[3]),2,1)
    fig.add_trace(go.Pie(labels=wickets,values=player_wickets[4],name = player_names[4]),2,2)
    fig.add_trace(go.Pie(labels = player_name,values=list(top_bowl['TotalWickets'].unique())[:5]),2,3)
    fig.update_layout(height = 750,width = 900,title_text = text)
    fig.show()
    
In [28]:
final = []
teams = [csk_bowler,mi_bowler,rcb_bowler,kkr_bowler,rr_bowler,kxip_bowler,dd_bowler,srh_bowler]
for i in range(len(teams)):
    final.append(teams[i])
    
final
Out[28]:
[['DJ Bravo', 'R Ashwin', 'RA Jadeja', 'JA Morkel', 'MM Sharma'],
 ['SL Malinga',
  'Harbhajan Singh',
  'JJ Bumrah',
  'MJ McClenaghan',
  'KA Pollard'],
 ['YS Chahal', 'R Vinay Kumar', 'Z Khan', 'S Aravind', 'A Kumble'],
 ['SP Narine', 'PP Chawla', 'AD Russell', 'UT Yadav', 'Shakib Al Hasan'],
 ['SK Trivedi', 'SR Watson', 'SK Warne', 'JP Faulkner', 'MM Patel'],
 ['PP Chawla', 'Sandeep Sharma', 'AR Patel', 'IK Pathan', 'P Awana'],
 ['A Mishra', 'M Morkel', 'UT Yadav', 'S Nadeem', 'A Nehra'],
 ['B Kumar', 'Rashid Khan', 'S Kaul', 'KV Sharma', 'DW Steyn']]
In [29]:
teams = ['csk','mi','rcb','kkr','rr','kxip','dd','srh']
top_bowl = [top_bowl_csk,top_bowl_mi,top_bowl_rcb,top_bowl_kkr,top_bowl_rr,top_bowl_kxip,top_bowl_dd,top_bowl_srh]
player_name = [csk_name,mi_name,rcb_name,kkr_name,rr_name,kxip_name,dd_name,srh_name]
player_runs = [csk_bowl,mi_bowl,rcb_bowl,kkr_bowl,rr_bowl,kxip_bowl,dd_bowl,srh_bowl]

for i,j,k,l,m in zip(range(len(teams)),range(len(player_name)),range(len(player_runs)),range(len(top_bowl)),range(len(final))):
    
    drawplots(player_runs[k],player_name[j],final[m],top_bowl[l],text = "Top 5 Bowlers From"+" "+str(teams[i]).upper())
    print("-"*120)
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------

Fielder Analysis

In [41]:
df_csk = deliveries[(deliveries['bowling_team']=='Chennai Super Kings')&(deliveries['dismissal_kind']=='caught')]
df_mi = deliveries[(deliveries['bowling_team']=='Mumbai Indians')&(deliveries['dismissal_kind']=='caught')]
df_rcb = deliveries[(deliveries['bowling_team']=='Royal Challengers Bangalore')&(deliveries['dismissal_kind']=='caught')]
df_kkr = deliveries[(deliveries['bowling_team']=='Kolkata Knight Riders')&(deliveries['dismissal_kind']=='caught')]
df_rr = deliveries[(deliveries['bowling_team']=='Rajasthan Royals')&(deliveries['dismissal_kind']=='caught')]
df_kxip = deliveries[(deliveries['bowling_team']=='Kings XI Punjab')&(deliveries['dismissal_kind']=='caught')]
df_dd = deliveries[(deliveries['bowling_team']=='Delhi Daredevils')&(deliveries['dismissal_kind']=='caught')]
df_srh = deliveries[(deliveries['bowling_team']=='Sunrisers Hyderabad')&(deliveries['dismissal_kind']=='caught')]
In [42]:
def getmap(df):
    bowler = list(df['fielder'])
    bowler_map = dict(zip(bowler,map(bowler.count,bowler)))
    bowler_map = dict(sorted(bowler_map.items(),key = lambda x:x[1],reverse=True))
    bowler_map = dict(list(bowler_map.items())[:5])
    keys = []
    values = []
    for key,value in bowler_map.items():
        keys.append(key)
        values.append(value)
    df = pd.DataFrame()
    df['Player'] = keys
    df['TotalCatches'] = values
    return df
In [43]:
top_catch_csk = getmap(df_csk)
top_catch_mi  = getmap(df_mi)
top_catch_rcb = getmap(df_rcb)
top_catch_kkr = getmap(df_kkr)
top_catch_rr = getmap(df_rr)
top_catch_kxip = getmap(df_kxip)
top_catch_dd = getmap(df_dd)
top_catch_srh = getmap(df_srh)
In [44]:
def getnameandruns(df_i):
    
    player = list(df_i['Player'])
    catches = list(df_i['TotalCatches'])
        
    return player,catches
In [45]:
csk_name,csk_bowl = getnameandruns(top_catch_csk)
mi_name,mi_bowl = getnameandruns(top_catch_mi)
rcb_name,rcb_bowl = getnameandruns(top_catch_rcb)
kkr_name,kkr_bowl = getnameandruns(top_catch_kkr)
rr_name,rr_bowl = getnameandruns(top_catch_rr)
kxip_name,kxip_bowl = getnameandruns(top_catch_kxip)
dd_name,dd_bowl = getnameandruns(top_catch_dd)
srh_name,srh_bowl = getnameandruns(top_catch_srh)
In [46]:
fig = make_subplots(rows=4,cols = 2,subplot_titles=('CSK','MI','RCB','KKR',
                                                 'RR','KXIP','DD','SRH'),
                      specs=[[{'type':'domain'},{'type':'domain'}],
                            [{'type':'domain'},{'type':'domain'}],
                            [{'type':'domain'},{'type':'domain'}],
                            [{'type':'domain'},{'type':'domain'}]],shared_yaxes=True)

fig.add_trace(go.Pie(labels=csk_name,values=csk_bowl),1,1)
fig.add_trace(go.Pie(labels=mi_name,values=mi_bowl),1,2)
fig.add_trace(go.Pie(labels=rcb_name,values=rcb_bowl),2,1)
fig.add_trace(go.Pie(labels=kkr_name,values=kkr_bowl),2,2)
fig.add_trace(go.Pie(labels=rr_name,values=rr_bowl),3,1)
fig.add_trace(go.Pie(labels=kxip_name,values=kxip_bowl),3,2)
fig.add_trace(go.Pie(labels=dd_name,values=dd_bowl),4,1)
fig.add_trace(go.Pie(labels=srh_name,values=srh_bowl),4,2)

fig.update_traces(hole=.4, hoverinfo="label+percent+value")
fig.update_layout(height = 1400,width = 900,title_text = "Top Feilders of Each Team")

fig.show()