{"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":"import numpy as np\nimport pandas as pd\nfrom tqdm import tqdm\nfrom collections import defaultdict\nimport math\nfrom operator import itemgetter","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-12-20T10:57:23.368456Z","iopub.execute_input":"2022-12-20T10:57:23.369261Z","iopub.status.idle":"2022-12-20T10:57:23.375170Z","shell.execute_reply.started":"2022-12-20T10:57:23.369219Z","shell.execute_reply":"2022-12-20T10:57:23.373717Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_parquet('../input/otto-full-optimized-memory-footprint/train.parquet')\ntest = pd.read_parquet('../input/otto-full-optimized-memory-footprint/test.parquet')\nprint(train.shape, test.shape)","metadata":{"execution":{"iopub.status.busy":"2022-12-20T10:32:11.860623Z","iopub.execute_input":"2022-12-20T10:32:11.862629Z","iopub.status.idle":"2022-12-20T10:32:34.263517Z","shell.execute_reply.started":"2022-12-20T10:32:11.862527Z","shell.execute_reply":"2022-12-20T10:32:34.262394Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = pd.concat([train,test])\nprint(data.shape)","metadata":{"execution":{"iopub.status.busy":"2022-12-20T10:34:08.797273Z","iopub.execute_input":"2022-12-20T10:34:08.797734Z","iopub.status.idle":"2022-12-20T10:34:11.759441Z","shell.execute_reply.started":"2022-12-20T10:34:08.797699Z","shell.execute_reply":"2022-12-20T10:34:11.758243Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data.head()","metadata":{"execution":{"iopub.status.busy":"2022-12-20T10:40:16.808772Z","iopub.execute_input":"2022-12-20T10:40:16.809201Z","iopub.status.idle":"2022-12-20T10:40:16.830112Z","shell.execute_reply.started":"2022-12-20T10:40:16.809156Z","shell.execute_reply":"2022-12-20T10:40:16.828913Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"type(data)","metadata":{"execution":{"iopub.status.busy":"2022-12-20T10:40:24.096488Z","iopub.execute_input":"2022-12-20T10:40:24.097271Z","iopub.status.idle":"2022-12-20T10:40:24.104717Z","shell.execute_reply.started":"2022-12-20T10:40:24.097230Z","shell.execute_reply":"2022-12-20T10:40:24.103447Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def itemCFTrain(df):\n    \n    #create list for dict\n    user_item_list = []\n    for idx, row in tqdm(df.iterrows(), total=df.shape[0]):\n        user = int(row['session'])\n        item = int(row['aid'])\n        user_item_list.append([user, item])\n    \n    #create dict\n    user_item_dict = dict()\n    for user, item in tqdm(user_item_list):\n        user_item_dict.setdefault(user, list()) # changge set() to list()\n        user_item_dict[user].append(item)\n    \n    return user_item_dict","metadata":{"execution":{"iopub.status.busy":"2022-12-20T10:34:25.305098Z","iopub.execute_input":"2022-12-20T10:34:25.306045Z","iopub.status.idle":"2022-12-20T10:34:25.313688Z","shell.execute_reply.started":"2022-12-20T10:34:25.306002Z","shell.execute_reply":"2022-12-20T10:34:25.312794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def ItemMatrix_fn(user_item_dict):\n    \n    N = defaultdict(int)\n    itemMatrix = defaultdict(int)\n    for user, items in tqdm(user_item_dict.items()):\n        for i in items:\n            itemMatrix.setdefault(i, dict())\n            N[i] += 1\n            for j in items:\n                itemMatrix[i].setdefault(j, 0)\n                #if i==j:\n                #    continue\n                itemMatrix[i][j] += 1\n    \n    return itemMatrix, N","metadata":{"execution":{"iopub.status.busy":"2022-12-20T10:34:25.535036Z","iopub.execute_input":"2022-12-20T10:34:25.535503Z","iopub.status.idle":"2022-12-20T10:34:25.544094Z","shell.execute_reply.started":"2022-12-20T10:34:25.535469Z","shell.execute_reply":"2022-12-20T10:34:25.542329Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def ItemSimilarityMatrix_fn(ItemMatrix, N):\n    \n    itemSimMatrix = defaultdict(int)\n    # cosine sim\n    for i, related_items in tqdm(ItemMatrix.items()):\n        itemSimMatrix.setdefault(i, dict())\n        for j, cij in related_items.items():\n            itemSimMatrix[i].setdefault(j, 0)\n            itemSimMatrix[i][j] = cij / math.sqrt(N[i] * N[j])\n    \n    # normalization\n    for i, relations in tqdm(itemSimMatrix.items()):\n        max_num = relations[max(relations, key=relations.get)]\n        if max_num == 0:\n            continue\n        itemSimMatrix[i] = {k : v / max_num for k, v in relations.items()}\n    \n    return itemSimMatrix","metadata":{"execution":{"iopub.status.busy":"2022-12-20T10:34:25.794708Z","iopub.execute_input":"2022-12-20T10:34:25.795154Z","iopub.status.idle":"2022-12-20T10:34:25.804783Z","shell.execute_reply.started":"2022-12-20T10:34:25.795120Z","shell.execute_reply":"2022-12-20T10:34:25.802647Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\n1. uilist\n2. uidict\n3. itemmatrix\n4. cosine\n5. norm\n'''\nuidict = itemCFTrain(test)\nitemMatrix, N = ItemMatrix_fn(uidict)\nitemSimMatrix = ItemSimilarityMatrix_fn(itemMatrix, N)","metadata":{"execution":{"iopub.status.busy":"2022-12-20T10:55:29.312683Z","iopub.execute_input":"2022-12-20T10:55:29.313091Z","iopub.status.idle":"2022-12-20T10:55:29.339204Z","shell.execute_reply.started":"2022-12-20T10:55:29.313061Z","shell.execute_reply":"2022-12-20T10:55:29.337262Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def recommend(trainData, itemSimMatrix, user, popularity):\n\n    recommends = dict()\n    items = trainData[user]\n    for item in items:\n        # for every item in session, get top 100 similarity scores\n        for i, sim in sorted(itemSimMatrix[item].items(), key=itemgetter(1), reverse=True)[:100]:\n            # skip if item repeated\n            #if i in items:\n            #    continue  \n            recommends.setdefault(i, 0.)\n            recommends[i] += sim\n    # sort and return top 20\n    result = list(dict(sorted(recommends.items(), key=itemgetter(1), reverse=True)[:20]).keys())\n    if len(result) < 20:\n        result = result + popularity # if num of items < 20, use popular items\n        result = result[:20]\n    \n    return result","metadata":{"execution":{"iopub.status.busy":"2022-12-20T10:36:03.081866Z","iopub.execute_input":"2022-12-20T10:36:03.083235Z","iopub.status.idle":"2022-12-20T10:36:03.093041Z","shell.execute_reply.started":"2022-12-20T10:36:03.083156Z","shell.execute_reply":"2022-12-20T10:36:03.091702Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pop = list(dict(sorted(N.items(), key=itemgetter(1), reverse=True)[:20]).keys())\nusers = list(uidict.keys())\nre_items = []\n\nfor user in tqdm(users):\n    result = list(map(str,recommend(uidict, itemSimMatrix, user, pop)))\n    re_items.append(\" \".join(result))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\nsession_type,labels\n42_clicks,0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19\n42_carts,0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19\n42_orders,0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19\n'''\nsub_types = list(np.tile(['_clicks', '_carts', '_orders'], len(users)))\nsub_users = list(map(str, list(np.repeat(users, 3))))\nsub_sessions = [i + j for i, j in zip(sub_users, sub_types)]\nsub_items = list(np.repeat(re_items, 3))\n\nsub = pd.DataFrame({\n    'session_type': sub_sessions,\n    'labels': sub_items\n})\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub.to_csv('sub_itemcf.csv', index=False)","metadata":{},"execution_count":null,"outputs":[]}]}