yasa.hypno_find_periods¶
- yasa.hypno_find_periods(hypno, sf_hypno, threshold='5min', equal_length=False)[source]¶
Find sequences of consecutive values exceeding a certain duration in hypnogram.
New in version 0.6.2.
- Parameters
- hypnoarray_like
A 1D array with the sleep stages (= hypnogram). The dtype can be anything (int, bool, str). More generally, this can be any vector for which you wish to find runs of consecutive items.
- sf_hypnofloat
The current sampling frequency of
hypno
, in Hz, e.g. 1/30 = 1 value per each 30 seconds of EEG data, 1 = 1 value per second of EEG data.- thresholdstr
This function will only keep periods that exceed a certain duration (default ‘5min’), e.g. ‘5min’, ‘15min’, ’30sec’, ‘1hour’. To disable thresholding, use ‘0sec’.
- equal_lengthbool
If True, the periods will all have the exact duration defined in threshold. That is, periods that are longer than the duration threshold will be divided into sub-periods of exactly the length of
threshold
.
- Returns
- periods
pandas.DataFrame
Output dataframe
values
: The value in hypno of the current periodstart
: The index of the start of the period in hypnolength
: The duration of the period, in number of samples
- periods
Examples
Let’s assume that we have an hypnogram where sleep = 1 and wake = 0. There is one value per minute, and therefore the sampling frequency of the hypnogram is 1 / 60 sec (~0.016 Hz).
>>> import yasa >>> hypno = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0] >>> yasa.hypno_find_periods(hypno, sf_hypno=1/60, threshold="0min") values start length 0 0 0 11 1 1 11 3 2 0 14 2 3 1 16 9 4 0 25 2
This gives us the start and duration of each sequence of consecutive values in the hypnogram. For example, the first row tells us that there is a sequence of 11 consecutive 0 starting at the first index of hypno.
Now, we may want to keep only periods that are longer than a specific threshold, for example 5 minutes:
>>> yasa.hypno_find_periods(hypno, sf_hypno=1/60, threshold="5min") values start length 0 0 0 11 1 1 16 9
Only the two sequences that are longer than 5 minutes (11 minutes and 9 minutes respectively) are kept. Feel free to play around with different values of threshold!
This function is not limited to binary arrays, e.g.
>>> hypno = [0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 0, 1] >>> yasa.hypno_find_periods(hypno, sf_hypno=1/60, threshold="2min") values start length 0 0 0 4 1 2 5 6 2 0 11 3
Lastly, using
equal_length=True
will further divide the periods into segments of the same duration, i.e. the duration defined inthreshold
:>>> hypno = [0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 0, 1] >>> yasa.hypno_find_periods(hypno, sf_hypno=1/60, threshold="2min", equal_length=True) values start length 0 0 0 2 1 0 2 2 2 2 5 2 3 2 7 2 4 2 9 2 5 0 11 2
Here, the first period of 4 minutes of consecutive 0 is further divided into 2 periods of exactly 2 minutes. Next, the sequence of 6 consecutive 2 is further divided into 3 periods of 2 minutes. Lastly, the last value in the sequence of 3 consecutive 0 at the end of the array is removed to keep only a segment of 2 exactly minutes. In other words, the remainder of the division of a given segment by the desired duration is discarded.