diff --git a/Prediction Models/IPL Winner Prediction/Readme.md b/Prediction Models/IPL Winner Prediction/Readme.md new file mode 100644 index 00000000..92486d72 --- /dev/null +++ b/Prediction Models/IPL Winner Prediction/Readme.md @@ -0,0 +1,2 @@ +# ipl-winner-prediction +A machine learning project to predict IPL match winner diff --git a/Prediction Models/IPL Winner Prediction/app.py b/Prediction Models/IPL Winner Prediction/app.py new file mode 100644 index 00000000..a3a18762 --- /dev/null +++ b/Prediction Models/IPL Winner Prediction/app.py @@ -0,0 +1,57 @@ +import streamlit as st +import pickle +import pandas as pd + +teams = ['Sunrisers Hyderabad', + 'Mumbai Indians', + 'Royal Challengers Bangalore', + 'Kolkata Knight Riders', + 'Kings XI Punjab', + 'Chennai Super Kings', + 'Rajasthan Royals', + 'Delhi Capitals'] + +cities = ['Hyderabad', 'Bangalore', 'Mumbai', 'Indore', 'Kolkata', 'Delhi', + 'Chandigarh', 'Jaipur', 'Chennai', 'Cape Town', 'Port Elizabeth', + 'Durban', 'Centurion', 'East London', 'Johannesburg', 'Kimberley', + 'Bloemfontein', 'Ahmedabad', 'Cuttack', 'Nagpur', 'Dharamsala', + 'Visakhapatnam', 'Pune', 'Raipur', 'Ranchi', 'Abu Dhabi', + 'Sharjah', 'Mohali', 'Bengaluru'] + +pipe = pickle.load(open('pipe.pkl','rb')) +st.title('IPL Win Predictor') + +col1, col2 = st.beta_columns(2) + +with col1: + batting_team = st.selectbox('Select the batting team',sorted(teams)) +with col2: + bowling_team = st.selectbox('Select the bowling team',sorted(teams)) + +selected_city = st.selectbox('Select host city',sorted(cities)) + +target = st.number_input('Target') + +col3,col4,col5 = st.beta_columns(3) + +with col3: + score = st.number_input('Score') +with col4: + overs = st.number_input('Overs completed') +with col5: + wickets = st.number_input('Wickets out') + +if st.button('Predict Probability'): + runs_left = target - score + balls_left = 120 - (overs*6) + wickets = 10 - wickets + crr = score/overs + rrr = (runs_left*6)/balls_left + + input_df = pd.DataFrame({'batting_team':[batting_team],'bowling_team':[bowling_team],'city':[selected_city],'runs_left':[runs_left],'balls_left':[balls_left],'wickets':[wickets],'total_runs_x':[target],'crr':[crr],'rrr':[rrr]}) + + result = pipe.predict_proba(input_df) + loss = result[0][0] + win = result[0][1] + st.header(batting_team + "- " + str(round(win*100)) + "%") + st.header(bowling_team + "- " + str(round(loss*100)) + "%") diff --git a/Prediction Models/IPL Winner Prediction/data.ipynb b/Prediction Models/IPL Winner Prediction/data.ipynb new file mode 100644 index 00000000..2881228f --- /dev/null +++ b/Prediction Models/IPL Winner Prediction/data.ipynb @@ -0,0 +1,3475 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 39, + "id": "aabfc9b7", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "079ed1b4", + "metadata": {}, + "outputs": [], + "source": [ + "match = pd.read_csv('matches.csv')\n", + "delivery = pd.read_csv('deliveries.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "bfadbf7d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idSeasoncitydateteam1team2toss_winnertoss_decisionresultdl_appliedwinnerwin_by_runswin_by_wicketsplayer_of_matchvenueumpire1umpire2umpire3
01IPL-2017Hyderabad05-04-2017Sunrisers HyderabadRoyal Challengers BangaloreRoyal Challengers Bangalorefieldnormal0Sunrisers Hyderabad350Yuvraj SinghRajiv Gandhi International Stadium, UppalAY DandekarNJ LlongNaN
12IPL-2017Pune06-04-2017Mumbai IndiansRising Pune SupergiantRising Pune Supergiantfieldnormal0Rising Pune Supergiant07SPD SmithMaharashtra Cricket Association StadiumA Nand KishoreS RaviNaN
23IPL-2017Rajkot07-04-2017Gujarat LionsKolkata Knight RidersKolkata Knight Ridersfieldnormal0Kolkata Knight Riders010CA LynnSaurashtra Cricket Association StadiumNitin MenonCK NandanNaN
34IPL-2017Indore08-04-2017Rising Pune SupergiantKings XI PunjabKings XI Punjabfieldnormal0Kings XI Punjab06GJ MaxwellHolkar Cricket StadiumAK ChaudharyC ShamshuddinNaN
45IPL-2017Bangalore08-04-2017Royal Challengers BangaloreDelhi DaredevilsRoyal Challengers Bangalorebatnormal0Royal Challengers Bangalore150KM JadhavM Chinnaswamy StadiumNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " id Season city date team1 \\\n", + "0 1 IPL-2017 Hyderabad 05-04-2017 Sunrisers Hyderabad \n", + "1 2 IPL-2017 Pune 06-04-2017 Mumbai Indians \n", + "2 3 IPL-2017 Rajkot 07-04-2017 Gujarat Lions \n", + "3 4 IPL-2017 Indore 08-04-2017 Rising Pune Supergiant \n", + "4 5 IPL-2017 Bangalore 08-04-2017 Royal Challengers Bangalore \n", + "\n", + " team2 toss_winner toss_decision \\\n", + "0 Royal Challengers Bangalore Royal Challengers Bangalore field \n", + "1 Rising Pune Supergiant Rising Pune Supergiant field \n", + "2 Kolkata Knight Riders Kolkata Knight Riders field \n", + "3 Kings XI Punjab Kings XI Punjab field \n", + "4 Delhi Daredevils Royal Challengers Bangalore bat \n", + "\n", + " result dl_applied winner win_by_runs \\\n", + "0 normal 0 Sunrisers Hyderabad 35 \n", + "1 normal 0 Rising Pune Supergiant 0 \n", + "2 normal 0 Kolkata Knight Riders 0 \n", + "3 normal 0 Kings XI Punjab 0 \n", + "4 normal 0 Royal Challengers Bangalore 15 \n", + "\n", + " win_by_wickets player_of_match venue \\\n", + "0 0 Yuvraj Singh Rajiv Gandhi International Stadium, Uppal \n", + "1 7 SPD Smith Maharashtra Cricket Association Stadium \n", + "2 10 CA Lynn Saurashtra Cricket Association Stadium \n", + "3 6 GJ Maxwell Holkar Cricket Stadium \n", + "4 0 KM Jadhav M Chinnaswamy Stadium \n", + "\n", + " umpire1 umpire2 umpire3 \n", + "0 AY Dandekar NJ Llong NaN \n", + "1 A Nand Kishore S Ravi NaN \n", + "2 Nitin Menon CK Nandan NaN \n", + "3 AK Chaudhary C Shamshuddin NaN \n", + "4 NaN NaN NaN " + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "match.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "d4616531", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(756, 18)" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "match.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "b9576f6a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
match_idinningbatting_teambowling_teamoverballbatsmannon_strikerbowleris_super_over...bye_runslegbye_runsnoball_runspenalty_runsbatsman_runsextra_runstotal_runsplayer_dismisseddismissal_kindfielder
011Sunrisers HyderabadRoyal Challengers Bangalore11DA WarnerS DhawanTS Mills0...0000000NaNNaNNaN
111Sunrisers HyderabadRoyal Challengers Bangalore12DA WarnerS DhawanTS Mills0...0000000NaNNaNNaN
211Sunrisers HyderabadRoyal Challengers Bangalore13DA WarnerS DhawanTS Mills0...0000404NaNNaNNaN
311Sunrisers HyderabadRoyal Challengers Bangalore14DA WarnerS DhawanTS Mills0...0000000NaNNaNNaN
411Sunrisers HyderabadRoyal Challengers Bangalore15DA WarnerS DhawanTS Mills0...0000022NaNNaNNaN
\n", + "

