{"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 datetime import datetime\nfrom pathlib import Path\n\ndata_path = Path('/kaggle/input/h-and-m-personalized-fashion-recommendations/')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-06-06T22:11:00.832564Z","iopub.execute_input":"2022-06-06T22:11:00.833263Z","iopub.status.idle":"2022-06-06T22:11:00.839296Z","shell.execute_reply.started":"2022-06-06T22:11:00.833224Z","shell.execute_reply":"2022-06-06T22:11:00.838187Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"original_data= transactions = pd.read_csv(\n    data_path / 'transactions_train.csv',\n    dtype={'article_id': str} )\n\nsubmission = pd.read_csv(data_path / 'sample_submission.csv')\n\ntransactions['t_dat'] = pd.to_datetime(transactions['t_dat'])\ntransactions['month'] = transactions['t_dat'].dt.month\n","metadata":{"execution":{"iopub.status.busy":"2022-06-06T22:11:02.682292Z","iopub.execute_input":"2022-06-06T22:11:02.682721Z","iopub.status.idle":"2022-06-06T22:12:11.658504Z","shell.execute_reply.started":"2022-06-06T22:11:02.682686Z","shell.execute_reply":"2022-06-06T22:12:11.657410Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#The span\nprint(transactions['t_dat'].min())\nprint(transactions['t_dat'].max())\n","metadata":{"execution":{"iopub.status.busy":"2022-06-06T22:12:46.815537Z","iopub.execute_input":"2022-06-06T22:12:46.815957Z","iopub.status.idle":"2022-06-06T22:12:47.034809Z","shell.execute_reply.started":"2022-06-06T22:12:46.815926Z","shell.execute_reply":"2022-06-06T22:12:47.033430Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Considering the predicted purchase time is Sep, Only take 6,7,8,9,10,11,12 month into consideration. \n#Using last week of final purchase as validation.\noriginal_transactions = transactions.loc[transactions['month'] >= 6]\ntransactions = original_transactions.loc[transactions['t_dat']<datetime(2020, 9, 7)]\n#valid_transactions = original_data.loc[transactions['t_dat']>=datetime(2020, 9, 7)]\n","metadata":{"execution":{"iopub.status.busy":"2022-06-06T22:12:49.119096Z","iopub.execute_input":"2022-06-06T22:12:49.119542Z","iopub.status.idle":"2022-06-06T22:12:52.916150Z","shell.execute_reply.started":"2022-06-06T22:12:49.119509Z","shell.execute_reply":"2022-06-06T22:12:52.915140Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Pursue a dict the key is customer_id the value is also a dict of the article and corresponding purchase times.\ndef create_dict(transactions,purchase_dict):\n    for i,x in enumerate(zip(transactions['customer_id'], transactions['article_id'])):\n        cust_id, art_id = x\n        if cust_id not in purchase_dict:\n            purchase_dict[cust_id] = {}\n    \n        if art_id not in purchase_dict[cust_id]:\n            purchase_dict[cust_id][art_id] = 0\n    \n        purchase_dict[cust_id][art_id] += 1\n\n","metadata":{"execution":{"iopub.status.busy":"2022-06-06T22:13:01.275662Z","iopub.execute_input":"2022-06-06T22:13:01.276539Z","iopub.status.idle":"2022-06-06T22:13:01.282688Z","shell.execute_reply.started":"2022-06-06T22:13:01.276498Z","shell.execute_reply":"2022-06-06T22:13:01.281954Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Avoid Out of Memory\nn_split_prediction = 1000\npurchase_dict = {}\nn_chunk = (len(transactions) + n_split_prediction - 1)// n_split_prediction\nfor i in range(0, len(transactions), n_chunk):\n    #print(f\"chunk: {i}\")\n    \n    target_transactions = transactions.iloc[i:i+n_chunk]\n    create_dict(target_transactions,purchase_dict)\n    \n    \n    ","metadata":{"execution":{"iopub.status.busy":"2022-06-06T22:13:05.219426Z","iopub.execute_input":"2022-06-06T22:13:05.220095Z","iopub.status.idle":"2022-06-06T22:13:31.267839Z","shell.execute_reply.started":"2022-06-06T22:13:05.220055Z","shell.execute_reply":"2022-06-06T22:13:31.266762Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Caculate top12 items to make up for the absent position of previous purchase\ntop12 = list(transactions[\"article_id\"].value_counts().index[:12])","metadata":{"execution":{"iopub.status.busy":"2022-06-06T22:14:04.515319Z","iopub.execute_input":"2022-06-06T22:14:04.516369Z","iopub.status.idle":"2022-06-06T22:14:09.268334Z","shell.execute_reply.started":"2022-06-06T22:14:04.516320Z","shell.execute_reply":"2022-06-06T22:14:09.267246Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = submission[[\"customer_id\"]]\nstring_top12 = ' '.join(top12)\n\n#According to the customers submmision provided, to predict items mainly based on the previous purchase.\ndef generate_prediciton(submission,purchase_dict,prediction_list,top12,string_top12):\n    for i, cust_id in enumerate(submission['customer_id'].values):\n        if cust_id in purchase_dict:\n            l = sorted((purchase_dict[cust_id]).items(), key=lambda x: x[1], reverse=True)\n            l = [y[0] for y in l]\n            if len(l)>12:\n                s = ' '.join(l[:12])\n            else:\n                s = ' '.join(l+top12[:(12-len(l))])\n        else:\n            s = string_top12\n        prediction_list.append(s)\n    return prediction_list\nsub[\"prediction\"]= generate_prediciton(submission,purchase_dict,[],top12,string_top12)\nprint(sub.head())\n\n ","metadata":{"execution":{"iopub.status.busy":"2022-06-06T22:14:09.271405Z","iopub.execute_input":"2022-06-06T22:14:09.272669Z","iopub.status.idle":"2022-06-06T22:14:18.728431Z","shell.execute_reply.started":"2022-06-06T22:14:09.272628Z","shell.execute_reply":"2022-06-06T22:14:18.726532Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-06-06T22:14:23.213211Z","iopub.execute_input":"2022-06-06T22:14:23.214372Z","iopub.status.idle":"2022-06-06T22:14:35.992282Z","shell.execute_reply.started":"2022-06-06T22:14:23.214310Z","shell.execute_reply":"2022-06-06T22:14:35.991325Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Evaluation\nevaluation = original_data.loc[original_data['t_dat'] >datetime(2020, 9, 7)]\nvalid_y = list(evaluation[\"article_id\"])\nx = evaluation[\"customer_id\"]\n\n\ndef generate_single_prediciton(submission,purchase_dict,prediction_list,top12):\n    for i, cust_id in enumerate(submission['customer_id'].values):\n        if cust_id in purchase_dict:\n            l = sorted((purchase_dict[cust_id]).items(), key=lambda x: x[1], reverse=True)\n            l = [y[0] for y in l]\n            if len(l)>0:\n                s = l[0]\n            else:\n                s = top12[0]\n        else:\n            s = top12[0]\n        prediction_list.append(s)\n    return prediction_list\n\npredicted_y = generate_single_prediciton(evaluation,purchase_dict,[],top12)\n\ncorrect_count = 0\nfor i in range(len(predicted_y)):\n    if predicted_y[i] == valid_y[i]:\n        correct_count += 1\nprecision = correct_count / len(evaluation)\nprint(precision)\n","metadata":{"execution":{"iopub.status.busy":"2022-06-06T22:10:41.054708Z","iopub.execute_input":"2022-06-06T22:10:41.055717Z","iopub.status.idle":"2022-06-06T22:10:46.955057Z","shell.execute_reply.started":"2022-06-06T22:10:41.055670Z","shell.execute_reply":"2022-06-06T22:10:46.953881Z"},"trusted":true},"execution_count":null,"outputs":[]}]}