Saving and Loading Event Data#

What you will learn in this tutorial:#

  • how to save your event data

  • how to load your event data

Preparations#

We import pymovements as the alias pm for convenience.

[1]:
import pymovements as pm
/home/docs/checkouts/readthedocs.org/user_builds/pymovements/envs/v0.15.0/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
  from .autonotebook import tqdm as notebook_tqdm

Let’s start by downloading our ToyDataset and loading in its data:

[2]:
dataset = pm.Dataset('ToyDataset', path='data/ToyDataset')
dataset.download()
dataset.load()
Using already downloaded and verified file: data/ToyDataset/downloads/pymovements-toy-dataset.zip
Extracting pymovements-toy-dataset.zip to data/ToyDataset/raw
100%|██████████| 20/20 [00:00<00:00, 195.41it/s]
[2]:
<pymovements.dataset.dataset.Dataset at 0x7fb94b2be8e0>

Now let’s do some preprocessing:

[3]:
dataset.pix2deg()
dataset.pos2vel()

dataset.gaze[0].frame.head()
100%|██████████| 20/20 [00:00<00:00, 722.53it/s]
100%|██████████| 20/20 [00:00<00:00, 658.52it/s]
[3]:
shape: (5, 9)
text_idpage_idtimex_right_pixy_right_pixy_right_posx_right_posx_right_vely_right_vel
i64i64f64f64f64f64f64f64f64
011.988145e6206.8152.4-12.005591-7.5280751.221164-3.589697
011.988146e6206.9152.1-12.01277-7.5256332.442343-7.179203
011.988147e6207.0151.8-12.019949-7.523191.628238-5.184827
011.988148e6207.1151.7-12.022342-7.5207480.407059-4.386968
011.988149e6207.0151.5-12.027128-7.523190.407069-3.190445

Detect some events:

[4]:
dataset.detect_events('ivt')

dataset.events[0].frame.head()
20it [00:00, 355.75it/s]
[4]:
shape: (5, 6)
nameonsetoffsetdurationtext_idpage_id
stri64i64i64i64i64
"fixation"1988145198832217701
"fixation"1988351198854619501
"fixation"1988592198873614401
"fixation"1988788198901322501
"fixation"1989060198917011001
[5]:
dataset.detect_events('microsaccades')

dataset.events[0].frame.head()
20it [00:00, 73.26it/s]
[5]:
shape: (5, 6)
nameonsetoffsetdurationtext_idpage_id
stri64i64i64i64i64
"fixation"1988145198832217701
"fixation"1988351198854619501
"fixation"1988592198873614401
"fixation"1988788198901322501
"fixation"1989060198917011001

We now have event dataframes available with our detected event data.

Saving#

Saving your event data is as simple as:

[6]:
dataset.save_events()
100%|██████████| 20/20 [00:00<00:00, 3109.31it/s]
[6]:
<pymovements.dataset.dataset.Dataset at 0x7fb94b2be8e0>

All of the event data is saved into this directory:

[7]:
dataset.paths.events
[7]:
PosixPath('data/ToyDataset/events')

Let’s confirm it by printing all the new files in this directory:

[8]:
print(list(dataset.paths.events.glob('*/*/*')))
[PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_0_1.feather'), PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_1_3.feather'), PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_2_2.feather'), PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_3_3.feather'), PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_0_3.feather'), PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_2_5.feather'), PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_0_4.feather'), PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_2_4.feather'), PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_3_2.feather'), PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_2_1.feather'), PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_1_2.feather'), PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_3_4.feather'), PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_3_5.feather'), PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_1_1.feather'), PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_2_3.feather'), PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_1_5.feather'), PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_0_5.feather'), PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_0_2.feather'), PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_3_1.feather'), PosixPath('data/ToyDataset/events/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_1_4.feather')]

All of the files have been saved into the Dataset.paths.events as feather files.

If we want to save the data into an alternative directory and also use a different file format like csv we can use the following:

[9]:
dataset.save_events(events_dirname='events_csv', extension='csv')
100%|██████████| 20/20 [00:00<00:00, 2194.25it/s]
[9]:
<pymovements.dataset.dataset.Dataset at 0x7fb94b2be8e0>

Let’s confirm again by printing all the new files in this alternative directory:

[10]:
alternative_dirpath = dataset.path / 'events_csv'
print(list(alternative_dirpath.glob('*/*/*')))
[PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_3_2.csv'), PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_0_4.csv'), PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_0_5.csv'), PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_0_1.csv'), PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_1_2.csv'), PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_3_5.csv'), PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_2_2.csv'), PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_2_5.csv'), PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_1_4.csv'), PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_1_5.csv'), PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_0_2.csv'), PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_3_3.csv'), PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_1_3.csv'), PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_0_3.csv'), PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_2_3.csv'), PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_2_1.csv'), PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_3_4.csv'), PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_1_1.csv'), PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_2_4.csv'), PosixPath('data/ToyDataset/events_csv/aeye-lab-pymovements-toy-dataset-6cb5d66/data/trial_3_1.csv')]

Loading#

Now let’s imagine that this preprocessing and saving was done in another file and we only want to load the preprocessed data.

We simulate this by initializing a new dataset object. We don’t need to download any additional data.

[11]:
preprocessed_dataset = pm.Dataset('ToyDataset', path='data/ToyDataset')

The preprocessed data can now simply be loaded by setting preprocessed to True:

[12]:
preprocessed_dataset.load(events=True)

dataset.events[0].frame.head()
100%|██████████| 20/20 [00:00<00:00, 197.91it/s]
100%|██████████| 20/20 [00:00<00:00, 1631.90it/s]
[12]:
shape: (5, 6)
nameonsetoffsetdurationtext_idpage_id
stri64i64i64i64i64
"fixation"1988145198832217701
"fixation"1988351198854619501
"fixation"1988592198873614401
"fixation"1988788198901322501
"fixation"1989060198917011001

By default, the events directory and the feather extension will be chosen.

In case of alternative directory names or other file formats you can use the following:

[13]:
preprocessed_dataset.load(
    events=True,
    events_dirname='events_csv',
    extension='csv',
)
dataset.events[0].frame.head()
100%|██████████| 20/20 [00:00<00:00, 196.50it/s]
100%|██████████| 20/20 [00:00<00:00, 1254.97it/s]
[13]:
shape: (5, 6)
nameonsetoffsetdurationtext_idpage_id
stri64i64i64i64i64
"fixation"1988145198832217701
"fixation"1988351198854619501
"fixation"1988592198873614401
"fixation"1988788198901322501
"fixation"1989060198917011001

What you have learned in this tutorial:#

  • saving your preprocesed data using Dataset.save_preprocessed()

  • load your preprocesed data using Dataset.load(preprocessed=True)

  • using custom directory names by specifying preprocessed_dirname

  • using other file formats than the default feather format by specifying extension