|
import os |
|
|
|
import pytest |
|
from socceraction.data.statsbomb import StatsBombLoader |
|
from socceraction.spadl import SPADLSchema |
|
from socceraction.spadl import config as spadl |
|
from socceraction.spadl import statsbomb as sb |
|
|
|
|
|
class TestSpadlConvertor: |
|
def setup_method(self) -> None: |
|
data_dir = os.path.join( |
|
os.path.dirname(__file__), os.pardir, "datasets", "statsbomb", "raw" |
|
) |
|
self.SBL = StatsBombLoader(root=data_dir, getter="local") |
|
|
|
self.id_bel = 782 |
|
self.events_japbel = self.SBL.events(7584) |
|
|
|
def test_convert_to_actions(self) -> None: |
|
df_actions = sb.convert_to_actions(self.events_japbel, 782) |
|
assert len(df_actions) > 0 |
|
SPADLSchema.validate(df_actions) |
|
assert (df_actions.game_id == 7584).all() |
|
assert ((df_actions.team_id == 782) | (df_actions.team_id == 778)).all() |
|
|
|
def test_convert_start_location(self) -> None: |
|
event = self.events_japbel[ |
|
self.events_japbel.event_id == "5171bb39-0c6c-4a3d-ae1c-756011dc219f" |
|
] |
|
print(event) |
|
action = sb.convert_to_actions(event, self.id_bel).iloc[0] |
|
assert action["start_x"] == ((25.0 - 0.5) / 120) * spadl.field_length |
|
assert action["start_y"] == 68 - ((26.0 - 0.5) / 80) * spadl.field_width |
|
|
|
def test_convert_end_location(self) -> None: |
|
event = self.events_japbel[ |
|
self.events_japbel.event_id == "5171bb39-0c6c-4a3d-ae1c-756011dc219f" |
|
] |
|
action = sb.convert_to_actions(event, self.id_bel).iloc[0] |
|
assert action["end_x"] == ((24.0 - 0.5) / 120) * spadl.field_length |
|
assert action["end_y"] == spadl.field_width - ((28.0 - 0.5) / 80) * spadl.field_width |
|
|
|
def test_convert_start_location_high_fidelity(self) -> None: |
|
events = self.SBL.events(9912) |
|
event = events[events.event_id == "60392108-2599-4875-bcc7-48462d530edf"] |
|
action = sb.convert_to_actions(event, 217).iloc[0] |
|
assert action["start_x"] == ((64.0 - 0.05) / 120) * spadl.field_length |
|
assert action["start_y"] == spadl.field_width - ((73.6 - 0.05) / 80) * spadl.field_width |
|
|
|
@pytest.mark.parametrize( |
|
"period,timestamp,minute,second,spadl_time", |
|
[ |
|
(1, "00:00:00.920", 0, 0, 0 * 60 + 0.920), |
|
(1, "00:47:09.453", 47, 9, 47 * 60 + 9.453), |
|
(2, "00:19:51.740", 64, 51, 19 * 60 + 51.740), |
|
(2, "00:48:10.733", 93, 10, 48 * 60 + 10.733), |
|
(3, "00:10:12.188", 100, 12, 10 * 60 + 12.188), |
|
(4, "00:13:31.190", 118, 31, 13 * 60 + 31.190), |
|
(5, "00:02:37.133", 122, 37, 2 * 60 + 37.133), |
|
], |
|
) |
|
def test_convert_time( |
|
self, period: int, timestamp: str, minute: int, second: int, spadl_time: float |
|
) -> None: |
|
event = self.events_japbel[ |
|
self.events_japbel.event_id == "5171bb39-0c6c-4a3d-ae1c-756011dc219f" |
|
].copy() |
|
event["period_id"] = period |
|
event["timestamp"] = timestamp |
|
event["minute"] = minute |
|
event["second"] = second |
|
action = sb.convert_to_actions(event, self.id_bel).iloc[0] |
|
assert action["period_id"] == period |
|
assert action["time_seconds"] == spadl_time |
|
|
|
def test_convert_pass(self) -> None: |
|
pass_event = self.events_japbel[ |
|
self.events_japbel.event_id == "0bc3262b-7cdb-4784-b159-4409317165a7" |
|
] |
|
pass_action = sb.convert_to_actions(pass_event, self.id_bel).iloc[0] |
|
assert pass_action["team_id"] == 782 |
|
assert pass_action["player_id"] == 3101 |
|
assert pass_action["type_id"] == spadl.actiontypes.index("pass") |
|
assert pass_action["result_id"] == spadl.results.index("success") |
|
assert pass_action["bodypart_id"] == spadl.bodyparts.index("foot_right") |
|
|
|
def test_convert_own_goal(self) -> None: |
|
events_morira = self.SBL.events(7577) |
|
own_goal_for_event = events_morira[ |
|
events_morira.event_id == "467ab65e-af8b-45d2-b372-06ffb5c71332" |
|
] |
|
own_goal_for_actions = sb.convert_to_actions(own_goal_for_event, 797) |
|
assert len(own_goal_for_actions) == 0 |
|
own_goal_against_event = events_morira[ |
|
events_morira.event_id == "a21c104e-e944-41a2-91ce-700c5f9ae8e5" |
|
] |
|
own_goal_against_actions = sb.convert_to_actions(own_goal_against_event, 797) |
|
assert len(own_goal_against_actions) == 1 |
|
assert own_goal_against_actions.iloc[0]["type_id"] == spadl.actiontypes.index("bad_touch") |
|
assert own_goal_against_actions.iloc[0]["result_id"] == spadl.results.index("owngoal") |
|
assert own_goal_against_actions.iloc[0]["bodypart_id"] == spadl.bodyparts.index("foot") |
|
|