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
selection 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

Shape Function Problem
selection knapsack 0/1 & multidimensional knapsack
selection multi_knapsack multiple knapsack
selection bin_packing bin packing (minimize bins)
selection assignment linear assignment (+ teams / allowed groups)
selection generalized_assignment GAP (capacity-limited agents)
selection facility_location uncapacitated facility location
selection set_cover set cover / partition
selection blend diet / blending LP (continuous quantities)
edge-flow max_flow / min_cost_flow / shortest_path network flow
edge-flow transportation transportation problem
edge-flow solve_routing (+ distance_matrix) routing (TSP/VRP/CVRP/VRPTW/pickups/optional visits)
interval-schedule shift_scheduling employee rostering
interval-schedule job_shop job-shop scheduling

See the docs for a worked example of each.

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.5.0.tar.gz (230.3 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.5.0-py3-none-any.whl (47.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: ortidy-0.5.0.tar.gz
  • Upload date:
  • Size: 230.3 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.5.0.tar.gz
Algorithm Hash digest
SHA256 5baa82f86cbe1885ed6d841c048b03f6e4ce75f8f7fb35b49319ac07a6f94f14
MD5 efa59a907ab9484e6d73f15efa9df56a
BLAKE2b-256 c5bcdd6590769b813ce57446a0a9bb36612dc8001c7aaede396a1345ae929dae

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ortidy-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 47.2 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.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 920f835fbd1a8bb9cb7a7eac79d20c5a28035b81e306b6452f9e7ed46e0ffec6
MD5 4b2f8bbd55324119dd5c1b409192008b
BLAKE2b-256 b05e2aa7893c836f8949557ca5cab71761d52338780edb9e6669dc2d17e0426a

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