Cost estimation & scaling analysis for pandas pipelines
Project description
CostFlow
CostFlow measures how your pandas pipelines scale. It runs a pipeline across multiple data sizes, traces expensive DataFrame ops (merge, groupby, sort, pivot, etc.), and fits simple complexity models so you can spot bottlenecks before the code hits production.
Why use it
- See how wall time changes as rows grow and get quick projections for larger sizes.
- Identify the pandas operations consuming most of the traced time.
- Estimate memory needs (when
psutilis installed) to avoid surprises on shared machines.
Install
pip install .
# for memory tracking
pip install ".[mem]"
Quickstart
import pandas as pd
from costflow import analyze
from costflow.report import pretty_print
def make_df(n: int) -> pd.DataFrame:
import numpy as np
rng = np.random.default_rng(0)
return pd.DataFrame(
{
"customer_id": rng.integers(0, 100, size=n),
"region": rng.choice(["NA", "EU", "APAC", "LATAM"], size=n),
"quantity": rng.integers(1, 10, size=n),
"price": rng.normal(50, 10, size=n).clip(5),
"discount": rng.uniform(0, 0.3, size=n),
}
)
def pipeline(df):
df["revenue"] = df["quantity"] * df["price"] * (1 - df["discount"])
out = (
df.groupby(["customer_id", "region"])
.agg(total_revenue=("revenue", "sum"))
.reset_index()
.sort_values("total_revenue", ascending=False)
)
return out
report = analyze(
pipeline_fn=pipeline,
make_df=make_df,
sizes=[1_000, 5_000, 10_000],
trace_ops=True,
)
pretty_print(report)
See examples/quickstart.py for a fuller walk-through with multiple pipelines.
More scenarios:
examples/wide_table.pyfor wide numeric tables with many columns.examples/string_heavy.pyfor string-heavy joins/pivots.
Interpreting the report
- Runs: shows wall time and (when available) peak RSS for each dataset size.
- Time model: picks the candidate scaling model with the lowest RMSE; check
r2to see how well it fits. - Memory model: only populated when
psutilis installed (pip install ".[mem]"). Without it, the memory fit isN/Aand projections are omitted. - Dominant ops: fraction of traced time spent in the most expensive pandas operations. Tracing is best-effort: common methods are wrapped explicitly, and other DataFrame/GroupBy methods are generically wrapped, but deep pandas internals (C/numba/numexpr) are not captured.
- Projections: extrapolations to common target sizes using the chosen model and the column count from your largest run. Treat these as coarse estimates—validate them with a real run when possible and prefer models with a reasonable
r2.
Tips for better signal
- Use at least two or three increasing sizes so the fit can distinguish between linear vs. super-linear growth.
- Set
trace_ops=Trueto find bottlenecks, then re-run withtrace_ops=Falseif you want to remove tracing overhead from timings. - Keep pipelines functional: return a DataFrame/Series; avoid mutating global state.
CLI
Analyze a pipeline from the command line (defaults: pipeline/make_df function names):
costflow --pipeline examples/quickstart.py:simple_pipeline --make-df examples/quickstart.py:make_df --sizes 1000 5000 10000
- Add
--jsonto emit machine-readable output. - Use
--no-trace-opsto remove tracing overhead when you just want wall-clock measurements.
Limitations and guidance
- Tracing is shallow: pandas operations implemented in C/numexpr/numba are not visible, so dominant-op fractions reflect Python-level pandas calls.
- Projections assume the chosen model holds; verify with a real run near your target size before making infra decisions.
- Memory projections require
psutil. Without it, memory fit isN/Aand only wall-time projections are shown.
Development
pip install ".[dev]"
pytest
License
MIT (see LICENSE)
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file costflow-0.1.0.tar.gz.
File metadata
- Download URL: costflow-0.1.0.tar.gz
- Upload date:
- Size: 14.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e1b4d4d8d8912615aec12e67f8c6eda3d269424567b57bebe995d4856a46609a
|
|
| MD5 |
ccd1cd49467847db7b88d272076f8c61
|
|
| BLAKE2b-256 |
0cc1db5452bd907f41ae4df7da85d8170259bed363338cfc2a318c26c74d08ff
|
File details
Details for the file costflow-0.1.0-py3-none-any.whl.
File metadata
- Download URL: costflow-0.1.0-py3-none-any.whl
- Upload date:
- Size: 12.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
817c667559b63af2fa65d29922a67f3cc19018af0c6424f67fe63787a51ca4e2
|
|
| MD5 |
35c0eb0a9ef1ab401587bc6fa15f00cf
|
|
| BLAKE2b-256 |
d358a4ed190f07daf4745efd070be1c4ec8719c4eee19240c06e570394b42b5f
|