Skip to content

Commit 067e451

Browse files
Merge pull request #2 from WoutPaepenUcLL/update-secondspectrum-load
Update secondspectrum load function to support current metadata.json format
2 parents 9a93979 + ecdcf73 commit 067e451

File tree

2 files changed

+112
-4
lines changed

2 files changed

+112
-4
lines changed

kloppy/infra/serializers/tracking/secondspectrum.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,13 +130,13 @@ def deserialize(self, inputs: SecondSpectrumInputs) -> TrackingDataset:
130130
metadata = json.loads(first_byte + inputs.meta_data.read())
131131

132132
frame_rate = float(metadata.get("fps", 25.0))
133-
pitch_size_height = float(metadata["data"]["pitchLength"])
134-
pitch_size_width = float(metadata["data"]["pitchWidth"])
133+
pitch_size_height = float(metadata["data"].get("pitchLength", 104.8512))
134+
pitch_size_width = float(metadata["data"].get("pitchWidth", 67.9704))
135135

136136
periods = []
137137
for period in metadata["periods"]:
138-
start_frame_id = int(period["startFrameIdx"])
139-
end_frame_id = int(period["endFrameIdx"])
138+
start_frame_id = int(period["startFrameClock"])
139+
end_frame_id = int(period["endFrameClock"])
140140
if start_frame_id != 0 or end_frame_id != 0:
141141
# Frame IDs are unix timestamps (in milliseconds)
142142
periods.append(

kloppy/tests/test_secondspectrum.py

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,3 +223,111 @@ def test_load_without_fps(self, meta_data: Path, raw_data: Path):
223223
if game_id:
224224
assert isinstance(game_id, str)
225225
assert game_id == "1234456"
226+
227+
def test_load_with_current_metadata_format(
228+
self, meta_data: Path, raw_data: Path, additional_meta_data: Path
229+
):
230+
dataset = secondspectrum.load(
231+
meta_data=meta_data,
232+
raw_data=raw_data,
233+
additional_meta_data=additional_meta_data,
234+
only_alive=False,
235+
coordinates="secondspectrum",
236+
)
237+
238+
# Check provider, type, shape, etc
239+
assert dataset.metadata.provider == Provider.SECONDSPECTRUM
240+
assert dataset.dataset_type == DatasetType.TRACKING
241+
assert len(dataset.records) == 376
242+
assert len(dataset.metadata.periods) == 2
243+
assert dataset.metadata.orientation == Orientation.AWAY_HOME
244+
245+
# Check the Periods
246+
assert dataset.metadata.periods[0].id == 1
247+
assert dataset.metadata.periods[0].start_timestamp == timedelta(
248+
seconds=0
249+
)
250+
assert dataset.metadata.periods[0].end_timestamp == timedelta(
251+
seconds=2982240 / 25
252+
)
253+
254+
assert dataset.metadata.periods[1].id == 2
255+
assert dataset.metadata.periods[1].start_timestamp == timedelta(
256+
seconds=3907360 / 25
257+
)
258+
assert dataset.metadata.periods[1].end_timestamp == timedelta(
259+
seconds=6927840 / 25
260+
)
261+
262+
# Check some timestamps
263+
assert dataset.records[0].timestamp == timedelta(
264+
seconds=0
265+
) # First frame
266+
assert dataset.records[20].timestamp == timedelta(
267+
seconds=320.0
268+
) # Later frame
269+
assert dataset.records[187].timestamp == timedelta(
270+
seconds=9.72
271+
) # Second period
272+
273+
# Check some players
274+
home_player = dataset.metadata.teams[0].players[2]
275+
assert home_player.player_id == "8xwx2"
276+
assert dataset.records[0].players_coordinates[home_player] == Point(
277+
x=-8.943903672572427, y=-28.171654132650365
278+
)
279+
280+
away_player = dataset.metadata.teams[1].players[3]
281+
assert away_player.player_id == "2q0uv"
282+
assert dataset.records[0].players_coordinates[away_player] == Point(
283+
x=-45.11871334915762, y=-20.06459030559596
284+
)
285+
286+
# Check the ball
287+
assert dataset.records[1].ball_coordinates == Point3D(
288+
x=-23.147073918432426, y=13.69367399756424, z=0.0
289+
)
290+
291+
# Check pitch dimensions
292+
pitch_dimensions = dataset.metadata.pitch_dimensions
293+
assert pitch_dimensions.x_dim.min == -52.425
294+
assert pitch_dimensions.x_dim.max == 52.425
295+
assert pitch_dimensions.y_dim.min == -33.985
296+
assert pitch_dimensions.y_dim.max == 33.985
297+
298+
# Check enriched metadata
299+
date = dataset.metadata.date
300+
if date:
301+
assert isinstance(date, datetime)
302+
assert date == datetime(1900, 1, 26, 0, 0, tzinfo=timezone.utc)
303+
304+
game_week = dataset.metadata.game_week
305+
if game_week:
306+
assert isinstance(game_week, str)
307+
assert game_week == "1"
308+
309+
game_id = dataset.metadata.game_id
310+
if game_id:
311+
assert isinstance(game_id, str)
312+
assert game_id == "1234456"
313+
314+
# Check team and player information
315+
home_team = dataset.metadata.teams[0]
316+
assert home_team.team_id == "123"
317+
assert home_team.name == "FK1"
318+
319+
away_team = dataset.metadata.teams[1]
320+
assert away_team.team_id == "456"
321+
assert away_team.name == "FK2"
322+
323+
home_player = home_team.players[0]
324+
assert home_player.player_id == "0a39g4"
325+
assert home_player.name == "y9xrbe545u3h"
326+
assert home_player.starting is False
327+
assert home_player.starting_position == "SUB"
328+
329+
away_player = away_team.players[0]
330+
assert away_player.player_id == "9bgzhy"
331+
assert away_player.name == "c6gupnmywca0"
332+
assert away_player.starting is True
333+
assert away_player.starting_position == "GK"

0 commit comments

Comments
 (0)