· SG HIRSCHI
Dane dotyczące wydajności (riro.de)
Podsumowanie
Każdego roku w Szwajcarii odbywa się 12 wyścigów z gołębiami domowymi. Analizując czasy lotu i odległości od punktów odblokowania do domu każdego gołębia, można obliczyć średnią prędkość dla każdego gołębia. Jedna trzecia uczestniczących gołębi są wymienione ("nagrody"). Wyniki (w tym prędkości, punkty, itp.) tych wyścigów są dostępne na RIRO (http://www.bas-riro.de/).
Korzystanie ze skryptów Pythona i wyrażeń regularnych (GitHub), dane wydajności gołębi macierzystych mogą być importowane do bazy danych (tutaj, MySQL), zagregowane, a następnie sformatowane jako HTML. Zapewnia to hodowcom praktyczny przegląd wyników ich gołębie.
Wykonanie
Baza danych
Model danych jest zaprojektowany tak, aby był jak najprostszy. Chociaż dane mogą być bardzo znormalizowane i wpisywane, byłoby to nadmierne dla ostatecznego celu strony wyników w HTML5 / JavaScript / CSS. Dlatego w tym przypadku w bazie MySQL stworzono tylko dwie tabele:
- 2022 _ Flugsaison
- Wyniki dla gołębi (szeregi, punkty, prędkość itp.) na lot wraz z zagregowanymi informacjami (liczba hodowców, liczba gołębi itd.).
- 2022 _ Eingesetzte _ Tauben
- Tutaj powinien być widoczny dla każdego lotu, które gołębie były nadal lub ponownie używane.
Do tworzenia tabel można użyć następujących wyrażeń:
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;
Źródła danych
W przypadku tego projektu interesujące mogą być dwa źródła:
- Dane dotyczące osiągów http://www.bas-riro.de/
- Dane z urządzenia TIPES https://tipes.de/
Niestety, dane rankingowe są bardzo niejednorodne, różnią się w zależności od stowarzyszenia wyścigowego, kraju, a czasami nawet lotu. Na przykład, może to nastąpić, gdy niektóre loty są prowadzone z innymi stowarzyszeniami wyścigowymi, co prowadzi do ogólnej listy rankingowej na końcu.
Dane z urządzenia Tipes zawierają zarejestrowane czasy przyjazdu dla każdego gołębia i służy jako podstawa do tworzenia ogólnych rankingów. Na szczęście dane te są zawsze konsekwentnie sformatowane.
Przetwarzanie danych
Metoda
Do odczytywania czasem niejednorodnych danych tekstowych konsekwentnie i w sposób ogólny używane są wyrażenia regularne. Określając zbiór reguł syntaktycznych, które są rozpoznawane i ekstrahowane z danych, poszczególne składniki tekstu mogą być analizowane na podstawie określonych wydzielników (np. spacji). Ponieważ niektóre elementy tekstowe nie zawsze mogą być obecne, można je określić jako "opcjonalne" w regułach syntaktycznych.
Na stronie internetowej https://regex101.com/, można tworzyć, sprawdzać, zatwierdzać i testować te zasady.

Poszczególne kolorowe komponenty można następnie łatwo wykorzystać w praktycznie każdym języku programowania.
Czytanie danych TIPES
Dane z urządzeń Tipes nie tylko zawierają czasy przylotu, ale również wymienia każdego gołębia, który został wprowadzony w locie. Stanowi to dobrą podstawę dla statystyk, aby pokazać, czy gołąb rzeczywiście został wprowadzony w danym locie. Poniżej znajduje się przykład:

Dla tego konkretnego formatu, następujące wyrażenie regularne okazało się pomocne:
^([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.]*)$
Szczegółowe instrukcje dotyczące przetwarzania znajdują się w publicznym repozytorium GitHub.
Odczytywanie danych dotyczących wydajności (riro)

Dla tego formatu następujące wyrażenie regularne okazało się przydatne:
^(\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*)$
Umożliwia to uporządkowane wydobycie:
- Liczba gołębi (w tym narodowość, płeć i rok urodzenia)
- Rangi (regionalne, grupowe itp.)
- Punkty asów (regionalne, grupowe itp.)
- Prędkość
- Nazwa hodowcy
- …
Szczegółowe instrukcje dotyczące przetwarzania można znaleźć w publicznym repozytorium GitHub..
Agregacja danych
Teraz, gdy wszystkie niezbędne dane zostały zaimportowane do bazy danych MySQL, ważne jest, aby je wizualizować w odpowiednim formacie. Na przykład, pytanie o wyniki na gołębia i lotu i agregowanie ich w tabeli można osiągnąć w następujący sposób:
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
Wizualizacja danych
Wyniki zapytania SQL można dalej przekształcać i agregować w razie potrzeby, a następnie na przykład jako strona internetowa HTML / JavaScript / CSS.

Aby to wydrukować, mam również zaimplementowany przycisk "PDF Export". Wyjście może nie być piękne, ale jest funkcjonalne.

Teraz wszystkie kroki są zakończone i można importować, przetwarzać i wreszcie aktualizować stronę internetową z odpowiednimi danymi w MySQL po każdym locie z zaledwie kilkoma kliknięciami. Przykłady tych stron można znaleźć na stronie: https://patrick-hirschi.ch/brieftauben/
Archiwizowany oryginalny artykuł. Media kredytów w artykule są zachowane.
← Dziennik