| | .. _SPADL: |
| |
|
| | SPADL |
| | ===== |
| |
|
| | Definitions |
| | ----------- |
| |
|
| | SPADL (*Soccer Player Action Description Language*) represents a game as |
| | a sequence of on-the-ball actions :math:`[a_1, a_2, . . . , a_m]`, where |
| | :math:`m` is the total number of actions that happened in the game. Each |
| | action is a tuple of the same twelve attributes: |
| |
|
| | .. list-table:: |
| | :widths: 20 80 |
| | :header-rows: 1 |
| |
|
| | * - Attribute |
| | - Description |
| | * - game_id |
| | - the ID of the game in which the action was performed |
| | * - period_id |
| | - the ID of the game period in which the action was performed |
| | * - seconds |
| | - the action's start time |
| | * - player |
| | - the player who performed the action |
| | * - team |
| | - the player's team |
| | * - start_x |
| | - the x location where the action started |
| | * - start_y |
| | - the y location where the action started |
| | * - end_x |
| | - the x location where the action ended |
| | * - end_y |
| | - the y location where the action ended |
| | * - action_type |
| | - the type of the action (e.g., pass, shot, dribble) |
| | * - result |
| | - the result of the action (e.g., success or fail) |
| | * - bodypart |
| | - the player's body part used for the action |
| |
|
| |
|
| | Start and End Locations |
| | SPADL uses a standardized coordinate system with the origin on the bottom |
| | left of the pitch, and a uniform field of 105m x 68m. For direction of play, |
| | SPADL uses the "home team attacks to the right" convention, but this can be |
| | converted conveniently with the :func:`~socceraction.spadl.play_left_to_right` |
| | function such that the lower x-coordinates represent the own half of the team |
| | performing the action. |
| |
|
| | .. image:: spadl_coordinates.png |
| | :width: 500 |
| | :align: center |
| |
|
| |
|
| | Action Type |
| | The action type attribute can have 22 possible values. These are `pass`, |
| | `cross`, `throw-in`, `crossed free kick`, `short free kick`, `crossed |
| | corner`, `short corner`, `take-on`, `foul`, `tackle`, `interception`, |
| | `shot`, `penalty shot`, `free kick` `shot`, `keeper save`, `keeper claim`, |
| | `keeper punch`, `keeper pick-up`, `clearance`, `bad touch`, `dribble` and |
| | `goal kick`. A detailed definition of each action type is available |
| | :doc:`here <SPADL_definitions>`. |
| | Result |
| | The result attribute can either have the value `success`, to indicate that |
| | an action achieved it’s intended result |
| | not the case. An example of a successful action is a pass which reaches |
| | a teammate. An example of an unsuccessful action is a pass which goes over |
| | the sideline. Some action types can have special results. These are |
| | `offside` (for passes, corners and free-kicks), `own goal` (for shots), and |
| | `yellow card` and `red card` (for fouls). |
| | Body Part |
| | The body part attribute can have 4 possible values. These are `foot`, `head`, |
| | `other` and `none`. For Wyscout, which does not distinguish between the |
| | head and other body parts a special body part `head/other` is used. |
| |
|
| | All actions, except for some dribbles, are derived from an event in the |
| | original event stream data. They can be linked back to the original data by |
| | the `original_event_id` attribute. Synthetic dribbles are added to fill gaps |
| | between two events. These synthetic dribbles do not have an |
| | `original_event_id`. |
| |
|
| | Example |
| | ------- |
| |
|
| | Socceraction currently implements converters for |
| | :mod:`StatsBomb <socceraction.spadl.statsbomb>`, |
| | :mod:`Wyscout <socceraction.spadl.wyscout>`, and |
| | :mod:`Opta <socceraction.spadl.opta>` |
| | event stream data. We'll use StatsBomb data to illustrate the API, but the API |
| | of the other converters is identical. |
| | |
| | First, we load the event stream data of the third place play-off in the 2018 |
| | FIFA World Cup between Belgium and England. |
| |
|
| | .. code-block:: python |
| |
|
| | from socceraction.data.statsbomb import StatsBombLoader |
| |
|
| | SBL = StatsBombLoader() |
| | df_events = SBL.events(game_id=8657) |
| |
|
| | These events can now be converted to SPADL using the :func:`~socceraction.spadl.statsbomb.convert_to_actions` |
| | function of the StatsBomb converter. |
| |
|
| | .. code-block:: python |
| |
|
| | import socceraction.spadl as spadl |
| |
|
| | df_actions = spadl.statsbomb.convert_to_actions(df_events, home_team_id=777) |
| |
|
| | The obtained dataframe represents the body part, result, action type, players |
| | and teams with numeric IDs. The code below adds their corresponding names. |
| |
|
| | .. code-block:: python |
| |
|
| | df_actions = ( |
| | spadl |
| | .add_names(df_actions) # add actiontype and result names |
| | .merge(SBL.teams(game_id=8657)) # add team names |
| | .merge(SBL.players(game_id=8657)) # add player names |
| | ) |
| |
|
| | Below are the five actions in the SPADL format leading up to Belgium's |
| | second goal. |
| |
|
| | +---------+-----------+---------+---------+-----------+----------+----------+--------+--------+------------+---------+----------+ |
| | | game_id | period_id | seconds | team | player | start\_x | start\_y | end\_x | end\_y | actiontype | result | bodypart | |
| | +=========+===========+=========+=========+===========+==========+==========+========+========+============+=========+==========+ |
| | | 8657 | 2 | 2179 | Belgium | Witsel | 37.1 | 44.8 | 53.8 | 48.2 | pass | success | foot | |
| | +---------+-----------+---------+---------+-----------+----------+----------+--------+--------+------------+---------+----------+ |
| | | 8657 | 2 | 2181 | Belgium | De Bruyne | 53.8 | 48.2 | 70.6 | 42.2 | dribble | success | foot | |
| | +---------+-----------+---------+---------+-----------+----------+----------+--------+--------+------------+---------+----------+ |
| | | 8657 | 2 | 2184 | Belgium | De Bruyne | 70.6 | 42.2 | 87.4 | 49.1 | pass | success | foot | |
| | +---------+-----------+---------+---------+-----------+----------+----------+--------+--------+------------+---------+----------+ |
| | | 8657 | 2 | 2185 | Belgium | Hazard | 87.4 | 49.1 | 97.9 | 38.7 | dribble | success | foot | |
| | +---------+-----------+---------+---------+-----------+----------+----------+--------+--------+------------+---------+----------+ |
| | | 8657 | 2 | 2187 | Belgium | Hazard | 97.9 | 38.7 | 105 | 37.4 | shot | success | foot | |
| | +---------+-----------+---------+---------+-----------+----------+----------+--------+--------+------------+---------+----------+ |
| |
|
| | Here is the same phase visualized using the ``matplotsoccer`` package |
| |
|
| | .. image:: eden_hazard_goal_spadl.png |
| | :align: center |
| |
|
| | .. seealso:: |
| |
|
| | This `notebook`__ gives an example of the complete pipeline to download public |
| | StatsBomb data and convert it to the SPADL format. |
| |
|
| | __ https://github.com/ML-KULeuven/socceraction/blob/master/public-notebooks/1-load-and-convert-statsbomb-data.ipynb |
| |
|