{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":38760,"databundleVersionId":4493939,"sourceType":"competition"}],"dockerImageVersionId":30301,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"<h1 style=\"font-family:verdana;\"> <center>🛍 OTTO – Multi-Objective Recommender System - Getting Started 🧑‍💻</center> </h1>\n\n***","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19"}},{"cell_type":"markdown","source":"<div style=\"color:white;\n           display:fill;\n           border-radius:5px;\n           background-color:#0daae3;\n           font-size:110%;\n           font-family:Verdana;\n           letter-spacing:0.5px\">\n        <p style=\"padding: 10px;\n              color:white;\">\n            Hopefully this notebook will give you a basic understanding of the task and data involved in this competition. Please give an upvote if you find it useful 👍\n        </p>\n    </div>\n    \n<div align = 'center'><img src= \"https://livewin.net/wp-content/uploads/2021/02/Ecommerce.png\" alt =\"Shop\" style='width: 1000px;height 500px'>","metadata":{"execution":{"iopub.status.busy":"2022-11-01T22:06:01.156463Z","iopub.execute_input":"2022-11-01T22:06:01.15692Z","iopub.status.idle":"2022-11-01T22:06:01.16978Z","shell.execute_reply.started":"2022-11-01T22:06:01.15683Z","shell.execute_reply":"2022-11-01T22:06:01.167973Z"}}},{"cell_type":"markdown","source":"### <span style=\"font-family:verdana; word-spacing:1.5px;\"> Contents:\n[Load in the data ⏳](#first-bullet)\n    \n[Data Structure 🗂](#second-bullet)\n    \n[Intital EDA 📊](#third-bullet)\n    \n[Baseline 📈](#fourth-bullet)\n    \n[Where to go next 🚀](#fith-bullet)","metadata":{}},{"cell_type":"markdown","source":"### <span style=\"font-family:verdana; word-spacing:1.5px;\">  Task overview\n    \n<span style=\"font-family:verdana; word-spacing:1.5px;\">  The aim of this competition is to predict e-commerce <span style=\"color:#159364;\">clicks, cart additions, and orders</span>. You'll build a multi-objective recommender system based on previous events in a user session.\n    \n<span style=\"font-family:verdana; word-spacing:1.5px;\"> Current recommender systems consist of various models with different approaches, ranging from simple matrix factorization to a transformer-type deep neural network. However, no single model exists that can simultaneously optimize multiple objectives. In this competition, you’ll build a single entry to predict click-through, add-to-cart, and conversion rates based on previous same-session events.","metadata":{}},{"cell_type":"markdown","source":"### <span style=\"font-family:verdana; word-spacing:1.5px;\">   Imports / setup 🚚","metadata":{}},{"cell_type":"code","source":"### Imports ###\n\nimport pandas as pd\nfrom pathlib import Path\nimport os\nimport random\nimport numpy as np\nimport json\nfrom datetime import timedelta\nfrom collections import Counter\nfrom tqdm.notebook import tqdm\nfrom heapq import nlargest\n\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nsns.set_theme()\n\nimport warnings\nwarnings.filterwarnings('ignore')\n","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:53:37.141559Z","iopub.execute_input":"2025-06-08T18:53:37.142064Z","iopub.status.idle":"2025-06-08T18:53:38.551253Z","shell.execute_reply.started":"2025-06-08T18:53:37.141957Z","shell.execute_reply":"2025-06-08T18:53:38.549743Z"},"trusted":true},"outputs":[],"execution_count":1},{"cell_type":"code","source":"### Paths ###\n\nDATA_PATH = Path('../input/otto-recommender-system')\nTRAIN_PATH = DATA_PATH/'train.jsonl'\nTEST_PATH = DATA_PATH/'test.jsonl'\nSAMPLE_SUB_PATH = Path('../input/otto-recommender-system/sample_submission.csv')","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:53:38.554416Z","iopub.execute_input":"2025-06-08T18:53:38.556203Z","iopub.status.idle":"2025-06-08T18:53:38.563432Z","shell.execute_reply.started":"2025-06-08T18:53:38.55615Z","shell.execute_reply":"2025-06-08T18:53:38.562226Z"},"trusted":true},"outputs":[],"execution_count":2},{"cell_type":"markdown","source":"# <span style=\"font-family:verdana; word-spacing:1.5px;\">   Load in the data ⏳","metadata":{}},{"cell_type":"code","source":"# Lets check how many lines the training data has!\n\nwith open(TRAIN_PATH, 'r') as f:\n    print(f\"We have {len(f.readlines()):,} lines in the training data\")","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:53:38.56477Z","iopub.execute_input":"2025-06-08T18:53:38.565355Z","iopub.status.idle":"2025-06-08T18:56:54.367439Z","shell.execute_reply.started":"2025-06-08T18:53:38.565319Z","shell.execute_reply":"2025-06-08T18:56:54.365077Z"},"trusted":true},"outputs":[{"name":"stdout","text":"We have 12,899,779 lines in the training data\n","output_type":"stream"}],"execution_count":3},{"cell_type":"code","source":"# Load in a sample to a pandas df\n\nsample_size = 150000\n\nchunks = pd.read_json(TRAIN_PATH, lines=True, chunksize = sample_size)\n\nfor c in chunks:\n    sample_train_df = c\n    break","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:56:54.372423Z","iopub.execute_input":"2025-06-08T18:56:54.373157Z","iopub.status.idle":"2025-06-08T18:57:10.161992Z","shell.execute_reply.started":"2025-06-08T18:56:54.373085Z","shell.execute_reply":"2025-06-08T18:57:10.160623Z"},"trusted":true},"outputs":[],"execution_count":4},{"cell_type":"code","source":"sample_train_df.set_index('session', drop=True, inplace=True)\nsample_train_df.head()","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:57:10.163694Z","iopub.execute_input":"2025-06-08T18:57:10.164099Z","iopub.status.idle":"2025-06-08T18:57:10.272113Z","shell.execute_reply.started":"2025-06-08T18:57:10.164065Z","shell.execute_reply":"2025-06-08T18:57:10.270743Z"},"trusted":true},"outputs":[{"execution_count":5,"output_type":"execute_result","data":{"text/plain":"                                                    events\nsession                                                   \n0        [{'aid': 1517085, 'ts': 1659304800025, 'type':...\n1        [{'aid': 424964, 'ts': 1659304800025, 'type': ...\n2        [{'aid': 763743, 'ts': 1659304800038, 'type': ...\n3        [{'aid': 1425967, 'ts': 1659304800095, 'type':...\n4        [{'aid': 613619, 'ts': 1659304800119, 'type': ...","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>events</th>\n    </tr>\n    <tr>\n      <th>session</th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>[{'aid': 1517085, 'ts': 1659304800025, 'type':...</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>[{'aid': 424964, 'ts': 1659304800025, 'type': ...</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>[{'aid': 763743, 'ts': 1659304800038, 'type': ...</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>[{'aid': 1425967, 'ts': 1659304800095, 'type':...</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>[{'aid': 613619, 'ts': 1659304800119, 'type': ...</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}],"execution_count":5},{"cell_type":"markdown","source":"# <span style=\"font-family:verdana; word-spacing:1.5px;\">   Data structure 🗂\n    \n<span style=\"font-family:verdana; word-spacing:1.5px;\">  `session` - the unique session id. Each session contains a list of time ordered events.\n\n<span style=\"font-family:verdana; word-spacing:1.5px;\">  `events` - the time ordered sequence of events in the session. Each event contains 3 pieces of information:\n\n- <span style=\"font-family:verdana; word-spacing:1.5px;\">  `aid` - the article id (product code) of the associated event\n    \n- <span style=\"font-family:verdana; word-spacing:1.5px;\">  `ts` - the Unix timestamp of the event (Unix time is the number of **milliseconds** that have elapsed since 00:00:00 UTC on 1 January 1970) (Thanks to Junji Takeshima https://www.kaggle.com/junjitakeshima for the correction)\n\n- <span style=\"font-family:verdana; word-spacing:1.5px;\">  `type` - the event type, i.e., whether a product was clicked (`clicks`), added to the user's cart (`carts`), or ordered during the session (`orders`)\n","metadata":{"execution":{"iopub.status.busy":"2022-11-01T23:14:19.492394Z","iopub.execute_input":"2022-11-01T23:14:19.492818Z","iopub.status.idle":"2022-11-01T23:14:19.49865Z","shell.execute_reply.started":"2022-11-01T23:14:19.492782Z","shell.execute_reply":"2022-11-01T23:14:19.496998Z"}}},{"cell_type":"code","source":"# Let's look at an example session and print out some basic info\n\n# Sample the first session in the df\nexample_session = sample_train_df.iloc[0].item()\nprint(f'This session was {len(example_session)} actions long \\n')\nprint(f'The first action in the session: \\n {example_session[0]} \\n')\n\n# Time of session\ntime_elapsed = example_session[-1][\"ts\"] - example_session[0][\"ts\"]\n# The timestamp is in milliseconds since 00:00:00 UTC on 1 January 1970\nprint(f'The first session elapsed: {str(timedelta(milliseconds=time_elapsed))} \\n')\n\n# Count the frequency of actions within the session\naction_counts = {}\nfor action in example_session:\n    action_counts[action['type']] = action_counts.get(action['type'], 0) + 1  \nprint(f'The first session contains the following frequency of actions: {action_counts}')","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:57:10.273697Z","iopub.execute_input":"2025-06-08T18:57:10.274095Z","iopub.status.idle":"2025-06-08T18:57:10.283866Z","shell.execute_reply.started":"2025-06-08T18:57:10.274061Z","shell.execute_reply":"2025-06-08T18:57:10.282399Z"},"trusted":true},"outputs":[{"name":"stdout","text":"This session was 276 actions long \n\nThe first action in the session: \n {'aid': 1517085, 'ts': 1659304800025, 'type': 'clicks'} \n\nThe first session elapsed: 27 days, 13:09:43.682000 \n\nThe first session contains the following frequency of actions: {'clicks': 255, 'carts': 17, 'orders': 4}\n","output_type":"stream"}],"execution_count":6},{"cell_type":"markdown","source":"# <span style=\"font-family:verdana; word-spacing:1.5px;\"> Intital EDA 📊","metadata":{"execution":{"iopub.status.busy":"2022-11-01T23:34:37.808224Z","iopub.execute_input":"2022-11-01T23:34:37.808672Z","iopub.status.idle":"2022-11-01T23:34:37.816409Z","shell.execute_reply.started":"2022-11-01T23:34:37.808638Z","shell.execute_reply":"2022-11-01T23:34:37.814557Z"}}},{"cell_type":"code","source":"### Extract information from each session and add it to the df ###\n\naction_counts_list, article_id_counts_list, session_length_time_list, session_length_action_list = ([] for i in range(4))\noverall_action_counts = {}\noverall_article_id_counts = {}\n\nfor i, row in tqdm(sample_train_df.iterrows(), total=len(sample_train_df)):\n    \n    actions = row['events']\n    \n    # Get the frequency of actions and article_ids\n    action_counts = {}\n    article_id_counts = {}\n    for action in actions:\n        action_counts[action['type']] = action_counts.get(action['type'], 0) + 1\n        article_id_counts[action['aid']] = article_id_counts.get(action['aid'], 0) + 1\n        overall_action_counts[action['type']] = overall_action_counts.get(action['type'], 0) + 1\n        overall_article_id_counts[action['aid']] = overall_article_id_counts.get(action['aid'], 0) + 1\n        \n    # Get the length of the session\n    session_length_time = actions[-1]['ts'] - actions[0]['ts']\n    \n    # Add to list\n    action_counts_list.append(action_counts)\n    article_id_counts_list.append(article_id_counts)\n    session_length_time_list.append(session_length_time)\n    session_length_action_list.append(len(actions))\n    \nsample_train_df['action_counts'] = action_counts_list\nsample_train_df['article_id_counts'] = article_id_counts_list\nsample_train_df['session_length_unix'] = session_length_time_list\nsample_train_df['session_length_hours'] = sample_train_df['session_length_unix']*2.77778e-7  # Convert to hours\nsample_train_df['session_length_action'] = session_length_action_list","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:57:10.287575Z","iopub.execute_input":"2025-06-08T18:57:10.287978Z","iopub.status.idle":"2025-06-08T18:57:35.240825Z","shell.execute_reply.started":"2025-06-08T18:57:10.287934Z","shell.execute_reply":"2025-06-08T18:57:35.239083Z"},"trusted":true},"outputs":[{"output_type":"display_data","data":{"text/plain":"  0%|          | 0/150000 [00:00<?, ?it/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"fb7d8fde49ed42bca08f0c6f9db2a0df"}},"metadata":{}}],"execution_count":7},{"cell_type":"code","source":"### Actions ###\n\ntotal_actions = sum(overall_action_counts.values())\n\nplt.figure(figsize=(8,6))\nsns.barplot(x=list(overall_action_counts.keys()), y=[i/total_actions for i in overall_action_counts.values()]);\nplt.title(f'Action frequency', fontsize=12)\nplt.ylabel('Count', fontsize=12)\nplt.xlabel('Category', fontsize=12)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:57:35.242366Z","iopub.execute_input":"2025-06-08T18:57:35.242799Z","iopub.status.idle":"2025-06-08T18:57:35.509527Z","shell.execute_reply.started":"2025-06-08T18:57:35.242762Z","shell.execute_reply":"2025-06-08T18:57:35.508376Z"},"trusted":true},"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 576x432 with 1 Axes>","image/png":"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ylw08C1atFBOTs45t+Xk5KhFixbVPhQAALgyFw388OHDlZqaqpUrV8rj8UiSPB6PVq5cqUmTJunRRx+t8SEBAMCluejb5AYOHKhDhw7phRdeUGVlpUJDQ1VWVqbatWtr1KhRcjgc/pgTAABcgiq9D/7RRx/V0KFDtXHjRpWVlSk0NFRxcXGqX79+Tc8HAAAuQ5U/6KZ+/frnfTU9AAC4ulT5o2oBAMC1g8ADAGAgAg8AgIH8FvjCwkIlJSUpISFBSUlJ2rVr13nX7ty5U+3bt9eUKVP8NR4AAEbxW+BTU1OVnJysFStWKDk5WSkpKedc53a7lZqaqt69e/trNAAAjOOXwJeUlCg/P9/7nnmHw6H8/HyVlpaetXb27Nm699571bx5c3+MBgCAkar8Nrkr4XQ6FRUVJZvNJkmy2WyKjIyU0+lUWFiYd9327duVk5Oj+fPn6+23376s2woP5735OFtERINAjwAAfuWXwFdFZWWlXn75Zb366qvefwhcjpKS4/J4rEu+HgEw28GDxwI9AgBUq+DgoAse1Pol8NHR0SoqKpLb7ZbNZpPb7VZxcbGio6O9aw4ePKjdu3frd7/7nSTp6NGjsixLx48f1+TJk/0xJgAAxvBL4MPDwxUbG6vs7GwlJiYqOztbsbGxPqfnY2JitH79eu/lmTNnqry8XC+88II/RgQAwCh+exX9pEmTlJmZqYSEBGVmZiotLU2SNGLECOXl5flrDAAArgtBlmVd+hPWV7EreQ4+edw/amAiBNp7U4fxHDwA41zsOXg+yQ4AAAMReAAADETgAQAwEIEHAMBABB4AAAMReAAADETgAQAwEIEHAMBABB4AAAMReAAADETgAQAwEIEHAMBABB4AAAMReAAADETgAQAwEIEHAMBABB4AAAMReAAADETgAQAwEIEHAMBABB4AAAMReAAADETgAQAwEIEHAMBABB4AAAMReAAADETgAQAwEIEHAMBABB4AAAMReAAADETgAQAwEIEHAMBABB4AAAMReAAADETgAQAwEIEHAMBABB4AAAMReAAADETgAQAwEIEHAMBABB4AAAMReAAADETgAQAwEIEHAMBABB4AAAMReAAADETgAQAwEIEHAMBABB4AAAMReAAADETgAQAwEIEHAMBABB4AAAMReAAADETgAQAwEIEHAMBABB4AAAMReAAADETgAQAw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LMuy5syZY7388sve2ysrK/Pbz4bAOd/j6szjxbIs64MPPrCeffZZy7Isa8+ePdatt95qffTRR97tZx5TZ/BYur4cOnTIio+P9/5d8sEHH1gPPPCAtW7dOqt169bWv//9b8uyLOv06dNWt27drHXr1lmWZVkfffSRdeutt1o7duywKisrrcGDB1vff/+9ZVmWdezYMatv377ey7feeqv1l7/8xXubI0eOtJYuXWpZlmV5PB7ryJEjfvt5r1YcwV/DNm3apJYtW+qOO+6Q9OPX8N50003nXf/5559r4cKFCg7+8aUXP/0ugJycHK1du1bvvvuuoqKiJEnt27fX3LlzNWXKFHXu3JnTrdeJ8z2usrKy9N5776m8vFwul8vnOnXq1NGvfvWr8+6Tx9L1ZfPmzWrdurVuueUWSdKQIUOUlpamEydO6Oabb1ZcXJykH4/Q69atq/j4eElS//79vWcVd+3apYKCAo0dO9a738rKSu3cuVMtW7aUJA0ePNi7LT4+Xu+88452796trl27qn379n75Wa9mvMgOkqSf//zncrvd2rp1q/fP4uLitGjRIt1+++1avHixHnnkkQBOiEDat2+fXn31Vb3xxhvKzs5WRkaGKioqvNvr1q2roKDzfzc1jyWcccMNN1xw+5nHkWVZatiwoRYvXuz99dlnn6lPnz7n3Nfw4cP1zjvvKCwsTJMnT9af/vSnmvkBriEE/hrWoUMHFRQUaOPGjZJ+fMHKkSNHzru+R48eevfdd73PcZWWlnq3NWnSRH/72980bdo0LVu2TJK0Z88e1a9fXwMGDNCECRP03XffyePx1OBPhKvBuR5XTqdTtWvXVkREhDwej95///0L7qN+/fo6duyY9zKPpetLhw4dtH37dhUUFEiSFi1apNtuu0316tXzWdeiRQudOnXK+06f5cuX6+jRo5J+POgICQlRVlaWd31BQYGOHz9+ztssLCzUz372M/3617/WI488ory8vBr4ya4tnKK/hoWGhmrmzJl67bXXVF5eruDgYL3wwgvnXT9hwgRlZGTI4XDIZrOpc+fOmjhxond7dHS05s6dq8cff1ynTp2SZVmaO3eugoOD5fF4lJaW5j29D3Od73HVr18/9e/fXw0bNtQ999xzwbdf9u7dW1lZWUpMTNSAAQMUHh7OY+k6EhYWpqlTp+q5556Ty+VSWFiYXn/9dR04cMBnnd1u17Rp03xeZBcTEyNJqlWrlmbNmqWMjAy9++678ng8Cg8P1/Tp0895m3//+9+1fv161a5dW3a73efvtusV3yYHAICB+Cc0AAAGIvAAABiIwAMAYCACDwCAgQg8AAAGIvAAABiIwAOGW7p0qe6//37FxcWpW7dueuKJJy76FcLSj1/m8cMPP/hhQgA1gQ+6AQw2Z84czZ49W2lpaerWrZtq166ttWvX6tNPP1XHjh0DPd458dWfQPXgg24AQx07dkx33323MjIyzvlFMFu2bNErr7yigoIChYSEqG/fvho/frzsdruGDRum3Nxc72fMv/LKK+rfv78+//xzTZ8+Xfv27dMtt9yiSZMmqXXr1pKk7777Ti+99JJ++OEHde/eXcHBwbr55ps1ZswYSdIHH3ygv/71rzpy5IjuuOMOpaWleb/YqFWrVkpJSdG8efPkcrl0zz33qE6dOho/frx33pEjR6pLly4aPnx4zd95gAkC+E12AGrQF198YcXGxlqVlZXn3J6Xl2dt3LjRqqystPbs2WP169fPmjNnjnf7rbfeau3atct7+bvvvrO6dOlibdq0yXK5XNbChQutHj16WKdPn7ZOnz5t3XvvvdbcuXOtiooKa8WKFVabNm2sadOmWZZlWV999ZXVuXNna+vWrdbp06et9PR0Kzk52ee2hg8fbh0+fNg6efKktXnzZqtr164+X23crl076+DBgzVwTwFm4jl4wFBlZWVq2LDheU9333777erQoYNq1aqlpk2bKikpSd9+++159/fPf/5TSUlJat++vWw2mwYPHqzatWtr06ZN2rx5s1wulx555BHVrl1bffv2Vdu2bb3XXbp0qYYMGaI2bdrIbrdr7Nix2rRpk/bu3etd87vf/U6hoaEKCQlRu3bt1KBBA3399deSpGXLlqlz585q1KhRNd07gPl4ogswVGhoqA4fPnze57QLCwv12muvaevWrTp58qTcbrfatGlz3v3t379fWVlZyszM9P5ZZWWliouLFRQUpKioKJ+vjI2Ojvb+vri42Gff9erVU2hoqIqKitS0adOz1ks/ftf3kiVL1LVrVy1ZsoSvmAUuEUfwgKHi4uJkt9u1atWqc26fNGmSWrRooRUrVujf//63xowZ4/0q4XOJjo7WyJEjlZub6/21efNmORwORUREqKioyOf6TqfT+/vIyEjt27fPe7m8vFxlZWXe5+AlnfV98vfdd58+/fRT79eO9u7d+5LvA+B6RuABQzVo0ECjRo1Senq6Vq1apZMnT6qyslJffPGFpk6dqhMnTqhevXqqV6+eCgoKtGDBAp/rN2rUSHv27PFeHjp0qN5//31t3rxZlmWpvLxcq1ev1vHjx9WhQwfZbDZlZmbK5XJp1apVPt/H7XA4tHDhQm3btk0VFRWaNm2a2rVr5z16P5fGjRurbdu2ev7559W3b1+FhIRU/50EGIxX0QOGW7JkiebOnaudO3eqXr16atOmjUaOHCm3262XX35ZRUVFio2NVXx8vNatW+cN/YIFC/TWW2/p1KlTSk9PV//+/bVmzRq9+eab+uGHHxQSEqI77rhDGRkZql+/vvLy8jRx4kTt3r1b3bt3l8fjUWxsrJ566inv/t59910dPXpUcXFxSktLU+PGjSX9+Cr6lStX6uabb/aZffHixRo3bpzmzZunLl26+PeOA65xBB5AjRg6dKh+/etfa8iQIZe9j2+//VbPP/+8Pv/887NO4QO4ME7RA6gW33zzjQ4ePCiXy6VFixZpx44d6t69+2Xvr7KyUvPnz9cDDzxA3IHLwKvoAVSLwsJCPfvsszp58qSaNm2qGTNmKDIy8rL2VVBQoCFDhqh169Z69dVXq3lS4PrAKXoAAAzEKXoAAAxE4AEAMBCBBwDAQAQeAAADEXgAAAxE4AEAMND/A1SLdBxlweHwAAAAAElFTkSuQmCC\n"},"metadata":{}}],"execution_count":8},{"cell_type":"code","source":"fig, ax = plt.subplots(1,2, figsize=(24, 10))\n\np = sns.distplot(sample_train_df['session_length_action'], color=\"y\", bins= 70, ax=ax[0], kde=False)\np.set_xlabel(\"Number of actions\", fontsize = 16)\np.set_ylabel(\"Density\", fontsize = 16)\np.set_title(\"Distribution of the number of actions taken in each session\", fontsize = 14)\np.axvline(sample_train_df['session_length_action'].mean(), color='r', linestyle='--', label=\"Mean\")\n\np = sns.distplot(sample_train_df['session_length_hours'], color=\"b\", bins= 70, ax=ax[1], kde=False)\np.set_xlabel(\"Hours\", fontsize = 16)\np.set_ylabel(\"Density\", fontsize = 16)\np.set_title(\"Length of each session\", fontsize = 16);","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:57:35.511306Z","iopub.execute_input":"2025-06-08T18:57:35.511824Z","iopub.status.idle":"2025-06-08T18:57:36.330335Z","shell.execute_reply.started":"2025-06-08T18:57:35.511775Z","shell.execute_reply":"2025-06-08T18:57:36.329122Z"},"trusted":true},"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 1728x720 with 2 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAABY4AAAJmCAYAAAD7IhSMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAAsTAAALEwEAmpwYAACAeElEQVR4nOzdeXxTVf7/8XfT0rIVS7FAWxAUbangsMPIIloQ0EFw+TIwHURcGUDkq7IpDlUEkcWNTR3EBQVxAWEABRxxQYdBXMBBEAXZtKUtLUtLabrk/v7g13wJNG1Kk3uT9PV8PHg8aM7Nzeeem6Sn75ycG2IYhiEAAAAAAAAAAP4/m9UFAAAAAAAAAAD8C8ExAAAAAAAAAMAFwTEAAAAAAAAAwAXBMQAAAAAAAADABcExAAAAAAAAAMAFwTEAAAAAAAAAwAXBMQAAAAAAAWzlypVKTEzUwYMHrS7lPP/617/02muvnXf71q1blZiYqH//+98+ffx9+/Zp2LBhat++vRITE/Wvf/3Lp49XGcnJyRo3bpzVZVRZcnKyJk2aZHUZAHyA4BhB4/bbb9fUqVO9vt/ffvtNiYmJ+u9//yvp/wY4OTk5Xn8syXfHcSHeeecdXXvttWrZsqXmzZvn8f3mzZun/v37+7AyayQmJmr9+vVWl+HkcDg0ZcoUdenSRYmJidq6datpj71y5Uq1a9fOtMfzpnNf02YJlD7z9XucL/jbaxMAAPwfd8GxWZ5++mn99ttvev755/XOO++oU6dOltUSrObPn69Ro0ZZXQYAHwizugCgPJMmTdIHH3wgSQoLC1O9evV0+eWXq1+/fvrzn/+sGjVqOLedN2+ewsI8e0rPmzdPGzZs0Nq1ayvcNjY2Vl9++aXq169/YQfhxsqVK/Xkk0/q+++/P682T4/Dl06cOKGpU6dq0qRJ6tu3r+rUqVPmdomJiXrhhRfUr18/kyvE559/rpUrV2rJkiVq2rSpLrroIp88Tlnn+MYbb1TPnj198nie2rp1q4YNG6YtW7YoOjra0lo84Q99Fqy+/PJLnz3/AQBAYNu3b586duyoa665xupSgtaVV15pdQkAfIQZx/B7Xbt21ZdffqlNmzbp1VdfVXJysubOnau//vWvys/Pd24XFRWlunXrevWxCwsLFRoaqpiYGNPCXF8cx4VIS0tTcXGxrr32WjVs2NBtcIyqKS4ulmEYF3TfgwcPKiYmRu3bt1dMTIzCw8O9XJ17NWvWVIMGDUx7vGBAn/mO2c9/AAAC1TvvvKMBAwboqquuUpcuXfToo4/q+PHjLtskJibqueee05IlS5ScnKx27dpp6NCh+uWXX1y2Kykp0XPPPafu3burTZs2GjZsmPbt26fExETntxVLJwJlZGQoMTFRiYmJSk5OdtnP6dOnNXXqVHXp0kVdunTRuHHjdPLkyQqPpaioSM8995ySk5PVunVrJScn67nnnlNRUZGk//sW1e+//67Vq1c7H788hw8f1sMPP6w//vGPat26tQYOHKiPP/7YZZuDBw9q/PjxSk5O1h/+8Af16tVLqampOnHixHn7+/rrr3XnnXeqQ4cOatu2rQYMGKD33nvvvO3WrVunG264QW3bttWtt96qb775psLj379/v0aPHq2rr75aV111la699lo98MADKi4udm6Tk5OjKVOmqEePHmrdurX69eund955x2U/WVlZmjhxorp3767WrVure/fuGjFihLKzsyWd+Xvl+eefV+/evZ3Pm7/85S8uNZa1VMUPP/yg4cOHq127dmrbtq3uuOMO/fDDDy7bTJo0Sddcc4127dqllJQUtWnTRn369NHbb79d4fEDMAfBMfxeeHi4YmJi1KhRIyUlJenOO+/Um2++qV27dumVV15xbnfuEg8bN27UTTfdpD/84Q/q3Lmzhg4dqqNHj2rlypWaP3++fvnlF+fgYeXKlZLODJKWLl2q+++/X23bttVzzz3n9mvtO3bs0MCBA3XVVVfp1ltv1c6dO51tZX0l/eyvf2/dulWPPPKI8vPznTWUDq7OPY4TJ05o4sSJ6tSpk/7whz9o+PDhLoO20sfasmWL+vfvr7Zt2+r222/X4cOHy+3XtLQ0jR49Wu3atVO7du10//3368iRI8593nzzzZKk3r17KzExUb/99tt5+ygd9I0dO7bMQeC6devUu3dvtWvXTqNGjTrvq+8rVqzQjTfeqKuuukp9+/bV66+/LofD4bbm0iUwytvvpEmTNGLEiDLvd+42//jHP9StWzd16NBBc+bMkcPh0Lx583T11VerW7du+sc//nFeDUePHtV9992nNm3a6LrrrtPq1atd2jMyMvTggw+qU6dO6tSpk+677z4dOHDgvFpWrlzpHHyd/QHI2bZt26ZBgwbpqquuUteuXfXUU0+psLDQeQwzZsxQWlpamX1fqqSkRI8++qhzYNunTx8tWrTovH7+4IMPdNNNN6l169bq2rWrJk6cKMn9OS7rOb58+XJdf/31at26ta6//nq9++67Lu2JiYl655139MADD6ht27bq1avXef03f/58XXfddWrdurW6deumCRMmlHlcv/32m4YNGyZJuvrqq5WYmOgcrH7xxRdKSUlRp06d1LlzZ919993at29fmfuRziz58cQTTyg5Odl5rjZt2qRbb71VV111lfOPkNK+L+2XhQsXasqUKWrfvr2uueYal/ejspzbZ548n8tS0XPs0KFDGjlypLp166a2bdvqlltu0aeffuqyj8LCQj377LPOvu7Vq5eWLFniss2ePXs0aNAgtWnTRrfeeqt+/PHHcuty955bqqI+Le/+6enpGjlypDp37qw2bdqoX79+WrdunfO+5y5VsWfPHg0fPty5r0mTJik3N9fZXvoe8MYbb6hHjx7q1KmTHnnkEZ0+fbrcYwQAIJDNmTNHU6dOVdeuXfXiiy9qwoQJ2rx5s+69916VlJS4bLtmzRp9/vnnmjx5snPMOWrUKJdQcu7cuXr55Zc1cOBALVy4UN27dz9vuYJRo0apZ8+eio6O1jvvvKN33nlH8+fPd9lm+vTpCgkJ0TPPPKP7779fGzdu1PTp0ys8nkmTJmnRokUaOHCgXnrpJd1yyy165ZVXnGPCVq1a6Z133lF0dLR69uzpfHx30tPT9ec//1l79uzRI488ohdffFFXXnmlxowZo08++cS5XWZmpmJjY/Xoo49q8eLFGj16tP7zn//ovvvuc9nfv/71Lw0fPlxFRUWaOnWqFi5cqNtuu01paWku23377bd69dVXNXbsWD333HNyOBz629/+VmF4PmLECGVkZOjxxx/X4sWL9fDDDys8PNw5zs/Ly9Nf/vIXffHFFxozZoz+8Y9/6LrrrtPjjz+uN99807mfCRMmaPv27ZowYYJee+01TZ48WY0aNXKOixYtWqQ33nhDt99+uxYvXqwZM2bo6quvLjMoL/XTTz9p6NChOnnypGbMmKGZM2cqLy9PQ4cO1U8//eSybV5enh5++GENGDBACxcu1FVXXaXHH39c//nPf8o9fgAmMQA/NnHiROO+++4rs23EiBHGn/70J+fPQ4cONZ544gnDMAwjMzPTaNWqlbF48WLj8OHDxp49e4x3333XyMrKMk6fPm08/fTTRt++fY3MzEwjMzPTOH36tGEYhpGQkGD88Y9/NN59913j0KFDxqFDh4zDhw8bCQkJxg8//GAYhmH85z//MRISEoy+ffsaX3zxhbFnzx5jzJgxRrdu3Yz8/HzDMAxjxYoVRtu2bV3qLb1fdna2Ybfbjddff91o06aNs4a8vLzzjsMwDONvf/ub0bdvX+Prr782fvrpJ2PEiBHGNddc46x5xYoVxpVXXmnccccdxo4dO4zdu3cbAwcONO666y63/VpSUmIMHDjQGDx4sPHDDz8YP/zwgzFo0CDjlltuMRwOh3H69Gnjiy++MBISEowdO3YYmZmZRnFx8Xn7yc7ONhISEox3333XyMzMNLKzsw3DMIy5c+cabdu2NUaNGmXs3r3b+O6774xrr73W+Pvf/+687zvvvGN069bN+Oijj4xDhw4Zn3zyidG1a1fjzTffdFu3J/st6zkzd+5cl+fKxIkTjXbt2hl///vfjb179xpr1qwxEhMTjbvuusuYM2eO8euvvxrLli0zEhISjP/+97/O+yUkJBidO3c23n77bePXX381Fi5caCQmJjqfG/n5+UafPn2MiRMnGrt37zb27t1rPProo8a1117rfG7MnTvXaNOmjXHnnXcaO3fuNPbs2WMUFRWdd6xHjhwx2rRp46xx06ZNRteuXY0ZM2YYhmEYJ0+eNF544QXjmmuucen7cxUWFhrPP/+8sWPHDuPw4cPGunXrjA4dOhjvvvuuc5u3337baN26tfHqq68a+/btM/773/8aixYtKvccn/sc37hxo3HllVcab775pvHrr78aS5YsMa688krjk08+cem/Hj16GKtWrTIOHDhgzJkzx2jVqpXx+++/G4ZhGOvXrzfatWtnfPrpp8bvv/9u/PDDD26fD8XFxcaGDRuMhIQE45dffjEyMzONkydPOvezfv16Y//+/cbu3buNBx54wOjdu7dht9sNwzBcXtOFhYXGgw8+aPzpT38yjhw5YhiGYXzxxRdGu3btjPfff984ePCgsWXLFqNPnz7G008/7Xz86667zujcubPx5ptvGgcOHDCWLFliJCQkGN99912Z9ZbVZ548n8/lyXNs9+7dxrJly4yffvrJOHDggLFw4UKjVatWxt69e537efDBB40ePXoY69evNw4dOmRs2bLF+OCDDwzD+L/3qttuu83YsmWLsXfvXuOuu+4y+vXrZzgcjjLrKu8915M+rej+I0aMMIYPH27s3r3bOHTokPH5558bn3/+ufPxExISjI8++sgwDMM4deqU0a1bN2PkyJHGTz/9ZGzdutXo06ePcf/99zu3nzhxotG+fXtj8uTJxt69e43NmzcbHTp0MF566SW3fQ8AgD9bsWKFkZCQYBw4cKDM9sOHDxstW7Y05s2b53L7N998YyQkJBgff/yx87aEhATj+uuvNwoLC523ffTRR0ZCQoLx7bffGoZhGMePHzfatm1rpKamuuzv1VdfNRISEoy5c+c6b5s4caLRo0eP82oqHXNMmDDB5fYnnnjCaN26tdtxh2EYxp49e857HMMwjAULFhgJCQnG7t27nbf16NHDmDhxott9lXrkkUeMLl26GDk5OS63Dx8+3BgwYIDb+xUVFRnbtm0zEhISjB9//NEwDMNwOBzGddddZ9xyyy1GSUmJ2/ted911RseOHY3jx487b/vhhx+MhIQE45///Kfb+5WO0f/1r3+53Wb+/PlG69atjf3797vcPnnyZKNz587Ov0Hatm1rvPHGG273c9999xmjR4922156HGf38ZgxY4wOHToYJ06ccN6Wm5trdOrUyWVfEydONBISEowtW7Y4b7Pb7Ubnzp2Nxx57rNzHBGAO6xdSBS7Q5Zdfri1btpTZlpmZqaKiIvXt21fx8fGSpISEBGd77dq1FRYWppiYmPPue+ONN2rQoEHOn8uaaSud+fS8R48ekqQZM2aoZ8+eWrt2rct93QkPD1dkZKRCQkLKrKHUgQMHtGnTJr311lvOizjMnj1b1157rdasWeN8rOLiYk2ZMkWXXXaZJOmuu+7So48+KsMwFBISct5+t2zZoj179ujjjz9WkyZNJEnPPPOMrr/+em3ZskVdu3ZVVFSUJCk6OtptjaXrykZGRp63TXFxsZ5++mlFRkZKkv785z87Z3ZL0sKFCzVu3DjnurlNmzbVoUOHtGzZMg0dOtRtn1S0X09FRkYqNTVVoaGhatGihV599VVlZWXp4YcfliRdeumlWrRokbZu3arWrVs773f99ddryJAhkqSRI0dq69ateuONNzRnzhytW7dOhmFoxowZzn4vndXx6aef6sYbb5R05mt1s2bN0sUXX+y2vmXLlqlhw4Z6/PHHZbPZ1KJFCz388MOaMmWKxo4dq8jISNWpU8e5lIo7NWrU0NixY50/N2nSRLt27dK6deucz5+FCxfqjjvu0J133uncrvSYyzvHZ1u8eLEGDBjgPHeXXnqpfvzxRy1atMhlNvTAgQM1cOBASWdmMS9ZskTbtm3TwIEDlZaWppiYGHXr1k01atRQXFycrrrqqjIfLzQ01LmmbXR0tMsax3379nXZdsaMGerQoYN++OEHdezY0Xn76dOn9be//U25ubl66623nM/5l156SXfffbduu+02SdIll1yi8ePHa/z48ZowYYLz3Hbr1s15vLfffrvefPNNbdmypVIXwKvs89mT51jLli3VsmVL531GjhypTz/9VBs2bNCoUaN04MABrVu3TosWLXKu9de0adPzHmvs2LH64x//KOnM+11KSooyMjLUuHHj87at6D23oj6t6P6///67+vbt6zyusuottXbtWp0+fVqzZs1yLvszdepUDRs2TAcPHlSzZs0kSXXr1tUTTzzhfA/o16+ftmzZct43FgAACAb//ve/5XA4NGDAAJdZw23atFGdOnW0bds29e7d23l7165dXa4nU/p7OT09XZL0888/Kz8//7zrnPTt21dPP/10pWo79xoQCQkJKiws1NGjR92OP7dt2yZJGjBggMvtAwYM0AsvvKBt27a5jIc8sXnzZvXs2VORkZEufdS9e3fNmjVLeXl5qlu3rgoLC/Xqq69q1apVSktLk91ud267f/9+XXnllfr111/1+++/695775XNVv4Xvdu2betyrYbS5TRK+7os9evXV9OmTfXMM88oOztbnTt3VvPmzc87njZt2qhJkybnHc97772nvXv3qmXLlmrdurUWL14swzD0xz/+UQkJCS5/Q1511VV6+eWX9dxzz6lHjx76wx/+UOESYdu2bdO1116revXqOW+rW7eukpOTz/smXK1atZxjTunM38rNmzc/b2Y2AGsQHCNguQtFJally5bq2rWr+vfvr+7du+vqq69Wv379PLqA1tkhYXnODofq1KmjhIQE7d2717PiPbRv3z7ZbDa1bdvWeVtkZOR5jxUeHu4MjSWpYcOGKioq0okTJ5xh2Ln7bdiwoTM0ls4EMQ0bNtTevXvVtWvXKtceFxfnDMNKaypdJysnJ0fp6elKTU3VE0884dzGk/V+y9tvZVx++eUKDQ11/nzxxRe77FeSGjRocN6+zz4XpT9//vnnkqQff/xRv/32m9q3b++yzenTp12WDmnUqFG5obF05hy1adPGZaDZoUMHFRUV6eDBg5UaCL/99tt67733nAPboqIiZziXnZ2tjIwMXX311R7vryy//vqrMxQ8u95Nmza53Hb2unJhYWGKjo52Ls3Qr18/LVmyRL169VL37t3Vo0cP9erVq9Jr1x46dEgvvPCCduzYoZycHBmGIYfDcd7ge/z48YqJidGSJUtUu3Zt5+0//vijfvjhB5elJxwOhwoKCpSVlaWGDRuedyzSmediRctMnKuyz2dPnmP5+fmaP3++PvvsM2VlZam4uFh2u91Z765du2Sz2VwG6GU5+/hKjzk7O7vM4Lii99yK+rSi+w8bNkyPP/64Nm/erD/+8Y/OJVHKUrq24tlrxbdr1042m0179+51Bsfnvgc0bNhQO3bsKLdPAAAIVKXji+uvv77M9nPXOT73orOl47HSkDQrK0uSzrt+Q0Vj3LKc+/fKuY9VltJlEs4Nlkt/Lm8ZBXdycnK0atUqrVq1qsz2Y8eOqW7dunr22Wf11ltvadSoUWrXrp3q1KmjjIwM3X///c6aS/uzrHHTuSrq67KEhITotdde07x58/TMM8/o+PHjatKkie6++26lpKQ4j+fgwYNq1apVmfsorfH555/X/Pnz9corr+ipp55STEyMhgwZolGjRslms2nEiBEKDw/XmjVr9NJLL6l27drq16+fxo8f7/bv6xMnTpQZ+l988cXnnZuzw+Wz++DsJc0AWIfgGAFr3759bmedhYaG6tVXX9X27dv11Vdf6f3333f+gq8ocKtVq1aVa7PZbOcFoGd/yusNZ4fm5164r7StvPWCPdlvVZw9Q6F0v6V9UlrXE088UanZmRXtt6yfpbL7vqw+q2jfFXE4HGrZsqWee+6589rOHhCeHVJeiMqcow8//FBPPfWUJk6cqHbt2qlu3bpaunSp/vWvf1WpBk+dW2tZ/V76fIiNjdX69eu1ZcsW/fvf/9bMmTO1YMECvfvuu5XqsxEjRqhx48aaOnWqGjVqpNDQUP3pT39yXiilVM+ePbV69Wp999136t69u/N2h8Oh+++//7wZNJJcBsflHYunKvuc8+Q5NnPmTG3evFkTJ05Us2bNVKtWLU2cOPG846/I2cdX0XtKRe+5FfVpRfcfNGiQevTooc8//1z//ve/NWTIEI0YMUJjxoyp1DFV9L5Zmdc7AACBpDScffXVV8sM6sqabFKe0lAwOztbV1xxhfP2s69v4Eul456jR4/qkksucd5eGmifG8Z6IioqSh06dNC9995bZnujRo0knfkG2MCBA13Wcz53Pd769etLOnNtCl9p2rSpZs2aJcMw9NNPP+mtt97SE088ofj4ePXs2VNRUVGKjo7W5MmTy7z/pZdeKulM+J+amqrU1FT9+uuvWrVqlebNm6fo6GilpKSoRo0auu+++3TfffcpKytLn332mWbMmKHTp0/r+eefL3PfF110UZnPhaNHj17QuQFgHS6Oh4D0888/a/Pmzed9Jf1sISEhzou+rVixQg0bNtSHH34o6UxYc+4FICpr+/btzv/n5+frl19+UYsWLSSdGSicPn1aeXl5zm12797tcn9PamjRooUcDofLY+Xl5ennn392PtaFaNGihTIzM12W4Th8+LAyMzN1+eWXV2pfNWrUqHRYdvHFF6thw4Y6dOiQmjVrdt6/qoiOjnYOGEud2/dVce6MxB07djhne7dq1UqHDh1S/fr1zzumyg7GW7RooR07drj07bfffqsaNWq4DI4r8u2336pNmzYaOnSoWrVqpWbNmunQoUPO9gYNGqhRo0Zul32RPDvHl112mb777rvzHruyz9OIiAhde+21evTRR/X+++/rl19+OW+/Z9cluYaZx44d06+//qoRI0aoa9euatGihU6dOlXmhweDBg3So48+qtGjR+urr75y3l769cKynpvnho1m8+Q59t133+nmm292Lu3QuHFjl3OelJQkh8Ph9QuOlPee60mflnd/6cyMncGDB+uFF17QAw884PbiNi1atNDPP//s8v77/fffy+FwVOl9EwCAQNatWzfZbDalpaXpqquuOu9fectAlSUhIUG1a9d2uTitpPN+ls7MHi1v9uyFKF3G7+yL5UpnLuonSZ07d670Pnv06KE9e/boiiuuKLOPSmcCFxQUnDcmPHepsUsvvVTx8fF67733fP7BdEhIiJKSkvTII49IkvNC6j169ND+/fudy7+d++/sb2eVuuyyy/TQQw/poosucrkge6mYmBgNGjRIXbt2LbO9VKdOnfTFF1+4jMfy8vL06aefXtC5AWAdZhzD7xUWFiorK0sOh0PHjh3Tli1b9NJLL6lVq1a66667yrzP9u3b9e9//1vdu3fXxRdfrF27dik9Pd0ZGsTHxystLU0//vijYmNjVbdu3Up/Hf7FF19UdHS0GjZsqAULFqhGjRrq37+/pDNrhdWuXVvPPPOMhg8frp9++knLli1zuX98fLzsdru++uorJSUlqVatWufNdm7evLl69eqlKVOm6Mknn1RkZKSee+451a1bVzfddFOl6j1b165dlZiYqHHjxjk/gZ42bZquvPLKCr++fq74+Hht2bJFnTp1Unh4uMefID/wwAN68sknVa9ePV1zzTUqLi7Wrl27lJGRUaU1Rv/4xz/qlVde0fvvv69OnTpp48aN+u677zz6mpgnNm7cqKuuukqdO3fWhg0btGXLFr377ruSpJtuukmLFy/WqFGj9MADDyg2NlZHjhzRJ598oiFDhpy37lh5UlJS9MYbb+jxxx/XHXfcocOHD+uZZ57R0KFDKzUrvnnz5lq5cqU+//xzNWvWTOvWrdO2bdtcztPf/vY3zZgxQxdffLF69uypgoICbdmyxfn68uQc33PPPRo7dqxat26tbt26afPmzVqzZo3mzZvnca0rV65USUmJ/vCHP6h27dr66KOPVKNGDbcfJsTHxyskJESfffaZkpOTFRERoYsuukj169fXe++9p9jYWGVkZGjWrFluA9/BgwfLMAyNHj1aCxYsULdu3TR69Gj97W9/U1xcnG644QaFhobql19+0Q8//KAJEyZ4fDy+4MlzrHnz5vr444/Vq1cvhYWFacGCBS5/rF166aW64YYb9Nhjj2ny5Mm68sorlZGRod9++00333zzBdVV0XtuRX1a0f2nTZuma665Rpdeeqny8vK0efNmtx9y3XTTTZo7d64mTpyoBx54QCdPntSUKVPUp0+fKn8wBQCAv9u8efN5kyYiIyPVrVs33XvvvXryySe1f/9+de7cWREREUpPT9dXX32lQYMGVervgIsuukjDhg3Tyy+/rDp16qhr16768ccftWLFCkmu3/Jp0aKFjh8/rmXLlql169aKiIg4b8mvykpISFD//v01f/58lZSUqF27dvr+++/14osvqn///he0/wceeECDBg3SX//6Vw0dOlTx8fE6efKkfv75Zx0+fFgzZsyQdCaQXbVqlRISEtSsWTNt3LhR33//vcu+QkJC9Oijj2rMmDEaNmyY/vKXv6h+/fr69ddflZ2drQceeKBKx//TTz9p+vTpuvHGG9WsWTOVlJTogw8+UFhYmPM8Dh8+XB9++KFSUlI0fPhwXXrppTp9+rR+/fVXffPNN3rxxReVm5ur4cOH66abbtJll12mGjVq6JNPPtGJEyfUrVs3SWeul9GyZUu1atVK9erV065du7R582YNHjzYbX2jRo3SZ599puHDh+vee+9VSEiIFi1apNOnT2v06NFVOnYA5iI4ht8rDRNCQ0Od6/uOGTNGf/7zn92GvZGRkfruu+/01ltv6eTJk4qNjdWoUaOcF+Xq27evPv74Yw0fPlwnT57UjBkzdOutt1aqrocfflhPP/209u/fryuuuMK53pN05mtOs2fP1uzZs7VixQp16tRJY8eOdQmd2rdvryFDhuihhx7S8ePHdf/995f5tesZM2boqaee0siRI2W329W+fXu98sorqlmzZqXqPVtISIgWLlyoadOmadiwYZLOhMl///vfK71UxcSJE/X000/r2muvVaNGjc5b09adQYMGqVatWlq8eLGeeeYZ1axZU5dffnm5F8bzRI8ePXT//ffr+eef1+nTp3XTTTcpJSXF47oqMmbMGG3YsEHTpk1TdHS0ZsyYoT/84Q+SzixzsnTpUj3zzDMaO3ascnNz1bBhQ3Xp0qXMrwSWp1GjRlq0aJFmzZqlgQMHql69eurfv78eeuihSu1n8ODB2r17t8aNGyfDMNSnTx/deeedLrMiSr+C9tprr2nOnDm66KKLnBdNkzw7x71799Zjjz2mV199VU899ZTi4uKUmprqcmG8itSrV0+LFi3SzJkzVVxcrBYtWmjevHluZ8A0atRIY8aM0fPPP6/HHntMN998s55++mk999xzmj59uvr3769mzZo5A0R3hgwZ4hIe9+jRQy+//LIWLlyoV199VaGhoWrevHml3yN8wZPn2KRJkzR58mT99a9/Vb169XTHHXecN8tn1qxZev755zVt2jQdO3ZMjRs31vDhwy+4rorecyvq04rubxiGpk2bpvT0dNWpU0dXX321Jk2a5LaPFi9erKeeekqDBg1SRESEevXq5fZrmgAABJMnn3zyvNuuuOIKrV27Vg899JAuu+wyLVu2TMuWLVNISIgaN26sq6++ulITHEqVjq/ef/99vfnmm2rTpo1mzJihv/zlLy7XcBg0aJB27Nih5557TidPnlR8fLxXxuYzZsxQkyZNtGLF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S5YAAGpra6FWq+Hs7AyFQuEwp4uLC3JyclBUVISCggIkJibi999/R1lZGYKDg7Fp06Zp3UNTUxPMZjPWrVuHwMBADA0Noa6uDhKJBCtWrJj2MyEiIiKiuUmn0+Hs2bNIT09HVlYWnJycUFVVhaGhIWRnZwv9NmzYALPZjJdffhlJSUn45ZdfUFtbK8T6U2F8SkSzCRPHRDRnJCUlobq6GleuXBG1y2QyvP322yguLkZeXh4WLlwInU6HL7/8El999dU9X4fJZMLrr78Ok8kEqVSKnTt3QqfTCeelUinef/99GI1GVFVVoaurC1KpFHK5HE8//fSM51Wr1Th8+DCMRiPy8vLg5uYGlUqFwsJC+Pn5TXu8kJAQlJSUoKKiAjt37sSiRYuQn58Pq9Uqem5ubm6orq6GwWBAQ0MDjEYjvL29sXLlSqH0xJNPPgmNRoNjx47BaDRibGwM33///aTzpqSkYP78+aiuroZOp4NEIoFarUZhYeG0k/2LFy/G/PnzYTKZ0N3dDYlEAoVCgdraWlH5DSIiIiL6dwsNDUVdXR1KS0uxe/dujI2NITIyEvX19QgNDRX6rV69Gvv370dNTQ0+//xzhIWFoaSkBDk5OX9pHsanRDSbOI39edsYEREREREREREREf3rscYxEREREREREREREYkwcUxEREREREREREREIkwcExEREREREREREZEIE8dEREREREREREREJMLEMRERERERERERERGJMHFMRERERERERERERCJMHBMRERERERERERGRCBPHRERERERERERERCTCxDERERERERERERERifwHalca/oQ/UY0AAAAASUVORK5CYII=\n"},"metadata":{}}],"execution_count":9},{"cell_type":"markdown","source":"Something seems a bit odd with the minutes plot. All the sessions are capped at 650 hours - this needs looking into .. 🤔","metadata":{}},{"cell_type":"code","source":"print(f'{round(len(sample_train_df[sample_train_df[\"session_length_action\"]<10])/len(sample_train_df),3)*100}% of the sessions had less than 10 actions')","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:57:36.332056Z","iopub.execute_input":"2025-06-08T18:57:36.332395Z","iopub.status.idle":"2025-06-08T18:57:36.413857Z","shell.execute_reply.started":"2025-06-08T18:57:36.332364Z","shell.execute_reply":"2025-06-08T18:57:36.412734Z"},"trusted":true},"outputs":[{"name":"stdout","text":"34.8% of the sessions had less than 10 actions\n","output_type":"stream"}],"execution_count":10},{"cell_type":"code","source":"article_id_freq = list(overall_article_id_counts.values())\ncut_off = [i for i in article_id_freq if i<30]\n\nplt.figure(figsize=(8,6))\nsns.distplot(cut_off, bins=30, kde=False);\nplt.title(f'Article ID frequency', fontsize=12)\nplt.ylabel('Count', fontsize=12)\nplt.xlabel('Article', fontsize=12);","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:57:36.415297Z","iopub.execute_input":"2025-06-08T18:57:36.415663Z","iopub.status.idle":"2025-06-08T18:57:36.925121Z","shell.execute_reply.started":"2025-06-08T18:57:36.41563Z","shell.execute_reply":"2025-06-08T18:57:36.923412Z"},"trusted":true},"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 576x432 with 1 Axes>","image/png":"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\n"},"metadata":{}}],"execution_count":11},{"cell_type":"markdown","source":"As we can see from the plot above the vast majority of atricles have a very small number of actions relating to them. There are some exceptions..","metadata":{"execution":{"iopub.status.busy":"2022-11-02T00:44:03.271921Z","iopub.execute_input":"2022-11-02T00:44:03.272395Z","iopub.status.idle":"2022-11-02T00:44:03.565989Z","shell.execute_reply.started":"2022-11-02T00:44:03.272355Z","shell.execute_reply":"2022-11-02T00:44:03.564369Z"}}},{"cell_type":"code","source":"### Look at the most interacted with articles ###\nprint(f'Frequency of most common articles: {sorted(list(overall_article_id_counts.values()))[-5:]} \\n')\nres = nlargest(5, overall_article_id_counts, key = overall_article_id_counts.get)\nprint(f'IDs for those common articles: {res}')","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:57:36.927384Z","iopub.execute_input":"2025-06-08T18:57:36.927852Z","iopub.status.idle":"2025-06-08T18:57:37.271018Z","shell.execute_reply.started":"2025-06-08T18:57:36.927813Z","shell.execute_reply":"2025-06-08T18:57:37.269689Z"},"trusted":true},"outputs":[{"name":"stdout","text":"Frequency of most common articles: [3877, 4259, 4323, 4503, 5000] \n\nIDs for those common articles: [29735, 1603001, 832192, 1733943, 108125]\n","output_type":"stream"}],"execution_count":12},{"cell_type":"markdown","source":"# <span style=\"font-family:verdana; word-spacing:1.5px;\">   Baseline 📈\n    \n<span style=\"font-family:verdana; word-spacing:1.5px;\"> The `test data` contains truncated session data similar to that of the training data. The task is to <span style=\"color:#159364;\"> predict the next aid clicked </span> after the session truncation, as well as the the remaining aids that are added to carts and orders; you may predict up to 20 values for each session type\n    \n<span style=\"font-family:verdana; word-spacing:1.5px;\"> Submissions are evaluated on <span style=\"color:#159364;\"> Recall </span> each action type, and the three recall values are weight-averaged: <span style=\"color:#159364;\"> {'clicks': 0.10, 'carts': 0.30, 'orders': 0.60} </span>. It is important to get the 'orders' predictions correct as they carry most of the weigthing :)\n    \n<span style=\"font-family:verdana; word-spacing:1.5px;\"> For each <span style=\"color:#159364;\"> session</span> in the test data, your task it to predict the <span style=\"color:#159364;\"> aid</span> values for each <span style=\"color:#159364;\"> type</span> that occur after the last timestamp ts the test session. In other words, the test data contains sessions truncated by timestamp, and you are to predict what occurs after the point of truncation.\n\n<span style=\"font-family:verdana; word-spacing:1.5px;\"> For <span style=\"color:#159364;\"> clicks </span>there is only a single ground truth value for each session, which is the next <span style=\"color:#159364;\"> aid</span> clicked during the session (although you can still predict up to 20 aid values). The ground truth for <span style=\"color:#159364;\"> carts</span> and <span style=\"color:#159364;\"> orders</span> contains all <span style=\"color:#159364;\"> aid </span>values that were added to a cart and ordered respectively during the session.\n    \nEach session and type combination should appear on its own session_type row in the submission (3 rows per session), and predictions should be space delimited. This can be seen in the `sample_test_df` below..","metadata":{}},{"cell_type":"code","source":"with open(TEST_PATH, 'r') as f:\n    print(f\"We have {len(f.readlines()):,} lines in the test data\")","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:57:37.272592Z","iopub.execute_input":"2025-06-08T18:57:37.272965Z","iopub.status.idle":"2025-06-08T18:57:44.168645Z","shell.execute_reply.started":"2025-06-08T18:57:37.272931Z","shell.execute_reply":"2025-06-08T18:57:44.166955Z"},"trusted":true},"outputs":[{"name":"stdout","text":"We have 1,671,803 lines in the test data\n","output_type":"stream"}],"execution_count":13},{"cell_type":"code","source":"# Load in a sample to a pandas df\n\nsample_size = 150\n\nchunks = pd.read_json(TEST_PATH, lines=True, chunksize = sample_size)\n\nfor c in chunks:\n    sample_test_df = c\n    break","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:57:44.17071Z","iopub.execute_input":"2025-06-08T18:57:44.171354Z","iopub.status.idle":"2025-06-08T18:57:44.190183Z","shell.execute_reply.started":"2025-06-08T18:57:44.171286Z","shell.execute_reply":"2025-06-08T18:57:44.188598Z"},"trusted":true},"outputs":[],"execution_count":14},{"cell_type":"code","source":"sample_test_df.head()","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:57:44.192608Z","iopub.execute_input":"2025-06-08T18:57:44.193709Z","iopub.status.idle":"2025-06-08T18:57:44.240562Z","shell.execute_reply.started":"2025-06-08T18:57:44.193662Z","shell.execute_reply":"2025-06-08T18:57:44.238744Z"},"trusted":true},"outputs":[{"execution_count":15,"output_type":"execute_result","data":{"text/plain":"    session                                             events\n0  12899779  [{'aid': 59625, 'ts': 1661724000278, 'type': '...\n1  12899780  [{'aid': 1142000, 'ts': 1661724000378, 'type':...\n2  12899781  [{'aid': 141736, 'ts': 1661724000559, 'type': ...\n3  12899782  [{'aid': 1669402, 'ts': 1661724000568, 'type':...\n4  12899783  [{'aid': 255297, 'ts': 1661724000572, 'type': ...","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>session</th>\n      <th>events</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>12899779</td>\n      <td>[{'aid': 59625, 'ts': 1661724000278, 'type': '...</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>12899780</td>\n      <td>[{'aid': 1142000, 'ts': 1661724000378, 'type':...</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>12899781</td>\n      <td>[{'aid': 141736, 'ts': 1661724000559, 'type': ...</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>12899782</td>\n      <td>[{'aid': 1669402, 'ts': 1661724000568, 'type':...</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>12899783</td>\n      <td>[{'aid': 255297, 'ts': 1661724000572, 'type': ...</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}],"execution_count":15},{"cell_type":"markdown","source":"<span style=\"font-family:verdana; word-spacing:1.5px;\"> Below shows a sample submission. For each `session` in the test set there is a prediction (`labels`). This predicts what articles will be next interacted with in that session. For each session there are three actions (clicks, carts, orders), predictions are made for all three actions.","metadata":{}},{"cell_type":"code","source":"sample_submission = pd.read_csv(SAMPLE_SUB_PATH)\nsample_submission.head()","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:57:44.242688Z","iopub.execute_input":"2025-06-08T18:57:44.243301Z","iopub.status.idle":"2025-06-08T18:57:51.018031Z","shell.execute_reply.started":"2025-06-08T18:57:44.243254Z","shell.execute_reply":"2025-06-08T18:57:51.016811Z"},"trusted":true},"outputs":[{"execution_count":16,"output_type":"execute_result","data":{"text/plain":"      session_type                labels\n0  12899779_clicks  129004 126836 118524\n1   12899779_carts  129004 126836 118524\n2  12899779_orders  129004 126836 118524\n3  12899780_clicks  129004 126836 118524\n4   12899780_carts  129004 126836 118524","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>session_type</th>\n      <th>labels</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>12899779_clicks</td>\n      <td>129004 126836 118524</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>12899779_carts</td>\n      <td>129004 126836 118524</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>12899779_orders</td>\n      <td>129004 126836 118524</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>12899780_clicks</td>\n      <td>129004 126836 118524</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>12899780_carts</td>\n      <td>129004 126836 118524</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}],"execution_count":16},{"cell_type":"markdown","source":"<span style=\"font-family:verdana; word-spacing:1.5px;\"> Lets find the most common article for each different type of action.","metadata":{}},{"cell_type":"code","source":"sample_size = 150000\n\nchunks = pd.read_json(TRAIN_PATH, lines=True, chunksize = sample_size)\n\nclicks_article_list = []\ncarts_article_list = []\norders_article_list = []\n\nfor e, c in enumerate(chunks):\n    \n    # Save time by not using all the data\n    if e > 2:\n        break\n    \n    sample_train_df = c\n    \n    for i, row in c.iterrows():\n        actions = row['events']\n        for action in actions:\n            if action['type'] == 'clicks':\n                clicks_article_list.append(action['aid'])\n            elif action['type'] == 'carts':\n                carts_article_list.append(action['aid'])\n            else:\n                orders_article_list.append(action['aid'])\n    ","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:57:51.019417Z","iopub.execute_input":"2025-06-08T18:57:51.019766Z","iopub.status.idle":"2025-06-08T18:59:14.859974Z","shell.execute_reply.started":"2025-06-08T18:57:51.019734Z","shell.execute_reply":"2025-06-08T18:59:14.858864Z"},"trusted":true},"outputs":[],"execution_count":17},{"cell_type":"code","source":"# Create dictionaries with articles and their frequencies\narticle_click_freq = Counter(clicks_article_list)\narticle_carts_freq = Counter(carts_article_list)\narticle_order_freq = Counter(orders_article_list)","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:59:14.861466Z","iopub.execute_input":"2025-06-08T18:59:14.861861Z","iopub.status.idle":"2025-06-08T18:59:23.583142Z","shell.execute_reply.started":"2025-06-08T18:59:14.861829Z","shell.execute_reply":"2025-06-08T18:59:23.581989Z"},"trusted":true},"outputs":[],"execution_count":18},{"cell_type":"code","source":"# Get the 20 most frequent articles for each action\ntop_click_article = nlargest(20, article_click_freq, key = article_click_freq.get)\ntop_carts_article = nlargest(20, article_carts_freq, key = article_carts_freq.get)\ntop_order_article = nlargest(20, article_order_freq, key = article_order_freq.get) ","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:59:23.585002Z","iopub.execute_input":"2025-06-08T18:59:23.585504Z","iopub.status.idle":"2025-06-08T18:59:24.208417Z","shell.execute_reply.started":"2025-06-08T18:59:23.585457Z","shell.execute_reply":"2025-06-08T18:59:24.207341Z"},"trusted":true},"outputs":[],"execution_count":19},{"cell_type":"code","source":"# Create a dict with this info\nfrequent_articles = {'clicks': top_click_article, 'carts':top_carts_article, 'order':top_order_article}","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:59:24.20994Z","iopub.execute_input":"2025-06-08T18:59:24.210287Z","iopub.status.idle":"2025-06-08T18:59:24.215846Z","shell.execute_reply.started":"2025-06-08T18:59:24.210256Z","shell.execute_reply":"2025-06-08T18:59:24.214482Z"},"trusted":true},"outputs":[],"execution_count":20},{"cell_type":"code","source":"for action in ['clicks', 'carts', 'order']:\n    print(f'Most frequent articles for {action}: {frequent_articles[action][:5]}') # Correction by @danielliao 🙏","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:59:24.217617Z","iopub.execute_input":"2025-06-08T18:59:24.218717Z","iopub.status.idle":"2025-06-08T18:59:24.22862Z","shell.execute_reply.started":"2025-06-08T18:59:24.218654Z","shell.execute_reply":"2025-06-08T18:59:24.227353Z"},"trusted":true},"outputs":[{"name":"stdout","text":"Most frequent articles for clicks: [29735, 1733943, 108125, 1603001, 832192]\nMost frequent articles for carts: [80222, 29735, 1733943, 166037, 485256]\nMost frequent articles for order: [80222, 166037, 1022566, 351335, 1629608]\n","output_type":"stream"}],"execution_count":21},{"cell_type":"markdown","source":"<span style=\"font-family:verdana; word-spacing:1.5px;\"> There is some overlap but the articles do change for the different actions!\n    \n<span style=\"font-family:verdana; word-spacing:1.5px;\"> This baseline will use the fact that people will often interact with articles they have previouslt interacted with. The prediction will consist of the top 20 most frequent articles in the session. If there are less than 20 articles in the session the prediction will be padded with the most frequent articles in the training data as found above.","metadata":{}},{"cell_type":"code","source":"test_data = pd.read_json(TEST_PATH, lines=True, chunksize=1000)\n\npreds = []\n\nfor chunk in tqdm(test_data, total=1671):\n    \n    for i, row in chunk.iterrows():\n        actions = row['events']\n        article_id_list = []\n        for action in actions:\n            article_id_list.append(action['aid'])\n            \n        # Get 20 most common article ID for the session\n        article_freq = Counter(article_id_list)\n        top_articles = nlargest(20, article_freq, key = article_freq.get)\n        \n        # Pad with most popular items in training\n        padding_size = (20 - len(top_articles)) # Correction by @danielliao 🙏\n        for action in ['clicks', 'carts', 'order']:\n            top_articles_added = top_articles + frequent_articles[action][:padding_size] # Correction by @danielliao 🙏\n            preds.append(\" \".join([str(id) for id in top_articles_added]))","metadata":{"execution":{"iopub.status.busy":"2025-06-08T18:59:24.232825Z","iopub.execute_input":"2025-06-08T18:59:24.233217Z","iopub.status.idle":"2025-06-08T19:03:18.03374Z","shell.execute_reply.started":"2025-06-08T18:59:24.233184Z","shell.execute_reply":"2025-06-08T19:03:18.031854Z"},"trusted":true},"outputs":[{"output_type":"display_data","data":{"text/plain":"  0%|          | 0/1671 [00:00<?, ?it/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"d8d62838c8fb4d7699d664e7495e836e"}},"metadata":{}}],"execution_count":22},{"cell_type":"code","source":"# Predict the 20 most common atricles for each test session\nsample_submission['labels'] = preds","metadata":{"execution":{"iopub.status.busy":"2025-06-08T19:03:18.035643Z","iopub.execute_input":"2025-06-08T19:03:18.036116Z","iopub.status.idle":"2025-06-08T19:03:18.744908Z","shell.execute_reply.started":"2025-06-08T19:03:18.036071Z","shell.execute_reply":"2025-06-08T19:03:18.743277Z"},"trusted":true},"outputs":[],"execution_count":23},{"cell_type":"code","source":"sample_submission.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2025-06-08T19:06:43.509652Z","iopub.execute_input":"2025-06-08T19:06:43.510154Z","iopub.status.idle":"2025-06-08T19:07:08.732367Z","shell.execute_reply.started":"2025-06-08T19:06:43.510116Z","shell.execute_reply":"2025-06-08T19:07:08.731031Z"},"trusted":true},"outputs":[],"execution_count":25},{"cell_type":"markdown","source":"# Where to go next 🚀\n\n- At the moment we pad every prediction with the same most frequently occuring articles. The model could be improved if we looked at which articles co-occured frequently in the same session ([KJ](https://www.kaggle.com/code/whitelily/co-occurrence-baseline) and [VLADIMIR SLAYKOVSKIY](https://www.kaggle.com/code/vslaykovsky/co-visitation-matrix) have started looking at this).\n\n- While shopping there is a common sequence of events: click -> cart -> order. Currently we look at which articles are most common for each action but surely the most likely item to be ordered is one already in the cart 🤔\n","metadata":{}},{"cell_type":"markdown","source":"# WIP :)","metadata":{}},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}