{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Start guide for the devicely package" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To install devicely locally just run `pip install devicely`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Use devicely" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "import os\n", "\n", "import devicely\n", "\n", "write_dir = 'New'\n", "\n", "if not os.path.isdir(write_dir):\n", " os.makedirs(write_dir)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Empatica E4\n", "\n", "The Empatice E4 wristband can be used to obtain data from inter-beat intervals, electrodermal activity, heart rate, temperature and blood volume pulse. The wristband uses [this directory structure](https://github.com/hpi-dhc/devicely-example/tree/main/Empatica) for its measurement data." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Read the data\n", "\n", "Create an EmpaticaReader object:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "empatica_reader = devicely.EmpaticaReader('Empatica')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Access the sampling frequencies and starting times for all signals:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'ACC': Timestamp('2020-10-16 17:04:29'),\n", " 'BVP': Timestamp('2020-10-16 17:04:29'),\n", " 'EDA': Timestamp('2020-10-16 17:04:29'),\n", " 'HR': Timestamp('2020-10-16 17:04:39'),\n", " 'TEMP': Timestamp('2020-10-16 17:04:29'),\n", " 'IBI': Timestamp('2020-10-16 17:04:29')}" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "empatica_reader.start_times" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'ACC': 32.0, 'BVP': 64.0, 'EDA': 4.0, 'HR': 1.0, 'TEMP': 4.0}" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "empatica_reader.sample_freqs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Access the individual dataframes via the attributes ACC, BVP, EDA, HR, TEMP, IBI and tags:" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2020-10-16 17:04:39 51.00\n", "2020-10-16 17:04:40 51.50\n", "2020-10-16 17:04:41 51.00\n", "2020-10-16 17:04:42 52.75\n", "2020-10-16 17:04:43 64.00\n", "Name: HR, dtype: float64" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "empatica_reader.HR.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Access a joined dataframe of all signals:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ACC_XACC_YACC_ZBVPEDAHRTEMP
2020-10-16 17:04:29.000000-3.011.060.0-0.00.0NaN31.13
2020-10-16 17:04:29.015625NaNNaNNaN-0.0NaNNaNNaN
2020-10-16 17:04:29.031250-3.011.060.0-0.0NaNNaNNaN
2020-10-16 17:04:29.046875NaNNaNNaN-0.0NaNNaNNaN
2020-10-16 17:04:29.062500-2.011.060.0-0.0NaNNaNNaN
\n", "
" ], "text/plain": [ " ACC_X ACC_Y ACC_Z BVP EDA HR TEMP\n", "2020-10-16 17:04:29.000000 -3.0 11.0 60.0 -0.0 0.0 NaN 31.13\n", "2020-10-16 17:04:29.015625 NaN NaN NaN -0.0 NaN NaN NaN\n", "2020-10-16 17:04:29.031250 -3.0 11.0 60.0 -0.0 NaN NaN NaN\n", "2020-10-16 17:04:29.046875 NaN NaN NaN -0.0 NaN NaN NaN\n", "2020-10-16 17:04:29.062500 -2.0 11.0 60.0 -0.0 NaN NaN NaN" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "empatica_reader.data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The dataframe contains nan values because the individual signals have different sampling frequencies.\n", "\n", "\n", "### Timeshift the data\n", "\n", "Apply a timeshift:" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'ACC': Timestamp('2019-05-18 22:02:53.817793664'),\n", " 'BVP': Timestamp('2019-05-18 22:02:53.817793664'),\n", " 'EDA': Timestamp('2019-05-18 22:02:53.817793664'),\n", " 'HR': Timestamp('2019-05-18 22:03:03.817793664'),\n", " 'TEMP': Timestamp('2019-05-18 22:02:53.817793664'),\n", " 'IBI': Timestamp('2019-05-18 22:02:53.817793664')}" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "empatica_reader.timeshift()\n", "empatica_reader.start_times" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By providing no parameter to `timeshift` the data is shifted by a random time interval between one month and two years to the past. You can also provide a `pandas.Timedelta` object to shift the data by that timedelta or a `pandas.Timestamp` object to shift the data such that this timestamp is the earliest entry." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Write the data" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['EDA.csv', 'HR.csv', 'IBI.csv', 'TEMP.csv', 'tags.csv', 'BVP.csv', 'ACC.csv']" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "empatica_write_path = os.path.join(write_dir, 'Empatica')\n", "empatica_reader.write(empatica_write_path)\n", "os.listdir(empatica_write_path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Spacelabs Blood Pressure Monitor\n", "\n", "Spacelabs uses [a single file](https://github.com/hpi-dhc/devicely-example/tree/main/Spacelabs) to output its metadata as well as the actual signals." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Read the data\n", "\n", "Create a `SpacelabsReader` object:" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "spacelabs_reader = devicely.SpacelabsReader(os.path.join('Spacelabs', 'spacelabs.abp'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Acess the metadata:" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'001V0'" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spacelabs_reader.subject" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'PATIENTINFO': {'DOB': None, 'RACE': None},\n", " 'REPORTINFO': {'PHYSICIAN': None,\n", " 'NURSETECH': 'admin',\n", " 'STATUS': 'NOTCONFIRMED',\n", " 'CALIPERSUMMARY': {'COUNT': '0'}}}" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spacelabs_reader.metadata" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Access the signal dataframe:" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datetimeSYS(mmHg)DIA(mmHg)UNKNOW_1UNKNOW_2UNKNOW_3CODE
timestamp
2019-03-01 16:18:002019-03-0116:18:001077678.078.0NaNNaN
2019-03-01 16:19:002019-03-0116:19:00966263.063.0NaNNaN
2019-03-01 16:22:002019-03-0116:22:001006864.064.0NaNNaN
2019-03-01 16:23:002019-03-0116:23:001036868.068.0NaNNaN
2019-03-01 16:25:002019-03-0116:25:001016765.065.0NaNNaN
\n", "
" ], "text/plain": [ " date time SYS(mmHg) DIA(mmHg) UNKNOW_1 \\\n", "timestamp \n", "2019-03-01 16:18:00 2019-03-01 16:18:00 107 76 78.0 \n", "2019-03-01 16:19:00 2019-03-01 16:19:00 96 62 63.0 \n", "2019-03-01 16:22:00 2019-03-01 16:22:00 100 68 64.0 \n", "2019-03-01 16:23:00 2019-03-01 16:23:00 103 68 68.0 \n", "2019-03-01 16:25:00 2019-03-01 16:25:00 101 67 65.0 \n", "\n", " UNKNOW_2 UNKNOW_3 CODE \n", "timestamp \n", "2019-03-01 16:18:00 78.0 NaN NaN \n", "2019-03-01 16:19:00 63.0 NaN NaN \n", "2019-03-01 16:22:00 64.0 NaN NaN \n", "2019-03-01 16:23:00 68.0 NaN NaN \n", "2019-03-01 16:25:00 65.0 NaN NaN " ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spacelabs_reader.data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Timeshift the data\n", "\n", "Apply a timeshift:" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datetimeSYS(mmHg)DIA(mmHg)UNKNOW_1UNKNOW_2UNKNOW_3CODE
timestamp
2018-02-28 18:14:002018-02-2818:14:001077678.078.0NaNNaN
2018-02-28 18:15:002018-02-2818:15:00966263.063.0NaNNaN
2018-02-28 18:18:002018-02-2818:18:001006864.064.0NaNNaN
2018-02-28 18:19:002018-02-2818:19:001036868.068.0NaNNaN
2018-02-28 18:21:002018-02-2818:21:001016765.065.0NaNNaN
\n", "
" ], "text/plain": [ " date time SYS(mmHg) DIA(mmHg) UNKNOW_1 \\\n", "timestamp \n", "2018-02-28 18:14:00 2018-02-28 18:14:00 107 76 78.0 \n", "2018-02-28 18:15:00 2018-02-28 18:15:00 96 62 63.0 \n", "2018-02-28 18:18:00 2018-02-28 18:18:00 100 68 64.0 \n", "2018-02-28 18:19:00 2018-02-28 18:19:00 103 68 68.0 \n", "2018-02-28 18:21:00 2018-02-28 18:21:00 101 67 65.0 \n", "\n", " UNKNOW_2 UNKNOW_3 CODE \n", "timestamp \n", "2018-02-28 18:14:00 78.0 NaN NaN \n", "2018-02-28 18:15:00 63.0 NaN NaN \n", "2018-02-28 18:18:00 64.0 NaN NaN \n", "2018-02-28 18:19:00 68.0 NaN NaN \n", "2018-02-28 18:21:00 65.0 NaN NaN " ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spacelabs_reader.timeshift()\n", "spacelabs_reader.data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By providing no parameter to `timeshift` the data is shifted by a random time interval between one month and two years to the past. You can also provide a `pandas.Timedelta` object to shift the data by that timedelta or a `pandas.Timestamp` object to shift the data such that this timestamp is the earliest entry." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Remove metadata" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'PATIENTINFO': {'DOB': '', 'RACE': ''},\n", " 'REPORTINFO': {'PHYSICIAN': '',\n", " 'NURSETECH': '',\n", " 'STATUS': '',\n", " 'CALIPERSUMMARY': {'COUNT': ''}}}" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spacelabs_reader.deidentify('001')\n", "spacelabs_reader.metadata" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Write the data" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['spacelabs.abp']" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spacelabs_write_path = os.path.join(write_dir, 'Spacelabs')\n", "\n", "if not os.path.isdir(spacelabs_write_path):\n", " os.makedirs(spacelabs_write_path)\n", "\n", "spacelabs_reader.write(os.path.join(spacelabs_write_path, 'spacelabs.abp'))\n", "os.listdir(spacelabs_write_path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Bittium Faros\n", "\n", "The Faros device outpus data in [EDF files](https://www.edfplus.info/specs/edf.html). These are specifically made for health sensor data and not human-readable." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Read the data" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [], "source": [ "faros_reader = devicely.FarosReader(os.path.join('Faros', 'faros.EDF'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Access metadata:" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Timestamp('2019-03-01 16:12:43')" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "faros_reader.start_time" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'ECG': 1000.0, 'ACC': 100.0, 'Marker': 1.0, 'HRV': 5.0}" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "faros_reader.sample_freqs" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'ECG': 'uV', 'ACC': 'mg', 'HRV': 'ms'}" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "faros_reader.units" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can access the individual signals via the `ECG`, `ACC`, `HRV` and `Marker` attributes:" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
XYZ
2019-03-01 16:12:43.000164.023.0-1172.0
2019-03-01 16:12:43.010152.023.0-1172.0
2019-03-01 16:12:43.020152.0-24.0-1079.0
2019-03-01 16:12:43.030117.011.0-985.0
2019-03-01 16:12:43.040-47.0246.0-1125.0
\n", "
" ], "text/plain": [ " X Y Z\n", "2019-03-01 16:12:43.000 164.0 23.0 -1172.0\n", "2019-03-01 16:12:43.010 152.0 23.0 -1172.0\n", "2019-03-01 16:12:43.020 152.0 -24.0 -1079.0\n", "2019-03-01 16:12:43.030 117.0 11.0 -985.0\n", "2019-03-01 16:12:43.040 -47.0 246.0 -1125.0" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "faros_reader.ACC.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Join the dataframes:" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ECGACC_XACC_YACC_ZACC_magMarkerHRV
2019-03-01 16:12:43.00026.0164.023.0-1172.0NaN0.00.0
2019-03-01 16:12:43.001-6.0NaNNaNNaNNaNNaNNaN
2019-03-01 16:12:43.002-31.0NaNNaNNaNNaNNaNNaN
2019-03-01 16:12:43.003-39.0NaNNaNNaNNaNNaNNaN
2019-03-01 16:12:43.004-17.0NaNNaNNaNNaNNaNNaN
\n", "
" ], "text/plain": [ " ECG ACC_X ACC_Y ACC_Z ACC_mag Marker HRV\n", "2019-03-01 16:12:43.000 26.0 164.0 23.0 -1172.0 NaN 0.0 0.0\n", "2019-03-01 16:12:43.001 -6.0 NaN NaN NaN NaN NaN NaN\n", "2019-03-01 16:12:43.002 -31.0 NaN NaN NaN NaN NaN NaN\n", "2019-03-01 16:12:43.003 -39.0 NaN NaN NaN NaN NaN NaN\n", "2019-03-01 16:12:43.004 -17.0 NaN NaN NaN NaN NaN NaN" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "faros_reader.join_dataframes()\n", "faros_reader.data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Timeshift the data\n", "\n", "Apply a timeshift:" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ECGACC_XACC_YACC_ZACC_magMarkerHRV
2018-02-22 09:32:12.00026.0164.023.0-1172.0NaN0.00.0
2018-02-22 09:32:12.001-6.0NaNNaNNaNNaNNaNNaN
2018-02-22 09:32:12.002-31.0NaNNaNNaNNaNNaNNaN
2018-02-22 09:32:12.003-39.0NaNNaNNaNNaNNaNNaN
2018-02-22 09:32:12.004-17.0NaNNaNNaNNaNNaNNaN
\n", "
" ], "text/plain": [ " ECG ACC_X ACC_Y ACC_Z ACC_mag Marker HRV\n", "2018-02-22 09:32:12.000 26.0 164.0 23.0 -1172.0 NaN 0.0 0.0\n", "2018-02-22 09:32:12.001 -6.0 NaN NaN NaN NaN NaN NaN\n", "2018-02-22 09:32:12.002 -31.0 NaN NaN NaN NaN NaN NaN\n", "2018-02-22 09:32:12.003 -39.0 NaN NaN NaN NaN NaN NaN\n", "2018-02-22 09:32:12.004 -17.0 NaN NaN NaN NaN NaN NaN" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "faros_reader.timeshift()\n", "faros_reader.data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By providing no parameter to `timeshift` the data is shifted by a random time interval between one month and two years to the past. You can also provide a `pandas.Timedelta` object to shift the data by that timedelta or a `pandas.Timestamp` object to shift the data such that this timestamp is the earliest entry." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Write the data\n", "\n", "You can write back the data in the original EDF format or to a directory of individual signal files. Writing to a directory is the preferred method. You can find out why this is the case in our [module reference](https://hpi-dhc.github.io/devicely/moduleref.html#module-devicely.faros)." ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Marker.csv', 'ECG.csv', 'HRV.csv', 'faros.edf', 'meta.json', 'ACC.csv']" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "faros_write_path = os.path.join(write_dir, 'Faros')\n", "faros_reader.write(faros_write_path)\n", "os.listdir(faros_write_path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also create a FarosReader from a written directory:" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2019-03-01 16:12:43.000 26.0\n", "2019-03-01 16:12:43.001 -6.0\n", "2019-03-01 16:12:43.002 -31.0\n", "2019-03-01 16:12:43.003 -39.0\n", "2019-03-01 16:12:43.004 -17.0\n", "Freq: L, Name: ECG, dtype: float64" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_faros_reader = devicely.FarosReader(faros_write_path)\n", "new_faros_reader.ECG.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also save files as EDF if the necessary metadata are still present." ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Marker.csv', 'ECG.csv', 'HRV.csv', 'faros.edf', 'meta.json', 'ACC.csv']" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "faros_write_new_path = os.path.join(write_dir, 'Faros', 'faros.edf')\n", "faros_reader.write(faros_write_new_path, file_format='edf')\n", "os.listdir(faros_write_path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Biovotion Everion\n", "\n", "The Everion device outputs data in [multiple csv files](https://github.com/hpi-dhc/devicely-example/tree/main/Everion). Each csv file has a `tag` column which specifies the type of measurement. You can see the different tags and what they mean by looking at `EverionReader.SIGNAL_TAGS`, `EverionReader.SENSOR_TAGS` and `EverionReader.FEATURE_TAGS`." ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{14: 'inter_pulse_interval',\n", " 17: 'pis',\n", " 18: 'pid',\n", " 77: 'inter_pulse_deviation',\n", " 78: 'pis_quality',\n", " 79: 'pid_quality'}" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "devicely.EverionReader.FEATURE_TAGS" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Read the data" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [], "source": [ "everion_reader = devicely.EverionReader('Everion')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you would like to specify which tags to keep, you can specify this when initializing the reader.\n", "\n", "Access the individual dataframes via aggregates, analytics_events, attributes_dailys, everion_events, features, sensors and signals attributes:" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
countstreamTypetagtimevaluesquality
08061322712019-03-01 15:39:580.000000NaN
18061322132019-03-01 15:39:5821.864220100.0
2806132262019-03-01 15:39:5865.00000085.0
38061322662019-03-01 15:39:581.568628NaN
48061322122019-03-01 15:39:5818.00000093.0
\n", "
" ], "text/plain": [ " count streamType tag time values quality\n", "0 806132 2 71 2019-03-01 15:39:58 0.000000 NaN\n", "1 806132 2 13 2019-03-01 15:39:58 21.864220 100.0\n", "2 806132 2 6 2019-03-01 15:39:58 65.000000 85.0\n", "3 806132 2 66 2019-03-01 15:39:58 1.568628 NaN\n", "4 806132 2 12 2019-03-01 15:39:58 18.000000 93.0" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "everion_reader.signals.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Access a joined dataframe of all signals:" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
heart_rateheart_rate_qualityoxygen_saturationoxygen_saturation_qualityheart_rate_variabilityheart_rate_variability_qualityrespiration_raterespiration_rate_qualityctempctemp_quality...inter_pulse_intervalinter_pulse_interval_deviationled1_dataled2_dataled3_dataled4_dataaccx_dataaccy_dataaccz_dataacc_mag
time
2019-03-01 13:23:05.000000000NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaN3028.02989.02924.03340.0368.02096.0-3536.04126.976617
2019-03-01 13:23:05.019607808NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaN3309.03336.03231.03417.0256.02016.0-3808.04316.324362
2019-03-01 13:23:05.039215872NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaN3454.03443.03390.03492.0144.02288.0-3728.04376.489918
2019-03-01 13:23:05.058823680NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaN3207.03217.03126.03543.096.02352.0-3600.04301.292829
2019-03-01 13:23:05.078431488NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaN3079.03092.02994.03538.00.02384.0-3904.04574.349353
\n", "

5 rows × 25 columns

\n", "
" ], "text/plain": [ " heart_rate heart_rate_quality \\\n", "time \n", "2019-03-01 13:23:05.000000000 NaN NaN \n", "2019-03-01 13:23:05.019607808 NaN NaN \n", "2019-03-01 13:23:05.039215872 NaN NaN \n", "2019-03-01 13:23:05.058823680 NaN NaN \n", "2019-03-01 13:23:05.078431488 NaN NaN \n", "\n", " oxygen_saturation oxygen_saturation_quality \\\n", "time \n", "2019-03-01 13:23:05.000000000 NaN NaN \n", "2019-03-01 13:23:05.019607808 NaN NaN \n", "2019-03-01 13:23:05.039215872 NaN NaN \n", "2019-03-01 13:23:05.058823680 NaN NaN \n", "2019-03-01 13:23:05.078431488 NaN NaN \n", "\n", " heart_rate_variability \\\n", "time \n", "2019-03-01 13:23:05.000000000 NaN \n", "2019-03-01 13:23:05.019607808 NaN \n", "2019-03-01 13:23:05.039215872 NaN \n", "2019-03-01 13:23:05.058823680 NaN \n", "2019-03-01 13:23:05.078431488 NaN \n", "\n", " heart_rate_variability_quality \\\n", "time \n", "2019-03-01 13:23:05.000000000 NaN \n", "2019-03-01 13:23:05.019607808 NaN \n", "2019-03-01 13:23:05.039215872 NaN \n", "2019-03-01 13:23:05.058823680 NaN \n", "2019-03-01 13:23:05.078431488 NaN \n", "\n", " respiration_rate respiration_rate_quality \\\n", "time \n", "2019-03-01 13:23:05.000000000 NaN NaN \n", "2019-03-01 13:23:05.019607808 NaN NaN \n", "2019-03-01 13:23:05.039215872 NaN NaN \n", "2019-03-01 13:23:05.058823680 NaN NaN \n", "2019-03-01 13:23:05.078431488 NaN NaN \n", "\n", " ctemp ctemp_quality ... \\\n", "time ... \n", "2019-03-01 13:23:05.000000000 NaN NaN ... \n", "2019-03-01 13:23:05.019607808 NaN NaN ... \n", "2019-03-01 13:23:05.039215872 NaN NaN ... \n", "2019-03-01 13:23:05.058823680 NaN NaN ... \n", "2019-03-01 13:23:05.078431488 NaN NaN ... \n", "\n", " inter_pulse_interval \\\n", "time \n", "2019-03-01 13:23:05.000000000 NaN \n", "2019-03-01 13:23:05.019607808 NaN \n", "2019-03-01 13:23:05.039215872 NaN \n", "2019-03-01 13:23:05.058823680 NaN \n", "2019-03-01 13:23:05.078431488 NaN \n", "\n", " inter_pulse_interval_deviation led1_data \\\n", "time \n", "2019-03-01 13:23:05.000000000 NaN 3028.0 \n", "2019-03-01 13:23:05.019607808 NaN 3309.0 \n", "2019-03-01 13:23:05.039215872 NaN 3454.0 \n", "2019-03-01 13:23:05.058823680 NaN 3207.0 \n", "2019-03-01 13:23:05.078431488 NaN 3079.0 \n", "\n", " led2_data led3_data led4_data accx_data \\\n", "time \n", "2019-03-01 13:23:05.000000000 2989.0 2924.0 3340.0 368.0 \n", "2019-03-01 13:23:05.019607808 3336.0 3231.0 3417.0 256.0 \n", "2019-03-01 13:23:05.039215872 3443.0 3390.0 3492.0 144.0 \n", "2019-03-01 13:23:05.058823680 3217.0 3126.0 3543.0 96.0 \n", "2019-03-01 13:23:05.078431488 3092.0 2994.0 3538.0 0.0 \n", "\n", " accy_data accz_data acc_mag \n", "time \n", "2019-03-01 13:23:05.000000000 2096.0 -3536.0 4126.976617 \n", "2019-03-01 13:23:05.019607808 2016.0 -3808.0 4316.324362 \n", "2019-03-01 13:23:05.039215872 2288.0 -3728.0 4376.489918 \n", "2019-03-01 13:23:05.058823680 2352.0 -3600.0 4301.292829 \n", "2019-03-01 13:23:05.078431488 2384.0 -3904.0 4574.349353 \n", "\n", "[5 rows x 25 columns]" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "everion_reader.data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Timeshift the data\n", "\n", "Apply a timeshift:" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
heart_rateheart_rate_qualityoxygen_saturationoxygen_saturation_qualityheart_rate_variabilityheart_rate_variability_qualityrespiration_raterespiration_rate_qualityctempctemp_quality...inter_pulse_intervalinter_pulse_interval_deviationled1_dataled2_dataled3_dataled4_dataaccx_dataaccy_dataaccz_dataacc_mag
time
2017-04-01 20:53:51.000000000NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaN3028.02989.02924.03340.0368.02096.0-3536.04126.976617
2017-04-01 20:53:51.019607808NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaN3309.03336.03231.03417.0256.02016.0-3808.04316.324362
2017-04-01 20:53:51.039215872NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaN3454.03443.03390.03492.0144.02288.0-3728.04376.489918
2017-04-01 20:53:51.058823680NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaN3207.03217.03126.03543.096.02352.0-3600.04301.292829
2017-04-01 20:53:51.078431488NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaN3079.03092.02994.03538.00.02384.0-3904.04574.349353
\n", "

5 rows × 25 columns

\n", "
" ], "text/plain": [ " heart_rate heart_rate_quality \\\n", "time \n", "2017-04-01 20:53:51.000000000 NaN NaN \n", "2017-04-01 20:53:51.019607808 NaN NaN \n", "2017-04-01 20:53:51.039215872 NaN NaN \n", "2017-04-01 20:53:51.058823680 NaN NaN \n", "2017-04-01 20:53:51.078431488 NaN NaN \n", "\n", " oxygen_saturation oxygen_saturation_quality \\\n", "time \n", "2017-04-01 20:53:51.000000000 NaN NaN \n", "2017-04-01 20:53:51.019607808 NaN NaN \n", "2017-04-01 20:53:51.039215872 NaN NaN \n", "2017-04-01 20:53:51.058823680 NaN NaN \n", "2017-04-01 20:53:51.078431488 NaN NaN \n", "\n", " heart_rate_variability \\\n", "time \n", "2017-04-01 20:53:51.000000000 NaN \n", "2017-04-01 20:53:51.019607808 NaN \n", "2017-04-01 20:53:51.039215872 NaN \n", "2017-04-01 20:53:51.058823680 NaN \n", "2017-04-01 20:53:51.078431488 NaN \n", "\n", " heart_rate_variability_quality \\\n", "time \n", "2017-04-01 20:53:51.000000000 NaN \n", "2017-04-01 20:53:51.019607808 NaN \n", "2017-04-01 20:53:51.039215872 NaN \n", "2017-04-01 20:53:51.058823680 NaN \n", "2017-04-01 20:53:51.078431488 NaN \n", "\n", " respiration_rate respiration_rate_quality \\\n", "time \n", "2017-04-01 20:53:51.000000000 NaN NaN \n", "2017-04-01 20:53:51.019607808 NaN NaN \n", "2017-04-01 20:53:51.039215872 NaN NaN \n", "2017-04-01 20:53:51.058823680 NaN NaN \n", "2017-04-01 20:53:51.078431488 NaN NaN \n", "\n", " ctemp ctemp_quality ... \\\n", "time ... \n", "2017-04-01 20:53:51.000000000 NaN NaN ... \n", "2017-04-01 20:53:51.019607808 NaN NaN ... \n", "2017-04-01 20:53:51.039215872 NaN NaN ... \n", "2017-04-01 20:53:51.058823680 NaN NaN ... \n", "2017-04-01 20:53:51.078431488 NaN NaN ... \n", "\n", " inter_pulse_interval \\\n", "time \n", "2017-04-01 20:53:51.000000000 NaN \n", "2017-04-01 20:53:51.019607808 NaN \n", "2017-04-01 20:53:51.039215872 NaN \n", "2017-04-01 20:53:51.058823680 NaN \n", "2017-04-01 20:53:51.078431488 NaN \n", "\n", " inter_pulse_interval_deviation led1_data \\\n", "time \n", "2017-04-01 20:53:51.000000000 NaN 3028.0 \n", "2017-04-01 20:53:51.019607808 NaN 3309.0 \n", "2017-04-01 20:53:51.039215872 NaN 3454.0 \n", "2017-04-01 20:53:51.058823680 NaN 3207.0 \n", "2017-04-01 20:53:51.078431488 NaN 3079.0 \n", "\n", " led2_data led3_data led4_data accx_data \\\n", "time \n", "2017-04-01 20:53:51.000000000 2989.0 2924.0 3340.0 368.0 \n", "2017-04-01 20:53:51.019607808 3336.0 3231.0 3417.0 256.0 \n", "2017-04-01 20:53:51.039215872 3443.0 3390.0 3492.0 144.0 \n", "2017-04-01 20:53:51.058823680 3217.0 3126.0 3543.0 96.0 \n", "2017-04-01 20:53:51.078431488 3092.0 2994.0 3538.0 0.0 \n", "\n", " accy_data accz_data acc_mag \n", "time \n", "2017-04-01 20:53:51.000000000 2096.0 -3536.0 4126.976617 \n", "2017-04-01 20:53:51.019607808 2016.0 -3808.0 4316.324362 \n", "2017-04-01 20:53:51.039215872 2288.0 -3728.0 4376.489918 \n", "2017-04-01 20:53:51.058823680 2352.0 -3600.0 4301.292829 \n", "2017-04-01 20:53:51.078431488 2384.0 -3904.0 4574.349353 \n", "\n", "[5 rows x 25 columns]" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "everion_reader.timeshift()\n", "everion_reader.data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By providing no parameter to `timeshift` the data is shifted by a random time interval between one month and two years to the past. You can also provide a `pandas.Timedelta` object to shift the data by that timedelta or a `pandas.Timestamp` object to shift the data such that this timestamp is the earliest entry." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Write the data\n", "\n", "Write the data to a directory while keeping the same format as the original. If you used only a subset of tags when initializing the reader, only these tags will be written." ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['sensor_data.csv',\n", " 'analytics_events.csv',\n", " 'aggregates.csv',\n", " 'everion_events.csv',\n", " 'attributes_dailys.csv',\n", " 'signals.csv',\n", " 'features.csv']" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "everion_write_path = os.path.join(write_dir, 'Everion')\n", "everion_reader.write(everion_write_path)\n", "os.listdir(everion_write_path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Shimmer\n", "\n", "Shimmer uses a [single CSV file](https://github.com/hpi-dhc/devicely-example/tree/main/Shimmer), indexed by time of measurement." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Read the data" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Shimmer_40AC_Timestamp_Unix_CALShimmer_40AC_Accel_LN_X_CALShimmer_40AC_Accel_LN_Y_CALShimmer_40AC_Accel_LN_Z_CALShimmer_40AC_Accel_WR_X_CALShimmer_40AC_Accel_WR_Y_CALShimmer_40AC_Accel_WR_Z_CALShimmer_40AC_Battery_CALShimmer_40AC_Ext_Exp_A15_CALShimmer_40AC_GSR_Range_CAL...Shimmer_40AC_Gyro_X_CALShimmer_40AC_Gyro_Y_CALShimmer_40AC_Gyro_Z_CALShimmer_40AC_Int_Exp_A12_CALShimmer_40AC_Mag_X_CALShimmer_40AC_Mag_Y_CALShimmer_40AC_Mag_Z_CALShimmer_40AC_Pressure_BMP280_CALShimmer_40AC_Temperature_BMP280_CALShimmer_40AC_Accel_LN_mag
02020-07-28 10:56:50.034-1.43478310.00.554348-3.9305808.421305-1.6205864139.1941391684.9816852.0...0.1374051.877863-0.1832061680.586081-0.112444-0.916042-0.047976100.43537933.36587810.117604
12020-07-28 10:56:50.057-1.40217410.00.554348-3.9233998.442849-1.5990424137.7289381673.2600732.0...0.1832061.328244-0.4122141703.296703-0.109445-0.913043-0.047976100.42973133.36587810.113031
22020-07-28 10:56:50.074-1.43478310.00.554348-3.8970688.428486-1.6038304111.3553111901.0989012.0...0.2748091.282443-0.1984731687.179487-0.107946-0.910045-0.049475100.44102733.36587810.117604
32020-07-28 10:56:50.099-1.41304310.00.521739-3.9329748.421305-1.5894674140.6593411722.3443222.0...0.2290081.450382-0.1221371650.549451-0.106447-0.901049-0.050975100.44102733.36587810.112809
42020-07-28 10:56:50.111-1.44565210.00.510870-3.9449438.428486-1.6612814134.7985351678.3882782.0...0.1374051.511450-0.4732821701.831502-0.113943-0.904048-0.037481100.43820333.36587810.116862
\n", "

5 rows × 22 columns

\n", "
" ], "text/plain": [ " Shimmer_40AC_Timestamp_Unix_CAL Shimmer_40AC_Accel_LN_X_CAL \\\n", "0 2020-07-28 10:56:50.034 -1.434783 \n", "1 2020-07-28 10:56:50.057 -1.402174 \n", "2 2020-07-28 10:56:50.074 -1.434783 \n", "3 2020-07-28 10:56:50.099 -1.413043 \n", "4 2020-07-28 10:56:50.111 -1.445652 \n", "\n", " Shimmer_40AC_Accel_LN_Y_CAL Shimmer_40AC_Accel_LN_Z_CAL \\\n", "0 10.0 0.554348 \n", "1 10.0 0.554348 \n", "2 10.0 0.554348 \n", "3 10.0 0.521739 \n", "4 10.0 0.510870 \n", "\n", " Shimmer_40AC_Accel_WR_X_CAL Shimmer_40AC_Accel_WR_Y_CAL \\\n", "0 -3.930580 8.421305 \n", "1 -3.923399 8.442849 \n", "2 -3.897068 8.428486 \n", "3 -3.932974 8.421305 \n", "4 -3.944943 8.428486 \n", "\n", " Shimmer_40AC_Accel_WR_Z_CAL Shimmer_40AC_Battery_CAL \\\n", "0 -1.620586 4139.194139 \n", "1 -1.599042 4137.728938 \n", "2 -1.603830 4111.355311 \n", "3 -1.589467 4140.659341 \n", "4 -1.661281 4134.798535 \n", "\n", " Shimmer_40AC_Ext_Exp_A15_CAL Shimmer_40AC_GSR_Range_CAL ... \\\n", "0 1684.981685 2.0 ... \n", "1 1673.260073 2.0 ... \n", "2 1901.098901 2.0 ... \n", "3 1722.344322 2.0 ... \n", "4 1678.388278 2.0 ... \n", "\n", " Shimmer_40AC_Gyro_X_CAL Shimmer_40AC_Gyro_Y_CAL Shimmer_40AC_Gyro_Z_CAL \\\n", "0 0.137405 1.877863 -0.183206 \n", "1 0.183206 1.328244 -0.412214 \n", "2 0.274809 1.282443 -0.198473 \n", "3 0.229008 1.450382 -0.122137 \n", "4 0.137405 1.511450 -0.473282 \n", "\n", " Shimmer_40AC_Int_Exp_A12_CAL Shimmer_40AC_Mag_X_CAL \\\n", "0 1680.586081 -0.112444 \n", "1 1703.296703 -0.109445 \n", "2 1687.179487 -0.107946 \n", "3 1650.549451 -0.106447 \n", "4 1701.831502 -0.113943 \n", "\n", " Shimmer_40AC_Mag_Y_CAL Shimmer_40AC_Mag_Z_CAL \\\n", "0 -0.916042 -0.047976 \n", "1 -0.913043 -0.047976 \n", "2 -0.910045 -0.049475 \n", "3 -0.901049 -0.050975 \n", "4 -0.904048 -0.037481 \n", "\n", " Shimmer_40AC_Pressure_BMP280_CAL Shimmer_40AC_Temperature_BMP280_CAL \\\n", "0 100.435379 33.365878 \n", "1 100.429731 33.365878 \n", "2 100.441027 33.365878 \n", "3 100.441027 33.365878 \n", "4 100.438203 33.365878 \n", "\n", " Shimmer_40AC_Accel_LN_mag \n", "0 10.117604 \n", "1 10.113031 \n", "2 10.117604 \n", "3 10.112809 \n", "4 10.116862 \n", "\n", "[5 rows x 22 columns]" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "shimmer_reader = devicely.ShimmerPlusReader(os.path.join('Shimmer', 'shimmer.csv'))\n", "shimmer_reader.data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Timeshift the data\n", "\n", "Apply a timeshift:" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Shimmer_40AC_Timestamp_Unix_CALShimmer_40AC_Accel_LN_X_CALShimmer_40AC_Accel_LN_Y_CALShimmer_40AC_Accel_LN_Z_CALShimmer_40AC_Accel_WR_X_CALShimmer_40AC_Accel_WR_Y_CALShimmer_40AC_Accel_WR_Z_CALShimmer_40AC_Battery_CALShimmer_40AC_Ext_Exp_A15_CALShimmer_40AC_GSR_Range_CAL...Shimmer_40AC_Gyro_X_CALShimmer_40AC_Gyro_Y_CALShimmer_40AC_Gyro_Z_CALShimmer_40AC_Int_Exp_A12_CALShimmer_40AC_Mag_X_CALShimmer_40AC_Mag_Y_CALShimmer_40AC_Mag_Z_CALShimmer_40AC_Pressure_BMP280_CALShimmer_40AC_Temperature_BMP280_CALShimmer_40AC_Accel_LN_mag
02019-06-20 19:45:55.894-1.43478310.00.554348-3.9305808.421305-1.6205864139.1941391684.9816852.0...0.1374051.877863-0.1832061680.586081-0.112444-0.916042-0.047976100.43537933.36587810.117604
12019-06-20 19:45:55.917-1.40217410.00.554348-3.9233998.442849-1.5990424137.7289381673.2600732.0...0.1832061.328244-0.4122141703.296703-0.109445-0.913043-0.047976100.42973133.36587810.113031
22019-06-20 19:45:55.934-1.43478310.00.554348-3.8970688.428486-1.6038304111.3553111901.0989012.0...0.2748091.282443-0.1984731687.179487-0.107946-0.910045-0.049475100.44102733.36587810.117604
32019-06-20 19:45:55.959-1.41304310.00.521739-3.9329748.421305-1.5894674140.6593411722.3443222.0...0.2290081.450382-0.1221371650.549451-0.106447-0.901049-0.050975100.44102733.36587810.112809
42019-06-20 19:45:55.971-1.44565210.00.510870-3.9449438.428486-1.6612814134.7985351678.3882782.0...0.1374051.511450-0.4732821701.831502-0.113943-0.904048-0.037481100.43820333.36587810.116862
\n", "

5 rows × 22 columns

\n", "
" ], "text/plain": [ " Shimmer_40AC_Timestamp_Unix_CAL Shimmer_40AC_Accel_LN_X_CAL \\\n", "0 2019-06-20 19:45:55.894 -1.434783 \n", "1 2019-06-20 19:45:55.917 -1.402174 \n", "2 2019-06-20 19:45:55.934 -1.434783 \n", "3 2019-06-20 19:45:55.959 -1.413043 \n", "4 2019-06-20 19:45:55.971 -1.445652 \n", "\n", " Shimmer_40AC_Accel_LN_Y_CAL Shimmer_40AC_Accel_LN_Z_CAL \\\n", "0 10.0 0.554348 \n", "1 10.0 0.554348 \n", "2 10.0 0.554348 \n", "3 10.0 0.521739 \n", "4 10.0 0.510870 \n", "\n", " Shimmer_40AC_Accel_WR_X_CAL Shimmer_40AC_Accel_WR_Y_CAL \\\n", "0 -3.930580 8.421305 \n", "1 -3.923399 8.442849 \n", "2 -3.897068 8.428486 \n", "3 -3.932974 8.421305 \n", "4 -3.944943 8.428486 \n", "\n", " Shimmer_40AC_Accel_WR_Z_CAL Shimmer_40AC_Battery_CAL \\\n", "0 -1.620586 4139.194139 \n", "1 -1.599042 4137.728938 \n", "2 -1.603830 4111.355311 \n", "3 -1.589467 4140.659341 \n", "4 -1.661281 4134.798535 \n", "\n", " Shimmer_40AC_Ext_Exp_A15_CAL Shimmer_40AC_GSR_Range_CAL ... \\\n", "0 1684.981685 2.0 ... \n", "1 1673.260073 2.0 ... \n", "2 1901.098901 2.0 ... \n", "3 1722.344322 2.0 ... \n", "4 1678.388278 2.0 ... \n", "\n", " Shimmer_40AC_Gyro_X_CAL Shimmer_40AC_Gyro_Y_CAL Shimmer_40AC_Gyro_Z_CAL \\\n", "0 0.137405 1.877863 -0.183206 \n", "1 0.183206 1.328244 -0.412214 \n", "2 0.274809 1.282443 -0.198473 \n", "3 0.229008 1.450382 -0.122137 \n", "4 0.137405 1.511450 -0.473282 \n", "\n", " Shimmer_40AC_Int_Exp_A12_CAL Shimmer_40AC_Mag_X_CAL \\\n", "0 1680.586081 -0.112444 \n", "1 1703.296703 -0.109445 \n", "2 1687.179487 -0.107946 \n", "3 1650.549451 -0.106447 \n", "4 1701.831502 -0.113943 \n", "\n", " Shimmer_40AC_Mag_Y_CAL Shimmer_40AC_Mag_Z_CAL \\\n", "0 -0.916042 -0.047976 \n", "1 -0.913043 -0.047976 \n", "2 -0.910045 -0.049475 \n", "3 -0.901049 -0.050975 \n", "4 -0.904048 -0.037481 \n", "\n", " Shimmer_40AC_Pressure_BMP280_CAL Shimmer_40AC_Temperature_BMP280_CAL \\\n", "0 100.435379 33.365878 \n", "1 100.429731 33.365878 \n", "2 100.441027 33.365878 \n", "3 100.441027 33.365878 \n", "4 100.438203 33.365878 \n", "\n", " Shimmer_40AC_Accel_LN_mag \n", "0 10.117604 \n", "1 10.113031 \n", "2 10.117604 \n", "3 10.112809 \n", "4 10.116862 \n", "\n", "[5 rows x 22 columns]" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "shimmer_reader.timeshift()\n", "shimmer_reader.data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By providing no parameter to `timeshift` the data is shifted by a random time interval between one month and two years to the past. You can also provide a `pandas.Timedelta` object to shift the data by that timedelta or a `pandas.Timestamp` object to shift the data such that this timestamp is the earliest entry." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Write the data" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['shimmer_write.csv']" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "shimmer_write_path = os.path.join(write_dir, 'Shimmer')\n", "\n", "if not os.path.isdir(shimmer_write_path):\n", " os.makedirs(shimmer_write_path)\n", "\n", "shimmer_reader.write(os.path.join(shimmer_write_path, 'shimmer_write.csv'))\n", "os.listdir(shimmer_write_path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Muse\n", "\n", "The devicely.MuseReader can be used for reading data generated by the Muse S headband." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Read the data" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Delta_TP9Delta_AF7Delta_AF8Delta_TP10Theta_TP9Theta_AF7Theta_AF8Theta_TP10Alpha_TP9Alpha_AF7...Gyro_XGyro_YGyro_ZHeadBandOnHSI_TP9HSI_AF7HSI_AF8HSI_TP10BatteryElements
TimeStamp
2021-05-24 20:26:20.1030.7351860.7522120.7142831.0234660.2514170.2051590.2087600.4284350.4938290.269544...3.4169010.6056213.7683111.02.01.01.02.0100.0NaN
2021-05-24 20:26:20.588NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaN/muse/elements/blink
2021-05-24 20:26:21.1611.0636710.9159560.7341911.0234661.1204000.3675090.3032930.4284350.9749900.348580...4.6430972.3551942.0262151.01.01.01.01.0100.0NaN
2021-05-24 20:26:22.1741.2265230.7913290.6858410.5500561.2893430.6477030.1879950.0703210.7260450.420135...4.2393490.6355293.4841921.01.01.01.01.0100.0NaN
2021-05-24 20:26:23.1841.0096490.8220140.6774200.8019441.0352770.500738-0.0495150.6735280.8054430.446498...4.366455-0.0523381.5252691.01.01.01.01.0100.0NaN
\n", "

5 rows × 38 columns

\n", "
" ], "text/plain": [ " Delta_TP9 Delta_AF7 Delta_AF8 Delta_TP10 \\\n", "TimeStamp \n", "2021-05-24 20:26:20.103 0.735186 0.752212 0.714283 1.023466 \n", "2021-05-24 20:26:20.588 NaN NaN NaN NaN \n", "2021-05-24 20:26:21.161 1.063671 0.915956 0.734191 1.023466 \n", "2021-05-24 20:26:22.174 1.226523 0.791329 0.685841 0.550056 \n", "2021-05-24 20:26:23.184 1.009649 0.822014 0.677420 0.801944 \n", "\n", " Theta_TP9 Theta_AF7 Theta_AF8 Theta_TP10 \\\n", "TimeStamp \n", "2021-05-24 20:26:20.103 0.251417 0.205159 0.208760 0.428435 \n", "2021-05-24 20:26:20.588 NaN NaN NaN NaN \n", "2021-05-24 20:26:21.161 1.120400 0.367509 0.303293 0.428435 \n", "2021-05-24 20:26:22.174 1.289343 0.647703 0.187995 0.070321 \n", "2021-05-24 20:26:23.184 1.035277 0.500738 -0.049515 0.673528 \n", "\n", " Alpha_TP9 Alpha_AF7 ... Gyro_X Gyro_Y \\\n", "TimeStamp ... \n", "2021-05-24 20:26:20.103 0.493829 0.269544 ... 3.416901 0.605621 \n", "2021-05-24 20:26:20.588 NaN NaN ... NaN NaN \n", "2021-05-24 20:26:21.161 0.974990 0.348580 ... 4.643097 2.355194 \n", "2021-05-24 20:26:22.174 0.726045 0.420135 ... 4.239349 0.635529 \n", "2021-05-24 20:26:23.184 0.805443 0.446498 ... 4.366455 -0.052338 \n", "\n", " Gyro_Z HeadBandOn HSI_TP9 HSI_AF7 HSI_AF8 \\\n", "TimeStamp \n", "2021-05-24 20:26:20.103 3.768311 1.0 2.0 1.0 1.0 \n", "2021-05-24 20:26:20.588 NaN NaN NaN NaN NaN \n", "2021-05-24 20:26:21.161 2.026215 1.0 1.0 1.0 1.0 \n", "2021-05-24 20:26:22.174 3.484192 1.0 1.0 1.0 1.0 \n", "2021-05-24 20:26:23.184 1.525269 1.0 1.0 1.0 1.0 \n", "\n", " HSI_TP10 Battery Elements \n", "TimeStamp \n", "2021-05-24 20:26:20.103 2.0 100.0 NaN \n", "2021-05-24 20:26:20.588 NaN NaN /muse/elements/blink \n", "2021-05-24 20:26:21.161 1.0 100.0 NaN \n", "2021-05-24 20:26:22.174 1.0 100.0 NaN \n", "2021-05-24 20:26:23.184 1.0 100.0 NaN \n", "\n", "[5 rows x 38 columns]" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "muse_reader = devicely.MuseReader(os.path.join('Muse', 'data.csv'))\n", "muse_reader.data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Timeshift the data\n", "\n", "Apply a random timeshift:" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Delta_TP9Delta_AF7Delta_AF8Delta_TP10Theta_TP9Theta_AF7Theta_AF8Theta_TP10Alpha_TP9Alpha_AF7...Gyro_XGyro_YGyro_ZHeadBandOnHSI_TP9HSI_AF7HSI_AF8HSI_TP10BatteryElements
TimeStamp
2020-05-30 05:03:58.1835873640.7351860.7522120.7142831.0234660.2514170.2051590.2087600.4284350.4938290.269544...3.4169010.6056213.7683111.02.01.01.02.0100.0NaN
2020-05-30 05:03:58.668587364NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaN/muse/elements/blink
2020-05-30 05:03:59.2415873641.0636710.9159560.7341911.0234661.1204000.3675090.3032930.4284350.9749900.348580...4.6430972.3551942.0262151.01.01.01.01.0100.0NaN
2020-05-30 05:04:00.2545873641.2265230.7913290.6858410.5500561.2893430.6477030.1879950.0703210.7260450.420135...4.2393490.6355293.4841921.01.01.01.01.0100.0NaN
2020-05-30 05:04:01.2645873641.0096490.8220140.6774200.8019441.0352770.500738-0.0495150.6735280.8054430.446498...4.366455-0.0523381.5252691.01.01.01.01.0100.0NaN
\n", "

5 rows × 38 columns

\n", "
" ], "text/plain": [ " Delta_TP9 Delta_AF7 Delta_AF8 Delta_TP10 \\\n", "TimeStamp \n", "2020-05-30 05:03:58.183587364 0.735186 0.752212 0.714283 1.023466 \n", "2020-05-30 05:03:58.668587364 NaN NaN NaN NaN \n", "2020-05-30 05:03:59.241587364 1.063671 0.915956 0.734191 1.023466 \n", "2020-05-30 05:04:00.254587364 1.226523 0.791329 0.685841 0.550056 \n", "2020-05-30 05:04:01.264587364 1.009649 0.822014 0.677420 0.801944 \n", "\n", " Theta_TP9 Theta_AF7 Theta_AF8 Theta_TP10 \\\n", "TimeStamp \n", "2020-05-30 05:03:58.183587364 0.251417 0.205159 0.208760 0.428435 \n", "2020-05-30 05:03:58.668587364 NaN NaN NaN NaN \n", "2020-05-30 05:03:59.241587364 1.120400 0.367509 0.303293 0.428435 \n", "2020-05-30 05:04:00.254587364 1.289343 0.647703 0.187995 0.070321 \n", "2020-05-30 05:04:01.264587364 1.035277 0.500738 -0.049515 0.673528 \n", "\n", " Alpha_TP9 Alpha_AF7 ... Gyro_X Gyro_Y \\\n", "TimeStamp ... \n", "2020-05-30 05:03:58.183587364 0.493829 0.269544 ... 3.416901 0.605621 \n", "2020-05-30 05:03:58.668587364 NaN NaN ... NaN NaN \n", "2020-05-30 05:03:59.241587364 0.974990 0.348580 ... 4.643097 2.355194 \n", "2020-05-30 05:04:00.254587364 0.726045 0.420135 ... 4.239349 0.635529 \n", "2020-05-30 05:04:01.264587364 0.805443 0.446498 ... 4.366455 -0.052338 \n", "\n", " Gyro_Z HeadBandOn HSI_TP9 HSI_AF7 \\\n", "TimeStamp \n", "2020-05-30 05:03:58.183587364 3.768311 1.0 2.0 1.0 \n", "2020-05-30 05:03:58.668587364 NaN NaN NaN NaN \n", "2020-05-30 05:03:59.241587364 2.026215 1.0 1.0 1.0 \n", "2020-05-30 05:04:00.254587364 3.484192 1.0 1.0 1.0 \n", "2020-05-30 05:04:01.264587364 1.525269 1.0 1.0 1.0 \n", "\n", " HSI_AF8 HSI_TP10 Battery \\\n", "TimeStamp \n", "2020-05-30 05:03:58.183587364 1.0 2.0 100.0 \n", "2020-05-30 05:03:58.668587364 NaN NaN NaN \n", "2020-05-30 05:03:59.241587364 1.0 1.0 100.0 \n", "2020-05-30 05:04:00.254587364 1.0 1.0 100.0 \n", "2020-05-30 05:04:01.264587364 1.0 1.0 100.0 \n", "\n", " Elements \n", "TimeStamp \n", "2020-05-30 05:03:58.183587364 NaN \n", "2020-05-30 05:03:58.668587364 /muse/elements/blink \n", "2020-05-30 05:03:59.241587364 NaN \n", "2020-05-30 05:04:00.254587364 NaN \n", "2020-05-30 05:04:01.264587364 NaN \n", "\n", "[5 rows x 38 columns]" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "muse_reader.timeshift()\n", "muse_reader.data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Write the data" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Spacelabs',\n", " 'Everion',\n", " 'muse_write_data.csv',\n", " 'Empatica',\n", " 'Faros',\n", " 'Tags',\n", " 'Shimmer']" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "muse_write_path = os.path.join(write_dir, 'muse_write_data.csv')\n", "\n", "if os.path.isfile(muse_write_path):\n", " os.remove(muse_write_path)\n", "\n", "muse_reader.write(muse_write_path)\n", "os.listdir(write_dir)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Tags\n", "\n", "You can use the TimeStampReader to read data created by the Android app TimeStamp. Researchers use this app to mark important times during experiments. The format simple, as can be seen in this [example file](https://github.com/hpi-dhc/devicely-example/tree/main/Tags)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Read the data" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
tag_numbertag
time
2019-03-01 16:16:371Shake
2019-03-01 16:17:432Start
2019-03-01 16:18:203BP Measurement
2019-03-01 16:19:514BP Measurement
2019-03-01 16:22:005BP Measurement
\n", "
" ], "text/plain": [ " tag_number tag\n", "time \n", "2019-03-01 16:16:37 1 Shake\n", "2019-03-01 16:17:43 2 Start\n", "2019-03-01 16:18:20 3 BP Measurement\n", "2019-03-01 16:19:51 4 BP Measurement\n", "2019-03-01 16:22:00 5 BP Measurement" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "timestamp_reader = devicely.TimeStampReader(os.path.join('Tags', 'tags.csv'))\n", "timestamp_reader.data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Timeshif the data\n", "\n", "Apply a timeshift:" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
tag_numbertag
time
2017-09-12 21:26:481Shake
2017-09-12 21:27:542Start
2017-09-12 21:28:313BP Measurement
2017-09-12 21:30:024BP Measurement
2017-09-12 21:32:115BP Measurement
\n", "
" ], "text/plain": [ " tag_number tag\n", "time \n", "2017-09-12 21:26:48 1 Shake\n", "2017-09-12 21:27:54 2 Start\n", "2017-09-12 21:28:31 3 BP Measurement\n", "2017-09-12 21:30:02 4 BP Measurement\n", "2017-09-12 21:32:11 5 BP Measurement" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "timestamp_reader.timeshift()\n", "timestamp_reader.data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By providing no parameter to `timeshift` the data is shifted by a random time interval between one month and two years to the past. You can also provide a `pandas.Timedelta` object to shift the data by that timedelta or a `pandas.Timestamp` object to shift the data such that this timestamp is the earliest entry." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Write the data" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['tags_write.csv']" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tags_write_path = os.path.join(write_dir, 'Tags')\n", "\n", "if not os.path.isdir(tags_write_path):\n", " os.makedirs(tags_write_path)\n", "\n", "timestamp_reader.write(os.path.join(tags_write_path, 'tags_write.csv'))\n", "os.listdir(tags_write_path)" ] } ], "metadata": { "kernelspec": { "display_name": "devicely", "language": "python", "name": "devicely" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" } }, "nbformat": 4, "nbformat_minor": 4 }