{"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":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport geopy.distance\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-11-11T01:51:01.138136Z","iopub.execute_input":"2022-11-11T01:51:01.138623Z","iopub.status.idle":"2022-11-11T01:51:01.145623Z","shell.execute_reply.started":"2022-11-11T01:51:01.138587Z","shell.execute_reply":"2022-11-11T01:51:01.144270Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Your challenge is to generate actionable, practical, and novel insights from horse tracking data that devises innovative and data-driven approaches to analyzing racing tactics, drafting strategies and path efficiency. There are several potential topics for participants to analyze.\n\nThese include, but are not limited to:\n\nCreate a horse rating measuring expected finish position versus actual finish position. How does a horse’s expected finish position change through the running of a race? Does this metric rely solely on a horse’s own position or is it influenced by the position of competitors?\n\nWhat are optimal racing strategies? Considering different venues, surfaces and race distances. \nCreate a jockey rating based upon path efficiency?\n\nCreate a surface measure model which would rate the fairness of different paths on a racecourse that may be beneficial or harmful to finish position based. This may be a result of unknown barometric, weather or maintenance factors.\n\nCreate a model measuring the existence (or not) and relevance of a drafting benefit.\n\nCreate a model reveal optimal gait patterns. \nDoes the model differ for such factors as age, distance, race section or surface?\n\n\nAre Earnings a Good Measure of Jockey Performance?\n\nHow Do Owners and Trainers Select Jockeys for Their Horses?\n\nCan a Jockey Increase a Horses Chances?\n","metadata":{}},{"cell_type":"code","source":"\n#nyra_start_table.csv - horse/jockey race data\ndf_horse_jockey_race = pd.read_csv(\"../input/big-data-derby-2022/nyra_2019_complete.csv\")\n\ndf_horse_jockey_race.rename(columns={df_horse_jockey_race.columns[0]: \"track_id\",\n                        df_horse_jockey_race.columns[1]: \"race_date\",\n                        df_horse_jockey_race.columns[2]: \"race_number\",\n                        df_horse_jockey_race.columns[3]: \"program_number\",\n                        df_horse_jockey_race.columns[4]: \"trakus_index\",\n                        df_horse_jockey_race.columns[5]: \"latitude\",\n                        df_horse_jockey_race.columns[6]: \"longitude\",\n                        df_horse_jockey_race.columns[7]: \"distance_id\",\n                        df_horse_jockey_race.columns[8]: \"course_type\",\n                        df_horse_jockey_race.columns[9]: \"track_condition\",\n                        df_horse_jockey_race.columns[10]: \"run_up_distance\",\n                        df_horse_jockey_race.columns[11]: \"race_type\",\n                        df_horse_jockey_race.columns[12]: \"purse\",\n                        df_horse_jockey_race.columns[13]: \"post_time\",\n                        df_horse_jockey_race.columns[14]: \"weight_carried\",\n                        df_horse_jockey_race.columns[15]: \"jockey\",\n                        df_horse_jockey_race.columns[16]: \"odds\",\n                        df_horse_jockey_race.columns[17]: \"position_at_finish\"}, errors=\"raise\", inplace = True)\n#\n\nls_position = list(dict.fromkeys(df_horse_jockey_race['position_at_finish']))\nls_position_sorted = sorted(ls_position)  \nprint(ls_position_sorted)\n#\ndf_horse_jockey_race.reset_index(inplace = True)\n#\nls_jockey  = df_horse_jockey_race[\"jockey\"]\nls_race_date  = df_horse_jockey_race[\"race_date\"]\nlst_track_id = df_horse_jockey_race[\"track_id\"]\n#\nls_jockey = list(dict.fromkeys(ls_jockey))\nls_race_date = list(dict.fromkeys(ls_race_date))\nlst_track_id = list(dict.fromkeys(lst_track_id))\n#\nfor position in ls_position_sorted:\n    for jockey in ls_jockey:\n        for race_date in ls_race_date:\n            #for track_id in lst_track_id:\n            df_horse_jockey_racedate=df_horse_jockey_race.query(\"jockey == @jockey & race_date == @race_date & position_at_finish==@position\") # & track_id == @track_id\")  \n            #ls_race_numb  = df_horse_jockey_racedate[\"race_number\"]\n            #ls_race_numb = list(dict.fromkeys(ls_race_numb))\n            #for race_number in ls_race_numb:\n            #df_horse_jockey_racedate_num = df_horse_jockey_racedate.query(\"race_number == @race_number\")  \n\n            df_horse_jockey_racedate_srt = df_horse_jockey_racedate.sort_values([\"track_id\",\"race_date\",\"race_number\"],\n                                                                                ascending = [True,True,True])\n            df_horse_jockey_racedate_srt.reset_index(inplace = True)\n            #\n            ls_trakus_index = list(df_horse_jockey_racedate_srt[\"trakus_index\"])   \n            ls_latitude = list(df_horse_jockey_racedate_srt[\"latitude\"])  \n            ls_longitude = list(df_horse_jockey_racedate_srt[\"longitude\"])\n            #\n            ls_point_dist = []\n            ls_inst_vel = []\n            ls_elapsed_time = []\n            v_elapsed_time = 0\n            for index in range(0,len(ls_trakus_index)):\n                if index ==0:\n                    ls_point_dist.append(0)\n                    ls_inst_vel.append(0)\n                    ls_elapsed_time.append(0)\n                else:\n                    coords_1 = (ls_latitude[index], ls_latitude[index-1])\n                    coords_2 = (ls_longitude[index], ls_longitude[index-1])\n                    v_elapsed_time+=0.25\n                    v_dist = geopy.distance.distance(coords_1, coords_2).miles /1609.344\n                    ls_inst_vel.append( 4 * v_dist * 3600 /1000)\n                    ls_point_dist.append(v_dist)\n                    ls_elapsed_time.append(v_elapsed_time)\n            #\n            df_horse_jockey_racedate_srt[\"point_dist\"] = ls_point_dist \n            df_horse_jockey_racedate_srt[\"inst_vel_kmh\"] = ls_inst_vel\n            df_horse_jockey_racedate_srt[\"elapsed_time_secs\"] = ls_elapsed_time\n            #df_horse_jockey_racedate_srt.reset_index(inplace = True)\n\n\n            #\n            # odds - Divide by 100 to derive the odds to 1. Example - 1280 would be 12.8-1.\n            if len(df_horse_jockey_racedate_srt)==0:\n                break\n            else:\n                print(f\"POSITION: [ {str(position).zfill(4)} ]  :: Jockey [ {jockey} ]  Race Date: {race_date}\") # Race Number: {race_number} Track: {track_id}\")\n                #\n                race_number = list(df_horse_jockey_racedate_srt[\"race_number\"])[0]\n                program_number = list(df_horse_jockey_racedate_srt[\"program_number\"])[0]\n                odds = list(df_horse_jockey_racedate_srt[\"odds\"])[0]\n                weight_carried = list(df_horse_jockey_racedate_srt[\"weight_carried\"])[0]\n                track_id = list(df_horse_jockey_racedate_srt[\"track_id\"])[0]\n                #\n                print(f\"RACE: {race_number} PROGRAM {program_number} weight_carried {weight_carried} odds {odds} track ID {track_id}\")\n                print(df_horse_jockey_racedate_srt[[\"latitude\", \"longitude\",\"point_dist\",\"inst_vel_kmh\",\"elapsed_time_secs\"]])\n                average_vel = df_horse_jockey_racedate_srt[\"inst_vel_kmh\"].mean()\n                max_inst_vel = df_horse_jockey_racedate_srt[\"inst_vel_kmh\"].max()\n                average_point_dist = df_horse_jockey_racedate_srt[\"point_dist\"].mean()\n                total_elapsed_time = df_horse_jockey_racedate_srt['elapsed_time_secs'].max()            \n                total_dist = df_horse_jockey_racedate_srt['point_dist'].sum()\n                print(f\"Average power: {weight_carried*average_vel} lb km/h :: Peak power: {weight_carried*max_inst_vel} lb km/h\")\n                print(f\"Average pace (in meters) {average_point_dist} - elapsed time( seconds): {total_elapsed_time} - Total distance (in meters): {total_dist}\")\n                print(f\"Maxima instant velocity (km/h): {max_inst_vel} :: Average velocit (km/h): {average_vel}\")\n                print(\"\\n[NEXT...]\\n\")\n            #df_horse_jockey_racedate_srt = df_horse_jockey_racedate.sort_values([\"track_id\",\"race_date\",'race_number','odds'],ascending = [True,True,True,True])\n            #df_horse_jockey_racedate_srt.reset_index(inplace = True)\n            #\n            # odds - Divide by 100 to derive the odds to 1. Example - 1280 would be 12.8-1.\n            #if len(df_horse_jockey_racedate_srt)==0:\n            #    break\n            #else:\n            #    print(f\"ODDS: Jockey {jockey} Race Date: {race_date}\") #\"Race Number: {race_number} Track: {track_id}\")\n            #    print(df_horse_jockey_racedate_srt[[\"track_id\",\"race_number\" , \"program_number\", \"trakus_index\", \"latitude\", \"longitude\",\"odds\",\"weight_carried\"]])\n            #for every first place:\n            # detect (good) strategy by collecting the following:\n            # \n            # DO IT FOR LASTY PLACE TOO:\n            # ... detect (bad) strategy by collecting the following\n            # ... for false positive collection\n            # \n            # track [ track_id - 3 character id for the track the race took place at. AQU -Aqueduct, BEL - Belmont, SAR - Saratoga ]\n            # weight_carried - int\n            # track_condition - char(3)\n            # race_type - char(5)\n            #\n            #  collect tracus_index for the intire race:\n            #    trakus_index - int\n            #    latitude - float\n            #    longitude - float\n            # when weight are minimal and odds are maximum\n            # when weight are minimal and jockey's odds are minimal\n            # when weight are not minimal and jockey's odds are minimal\n            # when weight are maximum and jockey's odds are minimal\n\n\n            #jockey position_at_finish x jockey's odds are minimal\n            #jockey position_at_finish x jockey's odds are maximum\n\n            #jockey weight_carried are minimal x position_at_finish \n            #jockey weight_carried are maximum x position_at_finish   \n        #print(\"\\n[NEXT Jokey...]\\n\")\n    #print(f\"\\n[NEXT {position}...]\\n\")\n            \n            ","metadata":{"execution":{"iopub.status.busy":"2022-11-11T01:51:01.185629Z","iopub.execute_input":"2022-11-11T01:51:01.187210Z","iopub.status.idle":"2022-11-11T01:52:51.556378Z","shell.execute_reply.started":"2022-11-11T01:51:01.187138Z","shell.execute_reply":"2022-11-11T01:52:51.553942Z"},"trusted":true},"execution_count":null,"outputs":[]}]}