Es gibt zwei beliebte Turniere im Fußball: die Champions League und die Europa League. Basierend auf ihren Ergebnissen wird die sogenannte
Bewertung von Fußballverbänden berechnet. Basierend auf dieser Bewertung wird ferner bestimmt, wie viele Teams aus jedem Land an nachfolgenden Turnieren teilnehmen werden.
In diesem Artikel werde ich eine Anwendung erstellen, die auf der offenen und kostenlosen
lsFusion- Plattform basiert und diese Bewertung berechnet. Es speichert alle seine Daten in PostgreSQL, bietet eine Weboberfläche zum Ändern und Anzeigen mit Filter- und Sortierfunktionen sowie den Import von Übereinstimmungsergebnissen mithilfe einer speziellen API.
Der gesamte Code zur Implementierung dieser Anwendung besteht aus etwa 300 signifikanten Zeilen.
Domänenlogik
Die Erstellung eines Informationssystems beginnt mit der Aufgabe der Domänenlogik.
Zunächst ist es logisch, die einfachsten Verzeichnisse auszuwählen, die nur einen Code und einen Namen haben:
- Turnier Champions League oder Europa League.
- Saison . 2018-2019 / 2017-2018 usw.
- Rund . Finale, Halbfinale, Gruppenphase usw. Es kann als Komposition für das Turnier betrachtet werden, aber in dieser Implementierung habe ich es als separate Einheit herausgegriffen.
- Land Diese Anwendung wird als Fußballverband verwendet. Zum Beispiel befindet sich der Verein von Monaco im Land von Monaco, spielt aber in der französischen Meisterschaft.
- Club Barcelona, Real Madrid, Manchester United usw.
Da lsFusion dieselbe Art von Logik verwendet, um sie zu deklarieren, deklarieren wir einen Metacode (oder eine Codevorlage), der die entsprechende Logik generiert:
Verzeichnisdeklaration Metacode Er wird bekannt geben:
- Klasse mit Vornamen
- Eigenschaften mit Code und Name für die neue Klasse
- Drei Formulare: Bearbeiten eines Objekts, ein Formular mit einer Liste aller Objekte, das dann dem Navigator hinzugefügt wird, ein Dialogfeld zur Auswahl dieses Objekts. Als Dialog können Sie das zweite Formular verwenden, aber dann hat der Benutzer die Möglichkeit, Objekte bei der Auswahl zu ändern, was zu Fehlern seitens der Benutzer führen kann.
Vier Parameter werden an den Metacode übergeben:
- Kennung (Objekt) . Mit diesem Namen werden Klassen und Formulare erstellt. Das Konstrukt ### wird verwendet, um den ersten Buchstaben des Bezeichners im resultierenden Code groß zu schreiben.
- Name im Singular . Wird für den Titel der Klasse und des Formulars verwendet.
- Der Name steht im Plural . Wird für Kombinationsfeld und Dialog verwendet.
- Name Länge . Bei den Namen verschiedener Objekte werden unterschiedliche Längen erwartet, was beim Erstellen der Schnittstelle wichtig ist.
Fügen Sie mithilfe des erstellten Metacodes die fünf oben beschriebenen Entitäten hinzu:
Der generierte Code für ein Turnier sieht beispielsweise folgendermaßen aus:
Fügen Sie der generierten Clublogik den Link zum Land hinzu. Erstellen Sie dazu zunächst die entsprechende Eigenschaft, die Sie dann in die Bearbeitungs- und Anzeigeformulare des Clubs einfügen:
Wir legen die gesamte erstellte Logik in einem separaten Master-Modul (Datei Master.lsf) ab.
Erstellen Sie nun eine Entitätsliga. Sie wird das Turnier einer bestimmten Saison bestimmen. Zum Beispiel Champions League 2017-18 oder Europa League 2018-19. Die Liga hat keinen Namen, sondern nur Links zum Turnier und zur Saison. Daher werden wir den vorherigen Metacode nicht verwenden, aber wir werden dieselbe Logik ausführen und sie in das neue Ligamodul einfügen:
Und schließlich fügen Sie die Logik der Übereinstimmungen hinzu. Erstellen Sie dazu die Klasse
Match , die sich auf die Liga und die Runde bezieht. Für ihn werden auch die Vereine, die daran teilgenommen haben, und das Ergebnis gefragt. Wir haben dies alles in einem separaten Match-Modul zusammengefasst:
Datenimport
Leider konnte ich nur eine öffentliche und kostenlose API finden, die alle Eurocups unterstützt. Dies ist
die Fußball-API . Es gibt jedoch Probleme:
- Bis 2016 liegen keine Ergebnisse vor.
- Bis 2018 gibt es keine Qualifikationen für die Europa League.
- Es gibt bestimmte Fehler in den Daten. Zum Beispiel wird Irtysch Pavlodar Russland zugewiesen, obwohl dieser Verein Kasachstan vertritt. Außerdem bezieht sich Europa Fc aus irgendeinem Grund auf Spanien anstelle von Gibraltar.
Datenfehler können mithilfe zuvor erstellter Formulare manuell korrigiert werden. Da die Berechnung des Gesamtkoeffizienten jedoch auf den letzten fünf Jahren basiert, funktioniert es leider nicht, den Gesamtkoeffizienten aus den API Football-Daten zu berechnen. Wenn jemand in den Kommentaren vorschlägt, wo er die erforderlichen Daten in einem beliebigen Format aus den vergangenen Jahren erhalten kann, bin ich sehr dankbar. Da jedoch vollständige Daten für 2018 vorliegen, kann die Richtigkeit der Berechnung mindestens für dieses Jahr überprüft werden.
Die von uns benötigte API wird in Form von HTTP-Anfragen implementiert, bei denen Parameter per URL übertragen werden und ein spezieller Zugriffsschlüssel im Header angegeben ist. Deklarieren Sie die entsprechende Logik:
Alle Datenimportaktionen werden auf dem zuvor erstellten
Ligenformular platziert . Dort platzieren wir den Zugriffsschlüssel in der Symbolleiste der Tabelle mit der Liste der Ligen:
Zunächst implementieren wir die Liste der Ligen. Dafür hat die Fußball-API eine spezielle URL: / Ligen. Eine GET-Anforderung gibt JSON des Formulars zurück:
Die Antwort { "api":{ "results":2, "leagues":[ { "league_id":1, "name":"2018 Russia World Cup", "country":"World", "country_code":null, "season":2018, "season_start":"2018-06-14", "season_end":"2018-07-15", "logo":"https://www.api-football.com/public/leagues/1.png", "flag":null, "standings":0, "is_current":1 }, { "league_id":2, "name":"Premier League", "country":"England", "country_code":"GB", "season":2018, "season_start":"2018-08-10", "season_end":"2019-05-12", "logo":"https://www.api-football.com/public/leagues/2.png", "flag":"https://www.api-football.com/public/flags/gb.svg", "standings":1, "is_current":1 } ] } }
Um eine GET-Anforderung zu generieren und den Antworttext aufzuzeichnen, wird die folgende Konstruktion verwendet:
Das
Ergebnis wird ohne Parameter vom Typ FILE in die lokale
Ergebniseigenschaft geschrieben .
Um eine Datei im JSON-Format zu analysieren, wird ein Formular erstellt, dessen Struktur der JSON-Struktur entspricht. Sie können es in der IDE über den Menüpunkt generieren:

