Generic weighted-criteria ranking engine — score and rank places (or anything) by normalized, weighted factors. Zero dependencies.
Project description
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 # Python
Usage
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
Project details
Release history Release notifications | RSS feed
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 georank-0.1.1.tar.gz.
File metadata
- Download URL: georank-0.1.1.tar.gz
- Upload date:
- Size: 4.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
79680921617fcc9ea7299959bde30a689b75350390944515a39632773169c74c
|
|
| MD5 |
ff6ee434ca80608d4ad50b9670b6c65a
|
|
| BLAKE2b-256 |
39123643dcb954892fcf6c63384ca2add6b7958303b19752581ec7eb414db3ce
|
File details
Details for the file georank-0.1.1-py3-none-any.whl.
File metadata
- Download URL: georank-0.1.1-py3-none-any.whl
- Upload date:
- Size: 4.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bc7aa3098cc02fa2fdae5875b8c70592876000ac9ed143eb2f66d2e3bc1d1bdd
|
|
| MD5 |
2ecf475205626fb4cf445ea90b487e83
|
|
| BLAKE2b-256 |
a7e8a4e5e20256867fbeec6c7550df09811075f6154ffd27ad5db44cf4bc1e4c
|