Retail inventory management is the backbone of any retail business, essentially enabling you to keep your business in order. It’s the system and processes you implement to keep a record of your stores' inventory. Whilst we can probably all agree that some type of inventory management process is crucial. Having the right automated inventory management system in place can make all the difference. Out of stock items equals frustrated customers and loss of sales which over time could damage a retailer’s reputation and lose future customers and sales.
Problem Statement
Using historical sales data, the latest order made by the retailer, and supplier's delivery info create the list of orders that should be submitted next.
Dataset
Few datasets needed as input, with the following attributes and sample previews:
Â
Sales Data
Variable
Datatype
Description
Â
Items
Variable
Datatype
Description
Â
Orders
Variable
Datatype
Description
Â
Order Items
Â
Supplier Restrictions
Variable
Datatype
Description
Datrics Pipeline
We have build 3 separated pipelines to solve this problem.
Build Demand Forecasting Model
The first one called "1.Train" are all about get historical data, filter data related only to the shop we are interested in (e.g. shop_id = 31), mark categorical variables using Typization Brick, and feed all that data into LGBM Regression with the following configuration:
As a result, we get model that would be used to predict future sales for each product.
Predict Demand
The next pipeline called "2.Predict", uses the model trained in the previous pipeline, and preprocessed data to forecast the product's sales.
Here we filter products only related to one shop (e.g shop_id = 31), generate time frame for prediction using Date Range Brick,
and using Join Brick with the "cross join" options we get all possible combinations of product and day from the prediction period.
Other required data for the pre-trained model usage (e.g item price) are taken from the input historical data. As the last step in this section, we get a prediction for each product for the next month starting from '2015-01-14'. The result is saved as an asset (to be easily reused in the final pipeline).
Calculate Reorder Point
The next and last one pipeline called "3.GetOrders" relates to calculations we need to perform to get inventory management figures.
A reorder point (ROP) is the minimum unit quantity that a business should have in available inventory before they need to reorder more products. Reorder points ensure that you don’t fall behind on your next batch of inventory. With an accurate reorder point for each SKU, you’ll always have enough stock on hand to satisfy customer demand — without tying up excess capital in inventory.
Reorder point formula
Reorder Point (ROP) = Max lead time x Max daily sales
Lead time is the total amount of time for a purchase order to be delivered from a supplier. So, if the supplier only accepts reorders once a week and you place an order 4 days before the day the order will be accepted by the supplier, your inventory will need to last an additional four days. This additional 4 day is known as the reordering delay. The lead time is the sum of the supply delay, which is how long the shipment takes to reach your inventory, plus the reordering delay.
Lead time = supply delay + reordering delay
Back to platform capabilities, Max Lead Time is given as an input for each product in the Items dataset, while maximum daily sales are calculated using Data Aggregate Bricks from the historical sales dataset. Using this data as an input and Apply Formula Brick, we can easily calculate ROP for each product.
Finally, we load the last orders made by the retailer, and using Join Data Brick combines that data with predicted products daily demand.
After that, we fill missing values and sum predicted product daily items to be sold using Rolling Function Custom Brick for each product to get rolling demand.
After joining data from the previous steps using Join Data Brick, we can add to the starting stock - items arrived on that day and subtract already calculated rolling demand, to get inventory level for each day in the predicted days period.
To get a day for each item when the new order should be purchased we compare the daily level of inventory with Reorder Point using Compare Data Brick. For the day when ROP is smaller or equals inventory level, the amount of product that should be purchased from the supplier on that day is given within the supplier restrictions input dataset (e.g. minimum batch size for an item that can be ordered).
As a result, we get the list of orders with dates specified when these orders should be submitted to the supplier:
Â