{"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 cudf\nprint('RAPIDS version',cudf.__version__)","metadata":{"execution":{"iopub.status.busy":"2022-12-27T07:31:46.400702Z","iopub.execute_input":"2022-12-27T07:31:46.401105Z","iopub.status.idle":"2022-12-27T07:31:50.171968Z","shell.execute_reply.started":"2022-12-27T07:31:46.401016Z","shell.execute_reply":"2022-12-27T07:31:50.170669Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = cudf.read_csv('../input/h-and-m-personalized-fashion-recommendations/transactions_train.csv')\ntrain['customer_id'] = train['customer_id'].str[-16:].str.hex_to_int().astype('int64')\ntrain['article_id'] = train.article_id.astype('int32')\ntrain.t_dat = cudf.to_datetime(train.t_dat)\ntrain = train[['t_dat','customer_id','article_id']]\ntrain.to_parquet('train.pqt',index=False)\nprint( train.shape )\ntrain.head()","metadata":{"execution":{"iopub.status.busy":"2022-12-27T07:39:08.253627Z","iopub.execute_input":"2022-12-27T07:39:08.253898Z","iopub.status.idle":"2022-12-27T07:39:49.123736Z","shell.execute_reply.started":"2022-12-27T07:39:08.253869Z","shell.execute_reply":"2022-12-27T07:39:49.122926Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tmp = train.groupby('customer_id').t_dat.max().reset_index()\ntmp.columns = ['customer_id','max_dat']\ntrain = train.merge(tmp,on=['customer_id'],how='left')\ntrain['diff_dat'] = (train.max_dat - train.t_dat).dt.days\ntrain = train.loc[train['diff_dat']<=6]\nprint('Train shape:',train.shape)","metadata":{"execution":{"iopub.status.busy":"2022-12-27T07:40:05.675941Z","iopub.execute_input":"2022-12-27T07:40:05.676246Z","iopub.status.idle":"2022-12-27T07:40:05.869131Z","shell.execute_reply.started":"2022-12-27T07:40:05.676214Z","shell.execute_reply":"2022-12-27T07:40:05.868196Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tmp = train.groupby(['customer_id','article_id'])['t_dat'].agg('count').reset_index()\ntmp.columns = ['customer_id','article_id','ct']\ntrain = train.merge(tmp,on=['customer_id','article_id'],how='left')\ntrain = train.sort_values(['ct','t_dat'],ascending=False)\ntrain = train.drop_duplicates(['customer_id','article_id'])\ntrain = train.sort_values(['ct','t_dat'],ascending=False)\ntrain.head()","metadata":{"execution":{"iopub.status.busy":"2022-12-27T07:40:11.769146Z","iopub.execute_input":"2022-12-27T07:40:11.769410Z","iopub.status.idle":"2022-12-27T07:40:12.037664Z","shell.execute_reply.started":"2022-12-27T07:40:11.769380Z","shell.execute_reply":"2022-12-27T07:40:12.036797Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# USE PANDAS TO MAP COLUMN WITH DICTIONARY\nimport pandas as pd, numpy as np\ntrain = train.to_pandas()\npairs = np.load('../input/hmitempairs/pairs_cudf.npy',allow_pickle=True).item()\ntrain['article_id2'] = train.article_id.map(pairs)","metadata":{"execution":{"iopub.status.busy":"2022-12-27T07:40:17.735489Z","iopub.execute_input":"2022-12-27T07:40:17.735781Z","iopub.status.idle":"2022-12-27T07:40:18.256931Z","shell.execute_reply.started":"2022-12-27T07:40:17.735748Z","shell.execute_reply":"2022-12-27T07:40:18.255514Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# RECOMMENDATION OF PAIRED ITEMS\ntrain2 = train[['customer_id','article_id2']].copy()\ntrain2 = train2.loc[train2.article_id2.notnull()]\ntrain2 = train2.drop_duplicates(['customer_id','article_id2'])\ntrain2 = train2.rename({'article_id2':'article_id'},axis=1)","metadata":{"execution":{"iopub.status.busy":"2022-12-27T07:40:20.585523Z","iopub.execute_input":"2022-12-27T07:40:20.586211Z","iopub.status.idle":"2022-12-27T07:40:21.691589Z","shell.execute_reply.started":"2022-12-27T07:40:20.586175Z","shell.execute_reply":"2022-12-27T07:40:21.690822Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# CONCATENATE PAIRED ITEM RECOMMENDATION AFTER PREVIOUS PURCHASED RECOMMENDATIONS\ntrain = train[['customer_id','article_id']]\ntrain = pd.concat([train,train2],axis=0,ignore_index=True)\ntrain.article_id = train.article_id.astype('int32')\ntrain = train.drop_duplicates(['customer_id','article_id'])","metadata":{"execution":{"iopub.status.busy":"2022-12-27T07:40:25.585610Z","iopub.execute_input":"2022-12-27T07:40:25.586540Z","iopub.status.idle":"2022-12-27T07:40:27.592752Z","shell.execute_reply.started":"2022-12-27T07:40:25.586474Z","shell.execute_reply":"2022-12-27T07:40:27.591945Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# CONVERT RECOMMENDATIONS INTO SINGLE STRING\ntrain.article_id = ' 0' + train.article_id.astype('str')\npreds = cudf.DataFrame( train.groupby('customer_id').article_id.sum().reset_index() )\npreds.columns = ['customer_id','prediction']\npreds.head()","metadata":{"execution":{"iopub.status.busy":"2022-12-27T07:40:28.814753Z","iopub.execute_input":"2022-12-27T07:40:28.815031Z","iopub.status.idle":"2022-12-27T07:40:36.900088Z","shell.execute_reply.started":"2022-12-27T07:40:28.815001Z","shell.execute_reply":"2022-12-27T07:40:36.899222Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = cudf.read_parquet('train.pqt')\ntrain.t_dat = cudf.to_datetime(train.t_dat)\ntrain = train.loc[train.t_dat >= cudf.to_datetime('2020-09-16')]\ntop12 = ' 0' + ' 0'.join(train.article_id.value_counts().to_pandas().index.astype('str')[:12])\nprint(\"Last week's top 12 popular items:\")\nprint( top12 )","metadata":{"execution":{"iopub.status.busy":"2022-12-27T07:40:37.257222Z","iopub.execute_input":"2022-12-27T07:40:37.257669Z","iopub.status.idle":"2022-12-27T07:40:37.476911Z","shell.execute_reply.started":"2022-12-27T07:40:37.257632Z","shell.execute_reply":"2022-12-27T07:40:37.476173Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Write Submission CSV\nWe will merge our predictions onto `sample_submission.csv` and submit to Kaggle.","metadata":{}},{"cell_type":"code","source":"sub = cudf.read_csv('../input/h-and-m-personalized-fashion-recommendations/sample_submission.csv')\nsub = sub[['customer_id']]\nsub['customer_id_2'] = sub['customer_id'].str[-16:].str.hex_to_int().astype('int64')\nsub = sub.merge(preds.rename({'customer_id':'customer_id_2'},axis=1),\\\n    on='customer_id_2', how='left').fillna('')\ndel sub['customer_id_2']\nsub.prediction = sub.prediction + top12\nsub.prediction = sub.prediction.str.strip()\nsub.prediction = sub.prediction.str[:131]\nsub.to_csv(f'submission.csv',index=False)\nsub.head()","metadata":{"execution":{"iopub.status.busy":"2022-12-27T07:40:42.461176Z","iopub.execute_input":"2022-12-27T07:40:42.461438Z","iopub.status.idle":"2022-12-27T07:40:46.743961Z","shell.execute_reply.started":"2022-12-27T07:40:42.461409Z","shell.execute_reply":"2022-12-27T07:40:46.741677Z"},"trusted":true},"execution_count":null,"outputs":[]}]}