← Journaal

SG HIRSCHI

Prestatiegegevens (riro.de)

Samenvatting

Elk jaar worden er in Zwitserland 12 vluchten gehouden met springduiven. Door de vliegtijden en afstanden van de releasepunten naar elke duif te analyseren, kan de gemiddelde snelheid voor iedere duif berekend worden. Een derde van de deelnemende duiven wordt genoteerd (in prijzen). De resultaten (inclusief snelheden, punten, enz.) van deze vluchten zijn beschikbaar op RIRO (http://www.bas-riro.de/).

Python scripts en reguliere expressies gebruiken (GitHub), kunnen de prestatiegegevens van de zoekduiven worden geïmporteerd in een database (hier, MySQL), samengevoegd en vervolgens geformatteerd als HTML. Dit geeft fokkers een praktisch overzicht van hun duiven resultaten.

Uitvoering

Database

Het datamodel is ontworpen om zo eenvoudig mogelijk te zijn. Hoewel de gegevens sterk genormaliseerd en getypt kunnen worden, zou dit buitensporig zijn voor het uiteindelijke doel van een resultatenpagina in HTML5 / JavaScript / CSS. Daarom werden in dit geval slechts twee tabellen gemaakt in een MySQL database:

  • 2022 Flugsaison
    • De resultaten voor de duiven (ranken, punten, snelheid, enz.) per vlucht, samen met geaggregeerde informatie (aantal fokkers, aantal duiven, etc.).
  • 2022 Eingesetzte Tauben
    • Hier moet het zichtbaar zijn voor elke vlucht die duiven nog of opnieuw gebruikt werden.

De volgende verklaringen kunnen worden gebruikt om de tabellen te maken:

CREATE TABLE `2022_Flugsaison` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `taubennr` varchar(255) NOT NULL,
  `mmin` varchar(255) NOT NULL,
  `prs_fg` varchar(255) DEFAULT NULL,
  `prs_rv` varchar(255) DEFAULT NULL,
  `aspkt_fg` varchar(255) DEFAULT NULL,
  `aspkt_rv` varchar(255) DEFAULT NULL,
  `insert_dttm` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `km` varchar(255) NOT NULL,
  `prs` varchar(255) NOT NULL,
  `auflassort` varchar(255) NOT NULL,
  `prs_zt` varchar(255) NOT NULL,
  `flugnummer` varchar(255) NOT NULL,
  `prs_tb` varchar(255) DEFAULT NULL,
  `flugdatum` date DEFAULT NULL,
  `anz_ztr_fg` varchar(255) DEFAULT NULL,
  `anz_ztr_rv` varchar(255) DEFAULT NULL,
  `anz_tbn_fg` varchar(255) DEFAULT NULL,
  `anz_tbn_rv` varchar(255) DEFAULT NULL,
  `prs_rg` varchar(255) DEFAULT NULL,
  `anz_tbn_rg` varchar(255) DEFAULT NULL,
  `anz_ztr_rg` varchar(255) DEFAULT NULL,
  `aspkt_rg` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=917 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `2022_Eingesetzte_Tauben` (
  `id` int NOT NULL AUTO_INCREMENT,
  `taubennr` varchar(255) NOT NULL,
  `flugnummer` varchar(255) NOT NULL,
  `insert_dttm` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=297 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

Gegevensbronnen

Voor dit project kunnen twee bronnen van belang zijn:

Helaas zijn de rankinggegevens zeer heterogeen, variërend per racevereniging, land en soms zelfs per vlucht. Bijvoorbeeld, dit kan gebeuren wanneer bepaalde vluchten worden uitgevoerd met andere raceverenigingen, wat resulteert in een algemene ranglijst aan het einde.

De gegevens van het Tipes-apparaat bevatten de geregistreerde aankomsttijden voor elke duif en dienen als basis voor het maken van de algemene rankings. Gelukkig worden deze gegevens altijd consequent geformatteerd.

Gegevensverwerking

Methode

Om de soms heterogene tekstgegevens consequent en generiek te lezen, worden reguliere expressies gebruikt. Door een reeks syntactische regels vast te stellen die uit de gegevens worden herkend en gehaald, kunnen afzonderlijke tekstcomponenten worden ontleed op basis van specifieke scheidingstekens (bv. spaties). Aangezien bepaalde tekstcomponenten niet altijd aanwezig zijn, kunnen ze in de syntactische regels als "optioneel" worden aangegeven.

Op de website https://regex101.com/, kunt u maken, controleren, valideren en testen van deze regels.

Voorbeeld van het testen van een reguliere expressie voor het ontleden van een RIRO-resultaatregel

De afzonderlijke kleurgecodeerde componenten kunnen vervolgens eenvoudig worden gebruikt in vrijwel elke programmeertaal.

De TIPES-gegevens lezen

De gegevens van de Tipes apparaten bevatten niet alleen aankomsttijden, maar geven ook een overzicht van elke duif die in de vlucht werd ingevoerd. Dit geeft een goede basis voor de statistieken om aan te tonen of de duif daadwerkelijk in de respectievelijke vlucht was opgenomen. Hieronder volgt een voorbeeld:

Tips Voorbeeld Gegevens (vluchtdatum in groen, aankomsttijd in geel en duivennummer in rood)

Voor dit specifieke formaat is de volgende reguliere expressie nuttig gebleken:

^([0-9][0-9][0-9][0-9])([1-9][0-9])([A-Z][A-Z]?)\s*(0*)([1-9][0-9]*w?)\s*([0-9]*)\s*([0-9A-Z]*)(\*)([0-9]*;)([A-Z][A-Z]?)([0-9]*).([1-9][0-9]).([0-9]*w?);([a-zA-Z0-9.]*)$

De gedetailleerde instructies voor verwerking zijn te vinden in de openbare GitHub repository.

Lees prestatiegegevens (riro)

Voorbeeld rangschikkingsgegevens van RIRO

Voor dit formaat is de volgende reguliere expressie nuttig gebleken:

^(\s*)([1-9][0-9]*[a-z]?)(\s*)([1-9][0-9]*[a-z]?)?(\s*)([1-9][0-9]*[a-z]?)?(\s*)([0-9][A-Z][0-9]\/)?(\s*)([0-1][0-9]*)?(\s*)([0-9]*)?(\s*)([0-9]*)?(\s*)([a-zA-Z]*)?(\s*)([0-9]*)(\s*)([0-9]*)?(\s*)([0-9]*W?\s)(\s*)([a-zA-Zäöüéèß&]*[.,]?\s*[,]?\s*[a-zA-Zäöüéèß&]*\s*[,+]?[a-zA-Zäöüéèß&]*\s*[+-.\/]*\s*[a-zA-Zäöüéèß&]*.?)(\s*)([0-9][0-9])(\s*)([0-9]*\/\s*[0-9]*)?(\s*)([0-9][0-9]?\s)?(\s*)([0-9][0-9]?\s)?(\s*)([0-9]*.[0-9]*.[0-9]*)(\s*)(-?[0-9]\s)?(\s*)([0-9]*,[0-9]*)(\s*)([0-9]*,[0-9]*)?(\s*)([0-9]*,[0-9]*)?(\s*)([0-9]*,[0-9]*)?(\s*)([A-Z])?(\s*)([0-9]*\/\s*[0-9]*)(\s*)([0-9]*)(\s*)([0-9]*,?[0-9]*)(\s*)([0-9]*)(\s*)([0-9]*)(\s*)$

Dit maakt de gestructureerde extractie mogelijk van:

  • Duifnummer (inclusief nationaliteit, geslacht en geboortejaar)
  • Rangen (regionaal, groep, enz.)
  • Aaspunten (regionaal, groep, enz.)
  • Snelheid
  • Naam van de fokker
  • …

Gedetailleerde instructies voor verwerking zijn te vinden in de openbare GitHub repository..

Samenvoegen van gegevens

Nu alle benodigde gegevens in de MySQL-database zijn geïmporteerd, is het belangrijk om deze in een passend formaat te visualiseren. Zo kan bijvoorbeeld per duif en vlucht opvragen en ze samenvoegen in een tabel als volgt worden bereikt:

SELECT   EING.taubennr,
         CAST(EING.flugnummer AS UNSIGNED) AS flugnummer,
         RESULTATE.prs_fg, 
         RESULTATE.prs_rv, 
         RESULTATE.prs_zt, 
         IF(RESULTATE.aspkt_fg IS NULL OR RESULTATE.aspkt_fg='',NULL,CAST(REPLACE(RESULTATE.aspkt_fg,',','.') AS DECIMAL(4,2))) AS aspkt_fg, 
         IF(RESULTATE.aspkt_rv IS NULL OR RESULTATE.aspkt_rv='',NULL,CAST(REPLACE(RESULTATE.aspkt_rv,',','.') AS DECIMAL(4,2))) AS aspkt_rv 
 FROM brieftauben.`2022_Eingesetzte_Tauben` AS EING 
 LEFT JOIN brieftauben.`2022_Flugsaison`	AS RESULTATE ON RESULTATE.taubennr = EING.taubennr AND RESULTATE.flugnummer = EING.flugnummer

Visualisatie van gegevens

De resultaten van de SQL query kunnen verder worden getransformeerd en geaggregeerd naar behoefte en vervolgens als een HTML/JavaScript/CSS website, bijvoorbeeld.

Voorbeeld website met de geaggregeerde resultaten (het eindproduct)

Om dit afdrukbaar te maken, heb ik ook een "PDF Export" knop geïmplementeerd. De uitvoer mag dan niet mooi zijn, maar het is functioneel.

PDF-uitvoer

Nu zijn alle stappen voltooid en kunt u de website importeren, verwerken en uiteindelijk bijwerken met de relevante gegevens in MySQL na elke vlucht met slechts een paar klikken. Voorbeelden van deze websites zijn te vinden op: https://patrick-hirschi.ch/brieftauben/

Gearchiveerd origineel artikel. Media credits in het artikel zijn bewaard gebleven.

← Journaal