← Journal

· SG HIRSCHI

Leistungsdaten (riro.de)

Zusammenfassung

In der Schweiz finden jedes Jahr 12 Rennen mit Zieltauben statt. Durch die Analyse der Flugzeiten und Entfernungen von den Startpunkten zum Heimat-Loft jeder Taube kann die Durchschnittsgeschwindigkeit für jede Taube berechnet werden. Ein Drittel der teilnehmenden Tauben wird aufgelistet ("Preise"). Die Ergebnisse (einschließlich Geschwindigkeiten, Punkte usw.) dieser Rennen werden auf RIRO zur Verfügung gestellt.http://www.bas-riro.de/).

Python-Skripte und reguläre Ausdrücke ()GitHub) können die Leistungsdaten der Homing-Tauben in eine Datenbank (hier MySQL) importiert, aggregiert und dann als HTML formatiert werden.

Durchführung

Datenbank

Das Datenmodell ist so einfach wie möglich gestaltet. Während die Daten stark normalisiert und getippt werden könnten, wäre dies für das ultimative Ziel einer Ergebnisseite in HTML5 / JavaScript / CSS übertrieben. Daher wurden in diesem Fall nur zwei Tabellen in einer MySQL-Datenbank erstellt:

  • 2022 Flugsaison
    • Die Ergebnisse für die Tauben (Ränge, Punkte, Geschwindigkeit usw.) pro Flug zusammen mit aggregierten Informationen (Anzahl der Züchter, Anzahl der Tauben usw.).
  • 2022 Eingesetzte Tauben
    • Hierbei sollte für jeden Flug sichtbar sein, welche Tauben noch oder wieder eingesetzt wurden.

Die folgenden Anweisungen können verwendet werden, um die Tabellen zu erstellen:

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;

Datenquellen

Für dieses Projekt können zwei Quellen von Interesse sein:

Leider sind die Rankingdaten sehr heterogen, variieren je nach Rennverband, Land und manchmal sogar nach Flug, was beispielsweise bei bestimmten Flügen mit anderen Rennverbänden der Fall sein kann, so dass am Ende eine Gesamtrangliste entsteht.

Die Daten aus dem Tipes-Gerät enthalten die registrierten Ankunftszeiten für jede Taube und dienen als Grundlage für die Erstellung der Gesamtrankings. Glücklicherweise sind diese Daten immer konsistent formatiert.

Datenverarbeitung

Methode

Um die teils heterogenen Textdaten konsistent und generisch zu lesen, werden reguläre Ausdrücke verwendet. Durch Definition eines Satzes syntaktischer Regeln, die erkannt und aus den Daten extrahiert werden, können einzelne Textkomponenten anhand spezifischer Trennzeichen (z.B. Leerzeichen) analysiert werden. Da bestimmte Textkomponenten möglicherweise nicht immer vorhanden sind, können sie in den syntaktischen Regeln als «optional» deklariert werden.

Auf der Website https://regex101.com/Sie können diese Regeln erstellen, überprüfen, validieren und testen.

Beispiel für das Testen eines regulären Ausdrucks zum Parsen einer RIRO-Ergebniszeile

Die einzelnen farbcodierten Komponenten können anschließend in nahezu jeder Programmiersprache problemlos verwendet werden.

Lesen der TIPES-Daten

Die Daten der Tipes-Geräte beinhalten nicht nur Ankunftszeiten, sondern listen auch jede Taube auf, die in den Flug eingegeben wurde. Dies bietet eine gute Grundlage für die Statistik, um zu zeigen, ob die Taube tatsächlich in den jeweiligen Flug eingegeben worden ist.

Tipes Beispieldaten (Flugdatum in Grün, Ankunftszeit in Gelb und Taubenzahl in Rot)

Für dieses spezielle Format hat sich der folgende reguläre Ausdruck als hilfreich erwiesen:

^([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.]*)$

Die detaillierten Anweisungen zur Verarbeitung finden Sie im öffentlichen GitHub-Repository.

Leseleistungsdaten (riro)

Beispielhafte Rankingdaten von RIRO

Für dieses Format hat sich der folgende reguläre Ausdruck als nützlich erwiesen:

^(\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*)$

Dies ermöglicht die strukturierte Extraktion von:

  • Taubennummer (einschließlich Nationalität, Geschlecht und Geburtsjahr)
  • Ränge (Regional-, Gruppen- usw.)
  • Asspunkte (Regional-, Gruppen- usw.)
  • Drehzahl
  • Name des Züchters
  • …

Detaillierte Anweisungen zur Verarbeitung finden Sie im öffentlichen GitHub-Repository.

Datenaggregation

Nachdem nun alle notwendigen Daten in die MySQL-Datenbank importiert wurden, ist es wichtig, sie in einem geeigneten Format zu visualisieren. So kann beispielsweise eine Abfrage der Ergebnisse pro Taube und Flug und deren Aggregation in einer Tabelle wie folgt erreicht werden:

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

Datenvisualisierung

Die Ergebnisse der SQL-Abfrage können bei Bedarf weiter transformiert und aggregiert werden und dann beispielsweise als HTML/JavaScript/CSS-Website ausgegeben werden.

Beispiel-Website mit den aggregierten Ergebnissen (das Endprodukt)

Um diesen druckbar zu machen, habe ich auch einen «PDF Export»-Button implementiert. Die Ausgabe ist vielleicht nicht schön, aber sie ist funktional.

PDF Output

Jetzt sind alle Schritte abgeschlossen, und Sie können die Website nach jedem Flug mit wenigen Klicks mit den relevanten Daten in MySQL importieren, verarbeiten und schließlich aktualisieren. Beispiele für diese Websites finden Sie unter: https://patrick-hirschi.ch/brieftauben/

Archivierter Originalbeitrag. Medien- und Bildnachweise im Beitrag bleiben erhalten.

← Journal