{
 "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
}