Constraints that specify single values

Say we want to select all passes. We can do it like this:

import numpy as np
import pandas as pd
import xarray as xr
import xarray_events

ds = xr.Dataset(
    data_vars={
        'ball_trajectory': (
            ['frame', 'cartesian_coords'],
            np.exp(np.linspace((-6, -8), (3, 2), 2450))
        )
    },
    coords={
        'frame': np.arange(1, 2451),
        'cartesian_coords': ['x', 'y'],
        'player_id': [2, 3, 7, 19, 20, 21, 22, 28, 34, 79]
    },
    attrs={'match_id': 12, 'resolution_fps': 25}
)

events = pd.DataFrame(
    {
        'event_type':
            ['pass', 'goal', 'pass', 'pass', 'pass',
             'penalty', 'goal', 'pass', 'pass', 'penalty'],
        'start_frame': [1, 425, 600, 945, 1100, 1280, 1890, 2020, 2300, 2390],
        'end_frame': [424, 599, 944, 1099, 1279, 1889, 2019, 2299, 2389, 2450],
        'player_id': [79, 79, 19, 2, 3, 2, 3, 79, 2, 79]
    }
)
(
    ds
    .events.load(events, {'frame': ('start_frame', 'end_frame')})
    .events.sel({'event_type': 'pass'})
    .events.df
)
event_type start_frame end_frame player_id
0 pass 1 424 79
2 pass 600 944 19
3 pass 945 1099 2
4 pass 1100 1279 3
7 pass 2020 2299 79
8 pass 2300 2389 2

See? We are now using the accessor twice, once every time we need to access any of its methods. First we access the method sel() and then the property df(). This is because the result of sel() is actually a (stateful) Dataset, as mentioned before, so we use the accessor again on it in a chain-like fashion. Very convenient!