Skip to main content

replenishment

CI PyPI Python

replenishment is a Python library for stock replenishment simulation, policy optimization, and decision visualization.

It is designed for teams that want to:

  • simulate replenishment policies against historical or synthetic demand
  • optimize mean-forecast safety stock, k*RMSE, and percentile-target policies
  • compare policies visually on replenishment time series
  • move cleanly between CSV/DataFrame inputs and simulation configs

Supported Python Versions

The project is tested on Python 3.10, 3.11, 3.12, and 3.13.

Yes, Python 3.13 is out and stable. Python 3.13.0 was officially released on October 7, 2024.

Installation

Install from PyPI

pip install replenishment

Create a Development Environment with uv

Choose any supported Python version. 3.13 is the default below.

uv python install 3.13
uv venv --python 3.13
source .venv/bin/activate
uv sync --extra dev

To work on another supported version, replace 3.13 with 3.10, 3.11, or 3.12.

Run the test suite with:

uv run pytest

Quickstart

This example optimizes a mean-forecast safety stock factor on a backtest window and applies the learned policy on the forecast horizon.

from replenishment import (
    generate_standard_simulation_rows,
    optimize_point_forecast_policy_and_simulate_actuals,
    plot_replenishment_decisions,
    replenishment_decision_rows_to_dataframe,
    split_standard_simulation_rows,
    standard_simulation_rows_to_dataframe,
)

rows = generate_standard_simulation_rows(
    n_unique_ids=1,
    periods=18,
    start_date="2031-01-01",
    frequency_days=30,
    forecast_start_period=10,
    history_mean=52,
    history_std=6,
    forecast_mean=48,
    forecast_std=5,
    lead_time=2,
    initial_on_hand=30,
    current_stock=30,
    seed=7,
)
backtest_rows, eval_rows = split_standard_simulation_rows(rows)

optimized, _, decision_rows = optimize_point_forecast_policy_and_simulate_actuals(
    backtest_rows,
    eval_rows,
    candidate_factors=[0.8, 0.9, 1.0],
)

rows_df = standard_simulation_rows_to_dataframe(rows, library="pandas")
decision_df = replenishment_decision_rows_to_dataframe(decision_rows, library="pandas")

example_id = decision_df["unique_id"].iloc[0]
plot_replenishment_decisions(
    rows_df,
    decision_df,
    unique_id=example_id,
    title="Mean forecast + safety stock (optimized)",
    decision_style="line",
)

Example Workflows

Mean Forecast + Safety Stock

Optimize a point-forecast safety stock factor on historical rows, then inspect the resulting replenishment decisions on the forecast horizon.

Mean forecast + safety stock example

k*RMSE + Forecast-Level Buffering

Use k*RMSE for the base safety stock and optionally increase it when lead-time forecast quantities rise above a baseline. The README plot below uses three articles with progressively steeper ramps so the extra safety stock is visible directly on the replenishment timeline.

k*RMSE forecast buffering example

Percentile Target Optimization

Optimize the percentile target per article on backtest rows, then simulate and visualize the chosen forecast target on the evaluation horizon.

Percentile target optimization example

Notebooks

Runnable walkthroughs live in notebooks/:

Development and Contribution

Contributions are welcome. If you open a PR, keep it easy to review:

  • add or update tests for behavior changes
  • update notebooks, README examples, and plot assets when public behavior changes
  • include before/after plots when you change plotting behavior
  • keep PRs focused rather than bundling unrelated refactors

See CONTRIBUTING.md for setup, test, and pull request guidance.

Good Areas for Collaboration

If you want to make the project more useful and more credible to other teams, these are high-leverage contribution areas:

  • richer policy variants, such as minimum order quantities, case-pack constraints, and promotion-aware demand handling
  • benchmark datasets and scenario packs for retail seasonality, long lead times, and stockout-heavy stress tests
  • more notebook walkthroughs that compare service-level objectives and business tradeoffs
  • packaging and docs polish, including API docs, changelogs, and release notes
  • plotting improvements for aggregate dashboards and multi-SKU diagnostics

Project Links

Metadata

Release files for replenishment 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for replenishment 0.1.2
File Size Uploaded Provenance
replenishment-0.1.2.tar.gz 7.7 MB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for replenishment 0.1.2
File Interpreter ABI Platform
replenishment-0.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 7.8 MB

Release files / replenishment-0.1.2.tar.gz

Download URL replenishment-0.1.2.tar.gz
Size 7.7 MB
Tags Source
SHA-256 checksum
How to use checksums
39619855172c229751ef589e9997d3914261f6eca1a519042f0697b20487d7ea
BLAKE2b-256 checksum
How to use checksums
0cd64f97c9c205241350aee4dee0a09cb90a163e3c4d6cd9264f562be9d3ca1b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 17, 2026.

Transparency log

Release files / replenishment-0.1.2-py3-none-any.whl

Download URL replenishment-0.1.2-py3-none-any.whl
Size 41.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4f5b069dd3de5e836b11c1e30102587d965b4db1f666e5bd66db7f62d03324e7
BLAKE2b-256 checksum
How to use checksums
8e06ab654a891bf2f8d4a3b6cf6eb7c75e6e1e9475f76aab991e8ce9d42214fe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 17, 2026.

Transparency log

Security for replenishment 0.1.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for replenishment-0.1.2.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 17, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page