{"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":"markdown","source":"![image.png](attachment:fd4b4505-c39c-4767-88d3-aef57e882a60.png)","metadata":{},"attachments":{"fd4b4505-c39c-4767-88d3-aef57e882a60.png":{"image/png":"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"}}},{"cell_type":"markdown","source":"## 🏗<b> Basics of my analysis choice</b><br><br>\n➛ The study of the skeleton of different horses shows that racing animals are <b>not sufficiently prepared</b> for the extreme mechanical stresses during a race.<br><br>\n➛ The resulting injuries, often fatal, <b>could be prevented</b> with <b>proper training</b> that strengthens the bones.<br><br>\n➛ 70% of these injuries occur in the third metacarpal bone between the knee and the horse’s paturon.<br><br>\n➛ In an attempt to find a way to predict and prevent these fractures, <b>researchers at Johns Hopkins Medicine</b> have therefore sought to understand how the third metacarpal bone responds to mechanical stresses, such as those encountered during racing.<br><br>\n➛ The bones are <b>simply not prepared</b> for the forces suffered during races<br><br>\n➛ Researchers therefore suggest <b>pushing the training</b> of racehorses around exercises that would <b>increase bone density</b>, such as <b>taking tighter turns at higher speeds</b>.<br><br>\n➛ At the same time, the effort required of horses is greater in a curve than in a straight line.<br><br>\n➛ The horse must make a more intense effort to stay inside the bend and restore its balance. <br><br>\n➛ Muscles on the inner side of the horse are greatly stressed so that the horse does not collapse","metadata":{"execution":{"iopub.status.busy":"2022-11-08T13:41:19.241941Z","iopub.execute_input":"2022-11-08T13:41:19.242362Z","iopub.status.idle":"2022-11-08T13:41:19.281505Z","shell.execute_reply.started":"2022-11-08T13:41:19.242277Z","shell.execute_reply":"2022-11-08T13:41:19.279734Z"}}},{"cell_type":"markdown","source":"##  🎯<b>Main goal of the project</b><br><br>\n\n➛ In order to prevent injuries, the idea is to analyze the average speed in a corner during the race. <br><br>\n\n$\\;\\;\\;\\;\\;\\;$➜<b>Which races will be analyzed?</b><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ The Maiden Claiming Races during winter on Belmont hippodrom<br><br>\n$\\;\\;\\;\\;\\;\\;$➜<b>Why the Maiden Claming Races ?</b><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢In this such of race, horses beginning their careers have failed to show their connections enough talent during training.<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ In order to maximize their chance of victory, it is important to know the race conditions.<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ These race conditions, especially the average speed in the curve, allows the trainer to:<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$✣ train horse to minimize the risk of injury<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$✣ if the horse is able to follow this rhythm.<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$✣ maximize chances of victories by selecting the most suitable race profile of the horse<br><br>\n\n$\\;\\;\\;\\;\\;\\;$➜<b>Why during the winter ?</b><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ With the cold, his muscles take longer to warm up.<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ To avoid an injury, the warm-up time is essential and also depends on the intensity of the race.\n\n\n","metadata":{}},{"cell_type":"markdown","source":"##  🛠 <b><ins>Technical stuffs</b></ins>","metadata":{}},{"cell_type":"markdown","source":"### 🚧 **Loading packages**","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n\nimport haversine as hs\n\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\nimport scipy as sp\nfrom scipy import stats\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.model_selection import GridSearchCV\nfrom sklearn.compose import TransformedTargetRegressor\n\nfrom sklearn.compose import make_column_selector\nfrom sklearn.compose import make_column_transformer\n\nfrom sklearn.pipeline import make_pipeline,Pipeline\n\nfrom sklearn.preprocessing import PowerTransformer\nfrom sklearn.preprocessing import OneHotEncoder\n\nimport category_encoders as ce\n\nimport xgboost as xgb\nfrom sklearn.linear_model import LinearRegression,Lasso,Ridge\n\nfrom sklearn.metrics import mean_squared_error, r2_score\nimport plotly.express as px\n\n# Fix error display map\nimport plotly.graph_objects as go\nfrom plotly.offline import init_notebook_mode, iplot\ninit_notebook_mode(connected=True)\n\nimport missingno as msno","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:08:53.099649Z","iopub.execute_input":"2022-11-10T23:08:53.100936Z","iopub.status.idle":"2022-11-10T23:08:55.951215Z","shell.execute_reply.started":"2022-11-10T23:08:53.100775Z","shell.execute_reply":"2022-11-10T23:08:55.949957Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"🏥<b> Helper functions</b>","metadata":{}},{"cell_type":"code","source":"#Checking percentage of missing value\n\ndef percent_missing_value(df):\n    feature_50=[]\n    print('Variables and percentage of missing values')\n    print('▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️ ')\n    for i in df.columns:\n        number=df[i].isna().sum()\n        percentage=number/len(df)*100\n       \n        if percentage>0:\n            print(i,' :',number, ' soit ',\"%.2f\"%percentage+'% de valeurs manquantes')\n        if percentage>50:\n            feature_50.append(i)\n    print('▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️ ')\n    print('List of variables with more than 50 missing values ',feature_50)\n    print('▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️ ')\n    print('Number of missing values ',\"{:,}\".format(df.isna().sum().sum()),' on ',\"{:,}\".format(df.shape[0]*\n                                                                                               df.shape[1]))\n    print('▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️ ')\n    print('Percentage of missing values ',str(\"%.2f\"%(df.isna().sum().sum()/(df.shape[0]*df.shape[1])*100)),' %')\n    print('▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️ ')\n    print(\"Heatmap for viewing missing values\",'\\n','➙ Number of rows : ',\"{:,}\".format(df.shape[0]),'\\n','➙ Number of columns : ',\n          \"{:,}\".format(df.shape[1]))\n    msno.matrix(df,filter='bottom',figsize=(25, 10),sparkline=False,color=(171/255, 235/255, 198/255 ));\n    return feature_50","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:08:55.953642Z","iopub.execute_input":"2022-11-10T23:08:55.954665Z","iopub.status.idle":"2022-11-10T23:08:55.968702Z","shell.execute_reply.started":"2022-11-10T23:08:55.954615Z","shell.execute_reply":"2022-11-10T23:08:55.967152Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def single_value_search(df):\n    list_column_single=[]\n    for col_ in df.columns:\n        if len((np.unique(df[col_])).astype(str))==1:\n            list_column_single.append(col_)\n        \n    if len(list_column_single)>0:\n    \n        print('Columns contain a single value')\n        print(list_column_single)\n    else:\n        print(\"None of the columns contains a single value.\")","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:08:55.970646Z","iopub.execute_input":"2022-11-10T23:08:55.971138Z","iopub.status.idle":"2022-11-10T23:08:55.996240Z","shell.execute_reply.started":"2022-11-10T23:08:55.971093Z","shell.execute_reply":"2022-11-10T23:08:55.995224Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"💾  <b>Loading data and overview</b>","metadata":{"execution":{"iopub.status.busy":"2022-11-08T13:41:54.905658Z","iopub.execute_input":"2022-11-08T13:41:54.905995Z","iopub.status.idle":"2022-11-08T13:41:54.912842Z","shell.execute_reply.started":"2022-11-08T13:41:54.905966Z","shell.execute_reply":"2022-11-08T13:41:54.911056Z"}}},{"cell_type":"code","source":"# Creating variable names\n\ncolumns_=['track_id','race_date','race_number','program_number','trakus_index',\n 'latitude','longitude','distance_id','course_type','track_condition',\n 'run_up_distance','race_type','purse','post_time','weight_carried',\n 'jockey','odds','final_place']\n\n# Loading data\n\nturf=pd.read_csv('/kaggle/input/big-data-derby-2022/nyra_2019_complete.csv', low_memory=False,index_col=False,\n                 names=columns_, header=None)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:08:55.999799Z","iopub.execute_input":"2022-11-10T23:08:56.000306Z","iopub.status.idle":"2022-11-10T23:09:16.364715Z","shell.execute_reply.started":"2022-11-10T23:08:56.000243Z","shell.execute_reply":"2022-11-10T23:09:16.363855Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"turf.head(2)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:09:16.366142Z","iopub.execute_input":"2022-11-10T23:09:16.367128Z","iopub.status.idle":"2022-11-10T23:09:16.398153Z","shell.execute_reply.started":"2022-11-10T23:09:16.367091Z","shell.execute_reply":"2022-11-10T23:09:16.396983Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"race=pd.read_csv('/kaggle/input/big-data-derby-2022/nyra_race_table.csv')\nrace.head(2)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:09:16.399777Z","iopub.execute_input":"2022-11-10T23:09:16.400139Z","iopub.status.idle":"2022-11-10T23:09:16.424876Z","shell.execute_reply.started":"2022-11-10T23:09:16.400107Z","shell.execute_reply":"2022-11-10T23:09:16.423679Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Add Seasons\n\nrace['season']=pd.cut(pd.to_datetime(race['race_date']).dt.month,\n                      bins=[0,2,5,8,11,12],\n                      labels=['winter','spring','summer','autumn','winter'],\n                    ordered=False)\n\nturf['season']=pd.cut(pd.to_datetime(turf['race_date']).dt.month,\n                      bins=[0,2,5,8,11,12],\n                      labels=['winter','spring','summer','autumn','winter'],\n                    ordered=False)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:09:16.426457Z","iopub.execute_input":"2022-11-10T23:09:16.426800Z","iopub.status.idle":"2022-11-10T23:09:17.675324Z","shell.execute_reply.started":"2022-11-10T23:09:16.426767Z","shell.execute_reply":"2022-11-10T23:09:17.674251Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Add race categorical : Course or Sprint\n\nrace['sprint_course']=pd.cut(race['distance_id'],\n                      bins=[0,800,2000],\n                      labels=['sprint','course'])\n\nturf['sprint_course']=pd.cut(turf['distance_id'],\n                      bins=[0,800,2000],\n                      labels=['sprint','course'])","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:09:17.677141Z","iopub.execute_input":"2022-11-10T23:09:17.677598Z","iopub.status.idle":"2022-11-10T23:09:17.784189Z","shell.execute_reply.started":"2022-11-10T23:09:17.677532Z","shell.execute_reply":"2022-11-10T23:09:17.783082Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Add unique identifiant for each track\n\nrace['id_race']=race['track_id']+race['race_date']+race['race_number'].astype(str)\n\nturf['id_race']=turf['track_id']+turf['race_date']+turf['race_number'].astype(str)\n\n# Add unique identifiant for each track and horse\n\nturf['id_horse']=turf['id_race']+turf['program_number'].astype(str)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:09:17.786186Z","iopub.execute_input":"2022-11-10T23:09:17.786680Z","iopub.status.idle":"2022-11-10T23:09:23.104234Z","shell.execute_reply.started":"2022-11-10T23:09:17.786629Z","shell.execute_reply":"2022-11-10T23:09:23.103078Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Selection of the races to analyse\n\ndf=turf[(turf['race_type']=='MCL')&(turf['sprint_course']=='sprint')&(turf['track_id']=='AQU')&(turf['season']=='winter')]","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:09:23.109646Z","iopub.execute_input":"2022-11-10T23:09:23.110060Z","iopub.status.idle":"2022-11-10T23:09:25.585007Z","shell.execute_reply.started":"2022-11-10T23:09:23.110016Z","shell.execute_reply":"2022-11-10T23:09:25.584088Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"🧮 <b><ins>Frequency distribution between races, distances and track conditions</b></ins>","metadata":{}},{"cell_type":"code","source":"selected_races=race[(race['race_type']=='MCL')&(race['sprint_course']=='sprint')&(race['track_id']=='AQU')&(race['season']=='winter')]\npd.crosstab(index=selected_races['track_condition'],columns=selected_races['distance_id'],margins=True)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-11-10T23:09:25.586188Z","iopub.execute_input":"2022-11-10T23:09:25.586507Z","iopub.status.idle":"2022-11-10T23:09:25.647466Z","shell.execute_reply.started":"2022-11-10T23:09:25.586479Z","shell.execute_reply":"2022-11-10T23:09:25.646363Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Drop variables do not use\n\ndf=df[['id_race','id_horse','program_number','trakus_index','latitude','longitude','distance_id','run_up_distance','course_type',\n    'track_condition']]","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:09:25.648594Z","iopub.execute_input":"2022-11-10T23:09:25.648972Z","iopub.status.idle":"2022-11-10T23:09:25.677519Z","shell.execute_reply.started":"2022-11-10T23:09:25.648940Z","shell.execute_reply":"2022-11-10T23:09:25.676432Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Checking missing values\n\npercent_missing_value(df)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:09:25.679192Z","iopub.execute_input":"2022-11-10T23:09:25.679630Z","iopub.status.idle":"2022-11-10T23:09:27.092264Z","shell.execute_reply.started":"2022-11-10T23:09:25.679593Z","shell.execute_reply":"2022-11-10T23:09:27.090993Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Single value search\n\nsingle_value_search(df)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:09:27.093763Z","iopub.execute_input":"2022-11-10T23:09:27.094263Z","iopub.status.idle":"2022-11-10T23:09:28.168913Z","shell.execute_reply.started":"2022-11-10T23:09:27.094216Z","shell.execute_reply":"2022-11-10T23:09:28.167745Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Drop column with single value\n\ndf=df.drop(['course_type'],axis=1)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:09:28.170317Z","iopub.execute_input":"2022-11-10T23:09:28.170673Z","iopub.status.idle":"2022-11-10T23:09:28.193894Z","shell.execute_reply.started":"2022-11-10T23:09:28.170640Z","shell.execute_reply":"2022-11-10T23:09:28.192873Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.head(2)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:09:28.195325Z","iopub.execute_input":"2022-11-10T23:09:28.195690Z","iopub.status.idle":"2022-11-10T23:09:28.210675Z","shell.execute_reply.started":"2022-11-10T23:09:28.195657Z","shell.execute_reply":"2022-11-10T23:09:28.209495Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Sort dataframe by id_horse and trakus index in order to calculate the distance runned\n\ndf=df.sort_values(['id_horse','trakus_index']).reset_index().drop(['index'],axis=1)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:09:28.212595Z","iopub.execute_input":"2022-11-10T23:09:28.213439Z","iopub.status.idle":"2022-11-10T23:09:28.337768Z","shell.execute_reply.started":"2022-11-10T23:09:28.213385Z","shell.execute_reply":"2022-11-10T23:09:28.336470Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df['part']=0\nfor i in df.index:\n    if (df['latitude'].iloc[i]>40.66684)&(df['latitude'].iloc[i]<40.67395)&\\\n    (df['longitude'].iloc[i]>-73.83038)&(df['longitude'].iloc[i]<-73.82714):\n        df['part'].iloc[i]='line_1'\n    elif (df['latitude'].iloc[i]<40.67465)&(df['latitude'].iloc[i]>40.670)&\\\n    (df['longitude'].iloc[i]>-73.83222)&(df['longitude'].iloc[i]<-73.83047):\n        df['part'].iloc[i]='line_2'\n    else:\n        df['part'].iloc[i]='curve'","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:09:28.339086Z","iopub.execute_input":"2022-11-10T23:09:28.339442Z","iopub.status.idle":"2022-11-10T23:13:06.609630Z","shell.execute_reply.started":"2022-11-10T23:09:28.339411Z","shell.execute_reply":"2022-11-10T23:13:06.608631Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Distance covered between each trakus\n\ndf['latitude_prev']=df['latitude'].shift(1)\ndf['longitude_prev']=df['longitude'].shift(1)\n\ndf['dist_cov']=0\n\nfor i in df.index:\n    if df['trakus_index'].iloc[i]==1:\n        df['dist_cov'].iloc[i]=0\n    else:\n        a=(df['longitude'].iloc[i],df['latitude'].iloc[i])\n        b=(df['longitude_prev'].iloc[i],df['latitude_prev'].iloc[i])\n        \n        df['dist_cov'].iloc[i]=hs.haversine(a,b,hs.Unit.MILES)\n    ","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:06.611050Z","iopub.execute_input":"2022-11-10T23:13:06.611392Z","iopub.status.idle":"2022-11-10T23:13:42.605508Z","shell.execute_reply.started":"2022-11-10T23:13:06.611362Z","shell.execute_reply":"2022-11-10T23:13:42.604133Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Vitesse\ndf['times']=0.25\ndf['speed']=df['dist_cov']/0.25*3600","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:42.607936Z","iopub.execute_input":"2022-11-10T23:13:42.609128Z","iopub.status.idle":"2022-11-10T23:13:42.617491Z","shell.execute_reply.started":"2022-11-10T23:13:42.609072Z","shell.execute_reply":"2022-11-10T23:13:42.616206Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Speed check\n\nsns.boxplot(data=df['speed'])\nplt.title('Speed check');","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:42.619632Z","iopub.execute_input":"2022-11-10T23:13:42.620188Z","iopub.status.idle":"2022-11-10T23:13:42.969013Z","shell.execute_reply.started":"2022-11-10T23:13:42.620133Z","shell.execute_reply":"2022-11-10T23:13:42.967672Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"👩🏼‍⚕️ <b>Observation</b>:\n\n$\\;\\;\\;\\;\\;\\;$➜ No value seems to be absurd","metadata":{}},{"cell_type":"code","source":"# Average speed per race and race segment\ndf_final=df.groupby(['id_race','part','distance_id','run_up_distance','track_condition']).mean(['speed','latitude','longitude'])\\\n .drop(['trakus_index','latitude','longitude','latitude_prev','longitude_prev','dist_cov','times'],axis=1).reset_index()\n                                                            \ndf_final.head()","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:42.970719Z","iopub.execute_input":"2022-11-10T23:13:42.971480Z","iopub.status.idle":"2022-11-10T23:13:43.138600Z","shell.execute_reply.started":"2022-11-10T23:13:42.971434Z","shell.execute_reply":"2022-11-10T23:13:43.137800Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"👩🏼‍🎨<b><ins>Example of a course trace<b><ins>","metadata":{}},{"cell_type":"code","source":"# Map of speed\n\ninit_notebook_mode(connected=True)\n\nfig = px.scatter_mapbox(df[df['id_horse']=='AQU2019-01-0632  '], lat=\"latitude\", \n                        lon=\"longitude\", \n                        color='speed',\n                        color_discrete_sequence=[\"blue\"], \n                        zoom=14, height=550, width=900, \n                        size_max=10,\n                       title='Example of 6.50 furlongs horse race and speed')\nfig.update_layout(mapbox_style=\"carto-positron\",title_x=0.5,\n    title_y=0.95,)\n\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:43.139822Z","iopub.execute_input":"2022-11-10T23:13:43.140320Z","iopub.status.idle":"2022-11-10T23:13:44.375114Z","shell.execute_reply.started":"2022-11-10T23:13:43.140289Z","shell.execute_reply":"2022-11-10T23:13:44.373976Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":" 👩🏼‍⚕️ <b>Observation</b>:\n\n$\\;\\;\\;\\;\\;\\;$➜ The speed in the curve is more important than in straight lines","metadata":{}},{"cell_type":"markdown","source":"## ⚗️ <ins>Let's go to the analysis</ins>","metadata":{}},{"cell_type":"code","source":"df_final=df_final[df_final['part']=='curve'].merge(df_final[df_final['part']=='line_1'][['id_race','speed']],\\\n                                                  on='id_race',how='left')\\\n                                           .rename(columns={'speed_x':'speed_curve','speed_y':'speed_line 1'})\ndf_final.head(2)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:44.376624Z","iopub.execute_input":"2022-11-10T23:13:44.377084Z","iopub.status.idle":"2022-11-10T23:13:44.401596Z","shell.execute_reply.started":"2022-11-10T23:13:44.377050Z","shell.execute_reply":"2022-11-10T23:13:44.400273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Convert run-up-distance and distance as ordinal variables.\ndf_final['run_up_distance']=df_final['run_up_distance'].astype(str)\ndf_final['distance_id']=df_final['distance_id'].astype(str)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:44.403414Z","iopub.execute_input":"2022-11-10T23:13:44.404240Z","iopub.status.idle":"2022-11-10T23:13:44.412730Z","shell.execute_reply.started":"2022-11-10T23:13:44.404194Z","shell.execute_reply":"2022-11-10T23:13:44.411729Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":" 👩🏼‍⚕️ <b>Interrogation</b>:\n\n$\\;\\;\\;\\;\\;\\;$➜ Is the speed influenced by:<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ Distance <br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ Track condition<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ Run-up-distance<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ Average mean during the first sprint line<br><br>\n\n🔎 <b>How could this be proven?</b>\n\n$\\;\\;\\;\\;\\;\\;$➜ The solution is to use a correlation test.<br><br>\n$\\;\\;\\;\\;\\;\\;$➜ The correlation test depends on the type of variable to be tested:","metadata":{}},{"cell_type":"markdown","source":"🏇 <b>Does the distance of the course influence the speed in the curve?<b>\n    \n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Speed is a numerical variable.<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Distance is a ordinal variable with 5 groups\n    \n    \n\n 👉🏼To answer this question, we will the Kruskall-Wallis test.\n\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Null hypothesis: The speed is not depending on the distance.\n\n $\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ If the p-value is less than 0.05, we can reject the null hypothesis.\n    \n","metadata":{"execution":{"iopub.status.busy":"2022-11-10T09:55:17.424395Z","iopub.execute_input":"2022-11-10T09:55:17.424833Z","iopub.status.idle":"2022-11-10T09:55:18.166168Z","shell.execute_reply.started":"2022-11-10T09:55:17.424802Z","shell.execute_reply":"2022-11-10T09:55:18.164841Z"}}},{"cell_type":"markdown","source":"## 🏇🏼 <ins><b>Does the distance of the course influence the speed in the curve?</ins></b>","metadata":{}},{"cell_type":"code","source":"sns.boxplot(data=df_final.sort_values('distance_id'),x='distance_id',y='speed_curve')\nplt.title('Different speed depending on distance');","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:44.413976Z","iopub.execute_input":"2022-11-10T23:13:44.414284Z","iopub.status.idle":"2022-11-10T23:13:44.677237Z","shell.execute_reply.started":"2022-11-10T23:13:44.414257Z","shell.execute_reply":"2022-11-10T23:13:44.676417Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"👩🏼‍🏫<b><ins>Report:</b></ins><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ It seems that depending on the distance of the race the speed would be different","metadata":{}},{"cell_type":"markdown","source":"🏇 <b>Does the condition distance influence the speed in the curve?<b>\n    \n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Speed is a numerical variable.<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Distance are  ordinal variables with 5 groups<br><br>\n    \n 👉🏼To answer this question, we will the Kruskall-Wallis test.<br><br>\n​\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Null hypothesis: The speed is not depending on the track condition.<br><br>\n​\n $\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ If the p-value is less than 0.05, we can reject the null hypothesis.<br><br>","metadata":{}},{"cell_type":"code","source":"# Create the different group\n\ngroup_550=df_final[df_final['distance_id']=='550']\ngroup_600=df_final[df_final['distance_id']=='600']\ngroup_650=df_final[df_final['distance_id']=='650']\ngroup_700=df_final[df_final['distance_id']=='700']\ngroup_800=df_final[df_final['distance_id']=='800']","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:44.678698Z","iopub.execute_input":"2022-11-10T23:13:44.679178Z","iopub.status.idle":"2022-11-10T23:13:44.687830Z","shell.execute_reply.started":"2022-11-10T23:13:44.679143Z","shell.execute_reply":"2022-11-10T23:13:44.686829Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Test kruskall\nstats.kruskal(group_550['speed_curve'],\n              group_600['speed_curve'],\n             group_650['speed_curve'],\n             group_700['speed_curve'],\n             group_800['speed_curve'])","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:44.694099Z","iopub.execute_input":"2022-11-10T23:13:44.694777Z","iopub.status.idle":"2022-11-10T23:13:44.705336Z","shell.execute_reply.started":"2022-11-10T23:13:44.694743Z","shell.execute_reply":"2022-11-10T23:13:44.704238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"💂🏼‍♀️ <b>To the question <em>\"Does the distance of the course influence the speed in the curve?\"\n\"</em></b><br><br>$\\;\\;\\;\\;\\;\\;\\;\\;\\;$⇢ We can answer that the p-value is <b>smaller than 0.05%</b>.<br><br>$\\;\\;\\;\\;\\;\\;\\;\\;\\;$⇢ So, We can <b>reject</b> the null hypothesis.<br><br>$\\;\\;\\;\\;\\;\\;\\;\\;\\;$⇢ We conclude that there is a <b>statistically significant association</b> between the speed in the curve and the distance.","metadata":{}},{"cell_type":"markdown","source":"## 🏇🏼 <ins><b>Does the track condition influence the speed in the curve?</ins></b>","metadata":{}},{"cell_type":"code","source":"sns.boxplot(data=df_final.sort_values('track_condition'),x='track_condition',y='speed_curve')\nplt.title('Different speed depending on track condition');","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:44.706860Z","iopub.execute_input":"2022-11-10T23:13:44.707230Z","iopub.status.idle":"2022-11-10T23:13:44.956953Z","shell.execute_reply.started":"2022-11-10T23:13:44.707177Z","shell.execute_reply":"2022-11-10T23:13:44.955984Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"👩🏼‍🏫<b><ins>Report:</b></ins><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ It seems that depending on the track condition the speed would be different","metadata":{}},{"cell_type":"markdown","source":"🏇 <b>Does the condition track influence the speed in the curve?<b>\n    \n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Speed is a numerical variable.<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Track conditions are  ordinal variables with 4 groups\n    \n    \n 👉🏼To answer this question, we will the Kruskall-Wallis test.\n\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Null hypothesis: The speed is not depending on the track condition.\n\n $\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ If the p-value is less than 0.05, we can reject the null hypothesis.\n    \n","metadata":{}},{"cell_type":"code","source":"# Build the different group\n\ngroup_ft=df_final[df_final['track_condition']=='FT ']\ngroup_gd=df_final[df_final['track_condition']=='GD ']\ngroup_my=df_final[df_final['track_condition']=='MY ']\ngroup_sy=df_final[df_final['track_condition']=='SY ']\n","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:44.958799Z","iopub.execute_input":"2022-11-10T23:13:44.959518Z","iopub.status.idle":"2022-11-10T23:13:44.968672Z","shell.execute_reply.started":"2022-11-10T23:13:44.959474Z","shell.execute_reply":"2022-11-10T23:13:44.967553Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Test kruskall\nstats.kruskal(group_ft['speed_curve'],\n              group_gd['speed_curve'],\n             group_my['speed_curve'],\n             group_sy['speed_curve'])","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:44.969645Z","iopub.execute_input":"2022-11-10T23:13:44.969986Z","iopub.status.idle":"2022-11-10T23:13:44.984496Z","shell.execute_reply.started":"2022-11-10T23:13:44.969955Z","shell.execute_reply":"2022-11-10T23:13:44.983396Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"💂🏼‍♀️ <b>To the question <em>\"Does the condition track influence the speed in the curve?\"\n\"</em></b><br><br>$\\;\\;\\;\\;\\;\\;\\;\\;\\;$⇢ We can answer that the p-value is <b>slightly higher than 0.05%</b>.<br><br>$\\;\\;\\;\\;\\;\\;\\;\\;\\;$⇢ So, We should <b>reject</b> the null hypothesis.<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;$⇢ But given the p-value, we can be 94% sure that track conditions influence speed.","metadata":{}},{"cell_type":"markdown","source":"## 🏇🏼 <ins><b>Does the run-up-distance influence the speed in the curve?</ins></b>","metadata":{}},{"cell_type":"code","source":"sns.boxplot(data=df_final.sort_values('run_up_distance'),x='run_up_distance',y='speed_curve')\nplt.title('Different speed depending on track condition');","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:44.986115Z","iopub.execute_input":"2022-11-10T23:13:44.986640Z","iopub.status.idle":"2022-11-10T23:13:45.399174Z","shell.execute_reply.started":"2022-11-10T23:13:44.986606Z","shell.execute_reply":"2022-11-10T23:13:45.398335Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"👩🏼‍🏫<b><ins>Report:</b></ins><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ It seems that depending on the run-up-distance the speed would be different","metadata":{}},{"cell_type":"markdown","source":"🏇 <b>Does the condition track influence the speed in the curve?<b>\n    \n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Speed is a numerical variable.<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Run-up-distance are  ordinal variables with 4 groups\n    \n    \n 👉🏼To answer this question, we will the Kruskall-Wallis test.\n\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Null hypothesis: The speed is not depending on run-up-distance.\n\n $\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ If the p-value is less than 0.05, we can reject the null hypothesis.\n    \n","metadata":{"execution":{"iopub.status.busy":"2022-11-10T19:10:04.402054Z","iopub.execute_input":"2022-11-10T19:10:04.402460Z","iopub.status.idle":"2022-11-10T19:10:04.413181Z","shell.execute_reply.started":"2022-11-10T19:10:04.402429Z","shell.execute_reply":"2022-11-10T19:10:04.411377Z"}}},{"cell_type":"code","source":"# Create group\n\ngroup_30=df_final[df_final['run_up_distance']=='30']\ngroup_32=df_final[df_final['run_up_distance']=='32']\ngroup_33=df_final[df_final['run_up_distance']=='33']\ngroup_36=df_final[df_final['run_up_distance']=='36']\ngroup_40=df_final[df_final['run_up_distance']=='40']\ngroup_44=df_final[df_final['run_up_distance']=='44']\ngroup_45=df_final[df_final['run_up_distance']=='45']\ngroup_48=df_final[df_final['run_up_distance']=='48']\ngroup_50=df_final[df_final['run_up_distance']=='50']\ngroup_52=df_final[df_final['run_up_distance']=='52']\ngroup_54=df_final[df_final['run_up_distance']=='54']\ngroup_55=df_final[df_final['run_up_distance']=='55']\ngroup_60=df_final[df_final['run_up_distance']=='60']\ngroup_63=df_final[df_final['run_up_distance']=='63']","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:45.400187Z","iopub.execute_input":"2022-11-10T23:13:45.401029Z","iopub.status.idle":"2022-11-10T23:13:45.415264Z","shell.execute_reply.started":"2022-11-10T23:13:45.400995Z","shell.execute_reply":"2022-11-10T23:13:45.413943Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Test kruskall\nstats.kruskal(group_30['speed_curve'],group_32['speed_curve'],group_33['speed_curve'],group_36['speed_curve'],\n              group_40['speed_curve'],group_44['speed_curve'],group_45['speed_curve'],group_48['speed_curve'],\n              group_50['speed_curve'],group_52['speed_curve'],group_54['speed_curve'],group_55['speed_curve'],\n              group_60['speed_curve'],group_63['speed_curve'])","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:45.416735Z","iopub.execute_input":"2022-11-10T23:13:45.417110Z","iopub.status.idle":"2022-11-10T23:13:45.431835Z","shell.execute_reply.started":"2022-11-10T23:13:45.417076Z","shell.execute_reply":"2022-11-10T23:13:45.430798Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"💂🏼‍♀️ <b>To the question <em>\"Does the run-up distance influence the speed in the curve?\"\n\"</em></b><br><br>$\\;\\;\\;\\;\\;\\;\\;\\;\\;$⇢ We can answer that the p-value is <b>smaller than 0.05%</b>.<br><br>$\\;\\;\\;\\;\\;\\;\\;\\;\\;$⇢ So, We can <b>reject</b> the null hypothesis.<br><br>$\\;\\;\\;\\;\\;\\;\\;\\;\\;$⇢ We conclude that there is a <b>statistically significant association</b> between the speed in the curve and the run-up-distance.","metadata":{}},{"cell_type":"markdown","source":"## 🏇🏼 <ins><b>Does the speed in first line influence the speed in the curve?</ins></b>","metadata":{}},{"cell_type":"code","source":"sns.scatterplot(data=df_final,x='speed_line 1',y='speed_curve')","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:45.433533Z","iopub.execute_input":"2022-11-10T23:13:45.433999Z","iopub.status.idle":"2022-11-10T23:13:45.680220Z","shell.execute_reply.started":"2022-11-10T23:13:45.433955Z","shell.execute_reply":"2022-11-10T23:13:45.679436Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"👩🏼‍🏫<b><ins>Report:</b></ins><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ It seems that the speed in first line is not really correlated to the speed in the curve","metadata":{"execution":{"iopub.status.busy":"2022-11-10T19:26:17.176212Z","iopub.status.idle":"2022-11-10T19:26:17.176620Z","shell.execute_reply.started":"2022-11-10T19:26:17.176426Z","shell.execute_reply":"2022-11-10T19:26:17.176445Z"}}},{"cell_type":"markdown","source":"🏇 <b>Does the speed in first line vary depending on the speed in the curve?<b>\n    \n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Speed in the curve and in first line are  numerical variable.<br><br>\n\n    \n 👉🏼To answer this question, we will the Kendall Tau test.\n\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Null hypothesis: The speed is not depending on run-up-distance.\n\n $\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ If the p-value is less than 0.05, we can reject the null hypothesis.\n    \n","metadata":{}},{"cell_type":"code","source":"# Kendall Tau Test\n\nstats.kendalltau(df_final['speed_line 1'],df_final['speed_curve'])","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:45.681227Z","iopub.execute_input":"2022-11-10T23:13:45.682044Z","iopub.status.idle":"2022-11-10T23:13:45.691066Z","shell.execute_reply.started":"2022-11-10T23:13:45.682011Z","shell.execute_reply":"2022-11-10T23:13:45.689978Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"💂🏼‍♀️ <b>To the question <em>\"Does the speed in first line influence the speed in the curve?\"\n\"</em></b><br><br>$\\;\\;\\;\\;\\;\\;\\;\\;\\;$⇢ We can answer that the p-value is <b>slightly higher than 0.05%</b>.<br><br>$\\;\\;\\;\\;\\;\\;\\;\\;\\;$⇢ So, We should <b>reject</b> the null hypothesis.<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;$⇢ But given the p-value, we can be 94% sure that speed in first line influence speed in the curve.","metadata":{}},{"cell_type":"markdown","source":"## 🧙🏼‍♀️<b><ins>Predict the speed according to run-up-distance, distance, condition track and speed in first line?</b></ins>","metadata":{}},{"cell_type":"markdown","source":"📚 <b>How determine wich algorithm to be used?</b><br><br>\n$\\;\\;\\;\\;\\;\\;$📍<b>Unsuperviser or supervised</b>:<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ We <b>know the target</b>, so it is a <em><b>supervised</em></b> problem<br><br>\n$\\;\\;\\;\\;\\;\\;$📍<b>Regression or Classification</b>:<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ The target is <b>numerical</b>,It is a <em><b>regression</em></b> problem","metadata":{}},{"cell_type":"markdown","source":"🧱 <b>The different stages</b><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$⚀ Separate Predictors(X) and Target (y)<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$⚁ Split the data in train set and test set<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$⚂ Preprocessing<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$⚃ Train the model and test the model<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$⚄ Choose the best model<br><br>","metadata":{}},{"cell_type":"code","source":"# Split data X: Features and y : the target\n\nX=df_final[['distance_id', 'run_up_distance', 'track_condition','speed_line 1']]\ny=df_final[['speed_curve']]\n\n# Feature names and target name\n\nprint('Feature names: ',np.unique(X.columns))\nprint('\\n Target name :',df_final.columns[-3])","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:45.692668Z","iopub.execute_input":"2022-11-10T23:13:45.693079Z","iopub.status.idle":"2022-11-10T23:13:45.705987Z","shell.execute_reply.started":"2022-11-10T23:13:45.692982Z","shell.execute_reply":"2022-11-10T23:13:45.704641Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Split data into train and test set\n\nX_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:45.707461Z","iopub.execute_input":"2022-11-10T23:13:45.707940Z","iopub.status.idle":"2022-11-10T23:13:45.717560Z","shell.execute_reply.started":"2022-11-10T23:13:45.707874Z","shell.execute_reply":"2022-11-10T23:13:45.716401Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Split categorical variables and numerical variables\n\nnumerical_features=make_column_selector(dtype_include=np.number)\n\ncategorical_features=make_column_selector(dtype_exclude=np.number)","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:45.718897Z","iopub.execute_input":"2022-11-10T23:13:45.719286Z","iopub.status.idle":"2022-11-10T23:13:45.729607Z","shell.execute_reply.started":"2022-11-10T23:13:45.719255Z","shell.execute_reply":"2022-11-10T23:13:45.728526Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"🧱 <b>Steps of preprocessing</b><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Handling with missing value : no need<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ <b>Encoding</b> the categorical data with <b>CatBoostEncoder</b><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Make data <b>more normal</b> with <b>PowerTransformer</b> and parameter <b>'method'</b><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Features <b>scaling</b> with <b>PowerTransformer</b> and parameter <b>'standardize'</b><br><br>","metadata":{}},{"cell_type":"markdown","source":"🙋🏼 <b>Explain my choices</b><br><br>\n$\\;\\;\\;\\;\\;\\;$📍 <b>Why use PowerTransformer for numerical data?</b><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ It makes data <b>more gaussian</b>.<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ The method <b>'yeo-johnson'</b> supports both <b>positive or negative</b> data\nas well as 0.<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ It will also <b>standardize data automatically</b> after processing, which means that each variable will have a zero mean and a unit variance.\n<br><br>\n$\\;\\;\\;\\;\\;\\;$📍 <b>Why use Cat boost encoder</b><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Many machine learning algorithms require data to be numeric.<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ So, before training a model, we need to convert categorical data into numeric form.<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Catboost is a <b>target-based categorical encoder</b>.<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ It is a <b>supervised encoder</b> that <ins>encodes categorical columns according to the target value</ins>.<br><br> \n","metadata":{}},{"cell_type":"code","source":"# Pipeline for numerical and categorical pipelines\n\nnumerical_pipeline=make_pipeline(PowerTransformer(standardize=True))\n\ncategorical_pipeline=make_pipeline(ce.CatBoostEncoder())","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:45.731067Z","iopub.execute_input":"2022-11-10T23:13:45.731463Z","iopub.status.idle":"2022-11-10T23:13:45.742928Z","shell.execute_reply.started":"2022-11-10T23:13:45.731432Z","shell.execute_reply":"2022-11-10T23:13:45.741658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Preprocessing for features\n\npreprocessor=make_column_transformer((categorical_pipeline,categorical_features),\n                                     (numerical_pipeline,numerical_features))\n","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:45.744669Z","iopub.execute_input":"2022-11-10T23:13:45.745115Z","iopub.status.idle":"2022-11-10T23:13:45.753091Z","shell.execute_reply.started":"2022-11-10T23:13:45.745083Z","shell.execute_reply":"2022-11-10T23:13:45.752034Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"👩🏼‍💻 Which models will be tested<br><br>\n$\\;\\;\\;\\;\\;\\;$📍 Selection of 4 regression models wich differents hyperparameters to be tested<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Ordinary least squares <br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Ridge<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Lasso<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ xgboost<br><br>","metadata":{}},{"cell_type":"code","source":"# Hyperparameters to be tested for each model\n\nparams_ols={'model__regressor__fit_intercept':[True,False]}\n\nparams_xgb= {\"model__regressor__max_depth\":    [3,10],\n             \"model__regressor__n_estimators\": [10,20,50],\n             \"model__regressor__learning_rate\": [0.1,0.2,0.3]}\n\nparams_ridge={'model__regressor__alpha':[0.001,0.002],\n               'model__regressor__fit_intercept':[True,False]}\n\nparams_lasso={'model__regressor__alpha':[0.01,0.02,0.03]}","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:45.754411Z","iopub.execute_input":"2022-11-10T23:13:45.754858Z","iopub.status.idle":"2022-11-10T23:13:45.764896Z","shell.execute_reply.started":"2022-11-10T23:13:45.754827Z","shell.execute_reply":"2022-11-10T23:13:45.763745Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Regression models to be tested\n\nmodels_={'ols':{'model':LinearRegression(),'params':params_ols},\n       'lasso':{'model':Lasso(),'params':params_lasso},\n       'ridge':{'model':Ridge(),'params':params_ridge},\n        'xgb':{'model':xgb.XGBRegressor(objective='reg:squarederror'),'params':params_xgb}}","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:45.766473Z","iopub.execute_input":"2022-11-10T23:13:45.767581Z","iopub.status.idle":"2022-11-10T23:13:45.775922Z","shell.execute_reply.started":"2022-11-10T23:13:45.767537Z","shell.execute_reply":"2022-11-10T23:13:45.774958Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"👩🏼‍💻  <b><ins>Process</ins></b><br><br>\n$\\;\\;\\;\\;\\;\\;$📍 Loop to call each model<br><br>\n$\\;\\;\\;\\;\\;\\;$📍 <b>GridSearchCV</b> <ins>tunes hyperparameters</ins> in order to determine the optimal values for a given model :<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ <b>Preprocessor</b> in GridSearchcv corresponds to the <ins>transformations of the numerical and categorical predictors</ins>.<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ <b>Model</b> is be used with <b>TransformedTargetRegressor</b>.<br><br>\n $\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ <b>TransformedTargetRegressor</b> object <ins>wraps a given model and a <b>scaling output data</b></ins>.\n\n","metadata":{}},{"cell_type":"code","source":"%%time\nfor model_ in models_.keys():\n    \n    model = TransformedTargetRegressor(regressor=models_[model_]['model'],\n                                       transformer=PowerTransformer(standardize=True))\n    \n    pipe = Pipeline(steps=[('preprocessor',preprocessor),('model', model)])\n    \n    ## GridSearch CV\n    \n    search=GridSearchCV(estimator=pipe,param_grid=models_[model_]['params'],cv=5)\n    search.fit(X_train,y_train)\n    model_best_param=search.best_estimator_\n    \n    # Predict y with best params with each model\n    y_preds=model_best_param.predict(X_test)\n    \n    print('📊📊📊📊📊📊📊📊📊📊 MODEL TESTED :'+model_.upper()+' 📊📊📊📊📊📊📊📊📊')\n    #Plot error\n    plt.figure(figsize=(5,5))\n    erreur_hist=np.abs(y_test-y_preds)\n    sns.displot(erreur_hist)\n    plt.show();\n    print(search.best_params_)\n    print('best Score N for training set:' ,\"{:,.2f}\".format(search.best_score_))\n    print('RMSE : ',\"{:e}\".format(np.sqrt(mean_squared_error(y_test,y_preds))))\n    print('Median :',np.median(erreur_hist))\n    print('\\n')","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:13:45.777323Z","iopub.execute_input":"2022-11-10T23:13:45.778389Z","iopub.status.idle":"2022-11-10T23:14:06.759181Z","shell.execute_reply.started":"2022-11-10T23:13:45.778353Z","shell.execute_reply":"2022-11-10T23:14:06.757862Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"👩🏼‍🏫 <b><ins>To conclude on this point</ins> : Can we estimate the speed in the curve?</ins></b><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ The best model to be uses is <b>Ridge</b><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ <b>R2</b> : 0.34 , that means that the model explains 34 per cent of the variance of the data<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ <b>RMSE</b> : On average, the prediction error is 1 mile per hour.<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ <b>Median</b> : 50% of prediction errors are less than 0.90 mile per hour.","metadata":{}},{"cell_type":"code","source":"# Best Model\nmodel=Lasso()\nmodel = TransformedTargetRegressor(regressor=models_[model_]['model'],\n                                       transformer=PowerTransformer(standardize=True))\npipe = Pipeline(steps=[('preprocessor',preprocessor),('model', model)])\n\n    ## GridSearch CV\nsearch=GridSearchCV(estimator=pipe,param_grid=params_lasso,cv=5)\nsearch.fit(X_train,y_train)\nfinal_model=search.best_estimator_","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:14:45.818693Z","iopub.execute_input":"2022-11-10T23:14:45.819671Z","iopub.status.idle":"2022-11-10T23:14:53.448778Z","shell.execute_reply.started":"2022-11-10T23:14:45.819621Z","shell.execute_reply":"2022-11-10T23:14:53.447832Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Score for each predictors\n\ndata={'Predictors':np.array(X.columns),\n      'Importance':final_model.named_steps['model'].regressor_.feature_importances_}\n\npredictor_importance=pd.DataFrame(data).sort_values(by=['Importance'],ascending=False)\n\nplt.bar(x=predictor_importance['Predictors'],height=predictor_importance['Importance'])\nplt.xticks(rotation=90)\nplt.xlabel('Predictor')\nplt.ylabel('Predictor score')\nplt.title('Scores for each predictor')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-11-10T23:14:53.450556Z","iopub.execute_input":"2022-11-10T23:14:53.451246Z","iopub.status.idle":"2022-11-10T23:14:53.663500Z","shell.execute_reply.started":"2022-11-10T23:14:53.451207Z","shell.execute_reply":"2022-11-10T23:14:53.662312Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"📽 <b><ins>Zoom on predictors</b></ins><br><br>\n$\\;\\;\\;\\;\\;\\;$📍 Let's use the attribut <b>features_importance</b><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ Feature importance refers to techniques that <b>assign a score</b> to input predictors based on <ins>how useful they are at predicting a target variable</ins>.","metadata":{}},{"cell_type":"markdown","source":" ## 👩🏼‍🎓<b><ins>Final conclusion</b></ins><br><br>","metadata":{}},{"cell_type":"markdown","source":"$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ <b><ins>Goal of the project</b></ins><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ Prevent injuries in the horse racing<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ <b><ins>How</b></ins><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ Predict speed in the curve in order to train horses and select the suitable race<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ <b><ins>Discovery</b></ins><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ Distances and run-up-distance are the most useful features to predict speed.<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ <b><ins>Downside</b></ins><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ The model suffers from a lack of data.<br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$➜ <b><ins>To go further</b></ins><br><br>\n$\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;\\;$♢ Extend the study to all races (racetrack, season, type)","metadata":{}},{"cell_type":"markdown","source":"![image.png](attachment:20fac12b-6ac3-4a52-8ead-e2494fb81e76.png)","metadata":{},"attachments":{"20fac12b-6ac3-4a52-8ead-e2494fb81e76.png":{"image/png":"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"}}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}