Für den obigen JSON sieht das Formular folgendermaßen aus (wobei nur die Werte berücksichtigt werden, die importiert werden):
Verwenden Sie den folgenden Befehl
, um direkt aus der JSON-
Ergebniseigenschaft im Format des
importLeagues- Formulars zu
importieren :
Nach der Ausführung werden die entsprechenden Werte aus der JSON-Datei in den Eigenschaften
TournamentName ,
SeasonName und
LeagueId abgelegt :

Das heißt, der Wert für
Turniername (0) ist "Weltmeisterschaft" und in
Turniername (1) ist es "Premier League".
Leider hat API Football überhaupt keine Turniereinheit. Die einzige Möglichkeit, alle Ligen zu verknüpfen, besteht darin, einen Namen zu haben, der mit den Ligen desselben Turniers aus verschiedenen Spielzeiten übereinstimmt. Dazu gruppieren wir beim Import zunächst alle Namen der importierten Ligen und erstellen, falls nicht in der Datenbank, neue Turniere:
Es gibt auch keine Codes für die Jahreszeiten. Wenn Sie also Ligen importieren, werden diese auf die gleiche Weise erstellt. Nachdem die fehlenden Objekte erstellt wurden, werden die Ligen direkt importiert. Turniere und Spielzeiten werden anhand der zuvor von
GROUP AGGR erstellten Eigenschaften nach Namen
durchsucht :
Standardmäßig werden die Daten geladen, jedoch nur in der Datenbank gespeichert, wenn der Benutzer im Formular auf die Schaltfläche Speichern klickt. Bei Bedarf können Sie den Befehl
APPLY am Ende der Aktion hinzufügen, damit er ohne Vorschau sofort in der Datenbank gespeichert wird.
Und schließlich fügen Sie die Importaktion zum Ligalistenformular hinzu:
Ebenso importieren wir Vereine und Spiele. Da die API jedoch die Möglichkeit bietet, sie nur für eine bestimmte Liga zu importieren, muss die Aktion die Liga als Eingabe verwenden:
Vereine und Spiele importierenEs gibt eine Besonderheit für Spiele:
Teamcodes befinden sich in zusätzlichen
homeTeam- und
awayTeam-Tags . Entsprechend der API werden für sie entsprechende Gruppen erstellt. Außerdem haben sie im Inneren die gleichen
team_id- Tags. Da dem Formular keine Eigenschaften mit demselben Namen hinzugefügt werden können, wird das spezielle Schlüsselwort
EXTID verwendet , das den Tag-Namen im importierten JSON definiert.
Damit alle Importe in derselben Form vorliegen und an Ligen gebunden sind, nehmen wir sie alle in dieselbe Form. Außerdem fügen wir dem Formular Teams und Spiele hinzu, um zu sehen, was vor dem Speichern importiert wird:
Das resultierende Formular sieht folgendermaßen aus:

