{"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":"> **<h1><center> Indoor Location & Navigation (leaderboard analysis) </center></h1>**\n\nUpdated on 18 April 2021","metadata":{}},{"cell_type":"markdown","source":"<h2><center> <img src=\"https://spreo.co/wp-content/uploads/2017/09/indoor-location-and-workplace-mapping-technology.png\"></center></h2>","metadata":{}},{"cell_type":"markdown","source":"Leveraging and inspired by the analysis of @demche in [Santa competition](https://www.kaggle.com/demche/santa-2020-who-s-lucky-eda), I am trying out a Leader board analysis of Indoor Location & Navigation use Kaggle Meta data.","metadata":{}},{"cell_type":"code","source":"import json\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport datetime\nimport warnings\nfrom kaggle_environments import list_episodes\nfrom IPython.display import display, Markdown\npd.set_option(\"display.max_rows\", 200)\npd.options.display.float_format = '{:,.2f}'.format\nwarnings.filterwarnings('ignore')","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!wget \"https://www.kaggle.com/c/indoor-location-navigation/leaderboard.json?includeBeforeUser=true&includeAfterUser=false\" -O leaderboard.json","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with open(\"leaderboard.json\") as f:\n    jsn = json.load(f)\nleaderboard = pd.DataFrame(columns = [\"team_name\", \"team_id\", \"score\", \"n_agents\", \"team_rank\"])\nfor user in jsn[\"beforeUser\"]+jsn[\"afterUser\"]:\n    leaderboard = leaderboard.append({\"team_name\": user[\"teamName\"], \n                                      \"team_id\": user[\"teamId\"], \n                                      \"score\": user[\"score\"], \n                                      \"n_agents\": user[\"entries\"],\n                                     \"team_rank\": user[\"rank\"]}, \n                                     ignore_index=True)\nleaderboard[[\"score\", \"n_agents\", \"team_rank\"]] = leaderboard[[\"score\", \"n_agents\", \"team_rank\"]].apply(pd.to_numeric)\ngold_min_score = leaderboard.sort_values(\"score\", ascending=True)[\"score\"][9]\nsilver_min_score = leaderboard.sort_values(\"score\", ascending=True)[\"score\"][49]\nbronze_min_score = leaderboard.sort_values(\"score\", ascending=True)[\"score\"][99]","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"episodes = pd.read_csv(\"../input/meta-kaggle/Episodes.csv\")\ngaps = sorted(set(range(episodes[episodes[\"CompetitionId\"] == 24539][\"Id\"].min(), episodes[\"Id\"].max() + 1)) - set(episodes[\"Id\"].values), reverse=True)\nepisodes = episodes.loc[episodes[\"CompetitionId\"] == 24539]\nepisodes[\"CreateTime\"] = pd.to_datetime(episodes[\"CreateTime\"], format=\"%m/%d/%Y %H:%M:%S\")\nepisodes = episodes[[\"Id\", \"CreateTime\"]]\n\nepisode_agents = pd.read_csv(\"../input/meta-kaggle/EpisodeAgents.csv\")\nepisode_agents = pd.merge(episode_agents, episodes, left_on=\"EpisodeId\", right_on=\"Id\")\nepisode_agents = episode_agents[[\"EpisodeId\", \"CreateTime\", \"SubmissionId\", \"UpdatedScore\"]]\nepisode_agents = episode_agents.drop_duplicates()\nepisode_agents[\"date\"] = episode_agents[\"CreateTime\"].dt.date\nagents_mapping = pd.DataFrame(columns = [\"team_id\", \"submission_id\", \"submission_dt\"])\n\nepisodes_to_consider = episode_agents[episode_agents[\"EpisodeId\"].isin(episodes[\"Id\"])].groupby([\"SubmissionId\"])[\"EpisodeId\"].max().to_list()\nfor i in range(0, len(episodes_to_consider), 1000):\n    batch = episodes_to_consider[i:i + 1000]\n    try:\n        resp = list_episodes(batch)  \n        for episode in resp[\"result\"][\"submissions\"]:\n            agents_mapping = agents_mapping.append({\"team_id\": episode[\"teamId\"],\n                                \"submission_id\":  episode[\"id\"] ,\n                                \"submission_dt\": datetime.datetime.strptime(episode[\"dateSubmitted\"][:19], \"%Y-%m-%dT%H:%M:%S\")\n                               }, ignore_index=True)\n        del episode, batch\n    except Exception as ex:\n        print(\"Error:\", ex)\n        continue\n\nfor i in range(0, len(gaps), 1000):\n    batch = gaps[i:i + 1000]\n    try:\n        resp = list_episodes(batch)      \n        if len(resp[\"result\"][\"episodes\"]) != 0:\n            for episode in resp[\"result\"][\"episodes\"]:\n                if episode[\"competitionId\"] == 24539:\n                    EpisodeId = episode[\"id\"]\n                    for agent in episode[\"agents\"]:\n                        submissionId = agent[\"submissionId\"]\n                        updatedScore = agent[\"updatedScore\"]\n                        CreateTime = datetime.strptime(episode[\"createTime\"][:19], \"%Y-%m-%dT%H:%M:%S\")\n                        episode_agents = episode_agents.append({\"EpisodeId\": EpisodeId,\n                                                    \"CreateTime\": CreateTime,\n                                                    \"SubmissionId\": submissionId,\n                                                    \"UpdatedScore\": updatedScore\n                                                    }, ignore_index=True)           \n            for episode in episodes[\"result\"][\"submissions\"]:\n                agents_mapping = agents_mapping.append({\"team_id\": episode[\"teamId\"],\n                                    \"submission_id\":  episode[\"id\"] ,\n                                    \"submission_dt\": datetime.datetime.strptime(episode[\"dateSubmitted\"][:19], \"%Y-%m-%dT%H:%M:%S\")\n                                   }, ignore_index=True)\n            del episode, batch\n    except Exception as ex:\n        print(\"Error:\", ex)\n        continue\n        \nagents_mapping = agents_mapping.drop_duplicates(subset=[\"submission_id\"])\nepisode_agents = episode_agents[episode_agents[\"SubmissionId\"].isin(agents_mapping[\"submission_id\"])]\nepisode_agents = episode_agents.drop_duplicates()\nagents = episode_agents.loc[episode_agents.groupby(\"SubmissionId\").CreateTime.idxmax()].dropna(subset=[\"UpdatedScore\"]).\\\n    loc[:, [\"SubmissionId\", \"UpdatedScore\"]].reset_index(drop=True)\nagents.columns = [\"submission_id\", \"score\"]\nagents = pd.merge(agents, agents_mapping, on=\"submission_id\", how=\"left\")\nagents = agents.drop_duplicates(subset=[\"submission_id\"])\nagents = pd.merge(agents, leaderboard.loc[:, [\"team_name\", \"team_id\"]], on=\"team_id\", how=\"left\")\nagents[\"medal\"] = [\"gold\" if x >= gold_min_score else \"silver\" if x >= silver_min_score else \"bronze\" if x >= bronze_min_score else \"no medal\" \\\n     for x in agents[\"score\"]]","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_kg_hide-input":true,"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 1. Score distribution","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(25,8))\nplt.hist(leaderboard[\"score\"], color=\"lightsteelblue\", bins=10)\nplt.axvline(x=gold_min_score, color=\"gold\")\nplt.axvline(x=silver_min_score, color=\"silver\")\nplt.axvline(x=bronze_min_score, color=\"peru\")\nplt.xlabel(\"Team score\")\nplt.ylabel(\"Number of teams\")\nplt.legend(title=\"Team score distribution (vertical lines are medal thresholds)\", loc=\"upper center\", title_fontsize=25)\nplt.show()","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(25,8))\nplt.hist(leaderboard[\"score\"][leaderboard[\"score\"] <4.5], color=\"thistle\", bins=10)\nplt.axvline(x=gold_min_score, color=\"gold\")\nplt.axvline(x=silver_min_score, color=\"silver\")\nplt.axvline(x=bronze_min_score, color=\"peru\")\nplt.xlabel(\"Team score\")\nplt.ylabel(\"Number of teams\")\nplt.legend(title=\"Team score distribution (teams with score <4.5, vertical lines are medal thresholds)\", loc=\"upper center\", title_fontsize=25)\nplt.show()","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"leaderboard[\"score\"].describe()","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 2. Number of submissions for medal-winning teams","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(25,8))\nplt.hist([leaderboard.sort_values(\"score\", ascending=False)[\"n_agents\"][:10],\n          leaderboard.sort_values(\"score\", ascending=False)[\"n_agents\"][11:51],\n          leaderboard.sort_values(\"score\", ascending=False)[\"n_agents\"][51:101]],\n         label=[\"gold-winning team\", \"silver-winning team\", \"bronze-winning team\"],\n         color= [\"gold\", \"silver\", \"peru\"], bins=50, stacked=True, alpha=0.7)\nplt.xlabel(\"Number of submissions\")\nplt.ylabel(\"Number of teams\")\nplt.legend(title=\"Total number of submissions for medal-winning teams\", loc=\"upper center\", title_fontsize=20)\nplt.show()","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]}]}