Source code for biomechzoo.statistics.eventval
import os
import pandas as pd
from biomechzoo.utils.engine import engine
from biomechzoo.utils.zload import zload
from biomechzoo.utils.findfield import findfield # assuming this exists
[docs]
def eventval(fld, dim1=None, dim2=None, ch=None, localevts=None, globalevts=None, anthroevts=None):
"""
Extract event values from .zoo files and compile into a pandas DataFrame.
Parameters
----------
fld : str
Path to the root data folder containing .zoo files.
dim1 : list of str, optional
List of conditions (subfolder names under fld).
dim2 : list of str, optional
List of participant identifiers.
ch : list of str
List of channels to extract events from.
localevts : list of str, optional
List of local events.
globalevts : list of str, optional
List of global events.
anthroevts : list of str, optional
List of events stored in the metadata.Usually anthropometric data
Returns
-------
pd.DataFrame
Columns: ['condition', 'subject', 'file', 'event_name', 'event_value']
"""
zoo_files = engine(fld, extension='.zoo')
results = []
files_excluded = []
for fl in zoo_files:
data = zload(fl)
fname = os.path.basename(fl)
condition = next((c for c in (dim1 or []) if c in fl), '')
subject = next((s for s in (dim2 or []) if s in fl), '')
# Skip file if condition or subject is empty
if not condition or not subject:
files_excluded.append(fl)
continue
else:
print('processing {}'.format(fl))
# --- Local events ---
if localevts and ch:
print('extracting local events...')
for channel in ch:
if channel not in data:
print('channel {} not found'.format(channel))
continue
for evt in localevts:
try:
exd = int(data[channel]['event'][evt][0]) # xdata
eyd = data[channel]['event'][evt][1] # ydata
results.append({
'condition': condition,
'subject': subject,
'file': fname,
'event_name': f"{channel}_{evt}",
'event_index': exd,
'event_value': eyd
})
except (KeyError, IndexError, TypeError) as e:
print(f"Local event '{evt}' not found in channel '{channel}' for file '{fname}'")
# --- Global events ---
if globalevts and ch:
print('extracting global events...')
for evt in globalevts:
# use findfield to locate where the global event is stored
evt_val, evt_ch = findfield(data, evt)
if not evt_ch:
print(f"Global event '{evt}' not found in any channel for file '{fname}'")
continue
exd = int(evt_val[0])
for channel in ch:
if channel not in data:
print(f"Skipping {evt}: channel {channel} not in data")
continue
try:
eyd = data[channel]['line'][exd]
results.append({
'condition': condition,
'subject': subject,
'file': fname,
'event_name': f"{channel}_{evt}",
'event_index': exd,
'event_value': eyd
})
except (IndexError, KeyError, TypeError) as e:
print(f"Global event '{evt}' index out of range in channel '{channel}' for file '{fname}': {e}")
if anthroevts and ch:
raise NotImplementedError
print('extracting anthropometric events...')
for evt in globalevts:
# use findfield to locate where the global event is stored
evt_val, _ = findfield(data, evt)
if evt_val:
results.append({
'condition': condition,
'subject': subject,
'file': fname,
'event_name': evt,
'event_index': evt_val[0],
'event_value': evt_val[1]
})
return pd.DataFrame(results)