{"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,"isSourceIdPinned":false},{"sourceType":"datasetVersion","sourceId":4474043,"datasetId":2601572,"databundleVersionId":4534159}],"dockerImageVersionId":30301,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# 1. Данные","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom pathlib import Path\nimport gc\npd.set_option(\"display.max_columns\", None)\ndata_path = Path('/kaggle/input/otto-recommender-system/')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2026-03-03T20:52:46.157874Z","iopub.execute_input":"2026-03-03T20:52:46.159148Z","iopub.status.idle":"2026-03-03T20:52:46.164949Z","shell.execute_reply.started":"2026-03-03T20:52:46.159099Z","shell.execute_reply":"2026-03-03T20:52:46.163581Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Объем огромный, поэтому работаем по частям","metadata":{}},{"cell_type":"code","source":"%%time\nsample_size = 100_000\n\nchunks = pd.read_json(data_path / 'train.jsonl' , lines=True, chunksize = sample_size)\n\nfor chunk in chunks :\n    train_df = chunk\n    break\n\ntrain_df.set_index('session', drop=True, inplace=True)\ntrain_df","metadata":{"execution":{"iopub.status.busy":"2026-03-03T20:52:48.364160Z","iopub.execute_input":"2026-03-03T20:52:48.365444Z","iopub.status.idle":"2026-03-03T20:52:59.623557Z","shell.execute_reply.started":"2026-03-03T20:52:48.365407Z","shell.execute_reply":"2026-03-03T20:52:59.622271Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 2. Посмотрим на конкретные сессии","metadata":{}},{"cell_type":"code","source":"train_df.iloc[100,0]","metadata":{"execution":{"iopub.status.busy":"2026-03-01T21:13:26.757494Z","iopub.execute_input":"2026-03-01T21:13:26.758087Z","iopub.status.idle":"2026-03-01T21:13:26.768556Z","shell.execute_reply.started":"2026-03-01T21:13:26.758049Z","shell.execute_reply":"2026-03-01T21:13:26.767442Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.iloc[2,0]","metadata":{"execution":{"iopub.status.busy":"2026-03-01T21:14:10.577275Z","iopub.execute_input":"2026-03-01T21:14:10.578068Z","iopub.status.idle":"2026-03-01T21:14:10.589026Z","shell.execute_reply.started":"2026-03-01T21:14:10.578028Z","shell.execute_reply":"2026-03-01T21:14:10.587645Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 3. Бейзлайн\n\nПосле order рекомендуем cart, а после cart - clicks. Так как рекомендуется примерно 20 наименований, добавим сюда самые продаваемые товары тоже.","metadata":{},"attachments":{"510de649-ff77-4786-89fa-e1d75404d30c.png":{"image/png":"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"}}},{"cell_type":"markdown","source":"Переформатируем датафрейм","metadata":{}},{"cell_type":"code","source":"del train_df\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2026-03-01T21:19:45.279519Z","iopub.execute_input":"2026-03-01T21:19:45.281102Z","iopub.status.idle":"2026-03-01T21:19:45.733675Z","shell.execute_reply.started":"2026-03-01T21:19:45.280995Z","shell.execute_reply":"2026-03-01T21:19:45.732393Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\ntrain_df = pd.DataFrame()\nchunks = pd.read_json(data_path / 'train.jsonl', lines=True, chunksize=100_000)\n\nfor chunk in chunks:\n    event_dict = {'session': [], 'aid': [], 'ts': [], 'type': []}\n    \n    for session, events in zip(chunk['session'].tolist(), chunk['events'].tolist()):\n        for event in events:\n            event_dict['session'].append(session)\n            event_dict['aid'].append(event['aid'])\n            event_dict['ts'].append(event['ts'])\n            event_dict['type'].append(event['type'])\n    train_df = pd.DataFrame(event_dict)\n    \n    break\n        \ntrain_df = train_df.reset_index(drop=True)\ntrain_df","metadata":{"execution":{"iopub.status.busy":"2026-03-01T21:19:52.388527Z","iopub.execute_input":"2026-03-01T21:19:52.389491Z","iopub.status.idle":"2026-03-01T21:20:08.852817Z","shell.execute_reply.started":"2026-03-01T21:19:52.389448Z","shell.execute_reply":"2026-03-01T21:20:08.851624Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Создадим новую колонку \"minutes\", куда положим продолжительность действия. Временная метка в этом соревновании в миллисекундах.","metadata":{}},{"cell_type":"code","source":"train_df[\"minutes\"] = train_df[[\"session\", \"ts\"]].groupby(\"session\").diff(-1)*(-1/1000/60)\ntrain_df","metadata":{"execution":{"iopub.status.busy":"2026-03-01T21:22:38.258457Z","iopub.execute_input":"2026-03-01T21:22:38.258891Z","iopub.status.idle":"2026-03-01T21:23:11.490173Z","shell.execute_reply.started":"2026-03-01T21:22:38.258859Z","shell.execute_reply":"2026-03-01T21:23:11.488966Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Создадим список самых продаваемых вещей","metadata":{}},{"cell_type":"code","source":"temp = train_df.groupby(['type','aid'])['session'].agg('count').reset_index()\ntemp.columns = ['type','aid','count']\norder_num_df = temp.loc[(temp['type'] == 'orders'), ]\norder_num_df = order_num_df.sort_values(['count'],ascending=False).reset_index()\norder_num_df","metadata":{"execution":{"iopub.status.busy":"2026-03-01T21:23:20.183651Z","iopub.execute_input":"2026-03-01T21:23:20.184708Z","iopub.status.idle":"2026-03-01T21:23:22.076474Z","shell.execute_reply.started":"2026-03-01T21:23:20.184657Z","shell.execute_reply":"2026-03-01T21:23:22.075299Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"order_num_df.aid = ' ' + order_num_df.aid.astype('str')\nbest_sold_list = order_num_df[:20].aid.sum()\nbest_sold_list","metadata":{"execution":{"iopub.status.busy":"2026-03-01T21:23:27.420148Z","iopub.execute_input":"2026-03-01T21:23:27.420623Z","iopub.status.idle":"2026-03-01T21:23:27.493998Z","shell.execute_reply.started":"2026-03-01T21:23:27.420537Z","shell.execute_reply":"2026-03-01T21:23:27.492713Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Переходим к тестовым данным","metadata":{}},{"cell_type":"code","source":"test_df = pd.DataFrame()\nchunks = pd.read_json(data_path / 'test.jsonl', lines=True, chunksize=100_000)\n\nfor chunk in chunks:\n    event_dict = {'session': [],'aid': [],'ts': [],'type': []}\n    for session, events in zip(chunk['session'].tolist(), chunk['events'].tolist()):\n        for event in events:\n            event_dict['session'].append(session)\n            event_dict['aid'].append(event['aid'])\n            event_dict['ts'].append(event['ts'])\n            event_dict['type'].append(event['type'])\n    chunk_session = pd.DataFrame(event_dict)\n    test_df = pd.concat([test_df, chunk_session])\n            \ntest_df = test_df.reset_index(drop=True)\ntest_df","metadata":{"execution":{"iopub.status.busy":"2026-03-03T20:53:25.186131Z","iopub.execute_input":"2026-03-03T20:53:25.186541Z","iopub.status.idle":"2026-03-03T20:54:20.925837Z","shell.execute_reply.started":"2026-03-03T20:53:25.186510Z","shell.execute_reply":"2026-03-03T20:54:20.924694Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Тут создадим аналогичную колонку","metadata":{}},{"cell_type":"code","source":"%%time\ntest_df[\"minutes\"] = test_df[[\"session\", \"ts\"]].groupby(\"session\").diff(-1)*(-1/1000/60)\ntest_df = test_df.sort_values(['minutes'],ascending=False)\n\ntest_action_df = test_df.copy()\ntest_action_df.aid = ' ' + test_df.aid.astype('str')\ntest_action_df = test_action_df.groupby(['session','type'])['aid'].sum().reset_index()\ntest_action_df","metadata":{"execution":{"iopub.status.busy":"2026-03-01T21:24:45.487661Z","iopub.execute_input":"2026-03-01T21:24:45.488019Z","iopub.status.idle":"2026-03-01T21:32:36.117473Z","shell.execute_reply.started":"2026-03-01T21:24:45.487990Z","shell.execute_reply":"2026-03-01T21:32:36.116321Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"next_orders_df = pd.DataFrame(test_action_df.loc[(test_action_df[\"type\"] == 'carts'), ])\nnext_orders_df['type'] = 'orders'\nnext_orders_df","metadata":{"execution":{"iopub.status.busy":"2026-03-01T21:32:45.977095Z","iopub.execute_input":"2026-03-01T21:32:45.977716Z","iopub.status.idle":"2026-03-01T21:32:46.410768Z","shell.execute_reply.started":"2026-03-01T21:32:45.977677Z","shell.execute_reply":"2026-03-01T21:32:46.409632Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"next_carts_df = pd.DataFrame(test_action_df.loc[(test_action_df[\"type\"] == 'clicks'), ])\nnext_carts_df['type'] = 'carts'\nnext_carts_df","metadata":{"execution":{"iopub.status.busy":"2026-03-01T21:32:53.720235Z","iopub.execute_input":"2026-03-01T21:32:53.720817Z","iopub.status.idle":"2026-03-01T21:32:53.996880Z","shell.execute_reply.started":"2026-03-01T21:32:53.720778Z","shell.execute_reply":"2026-03-01T21:32:53.995794Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Для кликов будем рекомендовать клики","metadata":{}},{"cell_type":"code","source":"next_clicks_df = pd.DataFrame(test_action_df.loc[(test_action_df[\"type\"] == 'clicks'), ]).copy()","metadata":{"execution":{"iopub.status.busy":"2026-03-01T21:40:04.563246Z","iopub.execute_input":"2026-03-01T21:40:04.564288Z","iopub.status.idle":"2026-03-01T21:40:04.912190Z","shell.execute_reply.started":"2026-03-01T21:40:04.564245Z","shell.execute_reply":"2026-03-01T21:40:04.911134Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"next_orders_df = pd.merge(next_orders_df, next_clicks_df[['session', 'aid']], on ='session', how = 'left')\nnext_orders_df[\"aid\"] = next_orders_df[\"aid_x\"] + next_orders_df[\"aid_y\"]\nnext_orders_df = next_orders_df.drop(['aid_x', 'aid_y'], axis =1)\nnext_orders_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-01T21:41:53.573012Z","iopub.execute_input":"2026-03-01T21:41:53.574898Z","iopub.status.idle":"2026-03-01T21:41:54.702634Z","shell.execute_reply.started":"2026-03-01T21:41:53.574850Z","shell.execute_reply":"2026-03-01T21:41:54.701159Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"recommend_df = pd.concat([next_orders_df, next_carts_df, next_clicks_df], axis =0)\nrecommend_df[\"session_type\"] = recommend_df[\"session\"].astype('str') + \"_\" + recommend_df[\"type\"] \nrecommend_df","metadata":{"execution":{"iopub.status.busy":"2026-03-01T21:41:59.116207Z","iopub.execute_input":"2026-03-01T21:41:59.116635Z","iopub.status.idle":"2026-03-01T21:42:02.420925Z","shell.execute_reply.started":"2026-03-01T21:41:59.116590Z","shell.execute_reply":"2026-03-01T21:42:02.419683Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample_sub = pd.read_csv('/kaggle/input/otto-recommender-system/sample_submission.csv')\nsample_sub","metadata":{"execution":{"iopub.status.busy":"2026-03-01T21:42:06.765179Z","iopub.execute_input":"2026-03-01T21:42:06.765595Z","iopub.status.idle":"2026-03-01T21:42:12.716232Z","shell.execute_reply.started":"2026-03-01T21:42:06.765515Z","shell.execute_reply":"2026-03-01T21:42:12.715229Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample_sub = pd.merge(sample_sub, recommend_df[[\"session_type\",\"aid\"]], on = \"session_type\", how =\"left\")\nsample_sub['next'] = sample_sub['aid'] + best_sold_list\nsample_sub['next'].fillna(best_sold_list, inplace = True)\nsample_sub['next'] = sample_sub['next'].str.strip()\nsample_sub = sample_sub.drop([\"labels\", \"aid\"], axis = 1)\nsample_sub.columns = (\"session_type\", \"labels\")\nsample_sub","metadata":{"execution":{"iopub.status.busy":"2026-03-01T21:42:46.281234Z","iopub.execute_input":"2026-03-01T21:42:46.282042Z","iopub.status.idle":"2026-03-01T21:43:03.032139Z","shell.execute_reply.started":"2026-03-01T21:42:46.282004Z","shell.execute_reply":"2026-03-01T21:43:03.030982Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample_sub.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2026-03-01T21:43:08.048442Z","iopub.execute_input":"2026-03-01T21:43:08.049392Z","iopub.status.idle":"2026-03-01T21:43:33.956508Z","shell.execute_reply.started":"2026-03-01T21:43:08.049334Z","shell.execute_reply":"2026-03-01T21:43:33.955478Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 4. Word2Vec","metadata":{}},{"cell_type":"code","source":"!pip install polars","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-03T20:41:44.631225Z","iopub.execute_input":"2026-03-03T20:41:44.632132Z","iopub.status.idle":"2026-03-03T20:41:57.910243Z","shell.execute_reply.started":"2026-03-03T20:41:44.632093Z","shell.execute_reply":"2026-03-03T20:41:57.908700Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import polars as pl\nfrom gensim.test.utils import common_texts\nfrom gensim.models import Word2Vec","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-03T20:42:11.378732Z","iopub.execute_input":"2026-03-03T20:42:11.379386Z","iopub.status.idle":"2026-03-03T20:42:12.412739Z","shell.execute_reply.started":"2026-03-03T20:42:11.379346Z","shell.execute_reply":"2026-03-03T20:42:12.411375Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = pl.read_parquet('/kaggle/input/datasets/radek1/otto-full-optimized-memory-footprint/train.parquet')\ntest = pl.read_parquet('/kaggle/input/datasets/radek1/otto-full-optimized-memory-footprint/test.parquet')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-03T20:59:12.908402Z","iopub.execute_input":"2026-03-03T20:59:12.909652Z","iopub.status.idle":"2026-03-03T20:59:27.942701Z","shell.execute_reply.started":"2026-03-03T20:59:12.909605Z","shell.execute_reply":"2026-03-03T20:59:27.941520Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sentences_df = pl.concat([train, test]).groupby('session').agg(\n    pl.col('aid').alias('sentence')\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-03T21:00:13.370447Z","iopub.execute_input":"2026-03-03T21:00:13.370880Z","iopub.status.idle":"2026-03-03T21:00:25.456092Z","shell.execute_reply.started":"2026-03-03T21:00:13.370847Z","shell.execute_reply":"2026-03-03T21:00:25.454758Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sentences = sentences_df['sentence'].to_list()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-03T21:01:19.838898Z","iopub.execute_input":"2026-03-03T21:01:19.840431Z","iopub.status.idle":"2026-03-03T21:02:11.785784Z","shell.execute_reply.started":"2026-03-03T21:01:19.840384Z","shell.execute_reply":"2026-03-03T21:02:11.784295Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\nw2vec = Word2Vec(sentences=sentences, vector_size=32, min_count=1, workers=4)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-03T21:05:29.138232Z","iopub.execute_input":"2026-03-03T21:05:29.138883Z","iopub.status.idle":"2026-03-03T21:34:55.764309Z","shell.execute_reply.started":"2026-03-03T21:05:29.138843Z","shell.execute_reply":"2026-03-03T21:34:55.762602Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\nfrom annoy import AnnoyIndex\n\naid2idx = {aid: i for i, aid in enumerate(w2vec.wv.index_to_key)}\nindex = AnnoyIndex(32, 'euclidean')\n\nfor aid, idx in aid2idx.items():\n    index.add_item(idx, w2vec.wv.vectors[idx])\n    \nindex.build(10)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-03T21:38:44.758162Z","iopub.execute_input":"2026-03-03T21:38:44.758646Z","iopub.status.idle":"2026-03-03T21:39:04.640779Z","shell.execute_reply.started":"2026-03-03T21:38:44.758612Z","shell.execute_reply":"2026-03-03T21:39:04.639248Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n\nfrom collections import defaultdict\n\nsample_sub = pd.read_csv('../input/otto-recommender-system//sample_submission.csv')\n\nsession_types = ['clicks', 'carts', 'orders']\ntest_session_AIDs = test.to_pandas().reset_index(drop=True).groupby('session')['aid'].apply(list)\ntest_session_types = test.to_pandas().reset_index(drop=True).groupby('session')['type'].apply(list)\n\nlabels = []\n\ntype_weight_multipliers = {0: 1, 1: 6, 2: 3}\nfor AIDs, types in zip(test_session_AIDs, test_session_types):\n    if len(AIDs) >= 20:\n\n        weights=np.logspace(0.1,1,len(AIDs),base=2, endpoint=True)-1\n        aids_temp=defaultdict(lambda: 0)\n        for aid,w,t in zip(AIDs,weights,types): \n            aids_temp[aid]+= w * type_weight_multipliers[t]\n            \n        sorted_aids=[k for k, v in sorted(aids_temp.items(), key=lambda item: -item[1])]\n        labels.append(sorted_aids[:20])\n    else:\n        \n        AIDs = list(dict.fromkeys(AIDs[::-1])) \n \n        most_recent_aid = AIDs[0]\n        \n        nns = [w2vec.wv.index_to_key[i] for i in index.get_nns_by_item(aid2idx[most_recent_aid], 21)[1:]]\n        labels.append((AIDs+nns)[:20])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-03T21:57:52.363617Z","iopub.execute_input":"2026-03-03T21:57:52.364011Z","iopub.status.idle":"2026-03-03T22:01:10.819721Z","shell.execute_reply.started":"2026-03-03T21:57:52.363981Z","shell.execute_reply":"2026-03-03T22:01:10.817671Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"labels_as_strings = [' '.join([str(l) for l in lls]) for lls in labels]\n\npredictions = pd.DataFrame(data={'session_type': test_session_AIDs.index, 'labels': labels_as_strings})\n\nprediction_dfs = []\n\nfor st in session_types:\n    modified_predictions = predictions.copy()\n    modified_predictions.session_type = modified_predictions.session_type.astype('str') + f'_{st}'\n    prediction_dfs.append(modified_predictions)\n\nsubmission = pd.concat(prediction_dfs).reset_index(drop=True)\nsubmission.to_csv('submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-03T22:02:26.449880Z","iopub.execute_input":"2026-03-03T22:02:26.450995Z","iopub.status.idle":"2026-03-03T22:03:11.911373Z","shell.execute_reply.started":"2026-03-03T22:02:26.450940Z","shell.execute_reply":"2026-03-03T22:03:11.910038Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# ","metadata":{}}]}