from typing import List
import pandas as pd
from ..util import io
__all__ = [
"read_acc_file_into_df",
"read_bvp_file_into_df",
"read_eda_file_into_df",
"read_hr_file_into_df",
"read_ibi_file_into_df",
"read_temp_file_into_df",
]
[docs]def read_hr_file_into_df(filepath_or_buffer) -> pd.DataFrame:
return __read_frequency_based_file_into_df(filepath_or_buffer, ['hr'])
[docs]def read_eda_file_into_df(filepath_or_buffer) -> pd.DataFrame:
return __read_frequency_based_file_into_df(filepath_or_buffer, ['eda'])
[docs]def read_bvp_file_into_df(filepath_or_buffer) -> pd.DataFrame:
return __read_frequency_based_file_into_df(filepath_or_buffer, ['bvp'])
[docs]def read_temp_file_into_df(filepath_or_buffer) -> pd.DataFrame:
return __read_frequency_based_file_into_df(filepath_or_buffer, ['temp'])
[docs]def read_acc_file_into_df(filepath_or_buffer) -> pd.DataFrame:
return __read_frequency_based_file_into_df(filepath_or_buffer, ['acc_x', 'acc_y', 'acc_z'])
def __read_frequency_based_file_into_df(filepath_or_buffer, column_names: List[str]) -> pd.DataFrame:
if io.is_file_like(filepath_or_buffer):
file_to_read = filepath_or_buffer
close_file = False
elif isinstance(filepath_or_buffer, str):
file_to_read = open(filepath_or_buffer, 'br')
close_file = True
else:
raise ValueError('Illegal input type: %d' % type(filepath_or_buffer))
initial_pos = file_to_read.tell()
timestamp = pd.to_datetime(float(str(file_to_read.readline(), 'utf-8').strip().split(',')[0]), unit='s', utc=True)
frequency = float(str(file_to_read.readline(), 'utf-8').strip().split(',')[0])
file_to_read.seek(initial_pos)
data = pd.read_csv(file_to_read, skiprows=2, names=column_names, index_col=False)
data.index = pd.date_range(start=timestamp, periods=len(data), freq=str(1 / frequency * 1000) + 'ms',
name='datetime', tz='UTC')
data.sort_index(inplace=True)
if close_file:
file_to_read.close()
return data
[docs]def read_ibi_file_into_df(filepath_or_buffer) -> pd.DataFrame:
"""
Reads an Empatica IBI file into a DataFrame.
Parameters
----------
filepath_or_buffer
filepath as string or buffer (file)
Returns
-------
IBIs : pd.DataFrame
a pd.DataFrame with an 'ibi' columns, IBIs in milliseconds
"""
if io.is_file_like(filepath_or_buffer):
file_to_read = filepath_or_buffer
close_file = False
elif isinstance(filepath_or_buffer, str):
file_to_read = open(filepath_or_buffer, 'br')
close_file = True
else:
raise ValueError('Illegal input type: %d' % type(filepath_or_buffer))
initial_pos = file_to_read.tell()
timestamp = float(str(file_to_read.readline(), 'utf-8').strip().split(',')[0])
file_to_read.seek(initial_pos)
ibi = pd.read_csv(file_to_read, skiprows=1, names=['ibi'], index_col=0)
ibi['ibi'] *= 1000 # to get ms
ibi.index = pd.to_datetime((ibi.index * 1000 + timestamp * 1000).map(int), unit='ms', utc=True)
ibi.index.name = 'datetime'
if close_file:
file_to_read.close()
return ibi