Skip to main content

Operations research on tidy dataframes — a backend-agnostic dataframe façade over Google OR-Tools.

Project description

ortidy

CI PyPI Python Docs Binder License Code style: ruff

OR (operations research) on tidy dataframes — a backend-agnostic dataframe façade over Google OR-Tools.

ortidy is the revival of pandas-or, rebuilt around Narwhals so it works natively with pandas, Polars, and more — pandas in, pandas out; Polars in, Polars out. pandas-or users: see Migrating.

The thesis: bridge operations research and the data ecosystem so solver outputs come back as tidy dataframes ready for analysis, plotting, and dashboards.

Installation

pip install ortidy

ortidy brings its own OR-Tools. Bring your own dataframe backend (pandas, polars, …) — install whichever you already use.

Quickstart

Every solver accepts a native frame, returns the same backend, and hands back a SolveResult carrying the result frame, a status, the objective, and solve metadata.

import pandas as pd
import ortidy

items = pd.DataFrame({"value": [60, 100, 120], "weight": [10, 20, 30]})

result = ortidy.knapsack(items, capacity=50)
print(result.status)        # SolveStatus.OPTIMAL
print(result.objective)     # 220
print(result.frame)         # items + an `isIncluded` boolean column

Every solver is a plain function — pass a native frame (pandas, Polars, …) and get a SolveResult back in the same backend.

Result contract

Three result shapes cover every solver:

Shape Solvers Result
assignment-matrix knapsack, multi_knapsack, bin_packing rows mapped to bins/resources
edge-flow solve_routing (more in progress) values on an edge list
interval-schedule scheduling (roadmap) intervals on a timeline

Every solver returns a SolveResult:

result.frame       # native dataframe, same backend as the input
result.status      # OPTIMAL / FEASIBLE / INFEASIBLE / UNBOUNDED / MODEL_INVALID
result.objective   # objective value (None when no solution)
result.metadata    # solver name, wall time, bounds, …
bool(result)       # True when OPTIMAL or FEASIBLE — a FEASIBLE solution is a success

Solvers

Function Problem
ortidy.knapsack(items, capacity) 0/1 knapsack
ortidy.multi_knapsack(items, bins) multiple knapsack
ortidy.bin_packing(items, capacity) bin packing (minimize bins)
ortidy.solve_routing(matrix, vehicles=...) vehicle routing

Sample datasets ship with the package:

from ortidy import data
items = data.items_knapsack()            # pandas by default
items = data.items_knapsack("polars")    # or Polars

Examples

Runnable notebooks live in examples/ — knapsack/bin-packing, a haversine world-tour TSP, and capacitated vehicle routing, each plotted with Plotly. Try them in your browser with no install: Binder

Migrating from pandas-or

ortidy is pandas-or renamed and rebuilt. Install ortidy and import ortidy (the old pandas-or 0.1.3 on PyPI is unmaintained). The key changes:

  • Solvers return a SolveResult object, not a bare frame / None.
  • Rows are identified by explicit id columns, never a positional index.
  • The backend is whatever you pass in (pandas, Polars, …), not just pandas.

License

Apache-2.0.

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

ortidy-0.2.0.tar.gz (222.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ortidy-0.2.0-py3-none-any.whl (34.0 kB view details)

Uploaded Python 3

File details

Details for the file ortidy-0.2.0.tar.gz.

File metadata

  • Download URL: ortidy-0.2.0.tar.gz
  • Upload date:
  • Size: 222.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.24 {"installer":{"name":"uv","version":"0.11.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for ortidy-0.2.0.tar.gz
Algorithm Hash digest
SHA256 530a2aa289178fcfcacdb64a1b948be0ffbf01271b49f1d6e55cea8858ae1dd2
MD5 ee9300d11b1fb14a2b0f78556f4c0f1d
BLAKE2b-256 d6becd6412706a51df7d6ccc8caa49223dad61a75f8618639015c3b4bd0e8838

See more details on using hashes here.

File details

Details for the file ortidy-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: ortidy-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 34.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.24 {"installer":{"name":"uv","version":"0.11.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for ortidy-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b4de62cdc0e6f9d700373e1df0b678edab9409eb46b290b950b3d4bd0741949a
MD5 e61568b2a5a69997488114f87ea7ea98
BLAKE2b-256 f4fa575d6ceb17f04efe3e95caed4fadc31da6f12dba1a422a987ce7182ba444

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page