Briefings & Changelog

Methodology & Releases

Lockstep releases of moveq, moveq-core, moveq-catalogue, and moveq-cli. Versioning follows scientific Python: a patch may change numeric outputs so they match the documented formula.

Release Notes · v0.1.2 · 2026-08-25

Correctness patch: Palma, CI, Gini, and score match the docs

Public signatures are unchanged. Some figures computed with 0.1.1 will change — coarse geographies, tied ranks, all-zero service, invalid input — because the implementations now follow the documented definitions. That is a patch, not a minor: pip install "moveq~=0.1.1" is meant to receive it.

  • Palma splits areal units that straddle the 40% and 90% population cuts instead of assigning whole polygons to one bin.
  • The Concentration Index gives tied ranks a shared group-midpoint fractional rank, so input order among ties no longer changes the result.
  • All-zero service: Palma is 1.0 (equality), Gini is 0.0. CI is defined when mean service is negative, and ignores unpopulated units.
  • compute_score keeps n_areas=None when every term is missing. Non-finite term values are rejected. Design weights must be finite and strictly positive.
  • Gini, Palma, and CI reject 2-D input with a clear error instead of a NumPy broadcast failure.

Install: pip install -U moveq. Details: Palma, Concentration Index, Gini, composite score.

Methodology Deep Dive

Why discrete Palma binning fails at spatial zone boundaries

Palma is the ratio of service held by the top 10% of population to that held by the bottom 40%. Census tracts, LSOAs, and IRIS units almost never land exactly on those cumulative-population cuts. Discrete quantile tools (including a naive pd.qcut) dump the whole straddling polygon into one bucket. Sort the same table differently and the Palma ratio jumps — a MAUP artefact, not a change in the network.

From v0.1.2, compute_palma_ratio splits those boundary units: population and service are partitioned in proportion to how much of the unit sits below versus above the 40% and 90% cuts. That is the documented continuous-boundary Palma, and it is permutation-stable. Read the core inequality notes.

Release Notes · v0.1.1 · 2026-08-25

PyPI pages now explain the metrics, not only the call signatures

Documentation-only. No algorithm changes. The four package READMEs on PyPI describe what Gini, Palma, the Concentration Index, composite scores, and catalogue same / replace / omit mean, not only how to invoke them.

moveq, moveq-core, moveq-catalogue, moveq-cli.

Release Notes · v0.1.0 · 2026-08-25

Announcing moveq: a pure-NumPy transport-equity suite

First lockstep release of the four packages. Population-weighted Gini, continuous Palma, Wagstaff Concentration Index, weighted composite scoring with missing-term renormalization, optional pandas vulnerability helpers, a same / replace / omit catalogue registry, and a CSV/JSON CLI.

Engineering · site

This site is static HTML, gated in CI, deployed from main

Files live in website/. Vercel deploys main to moveq.souravamseekar.com (pull requests get previews). Commits that do not touch website/ skip the site build. GitHub Actions runs python scripts/check_website.py and pytest tests/test_website*.py — clean URLs, HTML structure, in-page and cross-page anchors, JS–DOM id bindings, MIME types — with no Node or npm install. That is website integrity, not a PyPI version bump.