Beste allemaal,
Sinds februari 2011 log (ook) ik de treinbewegingen, eerst de website van de NS, later ook de berichten die via het NDOV worden doorgegeven. Deze historische data bevat een schat aan informatie over de treinenloop tijdens extreem weer, storingen of tijdens een 'gewone' dag. In de loop der jaren heb ik deze data voor uiteenlopende analyses gebruikt, zoals de vraag of het nu sneller was Dt -> Gvc -> Ut of Dt -> Rtd -> Ut te reizen (dat laatste was toen sneller). En hoewel de focus altijd op het spoor is geweest worden sinds 2015 ook de BISON berichten opgeslagen. Het aantal berichten is de laatste jaren explosief gegroeid en inmiddels bestaat de collectie uit zo'n 8 miljard berichten van verschillende soort en hoewel de logger verre van perfect is zijn er weinig echt grote gaten in de data. Het geheel is opgeslagen als een collectie XZ gecomprimeerde CSV bestanden, in totaal een verzameling van zo'n 570 GB (gecomprimeerd). Kortom: een enorme berg data.
Via
https://trein.fwrite.org/ heb ik de collectie nu ontsloten, gesorteerd naar logger, kanaal en datum. Het zijn dus ruwe 'opnamen' zonder enige garantie op compleetheid en/of juistheid. De licentie van de berichten zelf is, voor zover verspreid via het NDOV, naar mijn beste weten CC0. Uitzondering hierop zijn de DSI berichten (scans van de NS website) en HAFAS berichten (aankomststaten uit de internationale reisplanner) welke niet via het NDOV zijn binnengekomen - van de inhoud van deze berichten zijn de precieze licentievoorwaarden onduidelijk. De collectie zelf heb ik onder CC-BY geplaatst (oudere versies waren CC-BY-NC-SA, wie deze heeft mag deze nu als CC-BY beschouwen) omdat de verzameling zelf een nieuw archief betreft waar ik zelf een significante bijdrage aan heb geleverd. Uitzonderingen hierop zijn mogelijk, al is het NDOV Loket zelf wat mij betreft de eerste plaats voor
(betaalde) bulk data. Ik hoop dat het publiek beschikbaar maken van de data nieuwe (hobby) projecten een snelle start kan geven en ben benieuwd welke toepassingen er voor gevonden zullen worden.
Tot slot een aantal praktische zaken:
- De DSI en HAFAS bestanden hebben de structuur: Tijd, Station, Bericht, (UUID). De overige bestanden hebben de kolommen: Tijd, Bericht, (UUID). De kolom UUID is naar mijn beste weten tegenwoordig in alle bestanden aanwezig, de ZeroMQ envelope is nooit opgeslagen (en dus verloren gegaan).
- De naamgeving DVS/DVSPPV etc. geeft aan via welk kanaal de data is binnengekomen en is dus geen voorselectie van de berichten.
- Er is geen deduplicatie tussen loggers, uitgezonderd berichten in 'dedup', die kunnen als uniek worden beschouwd.
- Naast de XZ gecomprimeerde archieven slingeren er ook (nog) een aantal GZ en BZ2 archieven. Vaak zijn dit de (beschadigde) originelen die niet als XZ gecomprimeerd konden worden. Daarnaast zijn er archieven die automatisch, min of meer succesvol, hersteld zijn, de originelen daarvan zijn apart beschikbaar.
- De XZ berichten zijn dmv. multi-threading gecreëerd en bestaan uit meerdere blocks, sommige libraries hebben problemen om dergelijke archieven te openen (lezen stopt na het eerste block).
- De encoding klopt niet altijd. In principe zijn de archieven UTF-8, maar helaas zijn hier een hoop uitzonderingen op.
- Van bijna elk bestand is naast .csv.xz ook een .hash.csv.xz en .stats.csv beschikbaar.
- .csv.xz bevat de ruwe berichten.
- .hash.csv.xz bevat Tijd, Station, CRC32 (van het bericht) en Type per bericht, in dezelfde volgorde als de berichten. Deze bestanden zijn hoofdzakelijk bedoeld om berichten te kunnen scannen op duplicaten - de type detectie is verre van perfect.
- .stats.csv bevat de geaggregeerde statistieken per uur (en station) over de hoeveelheid berichten.
- Bij hele oude berichten (2011-2012) is er sprake van een significante clock drift. De berichten zijn wel sequentieel, maar de precieze tijd van ontvangst heeft een marge van ± 5 minuten.
- Het is niet de bedoeling 'live' archieven te verzorgen, de archieven zullen dus weken tot enkele maanden achterlopen.
- De Last-Modified header klopt, doe er je voordeel mee tijdens het maken of bijwerken van een mirror (wget: --timestamping).
En tot slot: wees een beetje aardig voor de server! De uplink is niet overdreven (100 mbit) en als iedereen tegelijk een mirror probeert te maken kan het ongetwijfeld kapot (wget verzoek: --limit-rate=3m --waitretry --wait=1 --timestamping).
Hartelijke groet,
Adriaan