"""Utility functions for working with SPADL dataframes.""" from typing import cast from pandera.typing import DataFrame from . import config as spadlconfig from .schema import SPADLSchema def add_names(actions: DataFrame[SPADLSchema]) -> DataFrame[SPADLSchema]: """Add the type name, result name and bodypart name to a SPADL dataframe. Parameters ---------- actions : pd.DataFrame A SPADL dataframe. Returns ------- pd.DataFrame The original dataframe with a 'type_name', 'result_name' and 'bodypart_name' appended. """ return cast( DataFrame[SPADLSchema], actions.drop(columns=["type_name", "result_name", "bodypart_name"], errors="ignore") .merge(spadlconfig.actiontypes_df(), how="left") .merge(spadlconfig.results_df(), how="left") .merge(spadlconfig.bodyparts_df(), how="left") .set_index(actions.index), ) def play_left_to_right( actions: DataFrame[SPADLSchema], home_team_id: int ) -> DataFrame[SPADLSchema]: """Perform all action in the same playing direction. This changes the start and end location of each action, such that all actions are performed as if the team that executes the action plays from left to right. Parameters ---------- actions : pd.DataFrame The SPADL actins of a game. home_team_id : int The ID of the home team. Returns ------- list(pd.DataFrame) All actions performed left to right. See Also -------- socceraction.vaep.features.play_left_to_right : For transforming gamestates. """ ltr_actions = actions.copy() away_idx = actions.team_id != home_team_id for col in ["start_x", "end_x"]: ltr_actions.loc[away_idx, col] = spadlconfig.field_length - actions[away_idx][col].values for col in ["start_y", "end_y"]: ltr_actions.loc[away_idx, col] = spadlconfig.field_width - actions[away_idx][col].values return ltr_actions