Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to get the L5 and M10 start times? #84

Open
amondino opened this issue Dec 15, 2021 · 6 comments
Open

How to get the L5 and M10 start times? #84

amondino opened this issue Dec 15, 2021 · 6 comments
Labels
enhancement New feature or request

Comments

@amondino
Copy link

Hi! I can see in the paper that you got the L5 and M10 start times, but I only see in the tutorials how to get the mean activity but not their start time.
Is it possible to get this?
Thanks!
Ale

@roryos1
Copy link

roryos1 commented Jan 27, 2022

Hi @ghammad,

I also wanted to ask this question. The code can already calculate the average activity in the L5/M10 periods, would it be possible to identify the time corresponding to the first activity data point included in the L5/M10? Although I appreciate this may be easier said than done.

Thanks,

Rory

@ghammad
Copy link
Owner

ghammad commented Feb 23, 2022

Hello @amondino @roryos1

Sorry for the late reply. Feedback and requests are always appreciated.

Indeed, the code is there and actually the L5/M10 times are calculated. I just did not think about exposing these variables via a convenient function. I'll make one asap but for the time being, here is a simple workaround:

import pyActigraphy
from pyActigraphy.metrics.metrics import _lmx

import os
fpath = os.path.join(os.path.dirname(pyActigraphy.__file__),'tests/data/')
raw = pyActigraphy.io.read_raw_awd(fpath+'example_01.AWD')

# The _lmx function returns the start time of the LX or MX period (depending on the value of the "lowest" switch variable)
# as well as the mean activity during this period.
l5_ts, l5 = _lmx(raw.resampled_data('15min'), '5h', lowest=True)
m10_ts, m10 = _lmx(raw.resampled_data('15min'), '10h', lowest=False)

Be aware that 'l5_ts' or 'm10_ts' are of type 'pd.Timedelta'. It is easy to use them for further computation (such as average or differences). However, if you want to manipulate them as strings, you can the following function:

from pyActigraphy.sleep.scoring_base import _td_format

l5_ts_as_str = _td_format(l5_ts)
print(l5_ts_as_str)

Hope that helps.

Cheers,

Greg

This was referenced Feb 23, 2022
@roryos1
Copy link

roryos1 commented Jan 26, 2023

Hi @ghammad,

Thank you so much for this response, it's been a great help for my PhD.

I understand that the _lmx function retrieves the start times of the LX and MX period, however I was wondering whether there was a function that could return the start times for L5p and M10p?

Best wishes,
Rory

@ghammad
Copy link
Owner

ghammad commented Feb 1, 2023

Hello @roryos1

Unfortunately, no. But that would be a nice addition.

For the time being, I suggest to use a plain python trick. Group your data by the required amount of time (ex: '3 days') and then apply the _lmx function to each chunk. This can easily done:

raw.data.groupby(pd.Grouper(freq='3D')).apply(_lmx, period='5h', lowest=True)

To be tested of course. But that should do the trick.

Hope that helps.

Grégory

@roryos1
Copy link

roryos1 commented Feb 8, 2023

Hi @ghammad,

Thank you very much for taking the time to respond.

I've tried to use the trick you provided, adjusted for daily M10 onset values:

raw.data.groupby(pd.Grouper(freq='1D')).apply(_lmx, period='10h', lowest=False)

Like you said, this is subject to testing. I keep being presented with the following error:

ValueError: Length mismatch: Expected axis has 2 elements, new values have 5760 elements

The code works fine when grouping the data by 2 days or 3 days, just not for 1 day. I have done nothing with the data besides import it. There may be a very simple answer to this that I am overlooking...

If you have any insights into what is going on, it would be massively appreciated.

Best wishes,
Rory

@ghammad
Copy link
Owner

ghammad commented Feb 9, 2023

Hello @roryos1

Without having access to the data or a way to reproduce the pb, difficult for me to make a precise diagnosis but I suspect the following:

  • L5/M10 needs an average daily profile, meaning that a profile is made for each time period. Therefore, a daily L5/M10 needs a full day of data. If, for any reason, masking or NaN activity counts, there is less than a day of data, I guess the code will produce the error you encountered. To be checked but very likely.

So, my advice is to use more than a day and reflect on the variability of a L5/M10 variable calculated on a short time range.

Side remark: having a clear error message when there is less than 24h of data would be nice.

Hope that helps.

Greg

@ghammad ghammad added the enhancement New feature or request label Mar 21, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants