{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### The Instacart Case Study\n",
"Instacart is an American company that operates as a same-day grocery delivery service. Customers select groceries through a web application from various retailers and delivered by a personal shopper. Instacart's service is mainly provided through a smartphone app, available on iOS and Android platforms, apart from its website.\n",
"\n",
"The objective is to predict which previously purchased products will be in a user’s next order."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Problem definition\n",
"The data that Instacart opened up include orders of 200,000 Instacart users with each user having between 4 and 100 orders. Instacart indicates each order in the data as prior, train or test. Prior orders describe the past behaviour of a user while train and test orders regard the future behaviour that we need to predict.\n",
"\n",
"As a result, we want to predict which previously purchased products (prior orders) will be in a user’s next order (train and test orders).\n",
"\n",
"For the train orders Instacart reveals the results (i.e., the ordered products) while for the test orders we do not have this piece of information. Moreover, the future order of each user can be either train or test meaning that each user will be either a train or a test user."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Factors that can lead to reorder:\n",
"+ Number of times product was ordered (frequency)\n",
"+ Time/day of order\n",
"+ Category\n",
"+ Quantity\n",
"+ Date since last order"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# Importing packages\n",
"\n",
"import pandas as pd \n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"import seaborn as sns\n",
"import gc # Garbage Collector to free up memory\n",
"gc.enable() # Activate "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# Importing all the data sets\n",
"\n",
"orders = pd.read_csv(r'C:\\Users\\Madhvi\\Desktop\\IVY - Project\\Session 6\\orders.csv')\n",
"order_products_train = pd.read_csv(r'C:\\Users\\Madhvi\\Desktop\\IVY - Project\\Session 6\\order_products_train.csv')\n",
"order_products_prior = pd.read_csv(r'C:\\Users\\Madhvi\\Desktop\\IVY - Project\\Session 6\\order_products_prior.csv')\n",
"products = pd.read_csv(r'C:\\Users\\Madhvi\\Desktop\\IVY - Project\\Session 6\\products.csv')\n",
"aisles = pd.read_csv(r'C:\\Users\\Madhvi\\Desktop\\IVY - Project\\Session 6\\aisles.csv')\n",
"departments = pd.read_csv(r'C:\\Users\\Madhvi\\Desktop\\IVY - Project\\Session 6\\departments.csv')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"### COMMANDS FOR CODING TESTING - Get 10% of users because data is big and might take some time to process\n",
"### Comment it if you want to run analysis on all the users\n",
"\n",
"orders = orders.loc[orders.user_id.isin(orders.user_id.drop_duplicates().sample(frac=0.1, random_state=25))]"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(12,8))\n",
"sns.countplot(x=\"order_dow\", data=orders, color = 'grey')\n",
"plt.ylabel('Count', fontsize=12)\n",
"plt.xlabel('Day of week', fontsize=12)\n",
"plt.xticks(rotation='vertical')\n",
"plt.title(\"Frequency of order by week day\", fontsize=15)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Seems like 0 and 1 is Saturday and Sunday when the orders are high and low during Wednesday.\n",
"\n",
"Now we shall see how the distribution is with respect to time of the day."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(12,8))\n",
"sns.countplot(x=\"order_hour_of_day\", data=orders)\n",
"plt.ylabel('Count', fontsize=12)\n",
"plt.xlabel('Hour of day', fontsize=12)\n",
"plt.xticks(rotation='vertical')\n",
"plt.title(\"Frequency of order by hour of day\", fontsize=15)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So majority of the orders are made during day time. Now let us combine the day of week and hour of day to see the distribution."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAApgAAAGECAYAAACSzVC0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3deZwldX3v/9d7BphhX0QQGBRMcL+IQJC4IIqJoAbwZ0gwJqIhmavXRM0qXnMjXENEE9fkajJuoBiVuBKXCKKACzuKrAoKwgiCqMi+zPTn90dV66Hp7uml6kz34fWcRz26zrdOfeo7p0/1+ZzvUpWqQpIkSerKkvVdAUmSJI0WE0xJkiR1ygRTkiRJnTLBlCRJUqdMMCVJktQpE0xJkiR1ygRTepBLsn2SM5PcluSt67s+00mycZL/SvKLJP+5nupwTZJnr49jL1RpfDDJz5OcO4Pn75KkkmwwjPpJGj4TTI2sNhG4K8ntA8uO67teC9BK4GZgi6r6q4kbkxyf5N42Ab0tySVJ3pRky+FXld8FtgceUlWHrYfjz1iSK5L88STlr05y/ixjHZ3kxEnKK8mvz6eeHXka8FvAiqraZ31XRtL6Z4KpUfc7VbXZwHL9xCfYisIjgMtq+rsuvKWqNgceCrwM2Bf4RpJNh1HBAY8AvldVa4Z83Lk4AXjJJOV/1G5bsJIsneUujwCuqao7+qiPpMXHBFMPOgPdc0cmuRb4Slu+b5JvJrklyUVJ9h/YZ9ckZ7QteKcm+dfxFqUk+ydZPeEYv+xGTbIkyVFJvp/kp0lOSrLNhLockeTaJDcnef1AnKVJ/ne7721JLkiyc5L/N7E7u+06fs0U/+enJDmv7Vo+L8lT2vLjgSOAv21beKft+q2qu6vqPOBg4CE0ySZJfi3JV9r/381JPpJkq3bb3yT55IT6/EuSd0xR18cmOb39PVya5OC2/Bjg74Hfb+t65IT9lrct1tu2j/8uyZokW7SP/2H8mEmWJfnn9jW/Mcm/Jdl4INbzk3y7rcM3k+w+RV0fk+TqJIdPsvnDwNOSPGLw/wbsDny0ffzSJD9of7dXJ3nxFC/9OrX/p3ckub5d3pFk2cBxvj7h+b9s/Wxbqd+T5AtJ7gCeOUn8HZOcnORnSa5K8qdt+ZHA+4DfbH8vx0yy79L29b45yQ+A503Y/rIkl7evww+S/M+BbZck+Z2Bxxu2cfaY62slaQiqysVlJBfgGuDZk5TvAhTwIWBTYGNgJ+CnwHNpvnj9Vvv4oe0+ZwFvA5YB+wG3ASe22/YHVk91bOA1wNnAinb/fwc+OqEu723r8UTgHuCx7fa/AS4GHg2k3f4QYB/gemBJ+7xtgTuB7Sf5/24D/Jym5WwD4EXt44e0248H/mGa13HS7e3r9/F2/dfb12wZTSvnmcA72m07AHcAW7WPNwBuAvaaJOaGwFXA/wY2Ap7VvtaPbrcfPf66T1HXM4EXtuunAN8HDhrY9oJ2/R3Aye1rsznwX8Cb2m17tvV7MrCUJgG/Blg2+Lttn3ct8Pxp6nMq8HcDj98EfKZd3xS4deD/tgPw+CniTPr/bt87v96u/1+a99l27e/gm8Ab220vBb4+zb7HA78Ankrz/l8+ybHOAN4NLAf2AH4CHDBV/An7vhy4Ati5fc2/2h5/g3b784Bfo3mPP4Pmvbxnu+1vad9n7eNDgIvX998XFxeX6RdbMDXqPtO2Qt2S5DMTth1dVXdU1V3AHwJfqKovVNVYVZ0KnA88N8nDgd8A/k9V3VNVZ9IkJDP1P4HXV9XqqrqHJln43dy/a/6Yqrqrqi4CLqJJJAH+hCZB+W41Lqqqn1bVuTQJwQHt8w4HTq+qGyc5/vOAK6vqw1W1pqo+SvNh/zuTPHc2rqdJFqiqq6rq1Pb1+QlNMv6MdtsNNMnd+JjJA4Gbq+qCSWLuC2wGHFdV91bVV4DP0STFM3EG8Iz2td0deFf7eDnN7/BrSQL8KfAXVfWzqroN+Eea15B2279X1TlVtbaqTqBJ+vcdOM7TaRLUI6rqc9PU5wSaxJ4kS4AXc//u8THgCUk2rqobqurSaWL93sB7+ZYkt0zY/mLg/1bVTe3v4JjxY8/QZ6vqG+37/+7BDUl2phln+dpqWrG/TdNqOdP4v0fzheO6qvoZTaL9S1X1+ar6fvseP4Pmy8HT280n0pyHW7SP/4imdVjSAmaCqVF3aFVt1S6HTth23cD6I4DDJnx4P42mVWlH4Od1//FlP5xFHR4BfHog7uXAWprJKuN+PLB+J02SBU2Lz/eniHsCTWJM+3OqD90dJ6nvD2labedjJ+BnAEm2S/KxJD9KcitNUrDtHOt6XVWNzbGuZ9C0KO9J0/J7Kk2iuy9wVVXdTNO6twlwwcDv5L/bcmh+X3814b2wc1u3cS8HvllVX11HfT4F7JBk37ZemwCfB2jfT7/fxrohyeeTPGaaWCcNvJe3qqqtJmyf+Hv+4YQ6r8t102zbERhPxgfjz/T3suOE+Pd7PyY5KMnZbff7LTQ9CdsCVDNu+hvAC9thFwcBH5nhcSWtJyaYejAbnNRyHfDhCR/gm1bVccANwNa5/4SWhw+s30GTOAC/nCDx0IHt19F00w7GXl5VP5pBHa+j6TqczInAIUmeCDwWmNhCO+56mqRp0MOBmRx/Ukk2o+km/lpb9Caa13P3qtqCJonMwC6fAXZP8gTg+UydIFwP7Ny29s2lrt+kGU7wAuCMqrqs3f95NMknNDPm76Lpjh7/fWxZVeNJ/XXAsRN+X5u0Lb/jXg48PMnbp6tMVd0JfIJmss8fAR+rqnsHtn+pqn6L5ovMFTRDJeZq4u/54W0ZPPA9+rDJqruO2Nsk2XxC/Jn+Xm6gSdIH9x2vyzLgk8A/0wzx2Ar4Avd//4x/QTkMOGuG546k9cgEU2qcCPxOkue0ExKWp5m8s6KqfkjTXX5Mko2SPI37dy9/D1ie5HlJNgT+jmYs4rh/A44dn+yR5KFJDplhvd4HvDHJbmnsnuQhAFW1GjiPpjXwk21X/2S+ADwqyR8k2SDJ7wOPo+l6npV2IsleNAnjz4EPtps2B24HbkmyE83Y0V9qu1w/AfwHcG5VXTvFIc6hSYb+tp3MsT/Na/2xmdSvTeguAF7JrxLKb9IMUzijfc4YTSL39iTbtf+vnZI8p33+e4GXJ3ly+5pv2v5uB5Or22i6+vdLctw6qnUCTUvlCxnoHk9z/dGD2y8u99C8fmtn8v+cwkeBv2vfX9vSTIgav7TRRcDjk+zRDhc4ejaBq+o6mtfxTe25sTtwJDNvSTwJeFWSFUm2Bo4a2LYRzfnyE2BNkoOA356w/2doWqVfTTP2V9ICZ4Ip8csP0ENoJpf8hKYV62/41TnyBzSTPn4GvIGBD7mq+gXwv2iSwR/RJEiDs8rfSTNe75Qkt9FMxHjyDKv2NpoP51NoJoS8n2Yy0LgTgP/BNGPSquqnNK2Gf0UzcelvaSam3DzDOkCT8N1G8///EE0S95SBYQPH0CQAv6DpAv7UJDFmUtd7aWaoH0TT0vhu4CVVdcUs6noGzWShcwceb04zDnTca2kmE53ddul/mablk6o6n2Yc5r/SJNFX0UximVjXW2gmNh2U5I3T1OdMmtflR9XMwB+3hOZ3cj3N6/oMmvfRXP0DzReh79AMD7iwLaOqvkczCejLwJXA16eIMZ0X0UxKux74NPCGdqzyTLwX+BJNonshA++Pttv9VTTv85/TnGsnD+7cfnn6JLArk7+3JC0wqZquV0TSZJIcTTMD9w/X9dye67EfTSvVLhPGLS447WSpK4CHVdWt67s+WlyS/D3wqPV9zkmamQf7BaalRavtjn818L5FkFwuAf6SZgyiyaVmJc11Y49kdrPiJa1HdpFLi1CaC3bfQjM5ZNILli8U7RjDW2m6k9+wnqujRSbNBd2vA77YXiJM0iJgF7kkSZI6ZQumJEmSOmWCKUmSpE4t6Ek+22/5mF767+9ac++6nzQH96y9r5e4AGNj/czh6GuAxJJk3U+aoy2Xb7ruJ83B/ltNdxOVufuLe/s5zZ74J0t7iQuw5Mn7rvtJc5AVj+olLnffse7nzNGShz+hn8D3TnXZ0vmptWt6iQswdvk3e4m75svruiHS3Fw91a0HOnDhfVv2EveqDfv5W38d9/QSF+CmtXf2Evfae3/WS1yAS288p78PqRm67+YfzPsjeMNtH7ne/x9TsQVTkiRJnVrQLZiSJEkjaWw+N+5a+EwwJUmShm1hX7543kwwJUmShq2nuRULhQmmJEnSkC3wG7DNm5N8JEmS1ClbMCVJkobNLnJJkiR1asS7yE0wJUmShs3LFEmSJKlTI96C6SQfSZIkdcoWTEmSpGFzko8kSZK6NOrXwTTBlCRJGrYRb8F0DKYkSZI6ZQumJEnSsNlFLkmSpE55HUxJkiR1yhZMSZIkdcpJPpIkSdLM9dqCmeQxwCHATkAB1wMnV9XlfR5XkiRpQRvxLvLeWjCTvBb4GBDgXOC8dv2jSY7q67iSJEkL3tjY/JcFrM8WzCOBx1fVfYOFSd4GXAocN9lOSVYCKwE2X749G2+0VY9VlCRJGr6q0Z5F3ucYzDFgx0nKd2i3TaqqVlXV3lW1t8mlJEkaSTU2/2UB67MF8zXAaUmuBK5ryx4O/DrwZz0eV5IkSetRbwlmVf13kkcB+9BM8gmwGjivRr1dWJIkaToLfAzlfPU6i7yqxoCz+zyGJEnSorPAu7jnywutS5IkDduI3yrSC61LkiSpU7ZgSpIkDduId5HbgilJkjRsQ7jQepJrklyc5NtJzm/LtklyapIr259bDzz/dUmuSvLdJM8ZKN+rjXNVknclybqObYIpSZI0bMO7DuYzq2qPqtq7fXwUcFpV7Qac1j4myeOAw4HHAwcC706ytN3nPTQ3wdmtXQ5c10FNMCVJkoZt/d0q8hDghHb9BODQgfKPVdU9VXU1cBWwT5IdgC2q6qyqKuBDA/tMyQRTkiRpNBVwSpIL2ltxA2xfVTcAtD+3a8t34lc3xoHm2uU7tcvqScqn5SQfSZKkYevgQutt0rhyoGhVVa0aePzUqro+yXbAqUmumC7cJGU1Tfm0TDAlSZKGrIubGrbJ5Kpptl/f/rwpyadp7q54Y5IdquqGtvv7pvbpq4GdB3ZfAVzflq+YpHxadpFLkiQNW89jMJNsmmTz8XXgt4FLgJOBI9qnHQF8tl0/GTg8ybIku9JM5jm37Ua/Lcm+7ezxlwzsMyVbMCVJkoat/+tgbg98ur2i0AbAf1TVfyc5DzgpyZHAtcBhAFV1aZKTgMuANcAr61fNrK8Ajgc2Br7YLtMywZQkSRoxVfUD4ImTlP8UOGCKfY4Fjp2k/HzgCbM5vgmmJEnSsHUwyWchM8GUJEkathG/VaQJpiRJ0rCNeAums8glSZLUKVswJUmShs0uckmSJHVqxLvIF3SCObbuOxHNyX1j8796/mSae8D3o7/I/ViS/kZfbL7hJr3E3Tkb9xJ3l11v7CXuBi95wJUkOrNk64f1EnfsJz/sJ+6N1/QSF2Dt1z7RT+ClS/uJe999/cTt0dqf3NFT5E17igv3THbzvA7cSj+fTz8du7uXuAA/X3tXL3HvXrv43suzYoIpSZKkTo14F7mTfCRJktQpWzAlSZKGzS5ySZIkdWrEu8hNMCVJkobNFkxJkiR1asRbMJ3kI0mSpE7ZgilJkjRsdpFLkiSpUyaYkiRJ6lSPd/9bCByDKUmSpE7ZgilJkjRsdpFLkiSpUyaYkiRJ6tSIXwfTBFOSJGnYRrwF00k+kiRJ6pQtmJIkScM24pcpMsGUJEkathHvIjfBlCRJGjYTTEmSJHVqxGeRO8lHkiRJnVovCWaSl62P40qSJC0ENVbzXhay9dWCecx6Oq4kSdL6NzY2/2UB620MZpLvTLUJ2H6a/VYCKwE2W74dyzfaqofaSZIkrUcjPgazz0k+2wPPAX4+oTzAN6faqapWAasAHrrloxd2+68kSZIeoM8E83PAZlX17Ykbkpze43ElSZIWtgU+hnK+ekswq+rIabb9QV/HlSRJWvAW+BjK+fI6mJIkScNmgilJkqROjfi9yL3QuiRJkjplC6YkSdKw2UUuSZKkTjmLXJIkSZ3yQuuSJEnq1Ii3YDrJR5IkSZ2yBVOSJGnIykk+kiRJ6tSId5GbYEqSJA3biE/ycQymJEmSOmULpiRJ0rDZRS5JkqROOclHkiRJnbIFU5IkSZ1yko8kSZIWoyRLk3wryefax9skOTXJle3PrQee+7okVyX5bpLnDJTvleTidtu7kmRdxzXBlCRJGraxmv8yM68GLh94fBRwWlXtBpzWPibJ44DDgccDBwLvTrK03ec9wEpgt3Y5cF0HXdBd5Gt7GgBb1c+4h7Ge4i5GRX+vxT1r7+0l7q2s6SXueT/YoZe4PP1f2f+gm3oJnSXr/HI6t7jL+vmTc98Nd/YSF2DJRv18D1+y2YL+8zup6mnM2K3f7ef9dvNdG/cSF+D2ZT3FZW0vce/rsTt2TfVT57Ge4i4Uw7iTT5IVwPOAY4G/bIsPAfZv108ATgde25Z/rKruAa5OchWwT5JrgC2q6qw25oeAQ4EvTnfsxfcXThJAb8mlJGkIhjPJ5x3A3wKbD5RtX1U3AFTVDUm2a8t3As4eeN7qtuy+dn1i+bTsIpckSVqEkqxMcv7AsnJg2/OBm6rqgpmGm6Sspimfli2YkiRJw9ZBC2ZVrQJWTbH5qcDBSZ4LLAe2SHIicGOSHdrWyx2A8e6w1cDOA/uvAK5vy1dMUj4tWzAlSZKGrcbmv0wXvup1VbWiqnahmbzzlar6Q+Bk4Ij2aUcAn23XTwYOT7Isya40k3nObbvTb0uybzt7/CUD+0zJFkxJkqRhW38XWj8OOCnJkcC1wGEAVXVpkpOAy4A1wCurfjnT6hXA8cDGNJN7pp3gAyaYkiRJQ9fXVRkmPVbV6TSzxamqnwIHTPG8Y2lmnE8sPx94wmyOaRe5JEmSOmULpiRJ0rB5L3JJkiR1aggXWl+fTDAlSZKGzRZMSZIkdWrEE0wn+UiSJKlTtmBKkiQNWdVot2CaYEqSJA3biHeRm2BKkiQN24gnmI7BlCRJUqdswZQkSRqyYd4qcn0wwZQkSRo2E0xJkiR1arRv5GOCKUmSNGyj3kXuJB9JkiR1qtcEM8ljkhyQZLMJ5Qf2eVxJkqQFbazmvyxgvSWYSV4FfBb4c+CSJIcMbP7Hvo4rSZK04I11sCxgfY7B/FNgr6q6PckuwCeS7FJV7wQy1U5JVgIrATZZ9lCWbbhlj1WUJEkavlEfg9lngrm0qm4HqKprkuxPk2Q+gmkSzKpaBawC2Gbz3Ub71ZckSQ9OC7wFcr76HIP54yR7jD9ok83nA9sC/6PH40qSJGk96rMF8yXAmsGCqloDvCTJv/d4XEmSpAXNLvI5qqrV02z7Rl/HlSRJWvBGvIvcC61LkiQNWY14gumF1iVJktQpWzAlSZKGbcRbME0wJUmShmzUu8hNMCVJkobNBFOSJEldGvUWTCf5SJIkqVO2YEqSJA3ZqLdgmmBKkiQNmQmmJEmSulVZ3zXolQmmJEnSkI16C6aTfCRJktQpWzAlSZKGrMbsIpckSVKHRr2L3ARTkiRpyGrEJ/k4BlOSJEmdsgVTkiRpyOwilyRJUqec5NNK8jXgTOBrwDeq6rbeatVau8jS+z7fKtVj7D5U9VfjpJ9X+hd1Xz9xly7vJe7PLuzvHbflI+/tJe7a2/uJu+au/kb7bLBxP3+Hcks/r8WSft5uQH8tLnfdvkkvcdf0OArszvTzN+6+nl7ktfT3ebok/bzO6SnuQtHjx+SCMJvf3hHAd4EXAt9Mcn6St/dTLUmSpNFVY5n3spDNuAWzqn6Q5C7g3nZ5JvDYviomSZKkxWk2XeTfB24G/gN4P/DnVYusD1uSJGkBWOgtkPM1m0k+7wKeBrwIeBJwRpIzq+r7vdRMkiRpRI36GMzZdJG/E3hnks2AlwFHAyuApf1UTZIkaTTZgtlK8laaFszNgLOBv6eZUS5JkqRZGPU7+cymi/xs4C1VdWNflZEkSdLiN5su8v9McnCS/dqiM6rqv3qqlyRJ0sga9WnSs+kifxOwD/CRtuhVSZ5SVa/rpWaSJEkjamzEu8hnc6H15wG/VVUfqKoPAAe2ZZIkSZqFqsx7mU6S5UnOTXJRkkuTHNOWb5Pk1CRXtj+3HtjndUmuSvLdJM8ZKN8rycXttndlBrfUm+19mLYaWN9ylvtKkiRpOO4BnlVVTwT2AA5Msi9wFHBaVe0GnNY+JsnjgMOBx9M0Ir47yfiVgt4DrAR2a5cD13Xw2UzyeRPwrSRfpbnt9n6A3eOSJEmz1PdliqqqgNvbhxu2SwGHAPu35ScApwOvbcs/VlX3AFcnuQrYJ8k1wBZVdRZAkg8BhwJfnO74s5nk89EkpwO/QZNgvraqfjzT/SVJktTo4kLrSVbStCyOW1VVqwa2LwUuAH4d+H9VdU6S7avqhqYOdUOS7dqn70RzxaBxq9uy+9r1ieXTWmeCmWTPCUXjB9kxyY5VdeG6YkiSJOlXumjBbJPJVdNsXwvskWQr4NNJnjBNuMkqVNOUT2smLZhvbX8uB/YGLmoPtjtwDs3F1yVJkjRDw5xFXlW3tL3QBwI3Jtmhbb3cAbipfdpqYOeB3VYA17flKyYpn9Y6J/lU1TOr6pnAD4E9q2rvqtqL5n7kV637vyVJkqRhSvLQtuWSJBsDzwauAE4GjmifdgTw2Xb9ZODwJMuS7Eozmefctjv9tiT7trPHXzKwz5RmM8nnMVV18fiDqrokyR6z2F+SJEkM5VaROwAntOMwlwAnVdXnkpwFnJTkSOBa4LCmPnVpkpOAy4A1wCvbLnaAVwDHAxvTTO6ZdoIPzC7BvDzJ+4ATafre/xC4fBb7S5IkiW4m+Uwfv75D09s8sfynwAFT7HMscOwk5ecD043ffIDZJJgvo8lgX90+PpPmukiSJEmahVG/k89sLlN0N/D2dnmAJJ+sqhd2VTFJkqRRNYQu8vVqtnfymc4jO4wlSZKkRWo2XeTr8oDRBEn2obmY/HntLYgOBK6oqi90eFxJkqRFpe8xmOtblwnm/SR5A3AQsEGSU4En09yO6KgkT2oHkkqSJD3oOAZz5ia+Ur9Lc3P1ZcCPgRVVdWuSf6K5QPukCebgbY+Wb7QtG224RYdVlCRJWv8cg0lzL8skJ67jaa+d8HhNVa2tqjuB71fVrQBVdRcwNlWQqlrVXsx9b5NLSZKkxWdGLZhVtba9IvxGVXXvFM85ZULRvUk2aRPMvcYLk2zJNAmmJEnSqLOL/FeuAb6R5GTgjvHCqnrbFM/fr6ruaZ8zmFBuyK9uUSRJkvSgM+JzfGaVYF7fLkuAzdf15PHkcpLym4GbZ3FcSZKkkWILZquqjgFIsmlV3bGu50uSJGlyTvJpJfnNJJfR3n88yROTvLu3mkmSJGlRms2dfN4BPAf4KUBVXQTs10elJEmSRtlYB8tCNqvrYFbVdcn9mnTXdlsdSZKk0VcPuHz4aJlNgnldkqcAlWQj4FW03eWSJEmaubERn0Y+my7ylwOvBHYCVtPcpeeVfVRKkiRJi9dsZpHfDLy4x7pIkiQ9KIw92LvIk/wL01wPtKpe1WmNJEmSRtyoj8GcSRf5+cAFwHJgT+DKdtkDJ/lIkiTN2oN+FnlVnQCQ5KXAM6vqvvbxvwET7z8uSZKkdbAF81d25P63iNysLZMkSZJ+aTaXKToO+FaSr7aPnwEc3XmNJEmSRtxC7+KerxklmGmurv5l4IvAk9vio6rqx31VTJIkaVSZYAJVVUk+U1V7AZ/tuU6SJEkjzTGYv3J2kt/orSaSJEkPEmOZ/7KQzWYM5jOBlye5BrgDCE3j5u59VEySJEmL02wSzIOArYGnt4/PBG7pvEaSJEkjbtTv5DObLvJDgQ8D2wIPbdcP7qNSkiRJo6w6WBay2bRgHgnsW1V3ACR5M3AW8C99VKxPteB/LcPT1/en5sID/ajq5/e3tqf3xa2z+Ro3C2vv6ykwMHZ3P3HvvmU2f3JmbskG/Z3Td/50w17iLt/yvl7i9ql6mvZaPQ0muyv9nSN93cZuSU9/O9f29csDlox4S1xfRn0W+WzOvnD/c2ot/eUnkiRJWqRm05zwQeCcJJ9uHx8KvL/7KkmSJI22sR57+haCGSeYVfW2JKcDT6NpuXxZVX2rr4pJkiSNqlEfrDerAVFVdSFwYU91kSRJelAY9TGY/Yy4lyRJ0pQW+oXS56u/KXaSJEl6ULIFU5IkachG/ULrJpiSJElD5iQfSZIkdWrUx2CaYEqSJA3ZqM8id5KPJEmSOmULpiRJ0pA5BlOSJEmdcgymJEmSOuUYTEmSJGkWbMGUJEkaslFvwTTBlCRJGrJyDKYkSZK6ZAumJEmSOjXqCaaTfCRJktSpoSaYST40zONJkiQtRNXBspD11kWe5OSJRcAzk2wFUFUH93VsSZKkhazvC60n2Rn4EPAwmh75VVX1ziTbAB8HdgGuAX6vqn7e7vM64EhgLfCqqvpSW74XcDywMfAF4NVVNW2O2+cYzBXAZcD7aBLtAHsDb51upyQrgZUAyzfalo023KLHKkqSJA3fEMZgrgH+qqouTLI5cEGSU4GXAqdV1XFJjgKOAl6b5HHA4cDjgR2BLyd5VFWtBd5Dk5udTZNgHgh8cbqD99lFvjdwAfB64BdVdTpwV1WdUVVnTLVTVa2qqr2ram+TS0mSNIrGOlimU1U3VNWF7fptwOXATsAhwAnt004ADm3XDwE+VlX3VNXVwFXAPkl2ALaoqrPaVssPDewzpd5aMKtqDHh7kv9sf97Y5/EkSZIeTAZ7fVurqmrVJM/bBXgScA6wfVXdAE0SmmS79mk70bRQjlvdlt3Xrk8sn1bvCV9VrQYOS/I84Na+jydJkrTQdTFJp00mH5BQDkqyGfBJ4DVVdWsy5eDPyTbUNOXTGlqLYlV9Hvj8sI4nSZK0UPU9yQcgyYY0yeVHqupTbfGNSXZoWy93AG5qy1cDOw/svgK4vi1fMUn5tLwOpiRJ0pD1PQYzTVPl+4HLq+ptA5tOBsGRfAEAABO/SURBVI5o148APjtQfniSZUl2BXYDzm27029Lsm8b8yUD+0zJMZGSJEmj56nAHwEXJ/l2W/a/geOAk5IcCVwLHAZQVZcmOYnmCkBrgFe2M8gBXsGvLlP0RdYxgxxMMCVJkoau7wulV9XXmXz8JMABU+xzLHDsJOXnA0+YzfFNMCVJkoZsbMHfi2d+TDAlSZKGbAgXWl+vTDAlSZKGbLTbL51FLkmSpI7ZgilJkjRkdpFLkiSpU8O40Pr6ZIIpSZI0ZM4ilyRJUqdGO710ko8kSZI6ZgumJEnSkDnJR5IkSZ1yDKYkSZI6NdrppWMwJUmS1DFbMCVJkobMMZiSJEnqlGMw16MNlyztJe49jPjl82ch6ee1WJL+Rl/0VedlPY0Yeeiafv6IbLXz3b3EBdhgi35ei8236uc7+9id/bUFLN2in/dbli/rJW6fxm6/r5e4917Zz9/6tb1EbaxJP+f1HdXPa7ym+jtH7hq7t7fYo2y008sFnmBKkiSNolHvIneSjyRJkjplC6YkSdKQ1Yh3kptgSpIkDdmod5GbYEqSJA2Zs8glSZLUqdFOL53kI0mSpI7ZgilJkjRkdpFLkiSpU07ykSRJUqdG/TJFjsGUJElSp2zBlCRJGjK7yCVJktSpUe8iN8GUJEkaMlswJUmS1KmxGu0WTCf5SJIkqVO2YEqSJA3ZaLdfmmBKkiQNnXfykSRJUqecRS5JkqROjfoscif5SJIkqVNDa8FM8jRgH+CSqjplWMeVJElaaEZ9DGZvLZhJzh1Y/1PgX4HNgTckOaqv40qSJC101cG/hazPLvINB9ZXAr9VVccAvw28eKqdkqxMcn6S8+++9xc9Vk+SJGn9GOtgWcj6TDCXJNk6yUOAVNVPAKrqDmDNVDtV1aqq2ruq9l6+0ZY9Vk+SJEl96HMM5pbABUCASvKwqvpxks3aMkmSpAelGvFbRfaWYFbVLlNsGgNe0NdxJUmSFrpRn+Qz9OtgVtWdwNXDPq4kSdJCsdDHUM6XF1qXJEkasoU+C3y+vNC6JEmSOmULpiRJ0pA5BlOSJEmdcha5JEmSOjXqk3wcgylJkqROmWBKkiQN2TDuRZ7kA0luSnLJQNk2SU5NcmX7c+uBba9LclWS7yZ5zkD5Xkkubre9K8k6b5hjgilJkjRkY9S8lxk4HjhwQtlRwGlVtRtwWvuYJI8DDgce3+7z7iRL233eA6wEdmuXiTEfwARTkiRpyKpq3ssMjnEm8LMJxYcAJ7TrJwCHDpR/rKruqaqrgauAfZLsAGxRVWdVc9APDewzJSf5SJIkDVkXlylKspKmZXHcqqpatY7dtq+qGwCq6oYk27XlOwFnDzxvdVt2X7s+sXxaJpiSJEmLUJtMriuhnKnJxlXWNOXTMsGUJEkasvV4q8gbk+zQtl7uANzUlq8Gdh543grg+rZ8xSTl03IMpiRJ0pCNVc17maOTgSPa9SOAzw6UH55kWZJdaSbznNt2p9+WZN929vhLBvaZki2YkiRJQzaM9sskHwX2B7ZNshp4A3AccFKSI4FrgcMAqurSJCcBlwFrgFdW1do21CtoZqRvDHyxXaZlgilJkjRkw7gXeVW9aIpNB0zx/GOBYycpPx94wmyObRe5JEmSOmULpiRJ0pANowVzfTLBlCRJGrKZXCh9MXtQJphLl/QzMmCsxnqJC0BPb8R5zEKbVq1d00tcgLvX3NtL3FvG7ukl7lg27SXu7Tdu1EtcgM036Oc1Tk9V3mDb/l6LGhvtD4HZGLu7n79x676r8dyM9RUY2Kint0UmveTg/C1b0t/H/bLasJe4d6Wfv0MLxai3YDoGU5IkSZ16ULZgSpIkrU/r8ULrQ2GCKUmSNGSOwZQkSVKnRn0MpgmmJEnSkI16C6aTfCRJktQpWzAlSZKGzC5ySZIkdcpZ5JIkSepUXzc6WShMMCVJkoZs1FswneQjSZKkTtmCKUmSNGR2kUuSJKlTo95FboIpSZI0ZKPegukYTEmSJHXKFkxJkqQhs4tckiRJnRr1LnITTEmSpCGzBVOSJEmdqhpb31XolZN8JEmS1KneWjCTPBm4vKpuTbIxcBSwJ3AZ8I9V9Yu+ji1JkrSQjY14F3mfLZgfAO5s198JbAm8uS37YI/HlSRJWtCqat7LQtbnGMwlVbWmXd+7qvZs17+e5Ns9HleSJGlBswVz7i5J8rJ2/aIkewMkeRRw31Q7JVmZ5Pwk5999r73okiRp9Ix6C2afCeafAM9I8n3gccBZSX4AvLfdNqmqWlVVe1fV3ss32rLH6kmSJKkPvXWRt5N4Xppkc+CR7bFWV9WNfR1TkiRpMfBC6/NUVbcBF/V9HEmSpMXCC61LkiSpUwt9DOV8eaF1SZIkdcoWTEmSpCEb9csUmWBKkiQN2ah3kZtgSpIkDZmzyCVJktSpUW/BdJKPJEmSOmULpiRJ0pA5yUeSJEmdGvUuchNMSZKkIXOSjyRJkjo16reKdJKPJEmSOmULpiRJ0pDZRS5JkqROOclHkiRJnXIMpiRJkjQLtmBKkiQNmV3kkiRJ6pQJpiRJkjo12uklTQY9CguwcrHFXmxxF2OdfS0Wb9zFWGdfC18LX4vRey1c5raM0iSflYsw9mKL22fsxRa3z9jG7T/2YovbZ+zFFrfP2Istbp+xF1vcvmNrlkYpwZQkSdICYIIpSZKkTo1SgrlqEcZebHH7jL3Y4vYZ27j9x15scfuMvdji9hl7scXtM/Zii9t3bM1S2oGxkiRJUidGqQVTkiRJC8BIJJhJDkzy3SRXJTmqw7gfSHJTkks6jLlzkq8muTzJpUle3WHs5UnOTXJRG/uYrmK38Zcm+VaSz3UY85okFyf5dpLzu4rbxt4qySeSXNG+3r/ZQcxHt3UdX25N8pqO6vsX7e/tkiQfTbK8i7ht7Fe3cS+dT30nOyeSbJPk1CRXtj+37jD2YW2dx5Ls3WHcf2rfF99J8ukkW3UU941tzG8nOSXJjl3EHdj210kqybazjTtNnY9O8qOB9/Rzu6pzkj9v/zZfmuQtHdX34wN1vSbJt2cbd5rYeyQ5e/zvUZJ9Oor7xCRntX/r/ivJFnOIO+lnx3zPv2nidnHuTRV7XuffNHHnff6pQ+v7OknzXYClwPeBRwIbARcBj+so9n7AnsAlHdZ3B2DPdn1z4Hsd1jfAZu36hsA5wL4d1v0vgf8APtdhzGuAbXt6b5wA/Em7vhGwVcfxlwI/Bh7RQaydgKuBjdvHJwEv7aieTwAuATahubnCl4Hd5hjrAecE8BbgqHb9KODNHcZ+LPBo4HRg7w7j/jawQbv+5rnUeYq4Wwysvwr4ty7ituU7A18CfjjXc2aKOh8N/PU832OTxX1m+15b1j7erqvXYmD7W4G/77DOpwAHtevPBU7vKO55wDPa9T8G3jiHuJN+dsz3/Jsmbhfn3lSx53X+TRN33uefS3fLKLRg7gNcVVU/qKp7gY8Bh3QRuKrOBH7WRayBmDdU1YXt+m3A5TTJRRexq6pubx9u2C6dDLJNsgJ4HvC+LuL1rW0h2A94P0BV3VtVt3R8mAOA71fVDzuKtwGwcZINaJLB6zuK+1jg7Kq6s6rWAGcAL5hLoCnOiUNoknnan4d2FbuqLq+q784l3jrintK+FgBnAys6invrwMNNmcP5N83fnbcDfzuXmDOIPS9TxH0FcFxV3dM+56aO4gKQJMDvAR+dbdxpYhcw3rq4JXM4B6eI+2jgzHb9VOCFc4g71WfHvM6/qeJ2dO5NFXte5980ced9/qk7o5Bg7gRcN/B4NR0lbH1LsgvwJJqWxq5iLm27jG4CTq2qrmK/g+bDbayjeOMKOCXJBUm6vEjuI4GfAB9M063/viSbdhgf4HDm+OE2UVX9CPhn4FrgBuAXVXVKF7FpWi/3S/KQJJvQtMzs3FFsgO2r6gZo/vAD23UYexj+GPhiV8GSHJvkOuDFwN93FPNg4EdVdVEX8SbxZ23X4gfmOsRhEo8Cnp7knCRnJPmNjuKOezpwY1Vd2WHM1wD/1P7+/hl4XUdxLwEObtcPY57n34TPjs7Ovz4+k2YQe17n38S4fZx/mptRSDAzSdmC/9aSZDPgk8BrJnzrmpeqWltVe9B8I9wnyRPmGzPJ84GbquqCeVfwgZ5aVXsCBwGvTLJfR3E3oOmmek9VPQm4g6b7qBNJNqL5wPjPjuJtTdMSsSuwI7Bpkj/sInZVXU7TDXUq8N80w0jWTLvTg0SS19O8Fh/pKmZVvb6qdm5j/tl847VfCl5Pfx+W7wF+DdiD5svNWzuKuwGwNbAv8DfASW2rY1deREdf8Aa8AviL9vf3F7Q9IB34Y5q/bxfQdOneO9dAfX129BV3utjzPf8mi9v1+ae5G4UEczX3/za4gu66FnuRZEOak+IjVfWpPo7RdgefDhzYQbinAgcnuYZmCMKzkpzYQVyq6vr2503Ap2mGPHRhNbB6oAX3EzQJZ1cOAi6sqhs7ivds4Oqq+klV3Qd8CnhKR7GpqvdX1Z5VtR9N912XrT43JtkBoP05667Q9SHJEcDzgRdXVR9fSv+DOXSFTuLXaL54XNSegyuAC5M8rIPYVNWN7RfTMeC9dHsOfqodunMuTe/HnCYnTdQOI/n/gI93EW/AETTnHjRfHjt5Larqiqr67araiyYp/v5c4kzx2THv86/Pz6SpYs/3/JtBnbs6/zRHo5BgngfslmTXtlXpcODk9VynKbXf4N8PXF5Vb+s49kPHZ+Ml2ZgmablivnGr6nVVtaKqdqF5fb9SVfNuXUuyaZLNx9dpBn53MmO/qn4MXJfk0W3RAcBlXcRudd16ci2wb5JN2vfIATTjijqRZLv258NpPpi7rPvJNB/MtD8/22HsXiQ5EHgtcHBV3dlh3N0GHh5MN+ffxVW1XVXt0p6Dq2kmOPx4vrHhl0nJuBfQ0TkIfAZ4VnuMR9FMtLu5o9jPBq6oqtUdxRt3PfCMdv1ZdPRFbOD8WwL8HfBvc4gx1WfHvM6/nj+TJo093/Nvmridn3+ah4mzfhbjQjOm7Hs03wpf32Hcj9J0Gd1H80f9yA5iPo2mC/87wLfb5bkd1Xd34Ftt7EuY4+zKdRxjfzqaRU4zTvKidrm0y99dG38P4Pz29fgMsHVHcTcBfgps2XF9j6H5g3gJ8GHa2bcdxf4aTYJ9EXDAPOI84JwAHgKcRvNhfBqwTYexX9Cu3wPcCHypo7hX0YzdHj8H5zLbe7K4n2x/f98B/otm4sG8407Yfg1zn0U+WZ0/DFzc1vlkYIeO4m4EnNi+HhcCz+rqtQCOB14+z3Nisjo/DbigPU/OAfbqKO6raT6jvgccR3uTk1nGnfSzY77n3zRxuzj3poo9r/NvmrjzPv9culu8k48kSZI6NQpd5JIkSVpATDAlSZLUKRNMSZIkdcoEU5IkSZ0ywZQkSVKnTDAlSZLUKRNMSfOW5KVJ/nWhxOmgHsuSfDnJt5P8/gyev3+Szw2jbpK0GGywvisgaXFp76KRam4tONcYG1TV0O6HPofjPQnYsKr26KtOkjTKbMGU9ABJ/jLJJe3ymiS7JLk8ybtp7sqyc5KXJflekjNo7lc/vu9Dk3wyyXnt8tS2/Ogkq5KcAnxomsPvmOS/k1yZ5C0DcV+U5OK2Tm8eKL99YP13kxzfrh+f5G1Jvgq8mUkk2SbJZ5J8J8nZSXZvb+t3IrBH24L5a1Pse2CSK5J8neb2m+Pl+yT5ZpJvtT8f3ZZ/LckeA8/7RpLdp3kdJGnRsgVT0v0k2Qt4GfBkIDS3zDsDeDTwsqr6X+39q48B9gJ+AXyV5jalAO8E3l5VX2/vff4l4LHttr2Ap1XVXdNUYQ+aFsR7gO8m+RdgLU2SuBfwc+CUJIdW1WfW8d95FPDsqlo7xfZjgG9V1aFJngV8qKr2SPInwF9X1fMn2ynJcuC9NPervgr4+MDmK4D9qmpNkmcD/wi8EHgf8FLgNe29uZdV1XfWUX9JWpRMMCVN9DTg01V1B0CSTwFPB35YVWe3z3kycHpV/aR9zsdpkjmAZwOPa3rSAdgiyebt+snrSC4BTquqX7RxLwMeQXO/5cHjfQTYj+Ye89P5z2mSy/H/6wsBquorSR6SZMt1xAR4DHB1VV3Z1udEYGW7bUvghCS70dwvecPxugD/J8nfAH9Mcz9tSRpJJpiSJsoU5XdMeFxTPG8J8JsTE8k24ZwYYzL3DKyvpfk7NVWdJtZj+YRt6zreZHGn+n/N9HlvBL5aVS9IsgtwOkBV3ZnkVOAQ4PeAvWd4HEladByDKWmiM4FDk2ySZFPgBcDXJjznHGD/tsVvQ+CwgW2nAH82/mBw3OE8nAM8I8m2SZYCL6Lptge4Mcljkyxp6zobZwIvbuu5P3BzVd06g/2uAHYdGJ/5ooFtWwI/atdfOmG/9wHvAs6rqp/Nsq6StGiYYEq6n6q6kKb79lyaxO59NOMeB59zA3A0cBbwZZqJP+NeBezdTpy5DHh5B3W6AXgdzVjPi4ALq+qz7eajgM8BXwFumGXoo8frChwHHDHD+txN0yX++XaSzw8HNr8FeFOSbwBLJ+x3AXAr8MFZ1lOSFpVUzbQ3SJI0H0l2pOkyf8x8LvMkSQudLZiSNARJXkLTIvx6k0tJo84WTElDl+Q5PPDalFdX1WzHUM70eC8DXj2h+BtV9coZ7PtpYNcJxa+tqi91VT9JGjUmmJIkSeqUXeSSJEnqlAmmJEmSOmWCKUmSpE6ZYEqSJKlTJpiSJEnq1P8PW2oDPQNlQigAAAAASUVORK5CYII=\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"grouped_df = orders.groupby([\"order_dow\", \"order_hour_of_day\"])[\"order_number\"].aggregate(\"count\").reset_index()\n",
"grouped_df = grouped_df.pivot('order_dow', 'order_hour_of_day', 'order_number')\n",
"\n",
"plt.figure(figsize=(12,6))\n",
"sns.heatmap(grouped_df)\n",
"plt.title(\"Frequency of Day of week Vs Hour of day\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Seems Satuday evenings and Sunday mornings are the prime time for orders.\n",
"\n",
"Now let us check the time interval between the orders."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(12,8))\n",
"sns.countplot(x=\"days_since_prior_order\", data=orders)\n",
"plt.ylabel('Count', fontsize=12)\n",
"plt.xlabel('Days since prior order', fontsize=12)\n",
"plt.xticks(rotation='vertical')\n",
"plt.title(\"Frequency distribution by days since prior order\", fontsize=15)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Looks like customers order once in every week (check the peak at 7 days) or once in a month (peak at 30 days). We could also see smaller peaks at 14, 21 and 28 days (weekly intervals).\n",
"\n",
"Since our objective is to figure out the re-orders, let us check out the re-order percentage in prior set and train set."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.5896974667922161"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# percentage of re-orders in prior set #\n",
"order_products_prior.reordered.sum() / order_products_prior.shape[0]"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.5985944127509629"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# percentage of re-orders in train set #\n",
"order_products_train.reordered.sum() / order_products_train.shape[0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On an average, about 59% of the products in an order are re-ordered products."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### No re-ordered products:\n",
"\n",
"Now that we have seen 59% of the products are re-ordered, there will also be situations when none of the products are re-ordered. Let us check that now."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"D:\\Anaconda\\lib\\site-packages\\ipykernel_launcher.py:2: DeprecationWarning: \n",
".ix is deprecated. Please use\n",
".loc for label based indexing or\n",
".iloc for positional indexing\n",
"\n",
"See the documentation here:\n",
"http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated\n",
" \n"
]
},
{
"data": {
"text/plain": [
"1 0.879151\n",
"0 0.120849\n",
"Name: reordered, dtype: float64"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"grouped_df = order_products_prior.groupby(\"order_id\")[\"reordered\"].aggregate(\"sum\").reset_index()\n",
"grouped_df[\"reordered\"].ix[grouped_df[\"reordered\"]>1] = 1\n",
"grouped_df.reordered.value_counts() / grouped_df.shape[0]"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"D:\\Anaconda\\lib\\site-packages\\ipykernel_launcher.py:2: DeprecationWarning: \n",
".ix is deprecated. Please use\n",
".loc for label based indexing or\n",
".iloc for positional indexing\n",
"\n",
"See the documentation here:\n",
"http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated\n",
" \n"
]
},
{
"data": {
"text/plain": [
"1 0.93444\n",
"0 0.06556\n",
"Name: reordered, dtype: float64"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"grouped_df = order_products_train.groupby(\"order_id\")[\"reordered\"].aggregate(\"sum\").reset_index()\n",
"grouped_df[\"reordered\"].ix[grouped_df[\"reordered\"]>1] = 1\n",
"grouped_df.reordered.value_counts() / grouped_df.shape[0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"About 12% of the orders in prior set has no re-ordered items while in the train set it is 7%.\n",
"\n",
"Now let us see the number of products bought in each order."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"grouped_df = order_products_train.groupby(\"order_id\")[\"add_to_cart_order\"].aggregate(\"max\").reset_index()\n",
"cnt_srs = grouped_df.add_to_cart_order.value_counts()\n",
"\n",
"plt.figure(figsize=(12,8))\n",
"sns.barplot(cnt_srs.index, cnt_srs.values, alpha=0.8)\n",
"plt.ylabel('Number of Occurrences', fontsize=12)\n",
"plt.xlabel('Number of products in the given order', fontsize=12)\n",
"plt.xticks(rotation='vertical')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A right tailed distribution with the maximum value at 5.!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"# We convert character variables into category. \n",
"# In Python, a categorical variable is called category and has a fixed number of different values\n",
"\n",
"aisles['aisle'] = aisles['aisle'].astype('category')\n",
"departments['department'] = departments['department'].astype('category')\n",
"orders['eval_set'] = orders['eval_set'].astype('category')\n",
"products['product_name'] = products['product_name'].astype('category')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Create a DataFrame with the orders and the products that have been purchased on prior orders (op)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
order_id
\n",
"
user_id
\n",
"
eval_set
\n",
"
order_number
\n",
"
order_dow
\n",
"
order_hour_of_day
\n",
"
days_since_prior_order
\n",
"
product_id
\n",
"
add_to_cart_order
\n",
"
reordered
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
2565571
\n",
"
7
\n",
"
prior
\n",
"
1
\n",
"
3
\n",
"
9
\n",
"
NaN
\n",
"
45628
\n",
"
1
\n",
"
0
\n",
"
\n",
"
\n",
"
1
\n",
"
2565571
\n",
"
7
\n",
"
prior
\n",
"
1
\n",
"
3
\n",
"
9
\n",
"
NaN
\n",
"
39275
\n",
"
2
\n",
"
0
\n",
"
\n",
"
\n",
"
2
\n",
"
2565571
\n",
"
7
\n",
"
prior
\n",
"
1
\n",
"
3
\n",
"
9
\n",
"
NaN
\n",
"
6361
\n",
"
3
\n",
"
0
\n",
"
\n",
"
\n",
"
3
\n",
"
2565571
\n",
"
7
\n",
"
prior
\n",
"
1
\n",
"
3
\n",
"
9
\n",
"
NaN
\n",
"
45066
\n",
"
4
\n",
"
0
\n",
"
\n",
"
\n",
"
4
\n",
"
2565571
\n",
"
7
\n",
"
prior
\n",
"
1
\n",
"
3
\n",
"
9
\n",
"
NaN
\n",
"
13249
\n",
"
5
\n",
"
0
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" order_id user_id eval_set order_number order_dow order_hour_of_day \\\n",
"0 2565571 7 prior 1 3 9 \n",
"1 2565571 7 prior 1 3 9 \n",
"2 2565571 7 prior 1 3 9 \n",
"3 2565571 7 prior 1 3 9 \n",
"4 2565571 7 prior 1 3 9 \n",
"\n",
" days_since_prior_order product_id add_to_cart_order reordered \n",
"0 NaN 45628 1 0 \n",
"1 NaN 39275 2 0 \n",
"2 NaN 6361 3 0 \n",
"3 NaN 45066 4 0 \n",
"4 NaN 13249 5 0 "
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Merge the orders DF with order_products_prior by their order_id, keep only these rows with order_id that they are appear on both DFs\n",
"\n",
"op = orders.merge(order_products_prior, on='order_id', how='inner')\n",
"op.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Create Predictor Variables\n",
"We are now ready to identify and calculate predictor variables based on the provided data. We can create various types of predictors such as:\n",
"\n",
"User predictors describing the behavior of a user e.g. total number of orders of a user.\n",
"Product predictors describing characteristics of a product e.g. total number of times a product has been purchased.\n",
"User & product predictors describing the behavior of a user towards a specific product e.g. total times a user ordered a specific product."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Create user predictors\n",
"###### Number of orders per customer \n",
"We calculate the total number of placed orders per customer. We create a user DataFrame to store the results."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
user_t_orders
\n",
"
\n",
"
\n",
"
user_id
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
7
\n",
"
20
\n",
"
\n",
"
\n",
"
14
\n",
"
13
\n",
"
\n",
"
\n",
"
22
\n",
"
15
\n",
"
\n",
"
\n",
"
24
\n",
"
18
\n",
"
\n",
"
\n",
"
29
\n",
"
18
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" user_t_orders\n",
"user_id \n",
"7 20\n",
"14 13\n",
"22 15\n",
"24 18\n",
"29 18"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## First approach in one step:\n",
"# Create distinct groups for each user, identify the highest order number in each group, save the new column to a DataFrame\n",
"user = op.groupby('user_id')['order_number'].max().to_frame('user_t_orders') #\n",
"user.head()\n",
"\n",
"## Second approach in two steps: \n",
"#1. Save the result as DataFrame with Double brackets --> [[ ]] \n",
"#user = op.groupby('user_id')[['order_number']].max()\n",
"#2. Rename the label of the column\n",
"#user.columns = ['user_t_orders']\n",
"#user.head()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
user_id
\n",
"
user_t_orders
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
7
\n",
"
20
\n",
"
\n",
"
\n",
"
1
\n",
"
14
\n",
"
13
\n",
"
\n",
"
\n",
"
2
\n",
"
22
\n",
"
15
\n",
"
\n",
"
\n",
"
3
\n",
"
24
\n",
"
18
\n",
"
\n",
"
\n",
"
4
\n",
"
29
\n",
"
18
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" user_id user_t_orders\n",
"0 7 20\n",
"1 14 13\n",
"2 22 15\n",
"3 24 18\n",
"4 29 18"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Reset the index of the DF so to bring user_id from index to column (pre-requisite for step 2.4)\n",
"\n",
"user = user.reset_index()\n",
"user.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Create product predictors\n",
"###### Number of purchases for each product \n",
"We calculate the total number of purchases for each product (from all customers). We create a prd DataFrame to store the results."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
prd_t_purchases
\n",
"
\n",
"
\n",
"
product_id
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
1
\n",
"
205
\n",
"
\n",
"
\n",
"
2
\n",
"
13
\n",
"
\n",
"
\n",
"
3
\n",
"
15
\n",
"
\n",
"
\n",
"
4
\n",
"
37
\n",
"
\n",
"
\n",
"
6
\n",
"
1
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" prd_t_purchases\n",
"product_id \n",
"1 205\n",
"2 13\n",
"3 15\n",
"4 37\n",
"6 1"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Create distinct groups for each product, count the orders, save the result for each product to a new DataFrame \n",
"\n",
"prd = op.groupby('product_id')['order_id'].count().to_frame('prd_t_purchases') #\n",
"prd.head()"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
product_id
\n",
"
prd_t_purchases
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
1
\n",
"
205
\n",
"
\n",
"
\n",
"
1
\n",
"
2
\n",
"
13
\n",
"
\n",
"
\n",
"
2
\n",
"
3
\n",
"
15
\n",
"
\n",
"
\n",
"
3
\n",
"
4
\n",
"
37
\n",
"
\n",
"
\n",
"
4
\n",
"
6
\n",
"
1
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" product_id prd_t_purchases\n",
"0 1 205\n",
"1 2 13\n",
"2 3 15\n",
"3 4 37\n",
"4 6 1"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Reset the index of the DF so to bring product_id rom index to column (pre-requisite for step 2.4)\n",
"\n",
"prd = prd.reset_index()\n",
"prd.head()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Create user-product predictors\n",
"###### How many times a user bought a product \n",
"We create different groups that contain all the rows for each combination of user and product. Then with the aggregation function .count( ) we get how many times each user bought a product. We save the results on new uxp DataFrame."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
uxp_t_bought
\n",
"
\n",
"
\n",
"
user_id
\n",
"
product_id
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
7
\n",
"
274
\n",
"
1
\n",
"
\n",
"
\n",
"
519
\n",
"
2
\n",
"
\n",
"
\n",
"
4920
\n",
"
7
\n",
"
\n",
"
\n",
"
4945
\n",
"
3
\n",
"
\n",
"
\n",
"
6361
\n",
"
5
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" uxp_t_bought\n",
"user_id product_id \n",
"7 274 1\n",
" 519 2\n",
" 4920 7\n",
" 4945 3\n",
" 6361 5"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Create distinct groups for each combination of user and product, count orders, save the result for each user X product to a new DataFrame\n",
"\n",
"uxp = op.groupby(['user_id', 'product_id'])['order_id'].count().to_frame('uxp_t_bought') #\n",
"uxp.head()"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
user_id
\n",
"
product_id
\n",
"
uxp_t_bought
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
7
\n",
"
274
\n",
"
1
\n",
"
\n",
"
\n",
"
1
\n",
"
7
\n",
"
519
\n",
"
2
\n",
"
\n",
"
\n",
"
2
\n",
"
7
\n",
"
4920
\n",
"
7
\n",
"
\n",
"
\n",
"
3
\n",
"
7
\n",
"
4945
\n",
"
3
\n",
"
\n",
"
\n",
"
4
\n",
"
7
\n",
"
6361
\n",
"
5
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" user_id product_id uxp_t_bought\n",
"0 7 274 1\n",
"1 7 519 2\n",
"2 7 4920 7\n",
"3 7 4945 3\n",
"4 7 6361 5"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Reset the index of the DF so to bring user_id & product_id rom indices to columns (pre-requisite for step 2.4)\n",
"\n",
"uxp = uxp.reset_index()\n",
"uxp.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Merge all features\n",
"We now merge the DataFrames with the three types of predictors that we have created (i.e., for the users, the products and the combinations of users and products)."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
],
"text/plain": [
" user_id product_id uxp_t_bought user_t_orders prd_t_purchases\n",
"0 7 274 1 20 232\n",
"1 7 519 2 20 111\n",
"2 7 4920 7 20 8126\n",
"3 7 4945 3 20 599\n",
"4 7 6361 5 20 333"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Merge uxp & user features (the new DataFrame) with prd features\n",
"\n",
"data = data.merge(prd, on='product_id', how='left') \n",
"data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Delete previous DataFrames\n",
"The information from the DataFrames that we have created to store our features (op, user, prd, uxp) is now stored on data.\n",
"\n",
"As we won't use them anymore, we now delete them."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"61"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"del op, user, prd, uxp\n",
"gc.collect()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Create train and test DataFrames"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"+ We select the orders DataFrame to keep only the future orders (labeled as \"train\" & \"test).\n",
"+ Keep only the columns of our desire ['eval_set', 'order_id'] **AND** 'user_id' as is the matching key with our data DataFrame\n",
"+ Merge data DataFrame with the information for the future order of each customer using as matching key the 'user_id'\n",
"\n",
"To filter and select the columns of our desire on orders (the 2 first steps) there are numerous approaches:"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
user_id
\n",
"
eval_set
\n",
"
order_id
\n",
"
order_hour_of_day
\n",
"
days_since_prior_order
\n",
"
\n",
" \n",
" \n",
"
\n",
"
74
\n",
"
7
\n",
"
train
\n",
"
525192
\n",
"
11
\n",
"
6.0
\n",
"
\n",
"
\n",
"
129
\n",
"
14
\n",
"
train
\n",
"
2316178
\n",
"
19
\n",
"
11.0
\n",
"
\n",
"
\n",
"
272
\n",
"
22
\n",
"
test
\n",
"
139655
\n",
"
6
\n",
"
1.0
\n",
"
\n",
"
\n",
"
296
\n",
"
24
\n",
"
train
\n",
"
965160
\n",
"
16
\n",
"
0.0
\n",
"
\n",
"
\n",
"
439
\n",
"
29
\n",
"
train
\n",
"
3110252
\n",
"
11
\n",
"
13.0
\n",
"
\n",
"
\n",
"
485
\n",
"
34
\n",
"
train
\n",
"
698604
\n",
"
13
\n",
"
30.0
\n",
"
\n",
"
\n",
"
570
\n",
"
38
\n",
"
train
\n",
"
3173750
\n",
"
9
\n",
"
30.0
\n",
"
\n",
"
\n",
"
588
\n",
"
40
\n",
"
test
\n",
"
2431024
\n",
"
8
\n",
"
7.0
\n",
"
\n",
"
\n",
"
669
\n",
"
48
\n",
"
train
\n",
"
2924697
\n",
"
18
\n",
"
14.0
\n",
"
\n",
"
\n",
"
999
\n",
"
64
\n",
"
train
\n",
"
2639013
\n",
"
13
\n",
"
27.0
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" user_id eval_set order_id order_hour_of_day days_since_prior_order\n",
"74 7 train 525192 11 6.0\n",
"129 14 train 2316178 19 11.0\n",
"272 22 test 139655 6 1.0\n",
"296 24 train 965160 16 0.0\n",
"439 29 train 3110252 11 13.0\n",
"485 34 train 698604 13 30.0\n",
"570 38 train 3173750 9 30.0\n",
"588 40 test 2431024 8 7.0\n",
"669 48 train 2924697 18 14.0\n",
"999 64 train 2639013 13 27.0"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## First approach:\n",
"# In two steps keep only the future orders from all customers: train & test \n",
"orders_future = orders[((orders.eval_set=='train') | (orders.eval_set=='test'))]\n",
"orders_future = orders_future[ ['user_id', 'eval_set', 'order_id','order_hour_of_day','days_since_prior_order'] ]\n",
"orders_future.head(10)\n",
"\n",
"## Second approach (if you want to test it you have to re-run the notebook):\n",
"# In one step keep only the future orders from all customers: train & test \n",
"#orders_future = orders.loc[((orders.eval_set=='train') | (orders.eval_set=='test')), ['user_id', 'eval_set', 'order_id'] ]\n",
"#orders_future.head(10)\n",
"\n",
"## Third approach (if you want to test it you have to re-run the notebook):\n",
"# In one step exclude all the prior orders so to deal with the future orders from all customers\n",
"#orders_future = orders.loc[orders.eval_set!='prior', ['user_id', 'eval_set', 'order_id'] ]\n",
"#orders_future.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
user_id
\n",
"
product_id
\n",
"
uxp_t_bought
\n",
"
user_t_orders
\n",
"
prd_t_purchases
\n",
"
eval_set
\n",
"
order_id
\n",
"
order_hour_of_day
\n",
"
days_since_prior_order
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
7
\n",
"
274
\n",
"
1
\n",
"
20
\n",
"
232
\n",
"
train
\n",
"
525192
\n",
"
11
\n",
"
6.0
\n",
"
\n",
"
\n",
"
1
\n",
"
7
\n",
"
519
\n",
"
2
\n",
"
20
\n",
"
111
\n",
"
train
\n",
"
525192
\n",
"
11
\n",
"
6.0
\n",
"
\n",
"
\n",
"
2
\n",
"
7
\n",
"
4920
\n",
"
7
\n",
"
20
\n",
"
8126
\n",
"
train
\n",
"
525192
\n",
"
11
\n",
"
6.0
\n",
"
\n",
"
\n",
"
3
\n",
"
7
\n",
"
4945
\n",
"
3
\n",
"
20
\n",
"
599
\n",
"
train
\n",
"
525192
\n",
"
11
\n",
"
6.0
\n",
"
\n",
"
\n",
"
4
\n",
"
7
\n",
"
6361
\n",
"
5
\n",
"
20
\n",
"
333
\n",
"
train
\n",
"
525192
\n",
"
11
\n",
"
6.0
\n",
"
\n",
"
\n",
"
5
\n",
"
7
\n",
"
8277
\n",
"
3
\n",
"
20
\n",
"
8990
\n",
"
train
\n",
"
525192
\n",
"
11
\n",
"
6.0
\n",
"
\n",
"
\n",
"
6
\n",
"
7
\n",
"
8518
\n",
"
3
\n",
"
20
\n",
"
6828
\n",
"
train
\n",
"
525192
\n",
"
11
\n",
"
6.0
\n",
"
\n",
"
\n",
"
7
\n",
"
7
\n",
"
9598
\n",
"
3
\n",
"
20
\n",
"
523
\n",
"
train
\n",
"
525192
\n",
"
11
\n",
"
6.0
\n",
"
\n",
"
\n",
"
8
\n",
"
7
\n",
"
10504
\n",
"
1
\n",
"
20
\n",
"
731
\n",
"
train
\n",
"
525192
\n",
"
11
\n",
"
6.0
\n",
"
\n",
"
\n",
"
9
\n",
"
7
\n",
"
10895
\n",
"
3
\n",
"
20
\n",
"
547
\n",
"
train
\n",
"
525192
\n",
"
11
\n",
"
6.0
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" user_id product_id uxp_t_bought user_t_orders prd_t_purchases eval_set \\\n",
"0 7 274 1 20 232 train \n",
"1 7 519 2 20 111 train \n",
"2 7 4920 7 20 8126 train \n",
"3 7 4945 3 20 599 train \n",
"4 7 6361 5 20 333 train \n",
"5 7 8277 3 20 8990 train \n",
"6 7 8518 3 20 6828 train \n",
"7 7 9598 3 20 523 train \n",
"8 7 10504 1 20 731 train \n",
"9 7 10895 3 20 547 train \n",
"\n",
" order_id order_hour_of_day days_since_prior_order \n",
"0 525192 11 6.0 \n",
"1 525192 11 6.0 \n",
"2 525192 11 6.0 \n",
"3 525192 11 6.0 \n",
"4 525192 11 6.0 \n",
"5 525192 11 6.0 \n",
"6 525192 11 6.0 \n",
"7 525192 11 6.0 \n",
"8 525192 11 6.0 \n",
"9 525192 11 6.0 "
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# bring the info of the future orders to data DF\n",
"\n",
"data = data.merge(orders_future, on='user_id', how='left')\n",
"data.head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Prepare the train DataFrame"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"+ We keep only the customers who are labelled as \"train\" from the competition\n",
"+ For these customers we get from order_products_train the products that they have bought, in order to create the response variable (reordered:1 or 0)\n",
"+ We make all the required manipulations on that dataset and we remove the columns that are not predictors\n",
"\n",
"So now we filter the data DataFrame so to keep only the train users:"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"