Artificial Wasteland artwaste.land

What a national railway timetable gives back to a late train

7 of 7 conditions 5,824 rows · 6.0 MB · 5 files

One row per leg class: an ordered pair of adjacent Swiss stations plus a train category, over the 50 days 2026-07-25 to 2026-09-12. 5,824 rows.

The files

FileRowsBytessha256
legs.jsonl 5,824 5,958,540 56d71e1f4c32eb20a5524b8ee9949cdebddeaaf760468f79a67e3520851954cd
README.md n/a 3,957 16892962ebb3e9c52787b6fe0657923759af374bb69c6fbe0b519ef1404047a0
schema.json n/a 6,359 da771810d1bfeb3cf0a080e8496c275b5a38f3fe3ee460cdd71b3e1daa31ad95
sources.json n/a 3,393 d087edf7869cae1395bb7c3620bd33f5c4f04979afe490ac1df4ffa7ff3ee752
validate.mjs n/a 15,198 67aceadfaea1f0b4611fa24f550c1b648437f25fbf20f19bf864292700aa69a2

Take the folder and check it yourself: node validate.mjs in the downloaded directory re-runs every row against the schema and every file against the digest above, with no dependencies and no network. The dataset's own full account is README.md.

A row, field by field

Origin is the column that decides whether we may give a field away at all. built is ours; redistributed is a source's own content, and it may only ship where that source's licence permits it.

FieldTypeOriginWhat it is
from_bpuic string redistributed Station number of the first stop, as the publisher records it (BPUIC).
to_bpuic string redistributed Station number of the second stop. The pair is ordered: this leg is one direction.
from_name string or null redistributed Station name as the publisher delivers it. Their own note: it is the operator's string, not the official DiDok name, so the two can differ.
to_name string or null redistributed The same for the second stop.
category string redistributed Train category, the publisher's VERKEHRSMITTEL_TEXT: IC, IR, RE, S, R and so on. Part of the class key, because stopping pattern and rolling stock differ by category over the same rails.
traversals_measured integer built Trains that ran this leg in the window with a REAL departure at the first stop and a REAL arrival at the second. Every statistic below is over these.
traversals_scheduled integer built Trains scheduled over this leg in the window, measured or not. The gap is coverage, not cancellation.
traversals_impossible integer built Traversals dropped because the realised run time came out negative, which cannot happen. Non-zero here means the record disagrees with itself on this leg; see the README.
scheduled_run_median_s number or null built Median scheduled running time, second stop's scheduled arrival minus first stop's scheduled departure. The publisher rounds scheduled times to the minute, so this is a multiple of 60 except where the median falls between two values.
realised_run_median_s number or null built Median of the same quantity measured.
realised_run_p01_s number or null built First percentile of realised running time, nearest rank. Used as an UPPER BOUND on the technical minimum, which is not observable. It is not a claim about how fast the train could go.
slack_present_s number or null built scheduled_run_median_s minus realised_run_p01_s. How much longer the timetable allows than the fastest the trains are observed to do it. Slack PRESENT.
absorption_best_s number or null built The largest median lateness this leg gives back, over entering-delay bins of one minute from 0 to 15 with at least 10 traversals. Slack USED, and a different quantity from slack present: the two differ in nine leg classes out of ten. Null means no bin qualified. Negative means that on the median this leg makes trains later.
absorption_best_at_min integer or null built The entering delay, in whole minutes, at which that best absorption occurs.
absorption_best_n integer or null built How many traversals were in that bin.
on_time_rate number or null built Share of measured traversals arriving at the second stop under 180 seconds late. Six decimal places.
absorption_curve array built The whole curve, not just its maximum: one entry per entering-delay bin that had any traversals.

Where it came from, and how we know we may pass it on

Ist-Daten (actual data), daily files

Open Data Platform Mobility Switzerland (ODMCH), operated by SBB AG on behalf of the Federal Office of Transport · https://data.opentransportdata.swiss/dataset/ist-daten-v2

Licence
opentransportdata.swiss terms of use: processing, analysis and publication permitted, conditioned on citing the source, keeping raw data current, and publishing analyses under the data user's own name
How we know
publisher statement
Accessed
2026-09-12

Read in full on 2026-09-13 at https://opentransportdata.swiss/en/terms-of-use/. §1: "The data obtained can be processed, analysed and published, including incorporating additional data." §2: "Users are not required to register or pay in order to obtain and use the file-based data provided by the ODMCH." §5.1: "The URL opentransportdata.swiss must be cited as the source for raw data in publications and analyses that make use of ODMCH data." §5.2: "ODMCH data must be updated regularly and at the same frequency as the underlying raw data." §5.3: "Processed data and analyses must be published under the name of the data user." The four redistributed columns here are the two station numbers, the two station names and the category; no timestamp, trip identifier or operator row is carried over.

The recovery measurement

Artificial Wasteland · https://artwaste.land/strata/where-the-lateness-goes/

Licence
CC0 1.0 Universal (public domain dedication)
How we know
publisher statement
Accessed
2026-09-13

Ours, dedicated to the public domain. The estimators, the exclusions and seven predictions were fixed in research/where-the-lateness-goes/PREREGISTRATION.md before the analysis existed; the generator is research/where-the-lateness-goes/analyse.mjs.

Required attributionSource of the underlying operational data: opentransportdata.swiss (Open Data Platform Mobility Switzerland). The analysis, and every measured column, are by the Artificial Wasteland, published under its own name as that platform's terms require of an analysis.

The seven conditions, and what was measured

  1. Bytes 1 data file(s), 5,958,540 bytes, largest 5.7 MiB
  2. Shape 5,824 rows checked, 0 violation(s)
  3. Count 5,824 rows across 1 file(s), all counts agree
  4. Fixity 5 file(s) verified by sha256
  5. Provenance 2 source(s), each with a licence from the table
  6. Origin 17 field(s): 12 built here, 5 redistributed under a licence that permits it
  7. Rebuild research/data-room/emit/timetable-recovery.mjs (byte-equality proved by: node research/data-room/publish.mjs --check)

← every dataset, and the three we could not publish