{"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":[{"sourceType":"competition","sourceId":38760,"databundleVersionId":4493939}],"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 - Baseline</center> </h1>\n\n***","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19"}},{"cell_type":"markdown","source":"### <span style=\"font-family:verdana; word-spacing:1.5px;\">  Task overview\n    \nЦель этого соревнования — предсказать клики в e-commerce, добавления товаров в корзину и заказы. Вам нужно построить рекомендательную систему с несколькими целями, основанную на предыдущих событиях в пользовательской сессии.\n\nСовременные рекомендательные системы состоят из различных моделей с разными подходами — от простой матричной факторизации до глубоких нейронных сетей типа transformer. Однако не существует одной модели, которая могла бы одновременно оптимизировать несколько целей. В этом соревновании вам нужно построить единое решение для предсказания кликов, добавлений в корзину и конверсий на основе предыдущих событий в той же сессии.","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":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:47:43.328826Z","iopub.execute_input":"2026-03-19T12:47:43.329375Z","iopub.status.idle":"2026-03-19T12:47:43.884562Z","shell.execute_reply.started":"2026-03-19T12:47:43.329266Z","shell.execute_reply":"2026-03-19T12:47:43.882925Z"}},"outputs":[],"execution_count":null},{"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":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:47:43.890324Z","iopub.execute_input":"2026-03-19T12:47:43.890892Z","iopub.status.idle":"2026-03-19T12:47:43.898394Z","shell.execute_reply.started":"2026-03-19T12:47:43.890839Z","shell.execute_reply":"2026-03-19T12:47:43.896863Z"}},"outputs":[],"execution_count":null},{"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":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:47:43.904920Z","iopub.execute_input":"2026-03-19T12:47:43.905346Z","iopub.status.idle":"2026-03-19T12:49:36.730804Z","shell.execute_reply.started":"2026-03-19T12:47:43.905310Z","shell.execute_reply":"2026-03-19T12:49:36.729099Z"}},"outputs":[],"execution_count":null},{"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":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:49:36.736916Z","iopub.execute_input":"2026-03-19T12:49:36.737342Z","iopub.status.idle":"2026-03-19T12:49:49.101323Z","shell.execute_reply.started":"2026-03-19T12:49:36.737306Z","shell.execute_reply":"2026-03-19T12:49:49.100190Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample_train_df.set_index('session', drop=True, inplace=True)\nsample_train_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:49:49.107074Z","iopub.execute_input":"2026-03-19T12:49:49.107495Z","iopub.status.idle":"2026-03-19T12:49:49.208051Z","shell.execute_reply.started":"2026-03-19T12:49:49.107461Z","shell.execute_reply":"2026-03-19T12:49:49.206567Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# <span style=\"font-family:verdana; word-spacing:1.5px;\">   Data structure 🗂\n    \n**session** — уникальный идентификатор сессии. Каждая сессия содержит список событий, упорядоченных по времени.\n\n**events** — последовательность событий в сессии, упорядоченная по времени. Каждое событие содержит 3 поля:\n\n- **aid** — идентификатор товара (код продукта), связанного с событием\n- **ts** — Unix timestamp события  \n  (Unix time — это количество миллисекунд, прошедших с 00:00:00 UTC 1 января 1970 года)  \n- **type** — тип события, то есть был ли товар:\n  - просмотрен / кликнут (**clicks**),\n  - добавлен в корзину (**carts**),\n  - заказан в рамках сессии (**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":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:49:49.214053Z","iopub.execute_input":"2026-03-19T12:49:49.214505Z","iopub.status.idle":"2026-03-19T12:49:49.225422Z","shell.execute_reply.started":"2026-03-19T12:49:49.214468Z","shell.execute_reply":"2026-03-19T12:49:49.223695Z"}},"outputs":[],"execution_count":null},{"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":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:49:49.232292Z","iopub.execute_input":"2026-03-19T12:49:49.232717Z","iopub.status.idle":"2026-03-19T12:50:14.300420Z","shell.execute_reply.started":"2026-03-19T12:49:49.232680Z","shell.execute_reply":"2026-03-19T12:50:14.299112Z"}},"outputs":[],"execution_count":null},{"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":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:50:14.308298Z","iopub.execute_input":"2026-03-19T12:50:14.308935Z","iopub.status.idle":"2026-03-19T12:50:14.476715Z","shell.execute_reply.started":"2026-03-19T12:50:14.308879Z","shell.execute_reply":"2026-03-19T12:50:14.475400Z"}},"outputs":[],"execution_count":null},{"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":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:50:14.478009Z","iopub.execute_input":"2026-03-19T12:50:14.478854Z","iopub.status.idle":"2026-03-19T12:50:15.266540Z","shell.execute_reply.started":"2026-03-19T12:50:14.478786Z","shell.execute_reply":"2026-03-19T12:50:15.265059Z"}},"outputs":[],"execution_count":null},{"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":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:50:15.268794Z","iopub.execute_input":"2026-03-19T12:50:15.270123Z","iopub.status.idle":"2026-03-19T12:50:15.366958Z","shell.execute_reply.started":"2026-03-19T12:50:15.270055Z","shell.execute_reply":"2026-03-19T12:50:15.365208Z"}},"outputs":[],"execution_count":null},{"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":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:50:15.369120Z","iopub.execute_input":"2026-03-19T12:50:15.369633Z","iopub.status.idle":"2026-03-19T12:50:15.798362Z","shell.execute_reply.started":"2026-03-19T12:50:15.369590Z","shell.execute_reply":"2026-03-19T12:50:15.797088Z"}},"outputs":[],"execution_count":null},{"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":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:50:15.799916Z","iopub.execute_input":"2026-03-19T12:50:15.800334Z","iopub.status.idle":"2026-03-19T12:50:16.137876Z","shell.execute_reply.started":"2026-03-19T12:50:15.800298Z","shell.execute_reply":"2026-03-19T12:50:16.136240Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# <span style=\"font-family:verdana; word-spacing:1.5px;\">   Baseline 📈\n    \n\nТестовые данные содержат укороченные сессии, аналогичные тем, что есть в обучающих данных. Задача состоит в том, чтобы предсказать следующий `aid`, по которому будет клик после обрезки сессии, а также оставшиеся `aid`, которые будут добавлены в корзину и заказаны; для каждого типа события можно предсказать до 20 значений.\n\nОценка решений производится по **Recall** для каждого типа действия, а затем три значения recall усредняются с весами:  \n`{'clicks': 0.10, 'carts': 0.30, 'orders': 0.60}`.  \nОчень важно хорошо предсказывать **orders**, так как они имеют наибольший вес :)\n\nДля каждой сессии в тестовых данных нужно предсказать значения `aid` для каждого типа события, которые происходят **после последней временной метки `ts`** в тестовой сессии. Иными словами, тестовые данные содержат сессии, обрезанные по времени, а вы должны предсказать, что произойдет после точки обрезки.\n\nДля **clicks** существует только одно истинное значение для каждой сессии — это следующий `aid`, по которому кликнули в течение сессии  \n(хотя вы все равно можете предсказать до 20 значений `aid`).  \nИстинные значения для **carts** и **orders** содержат все значения `aid`, которые были соответственно добавлены в корзину и заказаны в этой сессии.\n\nКаждая комбинация **session + type** должна находиться в отдельной строке `session_type` в сабмите  \n(по 3 строки на каждую сессию), а предсказания должны быть разделены пробелами. Это можно увидеть в `sample_test_df` ниже.","metadata":{}},{"cell_type":"code","source":"# Идея\n# Этот baseline:\n# 1. Берёт товары, уже встречавшиеся в тестовой сессии.\n# 2. Сортирует их по частоте внутри этой сессии.\n# 3. Оставляет top-20.\n# 4. Если товаров меньше 20, дополняет глобально популярными товарами из train.\n# 5. Делает предсказания отдельно для clicks, carts и order.\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"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":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:50:16.140290Z","iopub.execute_input":"2026-03-19T12:50:16.140915Z","iopub.status.idle":"2026-03-19T12:50:17.088892Z","shell.execute_reply.started":"2026-03-19T12:50:16.140859Z","shell.execute_reply":"2026-03-19T12:50:17.087119Z"}},"outputs":[],"execution_count":null},{"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":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:50:17.090676Z","iopub.execute_input":"2026-03-19T12:50:17.091111Z","iopub.status.idle":"2026-03-19T12:50:17.109453Z","shell.execute_reply.started":"2026-03-19T12:50:17.091071Z","shell.execute_reply":"2026-03-19T12:50:17.108084Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample_test_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:50:17.111065Z","iopub.execute_input":"2026-03-19T12:50:17.111559Z","iopub.status.idle":"2026-03-19T12:50:17.160090Z","shell.execute_reply.started":"2026-03-19T12:50:17.111506Z","shell.execute_reply":"2026-03-19T12:50:17.158615Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Ниже показан пример сабмита. Для каждой сессии в тестовом наборе есть предсказание (`labels`). Оно предсказывает, с какими товарами будет следующее взаимодействие в этой сессии. Для каждой сессии есть три типа действий (`clicks`, `carts`, `orders`), и предсказания делаются для всех трех типов.","metadata":{}},{"cell_type":"code","source":"sample_submission = pd.read_csv(SAMPLE_SUB_PATH)\nsample_submission.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:50:17.161953Z","iopub.execute_input":"2026-03-19T12:50:17.162585Z","iopub.status.idle":"2026-03-19T12:50:21.850770Z","shell.execute_reply.started":"2026-03-19T12:50:17.162519Z","shell.execute_reply":"2026-03-19T12:50:21.849321Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Давайте найдем самый популярный товар для каждого типа действия.","metadata":{}},{"cell_type":"code","source":"sample_size = 150000\n\n# TODO:\n# Прочитать TRAIN_PATH чанками\n# Использовать только несколько первых чанков, чтобы ускорить вычисления\n#\n# Создать 3 списка:\n# - clicks_article_list\n# - carts_article_list\n# - orders_article_list\n#\n# Для каждого события в каждой сессии:\n#   если type == 'clicks'  -> добавить aid в clicks_article_list\n#   если type == 'carts'   -> добавить aid в carts_article_list\n#   иначе                  -> добавить aid в orders_article_list\n    ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:50:21.857643Z","iopub.execute_input":"2026-03-19T12:50:21.858118Z","iopub.status.idle":"2026-03-19T12:51:58.389033Z","shell.execute_reply.started":"2026-03-19T12:50:21.858081Z","shell.execute_reply":"2026-03-19T12:51:58.387373Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Создаем словари частот\narticle_click_freq = Counter(clicks_article_list)\narticle_carts_freq = Counter(carts_article_list)\narticle_order_freq = Counter(orders_article_list)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:51:58.391725Z","iopub.execute_input":"2026-03-19T12:51:58.392250Z","iopub.status.idle":"2026-03-19T12:52:07.562734Z","shell.execute_reply.started":"2026-03-19T12:51:58.392207Z","shell.execute_reply":"2026-03-19T12:52:07.561043Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# TODO:\n# Получить 20 самых частых товаров для каждого типа действия:\n# top_click_article\n# top_carts_article\n# top_order_article","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:52:07.565014Z","iopub.execute_input":"2026-03-19T12:52:07.566596Z","iopub.status.idle":"2026-03-19T12:52:08.166790Z","shell.execute_reply.started":"2026-03-19T12:52:07.566524Z","shell.execute_reply":"2026-03-19T12:52:08.165454Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Создаем словарь с такой информацией\nfrequent_articles = {'clicks': top_click_article, 'carts':top_carts_article, 'order':top_order_article}","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:52:08.168742Z","iopub.execute_input":"2026-03-19T12:52:08.169364Z","iopub.status.idle":"2026-03-19T12:52:08.176990Z","shell.execute_reply.started":"2026-03-19T12:52:08.169308Z","shell.execute_reply":"2026-03-19T12:52:08.175233Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for action in ['clicks', 'carts', 'order']:\n    print(f'Most frequent articles for {action}: {frequent_articles[action][:5]}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:52:08.178988Z","iopub.execute_input":"2026-03-19T12:52:08.180132Z","iopub.status.idle":"2026-03-19T12:52:08.193830Z","shell.execute_reply.started":"2026-03-19T12:52:08.180079Z","shell.execute_reply":"2026-03-19T12:52:08.192286Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Есть некоторое пересечение, но наборы товаров различаются для разных типов действий!\n\nЭтот бейзлайн использует тот факт, что люди часто взаимодействуют с товарами, с которыми они уже взаимодействовали ранее. Предсказание будет состоять из 20 самых частых товаров в данной сессии. Если в сессии меньше 20 товаров, предсказание будет дополнено самыми частыми товарами из обучающих данных, найденными выше.","metadata":{}},{"cell_type":"code","source":"test_data = pd.read_json(TEST_PATH, lines=True, chunksize=1000)\n\npreds = []\n\n# TODO:\n# Пройти по всем чанкам test_data\n#\n# Для каждой сессии:\n#   1. взять actions = row['events']\n#   2. собрать все aid в article_id_list\n#   3. через Counter посчитать частоты aid в текущей сессии\n#   4. взять top-20 самых частых article_id -> top_articles\n#\n# Затем для каждого action в ['clicks', 'carts', 'order']:\n#   5. если top_articles короче 20, дополнить frequent_articles[action]\n#   6. преобразовать итоговый список aid в строку через пробел\n#   7. добавить строку в preds\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T13:05:08.669725Z","iopub.execute_input":"2026-03-19T13:05:08.670903Z","iopub.status.idle":"2026-03-19T13:09:54.897231Z","shell.execute_reply.started":"2026-03-19T13:05:08.670828Z","shell.execute_reply":"2026-03-19T13:09:54.895759Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Формирование submission\nsample_submission['labels'] = preds","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T13:09:54.899797Z","iopub.execute_input":"2026-03-19T13:09:54.900280Z","iopub.status.idle":"2026-03-19T13:09:56.533367Z","shell.execute_reply.started":"2026-03-19T13:09:54.900232Z","shell.execute_reply":"2026-03-19T13:09:56.532003Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample_submission.to_csv('submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-19T12:56:02.044068Z","iopub.execute_input":"2026-03-19T12:56:02.044656Z","iopub.status.idle":"2026-03-19T12:56:26.941596Z","shell.execute_reply.started":"2026-03-19T12:56:02.044602Z","shell.execute_reply":"2026-03-19T12:56:26.939825Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}