Intermediate15 columnsUp to 10,000 rows Fictional data

Stock Register (Inventory) dataset

Monthly stock register for five warehouses: opening, received, issued, closing, reorder level and value.

Made the moment you click and sent straight to you. Nothing is saved on our server.

About this dataset

A month-by-month stock register like the ones kept in Tally or a shared Excel sheet: for each warehouse and item, the stock at the start of the month, what came in, what went out, what was left, the reorder level, and the value of the closing stock.

The numbers hang together the way a real register should, so you can audit the file yourself. Closing stock always equals opening plus received minus issued, and each month's opening equals the previous month's closing for the same item and warehouse. Small downloads cover one month across many items; bigger ones go back up to 24 months.

Good for practising: Excel formulas, Data validation, SQL joins, Inventory analysis.

What's built into the data

The rows are random, but they follow rules, so there is something real to find. These are the patterns to look for:

  • closing_stock = opening_stock + received_qty − issued_qty, on every row.
  • Each month's opening stock is the previous month's closing stock for the same SKU and warehouse.
  • Stock is usually reordered when it runs close to the reorder level, so you will see a saw-tooth pattern over time.
  • Unit costs creep up slowly, by up to about 1% a month, so stock value can rise even when quantities do not.
  • '(Bulk)' items are the same goods in larger packs at a higher unit cost.

Columns

ColumnTypeDescription
monthDateFirst day of the month this row covers.
warehouseCategoryOne of five warehouses.
skuID (text)Stock-keeping unit code (repeats across months and warehouses).
item_nameCategoryItem description.
categoryCategoryStationery, Electrical, Grocery, Hardware, Cleaning or Packaging.
unitCategoryUnit of measure (pcs or kg).
opening_stockWhole numberQuantity at the start of the month.
received_qtyWhole numberQuantity received during the month.
issued_qtyWhole numberQuantity issued or sold during the month.
closing_stockWhole numberQuantity at the end of the month.
reorder_levelWhole numberOrder more when stock falls below this.
needs_reorderTRUE / FALSETrue if closing stock is below the reorder level.
unit_costAmount (₹)Cost per unit in rupees this month.
stock_valueAmount (₹)closing_stock × unit_cost.
supplierCategoryFictional supplier name.

Preview: the first 8 rows

A sample with seed 2026. Your download will have different values but the same columns and patterns.

monthwarehouseskuitem_namecategoryunitopening_stockreceived_qtyissued_qtyclosing_stockreorder_levelneeds_reorderunit_coststock_valuesupplier
2026-03-01WH-ChennaiSKU-1021LED Bulb 9WElectricalpcs3300204126205TRUE95.6112047.26Northstar Enterprises
2026-03-01WH-ChennaiSKU-1063Screwdriver SetHardwarepcs4260245181283TRUE342.662009.73Apex Trading Co.
2026-03-01WH-ChennaiSKU-1073Drill Bit SetHardwarepcs4240209215261TRUE495.41106513.92Sunrise Distributors
2026-03-01WH-DelhiSKU-1052Tea Leaves (Bulk)Grocerykg18807411475FALSE2047.12233371.68Metro Wholesale
2026-03-01WH-DelhiSKU-1081Floor Cleaner 1LCleaningpcs498545187856251FALSE120.67103295.09Greenleaf Supplies
2026-03-01WH-DelhiSKU-1107Packing TapePackagingpcs5500133417239FALSE49.3220564.76Apex Trading Co.
2026-03-01WH-MumbaiSKU-1087BroomCleaningpcs380221620TRUE117.821885.13Sunrise Distributors
2026-03-01WH-PuneSKU-1047Wheat AttaGrocerykg1110357638FALSE40.13047.29Northstar Enterprises

Practice exercises

  1. Check the register: add a column that recomputes closing stock and flag any row where it does not match.
  2. List every item that is below its reorder level in the latest month, with the warehouse and supplier.
  3. Find the total stock value per warehouse per month and chart it.
  4. Work out stock turnover (issued ÷ average stock) per category. Which category moves fastest?
  5. In SQL, use a window function (LAG) to confirm each month's opening equals the last month's closing.

Stuck on one? Each exercise uses ideas from the lessons below, and trying it with the messy option on turns it into a cleaning exercise as well.

Load it straight into Python

You don't have to download first. Pandas can read the link directly, in Jupyter, Google Colab or a script. Keep the seed so you get the same data every time you run the notebook:

import pandas as pd

url = "https://beeprotonai.info/resources/datasets/inventory/download/?rows=1000&seed=42"
df = pd.read_csv(url, parse_dates=["month"])
df.head()

For SQL practice, download the SQL format and run it against an empty database, for example sqlite3 practice.db < inventory-1000-rows-seed42.sql or mysql -u root -p practice < inventory-1000-rows-seed42.sql (use your file's name). It creates a table called inventory and fills it.

About the data

Everything in this file is invented. Names are random pairings of common first names and surnames, email addresses use example.com (reserved for examples, so it can never reach anyone), and phone numbers start with +91 00, which no real Indian mobile number does. Any resemblance to a real person or business is coincidence. Dates run from 1 April 2024 to 31 March 2026 unless a column says otherwise. Use it freely for learning, teaching and projects, including commercial ones, with no attribution required (CC0).

Lessons that go with it

More datasets

See all 14 datasets →