MeisterTrainerForum

Bitte loggen sie sich ein oder registrieren sie sich.

Einloggen mit Benutzername, Passwort und Sitzungslänge
Erweiterte Suche  

Autor Thema: Scouting mit Python  (Gelesen 1351 mal)

Rote_Hose

  • Hobbyspieler
  • **
  • Offline Offline
Scouting mit Python
« am: 09.März 2024, 11:27:30 »

Hallo zusammen,

nach langer Inaktivität poste ich hier mal wieder etwas, weil ich grade eine neue Art den FM zu spielen für mich entdeckt habe und mir gedacht habe, das mit euch zu teilen. (Anders gesagt: In meinem Umfeld tendiert die Anzahl interessierter Personen gegen 0 und vielleicht findet ja hier der/ die ein oder andere den Ansatz spannend ;-) ) Auf die Idee, mithilfe von Python-Scripts bestimmte Bereiche des FM neu zu spielen, bin ich gekommen, als ich eher zufällig in einem Video gesehen habe, dass man Daten ziemlich einfach aus dem FM exportieren kann. Vor Jahren gab es schonmal einen Thread für die Excel-Fans hier und auch wenn ich mich da durchaus zuzähle, war mir das händische Übertragen immer zu mühselig. Das geht jetzt jedoch schon fast berauschend einfach. Steuerung + p drücken und schon fragt das Spiel zum Beispiel im Mannschaftsscreen, in welchem Format die Daten gespeichert werden sollen. Das klappt für alle Arten von Spalten, die man sich im Mannschaftsscreen, beim Scouting oder ähnlichem anzeigen lassen kann. Da war meine Neugierde natürlich geweckt, das Thema Scouting und Spielerbewertung mal ganz anders anzugehen.


Auswalmöglichkeit zum Exportieren von Tabellen


Die geöffnete noch recht unübersichtliche Tabelle als HTML-Datei mit den Rohdaten - Hier ein Beispiel aus dem Scouting-Bereich.

Vorab würde ich gerne noch sagen, dass ich noch den FM22 spiele, sich aber meines Erachtens das allermeiste 1:1 auf andere FMs übertragen lassen müsste. Ich habe im FM22 viele Spielstunden verbracht. Für mich ist das Experimentieren mit Python eine Möglichkeit, einem „durchgespielten“ Spiel eine neue Facette zu geben. Ohne persönliche Einschränkungen scheint mir, dass das Spiel dadurch aber womöglich zu leicht wird.

So nun aber ans Eingemachte ;-)

Mit der Entdeckung, dass alle Werte und Informationen in einer Ansicht exportiert werden können, habe ich als erstes mit Excel herumprobiert. Ich habe mir als erstes für meine neu übernommene Mannschaft (Lautern, mit Datenbankmod in der 2. Liga, Stand zur Saison 22/23) die Mannschaftsansicht angesehen und als Spalten sämtliche sichtbaren Attribute eingestellt. Das ist zwar unübersichtlich, aber meine Idee war, aus diesen Attributen eine positions- und rollenabhängige Spielerbewertung berechnen zu lassen. Also habe ich die Mannschaftsübersicht per strg + p als html exportiert und die html-Tabelle dann in Excel geöffnet. So weit so gut, mir war allerdings auf Dauer das Prozedere zu umständlich, erst die html zu öffnen, dann die ewig langen Formeln in Excel einzugeben bzw. jedes Mal neu reinzukopieren, wenn ich die Mannschaftsübersicht aktualisiere. Und da kam dann Python ins Spiel.

Ich habe ohnehin nach einem Grund gesucht, mich mal wieder mit Python zu beschäftigen, zuletzt war das vor Jahren in der Uni der Fall. Und man, ich wusste fast gar nix mehr, aber der FM ist halt auch eine gute Motivation für allerlei Quatsch. (Mich und meine Freunde als Wonderkids erstellen und gucken, wer es am weitesten in 20 simulierten Saisons bringt? Check). Außerdem taugt ChatGPT ziemlich gut als Lernhilfe in Sachen Python. Jedenfalls habe ich mir ein Script gebastelt, das die html-Datei mit den Mannschaftsinfos importiert, in ein Datenfile umwandelt, die Abkürzungen für die Attribute in verständliche Worte umwandelt, aus den unterschiedlich gewichteten Attributen für jeden Spieler für alle Positionen meiner Taktik einen Wert errechnet, dann alle unnötigen Spalten, darunter die Attribute, löscht und schließlich eine csv-Datei erstellt, in der wenig anderes als die Spielernamen und ihre Bewertung für die einzelnen Positionen steht. In Excel geöffnet sieht das dann so aus:


