├── Cost and Service Level Optimization.ipynb ├── Fill Rate.ipynb ├── Gamma Distribution Calculation.ipynb ├── README.md ├── Safety and Cycle Stock Calculation.ipynb └── Stock Simulation.ipynb /Cost and Service Level Optimization.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 79, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import numpy as np\n", 10 | "import pandas as pd\n", 11 | "import glob, os\n", 12 | "from scipy.stats import norm\n", 13 | "import matplotlib.pyplot as plt" 14 | ] 15 | }, 16 | { 17 | "cell_type": "markdown", 18 | "metadata": {}, 19 | "source": [ 20 | "--- **Data Aggregation and Cleaning were here** ---\n", 21 | "\n", 22 | "Initially this script included lines meant for data aggregation and cleaning. As the process is going to be the same for all upcoming scripts, these lines are deleted. However, they can be found in the first script related to Safety and Cycle Stock calculation." 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": {}, 28 | "source": [ 29 | "--- **Cost and Service Level Optimization script starts here** ---" 30 | ] 31 | }, 32 | { 33 | "cell_type": "markdown", 34 | "metadata": {}, 35 | "source": [ 36 | "Product chosen for this script is one of supplier's topsellers. It's is rarely included in promo activities." 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 98, 42 | "metadata": {}, 43 | "outputs": [], 44 | "source": [ 45 | "dfPivot = dfPivot[dfPivot['Base_Unit_Code']=='1234567890']" 46 | ] 47 | }, 48 | { 49 | "cell_type": "markdown", 50 | "metadata": {}, 51 | "source": [ 52 | "Data sample for the chosen product is displayed below." 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 99, 58 | "metadata": {}, 59 | "outputs": [ 60 | { 61 | "name": "stdout", 62 | "output_type": "stream", 63 | "text": [ 64 | "Line_ID Movement_Week Movement_Date EAN_Code Base_Unit_Code Stock Transit Shipped OOS Demand\n", 65 | "6 cw05 2021-02-01 4600000000001 1234567890 117139 17172 11331 0 11331\n", 66 | "445 cw03 2021-01-20 4600000000001 1234567890 20796 36720 17532 0 17532\n", 67 | "3969 cw42 2020-10-13 4600000000001 1234567890 28675 22032 8793 0 8793\n", 68 | "3718 cw43 2020-10-20 4600000000001 1234567890 69933 0 11664 0 11664\n", 69 | "3315 cw44 2020-11-01 4600000000001 1234567890 53264 4320 5067 0 5067\n" 70 | ] 71 | } 72 | ], 73 | "source": [ 74 | "print(dfPivot.sample(5))" 75 | ] 76 | }, 77 | { 78 | "cell_type": "markdown", 79 | "metadata": {}, 80 | "source": [ 81 | "We choose calendar week as a period. " 82 | ] 83 | }, 84 | { 85 | "cell_type": "code", 86 | "execution_count": 100, 87 | "metadata": {}, 88 | "outputs": [], 89 | "source": [ 90 | "dfOneProduct = dfPivot.groupby('Movement_Week',as_index=False)[['Stock','Shipped','OOS','Demand']].sum()" 91 | ] 92 | }, 93 | { 94 | "cell_type": "markdown", 95 | "metadata": {}, 96 | "source": [ 97 | "Aggregated quantities can be observed in the following table." 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": 101, 103 | "metadata": { 104 | "scrolled": true 105 | }, 106 | "outputs": [ 107 | { 108 | "name": "stdout", 109 | "output_type": "stream", 110 | "text": [ 111 | "Line_ID Movement_Week Demand\n", 112 | "16 cw44 41607\n", 113 | "17 cw45 37393\n", 114 | "18 cw46 62100\n", 115 | "19 cw47 60111\n", 116 | "20 cw48 94296\n", 117 | "21 cw49 75029\n", 118 | "22 cw50 69098\n", 119 | "23 cw51 9144\n", 120 | "24 cw52 27278\n", 121 | "25 cw53 53959\n" 122 | ] 123 | } 124 | ], 125 | "source": [ 126 | "print(dfOneProduct[['Movement_Week','Demand']].tail(10))" 127 | ] 128 | }, 129 | { 130 | "cell_type": "markdown", 131 | "metadata": {}, 132 | "source": [ 133 | "*MU* is a mean value for product's demand. In our case it's calculated based on data since August 16th." 134 | ] 135 | }, 136 | { 137 | "cell_type": "code", 138 | "execution_count": 102, 139 | "metadata": {}, 140 | "outputs": [], 141 | "source": [ 142 | "mu = np.round(dfOneProduct['Demand'].mean(),decimals=2) # mean value" 143 | ] 144 | }, 145 | { 146 | "cell_type": "markdown", 147 | "metadata": {}, 148 | "source": [ 149 | "*Sigma (std)* is standard deviation value for product's demand. The result shows that deviation of the chosen product's demand is rather high." 150 | ] 151 | }, 152 | { 153 | "cell_type": "code", 154 | "execution_count": 103, 155 | "metadata": {}, 156 | "outputs": [], 157 | "source": [ 158 | "std = np.round((np.std(dfOneProduct['Demand'],ddof=1)),decimals=2) # standard deviation or std" 159 | ] 160 | }, 161 | { 162 | "cell_type": "code", 163 | "execution_count": 104, 164 | "metadata": { 165 | "scrolled": true 166 | }, 167 | "outputs": [ 168 | { 169 | "name": "stdout", 170 | "output_type": "stream", 171 | "text": [ 172 | "\n", 173 | " mu: 48699.31 \n", 174 | " std: 20484.33\n" 175 | ] 176 | } 177 | ], 178 | "source": [ 179 | "print('\\n','mu:',mu,'\\n','std:',std)" 180 | ] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "execution_count": 105, 185 | "metadata": { 186 | "scrolled": true 187 | }, 188 | "outputs": [ 189 | { 190 | "name": "stdout", 191 | "output_type": "stream", 192 | "text": [ 193 | " Review Period Inventory Cost Cycle Service Level Fill Rate\n", 194 | "0 1.0 31524.43 97.5 99.9994\n", 195 | "1 2.0 61474.62 95.0 99.9992\n", 196 | "2 3.0 91753.77 92.5 99.9989\n", 197 | "3 4.0 122113.71 90.0 99.9987\n", 198 | "4 5.0 152505.27 87.5 99.9985\n", 199 | "5 6.0 182912.25 85.0 99.9983\n", 200 | "6 7.0 213327.81 82.5 99.9981\n" 201 | ] 202 | } 203 | ], 204 | "source": [ 205 | "def normal_loss_standard(x): # function calculates the amount of units\n", 206 | " return norm.pdf(x) - x*(1-norm.cdf(x)) # you're likely to run short. \n", 207 | "\n", 208 | "def cost(h,d_mu,R,z,x_std,k,b): # function calculates the inventory cost based on\n", 209 | " return h*(mu*R/2+z*x_std)+k/R+b*x_std*normal_loss_standard(z)/R # the inputs below \n", 210 | "\n", 211 | "def CSL_optimal(b,h,R): # function calculates \n", 212 | " return 1-(h*R)/b # the optimal cycle service level - alpha\n", 213 | " \n", 214 | "\n", 215 | "h = 1.25 # holding cost per week per unit\n", 216 | "R = 1 # review period in weeks\n", 217 | "L = 0.43 # lead time in weeks (here we have the equivalent of 3 days)\n", 218 | "k = 1000 # transaction cost\n", 219 | "b = 50 # backorder cost per unit\n", 220 | "\n", 221 | "\n", 222 | "df = pd.DataFrame(columns=[\"Review Period\", \"Inventory Cost\", \"Cycle Service Level\", \"Fill Rate\"])\n", 223 | "for R in [1,2,3,4,5,6,7]: # cost and service level are calculated per each review period\n", 224 | " x_std = 25*np.sqrt(R+L)\n", 225 | " alpha = CSL_optimal(b,h,R)\n", 226 | " z = norm.ppf(alpha)\n", 227 | " beta = 1 - x_std*normal_loss_standard(z)/R/mu\n", 228 | " df = df.append({\"Cycle Service Level\":np.round(alpha*100,decimals=2), \n", 229 | " \"Fill Rate\":np.round(beta*100,decimals=4), \n", 230 | " \"Inventory Cost\":np.round(cost(h,mu,R,z,x_std,k,b),decimals=2), \n", 231 | " \"Review Period\":R},\n", 232 | " ignore_index=True)\n", 233 | "\n", 234 | "print(df)" 235 | ] 236 | }, 237 | { 238 | "cell_type": "markdown", 239 | "metadata": {}, 240 | "source": [ 241 | "In the table above we can see which inventory cost, cycle service level and fill rate we can expect with any proposed review period.\n", 242 | "\n", 243 | "The plot below provides a clear overview of the chart." 244 | ] 245 | }, 246 | { 247 | "cell_type": "code", 248 | "execution_count": 106, 249 | "metadata": {}, 250 | "outputs": [ 251 | { 252 | "data": { 253 | "image/png": "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\n", 254 | "text/plain": [ 255 | "
" 256 | ] 257 | }, 258 | "metadata": { 259 | "needs_background": "light" 260 | }, 261 | "output_type": "display_data" 262 | } 263 | ], 264 | "source": [ 265 | "fig, ax_left = plt.subplots()\n", 266 | "ax_right = ax_left.twinx()\n", 267 | "\n", 268 | "df[[\"Inventory Cost\",\"Cycle Service Level\",\"Fill Rate\"]].plot(ax=ax_left,\n", 269 | " figsize=(8,4),\n", 270 | " secondary_y= [\"Cycle Service Level\",\"Fill Rate\"])\n", 271 | "\n", 272 | "\n", 273 | "ax_left.set_xlabel('Review Period (Weeks)')\n", 274 | "ax_left.set_ylabel('Inventory Cost (₽)')\n", 275 | "ax_right.set_ylabel('Cycle Service Level / Fill Rate (%)',labelpad=37)\n", 276 | "ax_right.set_yticks([])\n", 277 | "\n", 278 | "h1, l1 = ax_left.get_legend_handles_labels() # next 5 lines let us add a legend block to the lower center\n", 279 | "h2, l2 = ax_left.right_ax.get_legend_handles_labels()\n", 280 | "handles = h1+h2\n", 281 | "labels = l1+l2\n", 282 | "ax_left.legend(handles, labels, loc=8, ncol=1)\n", 283 | "\n", 284 | "x1, y1, y2 = [-0.01,3], [97.5,90], [80,90] # coordinates of the area that shows the suitable range for\n", 285 | " # inventory cost and cycle service level\n", 286 | "\n", 287 | "plt.fill_between(x1, y1, y2, color='C2', alpha=0.2, hatch='xx') # the chosen area above is filled with color\n", 288 | "\n", 289 | "plt.show()" 290 | ] 291 | }, 292 | { 293 | "cell_type": "markdown", 294 | "metadata": {}, 295 | "source": [ 296 | "The plot above displays that it would be profitable to keep the review period within 3 days. There will be a balance between cycle service level and inventory cost. \n", 297 | "\n", 298 | "The best result is achieved with the shortest possible review period. It may be caused by a rather high demand deviation. Fill rate remains high with any review period.\n", 299 | "\n", 300 | "When review period is extended, it will cause negative effect in both costs and service level." 301 | ] 302 | } 303 | ], 304 | "metadata": { 305 | "kernelspec": { 306 | "display_name": "Python 3", 307 | "language": "python", 308 | "name": "python3" 309 | }, 310 | "language_info": { 311 | "codemirror_mode": { 312 | "name": "ipython", 313 | "version": 3 314 | }, 315 | "file_extension": ".py", 316 | "mimetype": "text/x-python", 317 | "name": "python", 318 | "nbconvert_exporter": "python", 319 | "pygments_lexer": "ipython3", 320 | "version": "3.8.3" 321 | } 322 | }, 323 | "nbformat": 4, 324 | "nbformat_minor": 4 325 | } 326 | -------------------------------------------------------------------------------- /Fill Rate.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 143, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import numpy as np\n", 10 | "import pandas as pd\n", 11 | "import glob, os\n", 12 | "from scipy.stats import norm\n", 13 | "import matplotlib.pyplot as plt" 14 | ] 15 | }, 16 | { 17 | "cell_type": "markdown", 18 | "metadata": {}, 19 | "source": [ 20 | "--- **Data Aggregation and Cleaning were here** ---\n", 21 | "\n", 22 | "Initially this script included lines meant for data aggregation and cleaning. As the process is going to be the same for all upcoming scripts, these lines are deleted. However, they can be found in the first script related to Safety and Cycle Stock calculation." 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": {}, 28 | "source": [ 29 | "--- **Fill Rate Simulation script starts here** ---" 30 | ] 31 | }, 32 | { 33 | "cell_type": "markdown", 34 | "metadata": {}, 35 | "source": [ 36 | "Product chosen for this script is one of supplier's topsellers. It's is rarely included in promo activities." 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 162, 42 | "metadata": {}, 43 | "outputs": [], 44 | "source": [ 45 | "dfPivot = dfPivot[dfPivot['Base_Unit_Code']=='1234567890']" 46 | ] 47 | }, 48 | { 49 | "cell_type": "markdown", 50 | "metadata": {}, 51 | "source": [ 52 | "Data sample for the chosen product is displayed below." 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 163, 58 | "metadata": {}, 59 | "outputs": [ 60 | { 61 | "name": "stdout", 62 | "output_type": "stream", 63 | "text": [ 64 | "Line_ID Movement_Week Movement_Date EAN_Code Base_Unit_Code Stock Transit Shipped OOS Demand\n", 65 | "1759 cw49 2020-12-01 4600000000001 1234567890 12434 64800 10313 0 10313\n", 66 | "3204 cw43 2020-10-21 4600000000001 1234567890 63083 17712 6993 0 6993\n", 67 | "626 cw53 2021-01-02 4600000000001 1234567890 27557 6048 16146 0 16146\n", 68 | "1905 cw48 2020-11-27 4600000000001 1234567890 23315 0 16587 2835 19422\n", 69 | "2470 cw46 2020-11-11 4600000000001 1234567890 66632 0 7938 0 7938\n" 70 | ] 71 | } 72 | ], 73 | "source": [ 74 | "print(dfPivot.sample(5))" 75 | ] 76 | }, 77 | { 78 | "cell_type": "markdown", 79 | "metadata": {}, 80 | "source": [ 81 | "We choose calendar day as a period. " 82 | ] 83 | }, 84 | { 85 | "cell_type": "code", 86 | "execution_count": 164, 87 | "metadata": {}, 88 | "outputs": [], 89 | "source": [ 90 | "dfOneProduct = dfPivot.groupby('Movement_Date',as_index=False)[['Stock','Shipped','OOS','Demand']].sum()" 91 | ] 92 | }, 93 | { 94 | "cell_type": "markdown", 95 | "metadata": {}, 96 | "source": [ 97 | "Aggregated quantities can be observed in the following table." 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": 165, 103 | "metadata": { 104 | "scrolled": true 105 | }, 106 | "outputs": [ 107 | { 108 | "name": "stdout", 109 | "output_type": "stream", 110 | "text": [ 111 | "Line_ID Movement_Date Demand\n", 112 | "148 2021-01-10 6237\n", 113 | "149 2021-01-11 6228\n", 114 | "150 2021-01-12 3636\n", 115 | "151 2021-01-13 4203\n", 116 | "152 2021-01-14 11430\n", 117 | "153 2021-01-15 5931\n", 118 | "154 2021-01-16 1944\n", 119 | "155 2021-01-17 10404\n", 120 | "156 2021-01-18 18999\n", 121 | "157 2021-01-19 25766\n" 122 | ] 123 | } 124 | ], 125 | "source": [ 126 | "print(dfOneProduct[['Movement_Date','Demand']].tail(10))" 127 | ] 128 | }, 129 | { 130 | "cell_type": "markdown", 131 | "metadata": {}, 132 | "source": [ 133 | "*Z* is a demand threshold. Below we will calculate the probability for an occurence of demand quantity to be below *Z* value within a chosen period. I have set 15.000 as a demand threshold as it almost equals to the inverse CDF of a normal distribution." 134 | ] 135 | }, 136 | { 137 | "cell_type": "code", 138 | "execution_count": 166, 139 | "metadata": {}, 140 | "outputs": [], 141 | "source": [ 142 | "z = 15000 # Chosen value is almost equal to the inverse CDF of a normal distribution." 143 | ] 144 | }, 145 | { 146 | "cell_type": "markdown", 147 | "metadata": {}, 148 | "source": [ 149 | "*MU* is a mean value for product's demand. In our case it's calculated based on data since August 16th." 150 | ] 151 | }, 152 | { 153 | "cell_type": "code", 154 | "execution_count": 167, 155 | "metadata": {}, 156 | "outputs": [], 157 | "source": [ 158 | "mu = np.round(dfOneProduct['Demand'].mean(),decimals=2) # mean value" 159 | ] 160 | }, 161 | { 162 | "cell_type": "markdown", 163 | "metadata": {}, 164 | "source": [ 165 | "*Sigma (std)* is standard deviation value for product's demand." 166 | ] 167 | }, 168 | { 169 | "cell_type": "code", 170 | "execution_count": 168, 171 | "metadata": {}, 172 | "outputs": [], 173 | "source": [ 174 | "std = np.round((np.std(dfOneProduct['Demand'],ddof=1)),decimals=2) # standard deviation or std" 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": 169, 180 | "metadata": { 181 | "scrolled": true 182 | }, 183 | "outputs": [ 184 | { 185 | "name": "stdout", 186 | "output_type": "stream", 187 | "text": [ 188 | "\n", 189 | " z: 15000 \n", 190 | " mu: 7361.31 \n", 191 | " std: 4388.74\n" 192 | ] 193 | } 194 | ], 195 | "source": [ 196 | "print('\\n','z:',z,'\\n','mu:',mu,'\\n','std:',std)" 197 | ] 198 | }, 199 | { 200 | "cell_type": "markdown", 201 | "metadata": {}, 202 | "source": [ 203 | "Coefficients below were found by Andrade and Sikorski. These numbers let you calculate inverse standard normal loss function." 204 | ] 205 | }, 206 | { 207 | "cell_type": "code", 208 | "execution_count": 170, 209 | "metadata": {}, 210 | "outputs": [], 211 | "source": [ 212 | "coefficients = [ 4.41738119e-09, 1.79200966e-07, 3.01634229e-06,\n", 213 | "2.63537452e-05, 1.12381749e-04, 5.71289020e-06,\n", 214 | "-2.64198510e-03, -1.59986142e-02, -5.60399292e-02,\n", 215 | "-1.48968884e-01, -3.68776346e-01, -1.22551895e+00,\n", 216 | "-8.99375602e-01]\n", 217 | "\n", 218 | "def inverse_standard_loss(target):\n", 219 | " x = np.log(target)\n", 220 | " z = np.polyval(coefficients, x)\n", 221 | " return z" 222 | ] 223 | }, 224 | { 225 | "cell_type": "code", 226 | "execution_count": 198, 227 | "metadata": {}, 228 | "outputs": [], 229 | "source": [ 230 | "time = 10000 # Time period chosen for simulation.\n", 231 | "\n", 232 | "L = 2 # Lead time chosen for simulation.\n", 233 | "L_std = 0 # No deviation for lead time is added.\n", 234 | "R = 7 # Replenishment happens every 7 days.\n", 235 | "\n", 236 | "x_std = np.sqrt((L+R)*std**2+L_std**2*mu**2)\n", 237 | "\n", 238 | "d = np.maximum(np.random.normal(mu,std,time).round(0).astype(int),0)" 239 | ] 240 | }, 241 | { 242 | "cell_type": "code", 243 | "execution_count": 172, 244 | "metadata": {}, 245 | "outputs": [], 246 | "source": [ 247 | "beta = 0.98 # the desired fill rate\n", 248 | "d_c = mu * R\n", 249 | "target = d_c*(1-beta)/x_std\n", 250 | "z = inverse_standard_loss(target) # The service level factor.\n", 251 | "alpha = round(norm.cdf(z),3) # The expected cycle service level." 252 | ] 253 | }, 254 | { 255 | "cell_type": "code", 256 | "execution_count": 174, 257 | "metadata": {}, 258 | "outputs": [], 259 | "source": [ 260 | "Ss = np.round(x_std*z).astype(int) \n", 261 | "Ss = Ss - d_c*(1-beta) # Excess demand result in lost sales rather than backorders.\n", 262 | "Cs = 1/2 * mu * R # Cycle stock.\n", 263 | "Is = mu * L # Stock in transit.\n", 264 | "S = Ss + 2*Cs + Is # Overall stock." 265 | ] 266 | }, 267 | { 268 | "cell_type": "code", 269 | "execution_count": 175, 270 | "metadata": {}, 271 | "outputs": [], 272 | "source": [ 273 | "hand = np.zeros(time,dtype=int) # numpy array for stock on hand, that will be updated in for loop\n", 274 | "transit = np.zeros((time,L+7*L_std+1),dtype=int) # numpy array for stock in transit, that will be updated in for loop\n", 275 | "\n", 276 | "hand[0] = S - d[0]\n", 277 | "transit[0,L] = d[0]" 278 | ] 279 | }, 280 | { 281 | "cell_type": "code", 282 | "execution_count": 176, 283 | "metadata": {}, 284 | "outputs": [], 285 | "source": [ 286 | "stockout_period = np.full(time,False,dtype=bool)\n", 287 | "stockout_cycle = []\n", 288 | "unit_shorts = np.zeros(time,dtype=int)" 289 | ] 290 | }, 291 | { 292 | "cell_type": "code", 293 | "execution_count": 177, 294 | "metadata": {}, 295 | "outputs": [], 296 | "source": [ 297 | "for t in range(1,time):\n", 298 | " if transit[t-1,0]>0:\n", 299 | " stockout_cycle.append(stockout_period[t-1])\n", 300 | " unit_shorts[t] = max(0,d[t] - max(0,hand[t-1] + transit[t-1,0]))\n", 301 | " hand[t] = hand[t-1] - d[t] + transit[t-1,0]\n", 302 | " stockout_period[t] = hand[t] < 0\n", 303 | " hand[t] = max(0,hand[t]) #Uncomment if excess demand result in lost sales rather than backorders\n", 304 | " transit[t,:-1] = transit[t-1,1:] \n", 305 | " if t%R==0:\n", 306 | " actual_L = int(round(max(np.random.normal(L,L_std),0),0))\n", 307 | " net = hand[t] + transit[t].sum() \n", 308 | " transit[t,actual_L] = S - net" 309 | ] 310 | }, 311 | { 312 | "cell_type": "code", 313 | "execution_count": 178, 314 | "metadata": { 315 | "scrolled": false 316 | }, 317 | "outputs": [ 318 | { 319 | "name": "stdout", 320 | "output_type": "stream", 321 | "text": [ 322 | "Alpha: 84.9\n", 323 | "Beta: 98.0 \n", 324 | "\n", 325 | "Fill Rate: 98.2\n", 326 | "Cycle Service Level: 86.0\n", 327 | "Period Service Level: 97.3\n" 328 | ] 329 | } 330 | ], 331 | "source": [ 332 | "print(\"Alpha:\",round(alpha*100,1))\n", 333 | "print(\"Beta:\",beta*100,'\\n')\n", 334 | "\n", 335 | "fill_rate = 1-unit_shorts.sum()/sum(d)\n", 336 | "print(\"Fill Rate:\",round(fill_rate*100,1))\n", 337 | "\n", 338 | "SL_alpha = 1-sum(stockout_cycle)/len(stockout_cycle)\n", 339 | "print(\"Cycle Service Level:\",round(SL_alpha*100,1))\n", 340 | "\n", 341 | "SL_period = 1-sum(stockout_period)/time\n", 342 | "print(\"Period Service Level:\",round(SL_period*100,1))" 343 | ] 344 | }, 345 | { 346 | "cell_type": "markdown", 347 | "metadata": {}, 348 | "source": [ 349 | "According to the cycle service level, we have rather a high possibility (~ 14%) of facing Out of Stock by the end of the cycle (review period). However, the expected amount of goods short is rather low (~ 2%)." 350 | ] 351 | }, 352 | { 353 | "cell_type": "markdown", 354 | "metadata": {}, 355 | "source": [ 356 | "**Cycle Service Level** means the probability of facing OOS *during a review cycle*. In our case it's 7 days. Even if we face OOS only once during 7 days (for example, on the last day of cycle), we will have 0% service level for this cycle. In this case even 1 day of OOS can effect the overall service level in a greater degree. However, *it doesn't matter whether we had 1 or 2-3 cases of OOS within the cycle*. Its cycle service level is already 0%.\n", 357 | "\n", 358 | "Idea for that logic is that we have less periods for estimation: [number of days] / [length of cycle].\n", 359 | "\n", 360 | "We're likely to be short of goods during a cycle for the following number of times:" 361 | ] 362 | }, 363 | { 364 | "cell_type": "code", 365 | "execution_count": 195, 366 | "metadata": {}, 367 | "outputs": [ 368 | { 369 | "name": "stdout", 370 | "output_type": "stream", 371 | "text": [ 372 | "200\n" 373 | ] 374 | } 375 | ], 376 | "source": [ 377 | "print(sum(stockout_cycle))" 378 | ] 379 | }, 380 | { 381 | "cell_type": "markdown", 382 | "metadata": {}, 383 | "source": [ 384 | "**Period Service Level** means the probability of facing OOS *over the whole simulated period*. In our case it's 10000 days.\n", 385 | "\n", 386 | "As opposed to cycle service level, one case of OOS doesn't affect the service level so much. *OOS can drop the service level for one day only - when it actually happens*. However, in case of cycle service level, one OOS drops the whole cycle's service level.\n", 387 | "\n", 388 | "We are going to have the following number of OOS within the mentioned period. All these cases are distributed over cycles mentioned above. If we have more OOS cased during period than during cycle, it means that in some cycles we had more than 1 OOS. For example, during two last days of cycle before new replenishment nothing could be sold because of OOS. " 389 | ] 390 | }, 391 | { 392 | "cell_type": "code", 393 | "execution_count": 196, 394 | "metadata": { 395 | "scrolled": true 396 | }, 397 | "outputs": [ 398 | { 399 | "name": "stdout", 400 | "output_type": "stream", 401 | "text": [ 402 | "267\n" 403 | ] 404 | } 405 | ], 406 | "source": [ 407 | "print(sum(stockout_period))" 408 | ] 409 | } 410 | ], 411 | "metadata": { 412 | "kernelspec": { 413 | "display_name": "Python 3", 414 | "language": "python", 415 | "name": "python3" 416 | }, 417 | "language_info": { 418 | "codemirror_mode": { 419 | "name": "ipython", 420 | "version": 3 421 | }, 422 | "file_extension": ".py", 423 | "mimetype": "text/x-python", 424 | "name": "python", 425 | "nbconvert_exporter": "python", 426 | "pygments_lexer": "ipython3", 427 | "version": "3.8.3" 428 | } 429 | }, 430 | "nbformat": 4, 431 | "nbformat_minor": 4 432 | } 433 | -------------------------------------------------------------------------------- /Gamma Distribution Calculation.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import numpy as np\n", 10 | "import pandas as pd\n", 11 | "import glob, os\n", 12 | "from scipy.stats import norm, gamma, stats, skew\n", 13 | "import statistics\n", 14 | "import matplotlib.pyplot as plt\n", 15 | "import matplotlib.style as style" 16 | ] 17 | }, 18 | { 19 | "cell_type": "markdown", 20 | "metadata": {}, 21 | "source": [ 22 | "--- **Data Aggregation and Cleaning were here** ---\n", 23 | "\n", 24 | "Initially this script included lines meant for data aggregation and cleaning. As the process is going to be the same for all upcoming scripts, these lines are deleted. However, they can be found in the first script related to Safety and Cycle Stock calculation." 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": {}, 30 | "source": [ 31 | "--- **Gamma Distribution Calculation script starts here** ---" 32 | ] 33 | }, 34 | { 35 | "cell_type": "markdown", 36 | "metadata": {}, 37 | "source": [ 38 | "In case of Gamma Distribution Simulation we will not use the data for a specific product, but for the whole product range shipped from Supplier to Retailer." 39 | ] 40 | }, 41 | { 42 | "cell_type": "markdown", 43 | "metadata": {}, 44 | "source": [ 45 | "Data sample is displayed below." 46 | ] 47 | }, 48 | { 49 | "cell_type": "code", 50 | "execution_count": 20, 51 | "metadata": { 52 | "scrolled": true 53 | }, 54 | "outputs": [ 55 | { 56 | "name": "stdout", 57 | "output_type": "stream", 58 | "text": [ 59 | "Line_ID Movement_Week Movement_Date EAN_Code Base_Unit_Code Stock Transit Shipped OOS Demand\n", 60 | "34 cw06 2021-02-11 4000000000001 1000000001 408 0 408 0 408\n", 61 | "5840 cw36 2020-09-06 4000000000002 1000000002 3273 1728 648 0 648\n", 62 | "763 cw03 2021-01-22 4000000000003 1000000003 4806 0 2832 24 2856\n", 63 | "2164 cw51 2020-12-14 4000000000004 1000000004 5222 0 54 0 54\n", 64 | "5914 cw36 2020-09-04 4000000000005 1000000005 27964 0 864 0 864\n" 65 | ] 66 | } 67 | ], 68 | "source": [ 69 | "print(dfPivot.sample(5))" 70 | ] 71 | }, 72 | { 73 | "cell_type": "markdown", 74 | "metadata": {}, 75 | "source": [ 76 | "This line is kept in order to quickly switch from full products' range analysis to one product's only. The mentioned product is one of supplier's bestsellers." 77 | ] 78 | }, 79 | { 80 | "cell_type": "code", 81 | "execution_count": 21, 82 | "metadata": {}, 83 | "outputs": [], 84 | "source": [ 85 | "# dfPivot = dfPivot[dfPivot['Base_Unit_Code'] == '1000000006']" 86 | ] 87 | }, 88 | { 89 | "cell_type": "markdown", 90 | "metadata": {}, 91 | "source": [ 92 | "We choose calendar day as a period. " 93 | ] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": 22, 98 | "metadata": {}, 99 | "outputs": [], 100 | "source": [ 101 | "dfGamma = dfPivot.groupby('Movement_Date',as_index=False)[['Stock','Shipped','OOS','Demand']].sum()\n", 102 | "dfGamma = dfGamma[['Movement_Date','Demand']].set_index('Movement_Date')\n", 103 | "dfGamma.index.name = None" 104 | ] 105 | }, 106 | { 107 | "cell_type": "markdown", 108 | "metadata": {}, 109 | "source": [ 110 | "Aggregated quantities can be observed in the following chart." 111 | ] 112 | }, 113 | { 114 | "cell_type": "code", 115 | "execution_count": 23, 116 | "metadata": { 117 | "scrolled": false 118 | }, 119 | "outputs": [ 120 | { 121 | "data": { 122 | "image/png": "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\n", 123 | "text/plain": [ 124 | "
" 125 | ] 126 | }, 127 | "metadata": { 128 | "needs_background": "light" 129 | }, 130 | "output_type": "display_data" 131 | } 132 | ], 133 | "source": [ 134 | "dfGamma.plot(figsize=(8,4),legend=None)\n", 135 | "plt.show()" 136 | ] 137 | }, 138 | { 139 | "cell_type": "markdown", 140 | "metadata": {}, 141 | "source": [ 142 | "On the plot we can see extremely low value around early October'20. In order to prevent rough outliers from affecting our analysis, we will additionally check the minimum values." 143 | ] 144 | }, 145 | { 146 | "cell_type": "code", 147 | "execution_count": 24, 148 | "metadata": { 149 | "scrolled": false 150 | }, 151 | "outputs": [ 152 | { 153 | "name": "stdout", 154 | "output_type": "stream", 155 | "text": [ 156 | "Line_ID Demand\n", 157 | "2020-10-09 1280\n", 158 | "2020-10-08 1297\n", 159 | "2020-12-17 9432\n", 160 | "2020-12-16 11181\n", 161 | "2020-12-18 11619\n", 162 | "2021-01-05 12249\n", 163 | "2021-01-04 12508\n" 164 | ] 165 | } 166 | ], 167 | "source": [ 168 | "print(dfGamma.sort_values(by='Demand').head(7))" 169 | ] 170 | }, 171 | { 172 | "cell_type": "markdown", 173 | "metadata": {}, 174 | "source": [ 175 | "Above we see that the demand was extremely low within two days in October'20. It may have been the day of warehouse partial closure or the day the inventory checks were carried out. For that reason I decide to ignore the actual minimum in the datased and choose the third value in a row - 9432.\n", 176 | "\n", 177 | "However, the new adequate minimum may appear, that's why I will set a certain threshold for this value and next value above this border will be used." 178 | ] 179 | }, 180 | { 181 | "cell_type": "code", 182 | "execution_count": 25, 183 | "metadata": {}, 184 | "outputs": [], 185 | "source": [ 186 | "dfGamma = dfGamma[dfGamma['Demand'] > 4000]" 187 | ] 188 | }, 189 | { 190 | "cell_type": "markdown", 191 | "metadata": {}, 192 | "source": [ 193 | "Now we will find and display some values that would be used in further analytics and simulation.\n", 194 | "\n", 195 | "*Sigma (std)* is standard deviation value for products' demand." 196 | ] 197 | }, 198 | { 199 | "cell_type": "code", 200 | "execution_count": 26, 201 | "metadata": {}, 202 | "outputs": [], 203 | "source": [ 204 | "std = int(np.std(dfGamma['Demand'],ddof=1)) # standard deviation or std" 205 | ] 206 | }, 207 | { 208 | "cell_type": "markdown", 209 | "metadata": {}, 210 | "source": [ 211 | "Below we find and display the *mu (mean)*, *median*, *mode*, *minimum* and *maximum* for demand data." 212 | ] 213 | }, 214 | { 215 | "cell_type": "code", 216 | "execution_count": 27, 217 | "metadata": { 218 | "scrolled": false 219 | }, 220 | "outputs": [], 221 | "source": [ 222 | "mu = int(dfGamma['Demand'].mean()) # mu corresponds to the mean value\n", 223 | "median = int(dfGamma['Demand'].median())\n", 224 | "mode = statistics.mode(dfGamma['Demand'])\n", 225 | "d_min = int(dfGamma['Demand'].min())\n", 226 | "d_max = int(dfGamma['Demand'].max())" 227 | ] 228 | }, 229 | { 230 | "cell_type": "code", 231 | "execution_count": 28, 232 | "metadata": { 233 | "scrolled": false 234 | }, 235 | "outputs": [ 236 | { 237 | "name": "stdout", 238 | "output_type": "stream", 239 | "text": [ 240 | "\n", 241 | " std: 14188 \n", 242 | " mu: 33632 \n", 243 | " median: 31108 \n", 244 | " mode: 41236 \n", 245 | " \n", 246 | " minimum: 9432 \n", 247 | " maximum: 94405\n" 248 | ] 249 | } 250 | ], 251 | "source": [ 252 | "print('\\n','std:',std,'\\n','mu:',mu,'\\n','median:',median,\n", 253 | " '\\n','mode:',mode,'\\n','\\n','minimum:',d_min,'\\n','maximum:',d_max)" 254 | ] 255 | }, 256 | { 257 | "cell_type": "markdown", 258 | "metadata": {}, 259 | "source": [ 260 | "Now we will get a number of available data points. As we receive new data daily, this value will increase over time.\n", 261 | "\n", 262 | "For that reason we calculate a number of bins as 1/3 of all data points available. It's likely to provide the more precise overview of the available data." 263 | ] 264 | }, 265 | { 266 | "cell_type": "code", 267 | "execution_count": 29, 268 | "metadata": {}, 269 | "outputs": [ 270 | { 271 | "name": "stdout", 272 | "output_type": "stream", 273 | "text": [ 274 | "All data points: 179\n", 275 | "Number of bins: 59\n" 276 | ] 277 | } 278 | ], 279 | "source": [ 280 | "data_points = len(dfGamma.index)\n", 281 | "bins = int(data_points*0.33)\n", 282 | "\n", 283 | "print(\"All data points:\",data_points)\n", 284 | "print(\"Number of bins:\",bins)" 285 | ] 286 | }, 287 | { 288 | "cell_type": "markdown", 289 | "metadata": {}, 290 | "source": [ 291 | "Now we will display the distribution on a histogram." 292 | ] 293 | }, 294 | { 295 | "cell_type": "code", 296 | "execution_count": 30, 297 | "metadata": {}, 298 | "outputs": [], 299 | "source": [ 300 | "hist_range = (dfGamma.Demand.min()*0.8,dfGamma.Demand.max()*1.2)\n", 301 | "y_actuals, edges = np.histogram(dfGamma, bins=bins, density=True, range=hist_range)\n", 302 | "y_actuals = y_actuals/sum(y_actuals)" 303 | ] 304 | }, 305 | { 306 | "cell_type": "code", 307 | "execution_count": 31, 308 | "metadata": { 309 | "scrolled": false 310 | }, 311 | "outputs": [ 312 | { 313 | "data": { 314 | "image/png": "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\n", 315 | "text/plain": [ 316 | "
" 317 | ] 318 | }, 319 | "metadata": { 320 | "needs_background": "light" 321 | }, 322 | "output_type": "display_data" 323 | } 324 | ], 325 | "source": [ 326 | "dfGamma.plot(kind='hist',density=True,bins=bins,range=hist_range,legend=None)\n", 327 | "plt.show()" 328 | ] 329 | }, 330 | { 331 | "cell_type": "markdown", 332 | "metadata": {}, 333 | "source": [ 334 | "Below we calculate skewness." 335 | ] 336 | }, 337 | { 338 | "cell_type": "code", 339 | "execution_count": 32, 340 | "metadata": { 341 | "scrolled": false 342 | }, 343 | "outputs": [ 344 | { 345 | "name": "stdout", 346 | "output_type": "stream", 347 | "text": [ 348 | "Actual skewness: 1.178\n" 349 | ] 350 | } 351 | ], 352 | "source": [ 353 | "skewness = skew(dfGamma.Demand,bias=False)\n", 354 | "# skewness = dfGamma.Demand.skew() # another method for skewness calculation\n", 355 | "\n", 356 | "print('Actual skewness:',np.round(skewness,decimals=3))" 357 | ] 358 | }, 359 | { 360 | "cell_type": "markdown", 361 | "metadata": {}, 362 | "source": [ 363 | "As our result is greather than 1, it means that we have the highly right-skewed distribution. In this case the skew - or tail - is located on the right." 364 | ] 365 | }, 366 | { 367 | "cell_type": "markdown", 368 | "metadata": {}, 369 | "source": [ 370 | "Now we're going to calculate the PDF (probability density function) of a gamma distribution and its **fitted** version that is likely to display the distribution in a more precise way." 371 | ] 372 | }, 373 | { 374 | "cell_type": "code", 375 | "execution_count": 33, 376 | "metadata": {}, 377 | "outputs": [], 378 | "source": [ 379 | "shape = mu**2/std**2 # k\n", 380 | "scale = std**2/mu # theta" 381 | ] 382 | }, 383 | { 384 | "cell_type": "code", 385 | "execution_count": 34, 386 | "metadata": {}, 387 | "outputs": [], 388 | "source": [ 389 | "x_min = gamma.ppf(0.01, shape, scale=scale)\n", 390 | "x_max = gamma.ppf(0.99, shape, scale=scale)" 391 | ] 392 | }, 393 | { 394 | "cell_type": "code", 395 | "execution_count": 35, 396 | "metadata": {}, 397 | "outputs": [], 398 | "source": [ 399 | "x = np.linspace(x_min, x_max, 200)\n", 400 | "y = gamma.pdf(x, shape, scale=scale)" 401 | ] 402 | }, 403 | { 404 | "cell_type": "markdown", 405 | "metadata": {}, 406 | "source": [ 407 | "In order to fit the density function we would use a modified value of the mean." 408 | ] 409 | }, 410 | { 411 | "cell_type": "code", 412 | "execution_count": 36, 413 | "metadata": {}, 414 | "outputs": [], 415 | "source": [ 416 | "mu_p = mu - d_min # mu\n", 417 | "shape_p = mu_p**2/std**2 # k\n", 418 | "scale_p = std**2/mu_p # theta" 419 | ] 420 | }, 421 | { 422 | "cell_type": "code", 423 | "execution_count": 37, 424 | "metadata": {}, 425 | "outputs": [], 426 | "source": [ 427 | "x_min = gamma.ppf(0.01, shape_p, loc=d_min, scale=scale_p)\n", 428 | "x_max = gamma.ppf(0.99, shape_p, loc=d_min, scale=scale_p)" 429 | ] 430 | }, 431 | { 432 | "cell_type": "code", 433 | "execution_count": 38, 434 | "metadata": { 435 | "scrolled": true 436 | }, 437 | "outputs": [], 438 | "source": [ 439 | "x1 = np.linspace(x_min,x_max, 200)\n", 440 | "y1 = gamma.pdf(x, shape_p, loc=d_min, scale=scale_p)" 441 | ] 442 | }, 443 | { 444 | "cell_type": "markdown", 445 | "metadata": {}, 446 | "source": [ 447 | "Now we will see the difference between 2 functions: standard and fitted (with offset)." 448 | ] 449 | }, 450 | { 451 | "cell_type": "code", 452 | "execution_count": 39, 453 | "metadata": { 454 | "scrolled": false 455 | }, 456 | "outputs": [ 457 | { 458 | "data": { 459 | "image/png": "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FWAsUKOE9Y2B7YU+x7nLdhUuJCKjgFEATZs2LfcgjTGmook87pP9qpacFFevXk23biXftaxXrx6zZ88mNDSUDRs2cPXVVxfMVbFixQrWrFlD7dq1admyJTfddBO///47r776Kq+//jqvvPIKAPv372fOnDl8+eWXDBkyhF9//ZV3332Xnj17FiTFp556itq1a5Obm8vAgQNZuXIlnTp18voc09LS6NatGy+99BJPPPEEjz/+OOPGjWPkyJG8/vrrnH766TzyyCM8/vjjvPLKKyUuBzhw4AA///zzEdfh3Xff5cUXX+Trrw+/E/zss88ybty4ghq6v/msJi4iFwJ7VHVJacWKWXbEBOeq+raq9lDVHjExR0ziYowx5hjcfvvtdO7cmZ49ewLOYDQ333wzHTt25Iorrii4BwzQs2dPGjZsSEhICK1atWLw4MEAdOzYkS1bthSUGzJkCCJCx44dqV+/Ph07diQgIID27dsXlJs2bRrdunWja9eurF69+rDjeCMgIKCgeXv48OHMnz+fpKQkDhw4wOmnnw7Addddxy+//FLi8nyFm8krI1/WxPsBF4nI+UAoECUiH6rq8EJl4oAmhT7HAjt9GJMxxpwQSqsx+0r79u357LPPCj6/8cYb7N27lx49egDw73//m/r167NixQry8vIIDQ0tKBsSElLwPiAgoOBzQEAAOTk5R5QrXKZwuc2bN/Piiy+yaNEiatWqxfXXX3/Ec9Hbt29nyJAhAIwePfqw5v/iHM9jexEREce87YnAZzVxVf27qsaqanPgKmBOkQQO8CUw0u2l3gdIUtVdRfdljDHm+J111llkZGTw5ptvFiw7ePBgwfukpCQaNmxIQEAAkyZNIjc3t9xjSE5OJiIigujoaOLj45k1a9YRZZo0acLy5ctZvnx5sQk8Ly+PTz/9FICPPvqI0047jejoaGrVqsW8efMAmDRpEqeffnqJy49HUFAQ2dnZx7WP8lLhw66KyGgAVR0PzATOBzYCB4EbKjoeY4ypLkSEGTNmcM899/D8888TExNDREQEzz33HAC33XYbl112GZ988glnnnmmT2qpnTt3pmvXrrRv356WLVvSr1+/Mu8jIiKC1atX0717d6Kjo5k6dSoA77//PqNHj+bgwYO0bNmSiRMnlrr8WI0aNYpOnTrRrVs3Jk+efFz7Ol6iesQt6BNajx49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\n", 460 | "text/plain": [ 461 | "
" 462 | ] 463 | }, 464 | "metadata": { 465 | "needs_background": "light" 466 | }, 467 | "output_type": "display_data" 468 | } 469 | ], 470 | "source": [ 471 | "fig, ax = plt.subplots()\n", 472 | "\n", 473 | "dfGamma.plot(figsize=(8,4),ax=ax,kind='hist',density=True,bins=bins,range=hist_range,color='darkgrey')\n", 474 | "ax.plot(x,y,label='Gamma - poor fit',color='navy',linewidth=2)\n", 475 | "ax.plot(x1,y1,label='Gamma - with offset',color='crimson',linewidth=2)\n", 476 | "\n", 477 | "ax.set_title(\"Gamma distributions for supplier's demand\")\n", 478 | "ax.set_xlabel('Daily demand')\n", 479 | "\n", 480 | "plt.legend()\n", 481 | "plt.show()" 482 | ] 483 | }, 484 | { 485 | "cell_type": "markdown", 486 | "metadata": {}, 487 | "source": [ 488 | "To make sure that our distribution is rather Gamma than Normal we need to observe its skewness values: for both actual and fitted versions." 489 | ] 490 | }, 491 | { 492 | "cell_type": "code", 493 | "execution_count": 40, 494 | "metadata": {}, 495 | "outputs": [], 496 | "source": [ 497 | "skew_actual = skew(dfGamma.Demand,bias=False)\n", 498 | "skew_gamma = 2*std/mu\n", 499 | "skew_gamma_p = 2*std/(mu-d_min)" 500 | ] 501 | }, 502 | { 503 | "cell_type": "code", 504 | "execution_count": 41, 505 | "metadata": {}, 506 | "outputs": [ 507 | { 508 | "name": "stdout", 509 | "output_type": "stream", 510 | "text": [ 511 | "\n", 512 | " Actual: 1.178 \n", 513 | " Gamma: 0.844 \n", 514 | " Gamma fitted: 1.173\n" 515 | ] 516 | } 517 | ], 518 | "source": [ 519 | "print('\\n','Actual:',np.round(skew_actual,decimals=3),\n", 520 | " '\\n','Gamma:',np.round(skew_gamma,decimals=3),\n", 521 | " '\\n','Gamma fitted:',np.round(skew_gamma_p,decimals=3))" 522 | ] 523 | }, 524 | { 525 | "cell_type": "markdown", 526 | "metadata": {}, 527 | "source": [ 528 | "Gamma fitted value is slightly closer to gamma value than actual one. It adds some additional precision to distribution evaluation." 529 | ] 530 | }, 531 | { 532 | "cell_type": "markdown", 533 | "metadata": {}, 534 | "source": [ 535 | "With all the data we've found, now we'll calculate the recommended up-to and safety stock levels. We're working with a full products' range demand. This type of calculation may be useful for general tracking of total stock. \n", 536 | "\n", 537 | "If it exceeds the up-to level, it may become a sign to explore the reasons." 538 | ] 539 | }, 540 | { 541 | "cell_type": "code", 542 | "execution_count": 42, 543 | "metadata": {}, 544 | "outputs": [], 545 | "source": [ 546 | "alpha = 0.95 # target cycle service level\n", 547 | "L = 4 # lead time\n", 548 | "R = 7 # review period" 549 | ] 550 | }, 551 | { 552 | "cell_type": "code", 553 | "execution_count": 43, 554 | "metadata": {}, 555 | "outputs": [], 556 | "source": [ 557 | "x_min = (R+L)*d_min # minimum demand during replenishment cycle\n", 558 | "x_mu = (R+L)*mu # mean demand during replenishment cycle\n", 559 | "x_mu_p = x_mu - x_min # offset value of the mean\n", 560 | "x_std = np.sqrt(R+L)*std # offset standard deviation \n", 561 | "x_shape_p = x_mu_p**2/x_std**2 # offset shape of distribution\n", 562 | "x_scale_p = x_std**2/x_mu_p # offset scale of distribution" 563 | ] 564 | }, 565 | { 566 | "cell_type": "code", 567 | "execution_count": 44, 568 | "metadata": {}, 569 | "outputs": [], 570 | "source": [ 571 | "S = round(gamma.ppf(alpha,x_shape_p,scale=x_scale_p),0) + x_min # up-to level\n", 572 | "Ss = S - x_mu # safety stock" 573 | ] 574 | }, 575 | { 576 | "cell_type": "code", 577 | "execution_count": 45, 578 | "metadata": { 579 | "scrolled": true 580 | }, 581 | "outputs": [ 582 | { 583 | "name": "stdout", 584 | "output_type": "stream", 585 | "text": [ 586 | "Up-to level: 451786.0\n", 587 | "Safety stock: 81834.0\n" 588 | ] 589 | } 590 | ], 591 | "source": [ 592 | "print('Up-to level:',S)\n", 593 | "print('Safety stock:',Ss)" 594 | ] 595 | } 596 | ], 597 | "metadata": { 598 | "kernelspec": { 599 | "display_name": "Python 3", 600 | "language": "python", 601 | "name": "python3" 602 | }, 603 | "language_info": { 604 | "codemirror_mode": { 605 | "name": "ipython", 606 | "version": 3 607 | }, 608 | "file_extension": ".py", 609 | "mimetype": "text/x-python", 610 | "name": "python", 611 | "nbconvert_exporter": "python", 612 | "pygments_lexer": "ipython3", 613 | "version": "3.8.3" 614 | } 615 | }, 616 | "nbformat": 4, 617 | "nbformat_minor": 4 618 | } 619 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Inventory Optimization 2 | 3 | Links below lead to scripts related to various Inventory Optimization models and simulations. 4 | 5 | The idea of this repository is inspired by [Nicolas Vandeput](https://www.linkedin.com/in/vandeputnicolas/) and [his book](https://www.amazon.com/Inventory-Optimization-Simulations-Nicolas-Vandeput/dp/3110673916). 6 | 7 | * [Safety and Cycle Stock Calculation](https://github.com/fedinb/Inventory-Optimization/blob/main/Safety%20and%20Cycle%20Stock%20Calculation.ipynb) 8 | - [x] What else has been calculated: average demand, standard deviation, CDF and PPF. 9 | * [Stock Simulation](https://github.com/fedinb/Inventory-Optimization/blob/main/Stock%20Simulation.ipynb) 10 | - [x] What has been simulated: safety stock, cycle stock, stock in transit, overall stock and demand. 11 | * [Fill Rate Simulation](https://github.com/fedinb/Inventory-Optimization/blob/main/Fill%20Rate.ipynb) 12 | - [x] What has been simulated: fill rate, cycle service level and period service level. 13 | * [Cost and Service Level Optimization](https://github.com/fedinb/Inventory-Optimization/blob/main/Cost%20and%20Service%20Level%20Optimization.ipynb) 14 | - [x] What has been calculated: fill rate, cycle service level and inventory cost per several review periods. 15 | * [Gamma Distribution Calculation](https://github.com/fedinb/Inventory-Optimization/blob/main/Gamma%20Distribution%20Calculation.ipynb) 16 | - [x] What else has been calculated: skewness, offset skewness, up-to level, safety stock. 17 | 18 | 19 | -------------------------------------------------------------------------------- /Safety and Cycle Stock Calculation.ipynb: -------------------------------------------------------------------------------- 1 | 2 | { 3 | "cells": [ 4 | { 5 | "cell_type": "markdown", 6 | "metadata": {}, 7 | "source": [ 8 | "First part of script consists of raw data processing. Scroll down till text in **bold**." 9 | ] 10 | }, 11 | { 12 | "cell_type": "code", 13 | "execution_count": 311, 14 | "metadata": {}, 15 | "outputs": [], 16 | "source": [ 17 | "import numpy as np\n", 18 | "import pandas as pd\n", 19 | "import glob, os\n", 20 | "from scipy.stats import norm " 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 312, 26 | "metadata": {}, 27 | "outputs": [], 28 | "source": [ 29 | "pd.set_option('display.width', 150)" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": 313, 35 | "metadata": {}, 36 | "outputs": [], 37 | "source": [ 38 | "path = r'C:\\Users\\Folder'\n", 39 | "all_files = glob.glob(path + \"/*.txt\")" 40 | ] 41 | }, 42 | { 43 | "cell_type": "code", 44 | "execution_count": 314, 45 | "metadata": {}, 46 | "outputs": [], 47 | "source": [ 48 | "col_specification = [(0,2),(2,15),(15,28),(28,30),\n", 49 | " (30,34),(34,36),(36,38),(38,42),(42,52),(52,62)]" 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "execution_count": 315, 55 | "metadata": {}, 56 | "outputs": [], 57 | "source": [ 58 | "li = []\n", 59 | "\n", 60 | "for filename in all_files:\n", 61 | " df = pd.read_fwf(filename, header=None,colspecs=col_specification,float_format='%.f')\n", 62 | " li.append(df)\n", 63 | "\n", 64 | "df = pd.concat(li, axis=0, ignore_index=True)\n", 65 | "\n", 66 | "df = df.dropna() # Script drops N/A values. They may appear if file has blank lines.\n", 67 | "\n", 68 | "df.columns = ['Movement_Code','GLN_Code','EAN_Code','Site_Item_Type',\n", 69 | " 'Case_Count','Movement_Day','Movement_Month','Movement_Year',\n", 70 | " 'Quantity','Base_Unit_Code']" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": 316, 76 | "metadata": {}, 77 | "outputs": [], 78 | "source": [ 79 | "df[['GLN_Code','EAN_Code','Base_Unit_Code','Case_Count']] = \\\n", 80 | "df[['GLN_Code','EAN_Code','Base_Unit_Code','Case_Count']].astype(str).replace('\\.0', '', regex=True)\n", 81 | "\n", 82 | "df['Quantity'] = df['Quantity'].astype(int)" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 317, 88 | "metadata": {}, 89 | "outputs": [], 90 | "source": [ 91 | "df['Movement_Day'] = df['Movement_Day'].astype(str).replace('\\.0', '', regex=True)\n", 92 | "df['Movement_Day'] = df['Movement_Day'].str.zfill(2)\n", 93 | "df['Movement_Month'] = df['Movement_Month'].astype(str).replace('\\.0', '', regex=True)\n", 94 | "df['Movement_Month'] = df['Movement_Month'].str.zfill(2)\n", 95 | "df['Movement_Year'] = df['Movement_Year'].apply(str).replace('\\.0', '', regex=True)\n", 96 | "df['Movement_Date'] = df[\"Movement_Day\"] + \"-\" + df[\"Movement_Month\"] + \"-\" + df[\"Movement_Year\"]\n", 97 | "df['Movement_Date'] = df['Movement_Date'].apply(str).replace('\\.0', '', regex=True)\n", 98 | "df['Movement_Date'] = pd.to_datetime(df.Movement_Date,format = '%d-%m-%Y', dayfirst=True)\n", 99 | "df = df.drop(['Movement_Day','Movement_Month','Movement_Year'], axis=1) " 100 | ] 101 | }, 102 | { 103 | "cell_type": "code", 104 | "execution_count": 318, 105 | "metadata": {}, 106 | "outputs": [], 107 | "source": [ 108 | "if 5 in df['Movement_Code']:\n", 109 | " df['Movement_Code'] = df['Movement_Code'].replace([1,4,3,5],\n", 110 | " ['Stock','Transit','Shipped','OOS'])\n", 111 | "else: \n", 112 | " df['Movement_Code'] = df['Movement_Code'].replace([1,4,3],\n", 113 | " ['Stock','Transit','Shipped'])" 114 | ] 115 | }, 116 | { 117 | "cell_type": "code", 118 | "execution_count": 319, 119 | "metadata": {}, 120 | "outputs": [], 121 | "source": [ 122 | "df['Site_Item_Type'] = df['Site_Item_Type'].replace([0,1],\n", 123 | " ['Standard','Promo'])" 124 | ] 125 | }, 126 | { 127 | "cell_type": "code", 128 | "execution_count": 320, 129 | "metadata": {}, 130 | "outputs": [], 131 | "source": [ 132 | "df = df[['Movement_Code','GLN_Code','EAN_Code','Site_Item_Type',\n", 133 | " 'Case_Count','Movement_Date','Quantity','Base_Unit_Code']]" 134 | ] 135 | }, 136 | { 137 | "cell_type": "code", 138 | "execution_count": 321, 139 | "metadata": {}, 140 | "outputs": [], 141 | "source": [ 142 | "dfPivot = pd.pivot_table(df,aggfunc='sum',values='Quantity',\n", 143 | " index=['Movement_Date','EAN_Code','Base_Unit_Code'],\n", 144 | " columns='Movement_Code').reset_index()" 145 | ] 146 | }, 147 | { 148 | "cell_type": "code", 149 | "execution_count": 322, 150 | "metadata": {}, 151 | "outputs": [], 152 | "source": [ 153 | "dfPivot = dfPivot.fillna(0)" 154 | ] 155 | }, 156 | { 157 | "cell_type": "code", 158 | "execution_count": 323, 159 | "metadata": {}, 160 | "outputs": [], 161 | "source": [ 162 | "Movement_Codes_Order = ['Movement_Week','Movement_Date','EAN_Code','Base_Unit_Code',\n", 163 | " 'Stock','Transit','Shipped','OOS','Demand']\n", 164 | "\n", 165 | "dfPivot = dfPivot.reindex(Movement_Codes_Order,axis=1)" 166 | ] 167 | }, 168 | { 169 | "cell_type": "code", 170 | "execution_count": 324, 171 | "metadata": {}, 172 | "outputs": [], 173 | "source": [ 174 | "dfPivot['Movement_Week'] = 'cw'+dfPivot['Movement_Date'].dt.strftime('%V')" 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": 325, 180 | "metadata": {}, 181 | "outputs": [], 182 | "source": [ 183 | "if 'OOS' in df['Movement_Code'].unique():\n", 184 | " dfPivot['OOS'] = dfPivot['OOS'].fillna(0)\n", 185 | " dfPivot['Demand'] = dfPivot['Shipped'] + dfPivot['OOS']\n", 186 | "else:\n", 187 | " dfPivot['OOS'] = dfPivot['OOS'].fillna(0)\n", 188 | " dfPivot['Demand'] = dfPivot['Shipped']" 189 | ] 190 | }, 191 | { 192 | "cell_type": "code", 193 | "execution_count": 326, 194 | "metadata": {}, 195 | "outputs": [], 196 | "source": [ 197 | "dfPivot = dfPivot.rename_axis(\"Line_ID\",axis=1)" 198 | ] 199 | }, 200 | { 201 | "cell_type": "code", 202 | "execution_count": 327, 203 | "metadata": {}, 204 | "outputs": [], 205 | "source": [ 206 | "dfPivot.iloc[:, 4:] = dfPivot.iloc[:, 4:].astype(int)" 207 | ] 208 | }, 209 | { 210 | "cell_type": "code", 211 | "execution_count": 328, 212 | "metadata": {}, 213 | "outputs": [], 214 | "source": [ 215 | "dfPivot = dfPivot.sort_values(by=['Movement_Date'],ascending=False,inplace=False)" 216 | ] 217 | }, 218 | { 219 | "cell_type": "code", 220 | "execution_count": 329, 221 | "metadata": {}, 222 | "outputs": [], 223 | "source": [ 224 | "dfPivot.reset_index(drop=True,inplace=True)\n", 225 | "dfPivot.sort_index(ascending=False,inplace=True)" 226 | ] 227 | }, 228 | { 229 | "cell_type": "markdown", 230 | "metadata": {}, 231 | "source": [ 232 | "--- **Safety Stock Calculation script starts here** ---" 233 | ] 234 | }, 235 | { 236 | "cell_type": "markdown", 237 | "metadata": {}, 238 | "source": [ 239 | "Product chosen for this script is one of supplier's topsellers. It's is rarely included in promo activities." 240 | ] 241 | }, 242 | { 243 | "cell_type": "code", 244 | "execution_count": 330, 245 | "metadata": {}, 246 | "outputs": [], 247 | "source": [ 248 | "dfPivot = dfPivot[dfPivot['Base_Unit_Code']=='1234567890']" 249 | ] 250 | }, 251 | { 252 | "cell_type": "markdown", 253 | "metadata": {}, 254 | "source": [ 255 | "We choose calendar week as a period. " 256 | ] 257 | }, 258 | { 259 | "cell_type": "code", 260 | "execution_count": 331, 261 | "metadata": {}, 262 | "outputs": [], 263 | "source": [ 264 | "dfOneProduct = dfPivot.groupby('Movement_Week',as_index=False)[['Stock','Shipped','OOS','Demand']].sum()" 265 | ] 266 | }, 267 | { 268 | "cell_type": "markdown", 269 | "metadata": {}, 270 | "source": [ 271 | "Aggregated quantities can be observed in the following table." 272 | ] 273 | }, 274 | { 275 | "cell_type": "code", 276 | "execution_count": 332, 277 | "metadata": {}, 278 | "outputs": [ 279 | { 280 | "name": "stdout", 281 | "output_type": "stream", 282 | "text": [ 283 | "Line_ID Movement_Week Demand\n", 284 | "11 cw44 41607\n", 285 | "12 cw45 37393\n", 286 | "13 cw46 62100\n", 287 | "14 cw47 60111\n", 288 | "15 cw48 94296\n", 289 | "16 cw49 75029\n", 290 | "17 cw50 69098\n", 291 | "18 cw51 9144\n", 292 | "19 cw52 27278\n", 293 | "20 cw53 9279\n" 294 | ] 295 | } 296 | ], 297 | "source": [ 298 | "print(dfOneProduct[['Movement_Week','Demand']].tail(10))" 299 | ] 300 | }, 301 | { 302 | "cell_type": "markdown", 303 | "metadata": {}, 304 | "source": [ 305 | "*Z* is a demand threshold. Below we will calculate the probability for an occurence of demand quantity to be below *Z* value within a chosen period." 306 | ] 307 | }, 308 | { 309 | "cell_type": "code", 310 | "execution_count": 333, 311 | "metadata": {}, 312 | "outputs": [], 313 | "source": [ 314 | "z = 50000 # Random value chosen as a threshold. Just a bit above of the mean value." 315 | ] 316 | }, 317 | { 318 | "cell_type": "markdown", 319 | "metadata": {}, 320 | "source": [ 321 | "*MU* is a mean value for product's demand. In our case it's calculated based on data since August 16th." 322 | ] 323 | }, 324 | { 325 | "cell_type": "code", 326 | "execution_count": 334, 327 | "metadata": {}, 328 | "outputs": [], 329 | "source": [ 330 | "mu = np.round(dfOneProduct['Demand'].mean(),decimals=2) # mean value" 331 | ] 332 | }, 333 | { 334 | "cell_type": "markdown", 335 | "metadata": {}, 336 | "source": [ 337 | "*Sigma* is standard deviation value for product's demand." 338 | ] 339 | }, 340 | { 341 | "cell_type": "code", 342 | "execution_count": 335, 343 | "metadata": {}, 344 | "outputs": [], 345 | "source": [ 346 | "sigma = np.round((np.std(dfOneProduct['Demand'],ddof=1)),decimals=2) # standard deviation" 347 | ] 348 | }, 349 | { 350 | "cell_type": "code", 351 | "execution_count": 336, 352 | "metadata": { 353 | "scrolled": true 354 | }, 355 | "outputs": [ 356 | { 357 | "name": "stdout", 358 | "output_type": "stream", 359 | "text": [ 360 | "\n", 361 | " z: 50000 \n", 362 | " mu: 47933.9 \n", 363 | " sigma: 21003.95\n" 364 | ] 365 | } 366 | ], 367 | "source": [ 368 | "print('\\n','z:',z,'\\n','mu:',mu,'\\n','sigma:',sigma)" 369 | ] 370 | }, 371 | { 372 | "cell_type": "markdown", 373 | "metadata": {}, 374 | "source": [ 375 | "Below we compute the CDF of a normal distribution - *Alpha*. It's calculated based on inputs above only.\n", 376 | "\n", 377 | "Later we will create a table with an extended row of CDF levels." 378 | ] 379 | }, 380 | { 381 | "cell_type": "code", 382 | "execution_count": 337, 383 | "metadata": {}, 384 | "outputs": [], 385 | "source": [ 386 | "alpha = np.round(norm.cdf(z,mu,sigma),decimals=2)" 387 | ] 388 | }, 389 | { 390 | "cell_type": "code", 391 | "execution_count": 338, 392 | "metadata": {}, 393 | "outputs": [ 394 | { 395 | "name": "stdout", 396 | "output_type": "stream", 397 | "text": [ 398 | "alpha: 0.54\n" 399 | ] 400 | } 401 | ], 402 | "source": [ 403 | "print('alpha: ',alpha)" 404 | ] 405 | }, 406 | { 407 | "cell_type": "markdown", 408 | "metadata": {}, 409 | "source": [ 410 | "**Calculation of the inverse CDF of a normal distribution.** \n", 411 | "\n", 412 | "It will give us the threshold *z* that will achieve a probability *α* for an occurrence of the distribution *𝒳* to be below this threshold *z*. \n", 413 | "\n", 414 | "Here the use the same *alpha* value as in the example above." 415 | ] 416 | }, 417 | { 418 | "cell_type": "code", 419 | "execution_count": 339, 420 | "metadata": {}, 421 | "outputs": [], 422 | "source": [ 423 | "z1 = norm.ppf(alpha,mu,sigma)" 424 | ] 425 | }, 426 | { 427 | "cell_type": "code", 428 | "execution_count": 340, 429 | "metadata": {}, 430 | "outputs": [ 431 | { 432 | "name": "stdout", 433 | "output_type": "stream", 434 | "text": [ 435 | "Inverse CDF: 50043.0\n" 436 | ] 437 | } 438 | ], 439 | "source": [ 440 | "print('Inverse CDF: ', np.round(z1,decimals=0))" 441 | ] 442 | }, 443 | { 444 | "cell_type": "markdown", 445 | "metadata": {}, 446 | "source": [ 447 | "Now we can calculate the relationship between several service levels and required stock levels. Here we use variable *alpha1*. It represents an array of CDF values." 448 | ] 449 | }, 450 | { 451 | "cell_type": "code", 452 | "execution_count": 341, 453 | "metadata": {}, 454 | "outputs": [], 455 | "source": [ 456 | "alpha1 = np.array([0.5,0.6,0.7,0.8,0.9,0.95,0.965,0.975,0.985,0.99])\n", 457 | "inv = norm.ppf(alpha1,mu,sigma)" 458 | ] 459 | }, 460 | { 461 | "cell_type": "code", 462 | "execution_count": 342, 463 | "metadata": {}, 464 | "outputs": [], 465 | "source": [ 466 | "table1 = {'Inventory level, pcs': inv.astype(int),\n", 467 | " 'Cycle service level, %': alpha1*100}\n", 468 | "\n", 469 | "df1 = pd.DataFrame(table1)\n", 470 | "df1.set_index('Cycle service level, %', inplace=True)\n", 471 | "dfT1 = df1.transpose()" 472 | ] 473 | }, 474 | { 475 | "cell_type": "markdown", 476 | "metadata": {}, 477 | "source": [ 478 | "*Table 1* below shows the relationship between the inventory level at the beginning of a period (1 week) and the expected cycle service level." 479 | ] 480 | }, 481 | { 482 | "cell_type": "code", 483 | "execution_count": 343, 484 | "metadata": { 485 | "scrolled": true 486 | }, 487 | "outputs": [ 488 | { 489 | "name": "stdout", 490 | "output_type": "stream", 491 | "text": [ 492 | "Cycle service level, % 50.0 60.0 70.0 80.0 90.0 95.0 96.5 97.5 98.5 99.0\n", 493 | "Inventory level, pcs 47933 53255 58948 65611 74851 82482 85991 89100 93514 96796\n" 494 | ] 495 | } 496 | ], 497 | "source": [ 498 | "print(dfT1)" 499 | ] 500 | }, 501 | { 502 | "cell_type": "markdown", 503 | "metadata": {}, 504 | "source": [ 505 | "**Calculation of a Service level factor.**\n", 506 | "\n", 507 | "Service level factor is the ratio that multiplies the demand deviation in order to compute the required safety stock and to obtain a desired service level." 508 | ] 509 | }, 510 | { 511 | "cell_type": "code", 512 | "execution_count": 344, 513 | "metadata": {}, 514 | "outputs": [], 515 | "source": [ 516 | "table2 = {'Service level factor': np.round(norm.ppf(alpha1),decimals=2),\n", 517 | " 'Cycle service level, %': alpha1*100}\n", 518 | "\n", 519 | "df2 = pd.DataFrame(table2)\n", 520 | "df2.set_index('Cycle service level, %', inplace=True)\n", 521 | "dfT2 = df2.transpose()" 522 | ] 523 | }, 524 | { 525 | "cell_type": "markdown", 526 | "metadata": {}, 527 | "source": [ 528 | "*Table 2* below shows the relationship between the desired cycle service level and its service level factor. Impact of service level factor becomes bigger as you approach 100% service level. A higher cycle service level implies bigger extra costs." 529 | ] 530 | }, 531 | { 532 | "cell_type": "code", 533 | "execution_count": 345, 534 | "metadata": {}, 535 | "outputs": [ 536 | { 537 | "name": "stdout", 538 | "output_type": "stream", 539 | "text": [ 540 | "Cycle service level, % 50.0 60.0 70.0 80.0 90.0 95.0 96.5 97.5 98.5 99.0\n", 541 | "Service level factor 0.0 0.25 0.52 0.84 1.28 1.64 1.81 1.96 2.17 2.33\n" 542 | ] 543 | } 544 | ], 545 | "source": [ 546 | "print(dfT2)" 547 | ] 548 | }, 549 | { 550 | "cell_type": "markdown", 551 | "metadata": {}, 552 | "source": [ 553 | "**Cycle and Safety stocks' calculation.**\n", 554 | "\n", 555 | "Value for cycle stock is taken from Table 1 and corresponds to 95% cycle service level." 556 | ] 557 | }, 558 | { 559 | "cell_type": "code", 560 | "execution_count": 346, 561 | "metadata": {}, 562 | "outputs": [], 563 | "source": [ 564 | "InventoryLevel = dfT1.loc[['Inventory level, pcs'],95].values[0]" 565 | ] 566 | }, 567 | { 568 | "cell_type": "markdown", 569 | "metadata": {}, 570 | "source": [ 571 | "If we want to calculate a safety stock in order to perform with a 95% service level, then we should multiply Service level factor (*1.64*) by Demand deviation (*sigma*)." 572 | ] 573 | }, 574 | { 575 | "cell_type": "code", 576 | "execution_count": 347, 577 | "metadata": {}, 578 | "outputs": [], 579 | "source": [ 580 | "# SafetyStock = (1.64*sigma).astype(int) # This code also works, but it implies \n", 581 | " # a manual search for necessary service level factor.\n", 582 | "\n", 583 | "SLFactor = dfT2.loc[['Service level factor'],95].values[0] # 95 can be replaced with a desired service level.\n", 584 | "\n", 585 | "SafetyStock = (SLFactor*sigma).astype(int)" 586 | ] 587 | }, 588 | { 589 | "cell_type": "markdown", 590 | "metadata": {}, 591 | "source": [ 592 | "Cycle Stock equals to Inventory level minus Safety Stock. " 593 | ] 594 | }, 595 | { 596 | "cell_type": "code", 597 | "execution_count": 348, 598 | "metadata": {}, 599 | "outputs": [], 600 | "source": [ 601 | "CycleStock = InventoryLevel - SafetyStock" 602 | ] 603 | }, 604 | { 605 | "cell_type": "markdown", 606 | "metadata": {}, 607 | "source": [ 608 | "All three types of stock are displayed below." 609 | ] 610 | }, 611 | { 612 | "cell_type": "code", 613 | "execution_count": 349, 614 | "metadata": { 615 | "scrolled": true 616 | }, 617 | "outputs": [ 618 | { 619 | "name": "stdout", 620 | "output_type": "stream", 621 | "text": [ 622 | " \n", 623 | "Safety stock, pcs 34446\n", 624 | "Cycle stock, pcs 48036\n", 625 | "Inventory level, pcs 82482\n" 626 | ] 627 | } 628 | ], 629 | "source": [ 630 | "table3 = {'Safety stock, pcs': SafetyStock,\n", 631 | " 'Cycle stock, pcs': CycleStock,\n", 632 | " 'Inventory level, pcs': InventoryLevel}\n", 633 | "\n", 634 | "df3 = pd.DataFrame(table3,index=[''])\n", 635 | "dfT3 = df3.transpose()\n", 636 | "print(dfT3)" 637 | ] 638 | }, 639 | { 640 | "cell_type": "markdown", 641 | "metadata": {}, 642 | "source": [ 643 | "**Summary:**\n", 644 | "\n", 645 | "Inventory level calculated above is likely to be sufficient for performing on a 95% service level.\n", 646 | "\n", 647 | "According to inputs, we calculate replenishment based on weekly demand. In this particular case, we don't take Lead time into account.\n", 648 | "\n", 649 | "A more complex approach to stock calculation will be presented in the next document." 650 | ] 651 | } 652 | ], 653 | "metadata": { 654 | "kernelspec": { 655 | "display_name": "Python 3", 656 | "language": "python", 657 | "name": "python3" 658 | }, 659 | "language_info": { 660 | "codemirror_mode": { 661 | "name": "ipython", 662 | "version": 3 663 | }, 664 | "file_extension": ".py", 665 | "mimetype": "text/x-python", 666 | "name": "python", 667 | "nbconvert_exporter": "python", 668 | "pygments_lexer": "ipython3", 669 | "version": "3.8.3" 670 | } 671 | }, 672 | "nbformat": 4, 673 | "nbformat_minor": 4 674 | } 675 | -------------------------------------------------------------------------------- /Stock Simulation.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import numpy as np\n", 10 | "import pandas as pd\n", 11 | "import glob, os\n", 12 | "from scipy.stats import norm\n", 13 | "import matplotlib.pyplot as plt" 14 | ] 15 | }, 16 | { 17 | "cell_type": "markdown", 18 | "metadata": {}, 19 | "source": [ 20 | "--- **Data Aggregation and Cleaning were here** ---\n", 21 | "\n", 22 | "Initially this script included lines meant for data aggregation and cleaning. As the process is going to be the same for all upcoming scripts, these lines are deleted. However, they can be found in the first script related to Safety and Cycle Stock calculation." 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": {}, 28 | "source": [ 29 | "--- **Stock Simulation script starts here** ---" 30 | ] 31 | }, 32 | { 33 | "cell_type": "markdown", 34 | "metadata": {}, 35 | "source": [ 36 | "Product chosen for this script is one of supplier's topsellers. It's is rarely included in promo activities." 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 20, 42 | "metadata": {}, 43 | "outputs": [], 44 | "source": [ 45 | "dfPivot = dfPivot[dfPivot['Base_Unit_Code']=='1234567890']" 46 | ] 47 | }, 48 | { 49 | "cell_type": "markdown", 50 | "metadata": {}, 51 | "source": [ 52 | "Data sample for the chosen product is displayed below." 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 38, 58 | "metadata": {}, 59 | "outputs": [ 60 | { 61 | "name": "stdout", 62 | "output_type": "stream", 63 | "text": [ 64 | "Line_ID Movement_Week Movement_Date EAN_Code Base_Unit_Code Stock Transit Shipped OOS Demand\n", 65 | "701 cw53 2020-12-29 4600000000001 1234567890 73062 0 5166 0 5166\n", 66 | "5280 cw35 2020-08-28 4600000000001 1234567890 36823 0 6831 18 6849\n", 67 | "1309 cw50 2020-12-13 4600000000001 1234567890 61936 44064 9906 0 9906\n", 68 | "5949 cw33 2020-08-11 4600000000001 1234567890 49753 13392 5166 0 5166\n", 69 | "4356 cw39 2020-09-21 4600000000001 1234567890 18125 26784 9549 0 9549\n" 70 | ] 71 | } 72 | ], 73 | "source": [ 74 | "print(dfPivot.sample(5))" 75 | ] 76 | }, 77 | { 78 | "cell_type": "markdown", 79 | "metadata": {}, 80 | "source": [ 81 | "We choose calendar day as a period. " 82 | ] 83 | }, 84 | { 85 | "cell_type": "code", 86 | "execution_count": 22, 87 | "metadata": {}, 88 | "outputs": [], 89 | "source": [ 90 | "dfOneProduct = dfPivot.groupby('Movement_Date',as_index=False)[['Stock','Shipped','OOS','Demand']].sum()" 91 | ] 92 | }, 93 | { 94 | "cell_type": "markdown", 95 | "metadata": {}, 96 | "source": [ 97 | "Aggregated quantities can be observed in the following table." 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": 23, 103 | "metadata": { 104 | "scrolled": true 105 | }, 106 | "outputs": [ 107 | { 108 | "name": "stdout", 109 | "output_type": "stream", 110 | "text": [ 111 | "Line_ID Movement_Date Demand\n", 112 | "147 2021-01-09 3105\n", 113 | "148 2021-01-10 6237\n", 114 | "149 2021-01-11 6228\n", 115 | "150 2021-01-12 3636\n", 116 | "151 2021-01-13 4203\n", 117 | "152 2021-01-14 11430\n", 118 | "153 2021-01-15 5931\n", 119 | "154 2021-01-16 1944\n", 120 | "155 2021-01-17 10404\n", 121 | "156 2021-01-18 18999\n" 122 | ] 123 | } 124 | ], 125 | "source": [ 126 | "print(dfOneProduct[['Movement_Date','Demand']].tail(10))" 127 | ] 128 | }, 129 | { 130 | "cell_type": "markdown", 131 | "metadata": {}, 132 | "source": [ 133 | "*Z* is a demand threshold. Below we will calculate the probability for an occurence of demand quantity to be below *Z* value within a chosen period. I have set 15.000 as a demand threshold as it almost equals to the inverse CDF of a normal distribution." 134 | ] 135 | }, 136 | { 137 | "cell_type": "code", 138 | "execution_count": 24, 139 | "metadata": {}, 140 | "outputs": [], 141 | "source": [ 142 | "z = 15000" 143 | ] 144 | }, 145 | { 146 | "cell_type": "markdown", 147 | "metadata": {}, 148 | "source": [ 149 | "*MU* is a mean value for product's demand. In our case it's calculated based on data since August 16th." 150 | ] 151 | }, 152 | { 153 | "cell_type": "code", 154 | "execution_count": 25, 155 | "metadata": {}, 156 | "outputs": [], 157 | "source": [ 158 | "mu = np.round(dfOneProduct['Demand'].mean(),decimals=2) # mean value" 159 | ] 160 | }, 161 | { 162 | "cell_type": "markdown", 163 | "metadata": {}, 164 | "source": [ 165 | "*Sigma* is standard deviation value for product's demand." 166 | ] 167 | }, 168 | { 169 | "cell_type": "code", 170 | "execution_count": 26, 171 | "metadata": {}, 172 | "outputs": [], 173 | "source": [ 174 | "sigma = np.round((np.std(dfOneProduct['Demand'],ddof=1)),decimals=2) # standard deviation or std" 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": 27, 180 | "metadata": { 181 | "scrolled": false 182 | }, 183 | "outputs": [ 184 | { 185 | "name": "stdout", 186 | "output_type": "stream", 187 | "text": [ 188 | "\n", 189 | " z: 15000 \n", 190 | " mu: 7244.08 \n", 191 | " sigma: 4147.2\n" 192 | ] 193 | } 194 | ], 195 | "source": [ 196 | "print('\\n','z:',z,'\\n','mu:',mu,'\\n','sigma:',sigma)" 197 | ] 198 | }, 199 | { 200 | "cell_type": "markdown", 201 | "metadata": {}, 202 | "source": [ 203 | "Below we compute the CDF of a normal distribution - Alpha. It's calculated based on inputs above only." 204 | ] 205 | }, 206 | { 207 | "cell_type": "code", 208 | "execution_count": 28, 209 | "metadata": {}, 210 | "outputs": [], 211 | "source": [ 212 | "alpha = np.round(norm.cdf(z,mu,sigma),decimals=2)" 213 | ] 214 | }, 215 | { 216 | "cell_type": "code", 217 | "execution_count": 29, 218 | "metadata": {}, 219 | "outputs": [ 220 | { 221 | "name": "stdout", 222 | "output_type": "stream", 223 | "text": [ 224 | "alpha: 0.97\n" 225 | ] 226 | } 227 | ], 228 | "source": [ 229 | "print('alpha: ',alpha)" 230 | ] 231 | }, 232 | { 233 | "cell_type": "markdown", 234 | "metadata": {}, 235 | "source": [ 236 | "Below we declare additional variables that will be used in further calculations.\n", 237 | "\n", 238 | "What will be calculated:\n", 239 | "- Safety Stock\n", 240 | "- Cycle Stock\n", 241 | "- Stock in Transit\n", 242 | "- Total Stock\n", 243 | "- Cycle Service Level\n", 244 | "- Period Service Level" 245 | ] 246 | }, 247 | { 248 | "cell_type": "code", 249 | "execution_count": 36, 250 | "metadata": { 251 | "scrolled": true 252 | }, 253 | "outputs": [ 254 | { 255 | "name": "stdout", 256 | "output_type": "stream", 257 | "text": [ 258 | "Alpha: 97.0\n", 259 | "Cycle Service Level: 98.22\n", 260 | "Period Service Level: 98.3 \n", 261 | "\n", 262 | " Demand On-hand In-transit\n", 263 | "4 11093 15344 [4126, 6678, 7335, 11093]\n", 264 | "5 11927 7543 [6678, 7335, 11093, 11927]\n", 265 | "6 11190 3031 [7335, 11093, 11927, 11190]\n", 266 | "7 8421 1945 [11093, 11927, 11190, 8421]\n", 267 | "8 6188 6850 [11927, 11190, 8421, 6188]\n", 268 | ".. ... ... ...\n", 269 | "995 13896 8180 [11360, 4026, 7114, 13896]\n", 270 | "996 10876 8664 [4026, 7114, 13896, 10876]\n", 271 | "997 2077 10613 [7114, 13896, 10876, 2077]\n", 272 | "998 4324 13403 [13896, 10876, 2077, 4324]\n", 273 | "999 5530 21769 [10876, 2077, 4324, 5530]\n", 274 | "\n", 275 | "[996 rows x 3 columns]\n" 276 | ] 277 | } 278 | ], 279 | "source": [ 280 | "time = 1000\n", 281 | "\n", 282 | "d = np.maximum(np.random.normal(mu,sigma,time).round(0).astype(int),0)\n", 283 | "\n", 284 | "L = 3 # Lead Time\n", 285 | "R = 1 # Review Period \n", 286 | "\n", 287 | "z1 = norm.ppf(alpha)\n", 288 | "x_std = np.sqrt(L+R)*sigma\n", 289 | "Ss = np.round(x_std*z1).astype(int) # Safety Stock\n", 290 | "Cs = 1/2 * mu * R # Cycle Stock\n", 291 | "Is = mu * L # In Transit Stock\n", 292 | "S = Ss + 2*Cs + Is # Total Stock\n", 293 | "\n", 294 | "hand = np.zeros(time,dtype=int)\n", 295 | "transit = np.zeros((time,L+1),dtype=int)\n", 296 | "\n", 297 | "hand[0] = S - d[0]\n", 298 | "transit[0,-1] = d[0]\n", 299 | "\n", 300 | "stockout_period = np.full(time,False,dtype=bool) # Flags if there is a shortage during a period.\n", 301 | "stockout_cycle = [] # Flags if we had a shortage at any time during the last cycle.\n", 302 | "\n", 303 | "for t in range(1,time):\n", 304 | " if transit[t-1,0]>0:\n", 305 | " stockout_cycle.append(stockout_period[t-1])\n", 306 | " hand[t] = hand[t-1] - d[t] + transit[t-1,0]\n", 307 | " stockout_period[t] = hand[t] < 0\n", 308 | " hand[t] = max(0,hand[t]) # In my case excess demand results in lost sales rather than backorders\n", 309 | " transit[t,:-1] = transit[t-1,1:] \n", 310 | " if 0==t%R:\n", 311 | " net = hand[t] + transit[t].sum() \n", 312 | " transit[t,L] = S - net\n", 313 | " \n", 314 | "print(\"Alpha:\",alpha*100)\n", 315 | "SL_alpha = 1-sum(stockout_cycle)/len(stockout_cycle)\n", 316 | "print(\"Cycle Service Level:\",round(SL_alpha*100,2))\n", 317 | "\n", 318 | "SL_period = 1-sum(stockout_period)/time\n", 319 | "print(\"Period Service Level:\",round(SL_period*100,2),'\\n')\n", 320 | "\n", 321 | "df_sim = pd.DataFrame(data= {\"Demand\":d,\"On-hand\":hand,\"In-transit\":list(transit)})\n", 322 | "df_sim = df_sim.iloc[R+L:,:] #Remove initialization periods\n", 323 | "print(df_sim)" 324 | ] 325 | }, 326 | { 327 | "cell_type": "code", 328 | "execution_count": 35, 329 | "metadata": { 330 | "scrolled": true 331 | }, 332 | "outputs": [ 333 | { 334 | "data": { 335 | "text/plain": [ 336 | "" 337 | ] 338 | }, 339 | "execution_count": 35, 340 | "metadata": {}, 341 | "output_type": "execute_result" 342 | }, 343 | { 344 | "data": { 345 | "image/png": "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\n", 346 | "text/plain": [ 347 | "
" 348 | ] 349 | }, 350 | "metadata": { 351 | "needs_background": "light" 352 | }, 353 | "output_type": "display_data" 354 | } 355 | ], 356 | "source": [ 357 | "df_sim[\"On-hand\"].plot(title=\"Inventory Policy (%d,%d)\" %(R,S),ylim=(0,S),legend=True,color='C0')\n", 358 | "\n", 359 | "x1, y1 = [0, t], [Ss, Ss] \n", 360 | "\n", 361 | "x2, y2 = [0, t], [Ss + 2*Cs, Ss + 2*Cs]\n", 362 | "\n", 363 | "plt.plot(x1, y1, color='C1')\n", 364 | "plt.plot(x2, y2, color='C1')\n", 365 | "\n", 366 | "plt.fill_between(x1, y1, y2, color='C1', alpha=0.5)" 367 | ] 368 | }, 369 | { 370 | "cell_type": "markdown", 371 | "metadata": {}, 372 | "source": [ 373 | "Line chart represents the stock simulation for the chosen product. Besides product's parameters that may vary depending on the chosen product (*mean value, standard deviation, etc.*), static variables are the following:\n", 374 | "- **Review Period:** 1 day\n", 375 | "- **Lead Time:** 3 days\n", 376 | "- **Simulation period:** 1000 days\n", 377 | "\n", 378 | "The highlighted orange area shows the cycle stock range during the simulation period.\n", 379 | "\n", 380 | "In my opinion, potential ~98% service level is a good result!" 381 | ] 382 | } 383 | ], 384 | "metadata": { 385 | "kernelspec": { 386 | "display_name": "Python 3", 387 | "language": "python", 388 | "name": "python3" 389 | }, 390 | "language_info": { 391 | "codemirror_mode": { 392 | "name": "ipython", 393 | "version": 3 394 | }, 395 | "file_extension": ".py", 396 | "mimetype": "text/x-python", 397 | "name": "python", 398 | "nbconvert_exporter": "python", 399 | "pygments_lexer": "ipython3", 400 | "version": "3.8.3" 401 | } 402 | }, 403 | "nbformat": 4, 404 | "nbformat_minor": 4 405 | } 406 | --------------------------------------------------------------------------------