Monte Carlo project estimation · Python · alpha

Stop guessing dates.
Plan with distributions.

Planaco models every task as a probability distribution and runs thousands of Monte Carlo simulations, so you ship honest confidence ranges instead of a single optimistic number.

$ pip install planaco
View on GitHub

A single number hides the risk

“This takes 5 days” throws away everything you know about uncertainty. A distribution keeps that knowledge and tells you how often you'll actually be late.

~ 21 days
One bar. No sense of best case, worst case, or how confident you should be.
21 days is a coin flip, 26 is near-certain
The full shape of outcomes, with percentile markers you can actually commit to.

Try it. No install needed.

Four tasks, real dependencies. Every drag runs a fresh 10,000-trial Monte Carlo, exactly what planaco does.

How long until project completion?

10,000 simulations · days to completion
A coin flipdaysP50
Safe to promisedaysP85
Near-certaindaysP95
 the same model, in planaco
project = Project(name="Web App", unit="days")
project.add_task(design)                              # 5 · 7 · 14
project.add_task(frontend, depends_on=[design])       # 8 · 12 · 15
project.add_task(backend,  depends_on=[design])       # 10 · 15 · 25
project.add_task(testing,  depends_on=[frontend, backend])
project.statistics(n=10_000)   # → P50, P85, P95

Three steps from tasks to confidence

1

Model each task

Give a min / most-likely / max, or pick one of six distributions. Planaco captures the uncertainty you already feel.

2

Link dependencies

Declare what blocks what. Planaco builds a DAG and computes the critical path on every simulated run.

3

Simulate & decide

Run 10,000 Monte Carlo trials in milliseconds. Read off percentiles, confidence intervals, and the riskiest tasks.

Define it once, simulate forever

from planaco import Task, Project

project = Project(name="Web App", unit="days")

design   = Task(name="Design",   min_duration=5,  mode_duration=7,  max_duration=14)
frontend = Task(name="Frontend", min_duration=8,  mode_duration=12, max_duration=15)
backend  = Task(name="Backend",  min_duration=10, mode_duration=15, max_duration=25)
testing  = Task(name="Testing",  min_duration=2,  mode_duration=3,  max_duration=5)

project.add_task(design)
project.add_task(frontend, depends_on=[design])
project.add_task(backend,  depends_on=[design])
project.add_task(testing,  depends_on=[frontend, backend])

stats = project.statistics(n=10_000)
print(stats["percentiles"]["p85"])

Pick the shape that fits the uncertainty

Ship a range you can stand behind.

$ pip install planaco