Mein Kader in der ersten Saisonhälfte der 2. Saison inklusive Jugend und 2. Mannschaft. Sortiert ist die Tabelle nach der Fähigkeit, im defensiven Mittelfeld zu spielen. Keitel als bester Spieler für die Position ist zudem ein guter Allrounder, anders als z. B. Benedikt Gimber, der vor allem als IV seine Stärken hat, insgesamt aber ein starker Spieler ist. Interessant ist auch: Mit Georg Reiter (Zeile 24) habe ich einen 16-Jährigen NewGen, der bereits für sein Alter über eine ordentliche Stärke als Schattenstürmer verfügt. Anmerkung: Die fehlenden Umlaute und Sonderzeichen sind ein Excel Problem, in der csv sind sie enthalten. Über die Import-Funktion können die auch bei Excel angezeigt werden.

Für eine bessere Übersichtlichkeit, färbe ich mit bedingter Formatierung in Excel die ganze Tabelle ein, damit die höchsten Werte grün, die niedrigsten rot sind. So erkenne ich leichter, wer welche Positionen gut spielen kann.
Die Fähigkeit für jeden Spieler kann dabei Werte zwischen 1 und 20 annehmen, eine Stärke von 1 hätte ein Spieler, der bei allen sichtbaren Attributen 1 hat, eine 20 ein Spieler mit einer 20 bei jedem sichtbaren Attribut. Die Gewichtung der einzelnen Attribute erfolgt positions- und rollenabhängig. Die Gewichtung habe ich nach eigenem Gefühl und den Ingame-Angaben zu den wichtigsten Attributen pro Rolle und Position gesetzt. Die Gewichtung ist dabei nicht starr, ich verändere sie hin und wieder. Als wichtig empfand ich, dass ich nicht nur die klassisch wichtigsten Attribute einbeziehe (z. B, Abschluss, Nervenstärke, … bei Angreifern), sondern dass auch zum Beispiel Tackling in die Wertung für einen Angreifer eingeht, wenn auch viel weniger stark gewichtet (bei mir Gewichtung von 1 für Tackling, 10 für Abschluss bei Angreifern). Schließlich gibt es selten, dann aber mitunter riesige Chancen, wenn mein Knipser es schafft, einem Innenverteidiger den Ball abzujagen. Dies führt dazu, dass gute Spieler meist auf vielen Positionen gute Werte haben, reine Spezialisten werden durch diese Art der Bewertung eher benachteiligt. Durch Änderung der Gewichtung im Script ließe sich das aber leicht anpassen.


Ausschnitt aus dem Python-Script. Unten sieht man die Gewichtung der einzelnen Attribute bei Torhütern. Damit es für mich übersichtlich ist, habe ich den einzelnen Attributen Kategorien zugeordnet, aus denen dann die Gesamtstärke berechnet wird. Die Kategorien „Offensive“, „Defensive“ und „Standards“ gehen für Torhüter mit der Gewichtung 0 ein, die einzelnen Attribute spielen für Torhüter also keine Rolle. Bei z. B. Agilitaet sieht man, dass ich „Antritt“ für Torhüter viel stärker gewichte als „Schnelligkeit“, weil ich denke, dass ein Torhüter vor allem schnell beschleunigen muss.

