| """SPADL schema for StatsBomb data.""" | |
| from typing import Optional | |
| import pandera as pa | |
| from pandera.typing import Object, Series, Timedelta | |
| from socceraction.data.schema import ( | |
| CompetitionSchema, | |
| EventSchema, | |
| GameSchema, | |
| PlayerSchema, | |
| TeamSchema, | |
| ) | |
| class StatsBombCompetitionSchema(CompetitionSchema): | |
| """Definition of a dataframe containing a list of competitions and seasons.""" | |
| country_name: Series[str] | |
| """The name of the country the competition relates to.""" | |
| competition_gender: Series[str] | |
| """The gender of the players competing in the competition.""" | |
| class StatsBombGameSchema(GameSchema): | |
| """Definition of a dataframe containing a list of games.""" | |
| competition_stage: Series[str] | |
| """The name of the phase of the competition this game is in.""" | |
| home_score: Series[int] | |
| """The final score of the home team.""" | |
| away_score: Series[int] | |
| """The final score of the away team.""" | |
| venue: Series[str] = pa.Field(nullable=True) | |
| """The name of the stadium where the game was played.""" | |
| referee: Series[str] = pa.Field(nullable=True) | |
| """The name of the referee.""" | |
| class StatsBombPlayerSchema(PlayerSchema): | |
| """Definition of a dataframe containing the list of players of a game.""" | |
| nickname: Series[str] = pa.Field(nullable=True) | |
| """The nickname of the player on the team.""" | |
| starting_position_id: Series[int] | |
| """The unique identifier for the starting position of the player on the team.""" | |
| starting_position_name: Series[str] | |
| """The name of the starting position of the player on the team.""" | |
| class StatsBombTeamSchema(TeamSchema): | |
| """Definition of a dataframe containing the list of teams of a game.""" | |
| class StatsBombEventSchema(EventSchema): | |
| """Definition of a dataframe containing event stream data of a game.""" | |
| index: Series[int] | |
| """Sequence notation for the ordering of events within each match.""" | |
| timestamp: Series[Timedelta] | |
| """Time in the match the event takes place, recorded to the millisecond.""" | |
| minute: Series[int] | |
| """The minutes on the clock at the time of this event.""" | |
| second: Series[int] = pa.Field(ge=0, le=59) | |
| """The second part of the timestamp.""" | |
| possession: Series[int] | |
| """Indicates the current unique possession in the game.""" | |
| possession_team_id: Series[int] | |
| """The ID of the team that started this possession in control of the ball.""" | |
| possession_team_name: Series[str] | |
| """The name of the team that started this possession in control of the ball.""" | |
| play_pattern_id: Series[int] | |
| """The ID of the play pattern relevant to this event.""" | |
| play_pattern_name: Series[str] | |
| """The name of the play pattern relevant to this event.""" | |
| team_name: Series[str] | |
| """The name of the team this event relates to.""" | |
| duration: Series[float] = pa.Field(nullable=True) | |
| """If relevant, the length in seconds the event lasted.""" | |
| extra: Series[Object] | |
| """A JSON string containing type-specific information.""" | |
| related_events: Series[Object] | |
| """A comma separated list of the IDs of related events.""" | |
| player_name: Series[str] = pa.Field(nullable=True) | |
| """The name of the player this event relates to.""" | |
| position_id: Series[float] = pa.Field(nullable=True) | |
| """The ID of the position the player was in at the time of this event.""" | |
| position_name: Series[str] = pa.Field(nullable=True) | |
| """The name of the position the player was in at the time of this event.""" | |
| location: Series[Object] = pa.Field(nullable=True) | |
| """Array containing the x and y coordinates of the event.""" | |
| under_pressure: Series[bool] = pa.Field(nullable=True) | |
| """Whether the action was performed while being pressured by an opponent.""" | |
| counterpress: Series[bool] = pa.Field(nullable=True) | |
| """Pressing actions within 5 seconds of an open play turnover.""" | |
| visible_area_360: Optional[Series[Object]] = pa.Field(nullable=True) | |
| """An array of coordinates describing the polygon visible to the camera / in the 360 frame.""" | |
| freeze_frame_360: Optional[Series[Object]] = pa.Field(nullable=True) | |
| """An array of freeze frame objects.""" | |