{"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":"## RESOURCES:\n# https://www.linkedin.com/posts/immanuel-giulea_big-data-derby-2022-activity-6967482516106571776-BZQS\n\n# https://www.kaggle.com/code/woosungyoon/derby-2022-visualization-racing\n\n# https://www.kaggle.com/discussions/getting-started/167105#930146\n# Top Prediction Algorithms","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-11-08T07:16:41.325007Z","iopub.execute_input":"2022-11-08T07:16:41.325920Z","iopub.status.idle":"2022-11-08T07:16:41.350628Z","shell.execute_reply.started":"2022-11-08T07:16:41.325819Z","shell.execute_reply":"2022-11-08T07:16:41.349549Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## RESOURCES:\n https://www.linkedin.com/posts/immanuel-giulea_big-data-derby-2022-activity-6967482516106571776-BZQS\n\n https://www.kaggle.com/code/woosungyoon/derby-2022-visualization-racing\n\n https://www.kaggle.com/discussions/getting-started/167105#930146\n# Top Prediction Algorithms","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\n\nimport pickle\nimport datetime\nimport random\n\nimport folium\nfrom folium.plugins import TimestampedGeoJson","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"In this notebook, I will use the folium library to visualize lacing.","metadata":{"execution":{"iopub.status.busy":"2022-10-25T15:56:53.144022Z","iopub.execute_input":"2022-10-25T15:56:53.145076Z","iopub.status.idle":"2022-10-25T15:56:53.153151Z","shell.execute_reply.started":"2022-10-25T15:56:53.14503Z","shell.execute_reply":"2022-10-25T15:56:53.151385Z"}}},{"cell_type":"code","source":"with open(\"../input/race-time-outlier-visualization-v0/rcsttk_table.pkl\", 'rb') as f:\n    data = pickle.load(f)\ndata.head()","metadata":{"execution":{"iopub.status.busy":"2022-10-25T15:57:51.951211Z","iopub.execute_input":"2022-10-25T15:57:51.951597Z","iopub.status.idle":"2022-10-25T15:57:55.57117Z","shell.execute_reply.started":"2022-10-25T15:57:51.951567Z","shell.execute_reply":"2022-10-25T15:57:55.570402Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def agg_func(x):\n    flatten_x = []\n    for item in x:\n        flatten_x.extend(item)\n    return flatten_x","metadata":{"execution":{"iopub.status.busy":"2022-10-25T15:58:16.464874Z","iopub.execute_input":"2022-10-25T15:58:16.465672Z","iopub.status.idle":"2022-10-25T15:58:16.470849Z","shell.execute_reply.started":"2022-10-25T15:58:16.465634Z","shell.execute_reply":"2022-10-25T15:58:16.469845Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Group Data by \n* track_id\n* course_type\n* distance_id\n* run_up_distance ","metadata":{}},{"cell_type":"code","source":"group = data.groupby(['track_id','course_type','distance_id','run_up_distance'])\ntotal_data = group['race_date'].first()\ntotal_data = total_data.reset_index(drop=False)\ntotal_data['latitude'] = group['latitude'].apply(agg_func).values\ntotal_data['longitude'] = group['longitude'].apply(agg_func).values\ntotal_data['size'] = total_data.latitude.apply(lambda x: len(x))\ntotal_data = total_data.sort_values(by='size', ascending=False).reset_index(drop=True)\ntotal_data","metadata":{"execution":{"iopub.status.busy":"2022-10-25T15:59:44.145003Z","iopub.execute_input":"2022-10-25T15:59:44.145412Z","iopub.status.idle":"2022-10-25T15:59:45.361414Z","shell.execute_reply.started":"2022-10-25T15:59:44.14538Z","shell.execute_reply":"2022-10-25T15:59:45.360628Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def generate_random_color(num_horse):\n    return [\"#\"+''.join([random.choice('0123456789ABCDEF') for j in range(6)]) \n            for i in range(num_horse)]","metadata":{"execution":{"iopub.status.busy":"2022-10-25T15:59:58.769346Z","iopub.execute_input":"2022-10-25T15:59:58.769725Z","iopub.status.idle":"2022-10-25T15:59:58.775568Z","shell.execute_reply.started":"2022-10-25T15:59:58.769684Z","shell.execute_reply":"2022-10-25T15:59:58.774227Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_feature(coordinates, cur_time, color):\n    feature = {'type': 'Feature',\n           'geometry': { 'type': 'Point',\n                        'coordinates': [*coordinates]},\n           'properties': {'time': cur_time,\n                          'style': {'color': ''},\n                          'icon': 'circle',\n                          'iconstyle': {'fillColor': color,\n                                        'fillOpacity': 0.85,\n                                        'stroke': 'true',\n                                        'radius': 4\n                                       }\n                            }\n            }\n    return feature","metadata":{"execution":{"iopub.status.busy":"2022-10-25T16:00:15.049083Z","iopub.execute_input":"2022-10-25T16:00:15.049468Z","iopub.status.idle":"2022-10-25T16:00:15.056454Z","shell.execute_reply.started":"2022-10-25T16:00:15.049437Z","shell.execute_reply":"2022-10-25T16:00:15.055176Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def folium_visualization(race, transition_time=250):\n    race_lng_list = race['longitude']\n    race_lat_list = race['latitude']\n    \n    # folium map\n    m1 = folium.Map(location=[np.mean([np.mean(x) for x in race_lat_list]),\n                              np.mean([np.mean(x) for x in race_lng_list])], \n                    zoom_start=16, )\n    \n    record_date = datetime.datetime.strptime(race['race_date'], '%Y-%m-%d')\n    num_horse = len(race_lng_list)\n    colors = generate_random_color(num_horse)\n    \n    # traverss horses race records\n    race_features = []\n    for i, items in enumerate(zip(race_lng_list, race_lat_list)):\n        lnglat = np.vstack([*items]).T\n        color = colors[i]\n        \n        # traverse trakus_idx\n        for trakus_idx in range(len(lnglat)//4):\n            cur_time = str(record_date + datetime.timedelta(0, (trakus_idx+1))).split('.')[0]\n            coordinates = lnglat[4*trakus_idx]\n            feature = get_feature(coordinates, cur_time, color)\n            \n            # update feature\n            race_features.append(feature)\n    \n    # add features to folium map\n    TimestampedGeoJson(race_features,\n                   transition_time=transition_time, \n                   period=\"PT1S\",\n                   duration=\"PT1s\",\n                   add_last_point=False,                       \n                   auto_play=True).add_to(m1)\n    return m1","metadata":{"execution":{"iopub.status.busy":"2022-10-25T16:08:38.119763Z","iopub.execute_input":"2022-10-25T16:08:38.120184Z","iopub.status.idle":"2022-10-25T16:08:38.131129Z","shell.execute_reply.started":"2022-10-25T16:08:38.120152Z","shell.execute_reply":"2022-10-25T16:08:38.130025Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"N = len(total_data)\n#sample_idx = np.random.choice(N)\nrace1 = total_data.loc[5]\nm1 = folium_visualization(race1)\ndisplay(m1)\nprint(race1)","metadata":{"execution":{"iopub.status.busy":"2022-10-25T16:08:41.725199Z","iopub.execute_input":"2022-10-25T16:08:41.725582Z","iopub.status.idle":"2022-10-25T16:08:42.087075Z","shell.execute_reply.started":"2022-10-25T16:08:41.725551Z","shell.execute_reply":"2022-10-25T16:08:42.085954Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}