Was habe ich nun damit gekonnt: Ich erzeuge damit auf den ersten Blick eine Übersicht über meinen ganzen Kader inklusive Nachwuchs und 2. Mannschaft. Ich sehe, wer was gut spielen kann oder könnte, wenn er auf der entsprechenden Position trainiert wird. Auch ist schnell ersichtlich, welche jungen Spieler schon eine ordentliche Stärke mitbringen und ich finde auf einen Blick Spieler aus der 2. Mannschaft, die Lücken in meinem Kader füllen können. Bemerkenswert ist dabei, wie stark sich teilweise die Bewertung durch die Assistenztrainer und Cotrainer von der berechneten Bewertung unterscheidet, wobei die Fähigkeiteneinschätzung bei den Trainern in Liga 2 auch nicht überragend ist.
Außerdem hatte das Ganze noch einen Effekt für mich interessanten Effekt: Ich nehme die Spieler anders war, als wenn ich nur mit dem Auge die Attribute betrachte. Ich gebe es zu: viel grün blendet mich mitunter. Habe ich im Zweitligakader einen Spieler, der vier, fünf saftig grüne Werte bei den technischen Attributen mitbringt, macht das einen besseren Eindruck als beim mausgrauen Konkurrenten, der dafür aber vielleicht auch deutlich weniger klare Schwächen aufweist. Mein Wahrnehmungsbias wird dadurch ein wenig korrigiert. Übrigens: Freistöße, Ecken, Elfmeter und Einwürfe gehen bei mir für keine Position in die Wertung ein, sind aber gerne mal „Blender“ beim ersten Eindruck eines Spielers.

Für mich war die Übersicht ein wirklich schöner Effekt, weil gerade das Einarbeiten in einen neu übernommenen Verein sonst viel Zeit in Anspruch nimmt und mir nun neue Perspektiven eröffnet waren, vor allem was die zweite Mannschaft und die Jugend betrifft. Mehrere Spieler habe ich in die erste Mannschaft integriert, die mir sonst wahrscheinlich entgangen wären. Ein Spieler aus der zweiten Reihe (Muhammad Kiprit) wurde dann auch mein bester Torschütze.

Der nächste Schritt war natürlich dann nur folgerichtig: Wenn ich die Wertung für meine Mannschaft vornehmen kann, dann natürlich auch für gescoutete Spieler. Also habe ich das gemacht, um mich auf die Suche z. B. nach einem neuen Torwart zu begeben, weil Luthe nach der Winterpause verkündete, sich lieber auf die Bank bei Hertha (Hertha? wirklich?!) zu setzen, statt mein besser dotiertes Angebot anzunehmen. So gut wie Luthe im FM22 war, fand ich keinen anderen gleich guten Spieler, aber als beste Option mit Luca Unbehaun doch zumindest einen Ersatz mit Potential. Das Problem war nur, dass meine Scouts und meine Kentnisse begrenzt waren und ich bei nur wenigen Spielern alle Attribute voll aufgedeckt hatte. Also habe ich das Script erweitert, um bei Wertebereichen den Mittelwert als Berechnungsgrundlage zu nutzen. Sehe ich also zum Beispiel bei einem Spieler einen Bereich von 10-13 in Abschluss wird für Abschluss eine 11,5 als Berechnungsgrundlage genutzt. Das veränderte beim Scouting so ziemlich alles.


