{"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 pandas as pd\nimport numpy as np\nimport annoy\nfrom tqdm.notebook import tqdm\nfrom sklearn.preprocessing import LabelEncoder\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\n\npd.set_option('display.max_columns',100)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-02-26T16:24:36.091857Z","iopub.execute_input":"2022-02-26T16:24:36.092317Z","iopub.status.idle":"2022-02-26T16:24:36.097464Z","shell.execute_reply.started":"2022-02-26T16:24:36.092283Z","shell.execute_reply":"2022-02-26T16:24:36.096742Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"customers = pd.read_csv('../input/h-and-m-personalized-fashion-recommendations/customers.csv')\ntransactions_train = pd.read_csv('../input/h-and-m-personalized-fashion-recommendations/transactions_train.csv')\narticles = pd.read_csv('../input/h-and-m-personalized-fashion-recommendations/articles.csv')","metadata":{"execution":{"iopub.status.busy":"2022-02-26T14:53:57.091382Z","iopub.execute_input":"2022-02-26T14:53:57.091649Z","iopub.status.idle":"2022-02-26T14:55:00.193512Z","shell.execute_reply.started":"2022-02-26T14:53:57.091622Z","shell.execute_reply":"2022-02-26T14:55:00.192588Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"articles.head(2)","metadata":{"execution":{"iopub.status.busy":"2022-02-26T15:05:00.106896Z","iopub.execute_input":"2022-02-26T15:05:00.107609Z","iopub.status.idle":"2022-02-26T15:05:00.127525Z","shell.execute_reply.started":"2022-02-26T15:05:00.107567Z","shell.execute_reply":"2022-02-26T15:05:00.126698Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dims = [\n    'prod_name',\n    'product_type_no',\n    'product_group_name',\n    'graphical_appearance_no',\n    'colour_group_code',\n    'perceived_colour_value_id',\n    'perceived_colour_master_id',\n    'department_no',\n    'index_name',\n    'index_group_no',\n    'section_no',\n    'garment_group_no'\n]","metadata":{"execution":{"iopub.status.busy":"2022-02-26T15:46:43.746000Z","iopub.execute_input":"2022-02-26T15:46:43.746632Z","iopub.status.idle":"2022-02-26T15:46:43.751482Z","shell.execute_reply.started":"2022-02-26T15:46:43.746594Z","shell.execute_reply":"2022-02-26T15:46:43.750755Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"articles.set_index('article_id',inplace=True)","metadata":{"execution":{"iopub.status.busy":"2022-02-26T15:46:47.701838Z","iopub.execute_input":"2022-02-26T15:46:47.702097Z","iopub.status.idle":"2022-02-26T15:46:47.705911Z","shell.execute_reply.started":"2022-02-26T15:46:47.702071Z","shell.execute_reply":"2022-02-26T15:46:47.705143Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prod_name_enc = LabelEncoder()\ngroup_name_enc = LabelEncoder()\nindex_enc = LabelEncoder()\n\narticles['prod_name'] = prod_name_enc.fit_transform(articles['prod_name'].values.reshape(-1,1))\narticles['product_group_name'] = group_name_enc.fit_transform(articles['product_group_name'].values.reshape(-1,1))\narticles['index_name'] = index_enc.fit_transform(articles['index_name'].values.reshape(-1,1))","metadata":{"execution":{"iopub.status.busy":"2022-02-26T15:39:47.762470Z","iopub.execute_input":"2022-02-26T15:39:47.762737Z","iopub.status.idle":"2022-02-26T15:39:47.989742Z","shell.execute_reply.started":"2022-02-26T15:39:47.762707Z","shell.execute_reply":"2022-02-26T15:39:47.989155Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"vector = np.ascontiguousarray(articles[dims].values, dtype=np.float32)\nitems = np.array(articles.index)","metadata":{"execution":{"iopub.status.busy":"2022-02-26T15:57:52.347398Z","iopub.execute_input":"2022-02-26T15:57:52.347716Z","iopub.status.idle":"2022-02-26T15:57:52.356567Z","shell.execute_reply.started":"2022-02-26T15:57:52.347666Z","shell.execute_reply":"2022-02-26T15:57:52.355503Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"item_data = {\"id\":items,\"vector\":vector}","metadata":{"execution":{"iopub.status.busy":"2022-02-26T16:09:18.154280Z","iopub.execute_input":"2022-02-26T16:09:18.154596Z","iopub.status.idle":"2022-02-26T16:09:18.158839Z","shell.execute_reply.started":"2022-02-26T16:09:18.154560Z","shell.execute_reply":"2022-02-26T16:09:18.158037Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class AnnoyIndex():\n    def __init__(self, vectors, labels):\n        self.dimension = vectors.shape[1]\n        self.vectors = vectors.astype('float32')\n        self.labels = labels   \n        self.search_in_x_trees = 8\n   \n    def build(self, number_of_trees=100):\n        self.index = annoy.AnnoyIndex(self.dimension)\n        for i, vec in enumerate(self.vectors):\n            self.index.add_item(i, vec.tolist())\n        self.index.build(number_of_trees)\n        \n    def query(self, vector, k=10):\n        indices = self.index.get_nns_by_vector(\n              vector.tolist(), \n              k, \n              search_k=self.search_in_x_trees)                                           \n        return [self.labels[i] for i in indices]","metadata":{"execution":{"iopub.status.busy":"2022-02-26T16:42:56.743149Z","iopub.execute_input":"2022-02-26T16:42:56.743420Z","iopub.status.idle":"2022-02-26T16:42:56.750364Z","shell.execute_reply.started":"2022-02-26T16:42:56.743389Z","shell.execute_reply":"2022-02-26T16:42:56.749473Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"index = AnnoyIndex(item_data['vector'],item_data['id'])\nindex.build(100)","metadata":{"execution":{"iopub.status.busy":"2022-02-26T16:42:57.581610Z","iopub.execute_input":"2022-02-26T16:42:57.582055Z","iopub.status.idle":"2022-02-26T16:43:09.219914Z","shell.execute_reply.started":"2022-02-26T16:42:57.582025Z","shell.execute_reply":"2022-02-26T16:43:09.219265Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dd = {\"item\":[],\"similar_items\":[]}\nfor x in tqdm(range(len(item_data['vector']))):\n    similar_items = index.query(item_data['vector'][x])\n    dd['item'].append(item_data['id'][x])\n    dd['similar_items'].append(similar_items)","metadata":{"execution":{"iopub.status.busy":"2022-02-26T16:40:07.609029Z","iopub.execute_input":"2022-02-26T16:40:07.609241Z","iopub.status.idle":"2022-02-26T16:40:23.083341Z","shell.execute_reply.started":"2022-02-26T16:40:07.609212Z","shell.execute_reply":"2022-02-26T16:40:23.082713Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"item_similarities = pd.DataFrame(dd)","metadata":{"execution":{"iopub.status.busy":"2022-02-26T16:55:14.729627Z","iopub.execute_input":"2022-02-26T16:55:14.730123Z","iopub.status.idle":"2022-02-26T16:55:14.868865Z","shell.execute_reply.started":"2022-02-26T16:55:14.730079Z","shell.execute_reply":"2022-02-26T16:55:14.868082Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Plot sample items","metadata":{}},{"cell_type":"code","source":"sample = list(item_similarities.sample(10)['item'])","metadata":{"execution":{"iopub.status.busy":"2022-02-26T16:50:05.943845Z","iopub.execute_input":"2022-02-26T16:50:05.944088Z","iopub.status.idle":"2022-02-26T16:50:05.951174Z","shell.execute_reply.started":"2022-02-26T16:50:05.944063Z","shell.execute_reply":"2022-02-26T16:50:05.950421Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"id = str(sample[0])\npath = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\nimg = mpimg.imread(path)\nimgplot = plt.imshow(img)\nplt.axis('off')\nplt.show()\n\nsimilar_items = list(item_similarities[item_similarities['item']==int(id)]['similar_items'])[0]\n_,ax = plt.subplots(1,len(similar_items),figsize=(15,10))\n\nfor i,x in enumerate(similar_items):\n    id = str(x)\n    path = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\n    img = mpimg.imread(path)\n    ax[i].imshow(img)\n    ax[i].axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-02-26T16:50:16.803713Z","iopub.execute_input":"2022-02-26T16:50:16.803982Z","iopub.status.idle":"2022-02-26T16:50:19.194973Z","shell.execute_reply.started":"2022-02-26T16:50:16.803954Z","shell.execute_reply":"2022-02-26T16:50:19.194181Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"id = str(sample[1])\npath = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\nimg = mpimg.imread(path)\nimgplot = plt.imshow(img)\nplt.axis('off')\nplt.show()\n\nsimilar_items = list(item_similarities[item_similarities['item']==int(id)]['similar_items'])[0]\n_,ax = plt.subplots(1,len(similar_items),figsize=(15,10))\n\nfor i,x in enumerate(similar_items):\n    id = str(x)\n    path = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\n    img = mpimg.imread(path)\n    ax[i].imshow(img)\n    ax[i].axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-02-26T16:53:20.738151Z","iopub.execute_input":"2022-02-26T16:53:20.738399Z","iopub.status.idle":"2022-02-26T16:53:24.538498Z","shell.execute_reply.started":"2022-02-26T16:53:20.738372Z","shell.execute_reply":"2022-02-26T16:53:24.537746Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"id = str(sample[2])\npath = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\nimg = mpimg.imread(path)\nimgplot = plt.imshow(img)\nplt.axis('off')\nplt.show()\n\nsimilar_items = list(item_similarities[item_similarities['item']==int(id)]['similar_items'])[0]\n_,ax = plt.subplots(1,len(similar_items),figsize=(15,10))\n\nfor i,x in enumerate(similar_items):\n    id = str(x)\n    path = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\n    img = mpimg.imread(path)\n    ax[i].imshow(img)\n    ax[i].axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-02-26T16:53:06.491217Z","iopub.execute_input":"2022-02-26T16:53:06.492476Z","iopub.status.idle":"2022-02-26T16:53:09.693044Z","shell.execute_reply.started":"2022-02-26T16:53:06.492413Z","shell.execute_reply":"2022-02-26T16:53:09.691979Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"id = str(sample[3])\npath = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\nimg = mpimg.imread(path)\nimgplot = plt.imshow(img)\nplt.axis('off')\nplt.show()\n\nsimilar_items = list(item_similarities[item_similarities['item']==int(id)]['similar_items'])[0]\n_,ax = plt.subplots(1,len(similar_items),figsize=(15,10))\n\nfor i,x in enumerate(similar_items):\n    id = str(x)\n    path = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\n    img = mpimg.imread(path)\n    ax[i].imshow(img)\n    ax[i].axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-02-26T16:52:40.598936Z","iopub.execute_input":"2022-02-26T16:52:40.599215Z","iopub.status.idle":"2022-02-26T16:52:43.023450Z","shell.execute_reply.started":"2022-02-26T16:52:40.599186Z","shell.execute_reply":"2022-02-26T16:52:43.022721Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"id = str(sample[4])\npath = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\nimg = mpimg.imread(path)\nimgplot = plt.imshow(img)\nplt.axis('off')\nplt.show()\n\nsimilar_items = list(item_similarities[item_similarities['item']==int(id)]['similar_items'])[0]\n_,ax = plt.subplots(1,len(similar_items),figsize=(15,10))\n\nfor i,x in enumerate(similar_items):\n    id = str(x)\n    path = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\n    img = mpimg.imread(path)\n    ax[i].imshow(img)\n    ax[i].axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-02-26T16:52:17.741425Z","iopub.execute_input":"2022-02-26T16:52:17.742148Z","iopub.status.idle":"2022-02-26T16:52:19.874031Z","shell.execute_reply.started":"2022-02-26T16:52:17.742119Z","shell.execute_reply":"2022-02-26T16:52:19.873150Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"id = str(sample[5])\npath = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\nimg = mpimg.imread(path)\nimgplot = plt.imshow(img)\nplt.axis('off')\nplt.show()\n\nsimilar_items = list(item_similarities[item_similarities['item']==int(id)]['similar_items'])[0]\n_,ax = plt.subplots(1,len(similar_items),figsize=(15,10))\n\nfor i,x in enumerate(similar_items):\n    id = str(x)\n    path = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\n    img = mpimg.imread(path)\n    ax[i].imshow(img)\n    ax[i].axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-02-26T16:55:19.450788Z","iopub.execute_input":"2022-02-26T16:55:19.451383Z","iopub.status.idle":"2022-02-26T16:55:21.984712Z","shell.execute_reply.started":"2022-02-26T16:55:19.451350Z","shell.execute_reply":"2022-02-26T16:55:21.984003Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"id = str(sample[6])\npath = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\nimg = mpimg.imread(path)\nimgplot = plt.imshow(img)\nplt.axis('off')\nplt.show()\n\nsimilar_items = list(item_similarities[item_similarities['item']==int(id)]['similar_items'])[0]\n_,ax = plt.subplots(1,len(similar_items),figsize=(15,10))\n\nfor i,x in enumerate(similar_items):\n    id = str(x)\n    path = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\n    img = mpimg.imread(path)\n    ax[i].imshow(img)\n    ax[i].axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-02-26T16:55:46.653935Z","iopub.execute_input":"2022-02-26T16:55:46.654389Z","iopub.status.idle":"2022-02-26T16:55:48.576320Z","shell.execute_reply.started":"2022-02-26T16:55:46.654361Z","shell.execute_reply":"2022-02-26T16:55:48.575633Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"id = str(sample[7])\npath = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\nimg = mpimg.imread(path)\nimgplot = plt.imshow(img)\nplt.axis('off')\nplt.show()\n\nsimilar_items = list(item_similarities[item_similarities['item']==int(id)]['similar_items'])[0]\n_,ax = plt.subplots(1,len(similar_items),figsize=(15,10))\n\nfor i,x in enumerate(similar_items):\n    id = str(x)\n    path = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\n    img = mpimg.imread(path)\n    ax[i].imshow(img)\n    ax[i].axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-02-26T16:55:54.002171Z","iopub.execute_input":"2022-02-26T16:55:54.002613Z","iopub.status.idle":"2022-02-26T16:55:57.256318Z","shell.execute_reply.started":"2022-02-26T16:55:54.002549Z","shell.execute_reply":"2022-02-26T16:55:57.255658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"id = str(sample[8])\npath = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\nimg = mpimg.imread(path)\nimgplot = plt.imshow(img)\nplt.axis('off')\nplt.show()\n\nsimilar_items = list(item_similarities[item_similarities['item']==int(id)]['similar_items'])[0]\n_,ax = plt.subplots(1,len(similar_items),figsize=(15,10))\n\nfor i,x in enumerate(similar_items):\n    id = str(x)\n    path = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\n    img = mpimg.imread(path)\n    ax[i].imshow(img)\n    ax[i].axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-02-26T16:55:58.983557Z","iopub.execute_input":"2022-02-26T16:55:58.984349Z","iopub.status.idle":"2022-02-26T16:56:01.367296Z","shell.execute_reply.started":"2022-02-26T16:55:58.984316Z","shell.execute_reply":"2022-02-26T16:56:01.365004Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"id = str(sample[9])\npath = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\nimg = mpimg.imread(path)\nimgplot = plt.imshow(img)\nplt.axis('off')\nplt.show()\n\nsimilar_items = list(item_similarities[item_similarities['item']==int(id)]['similar_items'])[0]\n_,ax = plt.subplots(1,len(similar_items),figsize=(15,10))\n\nfor i,x in enumerate(similar_items):\n    id = str(x)\n    path = f\"../input/h-and-m-personalized-fashion-recommendations/images/0{id[0:2]}/0{id}.jpg\"\n    img = mpimg.imread(path)\n    ax[i].imshow(img)\n    ax[i].axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-02-26T16:56:07.194467Z","iopub.execute_input":"2022-02-26T16:56:07.194920Z","iopub.status.idle":"2022-02-26T16:56:09.547994Z","shell.execute_reply.started":"2022-02-26T16:56:07.194875Z","shell.execute_reply":"2022-02-26T16:56:09.547219Z"},"trusted":true},"execution_count":null,"outputs":[]}]}