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.16.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, 46.74it/s]
[2]:
<pymovements.dataset.dataset.Dataset at 0x7f4829fa1f70>

Now let’s do some preprocessing:

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

dataset.gaze[0].frame.head()
100%|██████████| 20/20 [00:00<00:00, 22.94it/s]
100%|██████████| 20/20 [00:00<00:00, 49.11it/s]
[3]:
shape: (5, 8)
text_idpage_idtimestimuli_xstimuli_ypixelpositionvelocity
i64i64f64f64f64list[f64]list[f64]list[f64]
011.988145e6-1.0-1.0[206.8, 152.4][-10.697598, -8.852399][null, null]
011.988146e6-1.0-1.0[206.9, 152.1][-10.695183, -8.859678][null, null]
011.988147e6-1.0-1.0[207.0, 151.8][-10.692768, -8.866956][1.610194, -5.256267]
011.988148e6-1.0-1.0[207.1, 151.7][-10.690352, -8.869381][0.402548, -4.447465]
011.988149e6-1.0-1.0[207.0, 151.5][-10.692768, -8.874233][0.402561, -3.234462]

Detect some events:

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

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

dataset.events[0].frame.head()
20it [00:00, 21.54it/s]
[5]:
shape: (5, 6)
nameonsetoffsetdurationtext_idpage_id
stri64i64i64i64i64
"fixation"1988147198832217501
"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, 3117.40it/s]
[6]:
<pymovements.dataset.dataset.Dataset at 0x7f4829fa1f70>

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, 2146.58it/s]
[9]:
<pymovements.dataset.dataset.Dataset at 0x7f4829fa1f70>

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, 47.20it/s]
100%|██████████| 20/20 [00:00<00:00, 1318.28it/s]
[12]:
shape: (5, 6)
nameonsetoffsetdurationtext_idpage_id
stri64i64i64i64i64
"fixation"1988147198832217501
"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, 46.94it/s]
100%|██████████| 20/20 [00:00<00:00, 1147.40it/s]
[13]:
shape: (5, 6)
nameonsetoffsetdurationtext_idpage_id
stri64i64i64i64i64
"fixation"1988147198832217501
"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