5 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " match_id inning batting_team bowling_team over \\\n", + "0 1 1 Sunrisers Hyderabad Royal Challengers Bangalore 1 \n", + "1 1 1 Sunrisers Hyderabad Royal Challengers Bangalore 1 \n", + "2 1 1 Sunrisers Hyderabad Royal Challengers Bangalore 1 \n", + "3 1 1 Sunrisers Hyderabad Royal Challengers Bangalore 1 \n", + "4 1 1 Sunrisers Hyderabad Royal Challengers Bangalore 1 \n", + "\n", + " ball batsman non_striker bowler is_super_over ... bye_runs \\\n", + "0 1 DA Warner S Dhawan TS Mills 0 ... 0 \n", + "1 2 DA Warner S Dhawan TS Mills 0 ... 0 \n", + "2 3 DA Warner S Dhawan TS Mills 0 ... 0 \n", + "3 4 DA Warner S Dhawan TS Mills 0 ... 0 \n", + "4 5 DA Warner S Dhawan TS Mills 0 ... 0 \n", + "\n", + " legbye_runs noball_runs penalty_runs batsman_runs extra_runs \\\n", + "0 0 0 0 0 0 \n", + "1 0 0 0 0 0 \n", + "2 0 0 0 4 0 \n", + "3 0 0 0 0 0 \n", + "4 0 0 0 0 2 \n", + "\n", + " total_runs player_dismissed dismissal_kind fielder \n", + "0 0 NaN NaN NaN \n", + "1 0 NaN NaN NaN \n", + "2 4 NaN NaN NaN \n", + "3 0 NaN NaN NaN \n", + "4 2 NaN NaN NaN \n", + "\n", + "[5 rows x 21 columns]" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "delivery.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "be21b391", + "metadata": {}, + "outputs": [], + "source": [ + "total_score_df = delivery.groupby(['match_id','inning']).sum()['total_runs'].reset_index()" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "cbf8c553", + "metadata": {}, + "outputs": [], + "source": [ + "total_score_df = total_score_df[total_score_df['inning'] == 1]" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "0e59930d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
match_idinningtotal_runs
011207
221184
431183
641163
851157
............
1518113471143
1520114121136
1522114131171
1524114141155
1526114151152
\n", + "

