842 lines
499 KiB
Text
842 lines
499 KiB
Text
|
|
{
|
||
|
|
"cells": [
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 1,
|
||
|
|
"id": "d523fe6f-ca8e-4a3b-94b1-832704ace7f7",
|
||
|
|
"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",
|
||
|
|
"from scipy.stats import wilcoxon, shapiro, ttest_rel\n",
|
||
|
|
"df = pd.read_pickle('/home/rdingjin/Gal4_2026-05-17/phase5.pkl')"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 2,
|
||
|
|
"id": "7f242b06-500e-40a9-a557-f1155e891c3e",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"df = df.baseline(column = 'baseline')"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 3,
|
||
|
|
"id": "3de9d377-3ad7-4f41-b62a-f8338179f383",
|
||
|
|
"metadata": {
|
||
|
|
"scrolled": true
|
||
|
|
},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"\n",
|
||
|
|
" ==== METADATA ====\n",
|
||
|
|
"\n",
|
||
|
|
" date machine_name region_id \\\n",
|
||
|
|
"id \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|01 2026-05-17 ETHOSCOPE_130 1 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|02 2026-05-17 ETHOSCOPE_130 2 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|03 2026-05-17 ETHOSCOPE_130 3 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|04 2026-05-17 ETHOSCOPE_130 4 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|05 2026-05-17 ETHOSCOPE_130 5 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|06 2026-05-17 ETHOSCOPE_130 6 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|07 2026-05-17 ETHOSCOPE_130 7 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|08 2026-05-17 ETHOSCOPE_130 8 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|09 2026-05-17 ETHOSCOPE_130 9 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|10 2026-05-17 ETHOSCOPE_130 10 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|11 2026-05-17 ETHOSCOPE_130 11 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|12 2026-05-17 ETHOSCOPE_130 12 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|13 2026-05-17 ETHOSCOPE_130 13 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|14 2026-05-17 ETHOSCOPE_130 14 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|15 2026-05-17 ETHOSCOPE_130 15 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|16 2026-05-17 ETHOSCOPE_130 16 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|17 2026-05-17 ETHOSCOPE_130 17 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|18 2026-05-17 ETHOSCOPE_130 18 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|19 2026-05-17 ETHOSCOPE_130 19 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 2026-05-17 ETHOSCOPE_130 20 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 2026-05-17 ETHOSCOPE_302 1 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|02 2026-05-17 ETHOSCOPE_302 2 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|03 2026-05-17 ETHOSCOPE_302 3 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|04 2026-05-17 ETHOSCOPE_302 4 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|05 2026-05-17 ETHOSCOPE_302 5 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|06 2026-05-17 ETHOSCOPE_302 6 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|07 2026-05-17 ETHOSCOPE_302 7 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|08 2026-05-17 ETHOSCOPE_302 8 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|09 2026-05-17 ETHOSCOPE_302 9 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|10 2026-05-17 ETHOSCOPE_302 10 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|11 2026-05-17 ETHOSCOPE_302 11 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|12 2026-05-17 ETHOSCOPE_302 12 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|13 2026-05-17 ETHOSCOPE_302 13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|14 2026-05-17 ETHOSCOPE_302 14 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|15 2026-05-17 ETHOSCOPE_302 15 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|16 2026-05-17 ETHOSCOPE_302 16 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|17 2026-05-17 ETHOSCOPE_302 17 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|18 2026-05-17 ETHOSCOPE_302 18 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|19 2026-05-17 ETHOSCOPE_302 19 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|20 2026-05-17 ETHOSCOPE_302 20 \n",
|
||
|
|
"\n",
|
||
|
|
" sleep_deprived species food \\\n",
|
||
|
|
"id \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|01 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|02 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|03 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|04 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|05 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|06 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|07 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|08 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|09 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|10 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|11 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|12 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|13 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|14 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|15 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|16 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|17 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|18 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|19 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 True 60D05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|02 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|03 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|04 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|05 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|06 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|07 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|08 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|09 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|10 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|11 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|12 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|13 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|14 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|15 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|16 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|17 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|18 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|19 True 11H05_Gal4 normal_food \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|20 True 11H05_Gal4 normal_food \n",
|
||
|
|
"\n",
|
||
|
|
" baseline sex time \n",
|
||
|
|
"id \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|01 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|02 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|03 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|04 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|05 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|06 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|07 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|08 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|09 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|10 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|11 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|12 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|13 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|14 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|15 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|16 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|17 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|18 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|19 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0 male 11-29-42 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|02 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|03 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|04 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|05 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|06 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|07 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|08 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|09 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|10 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|11 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|12 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|13 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|14 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|15 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|16 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|17 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|18 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|19 0 male 11-26-13 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|20 0 male 11-26-13 \n",
|
||
|
|
" ====== DATA ======\n",
|
||
|
|
"\n",
|
||
|
|
" t x y w \\\n",
|
||
|
|
"id \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 8770 277.625000 41.375000 37.875000 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 8780 366.000000 47.925926 33.333333 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 8790 366.848485 33.727273 35.303030 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 8800 369.000000 31.000000 34.000000 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 8810 332.333333 46.787879 25.090909 \n",
|
||
|
|
"... ... ... ... ... \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 518160 350.625000 20.000000 29.312500 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 518170 350.625000 19.875000 29.312500 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 518180 350.588235 19.882353 29.235294 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 518190 350.411765 19.882353 29.117647 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 518200 350.500000 20.000000 29.500000 \n",
|
||
|
|
"\n",
|
||
|
|
" h phi max_velocity \\\n",
|
||
|
|
"id \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 14.250000 70.125000 122.427433 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 13.555556 123.407407 8.767560 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 15.818182 30.757576 7.796124 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 15.000000 11.000000 2.991429 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 10.060606 10.393939 12.760825 \n",
|
||
|
|
"... ... ... ... \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 11.312500 12.125000 0.722568 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 11.625000 13.000000 0.862738 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 11.235294 0.000000 0.776030 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 11.058824 10.352941 0.699647 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 12.000000 0.000000 0.680579 \n",
|
||
|
|
"\n",
|
||
|
|
" mean_velocity dist has_interacted \\\n",
|
||
|
|
"id \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 24.095140 0.578283 0.0 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 3.064496 0.248224 0.0 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 3.442244 0.340782 0.0 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 2.991429 0.367946 0.0 \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 3.324311 0.329107 0.0 \n",
|
||
|
|
"... ... ... ... \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.649101 0.031157 0.0 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.682539 0.032762 0.0 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.658967 0.033607 0.0 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.647799 0.033038 0.0 \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.675138 0.004051 0.0 \n",
|
||
|
|
"\n",
|
||
|
|
" beam_cross moving micro walk \\\n",
|
||
|
|
"id \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 0.0 True False True \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 0.0 True False True \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 0.0 True False True \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 0.0 True False True \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 0.0 True False True \n",
|
||
|
|
"... ... ... ... ... \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.0 False False False \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.0 False False False \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.0 False False False \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.0 False False False \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 0.0 False False False \n",
|
||
|
|
"\n",
|
||
|
|
" is_interpolated asleep \n",
|
||
|
|
"id \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 False False \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 False False \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 False False \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 False False \n",
|
||
|
|
"2026-05-17_11-26-13_30232c|01 False False \n",
|
||
|
|
"... ... ... \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 False True \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 False True \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 False True \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 False True \n",
|
||
|
|
"2026-05-17_11-29-42_13005e|20 False True \n",
|
||
|
|
"\n",
|
||
|
|
"[2002709 rows x 16 columns]\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"#display metadata\n",
|
||
|
|
"df.display()"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 4,
|
||
|
|
"id": "f29bb098-e4a8-4d98-baaa-eae45c3174dd",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"dead_flies = ['2026-05-17_11-29-42_13005e|03','2026-05-17_11-26-13_30232c|10','2026-05-17_11-26-13_30232c|20' ]"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 5,
|
||
|
|
"id": "d9bbb35f-e126-4afc-9c25-5f099fa8e979",
|
||
|
|
"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 1000x180 with 2 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"start_hour = 0\n",
|
||
|
|
"end_hour = 120\n",
|
||
|
|
"fig = df.remove('id', *dead_flies).t_filter(start_time=start_hour, end_time=end_hour).xmv('machine_name', 'ETHOSCOPE_302').heatmap(variable = 'asleep')\n",
|
||
|
|
"fig.show()"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 18,
|
||
|
|
"id": "0b3ffab2-d453-4425-a13e-e9abbf3f872b",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "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
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 1266.67x483.333 with 1 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"start_hour = 0\n",
|
||
|
|
"end_hour = 120\n",
|
||
|
|
"\n",
|
||
|
|
"# Generate plot from Ethoscopy\n",
|
||
|
|
"fig = df.remove('id', *dead_flies).t_filter(start_time=start_hour, end_time=end_hour).xmv('machine_name', 'ETHOSCOPE_302').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",
|
||
|
|
"# Add shading stimulus shading\n",
|
||
|
|
"# Draw a vertical span from ZT 48 to ZT 72\n",
|
||
|
|
"ax.axvspan(72, 96, color='#ff4c4c', alpha=0.3, zorder=1)\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(\"11H05_plot.png\", dpi=600, bbox_inches='tight')"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 20,
|
||
|
|
"id": "da40a2bc-0034-4384-8433-ad8fad16b2b6",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "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
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 1133.33x466.667 with 1 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"start_hour = 24\n",
|
||
|
|
"end_hour = 120\n",
|
||
|
|
"\n",
|
||
|
|
"# Generate plot from Ethoscopy\n",
|
||
|
|
"fig = df.remove('id', *dead_flies).t_filter(start_time=start_hour, end_time=end_hour).xmv('machine_name', 'ETHOSCOPE_302').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",
|
||
|
|
"# Add shading stimulus shading\n",
|
||
|
|
"# Draw a vertical span from ZT 48 to ZT 72\n",
|
||
|
|
"ax.axvspan(72, 96, color='#ff4c4c', alpha=0.3, zorder=1)\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(\"24h_11H05_plot.png\", dpi=600, bbox_inches='tight')"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 7,
|
||
|
|
"id": "7f4311b7-83f0-4e0d-b675-8a59d4daf17c",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"--- Individual Fly Sleep (Baseline: 0h to 72h, Averaged per day) ---\n",
|
||
|
|
" Fly_Label Base_Sleep_24h Base_Day_12h Base_Night_12h\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 01 3.781481 1.632707 2.259259\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 02 4.176852 2.221634 2.105556\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 03 3.610185 1.957461 1.785185\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 04 4.727778 2.544310 2.357407\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 05 5.679630 1.831333 3.972222\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 06 3.236111 1.273194 2.049074\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 07 4.310185 1.145080 3.242593\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 08 2.302778 1.371514 1.024074\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 09 4.587037 1.963420 2.756481\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 11 4.266667 1.079623 3.260185\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 12 4.501852 1.575236 3.033333\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 13 4.706481 1.763946 3.062037\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 14 7.125000 2.549578 4.748148\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 15 8.109259 4.418805 3.989815\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 16 6.000926 2.834630 3.358333\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 17 6.412963 2.786655 3.815741\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 18 5.621296 2.933951 2.886111\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 19 4.327778 1.962914 2.498148\n",
|
||
|
|
"... (Showing first 20 rows)\n",
|
||
|
|
"\n",
|
||
|
|
"--- Grand Summary Statistics (Baseline: 0h to 72h) ---\n",
|
||
|
|
"Total Flies Analyzed: n = 18\n",
|
||
|
|
"\n",
|
||
|
|
"[ OVERALL SLEEP (Scaled to 24h Baseline Average) ]\n",
|
||
|
|
"Mean ± SEM: 4.86 ± 0.33 hours\n",
|
||
|
|
"Median: 4.54 hours\n",
|
||
|
|
"\n",
|
||
|
|
"[ DAY TIME (ZT 0-12, Averaged to 12h blocks) ]\n",
|
||
|
|
"Mean ± SEM: 2.10 ± 0.19 hours\n",
|
||
|
|
"Median: 1.96 hours\n",
|
||
|
|
"\n",
|
||
|
|
"[ NIGHT TIME (ZT 12-24, Averaged to 12h blocks) ]\n",
|
||
|
|
"Mean ± SEM: 2.90 ± 0.21 hours\n",
|
||
|
|
"Median: 2.96 hours\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"# BASELINE\n",
|
||
|
|
"\n",
|
||
|
|
"# Define baseline time period\n",
|
||
|
|
"start_hour = 0\n",
|
||
|
|
"end_hour = 72\n",
|
||
|
|
"\n",
|
||
|
|
"# Filter the dataset to ONLY include data within specific baseline window\n",
|
||
|
|
"base_df = df.t_filter(start_time=start_hour, end_time=end_hour).xmv('machine_name', 'ETHOSCOPE_302').copy()\n",
|
||
|
|
"\n",
|
||
|
|
"# Exclude dead flies\n",
|
||
|
|
"base_df = base_df[~base_df.index.get_level_values('id').isin(dead_flies)]\n",
|
||
|
|
"\n",
|
||
|
|
"# Calculate Overall 24h Baseline Average\n",
|
||
|
|
"sleep_hours = (base_df.groupby('id')['asleep'].sum() * 10) / 3600\n",
|
||
|
|
"\n",
|
||
|
|
"# (72 - 0) / 24 evaluates to exactly 3 days. \n",
|
||
|
|
"# Dividing total sleep by 3 to average the 72 hours into a single 24-hour metric\n",
|
||
|
|
"days_tracked = (end_hour - start_hour) / 24 \n",
|
||
|
|
"base_overall = (sleep_hours / days_tracked).reset_index(name='Base_Sleep_24h')\n",
|
||
|
|
"\n",
|
||
|
|
"# Calculate Day/Night 12h Baseline Averages\n",
|
||
|
|
"base_df['zt_hour'] = (base_df['t'] / 3600) % 24\n",
|
||
|
|
"base_df['Phase'] = np.where(base_df['zt_hour'] < 12, 'Day', 'Night')\n",
|
||
|
|
"\n",
|
||
|
|
"base_phase = base_df.groupby(['id', 'Phase']).agg(\n",
|
||
|
|
" total_sleep_epochs=('asleep', 'sum'),\n",
|
||
|
|
" total_tracking_epochs=('t', 'count')\n",
|
||
|
|
").reset_index()\n",
|
||
|
|
"\n",
|
||
|
|
"# Tracking_Hours will be ~24 for Day and ~24 for Night \n",
|
||
|
|
"# Dividing sleep by tracking hours and multiplying by 12 averages it to a single 12h block.\n",
|
||
|
|
"base_phase['Sleep_Hours'] = (base_phase['total_sleep_epochs'] * 10) / 3600\n",
|
||
|
|
"base_phase['Tracking_Hours'] = (base_phase['total_tracking_epochs'] * 10) / 3600\n",
|
||
|
|
"base_phase['Base_Sleep_12h'] = (base_phase['Sleep_Hours'] / base_phase['Tracking_Hours']) * 12\n",
|
||
|
|
"\n",
|
||
|
|
"base_pivot = base_phase.pivot(index='id', columns='Phase', values='Base_Sleep_12h').reset_index()\n",
|
||
|
|
"# Rename columns\n",
|
||
|
|
"base_pivot.columns = ['id', 'Base_Day_12h', 'Base_Night_12h']\n",
|
||
|
|
"\n",
|
||
|
|
"# Merge and clean up data\n",
|
||
|
|
"merged_df = pd.merge(base_overall, base_pivot, on='id')\n",
|
||
|
|
"\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",
|
||
|
|
"clean_table = merged_df.dropna(subset=['Machine']).sort_values(by=['Machine', 'Tube'])\n",
|
||
|
|
"baseline_stats = clean_table[['Fly_Label', 'Base_Sleep_24h', 'Base_Day_12h', 'Base_Night_12h']]\n",
|
||
|
|
"\n",
|
||
|
|
"# PRINT RESULTS\n",
|
||
|
|
"print(f\"--- Individual Fly Sleep (Baseline: {start_hour}h to {end_hour}h, Averaged per day) ---\")\n",
|
||
|
|
"print(baseline_stats.head(20).to_string(index=False)) \n",
|
||
|
|
"print(\"... (Showing first 20 rows)\\n\")\n",
|
||
|
|
"\n",
|
||
|
|
"print(f\"--- Grand Summary Statistics (Baseline: {start_hour}h to {end_hour}h) ---\")\n",
|
||
|
|
"print(f\"Total Flies Analyzed: n = {len(baseline_stats)}\")\n",
|
||
|
|
"\n",
|
||
|
|
"# 1. OVERALL 24H STATS\n",
|
||
|
|
"print(\"\\n[ OVERALL SLEEP (Scaled to 24h Baseline Average) ]\")\n",
|
||
|
|
"print(f\"Mean ± SEM: {baseline_stats['Base_Sleep_24h'].mean():.2f} ± {baseline_stats['Base_Sleep_24h'].sem():.2f} hours\")\n",
|
||
|
|
"print(f\"Median: {baseline_stats['Base_Sleep_24h'].median():.2f} hours\")\n",
|
||
|
|
"\n",
|
||
|
|
"# 2. DAY TIME STATS\n",
|
||
|
|
"print(f\"\\n[ DAY TIME (ZT 0-12, Averaged to 12h blocks) ]\")\n",
|
||
|
|
"print(f\"Mean ± SEM: {baseline_stats['Base_Day_12h'].mean():.2f} ± {baseline_stats['Base_Day_12h'].sem():.2f} hours\")\n",
|
||
|
|
"print(f\"Median: {baseline_stats['Base_Day_12h'].median():.2f} hours\")\n",
|
||
|
|
"\n",
|
||
|
|
"# 3. NIGHT TIME STATS\n",
|
||
|
|
"print(f\"\\n[ NIGHT TIME (ZT 12-24, Averaged to 12h blocks) ]\")\n",
|
||
|
|
"print(f\"Mean ± SEM: {baseline_stats['Base_Night_12h'].mean():.2f} ± {baseline_stats['Base_Night_12h'].sem():.2f} hours\")\n",
|
||
|
|
"print(f\"Median: {baseline_stats['Base_Night_12h'].median():.2f} hours\")"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 8,
|
||
|
|
"id": "0119fcf6-de9b-46c9-a8a2-afbf512f7b8a",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"--- Individual Fly Sleep (Stimulus: 72h to 96h) ---\n",
|
||
|
|
" Fly_Label Stim_Sleep_24h Stim_Day_12h Stim_Night_12h\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 01 0.816667 0.000000 0.816667\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 02 2.472222 0.663889 1.808333\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 03 0.000000 0.000000 0.000000\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 04 0.777778 0.500000 0.277778\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 05 0.900000 0.000000 0.900000\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 06 2.313889 0.636111 1.677778\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 07 0.302778 0.111111 0.191667\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 08 0.852778 0.400000 0.452778\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 09 0.000000 0.000000 0.000000\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 11 1.627778 0.677778 0.950000\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 12 2.013889 0.347222 1.666667\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 13 1.705556 0.505556 1.200000\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 14 2.411111 1.069444 1.341667\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 15 4.408333 1.633333 2.775000\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 16 3.780556 2.138889 1.641667\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 17 3.733333 1.441667 2.291667\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 18 0.319444 0.222222 0.097222\n",
|
||
|
|
"ETHOSCOPE_302 - Fly 19 0.441667 0.000000 0.441667\n",
|
||
|
|
"... (Showing first 20 rows)\n",
|
||
|
|
"\n",
|
||
|
|
"--- Grand Summary Statistics (Stimulus: 72h to 96h) ---\n",
|
||
|
|
"Total Flies Analyzed: n = 18\n",
|
||
|
|
"\n",
|
||
|
|
"[ OVERALL SLEEP (24h Stimulus Block) ]\n",
|
||
|
|
"Mean ± SEM: 1.60 ± 0.32 hours\n",
|
||
|
|
"Median: 1.26 hours\n",
|
||
|
|
"\n",
|
||
|
|
"[ DAY TIME (ZT 0-12 during Stimulus) ]\n",
|
||
|
|
"Mean ± SEM: 0.57 ± 0.15 hours\n",
|
||
|
|
"Median: 0.45 hours\n",
|
||
|
|
"\n",
|
||
|
|
"[ NIGHT TIME (ZT 12-24 during Stimulus) ]\n",
|
||
|
|
"Mean ± SEM: 1.03 ± 0.19 hours\n",
|
||
|
|
"Median: 0.92 hours\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"# Define stimulus time period\n",
|
||
|
|
"start_hour = 72\n",
|
||
|
|
"end_hour = 96\n",
|
||
|
|
"\n",
|
||
|
|
"# Filter the dataset to ONLY include data within specific stimulus window\n",
|
||
|
|
"stim_df = df.t_filter(start_time=start_hour, end_time=end_hour).xmv('machine_name', 'ETHOSCOPE_302').copy()\n",
|
||
|
|
"\n",
|
||
|
|
"# Exclude dead flies\n",
|
||
|
|
"stim_df = stim_df[~stim_df.index.get_level_values('id').isin(dead_flies)]\n",
|
||
|
|
"\n",
|
||
|
|
"# Calculate Overall 24h Stimulus Average\n",
|
||
|
|
"sleep_hours = (stim_df.groupby('id')['asleep'].sum() * 10) / 3600\n",
|
||
|
|
"days_tracked = (end_hour - start_hour) / 24 \n",
|
||
|
|
"stim_overall = (sleep_hours / days_tracked).reset_index(name='Stim_Sleep_24h')\n",
|
||
|
|
"\n",
|
||
|
|
"# Calculate Day/Night 12h Stimulus Averages\n",
|
||
|
|
"stim_df['zt_hour'] = (stim_df['t'] / 3600) % 24\n",
|
||
|
|
"stim_df['Phase'] = np.where(stim_df['zt_hour'] < 12, 'Day', 'Night')\n",
|
||
|
|
"\n",
|
||
|
|
"stim_phase = stim_df.groupby(['id', 'Phase']).agg(\n",
|
||
|
|
" total_sleep_epochs=('asleep', 'sum'),\n",
|
||
|
|
" total_tracking_epochs=('t', 'count')\n",
|
||
|
|
").reset_index()\n",
|
||
|
|
"\n",
|
||
|
|
"# Tracking_Hours will now be ~12 for Day and ~12 for Night\n",
|
||
|
|
"# Dividing sleep by tracking hours and multiplying by 12 averages it to a single 12h block.\n",
|
||
|
|
"stim_phase['Sleep_Hours'] = (stim_phase['total_sleep_epochs'] * 10) / 3600\n",
|
||
|
|
"stim_phase['Tracking_Hours'] = (stim_phase['total_tracking_epochs'] * 10) / 3600\n",
|
||
|
|
"stim_phase['Stim_Sleep_12h'] = (stim_phase['Sleep_Hours'] / stim_phase['Tracking_Hours']) * 12\n",
|
||
|
|
"\n",
|
||
|
|
"stim_pivot = stim_phase.pivot(index='id', columns='Phase', values='Stim_Sleep_12h').reset_index()\n",
|
||
|
|
"# Rename columns \n",
|
||
|
|
"stim_pivot.columns = ['id', 'Stim_Day_12h', 'Stim_Night_12h']\n",
|
||
|
|
"\n",
|
||
|
|
"# Merge and clean up data\n",
|
||
|
|
"merged_df = pd.merge(stim_overall, stim_pivot, on='id')\n",
|
||
|
|
"\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",
|
||
|
|
"clean_table = merged_df.dropna(subset=['Machine']).sort_values(by=['Machine', 'Tube'])\n",
|
||
|
|
"stim_stats = clean_table[['Fly_Label', 'Stim_Sleep_24h', 'Stim_Day_12h', 'Stim_Night_12h']]\n",
|
||
|
|
"\n",
|
||
|
|
"# PRINT RESULTS\n",
|
||
|
|
"print(f\"--- Individual Fly Sleep (Stimulus: {start_hour}h to {end_hour}h) ---\")\n",
|
||
|
|
"print(stim_stats.head(20).to_string(index=False)) \n",
|
||
|
|
"print(\"... (Showing first 20 rows)\\n\")\n",
|
||
|
|
"\n",
|
||
|
|
"print(f\"--- Grand Summary Statistics (Stimulus: {start_hour}h to {end_hour}h) ---\")\n",
|
||
|
|
"print(f\"Total Flies Analyzed: n = {len(stim_stats)}\")\n",
|
||
|
|
"\n",
|
||
|
|
"# 1. OVERALL 24H STATS\n",
|
||
|
|
"print(\"\\n[ OVERALL SLEEP (24h Stimulus Block) ]\")\n",
|
||
|
|
"print(f\"Mean ± SEM: {stim_stats['Stim_Sleep_24h'].mean():.2f} ± {stim_stats['Stim_Sleep_24h'].sem():.2f} hours\")\n",
|
||
|
|
"print(f\"Median: {stim_stats['Stim_Sleep_24h'].median():.2f} hours\")\n",
|
||
|
|
"\n",
|
||
|
|
"# 2. DAY TIME STATS\n",
|
||
|
|
"print(f\"\\n[ DAY TIME (ZT 0-12 during Stimulus) ]\")\n",
|
||
|
|
"print(f\"Mean ± SEM: {stim_stats['Stim_Day_12h'].mean():.2f} ± {stim_stats['Stim_Day_12h'].sem():.2f} hours\")\n",
|
||
|
|
"print(f\"Median: {stim_stats['Stim_Day_12h'].median():.2f} hours\")\n",
|
||
|
|
"\n",
|
||
|
|
"# 3. NIGHT TIME STATS\n",
|
||
|
|
"print(f\"\\n[ NIGHT TIME (ZT 12-24 during Stimulus) ]\")\n",
|
||
|
|
"print(f\"Mean ± SEM: {stim_stats['Stim_Night_12h'].mean():.2f} ± {stim_stats['Stim_Night_12h'].sem():.2f} hours\")\n",
|
||
|
|
"print(f\"Median: {stim_stats['Stim_Night_12h'].median():.2f} hours\")"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 9,
|
||
|
|
"id": "b583d55c-d9c3-4920-8630-33b3387a5964",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"\n",
|
||
|
|
"--- 24h Total Statistical Analysis ---\n",
|
||
|
|
"Shapiro-Wilk P-value (Normality of differences): 0.8814\n",
|
||
|
|
"Result: Data is normal. Used Paired T-test.\n",
|
||
|
|
"P-value: 2.8287e-09\n",
|
||
|
|
"Significance: ****\n",
|
||
|
|
"\n",
|
||
|
|
"--- Daytime Statistical Analysis ---\n",
|
||
|
|
"Shapiro-Wilk P-value (Normality of differences): 0.7962\n",
|
||
|
|
"Result: Data is normal. Used Paired T-test.\n",
|
||
|
|
"P-value: 2.0532e-08\n",
|
||
|
|
"Significance: ****\n",
|
||
|
|
"\n",
|
||
|
|
"--- Nighttime Statistical Analysis ---\n",
|
||
|
|
"Shapiro-Wilk P-value (Normality of differences): 0.6437\n",
|
||
|
|
"Result: Data is normal. Used Paired T-test.\n",
|
||
|
|
"P-value: 1.3753e-07\n",
|
||
|
|
"Significance: ****\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"# STATISTICS\n",
|
||
|
|
"\n",
|
||
|
|
"# Merge Baseline and Stimulus data on Fly_Label\n",
|
||
|
|
"paired_df = pd.merge(baseline_stats, stim_stats, on='Fly_Label')\n",
|
||
|
|
"\n",
|
||
|
|
"def run_paired_stats(df, base_col, stim_col, label):\n",
|
||
|
|
" # Calculate the differences for the paired test\n",
|
||
|
|
" diffs = df[stim_col] - df[base_col]\n",
|
||
|
|
" \n",
|
||
|
|
" # 2. Shapiro-Wilk Test for Normality\n",
|
||
|
|
" _, p_shapiro = shapiro(diffs)\n",
|
||
|
|
" \n",
|
||
|
|
" print(f\"\\n--- {label} Statistical Analysis ---\")\n",
|
||
|
|
" print(f\"Shapiro-Wilk P-value (Normality of differences): {p_shapiro:.4f}\")\n",
|
||
|
|
" \n",
|
||
|
|
" # 3. Determine Test: If P > 0.05, data is normal (use t-test). If P < 0.05, use Wilcoxon.\n",
|
||
|
|
" if p_shapiro > 0.05:\n",
|
||
|
|
" stat, p_val = ttest_rel(df[base_col], df[stim_col])\n",
|
||
|
|
" print(f\"Result: Data is normal. Used Paired T-test.\")\n",
|
||
|
|
" else:\n",
|
||
|
|
" stat, p_val = wilcoxon(df[base_col], df[stim_col])\n",
|
||
|
|
" print(f\"Result: Data is not normal. Used Wilcoxon Signed-Rank test.\")\n",
|
||
|
|
" \n",
|
||
|
|
" print(f\"P-value: {p_val:.4e}\")\n",
|
||
|
|
" if p_val < 0.0001: print(\"Significance: ****\")\n",
|
||
|
|
" elif p_val < 0.001: print(\"Significance: ***\")\n",
|
||
|
|
" elif p_val < 0.01: print(\"Significance: **\")\n",
|
||
|
|
" elif p_val < 0.05: print(\"Significance: *\")\n",
|
||
|
|
" else: print(\"Significance: ns\")\n",
|
||
|
|
"\n",
|
||
|
|
"# Run for all three metrics\n",
|
||
|
|
"run_paired_stats(paired_df, 'Base_Sleep_24h', 'Stim_Sleep_24h', '24h Total')\n",
|
||
|
|
"run_paired_stats(paired_df, 'Base_Day_12h', 'Stim_Day_12h', 'Daytime')\n",
|
||
|
|
"run_paired_stats(paired_df, 'Base_Night_12h', 'Stim_Night_12h', 'Nighttime')"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 27,
|
||
|
|
"id": "424e27a6-a502-4e9e-b710-a93f73ffcafa",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stderr",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"/tmp/ipykernel_46102/3180483404.py:46: FutureWarning: \n",
|
||
|
|
"\n",
|
||
|
|
"Setting a gradient palette using color= is deprecated and will be removed in v0.14.0. Set `palette='dark:black'` for the same effect.\n",
|
||
|
|
"\n",
|
||
|
|
" sns.stripplot(\n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAqwAAAJICAYAAACkF7akAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAkNZJREFUeJzs3XdYk2ffPvAzkx2GIFMRRBkq4gZFUdxWW7VDW4sdzjpaW+3y6dA+dbSvdtKn1bpHW21trQNHRUvde+FEcbCJ7BFWkt8flvtnZAghmADn5zh6vN7XPfINbx49uXINkVar1YKIiIiIyESJjV0AEREREVF1GFiJiIiIyKQxsBIRERGRSWNgJSIiIiKTxsBKRERERCaNgZWIiIiITBoDKxERERGZNAZWIiIiIjJpDKxEREREZNJMKrDu2rULr732Gvr06YOgoCA89dRT+O233/DwZly//vorBg8ejA4dOuDJJ5/EgQMHavT8tLQ0zJw5E506dUL37t3xn//8B/n5+fXxVoiIiIjIQESmtDXrmDFj4O7ujgEDBsDe3h5HjhzBihUrMH36dMyYMQMAsHPnTsyePRtTp05FcHAwoqKisGXLFmzcuBFBQUFVPru0tBSjR48GALz55psoKirCZ599Bj8/PyxbtuxxvD0iIiIi0oNJBdbMzEw4ODjotH344YeIiorCyZMnIRaLMXjwYLRv3x5Lly4Vrhk7dixsbGzw448/VvnsHTt2YM6cOYiKioK3tzcA4NChQ5gwYQJ+/fVXBAYG1s+bIiIiIqI6MakhAQ+HVQDw9/dHfn4+CgsLkZCQgNu3b2Po0KE61wwbNgxHjx5FSUlJlc/+559/4OvrK4RVAOjVqxfs7OwQExNjuDdBRERERAZlUoG1MqdPn4azszOsra0RHx8PAPDy8tK5pnXr1igtLUVCQkKVz4mPj9cJqwAgEong5eUlPJeIiIiITI/U2AVU59SpU4iKisK7774LAMjJyQEAKBQKnevKj8vPVyY3Nxc2NjYV2m1tbau9DwD69+9f5bn09HR07NgRGzZsqPYZRERERKQfk+1hTU1NxZtvvokePXpg/Pjxxi6nSmq1GikpKcYug4iIiKjRMske1tzcXEyaNAl2dnb49ttvIRbfz9W2trYAgLy8PDg5Oelc/+D5yigUikqXsMrJyYGrq2u19URHR1d5rrreVyIiIiKqO5PrYS0qKsKUKVOQl5eHFStW6HyNXz4G9eExp/Hx8ZDJZGjRokWVz/X29q5wn1arxa1btyqMbSUiIiIi02FSgbWsrAyzZs1CfHw8VqxYAWdnZ53zLVq0QKtWrbB7926d9qioKISEhEAul1f57D59+uDq1au4ffu20Hb06FFkZ2cjLCzMoO+DiIiIiAzHpALr/PnzceDAAUydOhX5+fk4d+6c8F/5klUzZ87Ejh078M033+D48eP4+OOPceHCBUybNk14TlJSEgICAhAZGSm0DR48GG3atMHMmTNx4MABREVFYe7cuejbty/XYCUiIiIyYSY1hvXw4cMAgMWLF1c4Fx0dDQ8PDwwfPhwqlQo//vgjli9fDi8vL0RGRqJTp07CtVqtFmq1WmdLV5lMhhUrVuDTTz/FW2+9BalUioEDB2Lu3Ln1/8aIiIiISG8mtdNVQ1Q+6aq6iVlEREREpD+TGhJARERERPQwBlYiIiIiMmkMrERERERk0hhYiYiIiMikMbASERERkUljYCUiIiIik8bASkREREQmjYGViIiIiEwaAysRERERmTQGViIiIiIyaQysRERERGTSGFiJiIiIyKQxsBIRERGRSWNgJSIiIiKTxsBKRERERCaNgZWIiIiITBoDKxERERGZNAZWIiIiIjJpDKxEREREZNIYWImIiIjIpDGwEhEREZFJY2AlIiIiIpPGwEpEREREJo2BlYiIiIhMGgMrEREREZk0BlYiIiIiMmkMrERERERk0hhYiYiIiMikMbASERERkUljYCUiIiIik8bASkREREQmjYGViIiIiEwaAysRERERmTQGViIiIiIyaQysRERERGTSGFiJiIiIyKQxsBIRERGRSWNgJSIiIiKTxsBKRERERCaNgZWIiIiITBoDKxERERGZNAZWIiIiIjJpDKxEREREZNIYWImIiIjIpDGwEhEREZFJY2AlIiIiIpPGwEpEREREJo2BlYiIiIhMGgMrEREREZk0BlYiIiIiMmkMrERERERk0hhYiYiIiMikMbASERERkUmTGruAB925cwcrV67E+fPnERcXB29vb+zYsUM4n5iYiP79+1d6r1wux8WLF6t89vHjxzF+/PgK7cOGDcOXX35Z9+KJiIiIqF6YVGCNi4tDTEwMOnbsCI1GA61Wq3O+efPm2LRpk06bVqvFxIkTERwcXKPXWLRoEby9vYVje3v7uhdORERERPXGpAJreHg4BgwYAAB47733EBsbq3NeLpcjKChIp+348ePIz8/H8OHDa/Qabdq0QYcOHQxSLxERERHVP5MawyoW176cHTt2wNraGuHh4fVQEREREREZm0kF1toqLS3F3r17MXDgQJiZmdXonsmTJ8Pf3x99+vTBZ599hqKionqukoiIiIjqwqSGBNTWP//8g+zs7BoNB7CxscHEiRPRrVs3mJmZ4dixY1i1ahXi4+OxbNmyau+taqIXAKSkpMDV1bXWtRMRERFRzTTowLp9+3Y4OjoiJCTkkdcGBAQgICBAOA4JCUHz5s3xySef4MKFCwgMDKzPUomIiIhITw02sBYUFODAgQN49tlnIZFI9HrG0KFD8cknnyA2NrbawBodHV3luep6X4mIiIio7hrsGNa//voLRUVFGDFihLFLISIiIqJ61GAD644dO9CyZUt07NhR72fs3LkTALjMFREREZEJM6khASqVCjExMQCApKQk5OfnY/fu3QCA7t27w8HBAQCQmZmJo0ePYtKkSZU+JykpCQMHDsS0adMwY8YMAMCcOXPg6emJgIAAYdLVmjVrMGDAAAZWIiIiIhNmUoE1IyMDb7zxhk5b+fG6devQo0cPAMCuXbtQVlZW5XAArVYLtVqts1NWmzZtsH37dqxatQqlpaVwd3fH1KlTMXny5Hp6N0RERERkCCLtw/ufUq2UT7qqbmIWEREREemvwY5hJSIiIqKmgYGViIiIiEwaAysRERERmTQGViIiIiIyaQysRERERGTSGFiJiIiIyKQxsBIRERGRSWNgJSIiIiKTxsBKRERERCaNgZWIiIiITBoDKxERERGZNAZWIiIiIjJpDKxEREREZNIYWImIiIjIpDGwEhEREZFJY2AlIiIiIpPGwEpEREREJo2BlYiIiIhMGgMrEREREZk0BlYiIiIiMmkMrERERERk0hhYiYiIiMikMbASERERkUljYCUiIiIik8bASkREREQmjYGViIiIiEwaAysRERERmTQGViIiIiIyaQysRERERGTSGFiJiIiIyKQxsBIRERGRSWNgJSIiIiKTxsBKRERERCaNgZWIiIiITBoDKxERERGZNAZWIiIiIjJpDKxEREREZNIYWImIiIjIpDGwEhEREZFJY2AlIiIiIpPGwEpEREREJo2BlYiIiIhMGgMrEREREZk0BlYiIiIiMmkMrERERERk0hhYiYiIiMikMbASERERkUljYCUiIiIik8bASkREREQmjYGViIiIiExanQNrcXExSkpKDFELEREREVEF0trecPz4cURHR+PMmTO4efMmioqKAADm5uZo3bo1OnXqhAEDBqBHjx4GL5aIiIiImh6RVqvVPuqi0tJSbNq0CatXr0ZSUhJsbW3Rrl07eHh4wNbWFlqtFrm5uUhMTMSlS5eQk5MDNzc3vPrqqxgzZgxkMtnjeC9G0b9/fwBAdHS0kSshIiIiapxq1MM6aNAglJaWYuTIkRg6dCjatWtX7fWxsbHYvXs3fvjhB6xatQr79++vUTF37tzBypUrcf78ecTFxcHb2xs7duzQuSYiIgInTpyocG9UVBRat25d7fPT0tLw6aef4tChQ5DJZBg4cCDef/99WFtb16g+IiIiInr8ahRYp0yZgtGjR0Mul9f
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 700x600 with 1 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"#PLOT\n",
|
||
|
|
"\n",
|
||
|
|
"# 1. PREPARE DATA & CALCULATE STATS\n",
|
||
|
|
"combined = pd.merge(baseline_stats, stim_stats, on='Fly_Label')\n",
|
||
|
|
"\n",
|
||
|
|
"# Calculate the paired statistics for the brackets\n",
|
||
|
|
"p_values = {}\n",
|
||
|
|
"metrics = {\n",
|
||
|
|
" '24h': ('Base_Sleep_24h', 'Stim_Sleep_24h'),\n",
|
||
|
|
" 'Day': ('Base_Day_12h', 'Stim_Day_12h'),\n",
|
||
|
|
" 'Night': ('Base_Night_12h', 'Stim_Night_12h')\n",
|
||
|
|
"}\n",
|
||
|
|
"\n",
|
||
|
|
"for phase, (base_col, stim_col) in metrics.items():\n",
|
||
|
|
" diffs = combined[stim_col] - combined[base_col]\n",
|
||
|
|
" _, p_shapiro = shapiro(diffs)\n",
|
||
|
|
" \n",
|
||
|
|
" if p_shapiro > 0.05:\n",
|
||
|
|
" _, p_val = ttest_rel(combined[base_col], combined[stim_col])\n",
|
||
|
|
" else:\n",
|
||
|
|
" _, p_val = wilcoxon(combined[base_col], combined[stim_col])\n",
|
||
|
|
" p_values[phase] = p_val\n",
|
||
|
|
"\n",
|
||
|
|
"plot_df = combined.melt(id_vars=['Fly_Label'], var_name='Variable', value_name='Hours')\n",
|
||
|
|
"plot_df['Condition'] = plot_df['Variable'].apply(lambda x: '24h' if '24h' in x else ('Day' if 'Day' in x else 'Night'))\n",
|
||
|
|
"plot_df['State'] = plot_df['Variable'].apply(lambda x: 'Baseline' if 'Base' in x else 'Stimulus')\n",
|
||
|
|
"\n",
|
||
|
|
"\n",
|
||
|
|
"# 2. GENERATE PLOT\n",
|
||
|
|
"plt.figure(figsize=(7, 6))\n",
|
||
|
|
"sns.set_theme(style=\"ticks\")\n",
|
||
|
|
"\n",
|
||
|
|
"order = ['24h', 'Day', 'Night']\n",
|
||
|
|
"hue_order = ['Baseline', 'Stimulus']\n",
|
||
|
|
"palette = {'Baseline': '#cccccc', 'Stimulus': '#ff4c4c'}\n",
|
||
|
|
"\n",
|
||
|
|
"# Boxplot\n",
|
||
|
|
"sns.boxplot(\n",
|
||
|
|
" data=plot_df, x='Condition', y='Hours', hue='State', \n",
|
||
|
|
" order=order, hue_order=hue_order, palette=palette,\n",
|
||
|
|
" width=0.6, gap=0.2, boxprops={'edgecolor': 'black', 'alpha': 0.7},\n",
|
||
|
|
" medianprops={'color': 'black', 'linewidth': 1.5}, showfliers=False\n",
|
||
|
|
")\n",
|
||
|
|
"\n",
|
||
|
|
"# Stripplot\n",
|
||
|
|
"sns.stripplot(\n",
|
||
|
|
" data=plot_df, x='Condition', y='Hours', hue='State', \n",
|
||
|
|
" order=order, hue_order=hue_order, dodge=True,\n",
|
||
|
|
" color='black', alpha=0.5, size=4, jitter=0.05,\n",
|
||
|
|
" legend=False\n",
|
||
|
|
")\n",
|
||
|
|
"\n",
|
||
|
|
"\n",
|
||
|
|
"# 3. ADD MEDIAN LABELS\n",
|
||
|
|
"ax = plt.gca()\n",
|
||
|
|
"medians = plot_df.groupby(['Condition', 'State'], sort=False)['Hours'].median()\n",
|
||
|
|
"\n",
|
||
|
|
"offsets = {'Baseline': -0.4, 'Stimulus': 0.4}\n",
|
||
|
|
"\n",
|
||
|
|
"for i, cond in enumerate(order):\n",
|
||
|
|
" for state in hue_order:\n",
|
||
|
|
" val = medians[(cond, state)]\n",
|
||
|
|
" ax.text(i + offsets[state], val, f\"{val:.1f}h\", \n",
|
||
|
|
" ha='center', va='bottom', fontsize=10)\n",
|
||
|
|
"\n",
|
||
|
|
"\n",
|
||
|
|
"# 4. ADD SIGNIFICANCE BRACKETS\n",
|
||
|
|
"y_max = plot_df['Hours'].max()\n",
|
||
|
|
"y_line = y_max + 1.0 \n",
|
||
|
|
"h = 0.4 \n",
|
||
|
|
"\n",
|
||
|
|
"for i, cond in enumerate(order):\n",
|
||
|
|
" p = p_values[cond]\n",
|
||
|
|
" \n",
|
||
|
|
" if p < 0.0001: star = '****'\n",
|
||
|
|
" elif p < 0.001: star = '***'\n",
|
||
|
|
" elif p < 0.01: star = '**'\n",
|
||
|
|
" elif p < 0.05: star = '*'\n",
|
||
|
|
" else: star = 'ns'\n",
|
||
|
|
" \n",
|
||
|
|
" x1, x2 = i - 0.2, i + 0.2\n",
|
||
|
|
" plt.plot([x1, x1, x2, x2], [y_line, y_line+h, y_line+h, y_line], lw=1.5, c='k')\n",
|
||
|
|
" plt.text((x1+x2)*.5, y_line+h, star, ha='center', va='bottom', fontsize=12)\n",
|
||
|
|
"\n",
|
||
|
|
"\n",
|
||
|
|
"# 5. FORMATTING\n",
|
||
|
|
"sns.despine()\n",
|
||
|
|
"plt.ylabel('Average time spent asleep (hours)', fontsize=12)\n",
|
||
|
|
"plt.xlabel('')\n",
|
||
|
|
"plt.xlim(-0.6, 2.5) \n",
|
||
|
|
"plt.ylim(0, max(20, y_line + h + 1.5)) \n",
|
||
|
|
"\n",
|
||
|
|
"# Legend moved to the outside right\n",
|
||
|
|
"plt.legend(title='', frameon=False, loc='center left', bbox_to_anchor=(1, 0.5))\n",
|
||
|
|
"\n",
|
||
|
|
"plt.tight_layout()\n",
|
||
|
|
"\n",
|
||
|
|
"plt.savefig(\"11H_Baseline_vs_Stimulus.png\", dpi=600, bbox_inches='tight')\n",
|
||
|
|
"plt.show()"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"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
|
||
|
|
}
|