{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install pickle5","metadata":{"execution":{"iopub.status.busy":"2022-12-09T04:10:40.029433Z","iopub.execute_input":"2022-12-09T04:10:40.029886Z","iopub.status.idle":"2022-12-09T04:10:51.093529Z","shell.execute_reply.started":"2022-12-09T04:10:40.029797Z","shell.execute_reply":"2022-12-09T04:10:51.092409Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport pandas as pd\n\nfrom datetime import datetime\nfrom tqdm import tqdm\n\nfrom collections import defaultdict\nimport math\nimport numpy as np\nimport random\nimport copy\nfrom collections import Counter","metadata":{"execution":{"iopub.status.busy":"2022-12-09T04:12:03.441900Z","iopub.execute_input":"2022-12-09T04:12:03.442302Z","iopub.status.idle":"2022-12-09T04:12:03.448854Z","shell.execute_reply.started":"2022-12-09T04:12:03.442266Z","shell.execute_reply":"2022-12-09T04:12:03.447130Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_parquet('../input/otto-full-optimized-memory-footprint/train.parquet')\ntest_df = pd.read_parquet('../input/otto-full-optimized-memory-footprint/test.parquet')\n\nimport pickle5 as pickle\n\nwith open('../input/otto-full-optimized-memory-footprint/id2type.pkl', \"rb\") as fh:\n    id2type = pickle.load(fh)\nwith open('../input/otto-full-optimized-memory-footprint/type2id.pkl', \"rb\") as fh:\n    type2id = pickle.load(fh)\n    \nsample_sub_df = pd.read_csv('../input/otto-recommender-system/sample_submission.csv')","metadata":{"execution":{"iopub.status.busy":"2022-12-09T04:12:06.455919Z","iopub.execute_input":"2022-12-09T04:12:06.456322Z","iopub.status.idle":"2022-12-09T04:12:28.898909Z","shell.execute_reply.started":"2022-12-09T04:12:06.456289Z","shell.execute_reply":"2022-12-09T04:12:28.897680Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"config = {\n    'train_session_num':3000000,\n}","metadata":{"execution":{"iopub.status.busy":"2022-12-09T04:13:30.456233Z","iopub.execute_input":"2022-12-09T04:13:30.456639Z","iopub.status.idle":"2022-12-09T04:13:30.462475Z","shell.execute_reply.started":"2022-12-09T04:13:30.456602Z","shell.execute_reply":"2022-12-09T04:13:30.461164Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df['aid'] = train_df['aid'].astype('int32').astype('str')\ntest_df['aid'] = test_df['aid'].astype('int32').astype('str')","metadata":{"execution":{"iopub.status.busy":"2022-12-09T04:13:33.043042Z","iopub.execute_input":"2022-12-09T04:13:33.043442Z","iopub.status.idle":"2022-12-09T04:15:20.964208Z","shell.execute_reply.started":"2022-12-09T04:13:33.043396Z","shell.execute_reply":"2022-12-09T04:15:20.963218Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_session = random.sample(list(train_df['session'].unique()),config['train_session_num'])\ntrain_df = train_df.query('session in @train_session').reset_index(drop=True)","metadata":{"execution":{"iopub.status.busy":"2022-12-09T04:15:37.630035Z","iopub.execute_input":"2022-12-09T04:15:37.632033Z","iopub.status.idle":"2022-12-09T04:16:05.734871Z","shell.execute_reply.started":"2022-12-09T04:15:37.631983Z","shell.execute_reply":"2022-12-09T04:16:05.733956Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df['time_stamp'] = pd.to_datetime(train_df['ts'],unit='s').dt.strftime('%Y-%m-%d')\ntest_df['time_stamp'] = pd.to_datetime(test_df['ts'],unit='s').dt.strftime('%Y-%m-%d')","metadata":{"execution":{"iopub.status.busy":"2022-12-09T04:22:37.982106Z","iopub.execute_input":"2022-12-09T04:22:37.982592Z","iopub.status.idle":"2022-12-09T04:26:37.921922Z","shell.execute_reply.started":"2022-12-09T04:22:37.982558Z","shell.execute_reply":"2022-12-09T04:26:37.920608Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def generate_pairs(df):\n    df = df.sort_values(by=['session','ts'])\n    df['aid_next'] = df['aid'].shift(-1)\n    df['session_day'] = df['session'].astype('str')+'_'+df['time_stamp']\n    df['session_day_count'] = df['session_day'].map(df['session_day'].value_counts())\n    df['ranking'] = df.groupby(['session_day'])['ts'].rank(method='first', ascending=True)\n    df = df.query('session_day_count!=ranking').reset_index(drop=True)\n    \n    sim_aids = df.groupby('aid').apply(lambda df: Counter(df.aid_next).most_common(50)).to_dict()\n    sim_aids = {aid: Counter(dict(top)) for aid, top in sim_aids.items()}\n    return sim_aids","metadata":{"execution":{"iopub.status.busy":"2022-12-09T04:26:37.924674Z","iopub.execute_input":"2022-12-09T04:26:37.925097Z","iopub.status.idle":"2022-12-09T04:26:37.936871Z","shell.execute_reply.started":"2022-12-09T04:26:37.925059Z","shell.execute_reply":"2022-12-09T04:26:37.935646Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sim_aids = generate_pairs(train_df)","metadata":{"execution":{"iopub.status.busy":"2022-12-09T04:26:37.938241Z","iopub.execute_input":"2022-12-09T04:26:37.938623Z","iopub.status.idle":"2022-12-09T04:32:40.107988Z","shell.execute_reply.started":"2022-12-09T04:26:37.938588Z","shell.execute_reply":"2022-12-09T04:32:40.106434Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def recommend(aids,popular_items):\n    \n    if len(aids) >= 20:\n        return aids[-20:]\n\n    aids = set(aids)\n    new_aids = Counter()\n    for aid in aids:\n        new_aids.update(sim_aids.get(aid, Counter()))\n    \n    top_aids2 = [aid2 for aid2, cnt in new_aids.most_common(40) if aid2 not in aids] \n    final_rec_list = list(aids) + top_aids2[:20 - len(aids)]\n    \n    if len(final_rec_list)<20:\n        return final_rec_list + popular_items[:20-len(final_rec_list)]\n    else:\n        return final_rec_list","metadata":{"execution":{"iopub.status.busy":"2022-12-09T04:32:40.109547Z","iopub.execute_input":"2022-12-09T04:32:40.109929Z","iopub.status.idle":"2022-12-09T04:32:40.118644Z","shell.execute_reply.started":"2022-12-09T04:32:40.109896Z","shell.execute_reply":"2022-12-09T04:32:40.117681Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df = test_df.sort_values([\"session\", \"type\", \"ts\"])\ntest_session_dict = test_df.groupby('session')['aid'].agg(list).to_dict()\nsession_id_list = []\nitem_id_list = []\n\npopular_items = list(train_df['aid'].value_counts().index)\n\nfor session_id,session_item_list in tqdm(test_session_dict.items()):\n    item_list = recommend(session_item_list,popular_items)\n    \n    session_id_list.append(session_id)\n    item_id_list.append(list(item_list))\n\nres_df = pd.DataFrame()\nres_df['session_type'] = session_id_list\nres_df['labels'] = [' '.join([str(l) for l in lls]) for lls in item_id_list]","metadata":{"execution":{"iopub.status.busy":"2022-12-09T04:32:40.120800Z","iopub.execute_input":"2022-12-09T04:32:40.121591Z","iopub.status.idle":"2022-12-09T04:36:05.435143Z","shell.execute_reply.started":"2022-12-09T04:32:40.121564Z","shell.execute_reply":"2022-12-09T04:36:05.433794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"res_list = []\nfor type_ in [0,1,2]:\n    temp_df = copy.deepcopy(res_df)\n    temp_df['session_type'] = temp_df['session_type'].apply(lambda x:'{}_{}'.format(x,id2type[type_]))\n    res_list.append(temp_df)\nres_df = pd.concat(res_list,axis=0)","metadata":{"execution":{"iopub.status.busy":"2022-12-09T04:36:05.436764Z","iopub.execute_input":"2022-12-09T04:36:05.437196Z","iopub.status.idle":"2022-12-09T04:36:07.705497Z","shell.execute_reply.started":"2022-12-09T04:36:05.437139Z","shell.execute_reply":"2022-12-09T04:36:07.704395Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"res_df.to_csv('baseline.csv',index=False)","metadata":{"execution":{"iopub.status.busy":"2022-12-09T04:36:07.706831Z","iopub.execute_input":"2022-12-09T04:36:07.707144Z","iopub.status.idle":"2022-12-09T04:36:21.446685Z","shell.execute_reply.started":"2022-12-09T04:36:07.707116Z","shell.execute_reply":"2022-12-09T04:36:21.445319Z"},"trusted":true},"execution_count":null,"outputs":[]}]}