| import socceraction.spadl as spadl |
| import socceraction.spadl as spadlcfg |
| from pandas import testing as tm |
| from pandera.typing import DataFrame |
| from socceraction.spadl import SPADLSchema |
| from socceraction.vaep import features as fs |
|
|
| xfns = [ |
| fs.actiontype, |
| fs.actiontype_onehot, |
| fs.result, |
| fs.result_onehot, |
| fs.actiontype_result_onehot, |
| fs.bodypart, |
| fs.bodypart_detailed, |
| fs.bodypart_onehot, |
| fs.bodypart_detailed_onehot, |
| fs.time, |
| fs.startlocation, |
| fs.endlocation, |
| fs.startpolar, |
| fs.endpolar, |
| fs.movement, |
| fs.team, |
| fs.time_delta, |
| fs.space_delta, |
| fs.goalscore, |
| ] |
|
|
|
|
| def test_same_index(spadl_actions: DataFrame[SPADLSchema]) -> None: |
| """The feature generators should not change the index of the input dataframe.""" |
| spadl_actions = spadl_actions.set_index(spadl_actions.index + 10) |
| game_actions_with_names = spadlcfg.add_names(spadl_actions) |
| gamestates = fs.gamestates(game_actions_with_names, 3) |
| gamestates = fs.play_left_to_right(gamestates, 782) |
| for fn in xfns: |
| features = fn(gamestates) |
| tm.assert_index_equal(features.index, spadl_actions.index) |
|
|
|
|
| def test_actiontype(spadl_actions: DataFrame[SPADLSchema]) -> None: |
| gamestates = fs.gamestates(spadl_actions) |
| ltr_gamestates = fs.play_left_to_right(gamestates, 782) |
| out = fs.actiontype(ltr_gamestates) |
| assert out.shape == (len(spadl_actions), 3) |
|
|
|
|
| def test_actiontype_onehot(spadl_actions: DataFrame[SPADLSchema]) -> None: |
| gamestates = fs.gamestates(spadl_actions) |
| ltr_gamestates = fs.play_left_to_right(gamestates, 782) |
| out = fs.actiontype_onehot(ltr_gamestates) |
| assert out.shape == (len(spadl_actions), len(spadl.config.actiontypes) * 3) |
|
|
|
|
| def test_result(spadl_actions: DataFrame[SPADLSchema]) -> None: |
| gamestates = fs.gamestates(spadl_actions) |
| ltr_gamestates = fs.play_left_to_right(gamestates, 782) |
| out = fs.result(ltr_gamestates) |
| assert out.shape == (len(spadl_actions), 3) |
|
|
|
|
| def test_result_onehot(spadl_actions: DataFrame[SPADLSchema]) -> None: |
| gamestates = fs.gamestates(spadl_actions) |
| ltr_gamestates = fs.play_left_to_right(gamestates, 782) |
| out = fs.result_onehot(ltr_gamestates) |
| assert out.shape == (len(spadl_actions), len(spadl.config.results) * 3) |
|
|
|
|
| def test_actiontype_result_onehot(spadl_actions: DataFrame[SPADLSchema]) -> None: |
| gamestates = fs.gamestates(spadl_actions) |
| ltr_gamestates = fs.play_left_to_right(gamestates, 782) |
| out = fs.actiontype_result_onehot(ltr_gamestates) |
| assert out.shape == ( |
| len(spadl_actions), |
| len(spadl.config.actiontypes) * len(spadl.config.results) * 3, |
| ) |
|
|
|
|
| def test_bodypart(spadl_actions: DataFrame[SPADLSchema]) -> None: |
| gamestates = fs.gamestates(spadl_actions) |
| ltr_gamestates = fs.play_left_to_right(gamestates, 782) |
| out = fs.bodypart(ltr_gamestates) |
| assert out.shape == (len(spadl_actions), 3) |
|
|
|
|
| def test_bodypart_onehot(spadl_actions: DataFrame[SPADLSchema]) -> None: |
| gamestates = fs.gamestates(spadl_actions) |
| ltr_gamestates = fs.play_left_to_right(gamestates, 782) |
| out = fs.bodypart_onehot(ltr_gamestates) |
| assert out.shape == (len(spadl_actions), 4 * 3) |
|
|
|
|
| def test_time(spadl_actions: DataFrame[SPADLSchema]) -> None: |
| gamestates = fs.gamestates(spadl_actions) |
| out = fs.time(gamestates) |
| assert out.shape == (len(spadl_actions), 9) |
| assert out.loc[0, "period_id_a0"] == 1 |
| assert out.loc[0, "time_seconds_a0"] == 0.533 |
| assert out.loc[0, "time_seconds_overall_a0"] == 0.533 |
| assert out.loc[200, "period_id_a0"] == 2 |
| assert out.loc[200, "time_seconds_a0"] == 0.671 |
| assert out.loc[200, "time_seconds_overall_a0"] == 0.671 + 45 * 60 |
|
|
|
|
| def test_player_possession_time(spadl_actions: DataFrame[SPADLSchema]) -> None: |
| gamestates = fs.gamestates(spadl_actions) |
| out = fs.player_possession_time(gamestates) |
| assert out.shape == (len(spadl_actions), len(gamestates)) |
| assert "player_possession_time_a0" in out.columns |
| assert out.loc[0, "player_possession_time_a0"] == 0.0 |
| assert out.loc[1, "player_possession_time_a0"] == 0.0 |
| assert out.loc[2, "player_possession_time_a0"] == 0.881 |
|
|
|
|
| def test_time_delta(spadl_actions: DataFrame[SPADLSchema]) -> None: |
| gamestates = fs.gamestates(spadl_actions) |
| out = fs.time_delta(gamestates) |
| assert out.shape == (len(spadl_actions), 2) |
| |
| print(out) |
| assert out.loc[0, "time_delta_1"] == 0.0 |
| assert out.loc[0, "time_delta_2"] == 0.0 |
| assert out.loc[1, "time_delta_1"] == 0.719 |
| assert out.loc[1, "time_delta_2"] == 0.719 |
| assert out.loc[2, "time_delta_1"] == 0.881 |
| assert out.loc[2, "time_delta_2"] == 1.6 |
| |
| assert out.loc[200, "time_delta_1"] == 0.0 |
| assert out.loc[200, "time_delta_2"] == 0.0 |
| assert out.loc[201, "time_delta_1"] == 1.32 |
| assert out.loc[201, "time_delta_2"] == 1.32 |
|
|