{ "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": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>ACC_X</th>\n", " <th>ACC_Y</th>\n", " <th>ACC_Z</th>\n", " <th>BVP</th>\n", " <th>EDA</th>\n", " <th>HR</th>\n", " <th>TEMP</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>2020-10-16 17:04:29.000000</th>\n", " <td>-3.0</td>\n", " <td>11.0</td>\n", " <td>60.0</td>\n", " <td>-0.0</td>\n", " <td>0.0</td>\n", " <td>NaN</td>\n", " <td>31.13</td>\n", " </tr>\n", " <tr>\n", " <th>2020-10-16 17:04:29.015625</th>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>-0.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2020-10-16 17:04:29.031250</th>\n", " <td>-3.0</td>\n", " <td>11.0</td>\n", " <td>60.0</td>\n", " <td>-0.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2020-10-16 17:04:29.046875</th>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>-0.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2020-10-16 17:04:29.062500</th>\n", " <td>-2.0</td>\n", " <td>11.0</td>\n", " <td>60.0</td>\n", " <td>-0.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "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": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>date</th>\n", " <th>time</th>\n", " <th>SYS(mmHg)</th>\n", " <th>DIA(mmHg)</th>\n", " <th>UNKNOW_1</th>\n", " <th>UNKNOW_2</th>\n", " <th>UNKNOW_3</th>\n", " <th>CODE</th>\n", " </tr>\n", " <tr>\n", " <th>timestamp</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>2019-03-01 16:18:00</th>\n", " <td>2019-03-01</td>\n", " <td>16:18:00</td>\n", " <td>107</td>\n", " <td>76</td>\n", " <td>78.0</td>\n", " <td>78.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 16:19:00</th>\n", " <td>2019-03-01</td>\n", " <td>16:19:00</td>\n", " <td>96</td>\n", " <td>62</td>\n", " <td>63.0</td>\n", " <td>63.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 16:22:00</th>\n", " <td>2019-03-01</td>\n", " <td>16:22:00</td>\n", " <td>100</td>\n", " <td>68</td>\n", " <td>64.0</td>\n", " <td>64.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 16:23:00</th>\n", " <td>2019-03-01</td>\n", " <td>16:23:00</td>\n", " <td>103</td>\n", " <td>68</td>\n", " <td>68.0</td>\n", " <td>68.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 16:25:00</th>\n", " <td>2019-03-01</td>\n", " <td>16:25:00</td>\n", " <td>101</td>\n", " <td>67</td>\n", " <td>65.0</td>\n", " <td>65.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "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": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>date</th>\n", " <th>time</th>\n", " <th>SYS(mmHg)</th>\n", " <th>DIA(mmHg)</th>\n", " <th>UNKNOW_1</th>\n", " <th>UNKNOW_2</th>\n", " <th>UNKNOW_3</th>\n", " <th>CODE</th>\n", " </tr>\n", " <tr>\n", " <th>timestamp</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>2018-02-28 18:14:00</th>\n", " <td>2018-02-28</td>\n", " <td>18:14:00</td>\n", " <td>107</td>\n", " <td>76</td>\n", " <td>78.0</td>\n", " <td>78.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2018-02-28 18:15:00</th>\n", " <td>2018-02-28</td>\n", " <td>18:15:00</td>\n", " <td>96</td>\n", " <td>62</td>\n", " <td>63.0</td>\n", " <td>63.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2018-02-28 18:18:00</th>\n", " <td>2018-02-28</td>\n", " <td>18:18:00</td>\n", " <td>100</td>\n", " <td>68</td>\n", " <td>64.0</td>\n", " <td>64.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2018-02-28 18:19:00</th>\n", " <td>2018-02-28</td>\n", " <td>18:19:00</td>\n", " <td>103</td>\n", " <td>68</td>\n", " <td>68.0</td>\n", " <td>68.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2018-02-28 18:21:00</th>\n", " <td>2018-02-28</td>\n", " <td>18:21:00</td>\n", " <td>101</td>\n", " <td>67</td>\n", " <td>65.0</td>\n", " <td>65.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "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": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>X</th>\n", " <th>Y</th>\n", " <th>Z</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>2019-03-01 16:12:43.000</th>\n", " <td>164.0</td>\n", " <td>23.0</td>\n", " <td>-1172.0</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 16:12:43.010</th>\n", " <td>152.0</td>\n", " <td>23.0</td>\n", " <td>-1172.0</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 16:12:43.020</th>\n", " <td>152.0</td>\n", " <td>-24.0</td>\n", " <td>-1079.0</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 16:12:43.030</th>\n", " <td>117.0</td>\n", " <td>11.0</td>\n", " <td>-985.0</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 16:12:43.040</th>\n", " <td>-47.0</td>\n", " <td>246.0</td>\n", " <td>-1125.0</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "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": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>ECG</th>\n", " <th>ACC_X</th>\n", " <th>ACC_Y</th>\n", " <th>ACC_Z</th>\n", " <th>ACC_mag</th>\n", " <th>Marker</th>\n", " <th>HRV</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>2019-03-01 16:12:43.000</th>\n", " <td>26.0</td>\n", " <td>164.0</td>\n", " <td>23.0</td>\n", " <td>-1172.0</td>\n", " <td>NaN</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 16:12:43.001</th>\n", " <td>-6.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 16:12:43.002</th>\n", " <td>-31.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 16:12:43.003</th>\n", " <td>-39.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 16:12:43.004</th>\n", " <td>-17.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "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": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>ECG</th>\n", " <th>ACC_X</th>\n", " <th>ACC_Y</th>\n", " <th>ACC_Z</th>\n", " <th>ACC_mag</th>\n", " <th>Marker</th>\n", " <th>HRV</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>2018-02-22 09:32:12.000</th>\n", " <td>26.0</td>\n", " <td>164.0</td>\n", " <td>23.0</td>\n", " <td>-1172.0</td>\n", " <td>NaN</td>\n", " <td>0.0</td>\n", " <td>0.0</td>\n", " </tr>\n", " <tr>\n", " <th>2018-02-22 09:32:12.001</th>\n", " <td>-6.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2018-02-22 09:32:12.002</th>\n", " <td>-31.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2018-02-22 09:32:12.003</th>\n", " <td>-39.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2018-02-22 09:32:12.004</th>\n", " <td>-17.0</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "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": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>count</th>\n", " <th>streamType</th>\n", " <th>tag</th>\n", " <th>time</th>\n", " <th>values</th>\n", " <th>quality</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>806132</td>\n", " <td>2</td>\n", " <td>71</td>\n", " <td>2019-03-01 15:39:58</td>\n", " <td>0.000000</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>806132</td>\n", " <td>2</td>\n", " <td>13</td>\n", " <td>2019-03-01 15:39:58</td>\n", " <td>21.864220</td>\n", " <td>100.0</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>806132</td>\n", " <td>2</td>\n", " <td>6</td>\n", " <td>2019-03-01 15:39:58</td>\n", " <td>65.000000</td>\n", " <td>85.0</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>806132</td>\n", " <td>2</td>\n", " <td>66</td>\n", " <td>2019-03-01 15:39:58</td>\n", " <td>1.568628</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>806132</td>\n", " <td>2</td>\n", " <td>12</td>\n", " <td>2019-03-01 15:39:58</td>\n", " <td>18.000000</td>\n", " <td>93.0</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "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": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>heart_rate</th>\n", " <th>heart_rate_quality</th>\n", " <th>oxygen_saturation</th>\n", " <th>oxygen_saturation_quality</th>\n", " <th>heart_rate_variability</th>\n", " <th>heart_rate_variability_quality</th>\n", " <th>respiration_rate</th>\n", " <th>respiration_rate_quality</th>\n", " <th>ctemp</th>\n", " <th>ctemp_quality</th>\n", " <th>...</th>\n", " <th>inter_pulse_interval</th>\n", " <th>inter_pulse_interval_deviation</th>\n", " <th>led1_data</th>\n", " <th>led2_data</th>\n", " <th>led3_data</th>\n", " <th>led4_data</th>\n", " <th>accx_data</th>\n", " <th>accy_data</th>\n", " <th>accz_data</th>\n", " <th>acc_mag</th>\n", " </tr>\n", " <tr>\n", " <th>time</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>2019-03-01 13:23:05.000000000</th>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>...</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>3028.0</td>\n", " <td>2989.0</td>\n", " <td>2924.0</td>\n", " <td>3340.0</td>\n", " <td>368.0</td>\n", " <td>2096.0</td>\n", " <td>-3536.0</td>\n", " <td>4126.976617</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 13:23:05.019607808</th>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>...</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>3309.0</td>\n", " <td>3336.0</td>\n", " <td>3231.0</td>\n", " <td>3417.0</td>\n", " <td>256.0</td>\n", " <td>2016.0</td>\n", " <td>-3808.0</td>\n", " <td>4316.324362</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 13:23:05.039215872</th>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>...</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>3454.0</td>\n", " <td>3443.0</td>\n", " <td>3390.0</td>\n", " <td>3492.0</td>\n", " <td>144.0</td>\n", " <td>2288.0</td>\n", " <td>-3728.0</td>\n", " <td>4376.489918</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 13:23:05.058823680</th>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>...</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>3207.0</td>\n", " <td>3217.0</td>\n", " <td>3126.0</td>\n", " <td>3543.0</td>\n", " <td>96.0</td>\n", " <td>2352.0</td>\n", " <td>-3600.0</td>\n", " <td>4301.292829</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 13:23:05.078431488</th>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>...</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>3079.0</td>\n", " <td>3092.0</td>\n", " <td>2994.0</td>\n", " <td>3538.0</td>\n", " <td>0.0</td>\n", " <td>2384.0</td>\n", " <td>-3904.0</td>\n", " <td>4574.349353</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>5 rows × 25 columns</p>\n", "</div>" ], "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": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>heart_rate</th>\n", " <th>heart_rate_quality</th>\n", " <th>oxygen_saturation</th>\n", " <th>oxygen_saturation_quality</th>\n", " <th>heart_rate_variability</th>\n", " <th>heart_rate_variability_quality</th>\n", " <th>respiration_rate</th>\n", " <th>respiration_rate_quality</th>\n", " <th>ctemp</th>\n", " <th>ctemp_quality</th>\n", " <th>...</th>\n", " <th>inter_pulse_interval</th>\n", " <th>inter_pulse_interval_deviation</th>\n", " <th>led1_data</th>\n", " <th>led2_data</th>\n", " <th>led3_data</th>\n", " <th>led4_data</th>\n", " <th>accx_data</th>\n", " <th>accy_data</th>\n", " <th>accz_data</th>\n", " <th>acc_mag</th>\n", " </tr>\n", " <tr>\n", " <th>time</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>2017-04-01 20:53:51.000000000</th>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>...</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>3028.0</td>\n", " <td>2989.0</td>\n", " <td>2924.0</td>\n", " <td>3340.0</td>\n", " <td>368.0</td>\n", " <td>2096.0</td>\n", " <td>-3536.0</td>\n", " <td>4126.976617</td>\n", " </tr>\n", " <tr>\n", " <th>2017-04-01 20:53:51.019607808</th>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>...</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>3309.0</td>\n", " <td>3336.0</td>\n", " <td>3231.0</td>\n", " <td>3417.0</td>\n", " <td>256.0</td>\n", " <td>2016.0</td>\n", " <td>-3808.0</td>\n", " <td>4316.324362</td>\n", " </tr>\n", " <tr>\n", " <th>2017-04-01 20:53:51.039215872</th>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>...</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>3454.0</td>\n", " <td>3443.0</td>\n", " <td>3390.0</td>\n", " <td>3492.0</td>\n", " <td>144.0</td>\n", " <td>2288.0</td>\n", " <td>-3728.0</td>\n", " <td>4376.489918</td>\n", " </tr>\n", " <tr>\n", " <th>2017-04-01 20:53:51.058823680</th>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>...</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>3207.0</td>\n", " <td>3217.0</td>\n", " <td>3126.0</td>\n", " <td>3543.0</td>\n", " <td>96.0</td>\n", " <td>2352.0</td>\n", " <td>-3600.0</td>\n", " <td>4301.292829</td>\n", " </tr>\n", " <tr>\n", " <th>2017-04-01 20:53:51.078431488</th>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>...</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>3079.0</td>\n", " <td>3092.0</td>\n", " <td>2994.0</td>\n", " <td>3538.0</td>\n", " <td>0.0</td>\n", " <td>2384.0</td>\n", " <td>-3904.0</td>\n", " <td>4574.349353</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>5 rows × 25 columns</p>\n", "</div>" ], "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": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>Shimmer_40AC_Timestamp_Unix_CAL</th>\n", " <th>Shimmer_40AC_Accel_LN_X_CAL</th>\n", " <th>Shimmer_40AC_Accel_LN_Y_CAL</th>\n", " <th>Shimmer_40AC_Accel_LN_Z_CAL</th>\n", " <th>Shimmer_40AC_Accel_WR_X_CAL</th>\n", " <th>Shimmer_40AC_Accel_WR_Y_CAL</th>\n", " <th>Shimmer_40AC_Accel_WR_Z_CAL</th>\n", " <th>Shimmer_40AC_Battery_CAL</th>\n", " <th>Shimmer_40AC_Ext_Exp_A15_CAL</th>\n", " <th>Shimmer_40AC_GSR_Range_CAL</th>\n", " <th>...</th>\n", " <th>Shimmer_40AC_Gyro_X_CAL</th>\n", " <th>Shimmer_40AC_Gyro_Y_CAL</th>\n", " <th>Shimmer_40AC_Gyro_Z_CAL</th>\n", " <th>Shimmer_40AC_Int_Exp_A12_CAL</th>\n", " <th>Shimmer_40AC_Mag_X_CAL</th>\n", " <th>Shimmer_40AC_Mag_Y_CAL</th>\n", " <th>Shimmer_40AC_Mag_Z_CAL</th>\n", " <th>Shimmer_40AC_Pressure_BMP280_CAL</th>\n", " <th>Shimmer_40AC_Temperature_BMP280_CAL</th>\n", " <th>Shimmer_40AC_Accel_LN_mag</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>2020-07-28 10:56:50.034</td>\n", " <td>-1.434783</td>\n", " <td>10.0</td>\n", " <td>0.554348</td>\n", " <td>-3.930580</td>\n", " <td>8.421305</td>\n", " <td>-1.620586</td>\n", " <td>4139.194139</td>\n", " <td>1684.981685</td>\n", " <td>2.0</td>\n", " <td>...</td>\n", " <td>0.137405</td>\n", " <td>1.877863</td>\n", " <td>-0.183206</td>\n", " <td>1680.586081</td>\n", " <td>-0.112444</td>\n", " <td>-0.916042</td>\n", " <td>-0.047976</td>\n", " <td>100.435379</td>\n", " <td>33.365878</td>\n", " <td>10.117604</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>2020-07-28 10:56:50.057</td>\n", " <td>-1.402174</td>\n", " <td>10.0</td>\n", " <td>0.554348</td>\n", " <td>-3.923399</td>\n", " <td>8.442849</td>\n", " <td>-1.599042</td>\n", " <td>4137.728938</td>\n", " <td>1673.260073</td>\n", " <td>2.0</td>\n", " <td>...</td>\n", " <td>0.183206</td>\n", " <td>1.328244</td>\n", " <td>-0.412214</td>\n", " <td>1703.296703</td>\n", " <td>-0.109445</td>\n", " <td>-0.913043</td>\n", " <td>-0.047976</td>\n", " <td>100.429731</td>\n", " <td>33.365878</td>\n", " <td>10.113031</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>2020-07-28 10:56:50.074</td>\n", " <td>-1.434783</td>\n", " <td>10.0</td>\n", " <td>0.554348</td>\n", " <td>-3.897068</td>\n", " <td>8.428486</td>\n", " <td>-1.603830</td>\n", " <td>4111.355311</td>\n", " <td>1901.098901</td>\n", " <td>2.0</td>\n", " <td>...</td>\n", " <td>0.274809</td>\n", " <td>1.282443</td>\n", " <td>-0.198473</td>\n", " <td>1687.179487</td>\n", " <td>-0.107946</td>\n", " <td>-0.910045</td>\n", " <td>-0.049475</td>\n", " <td>100.441027</td>\n", " <td>33.365878</td>\n", " <td>10.117604</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>2020-07-28 10:56:50.099</td>\n", " <td>-1.413043</td>\n", " <td>10.0</td>\n", " <td>0.521739</td>\n", " <td>-3.932974</td>\n", " <td>8.421305</td>\n", " <td>-1.589467</td>\n", " <td>4140.659341</td>\n", " <td>1722.344322</td>\n", " <td>2.0</td>\n", " <td>...</td>\n", " <td>0.229008</td>\n", " <td>1.450382</td>\n", " <td>-0.122137</td>\n", " <td>1650.549451</td>\n", " <td>-0.106447</td>\n", " <td>-0.901049</td>\n", " <td>-0.050975</td>\n", " <td>100.441027</td>\n", " <td>33.365878</td>\n", " <td>10.112809</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>2020-07-28 10:56:50.111</td>\n", " <td>-1.445652</td>\n", " <td>10.0</td>\n", " <td>0.510870</td>\n", " <td>-3.944943</td>\n", " <td>8.428486</td>\n", " <td>-1.661281</td>\n", " <td>4134.798535</td>\n", " <td>1678.388278</td>\n", " <td>2.0</td>\n", " <td>...</td>\n", " <td>0.137405</td>\n", " <td>1.511450</td>\n", " <td>-0.473282</td>\n", " <td>1701.831502</td>\n", " <td>-0.113943</td>\n", " <td>-0.904048</td>\n", " <td>-0.037481</td>\n", " <td>100.438203</td>\n", " <td>33.365878</td>\n", " <td>10.116862</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>5 rows × 22 columns</p>\n", "</div>" ], "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": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>Shimmer_40AC_Timestamp_Unix_CAL</th>\n", " <th>Shimmer_40AC_Accel_LN_X_CAL</th>\n", " <th>Shimmer_40AC_Accel_LN_Y_CAL</th>\n", " <th>Shimmer_40AC_Accel_LN_Z_CAL</th>\n", " <th>Shimmer_40AC_Accel_WR_X_CAL</th>\n", " <th>Shimmer_40AC_Accel_WR_Y_CAL</th>\n", " <th>Shimmer_40AC_Accel_WR_Z_CAL</th>\n", " <th>Shimmer_40AC_Battery_CAL</th>\n", " <th>Shimmer_40AC_Ext_Exp_A15_CAL</th>\n", " <th>Shimmer_40AC_GSR_Range_CAL</th>\n", " <th>...</th>\n", " <th>Shimmer_40AC_Gyro_X_CAL</th>\n", " <th>Shimmer_40AC_Gyro_Y_CAL</th>\n", " <th>Shimmer_40AC_Gyro_Z_CAL</th>\n", " <th>Shimmer_40AC_Int_Exp_A12_CAL</th>\n", " <th>Shimmer_40AC_Mag_X_CAL</th>\n", " <th>Shimmer_40AC_Mag_Y_CAL</th>\n", " <th>Shimmer_40AC_Mag_Z_CAL</th>\n", " <th>Shimmer_40AC_Pressure_BMP280_CAL</th>\n", " <th>Shimmer_40AC_Temperature_BMP280_CAL</th>\n", " <th>Shimmer_40AC_Accel_LN_mag</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>2019-06-20 19:45:55.894</td>\n", " <td>-1.434783</td>\n", " <td>10.0</td>\n", " <td>0.554348</td>\n", " <td>-3.930580</td>\n", " <td>8.421305</td>\n", " <td>-1.620586</td>\n", " <td>4139.194139</td>\n", " <td>1684.981685</td>\n", " <td>2.0</td>\n", " <td>...</td>\n", " <td>0.137405</td>\n", " <td>1.877863</td>\n", " <td>-0.183206</td>\n", " <td>1680.586081</td>\n", " <td>-0.112444</td>\n", " <td>-0.916042</td>\n", " <td>-0.047976</td>\n", " <td>100.435379</td>\n", " <td>33.365878</td>\n", " <td>10.117604</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>2019-06-20 19:45:55.917</td>\n", " <td>-1.402174</td>\n", " <td>10.0</td>\n", " <td>0.554348</td>\n", " <td>-3.923399</td>\n", " <td>8.442849</td>\n", " <td>-1.599042</td>\n", " <td>4137.728938</td>\n", " <td>1673.260073</td>\n", " <td>2.0</td>\n", " <td>...</td>\n", " <td>0.183206</td>\n", " <td>1.328244</td>\n", " <td>-0.412214</td>\n", " <td>1703.296703</td>\n", " <td>-0.109445</td>\n", " <td>-0.913043</td>\n", " <td>-0.047976</td>\n", " <td>100.429731</td>\n", " <td>33.365878</td>\n", " <td>10.113031</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>2019-06-20 19:45:55.934</td>\n", " <td>-1.434783</td>\n", " <td>10.0</td>\n", " <td>0.554348</td>\n", " <td>-3.897068</td>\n", " <td>8.428486</td>\n", " <td>-1.603830</td>\n", " <td>4111.355311</td>\n", " <td>1901.098901</td>\n", " <td>2.0</td>\n", " <td>...</td>\n", " <td>0.274809</td>\n", " <td>1.282443</td>\n", " <td>-0.198473</td>\n", " <td>1687.179487</td>\n", " <td>-0.107946</td>\n", " <td>-0.910045</td>\n", " <td>-0.049475</td>\n", " <td>100.441027</td>\n", " <td>33.365878</td>\n", " <td>10.117604</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>2019-06-20 19:45:55.959</td>\n", " <td>-1.413043</td>\n", " <td>10.0</td>\n", " <td>0.521739</td>\n", " <td>-3.932974</td>\n", " <td>8.421305</td>\n", " <td>-1.589467</td>\n", " <td>4140.659341</td>\n", " <td>1722.344322</td>\n", " <td>2.0</td>\n", " <td>...</td>\n", " <td>0.229008</td>\n", " <td>1.450382</td>\n", " <td>-0.122137</td>\n", " <td>1650.549451</td>\n", " <td>-0.106447</td>\n", " <td>-0.901049</td>\n", " <td>-0.050975</td>\n", " <td>100.441027</td>\n", " <td>33.365878</td>\n", " <td>10.112809</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>2019-06-20 19:45:55.971</td>\n", " <td>-1.445652</td>\n", " <td>10.0</td>\n", " <td>0.510870</td>\n", " <td>-3.944943</td>\n", " <td>8.428486</td>\n", " <td>-1.661281</td>\n", " <td>4134.798535</td>\n", " <td>1678.388278</td>\n", " <td>2.0</td>\n", " <td>...</td>\n", " <td>0.137405</td>\n", " <td>1.511450</td>\n", " <td>-0.473282</td>\n", " <td>1701.831502</td>\n", " <td>-0.113943</td>\n", " <td>-0.904048</td>\n", " <td>-0.037481</td>\n", " <td>100.438203</td>\n", " <td>33.365878</td>\n", " <td>10.116862</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>5 rows × 22 columns</p>\n", "</div>" ], "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": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>Delta_TP9</th>\n", " <th>Delta_AF7</th>\n", " <th>Delta_AF8</th>\n", " <th>Delta_TP10</th>\n", " <th>Theta_TP9</th>\n", " <th>Theta_AF7</th>\n", " <th>Theta_AF8</th>\n", " <th>Theta_TP10</th>\n", " <th>Alpha_TP9</th>\n", " <th>Alpha_AF7</th>\n", " <th>...</th>\n", " <th>Gyro_X</th>\n", " <th>Gyro_Y</th>\n", " <th>Gyro_Z</th>\n", " <th>HeadBandOn</th>\n", " <th>HSI_TP9</th>\n", " <th>HSI_AF7</th>\n", " <th>HSI_AF8</th>\n", " <th>HSI_TP10</th>\n", " <th>Battery</th>\n", " <th>Elements</th>\n", " </tr>\n", " <tr>\n", " <th>TimeStamp</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>2021-05-24 20:26:20.103</th>\n", " <td>0.735186</td>\n", " <td>0.752212</td>\n", " <td>0.714283</td>\n", " <td>1.023466</td>\n", " <td>0.251417</td>\n", " <td>0.205159</td>\n", " <td>0.208760</td>\n", " <td>0.428435</td>\n", " <td>0.493829</td>\n", " <td>0.269544</td>\n", " <td>...</td>\n", " <td>3.416901</td>\n", " <td>0.605621</td>\n", " <td>3.768311</td>\n", " <td>1.0</td>\n", " <td>2.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>2.0</td>\n", " <td>100.0</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2021-05-24 20:26:20.588</th>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>...</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>/muse/elements/blink</td>\n", " </tr>\n", " <tr>\n", " <th>2021-05-24 20:26:21.161</th>\n", " <td>1.063671</td>\n", " <td>0.915956</td>\n", " <td>0.734191</td>\n", " <td>1.023466</td>\n", " <td>1.120400</td>\n", " <td>0.367509</td>\n", " <td>0.303293</td>\n", " <td>0.428435</td>\n", " <td>0.974990</td>\n", " <td>0.348580</td>\n", " <td>...</td>\n", " <td>4.643097</td>\n", " <td>2.355194</td>\n", " <td>2.026215</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>100.0</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2021-05-24 20:26:22.174</th>\n", " <td>1.226523</td>\n", " <td>0.791329</td>\n", " <td>0.685841</td>\n", " <td>0.550056</td>\n", " <td>1.289343</td>\n", " <td>0.647703</td>\n", " <td>0.187995</td>\n", " <td>0.070321</td>\n", " <td>0.726045</td>\n", " <td>0.420135</td>\n", " <td>...</td>\n", " <td>4.239349</td>\n", " <td>0.635529</td>\n", " <td>3.484192</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>100.0</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2021-05-24 20:26:23.184</th>\n", " <td>1.009649</td>\n", " <td>0.822014</td>\n", " <td>0.677420</td>\n", " <td>0.801944</td>\n", " <td>1.035277</td>\n", " <td>0.500738</td>\n", " <td>-0.049515</td>\n", " <td>0.673528</td>\n", " <td>0.805443</td>\n", " <td>0.446498</td>\n", " <td>...</td>\n", " <td>4.366455</td>\n", " <td>-0.052338</td>\n", " <td>1.525269</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>100.0</td>\n", " <td>NaN</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>5 rows × 38 columns</p>\n", "</div>" ], "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": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>Delta_TP9</th>\n", " <th>Delta_AF7</th>\n", " <th>Delta_AF8</th>\n", " <th>Delta_TP10</th>\n", " <th>Theta_TP9</th>\n", " <th>Theta_AF7</th>\n", " <th>Theta_AF8</th>\n", " <th>Theta_TP10</th>\n", " <th>Alpha_TP9</th>\n", " <th>Alpha_AF7</th>\n", " <th>...</th>\n", " <th>Gyro_X</th>\n", " <th>Gyro_Y</th>\n", " <th>Gyro_Z</th>\n", " <th>HeadBandOn</th>\n", " <th>HSI_TP9</th>\n", " <th>HSI_AF7</th>\n", " <th>HSI_AF8</th>\n", " <th>HSI_TP10</th>\n", " <th>Battery</th>\n", " <th>Elements</th>\n", " </tr>\n", " <tr>\n", " <th>TimeStamp</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>2020-05-30 05:03:58.183587364</th>\n", " <td>0.735186</td>\n", " <td>0.752212</td>\n", " <td>0.714283</td>\n", " <td>1.023466</td>\n", " <td>0.251417</td>\n", " <td>0.205159</td>\n", " <td>0.208760</td>\n", " <td>0.428435</td>\n", " <td>0.493829</td>\n", " <td>0.269544</td>\n", " <td>...</td>\n", " <td>3.416901</td>\n", " <td>0.605621</td>\n", " <td>3.768311</td>\n", " <td>1.0</td>\n", " <td>2.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>2.0</td>\n", " <td>100.0</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2020-05-30 05:03:58.668587364</th>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>...</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>/muse/elements/blink</td>\n", " </tr>\n", " <tr>\n", " <th>2020-05-30 05:03:59.241587364</th>\n", " <td>1.063671</td>\n", " <td>0.915956</td>\n", " <td>0.734191</td>\n", " <td>1.023466</td>\n", " <td>1.120400</td>\n", " <td>0.367509</td>\n", " <td>0.303293</td>\n", " <td>0.428435</td>\n", " <td>0.974990</td>\n", " <td>0.348580</td>\n", " <td>...</td>\n", " <td>4.643097</td>\n", " <td>2.355194</td>\n", " <td>2.026215</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>100.0</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2020-05-30 05:04:00.254587364</th>\n", " <td>1.226523</td>\n", " <td>0.791329</td>\n", " <td>0.685841</td>\n", " <td>0.550056</td>\n", " <td>1.289343</td>\n", " <td>0.647703</td>\n", " <td>0.187995</td>\n", " <td>0.070321</td>\n", " <td>0.726045</td>\n", " <td>0.420135</td>\n", " <td>...</td>\n", " <td>4.239349</td>\n", " <td>0.635529</td>\n", " <td>3.484192</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>100.0</td>\n", " <td>NaN</td>\n", " </tr>\n", " <tr>\n", " <th>2020-05-30 05:04:01.264587364</th>\n", " <td>1.009649</td>\n", " <td>0.822014</td>\n", " <td>0.677420</td>\n", " <td>0.801944</td>\n", " <td>1.035277</td>\n", " <td>0.500738</td>\n", " <td>-0.049515</td>\n", " <td>0.673528</td>\n", " <td>0.805443</td>\n", " <td>0.446498</td>\n", " <td>...</td>\n", " <td>4.366455</td>\n", " <td>-0.052338</td>\n", " <td>1.525269</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>1.0</td>\n", " <td>100.0</td>\n", " <td>NaN</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>5 rows × 38 columns</p>\n", "</div>" ], "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": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>tag_number</th>\n", " <th>tag</th>\n", " </tr>\n", " <tr>\n", " <th>time</th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>2019-03-01 16:16:37</th>\n", " <td>1</td>\n", " <td>Shake</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 16:17:43</th>\n", " <td>2</td>\n", " <td>Start</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 16:18:20</th>\n", " <td>3</td>\n", " <td>BP Measurement</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 16:19:51</th>\n", " <td>4</td>\n", " <td>BP Measurement</td>\n", " </tr>\n", " <tr>\n", " <th>2019-03-01 16:22:00</th>\n", " <td>5</td>\n", " <td>BP Measurement</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "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": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>tag_number</th>\n", " <th>tag</th>\n", " </tr>\n", " <tr>\n", " <th>time</th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>2017-09-12 21:26:48</th>\n", " <td>1</td>\n", " <td>Shake</td>\n", " </tr>\n", " <tr>\n", " <th>2017-09-12 21:27:54</th>\n", " <td>2</td>\n", " <td>Start</td>\n", " </tr>\n", " <tr>\n", " <th>2017-09-12 21:28:31</th>\n", " <td>3</td>\n", " <td>BP Measurement</td>\n", " </tr>\n", " <tr>\n", " <th>2017-09-12 21:30:02</th>\n", " <td>4</td>\n", " <td>BP Measurement</td>\n", " </tr>\n", " <tr>\n", " <th>2017-09-12 21:32:11</th>\n", " <td>5</td>\n", " <td>BP Measurement</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "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 }