Skip to content

Probalistic methods used to simulate Football Leagues using FIFA 20 in-game stats.

License

Notifications You must be signed in to change notification settings

AllenThomasDev/Football-Simulator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

59 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Football-League-Simulator

This Python project enables you to simulate various football leagues from around the world using FIFA 20 stats. The simulator runs week-by-week simulations of matches between all teams in the selected league, resulting in a final output that looks something like this:

Club Matches Played Wins Draws Losses Points GF GA GD
1 Juventus 38 31 1 6 94 113 32 81
2 Napoli 38 26 6 6 84 83 31 52
3 Inter 38 26 5 7 83 93 45 48
4 Milan 38 23 10 5 79 68 25 43
5 Lazio 38 20 7 11 67 82 57 25
6 Torino 38 17 7 14 58 59 45 14
....

How to run the simulator

To run this simulator locally, you need to perform the following steps:

  1. Clone this repository on your local machine:
git clone https://github.com/AllenThomasDev/Football-Simulator.git
  1. Move inside the main project directory:
cd Football-Simulator
  1. Setup and activate your virtual environment (optional):
# To create a virtual env:
python -m venv .venv

# For activation use one of the following commands based on your OS:
source .venv/bin/activate   # On Mac / Linux
.venv\Scripts\activate.bat  # In Windows CMD
.venv\Scripts\Activate.ps1  # In Windows PowerShell
  1. Install the required packages from the requirements.txt file:
pip install -r requirements.txt
  1. Start the simulator by running: python simulator

How does it work

The simulator employs a probabilistic approach to simulate match events. The probabilities of different events occurring in a match are calculated minute by minute. These probabilities are then scaled based on the teams' strengths, and the match is simulated.

For example, the probabilities of different events for the 72nd minute:

 72: {'Away': {'Events': {'Attempt': 0.21580320536712636,
                          'Corner': 0.07957510249720462,
                          'Failed through ball': 0.03745806932538204,
                          'Foul': 0.23108460678345136,
                          'Free kick won': 0.23518449496831906,
                          'Hand ball': 0.01360417443160641,
                          'Key Pass': 0.15933656354826686,
                          'Offside': 0.03745806932538204,
                          'Own goal': 0.0003727171077152441,
                          'Penalty conceded': 0.0018635855385762206,
                          'Red card': 0.002422661200149087,
                          'Second yellow card': 0.0,
                          'Sending off': 0.0039135296310100634,
                          'Substitution': 0.1334327245620574,
                          'Yellow card': 0.049571375326127466},
               'Probability': 0.48569876900796527},
      'Event': 0.011740589091071393,
      'Home': {'Events':{....}}}

Such probabilities have been calculated for each minute from 0 to 100.
As of 14/06/2020 one or more events may occur in a single minute.

leagues = {
    "spain": {
        "name": "La Liga Santander",
        "teams": [
            "Real Madrid",
            "FC Barcelona",
            "Valencia CF",
            "Atlético Madrid",
            "RC Celta",
            "Real Betis",
            "Villarreal CF",
            "Real Sociedad",
            "Athletic Club de Bilbao",
            "Deportivo Alavés",
            "Getafe CF",
            "Sevilla FC",
            "Levante UD",
            "Granada CF",
            "CA Osasuna",
            "Real Valladolid CF",
            "RCD Espanyol",
            "SD Eibar",
            "RCD Mallorca",
            "CD Leganés",
        ],
    },
   ...

Currently, simulate_match() will simulate the match in its entirety and update the league table. But there are functions that can be used to see the timeline of a match as it happens. In future builds the user will be able to take charge of a particular team and see the events of any game that he is involved in live.

Supported Leagues

Top 5 Leagues are natively supported:

  • English Premier League
  • La Liga
  • Seria A
  • Bundesliga
  • Ligue 1

You can also create a custom league (like UCL) by picking different teams from all the available leagues. There is no theoretical limit to the number of teams, but try to limit the number of teams to 100 and ideally try to have an even number of teams. To make this work you will have to edit constants/leagues.py and add your league to it. Ensure that you use the correct team name. For example, 'Man Utd' will not work, you will have to use 'Manchester United' because that is how it is stored.

To see the list of all valid team names, you can execute the following command:

python simulator/scripts/all_teams.py

Sample Output

Following is the output of a fully simulated league:

Screenshot (2)

Feedback and Support

Please feel free to play around with the code and let me know if you find any issues or if you need some help with certain functions.
You can contact me at allen.thomas.dev@gmail.com

About

Probalistic methods used to simulate Football Leagues using FIFA 20 in-game stats.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •  

Languages