{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Time domain averages (wide)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Read and check the epochs" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/turbach/miniconda3/envs/mckonda_spudtr_dev/lib/python3.6/site-packages/pyarrow/pandas_compat.py:752: FutureWarning: .labels was deprecated in version 0.24.0. Use .codes instead.\n", " labels, = index.labels\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epoch_idtime_mssub_ideeg_artifactdblock_pathlog_evcodeslog_ccodesdblock_srateccodeinstrument...RMOcLLTeRLTeLLOcRLOcMiOcA2HEOGrlerhz
00-748sub0000sub000/dblock_000250.01eeg...-25.093750-0.7539061.480469-13.414062-18.937500-17.7343755.66015698.875000-39.50000038.375000
10-744sub0000sub000/dblock_000250.01eeg...-24.5937500.502441-2.466797-17.640625-17.468750-15.3046881.968750104.750000-38.03125041.281250
20-740sub0000sub000/dblock_000250.01eeg...-16.484375-1.5078123.947266-15.648438-10.085938-11.1718758.367188102.062500-33.65625043.718750
30-736sub0000sub000/dblock_000250.01eeg...-11.804688-15.0703129.867188-14.906250-7.378906-8.7421889.351562100.562500-42.90625037.406250
40-732sub0000sub000/dblock_000250.01eeg...-6.394531-4.0195319.125000-10.679688-6.886719-8.0156258.12500098.375000-43.87500037.906250
..................................................................
224995600732sub0000sub000/dblock_400250.00cal...-4.671875-3.517578-4.441406-4.718750-4.671875-3.400391-4.429688-4.406250-3.900391-4.371094
224996600736sub0000sub000/dblock_400250.00cal...-4.179688-4.019531-4.195312-4.222656-4.425781-3.644531-4.429688-4.160156-3.412109-4.371094
224997600740sub0000sub000/dblock_400250.00cal...-4.425781-3.767578-4.441406-3.974609-4.425781-3.400391-4.429688-4.160156-3.900391-4.859375
224998600744sub0000sub000/dblock_400250.00cal...-4.425781-4.269531-4.195312-4.222656-4.425781-3.886719-4.429688-4.406250-3.900391-4.371094
224999600748sub0000sub000/dblock_400250.00cal...-4.179688-4.019531-3.947266-4.222656-4.179688-3.400391-4.183594-4.406250-3.412109-4.371094
\n", "

225000 rows × 47 columns

\n", "
" ], "text/plain": [ " epoch_id time_ms sub_id eeg_artifact dblock_path log_evcodes \\\n", "0 0 -748 sub000 0 sub000/dblock_0 0 \n", "1 0 -744 sub000 0 sub000/dblock_0 0 \n", "2 0 -740 sub000 0 sub000/dblock_0 0 \n", "3 0 -736 sub000 0 sub000/dblock_0 0 \n", "4 0 -732 sub000 0 sub000/dblock_0 0 \n", "... ... ... ... ... ... ... \n", "224995 600 732 sub000 0 sub000/dblock_4 0 \n", "224996 600 736 sub000 0 sub000/dblock_4 0 \n", "224997 600 740 sub000 0 sub000/dblock_4 0 \n", "224998 600 744 sub000 0 sub000/dblock_4 0 \n", "224999 600 748 sub000 0 sub000/dblock_4 0 \n", "\n", " log_ccodes dblock_srate ccode instrument ... RMOc LLTe \\\n", "0 0 250.0 1 eeg ... -25.093750 -0.753906 \n", "1 0 250.0 1 eeg ... -24.593750 0.502441 \n", "2 0 250.0 1 eeg ... -16.484375 -1.507812 \n", "3 0 250.0 1 eeg ... -11.804688 -15.070312 \n", "4 0 250.0 1 eeg ... -6.394531 -4.019531 \n", "... ... ... ... ... ... ... ... \n", "224995 0 250.0 0 cal ... -4.671875 -3.517578 \n", "224996 0 250.0 0 cal ... -4.179688 -4.019531 \n", "224997 0 250.0 0 cal ... -4.425781 -3.767578 \n", "224998 0 250.0 0 cal ... -4.425781 -4.269531 \n", "224999 0 250.0 0 cal ... -4.179688 -4.019531 \n", "\n", " RLTe LLOc RLOc MiOc A2 HEOG \\\n", "0 1.480469 -13.414062 -18.937500 -17.734375 5.660156 98.875000 \n", "1 -2.466797 -17.640625 -17.468750 -15.304688 1.968750 104.750000 \n", "2 3.947266 -15.648438 -10.085938 -11.171875 8.367188 102.062500 \n", "3 9.867188 -14.906250 -7.378906 -8.742188 9.351562 100.562500 \n", "4 9.125000 -10.679688 -6.886719 -8.015625 8.125000 98.375000 \n", "... ... ... ... ... ... ... \n", "224995 -4.441406 -4.718750 -4.671875 -3.400391 -4.429688 -4.406250 \n", "224996 -4.195312 -4.222656 -4.425781 -3.644531 -4.429688 -4.160156 \n", "224997 -4.441406 -3.974609 -4.425781 -3.400391 -4.429688 -4.160156 \n", "224998 -4.195312 -4.222656 -4.425781 -3.886719 -4.429688 -4.406250 \n", "224999 -3.947266 -4.222656 -4.179688 -3.400391 -4.183594 -4.406250 \n", "\n", " rle rhz \n", "0 -39.500000 38.375000 \n", "1 -38.031250 41.281250 \n", "2 -33.656250 43.718750 \n", "3 -42.906250 37.406250 \n", "4 -43.875000 37.906250 \n", "... ... ... \n", "224995 -3.900391 -4.371094 \n", "224996 -3.412109 -4.371094 \n", "224997 -3.900391 -4.859375 \n", "224998 -3.900391 -4.371094 \n", "224999 -3.412109 -4.371094 \n", "\n", "[225000 rows x 47 columns]" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "from spudtr import epf\n", "from spudtr import get_demo_df, DATA_DIR, P3_1500_FEATHER\n", "\n", "epochs_df = get_demo_df(P3_1500_FEATHER)\n", "eeg_channels = ['MiPf', 'MiCe', 'MiPa', 'MiOc']\n", "\n", "epf.check_epochs(epochs_df, eeg_channels, epoch_id=\"epoch_id\", time=\"time_ms\")\n", "epochs_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Group by `time` to compute the time-domain average of all epochs and select columns of interest" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
channelMiPfMiCeMiPaMiOc
time_ms
-748-0.647500-0.818429-0.650280-1.128954
-744-0.590833-0.838763-0.648749-1.025912
-740-0.569167-0.987738-0.715166-1.047582
-736-0.600000-1.013976-0.672859-0.980162
-732-0.767500-1.069512-0.705796-0.867579
...............
7321.345833-0.855422-1.573245-1.943028
7361.138333-0.999023-1.762801-2.063682
7400.985000-1.031177-1.794903-2.081421
7440.877500-1.011374-1.770285-2.010948
7480.866667-0.863825-1.608073-1.863831
\n", "

375 rows × 4 columns

\n", "
" ], "text/plain": [ "channel MiPf MiCe MiPa MiOc\n", "time_ms \n", "-748 -0.647500 -0.818429 -0.650280 -1.128954\n", "-744 -0.590833 -0.838763 -0.648749 -1.025912\n", "-740 -0.569167 -0.987738 -0.715166 -1.047582\n", "-736 -0.600000 -1.013976 -0.672859 -0.980162\n", "-732 -0.767500 -1.069512 -0.705796 -0.867579\n", "... ... ... ... ...\n", " 732 1.345833 -0.855422 -1.573245 -1.943028\n", " 736 1.138333 -0.999023 -1.762801 -2.063682\n", " 740 0.985000 -1.031177 -1.794903 -2.081421\n", " 744 0.877500 -1.011374 -1.770285 -2.010948\n", " 748 0.866667 -0.863825 -1.608073 -1.863831\n", "\n", "[375 rows x 4 columns]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grand_wide = epochs_df.groupby(['time_ms']).mean()[eeg_channels]\n", "grand_wide.columns.name = 'channel'\n", "grand_wide" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Group by `time` and other columns to compute the average of subsets of epochs" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
channelMiPfMiCeMiPaMiOc
time_msstim
-748cal-4.317307-3.857553-4.073911-4.143690
standard1.4195200.6512400.7291520.773548
target0.9500001.2115142.442932-0.413608
-744cal-4.329327-3.851473-4.114043-4.118098
standard1.4931510.6866270.8949891.060941
..................
744standard-1.6695200.564905-2.007408-2.380829
target19.0599990.2323443.6684943.395762
748cal-4.305288-3.828247-4.077405-4.089811
standard-1.5667810.687771-1.867695-2.206024
target18.7300000.7715144.2862333.765410
\n", "

1125 rows × 4 columns

\n", "
" ], "text/plain": [ "channel MiPf MiCe MiPa MiOc\n", "time_ms stim \n", "-748 cal -4.317307 -3.857553 -4.073911 -4.143690\n", " standard 1.419520 0.651240 0.729152 0.773548\n", " target 0.950000 1.211514 2.442932 -0.413608\n", "-744 cal -4.329327 -3.851473 -4.114043 -4.118098\n", " standard 1.493151 0.686627 0.894989 1.060941\n", "... ... ... ... ...\n", " 744 standard -1.669520 0.564905 -2.007408 -2.380829\n", " target 19.059999 0.232344 3.668494 3.395762\n", " 748 cal -4.305288 -3.828247 -4.077405 -4.089811\n", " standard -1.566781 0.687771 -1.867695 -2.206024\n", " target 18.730000 0.771514 4.286233 3.765410\n", "\n", "[1125 rows x 4 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "subsets_wide = epochs_df.groupby([\"time_ms\", \"stim\"]).mean()[eeg_channels]\n", "subsets_wide.columns.name = \"channel\"\n", "subsets_wide" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Time-domain averages (long)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
microvolts
time_msstimchannel
-748calMiPf-4.317307
MiCe-3.857553
MiPa-4.073911
MiOc-4.143690
standardMiPf1.419520
............
748standardMiOc-2.206024
targetMiPf18.730000
MiCe0.771514
MiPa4.286233
MiOc3.765410
\n", "

4500 rows × 1 columns

\n", "
" ], "text/plain": [ " microvolts\n", "time_ms stim channel \n", "-748 cal MiPf -4.317307\n", " MiCe -3.857553\n", " MiPa -4.073911\n", " MiOc -4.143690\n", " standard MiPf 1.419520\n", "... ...\n", " 748 standard MiOc -2.206024\n", " target MiPf 18.730000\n", " MiCe 0.771514\n", " MiPa 4.286233\n", " MiOc 3.765410\n", "\n", "[4500 rows x 1 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "subsets_long = subsets_wide.stack() # pivot the channel columns into one long column\n", "subsets_long.name = \"microvolts\"\n", "pd.DataFrame(subsets_long)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Time interval measurments\n", "\n", "Interval measurments use the \"slice-groupby-apply\" pattern. \n", "\n", "* slice the time interval rows\n", "\n", "* group by epoch_id and other tags\n", "\n", "* apply the measurment function to the data, e.g., pandas built-in or user-defined\n", "\n", "\n", "Start by doing the steps separately to verify.\n", "\n", "When the steps are right, chain them for compact expression.\n", "\n", "Example: single trial mean amplitude" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. Load the epochs" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epoch_idtime_mssub_ideeg_artifactdblock_pathlog_evcodeslog_ccodesdblock_srateccodeinstrument...RMOcLLTeRLTeLLOcRLOcMiOcA2HEOGrlerhz
00-748sub0000sub000/dblock_000250.01eeg...-25.093750-0.7539061.480469-13.414062-18.937500-17.7343755.66015698.875000-39.50000038.375000
10-744sub0000sub000/dblock_000250.01eeg...-24.5937500.502441-2.466797-17.640625-17.468750-15.3046881.968750104.750000-38.03125041.281250
20-740sub0000sub000/dblock_000250.01eeg...-16.484375-1.5078123.947266-15.648438-10.085938-11.1718758.367188102.062500-33.65625043.718750
30-736sub0000sub000/dblock_000250.01eeg...-11.804688-15.0703129.867188-14.906250-7.378906-8.7421889.351562100.562500-42.90625037.406250
40-732sub0000sub000/dblock_000250.01eeg...-6.394531-4.0195319.125000-10.679688-6.886719-8.0156258.12500098.375000-43.87500037.906250
..................................................................
146995391732sub0000sub000/dblock_300250.01eeg...9.59375010.8046880.0000004.4726561.9677734.617188-3.937500-9.296875-10.242188-2.429688
146996391736sub0000sub000/dblock_300250.01eeg...15.25000015.5781258.63281210.4296888.60937510.929688-0.246094-7.343750-7.8007812.914062
146997391740sub0000sub000/dblock_300250.01eeg...11.07031211.5546884.1953127.2031256.8867197.773438-4.429688-7.832031-13.648438-2.429688
146998391744sub0000sub000/dblock_300250.01eeg...13.0390626.7812506.4140629.18750010.57812510.4453120.246094-8.320312-8.773438-1.457031
146999391748sub0000sub000/dblock_300250.01eeg...13.5312508.53906210.35937511.67187513.53125011.9062503.937500-8.320312-10.2421880.485840
\n", "

147000 rows × 47 columns

\n", "
" ], "text/plain": [ " epoch_id time_ms sub_id eeg_artifact dblock_path log_evcodes \\\n", "0 0 -748 sub000 0 sub000/dblock_0 0 \n", "1 0 -744 sub000 0 sub000/dblock_0 0 \n", "2 0 -740 sub000 0 sub000/dblock_0 0 \n", "3 0 -736 sub000 0 sub000/dblock_0 0 \n", "4 0 -732 sub000 0 sub000/dblock_0 0 \n", "... ... ... ... ... ... ... \n", "146995 391 732 sub000 0 sub000/dblock_3 0 \n", "146996 391 736 sub000 0 sub000/dblock_3 0 \n", "146997 391 740 sub000 0 sub000/dblock_3 0 \n", "146998 391 744 sub000 0 sub000/dblock_3 0 \n", "146999 391 748 sub000 0 sub000/dblock_3 0 \n", "\n", " log_ccodes dblock_srate ccode instrument ... RMOc LLTe \\\n", "0 0 250.0 1 eeg ... -25.093750 -0.753906 \n", "1 0 250.0 1 eeg ... -24.593750 0.502441 \n", "2 0 250.0 1 eeg ... -16.484375 -1.507812 \n", "3 0 250.0 1 eeg ... -11.804688 -15.070312 \n", "4 0 250.0 1 eeg ... -6.394531 -4.019531 \n", "... ... ... ... ... ... ... ... \n", "146995 0 250.0 1 eeg ... 9.593750 10.804688 \n", "146996 0 250.0 1 eeg ... 15.250000 15.578125 \n", "146997 0 250.0 1 eeg ... 11.070312 11.554688 \n", "146998 0 250.0 1 eeg ... 13.039062 6.781250 \n", "146999 0 250.0 1 eeg ... 13.531250 8.539062 \n", "\n", " RLTe LLOc RLOc MiOc A2 HEOG \\\n", "0 1.480469 -13.414062 -18.937500 -17.734375 5.660156 98.875000 \n", "1 -2.466797 -17.640625 -17.468750 -15.304688 1.968750 104.750000 \n", "2 3.947266 -15.648438 -10.085938 -11.171875 8.367188 102.062500 \n", "3 9.867188 -14.906250 -7.378906 -8.742188 9.351562 100.562500 \n", "4 9.125000 -10.679688 -6.886719 -8.015625 8.125000 98.375000 \n", "... ... ... ... ... ... ... \n", "146995 0.000000 4.472656 1.967773 4.617188 -3.937500 -9.296875 \n", "146996 8.632812 10.429688 8.609375 10.929688 -0.246094 -7.343750 \n", "146997 4.195312 7.203125 6.886719 7.773438 -4.429688 -7.832031 \n", "146998 6.414062 9.187500 10.578125 10.445312 0.246094 -8.320312 \n", "146999 10.359375 11.671875 13.531250 11.906250 3.937500 -8.320312 \n", "\n", " rle rhz \n", "0 -39.500000 38.375000 \n", "1 -38.031250 41.281250 \n", "2 -33.656250 43.718750 \n", "3 -42.906250 37.406250 \n", "4 -43.875000 37.906250 \n", "... ... ... \n", "146995 -10.242188 -2.429688 \n", "146996 -7.800781 2.914062 \n", "146997 -13.648438 -2.429688 \n", "146998 -8.773438 -1.457031 \n", "146999 -10.242188 0.485840 \n", "\n", "[147000 rows x 47 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eeg_channels = [\"MiPf\", \"MiCe\", \"MiPa\", \"MiOc\"]\n", "\n", "epochs_df = get_demo_df(P3_1500_FEATHER).query('stim in [\"target\", \"standard\"]')\n", "epf.check_epochs(epochs_df, eeg_channels, epoch_id=\"epoch_id\", time=\"time_ms\")\n", "epochs_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "2. (optional) select the data columns of interest or skip this and use them all." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epoch_idtime_msstimMiPfMiCeMiPaMiOc
00-748target-54.52.781250-8.828125-17.734375
10-744target-56.5-4.046875-11.929688-15.304688
20-740target-55.5-3.289062-4.769531-11.171875
30-736target-60.5-2.5292970.954102-8.742188
40-732target-57.04.0468759.781250-8.015625
\n", "
" ], "text/plain": [ " epoch_id time_ms stim MiPf MiCe MiPa MiOc\n", "0 0 -748 target -54.5 2.781250 -8.828125 -17.734375\n", "1 0 -744 target -56.5 -4.046875 -11.929688 -15.304688\n", "2 0 -740 target -55.5 -3.289062 -4.769531 -11.171875\n", "3 0 -736 target -60.5 -2.529297 0.954102 -8.742188\n", "4 0 -732 target -57.0 4.046875 9.781250 -8.015625" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epoch_idtime_msstimMiPfMiCeMiPaMiOc
146995391732standard9.53.28906215.2656254.617188
146996391736standard15.59.35937521.23437510.929688
146997391740standard9.03.79296915.5078127.773438
146998391744standard7.54.30078115.50781210.445312
146999391748standard6.04.55468814.78906211.906250
\n", "
" ], "text/plain": [ " epoch_id time_ms stim MiPf MiCe MiPa MiOc\n", "146995 391 732 standard 9.5 3.289062 15.265625 4.617188\n", "146996 391 736 standard 15.5 9.359375 21.234375 10.929688\n", "146997 391 740 standard 9.0 3.792969 15.507812 7.773438\n", "146998 391 744 standard 7.5 4.300781 15.507812 10.445312\n", "146999 391 748 standard 6.0 4.554688 14.789062 11.906250" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "coi = [\"epoch_id\", \"time_ms\", \"stim\", \"MiPf\", \"MiCe\", \"MiPa\", \"MiOc\"]\n", "mid = epochs_df[coi] # select columns of interest\n", "\n", "display(mid.head())\n", "display(mid.tail())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "3. Slice the time interval data sample (rows) to measure and verify by inspection" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epoch_idtime_msstimMiPfMiCeMiPaMiOc
2620300target-46.069.562577.500029.640625
2630304target-41.578.437582.750033.531250
2640308target-39.083.187584.437533.031250
2650312target-39.581.937582.312529.875000
2660316target-36.582.687583.250031.828125
\n", "
" ], "text/plain": [ " epoch_id time_ms stim MiPf MiCe MiPa MiOc\n", "262 0 300 target -46.0 69.5625 77.5000 29.640625\n", "263 0 304 target -41.5 78.4375 82.7500 33.531250\n", "264 0 308 target -39.0 83.1875 84.4375 33.031250\n", "265 0 312 target -39.5 81.9375 82.3125 29.875000\n", "266 0 316 target -36.5 82.6875 83.2500 31.828125" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epoch_idtime_msstimMiPfMiCeMiPaMiOc
146933391484standard14.53.5410165.7265625.585938
146934391488standard13.0-4.300781-5.484375-1.943359
146935391492standard8.5-6.578125-10.015625-1.214844
146936391496standard6.5-11.382812-14.789062-0.971680
146937391500standard-1.5-21.250000-21.937500-2.429688
\n", "
" ], "text/plain": [ " epoch_id time_ms stim MiPf MiCe MiPa MiOc\n", "146933 391 484 standard 14.5 3.541016 5.726562 5.585938\n", "146934 391 488 standard 13.0 -4.300781 -5.484375 -1.943359\n", "146935 391 492 standard 8.5 -6.578125 -10.015625 -1.214844\n", "146936 391 496 standard 6.5 -11.382812 -14.789062 -0.971680\n", "146937 391 500 standard -1.5 -21.250000 -21.937500 -2.429688" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "300" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "500" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mid_300_500 = mid.query(\"time_ms >= 300 and time_ms <= 500\")\n", "\n", "display(mid_300_500.head())\n", "display(mid_300_500.tail())\n", "display(mid_300_500[\"time_ms\"].min(), mid_300_500[\"time_ms\"].max())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "4. **Group by** epoch_id, i.e., single trial, and other column labels to preserve them, and **apply** the built-in `mean()` function.\n", "\n", "**Note** the `time_ms` timestamps is just another column of data and also averaged in the interval.\n", " \n", "**Note** `pandas.Dataframe` has dozens of [built-in stats functions](https://pandas.pydata.org/pandas-docs/stable/reference/frame.html?highlight=dataframe%20methods#computations-descriptive-stats) besides mean: `max()`, `min()`, `std()`, `var()`, ...\n", " " ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
time_msMiPfMiCeMiPaMiOc
epoch_idstim
0target400-42.17647242.85385952.52175112.860375
1target400-14.61764741.02481542.6259196.120811
2target400-7.18627524.07307131.39567913.836741
3target400-16.91176420.56089226.34957116.461147
4target40013.03921627.07839422.4165525.758588
\n", "
" ], "text/plain": [ " time_ms MiPf MiCe MiPa MiOc\n", "epoch_id stim \n", "0 target 400 -42.176472 42.853859 52.521751 12.860375\n", "1 target 400 -14.617647 41.024815 42.625919 6.120811\n", "2 target 400 -7.186275 24.073071 31.395679 13.836741\n", "3 target 400 -16.911764 20.560892 26.349571 16.461147\n", "4 target 400 13.039216 27.078394 22.416552 5.758588" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
time_msMiPfMiCeMiPaMiOc
epoch_idstim
387standard40013.91176520.71492022.6120954.010857
388standard40024.696079-4.2597270.098336-2.500594
389standard40027.57843211.33664614.4993876.349677
390standard40036.323528-0.4465573.442656-0.209578
391standard40011.490196-12.447074-6.483092-2.429051
\n", "
" ], "text/plain": [ " time_ms MiPf MiCe MiPa MiOc\n", "epoch_id stim \n", "387 standard 400 13.911765 20.714920 22.612095 4.010857\n", "388 standard 400 24.696079 -4.259727 0.098336 -2.500594\n", "389 standard 400 27.578432 11.336646 14.499387 6.349677\n", "390 standard 400 36.323528 -0.446557 3.442656 -0.209578\n", "391 standard 400 11.490196 -12.447074 -6.483092 -2.429051" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mid_300_500_mna = mid_300_500.groupby([\"epoch_id\", \"stim\"]).mean()\n", "\n", "display(mid_300_500_mna.head(), mid_300_500_mna.tail())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "5. The epoch interval measurements are new data, re-label them appropriately." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
MiPfMiCeMiPaMiOcmeasureinterval
epoch_idstim
0target-42.17647242.85385952.52175112.860375mna300_500
1target-14.61764741.02481542.6259196.120811mna300_500
2target-7.18627524.07307131.39567913.836741mna300_500
3target-16.91176420.56089226.34957116.461147mna300_500
4target13.03921627.07839422.4165525.758588mna300_500
\n", "
" ], "text/plain": [ " MiPf MiCe MiPa MiOc measure interval\n", "epoch_id stim \n", "0 target -42.176472 42.853859 52.521751 12.860375 mna 300_500\n", "1 target -14.617647 41.024815 42.625919 6.120811 mna 300_500\n", "2 target -7.186275 24.073071 31.395679 13.836741 mna 300_500\n", "3 target -16.911764 20.560892 26.349571 16.461147 mna 300_500\n", "4 target 13.039216 27.078394 22.416552 5.758588 mna 300_500" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
MiPfMiCeMiPaMiOcmeasureinterval
epoch_idstim
387standard13.91176520.71492022.6120954.010857mna300_500
388standard24.696079-4.2597270.098336-2.500594mna300_500
389standard27.57843211.33664614.4993876.349677mna300_500
390standard36.323528-0.4465573.442656-0.209578mna300_500
391standard11.490196-12.447074-6.483092-2.429051mna300_500
\n", "
" ], "text/plain": [ " MiPf MiCe MiPa MiOc measure interval\n", "epoch_id stim \n", "387 standard 13.911765 20.714920 22.612095 4.010857 mna 300_500\n", "388 standard 24.696079 -4.259727 0.098336 -2.500594 mna 300_500\n", "389 standard 27.578432 11.336646 14.499387 6.349677 mna 300_500\n", "390 standard 36.323528 -0.446557 3.442656 -0.209578 mna 300_500\n", "391 standard 11.490196 -12.447074 -6.483092 -2.429051 mna 300_500" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# drop the no longer meaningful time_ms column\n", "mid_300_500_mna = mid_300_500_mna.drop(\"time_ms\", axis=1)\n", "\n", "# describe the type of measurment and interval\n", "mid_300_500_mna[\"measure\"] = \"mna\"\n", "mid_300_500_mna[\"interval\"] = \"300_500\"\n", "\n", "display(mid_300_500_mna.head(), mid_300_500_mna.tail())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "6. (optional) Export the measurements data" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "mid_300_500_mna.reset_index().to_feather(DATA_DIR / \"p3_mid_mna_300_500.feather\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "7. Chaining: All of the above, simplified by chaining. The results are verifiably identical." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "coi = [\"epoch_id\", \"time_ms\", \"stim\", \"MiPf\", \"MiCe\", \"MiPa\", \"MiOc\"]\n", "\n", "# slice-groupby-apply\n", "mid_300_500_mna_c = (\n", " epochs_df[coi]\n", " .query(\"time_ms >= 300 and time_ms <= 500\")\n", " .groupby([\"epoch_id\", \"stim\"])\n", " .mean()\n", " .drop(\"time_ms\", axis=1)\n", ")\n", "\n", "# describe the type of measurment and interval\n", "mid_300_500_mna_c[\"measure\"] = \"mna\"\n", "mid_300_500_mna_c[\"interval\"] = \"300_500\"\n", "\n", "# verify steps and chained agree\n", "assert all(mid_300_500_mna_c == mid_300_500_mna)\n", "\n", "# export\n", "mid_300_500_mna_c.reset_index().to_feather(DATA_DIR / \"p3_mid_mna_300_500.feather\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "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.6.10" } }, "nbformat": 4, "nbformat_minor": 4 }