Alle Importe werden in ein separates APIFootball-Modul gestellt.
Koeffizientenberechnung
Wir fahren direkt mit der Berechnung des UEFA-Länderkoeffizienten fort. Es ist logisch, den gesamten Code dafür in ein speziell installiertes UEFA-Modul zu stellen.
Denken Sie zunächst daran, dass die Fußball-API eine Schnittstelle zum Importieren aller Spiele und nicht nur von Eurocups bietet. Daher trennen wir Eurocup-Spiele nach dem Namen des Turniers (es ist korrekter, eine separate primäre Eigenschaft dafür zu haben, aber die Implementierung der Eigenschaften kann immer geändert werden, ohne den Rest der Logik zu ändern):
Berechnen wir zunächst die Punkte, die jeder Verein in einer Saison für die Ergebnisse bestimmter Spiele erhält.
Während dieser Zeit erhält jedes Team:
2 Punkte im Falle eines Sieges;
1 Punkt bei Gleichstand.
Seit 1999 werden diese Punkte zweigeteilt, wenn sie in Qualifikationsrunden gesammelt werden, dh:
1 Punkt im Falle eines Sieges;
0,5 Punkte für ein Unentschieden.
Erstellen Sie zusätzliche Eigenschaften, die die Beziehung zwischen dem Spiel und dem Verein bestimmen:
Um zu bestimmen, wie viele Punkte in jedem Spiel erzielt werden, fügen wir die primäre Eigenschaft des numerischen Typs für die Runde hinzu, die standardmäßig gleich eins ist:
Dann zählen wir Punkte für Siege und Unentschieden und addieren:
Punkte für Übereinstimmungen werden als MATERIALISIERT markiert, damit sie in der Tabelle gespeichert und nicht jedes Mal berechnet werden.
Jetzt müssen Sie Bonuspunkte zählen:
Zusätzlich werden Bonuspunkte vergeben:
1 Punkt wird vergeben, wenn die Mannschaft das Viertelfinale, das Halbfinale und das Finale im Europapokal erreicht.
4 Punkte für das Erreichen der Gruppenphase der Champions League (bis 1996 - 2 Punkte von 1997 bis 2003 - 1 Punkt von 2004 bis 2008 - 3 Punkte);
5 Punkte für den Fall, dass eine Mannschaft das Achtelfinale der Champions League erreicht (vor 2008 - 1 Punkt).
Es werden nur gespielte Spiele berücksichtigt (technische Verluste werden nicht berücksichtigt). Spiele, die bei der Berechnung des Koeffizienten in einer Reihe von Elfmeterschießen enden, werden gemäß dem Ergebnis berücksichtigt, das durch die Ergebnisse des Spiels in der Haupt- und Verlängerung festgelegt wird.
Bei dieser Implementierung gehen wir davon aus, dass der Verein in die Runde des Turniers gegangen ist, wenn er mindestens ein Spiel in diesem Turnier gespielt hat. Dazu berechnen wir, wie viele Spiele der Verein in einer bestimmten Saison, einem bestimmten Turnier oder einer bestimmten Runde gespielt hat:
Jetzt müssen Sie bestimmen, wie viele Punkte für die Passage in einer bestimmten Runde erzielt werden sollen. Da es vom Turnier abhängt (zum Beispiel erhält eine Passage in der ⅛ Champions League 5 Punkte, aber nichts in der Europa League). Dazu führen wir die primäre Eigenschaft ein:
Berechnen wir nun die Bonuspunkte und die Gesamtzahl der Punkte für den Verein für die Saison:
Schließlich gehen wir direkt zum Länderkoeffizienten.
Zur Berechnung der Bewertung des Verbandes werden alle Punkte der an der Champions League und der Europa League teilnehmenden Vereine addiert und das Ergebnis durch die Anzahl der Vereine dieses Verbandes geteilt [2] [3].
Berechnen wir die Anzahl der Vereine für jeden Verband, der an europäischen Wettbewerben teilgenommen hat:
Nun betrachten wir die Gesamtzahl der Assoziationspunkte für die Saison und dividieren durch die Anzahl der Vereine:
Das Rating eines Landes ist die Summe der Koeffizienten des Landes für die letzten 5 Jahre.
Dazu nummerieren wir alle Jahreszeiten beginnend mit der letzten durch den internen Code (wir gehen davon aus, dass letztere später hinzugefügt wurden und einen größeren Code haben):
Bei Bedarf können Sie ein separates Feld oder eine Nummer nach Namen eingeben.
Es bleibt nur die endgültige Bewertung für das Land zu berechnen:
Oben haben wir Quoten für Turniere und Runden angekündigt. Fügen Sie sie dem Turnierbearbeitungsformular hinzu, während Sie nur die Runden filtern, die in diesen Turnieren enthalten waren:
Quoteneinstellungen, zum Beispiel für die Champions League, müssen Sie wie folgt einstellen:

