georank
v0.1.1
Published
Generic weighted-criteria ranking engine — score and rank places (or anything) by normalized, weighted factors. Zero dependencies.
Maintainers
Readme
georank
Generic weighted-criteria ranking engine. Score and rank places — or anything — by normalized, weighted factors. Zero dependencies, available for both JavaScript and Python.
This is the open-source core of the ranking method behind GeoRank.place, a map-based tool for comparing cities and regions on the factors that matter for relocation (sunshine, cost, climate, and more).
Method
Each criterion is min-max normalized to 0–100 across the set you pass in, then weighted and summed into a single 0–100 score:
- For every criterion, the lowest raw value maps to 0 and the highest to 100.
- Set
invert: truefor criteria where lower is better (cost, tax, rainfall). - Missing values map to a neutral 50 rather than penalizing an item to zero.
- Weights need not sum to 1 — they are normalized internally.
Install
npm install georank # JavaScript / TypeScript
pip install georank # PythonUsage
JavaScript / TypeScript
import { rank } from "georank";
const cities = [
{ name: "Lisbon", sunshine: 2799, cost: 100 },
{ name: "Berlin", sunshine: 1626, cost: 85 },
{ name: "Valencia", sunshine: 2696, cost: 70 },
];
const ranked = rank(cities, [
{ key: "sunshine", weight: 0.6 },
{ key: "cost", weight: 0.4, invert: true }, // cheaper scores higher
]);
ranked.forEach((r) => console.log(r.item.name, r.score, r.signals));Python
from georank import rank
cities = [
{"name": "Lisbon", "sunshine": 2799, "cost": 100},
{"name": "Berlin", "sunshine": 1626, "cost": 85},
{"name": "Valencia", "sunshine": 2696, "cost": 70},
]
ranked = rank(cities, [
{"key": "sunshine", "weight": 0.6},
{"key": "cost", "weight": 0.4, "invert": True},
])
for r in ranked:
print(r["item"]["name"], r["score"], r["signals"])API
rank(items, criteria)
Returns a new array sorted by score (descending). Each result is { item, score, signals },
where signals holds the per-criterion normalized 0–100 value.
criteria is a list of { key, weight, invert? }.
normalize(values, { invert })
Min-max normalize an array of numbers to 0–100. Missing / non-finite values become 50; if every value is equal, every output is 50.
Live tool
See the method applied to real climate and cost data at georank.place — including the interactive city rankings and side-by-side compare.
License
MIT © GeoRank.place