756 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " match_id inning total_runs\n", + "0 1 1 207\n", + "2 2 1 184\n", + "4 3 1 183\n", + "6 4 1 163\n", + "8 5 1 157\n", + "... ... ... ...\n", + "1518 11347 1 143\n", + "1520 11412 1 136\n", + "1522 11413 1 171\n", + "1524 11414 1 155\n", + "1526 11415 1 152\n", + "\n", + "[756 rows x 3 columns]" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "total_score_df" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "78c81c64", + "metadata": {}, + "outputs": [], + "source": [ + "match_df = match.merge(total_score_df[['match_id','total_runs']],left_on='id',right_on='match_id')" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "6dad8a91", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idSeasoncitydateteam1team2toss_winnertoss_decisionresultdl_appliedwinnerwin_by_runswin_by_wicketsplayer_of_matchvenueumpire1umpire2umpire3match_idtotal_runs
01IPL-2017Hyderabad05-04-2017Sunrisers HyderabadRoyal Challengers BangaloreRoyal Challengers Bangalorefieldnormal0Sunrisers Hyderabad350Yuvraj SinghRajiv Gandhi International Stadium, UppalAY DandekarNJ LlongNaN1207
12IPL-2017Pune06-04-2017Mumbai IndiansRising Pune SupergiantRising Pune Supergiantfieldnormal0Rising Pune Supergiant07SPD SmithMaharashtra Cricket Association StadiumA Nand KishoreS RaviNaN2184
23IPL-2017Rajkot07-04-2017Gujarat LionsKolkata Knight RidersKolkata Knight Ridersfieldnormal0Kolkata Knight Riders010CA LynnSaurashtra Cricket Association StadiumNitin MenonCK NandanNaN3183
34IPL-2017Indore08-04-2017Rising Pune SupergiantKings XI PunjabKings XI Punjabfieldnormal0Kings XI Punjab06GJ MaxwellHolkar Cricket StadiumAK ChaudharyC ShamshuddinNaN4163
45IPL-2017Bangalore08-04-2017Royal Challengers BangaloreDelhi DaredevilsRoyal Challengers Bangalorebatnormal0Royal Challengers Bangalore150KM JadhavM Chinnaswamy StadiumNaNNaNNaN5157
...............................................................
75111347IPL-2019Mumbai05-05-2019Kolkata Knight RidersMumbai IndiansMumbai Indiansfieldnormal0Mumbai Indians09HH PandyaWankhede StadiumNanda KishoreO NandanS Ravi11347143
75211412IPL-2019Chennai07-05-2019Chennai Super KingsMumbai IndiansChennai Super Kingsbatnormal0Mumbai Indians06AS YadavM. A. Chidambaram StadiumNigel LlongNitin MenonIan Gould11412136
75311413IPL-2019Visakhapatnam08-05-2019Sunrisers HyderabadDelhi CapitalsDelhi Capitalsfieldnormal0Delhi Capitals02RR PantACA-VDCA StadiumNaNNaNNaN11413171
75411414IPL-2019Visakhapatnam10-05-2019Delhi CapitalsChennai Super KingsChennai Super Kingsfieldnormal0Chennai Super Kings06F du PlessisACA-VDCA StadiumSundaram RaviBruce OxenfordChettithody Shamshuddin11414155
75511415IPL-2019Hyderabad12-05-2019Mumbai IndiansChennai Super KingsMumbai Indiansbatnormal0Mumbai Indians10JJ BumrahRajiv Gandhi Intl. Cricket StadiumNitin MenonIan GouldNigel Llong11415152
\n", + "

756 rows × 20 columns

\n", + "
" + ], + "text/plain": [ + " id Season city date team1 \\\n", + "0 1 IPL-2017 Hyderabad 05-04-2017 Sunrisers Hyderabad \n", + "1 2 IPL-2017 Pune 06-04-2017 Mumbai Indians \n", + "2 3 IPL-2017 Rajkot 07-04-2017 Gujarat Lions \n", + "3 4 IPL-2017 Indore 08-04-2017 Rising Pune Supergiant \n", + "4 5 IPL-2017 Bangalore 08-04-2017 Royal Challengers Bangalore \n", + ".. ... ... ... ... ... \n", + "751 11347 IPL-2019 Mumbai 05-05-2019 Kolkata Knight Riders \n", + "752 11412 IPL-2019 Chennai 07-05-2019 Chennai Super Kings \n", + "753 11413 IPL-2019 Visakhapatnam 08-05-2019 Sunrisers Hyderabad \n", + "754 11414 IPL-2019 Visakhapatnam 10-05-2019 Delhi Capitals \n", + "755 11415 IPL-2019 Hyderabad 12-05-2019 Mumbai Indians \n", + "\n", + " team2 toss_winner toss_decision \\\n", + "0 Royal Challengers Bangalore Royal Challengers Bangalore field \n", + "1 Rising Pune Supergiant Rising Pune Supergiant field \n", + "2 Kolkata Knight Riders Kolkata Knight Riders field \n", + "3 Kings XI Punjab Kings XI Punjab field \n", + "4 Delhi Daredevils Royal Challengers Bangalore bat \n", + ".. ... ... ... \n", + "751 Mumbai Indians Mumbai Indians field \n", + "752 Mumbai Indians Chennai Super Kings bat \n", + "753 Delhi Capitals Delhi Capitals field \n", + "754 Chennai Super Kings Chennai Super Kings field \n", + "755 Chennai Super Kings Mumbai Indians bat \n", + "\n", + " result dl_applied winner win_by_runs \\\n", + "0 normal 0 Sunrisers Hyderabad 35 \n", + "1 normal 0 Rising Pune Supergiant 0 \n", + "2 normal 0 Kolkata Knight Riders 0 \n", + "3 normal 0 Kings XI Punjab 0 \n", + "4 normal 0 Royal Challengers Bangalore 15 \n", + ".. ... ... ... ... \n", + "751 normal 0 Mumbai Indians 0 \n", + "752 normal 0 Mumbai Indians 0 \n", + "753 normal 0 Delhi Capitals 0 \n", + "754 normal 0 Chennai Super Kings 0 \n", + "755 normal 0 Mumbai Indians 1 \n", + "\n", + " win_by_wickets player_of_match \\\n", + "0 0 Yuvraj Singh \n", + "1 7 SPD Smith \n", + "2 10 CA Lynn \n", + "3 6 GJ Maxwell \n", + "4 0 KM Jadhav \n", + ".. ... ... \n", + "751 9 HH Pandya \n", + "752 6 AS Yadav \n", + "753 2 RR Pant \n", + "754 6 F du Plessis \n", + "755 0 JJ Bumrah \n", + "\n", + " venue umpire1 \\\n", + "0 Rajiv Gandhi International Stadium, Uppal AY Dandekar \n", + "1 Maharashtra Cricket Association Stadium A Nand Kishore \n", + "2 Saurashtra Cricket Association Stadium Nitin Menon \n", + "3 Holkar Cricket Stadium AK Chaudhary \n", + "4 M Chinnaswamy Stadium NaN \n", + ".. ... ... \n", + "751 Wankhede Stadium Nanda Kishore \n", + "752 M. A. Chidambaram Stadium Nigel Llong \n", + "753 ACA-VDCA Stadium NaN \n", + "754 ACA-VDCA Stadium Sundaram Ravi \n", + "755 Rajiv Gandhi Intl. Cricket Stadium Nitin Menon \n", + "\n", + " umpire2 umpire3 match_id total_runs \n", + "0 NJ Llong NaN 1 207 \n", + "1 S Ravi NaN 2 184 \n", + "2 CK Nandan NaN 3 183 \n", + "3 C Shamshuddin NaN 4 163 \n", + "4 NaN NaN 5 157 \n", + ".. ... ... ... ... \n", + "751 O Nandan S Ravi 11347 143 \n", + "752 Nitin Menon Ian Gould 11412 136 \n", + "753 NaN NaN 11413 171 \n", + "754 Bruce Oxenford Chettithody Shamshuddin 11414 155 \n", + "755 Ian Gould Nigel Llong 11415 152 \n", + "\n", + "[756 rows x 20 columns]" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "match_df" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "46d110b1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['Sunrisers Hyderabad', 'Mumbai Indians', 'Gujarat Lions',\n", + " 'Rising Pune Supergiant', 'Royal Challengers Bangalore',\n", + " 'Kolkata Knight Riders', 'Delhi Daredevils', 'Kings XI Punjab',\n", + " 'Chennai Super Kings', 'Rajasthan Royals', 'Deccan Chargers',\n", + " 'Kochi Tuskers Kerala', 'Pune Warriors', 'Rising Pune Supergiants',\n", + " 'Delhi Capitals'], dtype=object)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "match_df['team1'].unique()" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "9f048dbf", + "metadata": {}, + "outputs": [], + "source": [ + "teams = [\n", + " 'Sunrisers Hyderabad',\n", + " 'Mumbai Indians',\n", + " 'Royal Challengers Bangalore',\n", + " 'Kolkata Knight Riders',\n", + " 'Kings XI Punjab',\n", + " 'Chennai Super Kings',\n", + " 'Rajasthan Royals',\n", + " 'Delhi Capitals'\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "4ca212ee", + "metadata": {}, + "outputs": [], + "source": [ + "match_df['team1'] = match_df['team1'].str.replace('Delhi Daredevils','Delhi Capitals')\n", + "match_df['team2'] = match_df['team2'].str.replace('Delhi Daredevils','Delhi Capitals')\n", + "\n", + "match_df['team1'] = match_df['team1'].str.replace('Deccan Chargers','Sunrisers Hyderabad')\n", + "match_df['team2'] = match_df['team2'].str.replace('Deccan Chargers','Sunrisers Hyderabad')" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "ec3d2992", + "metadata": {}, + "outputs": [], + "source": [ + "match_df = match_df[match_df['team1'].isin(teams)]\n", + "match_df = match_df[match_df['team2'].isin(teams)]" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "456148f0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(641, 20)" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "match_df.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "82af99c7", + "metadata": {}, + "outputs": [], + "source": [ + "match_df = match_df[match_df['dl_applied'] == 0]" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "bb7e68ce", + "metadata": {}, + "outputs": [], + "source": [ + "match_df = match_df[['match_id','city','winner','total_runs']]" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "cfa8b802", + "metadata": {}, + "outputs": [], + "source": [ + "delivery_df = match_df.merge(delivery,on='match_id')" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "bb9e3301", + "metadata": {}, + "outputs": [], + "source": [ + "delivery_df = delivery_df[delivery_df['inning'] == 2]" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "id": "ed062c89", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
match_idcitywinnertotal_runs_xinningbatting_teambowling_teamoverballbatsman...bye_runslegbye_runsnoball_runspenalty_runsbatsman_runsextra_runstotal_runs_yplayer_dismisseddismissal_kindfielder
1251HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad11CH Gayle...0000101NaNNaNNaN
1261HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad12Mandeep Singh...0000000NaNNaNNaN
1271HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad13Mandeep Singh...0000000NaNNaNNaN
1281HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad14Mandeep Singh...0000202NaNNaNNaN
1291HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad15Mandeep Singh...0000404NaNNaNNaN
..................................................................
14957311415HyderabadMumbai Indians1522Chennai Super KingsMumbai Indians202RA Jadeja...0000101NaNNaNNaN
14957411415HyderabadMumbai Indians1522Chennai Super KingsMumbai Indians203SR Watson...0000202NaNNaNNaN
14957511415HyderabadMumbai Indians1522Chennai Super KingsMumbai Indians204SR Watson...0000101SR Watsonrun outKH Pandya
14957611415HyderabadMumbai Indians1522Chennai Super KingsMumbai Indians205SN Thakur...0000202NaNNaNNaN
14957711415HyderabadMumbai Indians1522Chennai Super KingsMumbai Indians206SN Thakur...0000000SN ThakurlbwNaN
\n", + "

72413 rows × 24 columns

\n", + "
" + ], + "text/plain": [ + " match_id city winner total_runs_x inning \\\n", + "125 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "126 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "127 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "128 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "129 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "... ... ... ... ... ... \n", + "149573 11415 Hyderabad Mumbai Indians 152 2 \n", + "149574 11415 Hyderabad Mumbai Indians 152 2 \n", + "149575 11415 Hyderabad Mumbai Indians 152 2 \n", + "149576 11415 Hyderabad Mumbai Indians 152 2 \n", + "149577 11415 Hyderabad Mumbai Indians 152 2 \n", + "\n", + " batting_team bowling_team over ball \\\n", + "125 Royal Challengers Bangalore Sunrisers Hyderabad 1 1 \n", + "126 Royal Challengers Bangalore Sunrisers Hyderabad 1 2 \n", + "127 Royal Challengers Bangalore Sunrisers Hyderabad 1 3 \n", + "128 Royal Challengers Bangalore Sunrisers Hyderabad 1 4 \n", + "129 Royal Challengers Bangalore Sunrisers Hyderabad 1 5 \n", + "... ... ... ... ... \n", + "149573 Chennai Super Kings Mumbai Indians 20 2 \n", + "149574 Chennai Super Kings Mumbai Indians 20 3 \n", + "149575 Chennai Super Kings Mumbai Indians 20 4 \n", + "149576 Chennai Super Kings Mumbai Indians 20 5 \n", + "149577 Chennai Super Kings Mumbai Indians 20 6 \n", + "\n", + " batsman ... bye_runs legbye_runs noball_runs penalty_runs \\\n", + "125 CH Gayle ... 0 0 0 0 \n", + "126 Mandeep Singh ... 0 0 0 0 \n", + "127 Mandeep Singh ... 0 0 0 0 \n", + "128 Mandeep Singh ... 0 0 0 0 \n", + "129 Mandeep Singh ... 0 0 0 0 \n", + "... ... ... ... ... ... ... \n", + "149573 RA Jadeja ... 0 0 0 0 \n", + "149574 SR Watson ... 0 0 0 0 \n", + "149575 SR Watson ... 0 0 0 0 \n", + "149576 SN Thakur ... 0 0 0 0 \n", + "149577 SN Thakur ... 0 0 0 0 \n", + "\n", + " batsman_runs extra_runs total_runs_y player_dismissed \\\n", + "125 1 0 1 NaN \n", + "126 0 0 0 NaN \n", + "127 0 0 0 NaN \n", + "128 2 0 2 NaN \n", + "129 4 0 4 NaN \n", + "... ... ... ... ... \n", + "149573 1 0 1 NaN \n", + "149574 2 0 2 NaN \n", + "149575 1 0 1 SR Watson \n", + "149576 2 0 2 NaN \n", + "149577 0 0 0 SN Thakur \n", + "\n", + " dismissal_kind fielder \n", + "125 NaN NaN \n", + "126 NaN NaN \n", + "127 NaN NaN \n", + "128 NaN NaN \n", + "129 NaN NaN \n", + "... ... ... \n", + "149573 NaN NaN \n", + "149574 NaN NaN \n", + "149575 run out KH Pandya \n", + "149576 NaN NaN \n", + "149577 lbw NaN \n", + "\n", + "[72413 rows x 24 columns]" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "delivery_df" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "3a2aed14", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":1: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " delivery_df['current_score'] = delivery_df.groupby('match_id').cumsum()['total_runs_y']\n" + ] + } + ], + "source": [ + "delivery_df['current_score'] = delivery_df.groupby('match_id').cumsum()['total_runs_y']" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "a37ab264", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":1: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " delivery_df['runs_left'] = delivery_df['total_runs_x'] - delivery_df['current_score']\n" + ] + } + ], + "source": [ + "delivery_df['runs_left'] = delivery_df['total_runs_x'] - delivery_df['current_score']" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "91142ecc", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":1: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " delivery_df['balls_left'] = 126 - (delivery_df['over']*6 + delivery_df['ball'])\n" + ] + } + ], + "source": [ + "delivery_df['balls_left'] = 126 - (delivery_df['over']*6 + delivery_df['ball'])" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "e49251b7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
match_idcitywinnertotal_runs_xinningbatting_teambowling_teamoverballbatsman...penalty_runsbatsman_runsextra_runstotal_runs_yplayer_dismisseddismissal_kindfieldercurrent_scoreruns_leftballs_left
1251HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad11CH Gayle...0101NaNNaNNaN1206119
1261HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad12Mandeep Singh...0000NaNNaNNaN1206118
1271HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad13Mandeep Singh...0000NaNNaNNaN1206117
1281HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad14Mandeep Singh...0202NaNNaNNaN3204116
1291HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad15Mandeep Singh...0404NaNNaNNaN7200115
..................................................................
14957311415HyderabadMumbai Indians1522Chennai Super KingsMumbai Indians202RA Jadeja...0101NaNNaNNaN15204
14957411415HyderabadMumbai Indians1522Chennai Super KingsMumbai Indians203SR Watson...0202NaNNaNNaN154-23
14957511415HyderabadMumbai Indians1522Chennai Super KingsMumbai Indians204SR Watson...0101SR Watsonrun outKH Pandya155-32
14957611415HyderabadMumbai Indians1522Chennai Super KingsMumbai Indians205SN Thakur...0202NaNNaNNaN157-51
14957711415HyderabadMumbai Indians1522Chennai Super KingsMumbai Indians206SN Thakur...0000SN ThakurlbwNaN157-50
\n", + "

72413 rows × 27 columns

\n", + "
" + ], + "text/plain": [ + " match_id city winner total_runs_x inning \\\n", + "125 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "126 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "127 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "128 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "129 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "... ... ... ... ... ... \n", + "149573 11415 Hyderabad Mumbai Indians 152 2 \n", + "149574 11415 Hyderabad Mumbai Indians 152 2 \n", + "149575 11415 Hyderabad Mumbai Indians 152 2 \n", + "149576 11415 Hyderabad Mumbai Indians 152 2 \n", + "149577 11415 Hyderabad Mumbai Indians 152 2 \n", + "\n", + " batting_team bowling_team over ball \\\n", + "125 Royal Challengers Bangalore Sunrisers Hyderabad 1 1 \n", + "126 Royal Challengers Bangalore Sunrisers Hyderabad 1 2 \n", + "127 Royal Challengers Bangalore Sunrisers Hyderabad 1 3 \n", + "128 Royal Challengers Bangalore Sunrisers Hyderabad 1 4 \n", + "129 Royal Challengers Bangalore Sunrisers Hyderabad 1 5 \n", + "... ... ... ... ... \n", + "149573 Chennai Super Kings Mumbai Indians 20 2 \n", + "149574 Chennai Super Kings Mumbai Indians 20 3 \n", + "149575 Chennai Super Kings Mumbai Indians 20 4 \n", + "149576 Chennai Super Kings Mumbai Indians 20 5 \n", + "149577 Chennai Super Kings Mumbai Indians 20 6 \n", + "\n", + " batsman ... penalty_runs batsman_runs extra_runs \\\n", + "125 CH Gayle ... 0 1 0 \n", + "126 Mandeep Singh ... 0 0 0 \n", + "127 Mandeep Singh ... 0 0 0 \n", + "128 Mandeep Singh ... 0 2 0 \n", + "129 Mandeep Singh ... 0 4 0 \n", + "... ... ... ... ... ... \n", + "149573 RA Jadeja ... 0 1 0 \n", + "149574 SR Watson ... 0 2 0 \n", + "149575 SR Watson ... 0 1 0 \n", + "149576 SN Thakur ... 0 2 0 \n", + "149577 SN Thakur ... 0 0 0 \n", + "\n", + " total_runs_y player_dismissed dismissal_kind fielder \\\n", + "125 1 NaN NaN NaN \n", + "126 0 NaN NaN NaN \n", + "127 0 NaN NaN NaN \n", + "128 2 NaN NaN NaN \n", + "129 4 NaN NaN NaN \n", + "... ... ... ... ... \n", + "149573 1 NaN NaN NaN \n", + "149574 2 NaN NaN NaN \n", + "149575 1 SR Watson run out KH Pandya \n", + "149576 2 NaN NaN NaN \n", + "149577 0 SN Thakur lbw NaN \n", + "\n", + " current_score runs_left balls_left \n", + "125 1 206 119 \n", + "126 1 206 118 \n", + "127 1 206 117 \n", + "128 3 204 116 \n", + "129 7 200 115 \n", + "... ... ... ... \n", + "149573 152 0 4 \n", + "149574 154 -2 3 \n", + "149575 155 -3 2 \n", + "149576 157 -5 1 \n", + "149577 157 -5 0 \n", + "\n", + "[72413 rows x 27 columns]" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "delivery_df" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "5ee97c37", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":1: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " delivery_df['player_dismissed'] = delivery_df['player_dismissed'].fillna(\"0\")\n", + ":2: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " delivery_df['player_dismissed'] = delivery_df['player_dismissed'].apply(lambda x:x if x == \"0\" else \"1\")\n", + ":3: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " delivery_df['player_dismissed'] = delivery_df['player_dismissed'].astype('int')\n", + ":5: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " delivery_df['wickets'] = 10 - wickets\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
match_idcitywinnertotal_runs_xinningbatting_teambowling_teamoverballbatsman...batsman_runsextra_runstotal_runs_yplayer_dismisseddismissal_kindfieldercurrent_scoreruns_leftballs_leftwickets
1251HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad11CH Gayle...1010NaNNaN120611910
1261HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad12Mandeep Singh...0000NaNNaN120611810
1271HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad13Mandeep Singh...0000NaNNaN120611710
1281HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad14Mandeep Singh...2020NaNNaN320411610
1291HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad15Mandeep Singh...4040NaNNaN720011510
\n", + "

5 rows × 28 columns

\n", + "
" + ], + "text/plain": [ + " match_id city winner total_runs_x inning \\\n", + "125 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "126 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "127 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "128 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "129 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "\n", + " batting_team bowling_team over ball \\\n", + "125 Royal Challengers Bangalore Sunrisers Hyderabad 1 1 \n", + "126 Royal Challengers Bangalore Sunrisers Hyderabad 1 2 \n", + "127 Royal Challengers Bangalore Sunrisers Hyderabad 1 3 \n", + "128 Royal Challengers Bangalore Sunrisers Hyderabad 1 4 \n", + "129 Royal Challengers Bangalore Sunrisers Hyderabad 1 5 \n", + "\n", + " batsman ... batsman_runs extra_runs total_runs_y \\\n", + "125 CH Gayle ... 1 0 1 \n", + "126 Mandeep Singh ... 0 0 0 \n", + "127 Mandeep Singh ... 0 0 0 \n", + "128 Mandeep Singh ... 2 0 2 \n", + "129 Mandeep Singh ... 4 0 4 \n", + "\n", + " player_dismissed dismissal_kind fielder current_score runs_left \\\n", + "125 0 NaN NaN 1 206 \n", + "126 0 NaN NaN 1 206 \n", + "127 0 NaN NaN 1 206 \n", + "128 0 NaN NaN 3 204 \n", + "129 0 NaN NaN 7 200 \n", + "\n", + " balls_left wickets \n", + "125 119 10 \n", + "126 118 10 \n", + "127 117 10 \n", + "128 116 10 \n", + "129 115 10 \n", + "\n", + "[5 rows x 28 columns]" + ] + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "delivery_df['player_dismissed'] = delivery_df['player_dismissed'].fillna(\"0\")\n", + "delivery_df['player_dismissed'] = delivery_df['player_dismissed'].apply(lambda x:x if x == \"0\" else \"1\")\n", + "delivery_df['player_dismissed'] = delivery_df['player_dismissed'].astype('int')\n", + "wickets = delivery_df.groupby('match_id').cumsum()['player_dismissed'].values\n", + "delivery_df['wickets'] = 10 - wickets\n", + "delivery_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "030b9c43", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
match_idcitywinnertotal_runs_xinningbatting_teambowling_teamoverballbatsman...batsman_runsextra_runstotal_runs_yplayer_dismisseddismissal_kindfieldercurrent_scoreruns_leftballs_leftwickets
1251HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad11CH Gayle...1010NaNNaN120611910
1261HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad12Mandeep Singh...0000NaNNaN120611810
1271HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad13Mandeep Singh...0000NaNNaN120611710
1281HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad14Mandeep Singh...2020NaNNaN320411610
1291HyderabadSunrisers Hyderabad2072Royal Challengers BangaloreSunrisers Hyderabad15Mandeep Singh...4040NaNNaN720011510
\n", + "

5 rows × 28 columns

\n", + "
" + ], + "text/plain": [ + " match_id city winner total_runs_x inning \\\n", + "125 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "126 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "127 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "128 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "129 1 Hyderabad Sunrisers Hyderabad 207 2 \n", + "\n", + " batting_team bowling_team over ball \\\n", + "125 Royal Challengers Bangalore Sunrisers Hyderabad 1 1 \n", + "126 Royal Challengers Bangalore Sunrisers Hyderabad 1 2 \n", + "127 Royal Challengers Bangalore Sunrisers Hyderabad 1 3 \n", + "128 Royal Challengers Bangalore Sunrisers Hyderabad 1 4 \n", + "129 Royal Challengers Bangalore Sunrisers Hyderabad 1 5 \n", + "\n", + " batsman ... batsman_runs extra_runs total_runs_y \\\n", + "125 CH Gayle ... 1 0 1 \n", + "126 Mandeep Singh ... 0 0 0 \n", + "127 Mandeep Singh ... 0 0 0 \n", + "128 Mandeep Singh ... 2 0 2 \n", + "129 Mandeep Singh ... 4 0 4 \n", + "\n", + " player_dismissed dismissal_kind fielder current_score runs_left \\\n", + "125 0 NaN NaN 1 206 \n", + "126 0 NaN NaN 1 206 \n", + "127 0 NaN NaN 1 206 \n", + "128 0 NaN NaN 3 204 \n", + "129 0 NaN NaN 7 200 \n", + "\n", + " balls_left wickets \n", + "125 119 10 \n", + "126 118 10 \n", + "127 117 10 \n", + "128 116 10 \n", + "129 115 10 \n", + "\n", + "[5 rows x 28 columns]" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "delivery_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "f9fe60c7", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":2: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " delivery_df['crr'] = (delivery_df['current_score']*6)/(120 - delivery_df['balls_left'])\n" + ] + } + ], + "source": [ + "# crr = runs/overs\n", + "delivery_df['crr'] = (delivery_df['current_score']*6)/(120 - delivery_df['balls_left'])" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "7d484dea", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":1: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " delivery_df['rrr'] = (delivery_df['runs_left']*6)/delivery_df['balls_left']\n" + ] + } + ], + "source": [ + "delivery_df['rrr'] = (delivery_df['runs_left']*6)/delivery_df['balls_left']" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "730c19d4", + "metadata": {}, + "outputs": [], + "source": [ + "def result(row):\n", + " return 1 if row['batting_team'] == row['winner'] else 0" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "a49caf70", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":1: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " delivery_df['result'] = delivery_df.apply(result,axis=1)\n" + ] + } + ], + "source": [ + "delivery_df['result'] = delivery_df.apply(result,axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "2999909b", + "metadata": {}, + "outputs": [], + "source": [ + "final_df = delivery_df[['batting_team','bowling_team','city','runs_left','balls_left','wickets','total_runs_x','crr','rrr','result']]" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "id": "fb242ffd", + "metadata": {}, + "outputs": [], + "source": [ + "final_df = final_df.sample(final_df.shape[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "id": "3dc0b91d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
batting_teambowling_teamcityruns_leftballs_leftwicketstotal_runs_xcrrrrrresult
82780Delhi DaredevilsRoyal Challengers BangaloreDelhi1237971838.7804889.3417720
\n", + "
" + ], + "text/plain": [ + " batting_team bowling_team city runs_left \\\n", + "82780 Delhi Daredevils Royal Challengers Bangalore Delhi 123 \n", + "\n", + " balls_left wickets total_runs_x crr rrr result \n", + "82780 79 7 183 8.780488 9.341772 0 " + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "final_df.sample()" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "id": "dfec0834", + "metadata": {}, + "outputs": [], + "source": [ + "final_df.dropna(inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "id": "bafcba9c", + "metadata": {}, + "outputs": [], + "source": [ + "final_df = final_df[final_df['balls_left'] != 0]" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "id": "54edf23b", + "metadata": {}, + "outputs": [], + "source": [ + "X = final_df.iloc[:,:-1]\n", + "y = final_df.iloc[:,-1]\n", + "from sklearn.model_selection import train_test_split\n", + "X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "id": "3aa219a5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
batting_teambowling_teamcityruns_leftballs_leftwicketstotal_runs_xcrrrrr
57047Royal Challengers BangaloreChennai Super KingsBangalore12010991284.3636366.605505
139340Kolkata Knight RidersRoyal Challengers BangaloreBengaluru13275921010.40000010.560000
42239Mumbai IndiansChennai Super KingsChennai12892101657.9285718.347826
125767Sunrisers HyderabadChennai Super KingsHyderabad1296971866.70588211.217391
128443Mumbai IndiansRoyal Challengers BangaloreBengaluru1348971737.5483879.033708
..............................
67579Deccan ChargersKings XI PunjabHyderabad16010991705.4545458.807339
30775Deccan ChargersKings XI PunjabJohannesburg1111071013410.6153856.224299
35251Kolkata Knight RidersChennai Super KingsKolkata854741646.49315110.851064
53800Deccan ChargersKolkata Knight RidersHyderabad582861697.23913012.428571
84954Rajasthan RoyalsSunrisers HyderabadHyderabad977291364.8750008.083333
\n", + "

57073 rows × 9 columns

\n", + "
" + ], + "text/plain": [ + " batting_team bowling_team \\\n", + "57047 Royal Challengers Bangalore Chennai Super Kings \n", + "139340 Kolkata Knight Riders Royal Challengers Bangalore \n", + "42239 Mumbai Indians Chennai Super Kings \n", + "125767 Sunrisers Hyderabad Chennai Super Kings \n", + "128443 Mumbai Indians Royal Challengers Bangalore \n", + "... ... ... \n", + "67579 Deccan Chargers Kings XI Punjab \n", + "30775 Deccan Chargers Kings XI Punjab \n", + "35251 Kolkata Knight Riders Chennai Super Kings \n", + "53800 Deccan Chargers Kolkata Knight Riders \n", + "84954 Rajasthan Royals Sunrisers Hyderabad \n", + "\n", + " city runs_left balls_left wickets total_runs_x crr \\\n", + "57047 Bangalore 120 109 9 128 4.363636 \n", + "139340 Bengaluru 132 75 9 210 10.400000 \n", + "42239 Chennai 128 92 10 165 7.928571 \n", + "125767 Hyderabad 129 69 7 186 6.705882 \n", + "128443 Bengaluru 134 89 7 173 7.548387 \n", + "... ... ... ... ... ... ... \n", + "67579 Hyderabad 160 109 9 170 5.454545 \n", + "30775 Johannesburg 111 107 10 134 10.615385 \n", + "35251 Kolkata 85 47 4 164 6.493151 \n", + "53800 Hyderabad 58 28 6 169 7.239130 \n", + "84954 Hyderabad 97 72 9 136 4.875000 \n", + "\n", + " rrr \n", + "57047 6.605505 \n", + "139340 10.560000 \n", + "42239 8.347826 \n", + "125767 11.217391 \n", + "128443 9.033708 \n", + "... ... \n", + "67579 8.807339 \n", + "30775 6.224299 \n", + "35251 10.851064 \n", + "53800 12.428571 \n", + "84954 8.083333 \n", + "\n", + "[57073 rows x 9 columns]" + ] + }, + "execution_count": 112, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "id": "45c6fffa", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.preprocessing import OneHotEncoder\n", + "\n", + "trf = ColumnTransformer([\n", + " ('trf',OneHotEncoder(sparse=False,drop='first'),['batting_team','bowling_team','city'])\n", + "]\n", + ",remainder='passthrough')" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "id": "9be108ac", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.ensemble import RandomForestClassifier\n", + "from sklearn.pipeline import Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "id": "92dfbfcb", + "metadata": {}, + "outputs": [], + "source": [ + "pipe = Pipeline(steps=[\n", + " ('step1',trf),\n", + " ('step2',LogisticRegression(solver='liblinear'))\n", + "])" + ] + }, + { + "cell_type": "code", + "execution_count": 146, + "id": "12679868", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Pipeline(steps=[('step1',\n", + " ColumnTransformer(remainder='passthrough',\n", + " transformers=[('trf',\n", + " OneHotEncoder(drop='first',\n", + " sparse=False),\n", + " ['batting_team',\n", + " 'bowling_team', 'city'])])),\n", + " ('step2', LogisticRegression(solver='liblinear'))])" + ] + }, + "execution_count": 146, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pipe.fit(X_train,y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "id": "cf3fde3b", + "metadata": {}, + "outputs": [], + "source": [ + "y_pred = pipe.predict(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "id": "b43ea121", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.8031396734178989" + ] + }, + "execution_count": 148, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.metrics import accuracy_score\n", + "accuracy_score(y_test,y_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "id": "01205f46", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.16705404, 0.83294596])" + ] + }, + "execution_count": 152, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pipe.predict_proba(X_test)[10]" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "id": "cf6fbd69", + "metadata": {}, + "outputs": [], + "source": [ + "def match_summary(row):\n", + " print(\"Batting Team-\" + row['batting_team'] + \" | Bowling Team-\" + row['bowling_team'] + \" | Target- \" + str(row['total_runs_x']))\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "id": "41c62b45", + "metadata": {}, + "outputs": [], + "source": [ + "def match_progression(x_df,match_id,pipe):\n", + " match = x_df[x_df['match_id'] == match_id]\n", + " match = match[(match['ball'] == 6)]\n", + " temp_df = match[['batting_team','bowling_team','city','runs_left','balls_left','wickets','total_runs_x','crr','rrr']].dropna()\n", + " temp_df = temp_df[temp_df['balls_left'] != 0]\n", + " result = pipe.predict_proba(temp_df)\n", + " temp_df['lose'] = np.round(result.T[0]*100,1)\n", + " temp_df['win'] = np.round(result.T[1]*100,1)\n", + " temp_df['end_of_over'] = range(1,temp_df.shape[0]+1)\n", + " \n", + " target = temp_df['total_runs_x'].values[0]\n", + " runs = list(temp_df['runs_left'].values)\n", + " new_runs = runs[:]\n", + " runs.insert(0,target)\n", + " temp_df['runs_after_over'] = np.array(runs)[:-1] - np.array(new_runs)\n", + " wickets = list(temp_df['wickets'].values)\n", + " new_wickets = wickets[:]\n", + " new_wickets.insert(0,10)\n", + " wickets.append(0)\n", + " w = np.array(wickets)\n", + " nw = np.array(new_wickets)\n", + " temp_df['wickets_in_over'] = (nw - w)[0:temp_df.shape[0]]\n", + " \n", + " print(\"Target-\",target)\n", + " temp_df = temp_df[['end_of_over','runs_after_over','wickets_in_over','lose','win']]\n", + " return temp_df,target\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "id": "d3238e65", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Target- 178\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
end_of_overruns_after_overwickets_in_overlosewin
1045914054.145.9
1046728048.951.1
1047331055.844.2
1047947167.832.2
10485512057.542.5
10491613045.154.9
1049779039.360.7
10505815025.874.2
1051197023.776.3
105181017012.887.2
10524119117.982.1
10530129014.685.4
10536138012.687.4
10542148010.889.2
10548155118.981.1
10555168127.172.9
10561178253.047.0
10567186168.431.6
10573198288.311.7
\n", + "
" + ], + "text/plain": [ + " end_of_over runs_after_over wickets_in_over lose win\n", + "10459 1 4 0 54.1 45.9\n", + "10467 2 8 0 48.9 51.1\n", + "10473 3 1 0 55.8 44.2\n", + "10479 4 7 1 67.8 32.2\n", + "10485 5 12 0 57.5 42.5\n", + "10491 6 13 0 45.1 54.9\n", + "10497 7 9 0 39.3 60.7\n", + "10505 8 15 0 25.8 74.2\n", + "10511 9 7 0 23.7 76.3\n", + "10518 10 17 0 12.8 87.2\n", + "10524 11 9 1 17.9 82.1\n", + "10530 12 9 0 14.6 85.4\n", + "10536 13 8 0 12.6 87.4\n", + "10542 14 8 0 10.8 89.2\n", + "10548 15 5 1 18.9 81.1\n", + "10555 16 8 1 27.1 72.9\n", + "10561 17 8 2 53.0 47.0\n", + "10567 18 6 1 68.4 31.6\n", + "10573 19 8 2 88.3 11.7" + ] + }, + "execution_count": 173, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "temp_df,target = match_progression(delivery_df,74,pipe)\n", + "temp_df" + ] + }, + { + "cell_type": "code", + "execution_count": 174, + "id": "256b9c2d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Target-178')" + ] + }, + "execution_count": 174, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "plt.figure(figsize=(18,8))\n", + "plt.plot(temp_df['end_of_over'],temp_df['wickets_in_over'],color='yellow',linewidth=3)\n", + "plt.plot(temp_df['end_of_over'],temp_df['win'],color='#00a65a',linewidth=4)\n", + "plt.plot(temp_df['end_of_over'],temp_df['lose'],color='red',linewidth=4)\n", + "plt.bar(temp_df['end_of_over'],temp_df['runs_after_over'])\n", + "plt.title('Target-' + str(target))" + ] + }, + { + "cell_type": "code", + "execution_count": 175, + "id": "5731378e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Sunrisers Hyderabad',\n", + " 'Mumbai Indians',\n", + " 'Royal Challengers Bangalore',\n", + " 'Kolkata Knight Riders',\n", + " 'Kings XI Punjab',\n", + " 'Chennai Super Kings',\n", + " 'Rajasthan Royals',\n", + " 'Delhi Capitals']" + ] + }, + "execution_count": 175, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "teams" + ] + }, + { + "cell_type": "code", + "execution_count": 178, + "id": "fb7e305d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['Hyderabad', 'Bangalore', 'Mumbai', 'Indore', 'Kolkata', 'Delhi',\n", + " 'Chandigarh', 'Jaipur', 'Chennai', 'Cape Town', 'Port Elizabeth',\n", + " 'Durban', 'Centurion', 'East London', 'Johannesburg', 'Kimberley',\n", + " 'Bloemfontein', 'Ahmedabad', 'Cuttack', 'Nagpur', 'Dharamsala',\n", + " 'Visakhapatnam', 'Pune', 'Raipur', 'Ranchi', 'Abu Dhabi',\n", + " 'Sharjah', nan, 'Mohali', 'Bengaluru'], dtype=object)" + ] + }, + "execution_count": 178, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "delivery_df['city'].unique()" + ] + }, + { + "cell_type": "code", + "execution_count": 179, + "id": "99e08b54", + "metadata": {}, + "outputs": [], + "source": [ + "import pickle\n", + "pickle.dump(pipe,open('pipe.pkl','wb'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "89595d62", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Prediction Models/IPL Winner Prediction/requirements.txt b/Prediction Models/IPL Winner Prediction/requirements.txt new file mode 100644 index 00000000..47e79176 --- /dev/null +++ b/Prediction Models/IPL Winner Prediction/requirements.txt @@ -0,0 +1,4 @@ +streamlit +pandas +numpy +sklearn diff --git a/Prediction Models/IPL Winner Prediction/setup.sh b/Prediction Models/IPL Winner Prediction/setup.sh new file mode 100644 index 00000000..8955be42 --- /dev/null +++ b/Prediction Models/IPL Winner Prediction/setup.sh @@ -0,0 +1,9 @@ +mkdir -p ~/.streamlit/ + +echo "\ +[server]\n\ +port = $PORT\n\ +enableCORS = false\n\ +headless = true\n\ +\n\ +" > ~/.streamlit/config.toml