Hello. I wrote an application to analyse the results of the 'Empire State Run Up', 2013 edition, after I ran the race.
Here you will find my code.
See the previous section called 'Packaging', and then install it on your virtual environment:
python3 -m venv ~/virtualenv/EmpireStateRunUp
. ~/virtualenv/EmpireStateRunUp/bin/activate
pip install --upgrade pip
python -m build .
pip install --upgrade dist/EmpireStateRunUp-0.0.1-py3-none-any.whlThere are 4 scripts that you can run:
- esru_numbers
- esru_outlier
- esru_browser
- esru_plot
If you have uvx, you can run any of them like this:
uvx --from EmpireStateRunUp esru_numbers
uvx --from EmpireStateRunUp esru_outlier
uvx --from EmpireStateRunUp esru_browser
uvx --from EmpireStateRunUp esru_plotIf you want to learn more about these programs, please grab a cup of coffe and read the TUTORIAL
python3 -m venv ~/virtualenv/EmpireStateRunUp
. ~/virtualenv/EmpireStateRunUp/bin/activate
pip install --upgrade pip
pip install --editable .[dev,lint]For example, playing with the 'esru_outlier' application:
. ~/virtualenv/EmpireStateRunUp/bin/activate
pip install textual-dev
# On another terminal: . ~/virtualenv/EmpireStateRunUp/bin/activate && textual console
textual run --dev empirestaterunup.apps:run_outlier python3 -m venv ~/virtualenv/EmpireStateRunUp
. ~/virtualenv/EmpireStateRunUp/bin/activate
pip install --upgrade pip
pip install --upgrade build
pip install --upgrade wheel
python -m build .For your user:
pip install --user EmpireStateRunUpOr using a virtual environment:
python -m venv ~/virtualenv/EmpireStateRunUp && \
. ~/virtualenv/EmpireStateRunUp/bin/acvtivate && \
pip install EmpireStateRunUpI used the files generated by the ISO-3166-Countries-with-Regional-Codes for the flag lookup, using Regional indicator symbol.
Notes: Data from the 2025 race is full of errors. Whoever entered the data decided than things like not populating the country of origin was correct:
{"name": "Alessandro Manrique", "bib": "377", "age": 20, "country": "US", "locality": "Mexico", "gender": "M", "state": "Wisconsin", "racer_has_finished": true, "split_data": [{"name": "Full Course", "number": 1, "time_ms": 1077000, "distanc e_m": 320, "time_with_penalties_ms": 1077000, "gun_time_ms": {"timeInMillis": 2769000, "timeUnit": "m"}, "interval_full": true}, {"name": "20th Floor", "number": 2, "time_ms": 209000, "distance_m": 61, "time_with_penalties_ms": 209000, "gun_ time_ms": {"timeInMillis": 1900000, "timeUnit": "m"}, "interval_full": false}, {"name": "65th Floor", "number": 3, "time_ms": 785000, "distance_m": 229, "time_with_penalties_ms": 785000, "gun_time_ms": {"timeInMillis": 2476000, "timeUnit": " m"}, "interval_full": false}]}I did not want to spend an long time fixing this, so first extracted all localities with some jq magic:
jq -r '[.locality | ascii_downcase]|.[]' empirestaterunup/results-2025.jsonl|sort -u
albany
albuquerque
alexandria
altamonte
ames
angier
armonk
astoria
athens
aventura
albany
albuquerque
alexandria
altamonte
ames
angier
armonk
astoria
athens
aventura
...Next, using an AI LLM, I tried to use a reverse lookup of the country 2 letter ISO code with the locality, all in lowercase. Then wrote a small script to "fix" the country from the original dowloaded race results. For ambiguous locations I assumed the country was US, as the majority of racers from 2023-2024 where from this country.
[berkeley]
alpha-2 = "US"
[berlin]
alpha-2 = "DE"
[bethel]
alpha-2 = "US"
[bilbao]
alpha-2 = "ES"Make sure you check the tutorial. It explains how this project got started, as well showcases features of the applications.
The applications now support running in web server mode. To enable:
(EmpireStateRunUp) [josevnz@dmaf5 EmpireStateRunUp]$ esru_server --help
usage: esru_server [-h] --application {esru_numbers,esru_outlier,esru_browser} [--port PORT] [--debug] [results ...]
Browse user results
positional arguments:
results Race results.
options:
-h, --help show this help message and exit
--application {esru_numbers,esru_outlier,esru_browser}
Applications that can run in server mode: ['esru_numbers', 'esru_outlier', 'esru_browser']
--port PORT Default port (8000)
--debug Enable debug mode
esru_server --application esru_numbers
# Or if you have an external results file:
sru_server --application esru_browser empirestaterunup/results-2023.jsonlI used athlinks-races to parse the race results. This is an example of a scrapping session:
uvx --from athlinks_races athlinks_races_cli --metadata_rpt /home/josevnz/EmpireStateBuildingRunUp/empirestaterunup/metadata-2025.json --athletes_rpt /home/josevnz/EmpireStateBuildingRunUp/empirestaterunup/results-2025.jsonl --format jsonlines --race_url https://www.athlinks.com/event/382111/results/Event/1124263/Results
uvx --from athlinks_races athlinks_races_cli --metadata_rpt /home/josevnz/EmpireStateBuildingRunUp/empirestaterunup/metadata-2024.json --athletes_rpt /home/josevnz/EmpireStateBuildingRunUp/empirestaterunup/results-2024.jsonl --format jsonlines --race_url https://www.athlinks.com/event/382111/results/Event/1093108/Results
uvx --from athlinks_races athlinks_races_cli --metadata_rpt /home/josevnz/EmpireStateBuildingRunUp/empirestaterunup/metadata-2023.json --athletes_rpt /home/josevnz/EmpireStateBuildingRunUp/empirestaterunup/results-2023.jsonl --format jsonlines --race_url https://www.athlinks.com/event/382111/results/Event/1062909/Results
