Optogenetics-Sleep-Deprivation/1.CantonS_Baseline.ipynb

810 lines
358 KiB
Text
Raw Permalink Normal View History

2026-05-26 13:51:29 +00:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 58,
"id": "ec10aab9-454d-4dc2-9059-665e60050d73",
"metadata": {},
"outputs": [],
"source": [
"import ethoscopy as etho\n",
"import pandas as pd\n",
"from scipy.stats import mannwhitneyu\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import seaborn as sns"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "5289d86c-0107-4089-83e3-327b70168e08",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'2.1.0'"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"etho.__version__"
]
},
{
"cell_type": "code",
"execution_count": 80,
"id": "3d32b423-cc70-43f2-a2cc-ed9bd08c2981",
"metadata": {},
"outputs": [],
"source": [
"meta = '/home/rdingjin/Trial_2026-03-18/metadata_Phase1_2026-03-18.csv'\n",
"local = '/mnt/ethoscope_results'"
]
},
{
"cell_type": "code",
"execution_count": 81,
"id": "df11ef6f-5475-45b0-95c3-2a8672a21219",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Ethoscopes ('ETHOSCOPE_075',) have multiple files for their day, the largest file has been kept. If you want all files for that day please add a time column\n"
]
}
],
"source": [
"metadata = etho.link_meta_index(meta, local)"
]
},
{
"cell_type": "code",
"execution_count": 82,
"id": "ebfbf3dc-d405-4f7b-a4a1-1eacff24f3a5",
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Loading ROI_1 from ETHOSCOPE_075\n",
"Loading ROI_2 from ETHOSCOPE_075\n",
"Loading ROI_3 from ETHOSCOPE_075\n",
"Loading ROI_4 from ETHOSCOPE_075\n",
"Loading ROI_5 from ETHOSCOPE_075\n",
"Loading ROI_6 from ETHOSCOPE_075\n",
"Loading ROI_7 from ETHOSCOPE_075\n",
"Loading ROI_8 from ETHOSCOPE_075\n",
"Loading ROI_9 from ETHOSCOPE_075\n",
"Loading ROI_10 from ETHOSCOPE_075\n",
"Loading ROI_11 from ETHOSCOPE_075\n",
"Loading ROI_12 from ETHOSCOPE_075\n",
"Loading ROI_13 from ETHOSCOPE_075\n",
"Loading ROI_14 from ETHOSCOPE_075\n",
"Loading ROI_15 from ETHOSCOPE_075\n",
"Loading ROI_16 from ETHOSCOPE_075\n",
"Loading ROI_17 from ETHOSCOPE_075\n",
"Loading ROI_18 from ETHOSCOPE_075\n",
"Loading ROI_19 from ETHOSCOPE_075\n",
"Loading ROI_20 from ETHOSCOPE_075\n",
"Loading ROI_1 from ETHOSCOPE_130\n",
"Loading ROI_2 from ETHOSCOPE_130\n",
"Loading ROI_3 from ETHOSCOPE_130\n",
"Loading ROI_4 from ETHOSCOPE_130\n",
"Loading ROI_5 from ETHOSCOPE_130\n",
"Loading ROI_6 from ETHOSCOPE_130\n",
"Loading ROI_7 from ETHOSCOPE_130\n",
"Loading ROI_8 from ETHOSCOPE_130\n",
"Loading ROI_9 from ETHOSCOPE_130\n",
"Loading ROI_10 from ETHOSCOPE_130\n",
"Loading ROI_11 from ETHOSCOPE_130\n",
"Loading ROI_12 from ETHOSCOPE_130\n",
"Loading ROI_13 from ETHOSCOPE_130\n",
"Loading ROI_14 from ETHOSCOPE_130\n",
"Loading ROI_15 from ETHOSCOPE_130\n",
"Loading ROI_16 from ETHOSCOPE_130\n",
"Loading ROI_17 from ETHOSCOPE_130\n",
"Loading ROI_18 from ETHOSCOPE_130\n",
"Loading ROI_19 from ETHOSCOPE_130\n",
"Loading ROI_20 from ETHOSCOPE_130\n",
"Loading ROI_1 from ETHOSCOPE_284\n",
"Loading ROI_2 from ETHOSCOPE_284\n",
"Loading ROI_3 from ETHOSCOPE_284\n",
"Loading ROI_4 from ETHOSCOPE_284\n",
"Loading ROI_5 from ETHOSCOPE_284\n",
"Loading ROI_6 from ETHOSCOPE_284\n",
"Loading ROI_7 from ETHOSCOPE_284\n",
"Loading ROI_8 from ETHOSCOPE_284\n",
"Loading ROI_9 from ETHOSCOPE_284\n",
"Loading ROI_10 from ETHOSCOPE_284\n",
"Loading ROI_11 from ETHOSCOPE_284\n",
"Loading ROI_12 from ETHOSCOPE_284\n",
"Loading ROI_13 from ETHOSCOPE_284\n",
"Loading ROI_14 from ETHOSCOPE_284\n",
"Loading ROI_15 from ETHOSCOPE_284\n",
"Loading ROI_16 from ETHOSCOPE_284\n",
"Loading ROI_17 from ETHOSCOPE_284\n",
"Loading ROI_18 from ETHOSCOPE_284\n",
"Loading ROI_19 from ETHOSCOPE_284\n",
"Loading ROI_20 from ETHOSCOPE_284\n"
]
}
],
"source": [
"#fetch data from ethoscope\n",
"data = etho.load_ethoscope(metadata, reference_hour = 9.0, FUN = etho.sleep_annotation)"
]
},
{
"cell_type": "code",
"execution_count": 83,
"id": "a32d69f8-e66c-47fc-9b9a-2273f2c5082b",
"metadata": {},
"outputs": [],
"source": [
"df = etho.behavpy(data, metadata, check = True)"
]
},
{
"cell_type": "code",
"execution_count": 84,
"id": "e633d7d9-99db-4815-900d-e79d11dd65b1",
"metadata": {},
"outputs": [],
"source": [
"df.to_pickle('/home/rdingjin/Trial_2026-03-18/phase1.pkl')"
]
},
{
"cell_type": "code",
"execution_count": 85,
"id": "ae2ff7e0-2f6c-4cc0-9afd-a1c021140760",
"metadata": {},
"outputs": [],
"source": [
"import ethoscopy as etho\n",
"import pandas as pd\n",
"from scipy.stats import mannwhitneyu\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import seaborn as sns\n",
"df = pd.read_pickle('/home/rdingjin/Trial_2026-03-18/phase1.pkl')"
]
},
{
"cell_type": "code",
"execution_count": 86,
"id": "94a0854d-4b5a-475f-a856-c61ec01d080e",
"metadata": {},
"outputs": [],
"source": [
"df = df.baseline(column = 'baseline')"
]
},
{
"cell_type": "code",
"execution_count": 87,
"id": "cae6a067-5fd7-493a-9f23-c75d63e6ae06",
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
" ==== METADATA ====\n",
"\n",
" date machine_name region_id \\\n",
"id \n",
"2026-03-18_17-13-59_075964|01 2026-03-18 ETHOSCOPE_075 1 \n",
"2026-03-18_17-13-59_075964|02 2026-03-18 ETHOSCOPE_075 2 \n",
"2026-03-18_17-13-59_075964|03 2026-03-18 ETHOSCOPE_075 3 \n",
"2026-03-18_17-13-59_075964|04 2026-03-18 ETHOSCOPE_075 4 \n",
"2026-03-18_17-13-59_075964|05 2026-03-18 ETHOSCOPE_075 5 \n",
"2026-03-18_17-13-59_075964|06 2026-03-18 ETHOSCOPE_075 6 \n",
"2026-03-18_17-13-59_075964|07 2026-03-18 ETHOSCOPE_075 7 \n",
"2026-03-18_17-13-59_075964|08 2026-03-18 ETHOSCOPE_075 8 \n",
"2026-03-18_17-13-59_075964|09 2026-03-18 ETHOSCOPE_075 9 \n",
"2026-03-18_17-13-59_075964|10 2026-03-18 ETHOSCOPE_075 10 \n",
"2026-03-18_17-13-59_075964|11 2026-03-18 ETHOSCOPE_075 11 \n",
"2026-03-18_17-13-59_075964|12 2026-03-18 ETHOSCOPE_075 12 \n",
"2026-03-18_17-13-59_075964|13 2026-03-18 ETHOSCOPE_075 13 \n",
"2026-03-18_17-13-59_075964|14 2026-03-18 ETHOSCOPE_075 14 \n",
"2026-03-18_17-13-59_075964|15 2026-03-18 ETHOSCOPE_075 15 \n",
"2026-03-18_17-13-59_075964|16 2026-03-18 ETHOSCOPE_075 16 \n",
"2026-03-18_17-13-59_075964|17 2026-03-18 ETHOSCOPE_075 17 \n",
"2026-03-18_17-13-59_075964|18 2026-03-18 ETHOSCOPE_075 18 \n",
"2026-03-18_17-13-59_075964|19 2026-03-18 ETHOSCOPE_075 19 \n",
"2026-03-18_17-13-59_075964|20 2026-03-18 ETHOSCOPE_075 20 \n",
"2026-03-18_17-11-56_13005e|01 2026-03-18 ETHOSCOPE_130 1 \n",
"2026-03-18_17-11-56_13005e|02 2026-03-18 ETHOSCOPE_130 2 \n",
"2026-03-18_17-11-56_13005e|03 2026-03-18 ETHOSCOPE_130 3 \n",
"2026-03-18_17-11-56_13005e|04 2026-03-18 ETHOSCOPE_130 4 \n",
"2026-03-18_17-11-56_13005e|05 2026-03-18 ETHOSCOPE_130 5 \n",
"2026-03-18_17-11-56_13005e|06 2026-03-18 ETHOSCOPE_130 6 \n",
"2026-03-18_17-11-56_13005e|07 2026-03-18 ETHOSCOPE_130 7 \n",
"2026-03-18_17-11-56_13005e|08 2026-03-18 ETHOSCOPE_130 8 \n",
"2026-03-18_17-11-56_13005e|09 2026-03-18 ETHOSCOPE_130 9 \n",
"2026-03-18_17-11-56_13005e|10 2026-03-18 ETHOSCOPE_130 10 \n",
"2026-03-18_17-11-56_13005e|11 2026-03-18 ETHOSCOPE_130 11 \n",
"2026-03-18_17-11-56_13005e|12 2026-03-18 ETHOSCOPE_130 12 \n",
"2026-03-18_17-11-56_13005e|13 2026-03-18 ETHOSCOPE_130 13 \n",
"2026-03-18_17-11-56_13005e|14 2026-03-18 ETHOSCOPE_130 14 \n",
"2026-03-18_17-11-56_13005e|15 2026-03-18 ETHOSCOPE_130 15 \n",
"2026-03-18_17-11-56_13005e|16 2026-03-18 ETHOSCOPE_130 16 \n",
"2026-03-18_17-11-56_13005e|17 2026-03-18 ETHOSCOPE_130 17 \n",
"2026-03-18_17-11-56_13005e|18 2026-03-18 ETHOSCOPE_130 18 \n",
"2026-03-18_17-11-56_13005e|19 2026-03-18 ETHOSCOPE_130 19 \n",
"2026-03-18_17-11-56_13005e|20 2026-03-18 ETHOSCOPE_130 20 \n",
"2026-03-18_16-37-44_284fec|01 2026-03-18 ETHOSCOPE_284 1 \n",
"2026-03-18_16-37-44_284fec|02 2026-03-18 ETHOSCOPE_284 2 \n",
"2026-03-18_16-37-44_284fec|03 2026-03-18 ETHOSCOPE_284 3 \n",
"2026-03-18_16-37-44_284fec|04 2026-03-18 ETHOSCOPE_284 4 \n",
"2026-03-18_16-37-44_284fec|05 2026-03-18 ETHOSCOPE_284 5 \n",
"2026-03-18_16-37-44_284fec|06 2026-03-18 ETHOSCOPE_284 6 \n",
"2026-03-18_16-37-44_284fec|07 2026-03-18 ETHOSCOPE_284 7 \n",
"2026-03-18_16-37-44_284fec|08 2026-03-18 ETHOSCOPE_284 8 \n",
"2026-03-18_16-37-44_284fec|09 2026-03-18 ETHOSCOPE_284 9 \n",
"2026-03-18_16-37-44_284fec|10 2026-03-18 ETHOSCOPE_284 10 \n",
"2026-03-18_16-37-44_284fec|11 2026-03-18 ETHOSCOPE_284 11 \n",
"2026-03-18_16-37-44_284fec|12 2026-03-18 ETHOSCOPE_284 12 \n",
"2026-03-18_16-37-44_284fec|13 2026-03-18 ETHOSCOPE_284 13 \n",
"2026-03-18_16-37-44_284fec|14 2026-03-18 ETHOSCOPE_284 14 \n",
"2026-03-18_16-37-44_284fec|15 2026-03-18 ETHOSCOPE_284 15 \n",
"2026-03-18_16-37-44_284fec|16 2026-03-18 ETHOSCOPE_284 16 \n",
"2026-03-18_16-37-44_284fec|17 2026-03-18 ETHOSCOPE_284 17 \n",
"2026-03-18_16-37-44_284fec|18 2026-03-18 ETHOSCOPE_284 18 \n",
"2026-03-18_16-37-44_284fec|19 2026-03-18 ETHOSCOPE_284 19 \n",
"2026-03-18_16-37-44_284fec|20 2026-03-18 ETHOSCOPE_284 20 \n",
"\n",
" sleep_deprived species food baseline \\\n",
"id \n",
"2026-03-18_17-13-59_075964|01 False CantonS normal_food 0 \n",
"2026-03-18_17-13-59_075964|02 False CantonS normal_food 0 \n",
"2026-03-18_17-13-59_075964|03 False CantonS normal_food 0 \n",
"2026-03-18_17-13-59_075964|04 False CantonS normal_food 0 \n",
"2026-03-18_17-13-59_075964|05 False CantonS normal_food 0 \n",
"2026-03-18_17-13-59_075964|06 False CantonS normal_food 0 \n",
"2026-03-18_17-13-59_075964|07 False CantonS normal_food 0 \n",
"2026-03-18_17-13-59_075964|08 False CantonS normal_food 0 \n",
"2026-03-18_17-13-59_075964|09 False CantonS normal_food 0 \n",
"2026-03-18_17-13-59_075964|10 False CantonS normal_food 0 \n",
"2026-03-18_17-13-59_075964|11 False CantonS normal_food 0 \n",
"2026-03-18_17-13-59_075964|12 False CantonS normal_food 0 \n",
"2026-03-18_17-13-59_075964|13 False CantonS normal_food 0 \n",
"2026-03-18_17-13-59_075964|14 False CantonS normal_food 0 \n",
"2026-03-18_17-13-59_075964|15 False CantonS normal_food 0 \n",
"2026-03-18_17-13-59_075964|16 False CantonS normal_food 0 \n",
"2026-03-18_17-13-59_075964|17 False CantonS normal_food 0 \n",
"2026-03-18_17-13-59_075964|18 False CantonS normal_food 0 \n",
"2026-03-18_17-13-59_075964|19 False CantonS normal_food 0 \n",
"2026-03-18_17-13-59_075964|20 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|01 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|02 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|03 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|04 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|05 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|06 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|07 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|08 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|09 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|10 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|11 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|12 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|13 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|14 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|15 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|16 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|17 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|18 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|19 False CantonS normal_food 0 \n",
"2026-03-18_17-11-56_13005e|20 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|01 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|02 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|03 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|04 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|05 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|06 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|07 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|08 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|09 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|10 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|11 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|12 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|13 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|14 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|15 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|16 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|17 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|18 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|19 False CantonS normal_food 0 \n",
"2026-03-18_16-37-44_284fec|20 False CantonS normal_food 0 \n",
"\n",
" sex time \n",
"id \n",
"2026-03-18_17-13-59_075964|01 male 17-13-59 \n",
"2026-03-18_17-13-59_075964|02 male 17-13-59 \n",
"2026-03-18_17-13-59_075964|03 male 17-13-59 \n",
"2026-03-18_17-13-59_075964|04 male 17-13-59 \n",
"2026-03-18_17-13-59_075964|05 male 17-13-59 \n",
"2026-03-18_17-13-59_075964|06 male 17-13-59 \n",
"2026-03-18_17-13-59_075964|07 male 17-13-59 \n",
"2026-03-18_17-13-59_075964|08 male 17-13-59 \n",
"2026-03-18_17-13-59_075964|09 male 17-13-59 \n",
"2026-03-18_17-13-59_075964|10 male 17-13-59 \n",
"2026-03-18_17-13-59_075964|11 male 17-13-59 \n",
"2026-03-18_17-13-59_075964|12 male 17-13-59 \n",
"2026-03-18_17-13-59_075964|13 male 17-13-59 \n",
"2026-03-18_17-13-59_075964|14 male 17-13-59 \n",
"2026-03-18_17-13-59_075964|15 male 17-13-59 \n",
"2026-03-18_17-13-59_075964|16 male 17-13-59 \n",
"2026-03-18_17-13-59_075964|17 male 17-13-59 \n",
"2026-03-18_17-13-59_075964|18 male 17-13-59 \n",
"2026-03-18_17-13-59_075964|19 male 17-13-59 \n",
"2026-03-18_17-13-59_075964|20 male 17-13-59 \n",
"2026-03-18_17-11-56_13005e|01 male 17-11-56 \n",
"2026-03-18_17-11-56_13005e|02 male 17-11-56 \n",
"2026-03-18_17-11-56_13005e|03 male 17-11-56 \n",
"2026-03-18_17-11-56_13005e|04 male 17-11-56 \n",
"2026-03-18_17-11-56_13005e|05 male 17-11-56 \n",
"2026-03-18_17-11-56_13005e|06 male 17-11-56 \n",
"2026-03-18_17-11-56_13005e|07 male 17-11-56 \n",
"2026-03-18_17-11-56_13005e|08 male 17-11-56 \n",
"2026-03-18_17-11-56_13005e|09 male 17-11-56 \n",
"2026-03-18_17-11-56_13005e|10 male 17-11-56 \n",
"2026-03-18_17-11-56_13005e|11 male 17-11-56 \n",
"2026-03-18_17-11-56_13005e|12 male 17-11-56 \n",
"2026-03-18_17-11-56_13005e|13 male 17-11-56 \n",
"2026-03-18_17-11-56_13005e|14 male 17-11-56 \n",
"2026-03-18_17-11-56_13005e|15 male 17-11-56 \n",
"2026-03-18_17-11-56_13005e|16 male 17-11-56 \n",
"2026-03-18_17-11-56_13005e|17 male 17-11-56 \n",
"2026-03-18_17-11-56_13005e|18 male 17-11-56 \n",
"2026-03-18_17-11-56_13005e|19 male 17-11-56 \n",
"2026-03-18_17-11-56_13005e|20 male 17-11-56 \n",
"2026-03-18_16-37-44_284fec|01 male 16-37-44 \n",
"2026-03-18_16-37-44_284fec|02 male 16-37-44 \n",
"2026-03-18_16-37-44_284fec|03 male 16-37-44 \n",
"2026-03-18_16-37-44_284fec|04 male 16-37-44 \n",
"2026-03-18_16-37-44_284fec|05 male 16-37-44 \n",
"2026-03-18_16-37-44_284fec|06 male 16-37-44 \n",
"2026-03-18_16-37-44_284fec|07 male 16-37-44 \n",
"2026-03-18_16-37-44_284fec|08 male 16-37-44 \n",
"2026-03-18_16-37-44_284fec|09 male 16-37-44 \n",
"2026-03-18_16-37-44_284fec|10 male 16-37-44 \n",
"2026-03-18_16-37-44_284fec|11 male 16-37-44 \n",
"2026-03-18_16-37-44_284fec|12 male 16-37-44 \n",
"2026-03-18_16-37-44_284fec|13 male 16-37-44 \n",
"2026-03-18_16-37-44_284fec|14 male 16-37-44 \n",
"2026-03-18_16-37-44_284fec|15 male 16-37-44 \n",
"2026-03-18_16-37-44_284fec|16 male 16-37-44 \n",
"2026-03-18_16-37-44_284fec|17 male 16-37-44 \n",
"2026-03-18_16-37-44_284fec|18 male 16-37-44 \n",
"2026-03-18_16-37-44_284fec|19 male 16-37-44 \n",
"2026-03-18_16-37-44_284fec|20 male 16-37-44 \n",
" ====== DATA ======\n",
"\n",
" t x y w \\\n",
"id \n",
"2026-03-18_16-37-44_284fec|01 27460 269.571429 28.285714 15.285714 \n",
"2026-03-18_16-37-44_284fec|01 27470 258.107143 30.714286 14.607143 \n",
"2026-03-18_16-37-44_284fec|01 27480 250.000000 32.068966 16.965517 \n",
"2026-03-18_16-37-44_284fec|01 27490 251.000000 32.103448 15.586207 \n",
"2026-03-18_16-37-44_284fec|01 27500 250.928571 28.750000 13.000000 \n",
"... ... ... ... ... \n",
"2026-03-18_17-13-59_075964|20 191260 250.000000 21.000000 26.896552 \n",
"2026-03-18_17-13-59_075964|20 191270 250.000000 21.000000 26.966667 \n",
"2026-03-18_17-13-59_075964|20 191280 250.000000 21.000000 27.000000 \n",
"2026-03-18_17-13-59_075964|20 191290 250.000000 21.000000 26.931034 \n",
"2026-03-18_17-13-59_075964|20 191300 250.000000 21.000000 26.857143 \n",
"\n",
" h phi max_velocity \\\n",
"id \n",
"2026-03-18_16-37-44_284fec|01 4.571429 26.285714 163.259606 \n",
"2026-03-18_16-37-44_284fec|01 5.392857 12.928571 7.996110 \n",
"2026-03-18_16-37-44_284fec|01 6.551724 14.482759 1.273148 \n",
"2026-03-18_16-37-44_284fec|01 6.413793 17.551724 2.060055 \n",
"2026-03-18_16-37-44_284fec|01 4.500000 50.714286 3.836001 \n",
"... ... ... ... \n",
"2026-03-18_17-13-59_075964|20 11.655172 11.931034 0.765383 \n",
"2026-03-18_17-13-59_075964|20 11.400000 5.166667 0.711015 \n",
"2026-03-18_17-13-59_075964|20 11.516129 5.806452 0.739399 \n",
"2026-03-18_17-13-59_075964|20 11.517241 10.689655 0.732620 \n",
"2026-03-18_17-13-59_075964|20 11.285714 5.714286 0.688460 \n",
"\n",
" mean_velocity dist has_interacted \\\n",
"id \n",
"2026-03-18_16-37-44_284fec|01 24.342165 0.511185 0.0 \n",
"2026-03-18_16-37-44_284fec|01 2.387609 0.200559 0.0 \n",
"2026-03-18_16-37-44_284fec|01 0.809902 0.070461 0.0 \n",
"2026-03-18_16-37-44_284fec|01 0.960414 0.083556 0.0 \n",
"2026-03-18_16-37-44_284fec|01 1.433831 0.120442 0.0 \n",
"... ... ... ... \n",
"2026-03-18_17-13-59_075964|20 0.670773 0.058357 0.0 \n",
"2026-03-18_17-13-59_075964|20 0.659118 0.059321 0.0 \n",
"2026-03-18_17-13-59_075964|20 0.661893 0.061556 0.0 \n",
"2026-03-18_17-13-59_075964|20 0.662969 0.057678 0.0 \n",
"2026-03-18_17-13-59_075964|20 0.662488 0.013912 0.0 \n",
"\n",
" beam_cross moving micro walk \\\n",
"id \n",
"2026-03-18_16-37-44_284fec|01 0.0 True False True \n",
"2026-03-18_16-37-44_284fec|01 0.0 True False True \n",
"2026-03-18_16-37-44_284fec|01 0.0 True True False \n",
"2026-03-18_16-37-44_284fec|01 0.0 True True False \n",
"2026-03-18_16-37-44_284fec|01 0.0 True False True \n",
"... ... ... ... ... \n",
"2026-03-18_17-13-59_075964|20 0.0 False False False \n",
"2026-03-18_17-13-59_075964|20 0.0 False False False \n",
"2026-03-18_17-13-59_075964|20 0.0 False False False \n",
"2026-03-18_17-13-59_075964|20 0.0 False False False \n",
"2026-03-18_17-13-59_075964|20 0.0 False False False \n",
"\n",
" is_interpolated asleep \n",
"id \n",
"2026-03-18_16-37-44_284fec|01 False False \n",
"2026-03-18_16-37-44_284fec|01 False False \n",
"2026-03-18_16-37-44_284fec|01 False False \n",
"2026-03-18_16-37-44_284fec|01 False False \n",
"2026-03-18_16-37-44_284fec|01 False False \n",
"... ... ... \n",
"2026-03-18_17-13-59_075964|20 False True \n",
"2026-03-18_17-13-59_075964|20 False True \n",
"2026-03-18_17-13-59_075964|20 False True \n",
"2026-03-18_17-13-59_075964|20 False True \n",
"2026-03-18_17-13-59_075964|20 False True \n",
"\n",
"[995159 rows x 16 columns]\n"
]
}
],
"source": [
"#display metadata\n",
"df.display()"
]
},
{
"cell_type": "code",
"execution_count": 112,
"id": "76cd7456-6246-4665-a08a-d6f270a8567d",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/srv/venv/lib/python3.12/site-packages/ethoscopy/behavpy_core.py:1611: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n",
" tdf.groupby(\"id\", group_keys=False).apply(\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 450x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#Heatmap of CantonS sleep\n",
"fig = df.heatmap(variable = 'asleep')\n",
"fig.show()"
]
},
{
"cell_type": "code",
"execution_count": 133,
"id": "f650547e-98b9-4419-88ea-6bba804ac7ee",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 933.333x441.667 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Generate plot from Ethoscopy\n",
"fig = df.plot_overtime(variable='asleep', avg_window=30, grids=True)\n",
"\n",
"# Extract the main axis from the figure\n",
"ax = fig.axes[0]\n",
"\n",
"# Set custom labels\n",
"ax.set_xlabel(\"Zeitgeber Time (Hours)\", fontsize=12)\n",
"ax.set_ylabel(\"Fraction of Time Asleep\", fontsize=12)\n",
"\n",
"# Show plot\n",
"fig.show()\n",
"\n",
"# Save as a high-resolution PNG\n",
"plt.savefig(\"Figure_1A.png\", dpi=600, bbox_inches='tight')"
]
},
{
"cell_type": "code",
"execution_count": 120,
"id": "a004f048-3210-4a1b-99cc-9f24f5a770fd",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"--- Individual Fly Average (Entire Recording Period) ---\n",
" Fly_Label Avg_Sleep_Per_24h Day_Sleep_12h Night_Sleep_12h\n",
"ETHOSCOPE_075 - Fly 01 12.217543 5.138764 9.050000\n",
"ETHOSCOPE_075 - Fly 02 11.822635 4.455461 9.209722\n",
"ETHOSCOPE_075 - Fly 03 12.567906 5.408675 9.204167\n",
"ETHOSCOPE_075 - Fly 04 11.979923 4.308388 9.508333\n",
"ETHOSCOPE_075 - Fly 05 11.419608 3.725073 9.395833\n",
"ETHOSCOPE_075 - Fly 06 11.107905 4.117475 8.709722\n",
"ETHOSCOPE_075 - Fly 07 10.327622 3.637714 8.266667\n",
"ETHOSCOPE_075 - Fly 08 10.959574 3.695612 8.916667\n",
"ETHOSCOPE_075 - Fly 09 12.816715 6.017502 8.947222\n",
"ETHOSCOPE_075 - Fly 10 12.286073 5.623504 8.704167\n",
"ETHOSCOPE_075 - Fly 11 11.644458 4.252721 9.187500\n",
"ETHOSCOPE_075 - Fly 12 11.184650 4.442997 8.490278\n",
"ETHOSCOPE_075 - Fly 13 12.052024 5.621321 8.445833\n",
"ETHOSCOPE_075 - Fly 14 11.222472 4.196026 8.772222\n",
"ETHOSCOPE_075 - Fly 15 10.598233 3.351394 8.813889\n",
"ETHOSCOPE_075 - Fly 16 10.364320 4.189820 7.826389\n",
"ETHOSCOPE_075 - Fly 17 11.881523 4.586737 9.159722\n",
"ETHOSCOPE_075 - Fly 18 12.228237 5.093033 9.101389\n",
"ETHOSCOPE_075 - Fly 19 12.759478 5.214693 9.588889\n",
"ETHOSCOPE_075 - Fly 20 11.949817 4.441963 9.362500\n",
"... (Showing first 20 rows)\n",
"\n",
"--- Grand Summary Statistics (Entire Recording Period) ---\n",
"Total Flies Analyzed: n = 60\n",
"\n",
"[ OVERALL SLEEP (Scaled to 24h) ]\n",
"Mean ± SEM: 10.98 ± 0.19 hours/24h\n",
"Median: 11.26 hours/24h\n",
"Minimum: 5.40 hours/24h\n",
"Maximum: 13.04 hours/24h\n",
"\n",
"[ DAY TIME (ZT 0-12, 9am-9pm, Scaled to 12h) ]\n",
"Mean ± SEM: 4.61 ± 0.10 hours/12h\n",
"Median: 4.57 hours/12h\n",
"Minimum: 2.18 hours/12h\n",
"Maximum: 6.17 hours/12h\n",
"\n",
"[ NIGHT TIME (ZT 12-24, 9pm-9am, Scaled to 12h) ]\n",
"Mean ± SEM: 8.13 ± 0.15 hours/12h\n",
"Median: 8.45 hours/12h\n",
"Minimum: 4.12 hours/12h\n",
"Maximum: 9.59 hours/12h\n"
]
}
],
"source": [
"filtered_df = df.copy()\n",
"\n",
"# Calculate Overall 24h Average\n",
"# Calculate exact duration each fly was tracked (in days) based on its maximum timestamp\n",
"days_tracked = filtered_df.groupby('id')['t'].max() / 86400\n",
"sleep_hours = (filtered_df.groupby('id')['asleep'].sum() * 10) / 3600\n",
"\n",
"overall_sleep = (sleep_hours / days_tracked).reset_index(name='Avg_Sleep_Per_24h')\n",
"\n",
"\n",
"# Calculate Day/Night 12h Averages\n",
"filtered_df['zt_hour'] = (filtered_df['t'] / 3600) % 24\n",
"filtered_df['Phase'] = np.where(filtered_df['zt_hour'] < 12, 'Day', 'Night')\n",
"\n",
"phase_summary = filtered_df.groupby(['id', 'Phase']).agg(\n",
" total_sleep_epochs=('asleep', 'sum'),\n",
" total_tracking_epochs=('t', 'count')\n",
").reset_index()\n",
"\n",
"phase_summary['Sleep_Hours'] = (phase_summary['total_sleep_epochs'] * 10) / 3600\n",
"phase_summary['Tracking_Hours'] = (phase_summary['total_tracking_epochs'] * 10) / 3600\n",
"phase_summary['Avg_Sleep_Per_12h'] = (phase_summary['Sleep_Hours'] / phase_summary['Tracking_Hours']) * 12\n",
"\n",
"pivot_df = phase_summary.pivot(index='id', columns='Phase', values='Avg_Sleep_Per_12h').reset_index()\n",
"\n",
"\n",
"# Merge the overall 24h table and the Day/Night table together using the fly 'id'\n",
"merged_df = pd.merge(overall_sleep, pivot_df, on='id')\n",
"\n",
"# Clean up the labels\n",
"merged_df['Machine'] = merged_df['id'].map(df.meta['machine_name'])\n",
"merged_df['Tube'] = merged_df['id'].apply(lambda x: str(x).split('|')[-1])\n",
"merged_df['Fly_Label'] = merged_df['Machine'] + \" - Fly \" + merged_df['Tube']\n",
"\n",
"# Drop invalid rows, sort, and select final columns\n",
"clean_table = merged_df.dropna(subset=['Machine']).sort_values(by=['Machine', 'Tube'])\n",
"final_table = clean_table[['Fly_Label', 'Avg_Sleep_Per_24h', 'Day', 'Night']]\n",
"final_table.columns = ['Fly_Label', 'Avg_Sleep_Per_24h', 'Day_Sleep_12h', 'Night_Sleep_12h']\n",
"\n",
"\n",
"# PRINT RESULTS\n",
"print(\"--- Individual Fly Average (Entire Recording Period) ---\")\n",
"# Show the first 20 rows of the combined table\n",
"print(final_table.head(20).to_string(index=False)) \n",
"print(\"... (Showing first 20 rows)\\n\")\n",
"\n",
"print(\"--- Grand Summary Statistics (Entire Recording Period) ---\")\n",
"print(f\"Total Flies Analyzed: n = {len(final_table)}\")\n",
"\n",
"# 1. OVERALL 24H STATS\n",
"print(\"\\n[ OVERALL SLEEP (Scaled to 24h) ]\")\n",
"print(f\"Mean ± SEM: {final_table['Avg_Sleep_Per_24h'].mean():.2f} ± {final_table['Avg_Sleep_Per_24h'].sem():.2f} hours/24h\")\n",
"print(f\"Median: {final_table['Avg_Sleep_Per_24h'].median():.2f} hours/24h\")\n",
"print(f\"Minimum: {final_table['Avg_Sleep_Per_24h'].min():.2f} hours/24h\")\n",
"print(f\"Maximum: {final_table['Avg_Sleep_Per_24h'].max():.2f} hours/24h\")\n",
"\n",
"# 2. DAY TIME STATS\n",
"print(\"\\n[ DAY TIME (ZT 0-12, 9am-9pm, Scaled to 12h) ]\")\n",
"print(f\"Mean ± SEM: {final_table['Day_Sleep_12h'].mean():.2f} ± {final_table['Day_Sleep_12h'].sem():.2f} hours/12h\")\n",
"print(f\"Median: {final_table['Day_Sleep_12h'].median():.2f} hours/12h\")\n",
"print(f\"Minimum: {final_table['Day_Sleep_12h'].min():.2f} hours/12h\")\n",
"print(f\"Maximum: {final_table['Day_Sleep_12h'].max():.2f} hours/12h\")\n",
"\n",
"# 3. NIGHT TIME STATS\n",
"print(\"\\n[ NIGHT TIME (ZT 12-24, 9pm-9am, Scaled to 12h) ]\")\n",
"print(f\"Mean ± SEM: {final_table['Night_Sleep_12h'].mean():.2f} ± {final_table['Night_Sleep_12h'].sem():.2f} hours/12h\")\n",
"print(f\"Median: {final_table['Night_Sleep_12h'].median():.2f} hours/12h\")\n",
"print(f\"Minimum: {final_table['Night_Sleep_12h'].min():.2f} hours/12h\")\n",
"print(f\"Maximum: {final_table['Night_Sleep_12h'].max():.2f} hours/12h\")"
]
},
{
"cell_type": "code",
"execution_count": 147,
"id": "e0ea6e7f-21e6-4544-a752-36fb8c03f5cb",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_35672/3931312672.py:19: FutureWarning: \n",
"\n",
"Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.\n",
"\n",
" sns.boxplot(\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 500x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 1. Prepare data for plotting\n",
"plot_df = final_table.melt(\n",
" id_vars=['Fly_Label'], \n",
" value_vars=['Day_Sleep_12h', 'Night_Sleep_12h'],\n",
" var_name='Phase', \n",
" value_name='Sleep_Hours'\n",
")\n",
"\n",
"plot_df['Phase'] = plot_df['Phase'].replace({\n",
" 'Day_Sleep_12h': 'Day',\n",
" 'Night_Sleep_12h': 'Night'\n",
"})\n",
"\n",
"# 2. Generate plot\n",
"plt.figure(figsize=(5, 6))\n",
"sns.set_theme(style=\"ticks\")\n",
"\n",
"# Draw the Box Plot\n",
"sns.boxplot(\n",
" data=plot_df, \n",
" x='Phase', \n",
" y='Sleep_Hours', \n",
" palette=['#f1c232', '#3c78d8'], \n",
" width=0.4,\n",
" boxprops={'edgecolor': 'black', 'alpha': 0.6},\n",
" medianprops={'color': 'black', 'linewidth': 1},\n",
" showfliers=False \n",
")\n",
"\n",
"# Draw the Strip Plot\n",
"sns.stripplot(\n",
" data=plot_df, \n",
" x='Phase', \n",
" y='Sleep_Hours', \n",
" color='black', \n",
" alpha=0.6, \n",
" size=5, \n",
" jitter=True\n",
")\n",
"\n",
"# 3. Add labels for the median\n",
"# Calculate the exact median for Day and Night\n",
"medians = plot_df.groupby('Phase', sort=False)['Sleep_Hours'].median()\n",
"\n",
"# Grab the current plot axes\n",
"ax = plt.gca()\n",
"\n",
"# Loop through the two phases (0 = Day, 1 = Night)\n",
"for i, phase in enumerate(medians.index):\n",
" median_val = medians[phase]\n",
" \n",
" # Place text slightly to the right of the box (i + 0.3)\n",
" ax.text(\n",
" i + 0.3, # X-coordinate\n",
" median_val, # Y-coordinate (exactly on the median line)\n",
" f\"{median_val:.1f}h\", # The text to display\n",
" ha='left', # Align text to the left of this anchor point\n",
" va='center', # Center vertically exactly on the line\n",
" color='black',\n",
" fontsize=11\n",
" )\n",
"\n",
"# 4. Formatting\n",
"sns.despine()\n",
"\n",
"plt.xlabel('') \n",
"plt.ylabel('Average time spent asleep (hours)', fontsize=12)\n",
"plt.ylim(0, 12) \n",
"\n",
"plt.tight_layout()\n",
"\n",
"# Export high resolution image\n",
"plt.savefig(\"CantonS_total-sleep.png\", dpi=600, bbox_inches='tight')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a160717e-e6f7-4060-a5b0-8a5c22b7d8d9",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.12.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}