I build the models behind what ships, where, and when.
Inventory and replenishment analyst in Los Angeles. I plan inventory for a home decor vendor stocked on consignment across a national retailer's 20,000+ stores. We own the stock until it sells, so every extra week in a DC is our cash, and every empty shelf is a lost sale.
The DCs held about 90 days of supply. Vendor shipments go out monthly and take about a month to arrive, so a mistake takes two months to correct. The drawdown had to be steered, not switched off.
Finding
Chasing each month's shortfall double-counts stock already on its way, so I planned backward from each month-end target. To pull DC days of supply down without starving stores, I pushed extra case packs out to stores, emptiest shelves first.
Result
90 → 45 days of supply between August and October 2026, while still shipping [X units] into the DCs. Store in-stock held at [X%]. I accepted short weeks at the slowest DC rather than hold the whole network high.
Try this: Find the push that lands this DC at 45 days of supply.
Position = units on the shelf; Position 3 means 3+. I assume a shelf max of 6 units and use 3 as the starting position for the 3+ groups. Filled dots receive a case; amber dots exceed that assumed max.
Show the allocation steps
How I built it
A binary search finds the shelf fill level that spends the target exactly, kept inside minimum and maximum units-per-slot bands. The macro then simulates store and distribution center inventory forward for 1 to 12 months, rounding every shipment to whole case packs.
When supply for a slot is capped, it rations across distribution centers by one of four rules: rank-and-fill or weighted split, scored on unit shortfall or percent of target. A compare mode runs all four side by side. Output includes shipment pivots, a tab tracing how a month-one shortage carries forward, and progress charts by slot status.
The push allocator ranks stores by units on the shelf, emptiest first; among stores with 3+ units, the fastest tier goes first. Demo data is synthetic.
02 · Store shelves
The order never sees four days of sales.
Problem
Store slots kept landing below their target level.
Finding
The inventory snapshot is cut Wednesday, the order goes in Thursday, the DC ships Sunday, and it lands the following Saturday. Thursday-to-Sunday sales never make it into the order, so every cycle starts short, and fast sellers fall shortest.
Result
I moved fast-selling slots with small case packs to double case packs so they ride out the gap.
Try this: Pick Fast seller, then switch to a double case pack.
Wed snapshot → Thu order → Sun ship sales the order can't see → Sat lands
One store shelf, 26 weeks
The shelf orders a case when stock falls to the reorder point. The case lands about 10 days later. Change the rules and watch the shelf.
Days in stock
87%
Average on shelf
2.7 units
Sales lost to empty shelf
3 units
Cases shipped
4
At or below the reorder point. Days the shelf sat empty. Demand is simulated for illustration; the weekly order cut and 10-day delivery lag mirror the replenishment cycle I work with.
Days in stock = the percentage of the 182 simulated days that end with at least one unit on the shelf, after receipts and sales.
How I built it
HTML and JavaScript, simulated demand. The weekly order cut and 10-day delivery lag mirror the replenishment cycle I work with.
03 · Demand signal
One bad month can throw off a whole year's plan.
Problem
Demand history across 12,000+ SKUs had one-off spikes and stockout months mixed in. Plan off the raw average and you ship to a pace that isn't real.
Finding
Single outlier tests disagree, and each one throws out real demand on some patterns. I run four (Tukey IQR, z-score, MAD, spike) and exclude a month only when two agree.
Result
A cleaner demand signal for 12,000+ SKUs across 42,000+ records, and 7,000+ SKUs sorted into velocity tiers. It ships with a 130,000-formula Excel audit workbook, so anyone can check the math without reading Python.
Try this: Drag any month up. Then load Recurring peaks and flip to Any single test.
Focus a bar and use arrow keys to change one unit; hold Shift for ten. × marks excluded months. Threshold labels show the current upper bounds.
How I built it
Tukey IQR: x < Q1 − 1.5 × IQR or x > Q3 + 1.5 × IQR. Z-score: |x − mean| / population standard deviation > 2.0. MAD: |x − median| > 2.5 × MAD. Spike: x > 3.0 × median. I exclude a month when at least two tests flag it.
This demo simply drops flagged months. In production, weeks lost to stockouts are rebuilt from peer DC multipliers, so an empty shelf doesn't read as low demand. Velocity tiers come from k-means clustering, with the elbow method choosing the count. Python (pandas, NumPy, SciPy, scikit-learn) in Colab.
Builds
Picklist automationA Colab workflow that checks unshipped web orders against stock in two warehouses and outputs the picklists. 30–45 minutes down to 10–15.
Store performance mapOne self-contained HTML file that filters 21,000+ stores and shows where top performers cluster.
Report deliverySaved 1010data query recipes, run by a Python script through the API; daily and weekly reports arrive by email. [hours saved per week]
Case-pack allocation scripts830,000+ units allocated across DCs in case packs, validated with zero unmet demand.
Smaller builds
Shipment planning that cut the number of LTL shipments.
Batch SKU overlays on product PDFs from a CSV mapping.
EDI 855 converter for purchase order acknowledgments.
Rewrote nested SUMIF and VLOOKUP logic in a 50,000-row workbook as array lookups, about 2.5 billion fewer comparisons per run.
Tools
What I use, and what I use it for.
Python
pandas, NumPy, SciPy and scikit-learn for forecasting, outlier detection, allocation and clustering, packaged in Colab for teammates who don't code.
Excel and VBA
Planning models, live-formula audit workbooks and multi-tab report suites.
1010data
Store and slot level joins across inventory, sales, receipts and the 4-5-4 fiscal calendar, plus scripted report delivery through the API.
HTML and JavaScript
Standalone dashboards and tools that open in any browser, including the shelf simulator on this page.
n8n
Two demo builds: a Telegram bot that reads receipts into Google Sheets, and a replenishment workflow.
About
Los Angeles
Inventory and replenishment since 2023
B.S. Business Administration, Information Systems, Cal State Long Beach
English and Spanish
I started on a warehouse floor, picking and sorting, so I know what a bad allocation looks like from the receiving end.
I ask why a process works the way it does before I build a better version of it. Most of the work on this page started that way: a number that didn't add up, followed until it did.