{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport os\nimport sys\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.metrics import log_loss\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.model_selection import GridSearchCV\n%matplotlib inline\n\nif not sys.warnoptions:\n    import warnings\n    warnings.simplefilter(\"ignore\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-08-27T12:17:11.764991Z","iopub.execute_input":"2021-08-27T12:17:11.765401Z","iopub.status.idle":"2021-08-27T12:17:13.088884Z","shell.execute_reply.started":"2021-08-27T12:17:11.765358Z","shell.execute_reply":"2021-08-27T12:17:13.087614Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"NCAATourneyCompactResults.csv contains basic information on all of the NCAA Tournament games since 1985.\nRegularSeasonCompactResults.csv contains basic information on all of the regular season games since 1985.\n\n* Season = Tournament Year (YYYY)\n* DayNum = Day of the game\n* WTeamID (LTeamID) = The ID of the winning (losing) team\n* WScore (LScore) = The final game score for the winning (losing) team\n* WLoc = winning team location (H = home, A = away, N = neutral)\n* NumOT = Number of overtimes played","metadata":{}},{"cell_type":"code","source":"pd.set_option('display.max_columns', 100)\n\n# import basic information from past regular seasons and tournaments\ndf_tourney_all_compact = pd.read_csv('../input/mens-machine-learning-competition-2019/Stage2DataFiles/NCAATourneyCompactResults.csv')\ndf_regular_all_compact = pd.read_csv('../input/mens-machine-learning-competition-2019/Stage2DataFiles/RegularSeasonCompactResults.csv')\n\ndf_regular_all_compact.head()","metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","execution":{"iopub.status.busy":"2021-08-27T12:17:13.091203Z","iopub.execute_input":"2021-08-27T12:17:13.091605Z","iopub.status.idle":"2021-08-27T12:17:13.319779Z","shell.execute_reply.started":"2021-08-27T12:17:13.091548Z","shell.execute_reply":"2021-08-27T12:17:13.318285Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"NCAATourneyDetailedResults.csv contains more detailed information on all of the NCAA Tournament games since 2003.\nRegularSeasonDetailedResults.csv contains more detailed information on all of the regular season games since 2003.\n\n* WFGM (LFGM) - field goals made by the winning (losing) team\n* WFGA (LFGA) - field goals attempted by the winning (losing) team\n* WFGM3 (LFGM3) - three pointers made by the winning (losing) team\n* WFGA3 (LFGA3) - three pointers attempted by the winning (losing) team\n* WFTM (LFTM) - free throws made by the winning (losing) team\n* WFTA (LFTA) - free throws attempted by the winning (losing) team\n* WOR (LOR) - offensive rebounds by the winning (losing) team\n* WDR (LDR) - defensive rebounds by the winning (losing) team\n* WAst (LAst) - assists by the winning (losing) team\n* WTO (LTO) - turnovers committed by the winning (losing) team\n* WStl (LStl) - steals by the winning (losing) team\n* WBlk (LBlk) - blocks by the winning (losing) team\n* WPF (LPF) - personal fouls committed by the winning (losing) team","metadata":{}},{"cell_type":"code","source":"# import detailed information from past regular seasons and tournaments\ndf_tourney_all_detailed = pd.read_csv('../input/mens-machine-learning-competition-2019/Stage2DataFiles/NCAATourneyDetailedResults.csv')\ndf_regular_all_detailed = pd.read_csv('../input/mens-machine-learning-competition-2019/Stage2DataFiles/RegularSeasonDetailedResults.csv')\n\ndf_regular_all_detailed.head()","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:13.321340Z","iopub.execute_input":"2021-08-27T12:17:13.321707Z","iopub.status.idle":"2021-08-27T12:17:13.754623Z","shell.execute_reply.started":"2021-08-27T12:17:13.321641Z","shell.execute_reply":"2021-08-27T12:17:13.753318Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"It would be nice to see team names with the data. Adding team names to the detailed data...","metadata":{}},{"cell_type":"code","source":"df_teams = pd.read_csv('../input/mens-machine-learning-competition-2019/Stage2DataFiles/Teams.csv')\n\n# remove D1 season information\ndf_teams = df_teams.drop(['FirstD1Season', 'LastD1Season'], axis=1)\n\n# add winning team names (tourney)\ndf_teams = df_teams.rename(columns={\"TeamID\": \"WTeamID\"})\ndf_tourney_all_detailed = df_tourney_all_detailed.merge(df_teams, on='WTeamID')\ndf_tourney_all_detailed = df_tourney_all_detailed.rename(columns={\"TeamName\": \"WTeamName\"})\n\n# add losing team names (tourney)\ndf_teams = df_teams.rename(columns={\"WTeamID\": \"LTeamID\"})\ndf_tourney_all_detailed = df_tourney_all_detailed.merge(df_teams, on='LTeamID')\ndf_tourney_all_detailed = df_tourney_all_detailed.rename(columns={\"TeamName\": \"LTeamName\"})\n\n# add winning team names (regular)\ndf_teams = df_teams.rename(columns={\"LTeamID\": \"WTeamID\"})\ndf_regular_all_detailed = df_regular_all_detailed.merge(df_teams, on='WTeamID')\ndf_regular_all_detailed = df_regular_all_detailed.rename(columns={\"TeamName\": \"WTeamName\"})\n\n# add losing team names (regular)\ndf_teams = df_teams.rename(columns={\"WTeamID\": \"LTeamID\"})\ndf_regular_all_detailed = df_regular_all_detailed.merge(df_teams, on='LTeamID')\ndf_regular_all_detailed = df_regular_all_detailed.rename(columns={\"TeamName\": \"LTeamName\"})\n\ndf_regular_all_detailed.head()","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:13.756014Z","iopub.execute_input":"2021-08-27T12:17:13.756401Z","iopub.status.idle":"2021-08-27T12:17:14.085832Z","shell.execute_reply.started":"2021-08-27T12:17:13.756348Z","shell.execute_reply":"2021-08-27T12:17:14.084436Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Let's create some more regular season game stats for each team.\n\n* WFGPerc (LFGPerc) - Field Goal Percentage for the winning (losing) team\n* W3Perc (L3Perc) - 3 Point Field Goal Percentage for the winning (losing) team\n* WFTPerc (LFTPerc) - Free Throw Percentage for the winning (losing) team\n\nThere are certain \"industry standard\" basketball statistics that are not in the provided data. https://en.wikipedia.org/wiki/Advanced_statistics_in_basketball provides descriptions of many of these statistics. The following will be created:\n\n* WPoss (LPoss) = .96 x (FGA - OR + TO + (.44 x FTA)) : Possessions for the winning (losing) team\n* WOrtg (LOrtg) = (Points Scored x 100) / Possessions : Offensive Rating for the winning (losing) team\n* WDrtg (LDrtg) = (Points Allowed x 100) / Possessions : Defensive Rating for the winning (losing) team\n* WETSPerc (LETSPerc) = (FGM + .5 x FGM3) / FGA : Effective Technical Shooting Percentage for the winning (losing) team\n* WTSPerc (TSPerc) = Points Scored / (2 x (FGA + (.44 x FTA))) : True Shooting Percentage for the winning (losing) team","metadata":{}},{"cell_type":"code","source":"# create stats for winning teams\ndf_regular_all_detailed['WFGPerc'] = df_regular_all_detailed['WFGM'] / df_regular_all_detailed['WFGA']\ndf_regular_all_detailed['W3Perc'] = df_regular_all_detailed['WFGM3'] / df_regular_all_detailed['WFGA3']\ndf_regular_all_detailed['WFTPerc'] = df_regular_all_detailed['WFTM'] / df_regular_all_detailed['WFTA']\ndf_regular_all_detailed['WPoss'] = 0.96 * (df_regular_all_detailed['WFGA'] - df_regular_all_detailed['WOR'] + df_regular_all_detailed['WTO'] + (.44 * df_regular_all_detailed['WFTA']))\ndf_regular_all_detailed['WOrtg'] = (df_regular_all_detailed['WScore'] * 100) / df_regular_all_detailed['WPoss']\ndf_regular_all_detailed['WDrtg'] = (df_regular_all_detailed['LScore'] * 100) / df_regular_all_detailed['WPoss']\ndf_regular_all_detailed['WETSPerc'] = (df_regular_all_detailed['WFGM'] + .5 * df_regular_all_detailed['WFGM3']) / df_regular_all_detailed['WFGA']\ndf_regular_all_detailed['WTSPerc'] = df_regular_all_detailed['WScore'] / (2 * (df_regular_all_detailed['WFGA'] + (.44 * df_regular_all_detailed['WFTA'])))\n\n# create stats for losing Teams\ndf_regular_all_detailed['LFGPerc'] = df_regular_all_detailed['LFGM'] / df_regular_all_detailed['LFGA']\ndf_regular_all_detailed['L3Perc'] = df_regular_all_detailed['LFGM3'] / df_regular_all_detailed['LFGA3']\ndf_regular_all_detailed['LFTPerc'] = df_regular_all_detailed['LFTM'] / df_regular_all_detailed['LFTA']\ndf_regular_all_detailed['LPoss'] = 0.96 * (df_regular_all_detailed['LFGA'] - df_regular_all_detailed['LOR'] + df_regular_all_detailed['LTO'] + (.44 * df_regular_all_detailed['LFTA']))\ndf_regular_all_detailed['LOrtg'] = (df_regular_all_detailed['LScore'] * 100) / df_regular_all_detailed['LPoss']\ndf_regular_all_detailed['LDrtg'] = (df_regular_all_detailed['WScore'] * 100) / df_regular_all_detailed['LPoss']\ndf_regular_all_detailed['LETSPerc'] = (df_regular_all_detailed['LFGM'] + .5 * df_regular_all_detailed['LFGM3']) / df_regular_all_detailed['LFGA']\ndf_regular_all_detailed['LTSPerc'] = df_regular_all_detailed['LScore'] / (2 * (df_regular_all_detailed['LFGA'] + (.44 * df_regular_all_detailed['LFTA'])))","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:14.090670Z","iopub.execute_input":"2021-08-27T12:17:14.091103Z","iopub.status.idle":"2021-08-27T12:17:14.169920Z","shell.execute_reply.started":"2021-08-27T12:17:14.091044Z","shell.execute_reply":"2021-08-27T12:17:14.168949Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Lets create some basic season average statistics.\n\n* Wins - Count of wins for a team\n* Losses - Count of losses for a team\n* TotGames - Count of total number of game played for a team\n* WinPerc - Team winning percentage\n* WPointScoredAvg (LPointScoredAvg) (SPointScoredAvg) - Average number of points scored in wins (losses) (all season)\n* WPointAllowedAvg (LPointAllowedAvg) (SPointAllowedAvg) - Average number of points allowed in wins (losses) (all season)\n* WTOs (LTOs) (STOs) - Count of turnovers in wins (losses) (all season)\n* TOsPerGame - Average number of turnovers per game\n* WFGPercAvg (LFGPercAvg) (SFGPercAvg) - Average field goal percentage in wins (losses) (all season)\n* W3PercAvg (L3PercAvg) (S3PercAvg) - Average 3 point field goal percentage in wins (losses) (all season)\n* WFTPercAvg (LFTPercAvg) (SFTPercAvg) - Average free throw percentage in wins (losses) (all season)\n* WPossAvg (LPossAvg) (SPossAvg) - Average number of possessions in wins (losses) (all season)\n* WOrtgAvg (LOrtgAvg) (SOrtgAvg) - Average offensive rating in wins (losses) (all season)\n* WDrtgAvg (LDrtgAvg) (SDrtgAvg) - Average defensive rating in wins (losses) (all season)\n* WETSPercAvg (LETSPercAvg) (SETSPercAvg) - Average effective technical shooting percentage in wins (losses) (all season)\n* WTSPercAvg (LTSPercAvg) (STSPercAvg) - Average true shooting percentage in wins (losses) (all season)\n* TotPointsScored - total points score in a season\n* TotPointsAllowed - total points allowed in a season\n* PointDiffAvg - Average point differential per game\n* Pythag = ((Points Scored) ^ 14) / ((Points Scored) ^ 14) + (Points Allowed) ^ 14)) : Pythagorean Record for a season","metadata":{}},{"cell_type":"code","source":"df_regular_all_avgs = pd.DataFrame()\ndf_regular_season_avgs = pd.DataFrame()\n\n# create season averages for many statistics\ndf_regular_all_avgs['Wins'] = df_regular_all_detailed['WTeamID'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.WTeamID, df_regular_all_detailed.WTeamName]).count()\ndf_regular_all_avgs['Losses'] = df_regular_all_detailed['LTeamID'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.LTeamID]).count()\ndf_regular_all_avgs = df_regular_all_avgs.replace([np.NaN, -np.NaN], 0)\ndf_regular_all_avgs['TotGames'] = df_regular_all_avgs['Wins'] + df_regular_all_avgs['Losses']\ndf_regular_all_avgs['WinPerc'] = df_regular_all_avgs['Wins'] / df_regular_all_avgs['TotGames']\n\ndf_regular_all_avgs['WPointScoredAvg'] = df_regular_all_detailed['WScore'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.WTeamID]).mean()\ndf_regular_all_avgs['LPointScoredAvg'] = df_regular_all_detailed['LScore'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.LTeamID]).mean()\ndf_regular_all_avgs = df_regular_all_avgs.replace([np.NaN, -np.NaN], 0)\ndf_regular_all_avgs['SPointScoredAvg'] = df_regular_all_avgs['WPointScoredAvg'] * df_regular_all_avgs['WinPerc'] + df_regular_all_avgs['LPointScoredAvg'] * (1 - df_regular_all_avgs['WinPerc'])\n\ndf_regular_all_avgs['WPointAllowedAvg'] = df_regular_all_detailed['LScore'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.WTeamID]).mean()\ndf_regular_all_avgs['LPointAllowedAvg'] = df_regular_all_detailed['WScore'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.LTeamID]).mean()\ndf_regular_all_avgs = df_regular_all_avgs.replace([np.NaN, -np.NaN], 0)\ndf_regular_all_avgs['SPointAllowedAvg'] = df_regular_all_avgs['WPointAllowedAvg'] * df_regular_all_avgs['WinPerc'] + df_regular_all_avgs['LPointAllowedAvg'] * (1 - df_regular_all_avgs['WinPerc'])\n\ndf_regular_all_avgs['WTOs'] = df_regular_all_detailed['WTO'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.WTeamID]).sum()\ndf_regular_all_avgs['LTOs'] = df_regular_all_detailed['LTO'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.LTeamID]).sum()\ndf_regular_all_avgs = df_regular_all_avgs.replace([np.NaN, -np.NaN], 0)\ndf_regular_all_avgs['STOs'] = df_regular_all_avgs['WTOs'] + df_regular_all_avgs['LTOs']\n\ndf_regular_all_avgs['TOsPerGame'] = df_regular_all_avgs['STOs'] / df_regular_all_avgs['TotGames']\n\ndf_regular_all_avgs['WFGPercAvg'] = df_regular_all_detailed['WFGPerc'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.WTeamID]).mean()\ndf_regular_all_avgs['LFGPercAvg'] = df_regular_all_detailed['LFGPerc'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.LTeamID]).mean()\ndf_regular_all_avgs = df_regular_all_avgs.replace([np.NaN, -np.NaN], 0)\ndf_regular_all_avgs['SFGPercAvg'] = df_regular_all_avgs['WFGPercAvg'] * df_regular_all_avgs['WinPerc'] + df_regular_all_avgs['LFGPercAvg'] * (1 - df_regular_all_avgs['WinPerc'])\n\ndf_regular_all_avgs['W3PercAvg'] = df_regular_all_detailed['W3Perc'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.WTeamID]).mean()\ndf_regular_all_avgs['L3PercAvg'] = df_regular_all_detailed['L3Perc'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.LTeamID]).mean()\ndf_regular_all_avgs = df_regular_all_avgs.replace([np.NaN, -np.NaN], 0)\ndf_regular_all_avgs['S3PercAvg'] = df_regular_all_avgs['W3PercAvg'] * df_regular_all_avgs['WinPerc'] + df_regular_all_avgs['L3PercAvg'] * (1 - df_regular_all_avgs['WinPerc'])\n\ndf_regular_all_avgs['WFTPercAvg'] = df_regular_all_detailed['WFTPerc'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.WTeamID]).mean()\ndf_regular_all_avgs['LFTPercAvg'] = df_regular_all_detailed['LFTPerc'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.LTeamID]).mean()\ndf_regular_all_avgs = df_regular_all_avgs.replace([np.NaN, -np.NaN], 0)\ndf_regular_all_avgs['SFTPercAvg'] = df_regular_all_avgs['WFTPercAvg'] * df_regular_all_avgs['WinPerc'] + df_regular_all_avgs['LFTPercAvg'] * (1 - df_regular_all_avgs['WinPerc'])\n\ndf_regular_all_avgs['WPossAvg'] = df_regular_all_detailed['WPoss'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.WTeamID]).mean()\ndf_regular_all_avgs['LPossAvg'] = df_regular_all_detailed['LPoss'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.LTeamID]).mean()\ndf_regular_all_avgs = df_regular_all_avgs.replace([np.NaN, -np.NaN], 0)\ndf_regular_all_avgs['SPossAvg'] = df_regular_all_avgs['WPossAvg'] * df_regular_all_avgs['WinPerc'] + df_regular_all_avgs['LPossAvg'] * (1 - df_regular_all_avgs['WinPerc'])\n\ndf_regular_all_avgs['WOrtgAvg'] = df_regular_all_detailed['WOrtg'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.WTeamID]).mean()\ndf_regular_all_avgs['LOrtgAvg'] = df_regular_all_detailed['LOrtg'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.LTeamID]).mean()\ndf_regular_all_avgs = df_regular_all_avgs.replace([np.NaN, -np.NaN], 0)\ndf_regular_all_avgs['SOrtgAvg'] = df_regular_all_avgs['WOrtgAvg'] * df_regular_all_avgs['WinPerc'] + df_regular_all_avgs['LOrtgAvg'] * (1 - df_regular_all_avgs['WinPerc'])\n\ndf_regular_all_avgs['WDrtgAvg'] = df_regular_all_detailed['WDrtg'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.WTeamID]).mean()\ndf_regular_all_avgs['LDrtgAvg'] = df_regular_all_detailed['LDrtg'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.LTeamID]).mean()\ndf_regular_all_avgs = df_regular_all_avgs.replace([np.NaN, -np.NaN], 0)\ndf_regular_all_avgs['SDrtgAvg'] = df_regular_all_avgs['WDrtgAvg'] * df_regular_all_avgs['WinPerc'] + df_regular_all_avgs['LDrtgAvg'] * (1 - df_regular_all_avgs['WinPerc'])\n\ndf_regular_all_avgs['WETSPercAvg'] = df_regular_all_detailed['WETSPerc'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.WTeamID]).mean()\ndf_regular_all_avgs['LETSPercAvg'] = df_regular_all_detailed['LETSPerc'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.LTeamID]).mean()\ndf_regular_all_avgs = df_regular_all_avgs.replace([np.NaN, -np.NaN], 0)\ndf_regular_all_avgs['SETSPercAvg'] = df_regular_all_avgs['WETSPercAvg'] * df_regular_all_avgs['WinPerc'] + df_regular_all_avgs['LETSPercAvg'] * (1 - df_regular_all_avgs['WinPerc'])\n\ndf_regular_all_avgs['WTSPercAvg'] = df_regular_all_detailed['WTSPerc'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.WTeamID]).mean()\ndf_regular_all_avgs['LTSPercAvg'] = df_regular_all_detailed['LTSPerc'].groupby([df_regular_all_detailed.Season, df_regular_all_detailed.LTeamID]).mean()\ndf_regular_all_avgs = df_regular_all_avgs.replace([np.NaN, -np.NaN], 0)\ndf_regular_all_avgs['STSPercAvg'] = df_regular_all_avgs['WTSPercAvg'] * df_regular_all_avgs['WinPerc'] + df_regular_all_avgs['LTSPercAvg'] * (1 - df_regular_all_avgs['WinPerc'])\n\ndf_regular_all_avgs['TotPointsScored'] = df_regular_all_avgs['SPointScoredAvg'] * df_regular_all_avgs['TotGames']\ndf_regular_all_avgs['TotPointsAllowed'] = df_regular_all_avgs['SPointAllowedAvg'] * df_regular_all_avgs['TotGames']\ndf_regular_all_avgs['PointDiffAvg'] = (df_regular_all_avgs['TotPointsScored'] - df_regular_all_avgs['TotPointsAllowed']) / df_regular_all_avgs['TotGames']\n\ndf_regular_all_avgs['Pythag'] = (df_regular_all_avgs['TotPointsScored'] ** 14) / ((df_regular_all_avgs['TotPointsScored'] ** 14) + (df_regular_all_avgs['TotPointsAllowed'] ** 14))\n\ndf_regular_all_avgs.reset_index(inplace = True)\ndf_regular_all_avgs = df_regular_all_avgs.rename(columns={\"WTeamID\": \"TeamID\"})\ndf_regular_all_avgs = df_regular_all_avgs.rename(columns={\"WTeamName\": \"TeamName\"})\n\n# just keep the entire season averages\ndf_regular_season_avgs = df_regular_all_avgs.drop(['WPointScoredAvg', 'LPointScoredAvg', 'WPointAllowedAvg', 'LPointAllowedAvg', 'WTOs', 'LTOs', 'WFGPercAvg', 'LFGPercAvg', 'W3PercAvg', 'L3PercAvg',\n                                                   'WFTPercAvg', 'LFTPercAvg', 'WPossAvg', 'LPossAvg', 'WOrtgAvg', 'LOrtgAvg', 'WDrtgAvg', 'LDrtgAvg', 'WETSPercAvg', 'LETSPercAvg', 'WTSPercAvg', \n                                                   'LTSPercAvg'], axis=1)\n\n# show stats for Arizona!\ndf_regular_season_avgs.loc[df_regular_all_avgs['TeamID'] == 1112]","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:14.172151Z","iopub.execute_input":"2021-08-27T12:17:14.172597Z","iopub.status.idle":"2021-08-27T12:17:14.854364Z","shell.execute_reply.started":"2021-08-27T12:17:14.172554Z","shell.execute_reply":"2021-08-27T12:17:14.853467Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Let's explore some of the created statistics to see if they correlate with winning percentage (what truly matters).","metadata":{}},{"cell_type":"code","source":"# plot winning percentage vs. various other statistics\nfig = plt.figure(figsize=(20, 20))\ngrid = plt.GridSpec(2, 2, wspace=0.25, hspace=0.25)\n\nplt.subplot(grid[0, :1])\nsns.scatterplot(x = df_regular_season_avgs['SOrtgAvg'], y = df_regular_season_avgs['WinPerc'], color='#3c7f99')\nplt.tick_params(axis='both', which='both',length=0)\nplt.tick_params(axis='both', which='major', labelsize=16)\nplt.xlabel('Season Offensive Rating', fontsize = 16)\nplt.ylabel('Win Percentage', fontsize = 16)\n\nplt.subplot(grid[0, 1:])\nsns.scatterplot(x = df_regular_season_avgs['SDrtgAvg'], y = df_regular_season_avgs['WinPerc'], color='#3c7f99')\nplt.tick_params(axis='both', which='both',length=0)\nplt.tick_params(axis='both', which='major', labelsize=16)\nplt.xlabel('Season Defensive Rating', fontsize = 16)\nplt.ylabel('Win Percentage', fontsize = 16)\n\nplt.subplot(grid[1, :1])\nsns.scatterplot(x = df_regular_season_avgs['SETSPercAvg'], y = df_regular_season_avgs['WinPerc'], color='#3c7f99')\nplt.tick_params(axis='both', which='both',length=0)\nplt.tick_params(axis='both', which='major', labelsize=16)\nplt.xlabel('Season SETSPercAvg', fontsize = 16)\nplt.ylabel('Win Percentage', fontsize = 16)\n\nplt.subplot(grid[1, 1:])\nsns.scatterplot(x = df_regular_season_avgs['STSPercAvg'], y = df_regular_season_avgs['WinPerc'], color='#3c7f99')\nplt.tick_params(axis='both', which='both',length=0)\nplt.tick_params(axis='both', which='major', labelsize=16)\nplt.xlabel('Season STSPercAvg', fontsize = 16)\nplt.ylabel('Win Percentage', fontsize = 16)\n\nsns.set(style=\"whitegrid\")","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:14.858682Z","iopub.execute_input":"2021-08-27T12:17:14.859031Z","iopub.status.idle":"2021-08-27T12:17:16.188516Z","shell.execute_reply.started":"2021-08-27T12:17:14.858972Z","shell.execute_reply":"2021-08-27T12:17:16.187485Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Let's create a heatmap to really look at correlation (filtered down to season averages for simplicity).","metadata":{}},{"cell_type":"code","source":"# create correlation heatmap to find important statistics\nfig = plt.figure(figsize=(18, 18))\nmatrix = df_regular_season_avgs[['WinPerc', 'SPointScoredAvg', 'SPointAllowedAvg', 'TOsPerGame', 'SFGPercAvg', \n                                 'S3PercAvg', 'SFTPercAvg', 'SOrtgAvg', 'SDrtgAvg', 'SETSPercAvg', 'STSPercAvg', 'PointDiffAvg', 'Pythag']].corr()\n\nmask = np.zeros_like(matrix, dtype=np.bool)\nmask[np.triu_indices_from(mask)] = True\ncmap = sns.diverging_palette(225, 45, as_cmap=True)\n\nsns.heatmap(matrix, mask=mask, cmap=cmap, center=0, annot=True, square=True, linewidths=0.25, cbar_kws={'shrink': 0.25})\nplt.tick_params(axis='both', which='both',length=0)\nplt.tick_params(axis='both', which='major', labelsize=16);","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:16.189812Z","iopub.execute_input":"2021-08-27T12:17:16.190303Z","iopub.status.idle":"2021-08-27T12:17:17.097703Z","shell.execute_reply.started":"2021-08-27T12:17:16.190258Z","shell.execute_reply":"2021-08-27T12:17:17.096622Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Let's choose some features that appear to define a regular season winner:\n\n1. High WinPerc\n2. High Pythag\n3. High Ortg\n4. Low Drtg\n5. High SFGPercAvg\n6. Hight PointDiff","metadata":{}},{"cell_type":"code","source":"# filter down to just the \"important\" statistics\ndf_regular_season_avgs = df_regular_season_avgs.drop(['Wins', 'Losses', 'TotGames', 'SPointScoredAvg', 'SPointAllowedAvg', 'STOs', 'TOsPerGame', 'S3PercAvg', 'SFTPercAvg', 'SPossAvg', 'SETSPercAvg', 'STSPercAvg', 'TotPointsScored', 'TotPointsAllowed'], axis=1)","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:17.099357Z","iopub.execute_input":"2021-08-27T12:17:17.099967Z","iopub.status.idle":"2021-08-27T12:17:17.107733Z","shell.execute_reply.started":"2021-08-27T12:17:17.099901Z","shell.execute_reply":"2021-08-27T12:17:17.106449Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Choose only seasons from 2006 to model (the start of the one-and-done era).","metadata":{}},{"cell_type":"code","source":"df_tourney_era_avgs = pd.DataFrame()\ndf_regular_era_avgs = pd.DataFrame()\n\n# keep only seasons after 2005\ndf_tourney_era_detailed = df_tourney_all_detailed[df_tourney_all_detailed.Season > 2005]\ndf_regular_era_avgs = df_regular_season_avgs[df_regular_season_avgs.Season > 2005]\n\n# show more Arizona stats!\ndf_regular_era_avgs.loc[df_regular_all_avgs['TeamID'] == 1112]","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:17.109536Z","iopub.execute_input":"2021-08-27T12:17:17.109917Z","iopub.status.idle":"2021-08-27T12:17:17.153947Z","shell.execute_reply.started":"2021-08-27T12:17:17.109871Z","shell.execute_reply":"2021-08-27T12:17:17.152574Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Now that we have useful statistic for each team for each season. Lets add in their tournament seeding from each year.","metadata":{}},{"cell_type":"code","source":"# read in all past tournament seeding\ndf_seeds = pd.read_csv('../input/mens-machine-learning-competition-2019/Stage2DataFiles/NCAATourneySeeds.csv')\ndf_seeds['SeedNum'] = df_seeds['Seed'].apply(lambda x : int(x[1:3]))\ndf_seeds = df_seeds.drop(['Seed'], axis = 1)\n\n# combine with past season averages\ndf_regular_era_avgs_seeds = pd.DataFrame()\ndf_regular_era_avgs_seeds = df_regular_era_avgs.merge(df_seeds, on=['TeamID', 'Season'])\n\n# even more Arizona stats!\ndf_regular_era_avgs_seeds.loc[df_regular_era_avgs_seeds['TeamID'] == 1112]","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:17.155515Z","iopub.execute_input":"2021-08-27T12:17:17.155999Z","iopub.status.idle":"2021-08-27T12:17:17.204606Z","shell.execute_reply.started":"2021-08-27T12:17:17.155954Z","shell.execute_reply":"2021-08-27T12:17:17.203579Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Lets start preparing model using 2006-2018. This will look at how regular season statistics, seeding, and rankings, can predict whether or not you win a game.","metadata":{}},{"cell_type":"code","source":"# attach regular season statistics to previous tournament matchups\ndf_model_wins = pd.DataFrame()\ndf_model_losses = pd.DataFrame()\n\ndf_tourney_all_compact = df_tourney_all_compact.rename(columns={\"WTeamID\": \"TeamID\"})\ndf_model_wins = df_regular_era_avgs_seeds.merge(df_tourney_all_compact, on=['TeamID', 'Season'])\ndf_model_wins.insert(loc=len(df_model_wins.columns), column='Outcome', value=1)\n\ndf_tourney_all_compact = df_tourney_all_compact.rename(columns={\"TeamID\": \"WTeamID\"})\ndf_tourney_all_compact = df_tourney_all_compact.rename(columns={\"LTeamID\": \"TeamID\"})\ndf_model_losses = df_regular_era_avgs_seeds.merge(df_tourney_all_compact, on=['TeamID', 'Season'])\ndf_model_losses.insert(loc=len(df_model_losses.columns), column='Outcome', value=0)\n\n# past Arizona tourney wins! :)\ndf_model_wins.loc[df_model_wins['TeamID'] == 1112]","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:17.206175Z","iopub.execute_input":"2021-08-27T12:17:17.206560Z","iopub.status.idle":"2021-08-27T12:17:17.262203Z","shell.execute_reply.started":"2021-08-27T12:17:17.206502Z","shell.execute_reply":"2021-08-27T12:17:17.260808Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# past Arizona tourney losses :(\ndf_model_losses.loc[df_model_losses['TeamID'] == 1112]","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:17.266271Z","iopub.execute_input":"2021-08-27T12:17:17.266693Z","iopub.status.idle":"2021-08-27T12:17:17.299571Z","shell.execute_reply.started":"2021-08-27T12:17:17.266634Z","shell.execute_reply":"2021-08-27T12:17:17.296822Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"More Cleanup. Remove game scores, days, locations, number of overtimes. Change WTeamID and LTeamID to OpponentTeamID (as appropriate) and merge the wins and losses tables.","metadata":{}},{"cell_type":"code","source":"# remove extra information\ndf_model_wins = df_model_wins.drop(['DayNum', 'WScore', 'LScore', 'WLoc', 'NumOT'], axis = 1)\ndf_model_losses = df_model_losses.drop(['DayNum', 'WScore', 'LScore', 'WLoc', 'NumOT'], axis = 1)\n\ndf_model_wins = df_model_wins.rename(columns={\"LTeamID\": \"OppTeamID\"})\ndf_model_losses = df_model_losses.rename(columns={\"WTeamID\": \"OppTeamID\"})\n\n# combine wins and losses, add in regular season statistics for the other team\ndf_model = pd.DataFrame()\ndf_model = df_model_wins.append(df_model_losses)\n\ndf_model = df_model.rename(columns={\"TeamID\": \"TeamID_x\"})\ndf_model = df_model.rename(columns={\"OppTeamID\": \"TeamID\"})\ndf_model = df_model.merge(df_regular_era_avgs_seeds, on=['TeamID', 'Season'])\ndf_model = df_model.rename(columns={\"TeamID\": \"TeamID_y\"})\n\n# show past Arizona matchups with regular season stats for both teams, and the outcome\ndf_model.loc[df_model['TeamID_x'] == 1112]","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:17.302229Z","iopub.execute_input":"2021-08-27T12:17:17.302655Z","iopub.status.idle":"2021-08-27T12:17:17.384592Z","shell.execute_reply.started":"2021-08-27T12:17:17.302599Z","shell.execute_reply":"2021-08-27T12:17:17.383443Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Add in Colley Rankings.","metadata":{}},{"cell_type":"code","source":"# get the Colley rankings for the Massey ordinals\ndf_massey_ordinals = pd.read_csv('../input/mens-machine-learning-competition-2019/MasseyOrdinals/MasseyOrdinals.csv')\ndf_massey_ordinals = df_massey_ordinals[df_massey_ordinals.SystemName == 'COL']\n\n# just keep the end of season ranking\ndf_massey_ordinals = df_massey_ordinals[df_massey_ordinals.RankingDayNum == df_massey_ordinals.RankingDayNum.max()]\n\n# add rankings to the previous matchups\ndf_model = df_model.rename(columns={\"TeamID_x\": \"TeamID\"})\ndf_model = df_model.merge(df_massey_ordinals, on=['TeamID', 'Season'])\ndf_model = df_model.rename(columns={\"TeamID\": \"TeamID_x\"})\ndf_model = df_model.rename(columns={\"OrdinalRank\": \"ColleyRank_x\"})\n\ndf_model = df_model.rename(columns={\"TeamID_y\": \"TeamID\"})\ndf_model = df_model.merge(df_massey_ordinals, on=['TeamID', 'Season'])\ndf_model = df_model.rename(columns={\"TeamID\": \"TeamID_y\"})\ndf_model = df_model.rename(columns={\"OrdinalRank\": \"ColleyRank_y\"})\n\n# drop team names and other information to get ready for training\ndf_model = df_model.drop(['Season', 'TeamID_x', 'TeamName_x', 'TeamID_y', 'TeamName_y', 'RankingDayNum_x', 'SystemName_x', 'RankingDayNum_y', 'SystemName_y'], axis = 1)\ndf_model.head()","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:17.386062Z","iopub.execute_input":"2021-08-27T12:17:17.386467Z","iopub.status.idle":"2021-08-27T12:17:20.643760Z","shell.execute_reply.started":"2021-08-27T12:17:17.386411Z","shell.execute_reply":"2021-08-27T12:17:20.642498Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"> Colley Only (RF, KNN, LR) - Tuning","metadata":{}},{"cell_type":"code","source":"# only use the ColleyRank feature\ny = df_model.Outcome\nX = df_model[['ColleyRank_x', 'ColleyRank_y']]\n\n# 65/35 split\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.35, random_state=1)\n\n# tune random forest\ntune_rfmodel_colley = RandomForestClassifier(random_state=1)\nparam_grid = { \n    'n_estimators': [50, 75, 100],\n    'max_depth' : [5,6,7]\n}\nCV_rfmodel_colley = GridSearchCV(estimator=tune_rfmodel_colley, param_grid=param_grid, cv= 5)\nCV_rfmodel_colley.fit(X_train, y_train)\nprint('Best rfmodel_colley:', CV_rfmodel_colley.best_params_)\n\n# tune k-nearest neighbors\ntune_knnmodel_colley = KNeighborsClassifier()\nparam_grid = { \n    'n_neighbors': [20, np.floor(np.sqrt(len(df_model))).astype(int), 100, 200]\n}\nCV_knnmodel_colley = GridSearchCV(estimator=tune_knnmodel_colley, param_grid=param_grid, cv= 5)\nCV_knnmodel_colley.fit(X_train, y_train)\nprint('Best knnmodel_colley:', CV_knnmodel_colley.best_params_)\n\n# tune logistic regression\ntune_lrmodel_colley = LogisticRegression()\nscaler = StandardScaler()\nX_train_scaled = scaler.fit_transform(X_train)\nX_test_scaled = scaler.fit_transform(X_test)\nparam_grid = { \n    'penalty': ['l1', 'l2', 'none'],\n    'C' : np.logspace(-2, 2, 10),\n}\nCV_lrmodel_colley = GridSearchCV(estimator=tune_lrmodel_colley, param_grid=param_grid, cv= 5)\nCV_lrmodel_colley.fit(X_train_scaled, y_train)\nprint('Best lrmodel_colley:', CV_lrmodel_colley.best_params_)","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:20.645832Z","iopub.execute_input":"2021-08-27T12:17:20.646365Z","iopub.status.idle":"2021-08-27T12:17:29.489093Z","shell.execute_reply.started":"2021-08-27T12:17:20.646273Z","shell.execute_reply":"2021-08-27T12:17:29.487831Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Colley Only (RF, KNN, LR) - Run","metadata":{}},{"cell_type":"code","source":"# create random forest model\nrfmodel_colley = RandomForestClassifier(max_depth =  6, n_estimators = 50, random_state=1)\nrfmodel_colley.fit(X_train, y_train)\ny_pred = rfmodel_colley.predict(X_test)\nprint('Training Accuracy RF:', accuracy_score(y_train, rfmodel_colley.predict(X_train)))\nprint('Testing Accuracy RF:', accuracy_score(y_test, y_pred))\n\n# create k-nearest neighbors model\nknnmodel_colley = KNeighborsClassifier(n_neighbors = 200)\nknnmodel_colley.fit(X_train, y_train)\ny_pred = knnmodel_colley.predict(X_test)\nprint('Training Accuracy KNN:', accuracy_score(y_train, knnmodel_colley.predict(X_train)))\nprint('Testing Accuracy KNN:', accuracy_score(y_test, y_pred))\n\n# create logistic regression model\nlrmodel_colley = LogisticRegression(C = 0.01, penalty = 'l2')\nscaler = StandardScaler()\nX_train = scaler.fit_transform(X_train)\nX_test = scaler.fit_transform(X_test)\nlrmodel_colley.fit(X_train, y_train)\ny_pred = lrmodel_colley.predict(X_test)\nprint('Training Accuracy LR:', accuracy_score(y_train, lrmodel_colley.predict(X_train)))\nprint('Testing Accuracy LR:', accuracy_score(y_test, y_pred))","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:29.490578Z","iopub.execute_input":"2021-08-27T12:17:29.490926Z","iopub.status.idle":"2021-08-27T12:17:29.785414Z","shell.execute_reply.started":"2021-08-27T12:17:29.490870Z","shell.execute_reply":"2021-08-27T12:17:29.783904Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"All Features (RF, KNN, LR) - Tuning","metadata":{}},{"cell_type":"code","source":"# only all features\ny = df_model.Outcome\nX = df_model.drop(['Outcome'], axis = 1)\n\n# 65/35 split\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.35, random_state=1)\n\n# tune random forest\ntune_rfmodel_all = RandomForestClassifier(random_state=1)\nparam_grid = { \n    'n_estimators': [50, 75, 100],\n    'max_depth' : [5,6,7]\n}\nCV_rfmodel_all = GridSearchCV(estimator=tune_rfmodel_all, param_grid=param_grid, cv= 5)\nCV_rfmodel_all.fit(X_train, y_train)\nprint('Best rfmodel_all:', CV_rfmodel_all.best_params_)\n\n# tune k-nearest neighbors\ntune_knnmodel_all = KNeighborsClassifier()\nparam_grid = { \n    'n_neighbors': [20, np.floor(np.sqrt(len(df_model))).astype(int), 100, 200]\n}\nCV_knnmodel_all = GridSearchCV(estimator=tune_knnmodel_all, param_grid=param_grid, cv= 5)\nCV_knnmodel_all.fit(X_train, y_train)\nprint('Best knnmodel_all:', CV_knnmodel_all.best_params_)\n\n# tune logistic regression\ntune_lrmodel_all = LogisticRegression()\nscaler = StandardScaler()\nX_train_scaled = scaler.fit_transform(X_train)\nX_test_scaled = scaler.fit_transform(X_test)\nparam_grid = { \n    'penalty': ['l1', 'l2', 'none'],\n    'C' : np.logspace(-2, 2, 10)\n}\nCV_lrmodel_all = GridSearchCV(estimator=tune_lrmodel_all, param_grid=param_grid, cv= 5)\nCV_lrmodel_all.fit(X_train_scaled, y_train)\nprint('Best lrmodel_all:', CV_lrmodel_all.best_params_)","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:29.786941Z","iopub.execute_input":"2021-08-27T12:17:29.787419Z","iopub.status.idle":"2021-08-27T12:17:43.110083Z","shell.execute_reply.started":"2021-08-27T12:17:29.787356Z","shell.execute_reply":"2021-08-27T12:17:43.109055Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"All Features (RF, KNN, LR) - Run","metadata":{}},{"cell_type":"code","source":"# create random forest model\nrfmodel_all = RandomForestClassifier(max_depth =  5, n_estimators = 50, random_state=1)\nrfmodel_all.fit(X_train, y_train)\ny_pred = rfmodel_all.predict(X_test)\nprint('Training Accuracy RF:', accuracy_score(y_train, rfmodel_all.predict(X_train)))\nprint('Testing Accuracy RF:', accuracy_score(y_test, y_pred))\n\n# create k-nearest neighbors model\nknnmodel_all = KNeighborsClassifier(n_neighbors = 200)\nknnmodel_all.fit(X_train, y_train)\ny_pred = knnmodel_all.predict(X_test)\nprint('Training Accuracy KNN:', accuracy_score(y_train, knnmodel_all.predict(X_train)))\nprint('Testing Accuracy KNN:', accuracy_score(y_test, y_pred))\n\n# create logistic regression model\nlrmodel_all = LogisticRegression(C = 0.027825594022071243, penalty = 'l2')\nscaler = StandardScaler()\nX_train = scaler.fit_transform(X_train)\nX_test = scaler.fit_transform(X_test)\nlrmodel_all.fit(X_train, y_train)\ny_pred = lrmodel_all.predict(X_test)\nprint('Training Accuracy LR:', accuracy_score(y_train, lrmodel_all.predict(X_train)))\nprint('Testing Accuracy LR:', accuracy_score(y_test, y_pred))","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:43.111694Z","iopub.execute_input":"2021-08-27T12:17:43.112366Z","iopub.status.idle":"2021-08-27T12:17:43.531726Z","shell.execute_reply.started":"2021-08-27T12:17:43.112309Z","shell.execute_reply":"2021-08-27T12:17:43.530749Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Create the features for the 2019 tournament and start predicting.","metadata":{}},{"cell_type":"code","source":"# choose just the 2019 season averages\ndf_2019_avgs_seeds = pd.DataFrame()\ndf_2019_avgs_seeds = df_regular_era_avgs_seeds.loc[df_regular_era_avgs_seeds['Season'] == 2019]\n\n# get all potential matchups for the 2019 tournament using the sample submission file\ndf_predict = pd.read_csv('../input/mens-machine-learning-competition-2019/SampleSubmissionStage2.csv')\n\ndf_predict[['Season', 'TeamID_x', 'TeamID_y']] = df_predict['ID'].str.split('_',expand=True)\ndf_predict = df_predict.drop(['ID','Pred'], axis = 1)\ndf_predict = df_predict.astype('int64')\ndf_predict.head()","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:43.533347Z","iopub.execute_input":"2021-08-27T12:17:43.533990Z","iopub.status.idle":"2021-08-27T12:17:43.588347Z","shell.execute_reply.started":"2021-08-27T12:17:43.533932Z","shell.execute_reply":"2021-08-27T12:17:43.587390Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# start creating the 2019 matchups\ndf_2019_avgs_seeds = df_2019_avgs_seeds.rename(columns={\"TeamID\": \"TeamID_x\"})\ndf_predict = df_predict.merge(df_2019_avgs_seeds, on=['TeamID_x', 'Season'])\ndf_2019_avgs_seeds = df_2019_avgs_seeds.rename(columns={\"TeamID_x\": \"TeamID_y\"})\ndf_predict = df_predict.merge(df_2019_avgs_seeds, on=['TeamID_y', 'Season'])\n\n# add in the season ending Colley rankings\ndf_massey_ordinals = pd.read_csv('../input/march-madness-analytics-2020/MDataFiles_Stage2/MMasseyOrdinals.csv')\ndf_massey_ordinals = df_massey_ordinals[df_massey_ordinals.SystemName == 'COL']\ndf_massey_ordinals = df_massey_ordinals[df_massey_ordinals.RankingDayNum == df_massey_ordinals.RankingDayNum.max()]\n\ndf_predict = df_predict.rename(columns={\"TeamID_x\": \"TeamID\"})\ndf_predict = df_predict.merge(df_massey_ordinals, on=['TeamID', 'Season'])\ndf_predict = df_predict.rename(columns={\"TeamID\": \"TeamID_x\"})\ndf_predict = df_predict.rename(columns={\"OrdinalRank\": \"ColleyRank_x\"})\n\ndf_predict = df_predict.rename(columns={\"TeamID_y\": \"TeamID\"})\ndf_predict = df_predict.merge(df_massey_ordinals, on=['TeamID', 'Season'])\ndf_predict = df_predict.rename(columns={\"TeamID\": \"TeamID_y\"})\ndf_predict = df_predict.rename(columns={\"OrdinalRank\": \"ColleyRank_y\"})\n\n# reorganize for easy viewing\ndf_predict = df_predict.sort_values(by=['TeamID_x', 'TeamID_y'])\ndf_predict = df_predict[['WinPerc_x', 'SFGPercAvg_x', 'SOrtgAvg_x', 'SDrtgAvg_x', 'PointDiffAvg_x', 'Pythag_x', 'SeedNum_x', 'WinPerc_y', 'SFGPercAvg_y', 'SOrtgAvg_y', 'SDrtgAvg_y', 'PointDiffAvg_y', 'Pythag_y', 'SeedNum_y', 'ColleyRank_x', 'ColleyRank_y']]\nX_19 = df_predict\nX_19_colley = X_19[['ColleyRank_x', 'ColleyRank_y']]\nX_19.head()","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:43.589992Z","iopub.execute_input":"2021-08-27T12:17:43.590656Z","iopub.status.idle":"2021-08-27T12:17:47.177679Z","shell.execute_reply.started":"2021-08-27T12:17:43.590588Z","shell.execute_reply":"2021-08-27T12:17:47.176559Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Predict probabilities using models and create submissions for Kaggle.","metadata":{}},{"cell_type":"code","source":"# create Kaggle submissions\nwinning_percentage_1 = rfmodel_colley.predict_proba(X_19_colley)[:,1]\ndf_submission = pd.read_csv('../input/mens-machine-learning-competition-2019/SampleSubmissionStage2.csv')\ndf_submission.Pred = winning_percentage_1\ndf_submission.to_csv('rfmodel_colley.csv', index=False)\n\nwinning_percentage_2 = knnmodel_colley.predict_proba(X_19_colley)[:,1]\ndf_submission = pd.read_csv('../input/mens-machine-learning-competition-2019/SampleSubmissionStage2.csv')\ndf_submission.Pred = winning_percentage_2\ndf_submission.to_csv('knnmodel_colley.csv', index=False)\n\nwinning_percentage_3 = lrmodel_colley.predict_proba(X_19_colley)[:,1]\ndf_submission = pd.read_csv('../input/mens-machine-learning-competition-2019/SampleSubmissionStage2.csv')\ndf_submission.Pred = winning_percentage_3\ndf_submission.to_csv('lrmodel_colley.csv', index=False)\n\nwinning_percentage_4 = rfmodel_all.predict_proba(X_19)[:,1]\ndf_submission = pd.read_csv('../input/mens-machine-learning-competition-2019/SampleSubmissionStage2.csv')\ndf_submission.Pred = winning_percentage_4\ndf_submission.to_csv('rfmodel_all.csv', index=False)\n\nwinning_percentage_5 = knnmodel_all.predict_proba(X_19)[:,1]\ndf_submission = pd.read_csv('../input/mens-machine-learning-competition-2019/SampleSubmissionStage2.csv')\ndf_submission.Pred = winning_percentage_5\ndf_submission.to_csv('knnmodel_all.csv', index=False)\n\nwinning_percentage_6 = lrmodel_all.predict_proba(X_19)[:,1]\ndf_submission = pd.read_csv('../input/mens-machine-learning-competition-2019/SampleSubmissionStage2.csv')\ndf_submission.Pred = winning_percentage_6\ndf_submission.to_csv('lrmodel_all.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:47.179057Z","iopub.execute_input":"2021-08-27T12:17:47.179423Z","iopub.status.idle":"2021-08-27T12:17:47.820545Z","shell.execute_reply.started":"2021-08-27T12:17:47.179369Z","shell.execute_reply":"2021-08-27T12:17:47.819247Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Generate Brackets!","metadata":{}},{"cell_type":"code","source":"!pip install binarytree\n!pip install bracketeer==0.2.0","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:17:47.822224Z","iopub.execute_input":"2021-08-27T12:17:47.822618Z","iopub.status.idle":"2021-08-27T12:18:08.881066Z","shell.execute_reply.started":"2021-08-27T12:17:47.822564Z","shell.execute_reply":"2021-08-27T12:18:08.879395Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# create .png brackets\nfrom bracketeer import build_bracket\n\nb = build_bracket(\n        outputPath='rfmodel_colley.png',\n        submissionPath='rfmodel_colley.csv',\n        teamsPath='../input/mens-machine-learning-competition-2019/Stage2DataFiles/Teams.csv',\n        seedsPath='../input/mens-machine-learning-competition-2019/Stage2DataFiles/NCAATourneySeeds.csv',\n        slotsPath='../input/mens-machine-learning-competition-2019/Stage2DataFiles/NCAATourneySlots.csv',\n        year=2019\n)\n\nb = build_bracket(\n        outputPath='knnmodel_colley.png',\n        submissionPath='knnmodel_colley.csv',\n        teamsPath='../input/mens-machine-learning-competition-2019/Stage2DataFiles/Teams.csv',\n        seedsPath='../input/mens-machine-learning-competition-2019/Stage2DataFiles/NCAATourneySeeds.csv',\n        slotsPath='../input/mens-machine-learning-competition-2019/Stage2DataFiles/NCAATourneySlots.csv',\n        year=2019\n)\n\nb = build_bracket(\n        outputPath='lrmodel_colley.png',\n        submissionPath='lrmodel_colley.csv',\n        teamsPath='../input/mens-machine-learning-competition-2019/Stage2DataFiles/Teams.csv',\n        seedsPath='../input/mens-machine-learning-competition-2019/Stage2DataFiles/NCAATourneySeeds.csv',\n        slotsPath='../input/mens-machine-learning-competition-2019/Stage2DataFiles/NCAATourneySlots.csv',\n        year=2019\n)\n\nb = build_bracket(\n        outputPath='rfmodel_all.png',\n        submissionPath='rfmodel_all.csv',\n        teamsPath='../input/mens-machine-learning-competition-2019/Stage2DataFiles/Teams.csv',\n        seedsPath='../input/mens-machine-learning-competition-2019/Stage2DataFiles/NCAATourneySeeds.csv',\n        slotsPath='../input/mens-machine-learning-competition-2019/Stage2DataFiles/NCAATourneySlots.csv',\n        year=2019\n)\n\nb = build_bracket(\n        outputPath='knnmodel_all.png',\n        submissionPath='knnmodel_all.csv',\n        teamsPath='../input/mens-machine-learning-competition-2019/Stage2DataFiles/Teams.csv',\n        seedsPath='../input/mens-machine-learning-competition-2019/Stage2DataFiles/NCAATourneySeeds.csv',\n        slotsPath='../input/mens-machine-learning-competition-2019/Stage2DataFiles/NCAATourneySlots.csv',\n        year=2019\n)\n\nb = build_bracket(\n        outputPath='lrmodel_all.png',\n        submissionPath='lrmodel_all.csv',\n        teamsPath='../input/mens-machine-learning-competition-2019/Stage2DataFiles/Teams.csv',\n        seedsPath='../input/mens-machine-learning-competition-2019/Stage2DataFiles/NCAATourneySeeds.csv',\n        slotsPath='../input/mens-machine-learning-competition-2019/Stage2DataFiles/NCAATourneySlots.csv',\n        year=2019\n)","metadata":{"execution":{"iopub.status.busy":"2021-08-27T12:18:08.883437Z","iopub.execute_input":"2021-08-27T12:18:08.883956Z","iopub.status.idle":"2021-08-27T12:18:12.885163Z","shell.execute_reply.started":"2021-08-27T12:18:08.883869Z","shell.execute_reply":"2021-08-27T12:18:12.884365Z"},"trusted":true},"execution_count":null,"outputs":[]}]}