Zeichnen wir ein Formular, in dem die Bewertung angezeigt wird, in der die Teams für jedes Land und für jedes Team seine Spiele angezeigt werden:
Das resultierende Formular sieht folgendermaßen aus:

Die Farbe in den Tabellen der Vereine zeigt, wann er an den Spielzeiten teilgenommen hat, und in der Tabelle der Spiele - wer hat gewonnen.
Das Bild zeigt, dass die Bewertungen für 2018 genauso berechnet werden wie bei Wikipedia. Wie bereits erwähnt, bietet die Football API in den vergangenen Jahren nicht alle Informationen.
Zusammenfassung
Wir haben eine kleine Anwendung erstellt, die im obigen Code vollständig beschrieben ist und deren Daten in PostgreSQL speichert. Sie bietet eine Weboberfläche zum Anzeigen und Bearbeiten von Daten. Gleichzeitig funktioniert es effektiv bei großen Volumes, da alle Formulare nur das sichtbare Fenster lesen. Ebenfalls sofort einsatzbereit sind Filter, Sortieren, Hochladen in Excel und vieles mehr.
Es sollte beachtet werden, wie einfach die Aufgabe der Berechnung des Koeffizienten unter Verwendung der Plattform in einzelne Eigenschaften zerlegt wurde. Bei der Ausführung wird diese gesamte Logik in SQL-Abfragen übersetzt, und alle Berechnungen werden unter Verwendung aller DBMS-Optimierungen direkt auf dem Datenbankserver ausgeführt.
Ein Beispiel für die Funktionsweise der Anwendung mit den darin geladenen Daten finden Sie unter:
https://demo.lsfusion.org/euroleague . Gast Login ohne Passwort. Der Benutzer befindet sich im schreibgeschützten Modus.
Wer möchte, kann sich alles lokal
einstellen und beispielsweise die Koeffizienten durch Eingabe der Ergebnisse zukünftiger Übereinstimmungen modellieren. Alle oben beschriebenen Anwendungsmodule werden auf
github gehostet. Nach der automatischen Installation müssen Sie diese Dateien nur aus den Anweisungen in den entsprechenden Ordner einfügen und den Server neu starten.
Um Daten von der Fußball-API herunterzuladen, müssen Sie sich bei ihnen registrieren und den API-Schlüssel erhalten. Es ist eine Karte erforderlich. Wenn Sie jedoch nicht mehr als 50 Anfragen pro Tag stellen, wird nichts davon abgezogen.
Darüber hinaus können Sie diese Anwendung online im entsprechenden
Abschnitt auf der Website ausführen. Wählen Sie auf der Registerkarte Plattform das Beispiel für die Berechnung der UEFA-Gewinnchancen aus und klicken Sie auf Wiedergabe.
Übrigens, wenn jemand ein einfaches System implementieren muss, für das Excel nicht mehr geeignet ist, dann schreibe in die Kommentare. Um die Funktionen der Plattform kennenzulernen, werden wir versuchen, sie zu implementieren und den entsprechenden Artikel zu schreiben.