{"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":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\n#for dirname, _, filenames in os.walk('/kaggle/input'):\n #   for filename in filenames:\n    #    print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-05-19T05:43:32.814366Z","iopub.execute_input":"2022-05-19T05:43:32.815099Z","iopub.status.idle":"2022-05-19T05:43:32.840717Z","shell.execute_reply.started":"2022-05-19T05:43:32.814985Z","shell.execute_reply":"2022-05-19T05:43:32.840032Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#articles=pd.read_csv(\"../input/h-and-m-personalized-fashion-recommendations/articles.csv\")\n#customers=pd.read_csv(\"../input/h-and-m-personalized-fashion-recommendations/customers.csv\")\n#sample_submission=pd.read_csv(\"../input/h-and-m-personalized-fashion-recommendations/sample_submission.csv\")\ntransactions_train=pd.read_csv(\"../input/h-and-m-personalized-fashion-recommendations/transactions_train.csv\")","metadata":{"execution":{"iopub.status.busy":"2022-05-19T05:47:28.096225Z","iopub.execute_input":"2022-05-19T05:47:28.096642Z","iopub.status.idle":"2022-05-19T05:48:27.591886Z","shell.execute_reply.started":"2022-05-19T05:47:28.096601Z","shell.execute_reply":"2022-05-19T05:48:27.590633Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transactions_train = transactions_train.groupby(['customer_id', 't_dat'], as_index=False)[['article_id']].agg(list)\ntransactions_train.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from collections import defaultdict\nitem_map=defaultdict(int)\nfor it, article_ids in enumerate(transactions_train.article_id.values):\n    num_articles = len(article_ids)\n    for article_id in article_ids:\n        item_map[article_id] += 1\n        \nitem_df = pd.DataFrame.from_dict({\n    'item': item_map.keys(),\n    'freq': item_map.values()\n})\nitem_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-05-14T14:19:10.573482Z","iopub.execute_input":"2022-05-14T14:19:10.574247Z","iopub.status.idle":"2022-05-14T14:19:22.56496Z","shell.execute_reply.started":"2022-05-14T14:19:10.574205Z","shell.execute_reply":"2022-05-14T14:19:22.56428Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"item_df = item_df[ item_df.freq > 20]\ncandidate_items = set(item_df.item.values)","metadata":{"execution":{"iopub.status.busy":"2022-05-14T14:19:26.423698Z","iopub.execute_input":"2022-05-14T14:19:26.424361Z","iopub.status.idle":"2022-05-14T14:19:26.446482Z","shell.execute_reply.started":"2022-05-14T14:19:26.424319Z","shell.execute_reply":"2022-05-14T14:19:26.445765Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\npair_map={}\nfor it, article_ids in enumerate(transactions_train.article_id.values):\n    if it%1000000 == 0:\n        print(it)\n    num_articles = len(article_ids)\n    for i in range(num_articles):\n        item1 = article_ids[i]\n        if item1 not in candidate_items:\n            continue\n            \n        for j in range(i+1, num_articles):\n            item2 = article_ids[j]\n            if item2 not in candidate_items:\n                continue\n                \n            if item1 not in pair_map:\n                pair_map[item1] = {}\n            if item2 not in pair_map:\n                pair_map[item2] = {}\n            \n            if item2 not in pair_map[item1]:\n                pair_map[item1][item2] = 0\n            if item1 not in pair_map[item2]:\n                pair_map[item2][item1] = 0\n            \n            pair_map[item1][item2] += 1\n            pair_map[item2][item1] += 1","metadata":{"execution":{"iopub.status.busy":"2022-05-14T14:19:31.683672Z","iopub.execute_input":"2022-05-14T14:19:31.683979Z","iopub.status.idle":"2022-05-14T14:23:41.069071Z","shell.execute_reply.started":"2022-05-14T14:19:31.683946Z","shell.execute_reply":"2022-05-14T14:23:41.068293Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"item1 = []\nitem2 = []\nfreq  = []\n\nfor i1 in pair_map.keys():\n    for i2 in pair_map[i1].keys():\n        v = pair_map[i1][i2]\n        if v <= 20:\n            continue\n        item1.append(i1)\n        item2.append(i2)\n        freq.append(v)\n\npair_df = pd.DataFrame.from_dict({ 'item1': item1, 'item2': item2, 'joint_freq': freq})\npair_df['item_freq1'] = pair_df.item1.apply(lambda k: item_map[k])\npair_df['item_freq2'] = pair_df.item2.apply(lambda k: item_map[k])\npair_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-05-14T14:23:41.070811Z","iopub.execute_input":"2022-05-14T14:23:41.071077Z","iopub.status.idle":"2022-05-14T14:24:06.806228Z","shell.execute_reply.started":"2022-05-14T14:23:41.071042Z","shell.execute_reply":"2022-05-14T14:24:06.805587Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pair_df = pair_df[pair_df.joint_freq>20]\npair_df['confidence'] = pair_df.joint_freq.div(pair_df['item_freq1'])\npair_df = pair_df.sort_values(['item1', 'confidence'], ascending=[True, False])\n\npair_df = pair_df.groupby('item1').head(10)\npair_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-05-14T14:24:36.920576Z","iopub.execute_input":"2022-05-14T14:24:36.921233Z","iopub.status.idle":"2022-05-14T14:24:37.288114Z","shell.execute_reply.started":"2022-05-14T14:24:36.921188Z","shell.execute_reply":"2022-05-14T14:24:37.287336Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transactions_train = transactions_train.groupby('customer_id', as_index=False)[['article_id']].agg(list)\ntransactions_train.head()","metadata":{"execution":{"iopub.status.busy":"2022-05-14T14:25:08.078089Z","iopub.execute_input":"2022-05-14T14:25:08.078672Z","iopub.status.idle":"2022-05-14T14:25:08.094667Z","shell.execute_reply.started":"2022-05-14T14:25:08.078624Z","shell.execute_reply":"2022-05-14T14:25:08.093285Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_recommended_items(articles):\n    df = pair_df[pair_df.item1.isin(articles)]\n    df.groupby('item2', as_index=False)[['joint_freq']].sum().sort_values('joint_freq', ascending=False)\n    df = df.head(12)\n    items = df.item2.values\n    #items = ' '.join(items)\n    return items","metadata":{"execution":{"iopub.status.busy":"2022-05-14T14:25:26.821094Z","iopub.execute_input":"2022-05-14T14:25:26.821376Z","iopub.status.idle":"2022-05-14T14:25:26.826537Z","shell.execute_reply.started":"2022-05-14T14:25:26.821344Z","shell.execute_reply":"2022-05-14T14:25:26.825837Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"final_candidate_items = set(pair_df.item1.values)\nprint(len(final_candidate_items))","metadata":{"execution":{"iopub.status.busy":"2022-05-14T14:25:28.780364Z","iopub.execute_input":"2022-05-14T14:25:28.782632Z","iopub.status.idle":"2022-05-14T14:25:28.798762Z","shell.execute_reply.started":"2022-05-14T14:25:28.782574Z","shell.execute_reply":"2022-05-14T14:25:28.79772Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds=[]\nfor it, row in transactions_train.iterrows():\n    customer_id = row.customer_id\n    articles = []\n    for article_lst in row.article_id:\n        articles += article_lst\n    articles = set(articles)\n    cur_articles = final_candidate_items.intersection(articles)\n    \n    if len(cur_articles) == 0:\n        continue\n        \n    pred_items = get_recommended_items(cur_articles)\n    preds.append({\n        'customer_id': customer_id,\n        'prediction': pred_items\n    })\n    if it%100000==0:\n        print(it)\npred_df = pd.DataFrame.from_dict(preds)\npred_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-05-14T13:46:00.395833Z","iopub.execute_input":"2022-05-14T13:46:00.39647Z","iopub.status.idle":"2022-05-14T13:58:52.716532Z","shell.execute_reply.started":"2022-05-14T13:46:00.396427Z","shell.execute_reply":"2022-05-14T13:58:52.71531Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"popular_articles = \"0706016001 0720125001 0706016002 0372860001 0759871002 0610776002 0751471001 0372860002 0673677002 0706016003 0464297007 0562245046\"","metadata":{"execution":{"iopub.status.busy":"2022-05-16T10:44:22.772705Z","iopub.execute_input":"2022-05-16T10:44:22.773286Z","iopub.status.idle":"2022-05-16T10:44:22.798362Z","shell.execute_reply.started":"2022-05-16T10:44:22.773183Z","shell.execute_reply":"2022-05-16T10:44:22.797667Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nsub_df = pd.read_csv(\"../input/h-and-m-personalized-fashion-recommendations/sample_submission.csv\", usecols=['customer_id'])\nsub_df = sub_df.merge(pred_df, how='left')\nsub_df.prediction.fillna(popular_articles, inplace=True)\nsub_df.to_csv(\"submission.csv\", index=False)\n\nsub_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-05-14T13:58:52.717779Z","iopub.status.idle":"2022-05-14T13:58:52.718367Z","shell.execute_reply.started":"2022-05-14T13:58:52.718105Z","shell.execute_reply":"2022-05-14T13:58:52.718132Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}