· SG HIRSCHI
Dados de desempenho (riro.de)
Resumo
Todos os anos, na Suíça, são realizadas 12 corridas com pombos-correio. Analisando os tempos de voo e as distâncias dos pontos de lançamento para o loft doméstico de cada pombo, pode-se calcular a velocidade média para cada pombo. Um terço dos pombos participantes estão listados («prizes»). Os resultados (incluindo velocidades, pontos, etc.) destas corridas são disponibilizados no RIO (http://www.bas-riro.de/).
Usando scripts em Python e expressões regulares (GitHub), os dados de desempenho dos pombos-correio podem ser importados para um banco de dados (aqui, MySQL), agregados e depois formatados como HTML. Isto fornece aos criadores uma visão prática dos resultados dos seus pombos.
Execução
Base de dados
O modelo de dados foi desenhado para ser o mais simples possível. Embora os dados pudessem ser altamente normalizados e digitados, isso seria excessivo para o objetivo final de uma página de resultados em HTML5 / JavaScript / CSS. Portanto, neste caso, apenas duas tabelas foram criadas em um banco de dados MySQL:
- 2022 Flugsaison
- Os resultados para os pombos (ranques, pontos, velocidade, etc.) por voo, juntamente com informações agregadas (número de criadores, número de pombos, etc.).
- 2022 Eingesetzte Tauben
- Aqui, deve ser visível para cada voo que pombos foram usados ainda ou novamente.
As seguintes instruções podem ser usadas para criar as tabelas:
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;
Fontes de Dados
Para este projecto, duas fontes podem ser de interesse:
- Dados de desempenho de http://www.bas-riro.de/
- Dados do dispositivo TIPES https://tipes.de/
Infelizmente, os dados do ranking são muito heterogêneos, variando por associação de corridas, país, e às vezes até mesmo por voo. Por exemplo, isso pode ocorrer quando certos voos são realizados com outras associações de corridas, resultando em uma lista de classificação geral no final.
Os dados do dispositivo Tipes incluem os horários de chegada registrados para cada pombo e servem como base para a criação dos rankings globais. Felizmente, estes dados são sempre formatados consistentemente.
Processamento de Dados
Método
Para ler os dados de texto às vezes heterogêneos consistentemente e genericamente, expressões regulares são usadas. Ao definir um conjunto de regras sintáticas que são reconhecidas e extraídas dos dados, os componentes de texto individuais podem ser analisados com base em delimitadores específicos (por exemplo, espaços). Como certos componentes de texto podem nem sempre estar presentes, eles podem ser declarados como «opcional» nas regras sintácticas.
No sítio web https://regex101.com/, você pode criar, verificar, validar e testar essas regras.

Os componentes individuais codificados por cores podem ser facilmente usados em praticamente qualquer linguagem de programação.
Lendo os dados TIPES
Os dados dos dispositivos Tipes não só incluem os horários de chegada, mas também lista todos os pombos que foram introduzidos no voo. Isto fornece uma boa base para as estatísticas mostrarem se o pombo foi realmente introduzido no respectivo voo. Abaixo está um exemplo:

Para este formato específico, a seguinte expressão regular provou ser útil:
^([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.]*)$
As instruções detalhadas para o processamento podem ser encontradas no repositório GitHub público.
Dados de desempenho lidos (riro)

Para este formato, a seguinte expressão regular provou ser útil:
^(\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*)$
Isto permite a extração estruturada de:
- Número do pombo (incluindo nacionalidade, sexo e ano de nascimento)
- Ranks (regionais, de grupo, etc.)
- Pontos Ace (regional, grupo, etc.)
- Velocidade
- Nome do criador
- …
Instruções detalhadas para o processamento podem ser encontradas no repositório GitHub público..
Agregação de dados
Agora que todos os dados necessários foram importados para o banco de dados MySQL, é importante visualizá-lo em um formato apropriado. Por exemplo, consultar os resultados por pombo e voo e agregando-os em uma tabela pode ser alcançado da seguinte forma:
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
Visualização de Dados
Os resultados da consulta SQL podem ser ainda mais transformados e agregados conforme necessário e então produzidos como um site HTML/JavaScript/CSS, por exemplo.

Para tornar esta impressão, implementei também um botão «PDF Export». A saída pode não ser bonita, mas é funcional.

Agora todos os passos estão completos, e você pode importar, processar e finalmente atualizar o site com os dados relevantes no MySQL após cada voo com apenas alguns cliques. Exemplos desses sites podem ser encontrados em: https://patrick-hirschi.ch/brieftauben/
Artigo original arquivado. Os créditos de mídia no artigo são preservados.
← Jornal