Hier ein Beispiel aus dem Scouting-Screen. Obwohl ich bei vielen Spielern nicht genügend Kenntnis habe, kann ich trotzdem über eine gemittelte Gesamtstärke herausfinden, wer ein weiteres Scouting wert sein könnte. Der ganze Ablauf (Exportieren, Script durchlaufen lassen, in Excel öffnen dauert nur wenige Sekunden.

Ich stieg mit Lautern in der ersten Saison in die Bundesliga auf. Weil es mir in diesem Spielstand weniger um taktische Finessen, als das Erkunden der neuen Möglichkeiten ging, verwendete ich eine Standard-läuft-gut-Taktik und zusammen mit einer fast absurden Übererfüllung der xGoals Werte landete ich überraschend in der Bundesliga. Bei 1 Mio € Transferbudget und 12 Mio Gehaltsbudget war das eine Herausforderung. Meine Außenverteidigung war zu dünn besetzt, auch das defensive Mittelfeld und die Innenverteidigung. Geld war kaum welches da. Also habe ich das Script erweitert und den Transferwert und das Alter der Spieler mit eingefügt. „Suche Spieler mit ordentlichen Fähigkeiten für wenig Geld“ war danach deutlich einfacher, hier nur ein paar Beispiele: Union will van Drongelen nicht mehr, er ist aber besser als mein LV? Willkommen für 150.000 € im Team! Yannick Keitel kann auch Außenverteidiger? Ab mit ihm zur Umschulung! Benedikt Gimber aus Liga 2 verlangt nicht viel, wäre aber adhoc der beste IV? Perfekt! Meine Scouts sagen, dass Niclas Stierlin und Dennis Lippert (nie zuvor gehört) als 3. Ligaspieler nicht das erforderliche Niveau als Backups haben? Egal, meine Tabelle sagt sie sind gut genug und günstig. Mehr als Attribute aufdecken, die Persönlickeit, das Potenzial und die Verletzunganfälligkeit einschätzen müssen die Scouts nicht mehr. Insgesamt habe ich 6 Spieler verpflichtet für 2,2Mio €, bei 1,8Mio Einnahmen durch Spielerverkäufe. Die Spieler erfüllen ihre Aufgaben sehr ordentlich, wir stehen zur Winterpause auf Platz 12, obwohl niemand vorher an den Klassenerhalt geglaubt hat. Die verpflichteten Spieler sind aktuell nach 15 Spieltagen in der Winterpause 8 bis 14,4 Mio€ wert.


Einer der Neuzugänge aus Liga drei. Hat wenig gekostet, wollte wenig Gehalt, gibt sich mit wenig Einsatzzeiten zufrieden, hat aber trotzdem bereits in 11 von 15 Spielen gespielt. Ist entwicklungsfähig und kann RV, 6er und zur Not ZM spielen.

Ein kleines Fazit: Unabhängig von FM habe ich am Rumexperimentieren in Python gerade richtig Freude, das ist ein bisschen wie ein Spiel im Spiel für mich. Aber auch innerhalb des FM macht es mir aktuell unheimlich viel Spaß, in einem Spielstand systematisch mal so richtig loszuscouten. Darauf verwende ich aktuell mehr Zeit als auf die Spiele. Das Script als Hilfestellung ist dabei vor allem eine Erleichterung bzw. Automatisierung von Suchprozessen über die sonst üblichen Begrenzungen (Liga, Scouteinschätzung, …) hinweg. Das, was ich vorher per Auge gemacht habe, wird jetzt nach meinen Vorstellungen berechnet. Mit schmalen Mitteln viel herauszuholen, ist dabei besonders motivierend, wobei ich glaube, dass das ganze Sytem auch mit größeren oder kleineren Budgets/ Vereinen gut klappen kann. Mir sind zum Beispiel starke, aber vergleichsweise günstige Talente durch die Lappen gegangen, weil ich mehr als ein paar hunderttausend Euro dann eben doch nicht ausgeben konnte/ wollte. Für die persönliche Einschätzung bleibt bei all dem immer noch Raum, einerseits, weil ich selbst die Gewichtung der Attribute vornehme, andererseits weil die Vorschläge aus der erstellten Tabelle letztlich auf allerlei andere Faktoren rund um die Attribute gecheckt werden wollen. Wichtig bleiben dabei die Scouteinschätzungen zur Persönlichkeit, der Verletzungsanfälligkeit, der Vielseitigkeit, dem Potential usw. Nur weil ein Spieler eine gute Bewertung in meiner Tabelle hat, ist er noch keine gute Verpflichtung. Aber wenn er eine ist, finde ich ihn sehr wahrscheinlich.
Zugleich wird das Spiel damit ohne zusätzliche Limitierungen gefühlt deutlich leichter, weil ich verhältnismäßig starke Spieler finde, die ich preiswert verpflichten kann. Aus diesem Grund versuche ich, mich auf sehr günstige und möglichst Deutsch sprechende Spieler zu konzentrieren, um den Realismus für einen Verein wie Lautern nicht ganz aus den Augen zu verlieren. Ich bin gespannt, wie weit ich mit dem Ansatz kommen kann. An den ganz großen Zielen (z. B. langfristig ein Championsleague-Sieg mit einem Zweitligisten o. ä.) bin ich dann doch bisher immer gescheitert. Vielleicht klappt es ja so.

Falls euch der Ansatz interessiert oder ihr schon einmal ähnliches ausprobiert habt, freue ich mich auf den Austausch. Wenn ihr mehr zum Script wissen wollt oder zur Gewichtung der Spieler, erzähle ich auch gerne detaillierter, wie ich vorgegangen bin. Ein paar weitere Ideen habe ich auch noch, mal gucken, ob sich das Ganze noch erweitern lässt.

Viele Grüße!
« Letzte Änderung: 09.März 2024, 11:48:43 von Rote_Hose »
Gespeichert

never soccer

  • Vertragsamateur
  • ***
  • Offline Offline
Re: Scouting mit Python
« Antwort #1 am: 08.Dezember 2024, 23:47:03 »

Find ich mega interessant. Mal davon abgesehen, dass ich zu doof zum Programmieren bist, fänd ich es geil, wenn du das Script irgendwie zur Verfügung stellen könntest und man seine eigenen exportieren Files einfügen könnte. Nach welchen Kirterien hast du denn vorher gescoutet?

Bzw. fänd ich auch erst mal den View in der Scouting-Übersicht als fmf-Datei interessant.
« Letzte Änderung: 09.Dezember 2024, 00:10:32 von never soccer »
Gespeichert
Stadionfotos & Fußball-Blog | Fußball-Stadien auf Youtube

"Kommissar Schimanski wacht mit dreckiger Unterhose und völlig verkatert zwischen leeren Bierflaschen auf, isst zwei rohe Eier und geht ungewaschen zum Dienst."

Rote_Hose

  • Hobbyspieler
  • **
  • Offline Offline
Re: Scouting mit Python
« Antwort #2 am: 19.Dezember 2024, 17:51:50 »

Hallo never soccer,
da war ich jetzt überrascht, dass sich noch jemand dafür interessiert :D
Ich habe dir und jeden, den es interessiert im Anhang den Scouting-Screen und das Python-Script reingepackt. Um das Script zu nutzen, brauchst du Python(3). Ich nutze Spyder (findet man leicht über google) als IDE, um das Script Durchlaufen zu lassen und zu bearbeiten bzw. da drin die entsprechenden Dateipfade zu meinen zu analysierenden Exporten zu verändern. Sinnvoll ist für jeden, der das Script nutzt, der Bereich ab Zeile 131, denn da ist meine subjektive Gewichtung der einzelnen Atribute für jede Position enthalten. Das kann man natürlich nach eigenem Belieben anpassen. Wenn man das Script nutzen will, muss man in Zeile 6, 118 und 120 passende Dateipfade angeben. Zeile 118 und 120 müssen übereinstimmen, da wird nur eine Zwischenspeicherdatei angelegt, die bei jedem neuen Durchlauf überschrieben wird bzw. auch händisch aus dem entsprechenden Ordner gelöscht werden kann.
Ansonsten noch eine Anmerkung: Das Script exportiert eine CSV im englischen Format (mit Kommata als Trennzeichen). Ein auf deutsche Sprache eingestelltes Betriebssystem sorgt bei Excel dafür, dass er Semikolons als Trennzeichen erwartet und keine vernünftige Tabelle erzeugt. Da hilft die Importieren Funktion oder das kurzzeite Umstellen der Systemsprache auf Englisch.

Und um jetzt vielleicht noch dem einen oder anderen Lust drauf zu machen: Ich habe vorhin das Script nochmal getestet und den FM ein bisschen gequält, indem ich den FM sämtliche Spieler in der Scouting-Suche anzeigen ließ, die meine Scouts mindestens zu 30% kennen, insgesamt sind das knapp über 14.000 Spieler. Mein Script, das mit Sicherheit nicht übermäßig effizient geschrieben ist, lief dann etwa eine Minuten lang und spuckte eine Tabelle mit allen 14k Spielern aus, von denen Moukoko tatsächlich der beste Stürmer der Welt ist, besser sogar als der 30-jährige Mbappe, weil in meiner subjektiven Gewichtung eben auch sowas wie Kopfballstärke, Verteidigung, Mentalität relativ stark in die Gewichtung mit eingeht.
Gespeichert