Optogenetics-Sleep-Deprivation/3.CantonS_Green_Stimulus.ipynb

1043 lines
563 KiB
Text
Raw Normal View History

2026-05-26 14:03:55 +00:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 24,
"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\n",
"from scipy.stats import wilcoxon, shapiro, ttest_rel"
]
},
{
"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": 4,
"id": "3d32b423-cc70-43f2-a2cc-ed9bd08c2981",
"metadata": {},
"outputs": [],
"source": [
"meta = '/home/rdingjin/CantonS_2026-05-01/metadata_CantonS_2026-05-01_green.csv'\n",
"local = '/mnt/ethoscope_results'"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "df11ef6f-5475-45b0-95c3-2a8672a21219",
"metadata": {},
"outputs": [],
"source": [
"metadata = etho.link_meta_index(meta, local)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "ebfbf3dc-d405-4f7b-a4a1-1eacff24f3a5",
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"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"
]
}
],
"source": [
"#fetch data from ethoscope\n",
"data = etho.load_ethoscope(metadata, reference_hour = 9.0, FUN = etho.sleep_annotation)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "a32d69f8-e66c-47fc-9b9a-2273f2c5082b",
"metadata": {},
"outputs": [],
"source": [
"df = etho.behavpy(data, metadata, check = True)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "e633d7d9-99db-4815-900d-e79d11dd65b1",
"metadata": {},
"outputs": [],
"source": [
"df.to_pickle('/home/rdingjin/CantonS_2026-05-01/phase3.pkl')"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "ae2ff7e0-2f6c-4cc0-9afd-a1c021140760",
"metadata": {},
"outputs": [],
"source": [
"import ethoscopy as etho\n",
"import pandas as pd\n",
"import numpy as np\n",
"from scipy.stats import wilcoxon, shapiro, ttest_rel\n",
"df = pd.read_pickle('/home/rdingjin/CantonS_2026-05-01/phase3.pkl')"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "94a0854d-4b5a-475f-a856-c61ec01d080e",
"metadata": {},
"outputs": [],
"source": [
"df = df.baseline(column = 'baseline')"
]
},
{
"cell_type": "code",
"execution_count": 11,
"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-05-01_14-02-36_13005e|01 2026-05-01 ETHOSCOPE_130 1 \n",
"2026-05-01_14-02-36_13005e|02 2026-05-01 ETHOSCOPE_130 2 \n",
"2026-05-01_14-02-36_13005e|03 2026-05-01 ETHOSCOPE_130 3 \n",
"2026-05-01_14-02-36_13005e|04 2026-05-01 ETHOSCOPE_130 4 \n",
"2026-05-01_14-02-36_13005e|05 2026-05-01 ETHOSCOPE_130 5 \n",
"2026-05-01_14-02-36_13005e|06 2026-05-01 ETHOSCOPE_130 6 \n",
"2026-05-01_14-02-36_13005e|07 2026-05-01 ETHOSCOPE_130 7 \n",
"2026-05-01_14-02-36_13005e|08 2026-05-01 ETHOSCOPE_130 8 \n",
"2026-05-01_14-02-36_13005e|09 2026-05-01 ETHOSCOPE_130 9 \n",
"2026-05-01_14-02-36_13005e|10 2026-05-01 ETHOSCOPE_130 10 \n",
"2026-05-01_14-02-36_13005e|11 2026-05-01 ETHOSCOPE_130 11 \n",
"2026-05-01_14-02-36_13005e|12 2026-05-01 ETHOSCOPE_130 12 \n",
"2026-05-01_14-02-36_13005e|13 2026-05-01 ETHOSCOPE_130 13 \n",
"2026-05-01_14-02-36_13005e|14 2026-05-01 ETHOSCOPE_130 14 \n",
"2026-05-01_14-02-36_13005e|15 2026-05-01 ETHOSCOPE_130 15 \n",
"2026-05-01_14-02-36_13005e|16 2026-05-01 ETHOSCOPE_130 16 \n",
"2026-05-01_14-02-36_13005e|17 2026-05-01 ETHOSCOPE_130 17 \n",
"2026-05-01_14-02-36_13005e|18 2026-05-01 ETHOSCOPE_130 18 \n",
"2026-05-01_14-02-36_13005e|19 2026-05-01 ETHOSCOPE_130 19 \n",
"2026-05-01_14-02-36_13005e|20 2026-05-01 ETHOSCOPE_130 20 \n",
"\n",
" sleep_deprived species food baseline \\\n",
"id \n",
"2026-05-01_14-02-36_13005e|01 True CantonS normal_food 0 \n",
"2026-05-01_14-02-36_13005e|02 False CantonS normal_food 0 \n",
"2026-05-01_14-02-36_13005e|03 True CantonS normal_food 0 \n",
"2026-05-01_14-02-36_13005e|04 False CantonS normal_food 0 \n",
"2026-05-01_14-02-36_13005e|05 True CantonS normal_food 0 \n",
"2026-05-01_14-02-36_13005e|06 False CantonS normal_food 0 \n",
"2026-05-01_14-02-36_13005e|07 True CantonS normal_food 0 \n",
"2026-05-01_14-02-36_13005e|08 False CantonS normal_food 0 \n",
"2026-05-01_14-02-36_13005e|09 True CantonS normal_food 0 \n",
"2026-05-01_14-02-36_13005e|10 False CantonS normal_food 0 \n",
"2026-05-01_14-02-36_13005e|11 False CantonS normal_food 0 \n",
"2026-05-01_14-02-36_13005e|12 True CantonS normal_food 0 \n",
"2026-05-01_14-02-36_13005e|13 False CantonS normal_food 0 \n",
"2026-05-01_14-02-36_13005e|14 True CantonS normal_food 0 \n",
"2026-05-01_14-02-36_13005e|15 False CantonS normal_food 0 \n",
"2026-05-01_14-02-36_13005e|16 True CantonS normal_food 0 \n",
"2026-05-01_14-02-36_13005e|17 False CantonS normal_food 0 \n",
"2026-05-01_14-02-36_13005e|18 True CantonS normal_food 0 \n",
"2026-05-01_14-02-36_13005e|19 False CantonS normal_food 0 \n",
"2026-05-01_14-02-36_13005e|20 True CantonS normal_food 0 \n",
"\n",
" sex time \n",
"id \n",
"2026-05-01_14-02-36_13005e|01 male 14-02-36 \n",
"2026-05-01_14-02-36_13005e|02 male 14-02-36 \n",
"2026-05-01_14-02-36_13005e|03 male 14-02-36 \n",
"2026-05-01_14-02-36_13005e|04 male 14-02-36 \n",
"2026-05-01_14-02-36_13005e|05 male 14-02-36 \n",
"2026-05-01_14-02-36_13005e|06 male 14-02-36 \n",
"2026-05-01_14-02-36_13005e|07 male 14-02-36 \n",
"2026-05-01_14-02-36_13005e|08 male 14-02-36 \n",
"2026-05-01_14-02-36_13005e|09 male 14-02-36 \n",
"2026-05-01_14-02-36_13005e|10 male 14-02-36 \n",
"2026-05-01_14-02-36_13005e|11 male 14-02-36 \n",
"2026-05-01_14-02-36_13005e|12 male 14-02-36 \n",
"2026-05-01_14-02-36_13005e|13 male 14-02-36 \n",
"2026-05-01_14-02-36_13005e|14 male 14-02-36 \n",
"2026-05-01_14-02-36_13005e|15 male 14-02-36 \n",
"2026-05-01_14-02-36_13005e|16 male 14-02-36 \n",
"2026-05-01_14-02-36_13005e|17 male 14-02-36 \n",
"2026-05-01_14-02-36_13005e|18 male 14-02-36 \n",
"2026-05-01_14-02-36_13005e|19 male 14-02-36 \n",
"2026-05-01_14-02-36_13005e|20 male 14-02-36 \n",
" ====== DATA ======\n",
"\n",
" t x y w \\\n",
"id \n",
"2026-05-01_14-02-36_13005e|01 18180 159.250000 46.350000 27.100000 \n",
"2026-05-01_14-02-36_13005e|01 18190 239.650000 43.200000 28.650000 \n",
"2026-05-01_14-02-36_13005e|01 18200 249.578947 42.052632 28.526316 \n",
"2026-05-01_14-02-36_13005e|01 18210 261.684211 44.684211 27.052632 \n",
"2026-05-01_14-02-36_13005e|01 18220 321.666667 47.555556 25.500000 \n",
"... ... ... ... ... \n",
"2026-05-01_14-02-36_13005e|20 359410 269.000000 26.000000 27.111111 \n",
"2026-05-01_14-02-36_13005e|20 359420 269.000000 26.000000 27.400000 \n",
"2026-05-01_14-02-36_13005e|20 359430 269.000000 26.000000 27.117647 \n",
"2026-05-01_14-02-36_13005e|20 359440 269.000000 26.000000 27.133333 \n",
"2026-05-01_14-02-36_13005e|20 359450 269.000000 26.000000 27.000000 \n",
"\n",
" h phi max_velocity \\\n",
"id \n",
"2026-05-01_14-02-36_13005e|01 12.600000 160.450000 10.324731 \n",
"2026-05-01_14-02-36_13005e|01 12.150000 16.800000 3.082327 \n",
"2026-05-01_14-02-36_13005e|01 12.105263 107.105263 7.996110 \n",
"2026-05-01_14-02-36_13005e|01 11.210526 14.210526 13.548111 \n",
"2026-05-01_14-02-36_13005e|01 11.444444 107.777778 10.253656 \n",
"... ... ... ... \n",
"2026-05-01_14-02-36_13005e|20 11.944444 10.333333 0.714297 \n",
"2026-05-01_14-02-36_13005e|20 12.000000 13.000000 0.747961 \n",
"2026-05-01_14-02-36_13005e|20 11.941176 10.941176 0.888953 \n",
"2026-05-01_14-02-36_13005e|20 11.933333 12.400000 0.730935 \n",
"2026-05-01_14-02-36_13005e|20 12.000000 0.000000 0.655962 \n",
"\n",
" mean_velocity dist has_interacted \\\n",
"id \n",
"2026-05-01_14-02-36_13005e|01 5.212167 0.312730 0.0 \n",
"2026-05-01_14-02-36_13005e|01 0.983852 0.059031 0.0 \n",
"2026-05-01_14-02-36_13005e|01 1.723054 0.098214 0.0 \n",
"2026-05-01_14-02-36_13005e|01 2.109787 0.120258 0.0 \n",
"2026-05-01_14-02-36_13005e|01 4.167080 0.225022 0.0 \n",
"... ... ... ... \n",
"2026-05-01_14-02-36_13005e|20 0.649865 0.035093 0.0 \n",
"2026-05-01_14-02-36_13005e|20 0.653423 0.029404 0.0 \n",
"2026-05-01_14-02-36_13005e|20 0.671835 0.034264 0.0 \n",
"2026-05-01_14-02-36_13005e|20 0.644651 0.029009 0.0 \n",
"2026-05-01_14-02-36_13005e|20 0.655962 0.001968 0.0 \n",
"\n",
" beam_cross moving micro walk \\\n",
"id \n",
"2026-05-01_14-02-36_13005e|01 0.0 True False True \n",
"2026-05-01_14-02-36_13005e|01 0.0 True False True \n",
"2026-05-01_14-02-36_13005e|01 0.0 True False True \n",
"2026-05-01_14-02-36_13005e|01 0.0 True False True \n",
"2026-05-01_14-02-36_13005e|01 0.0 True False True \n",
"... ... ... ... ... \n",
"2026-05-01_14-02-36_13005e|20 0.0 False False False \n",
"2026-05-01_14-02-36_13005e|20 0.0 False False False \n",
"2026-05-01_14-02-36_13005e|20 0.0 False False False \n",
"2026-05-01_14-02-36_13005e|20 0.0 False False False \n",
"2026-05-01_14-02-36_13005e|20 0.0 False False False \n",
"\n",
" is_interpolated asleep \n",
"id \n",
"2026-05-01_14-02-36_13005e|01 False False \n",
"2026-05-01_14-02-36_13005e|01 False False \n",
"2026-05-01_14-02-36_13005e|01 False False \n",
"2026-05-01_14-02-36_13005e|01 False False \n",
"2026-05-01_14-02-36_13005e|01 False False \n",
"... ... ... \n",
"2026-05-01_14-02-36_13005e|20 False False \n",
"2026-05-01_14-02-36_13005e|20 False False \n",
"2026-05-01_14-02-36_13005e|20 False False \n",
"2026-05-01_14-02-36_13005e|20 False False \n",
"2026-05-01_14-02-36_13005e|20 False False \n",
"\n",
"[683112 rows x 16 columns]\n"
]
}
],
"source": [
"df.display()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"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 800x200 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": 41,
"id": "64a23e70-b06a-4c0e-8aad-0fee653d74b3",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1200x475 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",
"# Add shading stimulus shading\n",
"ax.axvspan(72, 96, color='#51ff4c', 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(\"Figure_3A.png\", dpi=600, bbox_inches='tight')"
]
},
{
"cell_type": "code",
"execution_count": 42,
"id": "3a8d183b-f839-4168-b72f-53f1a05b5826",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA4sAAAGrCAYAAABpIAJ8AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzsvXmYXFd55/895y619q7WZi22ZCzbLDZhx+AQDAkMIWQgG0t+TsJMCOMEHmcmE2YmQ5hn5smPH4RJAskMgSQTQhIIBIKBsCVkMPtqjHchW1JbUku91363s/z+OPfculV1q7q61VIvOh8eoFXrraq7nPd9v+/3JVJKCYPBYDAYDAaDwWAwGFLQzd4Ag8FgMBgMBoPBYDBsPUywaDAYDAaDwWAwGAyGHkywaDAYDAaDwWAwGAyGHkywaDAYDAaDwWAwGAyGHkywaDAYDAaDwWAwGAyGHkywaDAYDAaDwWAwGAyGHkywaDAYDAaDwWAwGAyGHkywaDAYDAaDwWAwGAyGHkywaDAYDAaDwWAwGAyGHrZUsDgzM4O3vvWteMUrXoEbb7wRP/mTPznU86SUeN/73ocXvOAFeMpTnoKf//mfx7333ntpN9ZgMBgMBoPBYDAYdjD2Zm9AmhMnTuDuu+/GTTfdBCEEpJRDPe/9738/3v3ud+M//If/gGPHjuFv/uZv8Cu/8iu46667cPDgwXVty9Of/nSEYYjp6el1Pd9gMBgMBoPBYDAYtiILCwtwXRff/e53Bz6OyGEjssuAEAKUqmLnW97yFjzwwAP49Kc/PfA5QRDguc99Ll772tfiN3/zNwEAYRjiJS95CW699Va87W1vW9e2PPnJTwbnHPv27VvX8w0Gg8FgMPQiIREggITY7E0xGAxDQkCRQw4EZLM3xbBBnD9/HpZl4f777x/4uC1VWdSB4lq455570Gg08NKXvjS5zXVdvPjFL8Y//dM/rXtbdu/eDQD44he/uO7XMBgMBoPB0EkTTXwFd8OFCwfuZm+OwWBYhQghQoR4Pn4UJZQ2e3MMG8Rtt9021OO2VLC4Hk6ePAkAOHLkSMftR48exQc+8AH4vo98Pr8Zm2YwGAwGg6EPDlzkYa7PBsN2IES42Ztg2CS2fbBYq9Xgui5yuVzH7aOjo5BSolqt9g0WB0XU58+fx969e9FqtTZ0ew0Gg8FguJLx4CG0QjgIjaTNYNgGhPF/PO6ZY3YHIaUEIav/nts+WLyUhGGIhx9+eLM3w2AwGAyGHYNPfVyYvIA8z8MRRoZqMGx1IhrCt3wcXz6OvDBqgJ1CGIY9xbYstn2wODo6ijAMEQRBxweu1WoghGBsbKzvcwf1I952222QUuKGG27Y0O01GAwGg+FKpoUWlqwFlFBGDqsvVAwGw+YSIEATDRybPoYiipu9OYYNwnWHS9Zt+2BR9yqeOnUK119/fXL7yZMnsX///ovqVySEoFg0B4XBYDAYDBuFhIQb/8cEiwbD1kdCIoKLAgomWNxBDCNBBYC1249uMX7kR34E5XIZn/3sZ5PboijCF77wBdx6662buGUGg8FgMBgMBoPBsH3ZUpVFz/Nw9913AwDOnTuHRqOBz33ucwCAZz7zmZicnMTtt9+O2dnZZCxGLpfDG97wBrznPe/B5OQkrrvuOnzoQx9CpVLB61//+k37LAaDwWAwGAwGg8GwndlSweLS0hLe/OY3d9ym//1Xf/VXeNazngUhBDjnHY/5t//230JKib/4i7/A8vIybrjhBvz5n/85Dh48eNm23WAwGAwGg8FgMBh2ElsqWDxw4ACOHz8+8DEf/OAHe24jhOANb3gD3vCGN1yqTTMYDAaDwWAwGAyGK4pt37NoMBgMBoPBYDAYDIaNxwSLBoPBYDAYDAaDYdshpYQfss3ejB2NCRYNBoPBYDAYDAbDtmOx4uPE4xVEjK/+YMO6MMGiwWAwGAwGg8Fg2Hb4IYOUEpzLzd6UHYsJFg0Gg8FgMBgMBsO2gxBAQv3XcGkwwaLBYDAYDAaDwWAwGHowwaLBYDAYDAaDwWAwGHowwaLBYDAYDAaDwWDYtpDN3oAdjAkWDYYtQBgZFy+DwWAwGAwGw9bCBIsGwyYTRhwPnlzCUtXb7E0xGHYcLT8yyRiDwWAwGNaJCRYNhk3GCxiaXoSmFwEAml6EaiPY5K0yGHYGj5xexsOnl8GF8cozGAwGg2GtmGDRYNhkuJAIIp7YPj92toJHz1Y2c5MMhh2BFzAEEUetEeKhk0ubvTkGg8FguASYVOClxQSLBsMmI4QE4wJhJACo4NEPOSImNnnLDIbtzUrNR60ZYrnmgwsBKSWWqh6EqTIaDAaDwTAUJlg0GC4BYcTB+HDBHhcSUgCMq74qISQ4F+BDPt9gMGQjAVBCMD6SQxgJnJqt4cSZClbq/mZvmsFgMBgM2wJ7szfAYNiJPHhyEQDBU4/t7vuYlbqPC0stjJZccCkQhCpY5EKqaqOpfhgMF4VO2JQKDpZrHlyHolILwLg6tqSUiJiA61ibuZkGg8FgMGxZTGXRYNhguJDwA46mH8ELWN/HnV9sYqnqoVpXi1fGJRZWPDAuwOPqosFgWD+MCRBCkHMsQAJhJBBxnrijzi428dCpJWN+YzAYDAZDH0ywaDBsMGHEEXGBphfh+Mxy36AvCNWitelHsClBxDjOLdRRaQRgXKARu6MaDIb14YUMFlWjmoVE7DJM0PIZKvUAjVaIlVqA5aqRpRoMBoPBkIWRoRoMG8zccgsRE7AoxUo9wNn5BqbG8igX3eQxysSGgXEBFsvgpARqzRCMCXBCzGw4g+Ei8XwGx1Y50d0TBTRaEQghqLdC1FshHJui7oXwgghAYXM31mAwGAyGLYipLBoMG4iUEksVDy0/wvR4AZwLzC238Oi5asfjml4EP+RgXIJLiXzOhh9y1Fshrt43itGSi8WKh/tOLAyUshoMhmw4F3HSRlUWHdvCxGgeI0UH8ystLNc8NL0IUsAcYwaDwbBNkaaL4JJjgkWDYZ1IKVFvhR23BRFHy2fYNV4EpQRCSnhBhJYXdbijRoyDMVVVDCOOQs6G50co5R0QQuDYFIwJXFhu4ux8/XJ/NINh28OEBOcSltV5mSvmHeydLKnKf03JT2vN0PQtGgwGg8GQgQkWDYZ1UmkE+OHjK3hkZhkAML/cwunZGoQUifSNcwkv4AginvRFSSlxfrEJKYFd4wXUmxEcm+LQ3lFMjSkpnGNTVJshPJ8bOarBsA44FxCQiAuLHTg2xe6JIvZMlTA9UUDDi1Ax4zQMBoPBYOjBBIsGwzphTKJSD1BtBAgijnMLDVQaAYRAIn0DVHBYa4ZYrHoAVE9jrRkiiBhGii6OXDUGSjpXtDnHQt61MDmWR60Z4r4TC2i0QvihkcsZDMMgJSCFBCEZ0WJMzrFQLjho+RFafu+xtVLzTcXRYDAYDFc0xuDGYFgnXAgEEQfxgEo9QCtgaPkROJNJsLhnsggAaPkM1UaAU7NVeAHHwoqHvVNFSCnx9/9yAl7A8NqX3JA8jxCCqbEC/ICh6UeglOCHj6+AWhQ3Xj1p5sIZDKsgpISUGBgsAup+17Yguxpf/IDh5GwVV02XsXeq1PnaQoJmlSwNBoPBYNhhmMqiwbBOIiZgWxRcSDS9CGHI0fIYbJsmC1THtuDYFop5Gyv1AIsVD00vxMRoDsW8g6bP8P0fLuCRmRWcmq32vEc+Z6PWDNFoRQgijoXlFpZrRi5nMKyGEBKyjwy1G0oJgrBT7u3Hx7PoqixKKXHfY4uYXWhs5OYaDAaDYR0k52iTv7tkmGDRYFgnUcRBCUHEBGrNABHnuGb/aFJNTOPYFkp5B/PLLbB4rAaAxGBD/y2lRNAlNb163ygYF+BcIox4IotjsdujwWDoRUq1iFitsggo2XjAOoNFxgVC1tsvHDGBRivEfMXbsG01GAwGw/qoNUNjiXqJMcGiwbBOAsZhUQIhJFbqARgfvDCdHM2jmHfQCtqDwhtelNy/VPNx74kF/Lc//xa+f3w+uZ0Q9R5CSoAArfg5D59axoOnli7RpzMYtjdtGerqj6WEIIo6Ey8RE4gi0eF
"text/plain": [
"<Figure size 1066.67x458.333 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"start_hour = 24\n",
"\n",
"# Generate plot from Ethoscopy\n",
"fig = df.t_filter(start_time=start_hour).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",
"ax.axvspan(72, 96, color='#51ff4c', 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(\"Figure_3A(start24h).png\", dpi=600, bbox_inches='tight')"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "522d1ddd-247d-4f1f-b20f-fcd0e9516b41",
"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_130 - Fly 01 11.659259 4.414647 7.863889\n",
"ETHOSCOPE_130 - Fly 02 12.112037 3.861450 8.791667\n",
"ETHOSCOPE_130 - Fly 03 12.719444 5.493898 7.995370\n",
"ETHOSCOPE_130 - Fly 04 13.904630 5.667265 9.031481\n",
"ETHOSCOPE_130 - Fly 05 14.106481 5.855707 9.071296\n",
"ETHOSCOPE_130 - Fly 06 12.323148 5.013640 8.012037\n",
"ETHOSCOPE_130 - Fly 07 13.837963 5.827679 8.827778\n",
"ETHOSCOPE_130 - Fly 08 12.409259 4.860732 8.229630\n",
"ETHOSCOPE_130 - Fly 09 13.751852 6.071070 8.531481\n",
"ETHOSCOPE_130 - Fly 10 12.789815 5.192246 8.325926\n",
"ETHOSCOPE_130 - Fly 11 8.700926 4.479541 4.849074\n",
"ETHOSCOPE_130 - Fly 12 11.645370 4.888729 7.441667\n",
"ETHOSCOPE_130 - Fly 13 14.201852 6.862527 8.300926\n",
"ETHOSCOPE_130 - Fly 14 12.330556 5.414214 7.675000\n",
"ETHOSCOPE_130 - Fly 15 11.861111 4.684976 7.833333\n",
"ETHOSCOPE_130 - Fly 16 12.712963 4.843503 8.548148\n",
"ETHOSCOPE_130 - Fly 17 14.035185 5.260230 9.512037\n",
"ETHOSCOPE_130 - Fly 18 12.533333 5.007450 8.228704\n",
"ETHOSCOPE_130 - Fly 19 12.372222 5.780330 7.401852\n",
"ETHOSCOPE_130 - Fly 20 12.086111 4.534458 8.187037\n",
"... (Showing first 20 rows)\n",
"\n",
"--- Grand Summary Statistics (Baseline: 0h to 72h) ---\n",
"Total Flies Analyzed: n = 20\n",
"\n",
"[ OVERALL SLEEP (Scaled to 24h Baseline Average) ]\n",
"Mean ± SEM: 12.60 ± 0.28 hours\n",
"Median: 12.47 hours\n",
"\n",
"[ DAY TIME (ZT 0-12, Averaged to 12h blocks) ]\n",
"Mean ± SEM: 5.20 ± 0.15 hours\n",
"Median: 5.10 hours\n",
"\n",
"[ NIGHT TIME (ZT 12-24, Averaged to 12h blocks) ]\n",
"Mean ± SEM: 8.13 ± 0.21 hours\n",
"Median: 8.23 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).copy()\n",
"\n",
"# Calculate Overall 24h Baseline Average\n",
"sleep_hours = (base_df.groupby('id')['asleep'].sum() * 10) / 3600\n",
"\n",
"# (48 - 0) / 24 evaluates to exactly 2 days. \n",
"# Dividing total sleep by 2 to average the 48 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 24 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": 29,
"id": "8c8013b6-ce63-4e0e-9963-67bd0e0c8f87",
"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_130 - Fly 01 6.961111 3.391667 3.569444\n",
"ETHOSCOPE_130 - Fly 02 3.258333 1.925000 1.333333\n",
"ETHOSCOPE_130 - Fly 03 7.050000 3.061111 3.988889\n",
"ETHOSCOPE_130 - Fly 04 7.122222 1.158333 5.963889\n",
"ETHOSCOPE_130 - Fly 05 10.422222 4.269444 6.152778\n",
"ETHOSCOPE_130 - Fly 06 7.719444 2.850000 4.869444\n",
"ETHOSCOPE_130 - Fly 07 8.080556 2.966667 5.113889\n",
"ETHOSCOPE_130 - Fly 08 3.063889 0.525000 2.538889\n",
"ETHOSCOPE_130 - Fly 09 4.530556 2.419444 2.111111\n",
"ETHOSCOPE_130 - Fly 10 6.758333 1.197222 5.561111\n",
"ETHOSCOPE_130 - Fly 11 6.300000 2.147222 4.152778\n",
"ETHOSCOPE_130 - Fly 12 11.144444 4.952778 6.191667\n",
"ETHOSCOPE_130 - Fly 13 13.136111 5.805556 7.330556\n",
"ETHOSCOPE_130 - Fly 14 13.988889 5.394444 8.594444\n",
"ETHOSCOPE_130 - Fly 15 11.983333 5.033333 6.950000\n",
"ETHOSCOPE_130 - Fly 16 9.280556 3.386111 5.894444\n",
"ETHOSCOPE_130 - Fly 17 15.661111 7.102778 8.558333\n",
"ETHOSCOPE_130 - Fly 18 10.841667 5.033333 5.808333\n",
"ETHOSCOPE_130 - Fly 19 9.988889 4.502778 5.486111\n",
"ETHOSCOPE_130 - Fly 20 10.294444 3.077778 7.216667\n",
"... (Showing first 20 rows)\n",
"\n",
"--- Grand Summary Statistics (Stimulus: 72h to 96h) ---\n",
"Total Flies Analyzed: n = 20\n",
"\n",
"[ OVERALL SLEEP (24h Stimulus Block) ]\n",
"Mean ± SEM: 8.88 ± 0.76 hours\n",
"Median: 8.68 hours\n",
"\n",
"[ DAY TIME (ZT 0-12 during Stimulus) ]\n",
"Mean ± SEM: 3.51 ± 0.39 hours\n",
"Median: 3.23 hours\n",
"\n",
"[ NIGHT TIME (ZT 12-24 during Stimulus) ]\n",
"Mean ± SEM: 5.37 ± 0.44 hours\n",
"Median: 5.68 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).copy()\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": 30,
"id": "4483ebc9-77bb-4624-86a6-01ccc201fb15",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"--- 24h Total Statistical Analysis ---\n",
"Shapiro-Wilk P-value (Normality of differences): 0.5755\n",
"Result: Data is normal. Used Paired T-test.\n",
"P-value: 8.5647e-05\n",
"Significance: ****\n",
"\n",
"--- Daytime Statistical Analysis ---\n",
"Shapiro-Wilk P-value (Normality of differences): 0.8039\n",
"Result: Data is normal. Used Paired T-test.\n",
"P-value: 2.3748e-04\n",
"Significance: ***\n",
"\n",
"--- Nighttime Statistical Analysis ---\n",
"Shapiro-Wilk P-value (Normality of differences): 0.4164\n",
"Result: Data is normal. Used Paired T-test.\n",
"P-value: 1.1008e-05\n",
"Significance: ****\n"
]
}
],
"source": [
"# 1. Merge Baseline and Stimulus data on Fly_Label\n",
"# This ensures comparing the SAME fly to itself\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": 55,
"id": "45dd6526-92ed-4b4b-a924-1a33eda0d28b",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_42207/12866365.py:27: 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+naQAAlDFJREFUeJzs3XlY1OX+PvB7FmZgGIZFdtlFQUDFHZfELffdTMu0TpqWWqlttpysvqnZyTqVlpmlpdnJrCzXTCwy99wXFBBlX4Z1WIZllt8f/JyaAMVhhhngfl3XueLzfLYbT+GbZ55FoNfr9SAiIiIislFCawcgIiIiIrodFqxEREREZNNYsBIRERGRTWPBSkREREQ2jQUrEREREdk0FqxEREREZNNYsBIRERGRTWPBSkREREQ2jQUrEREREdk0sbUD/F1qaio+++wznD9/HklJSQgJCcHu3buNrlGr1fjoo4+wd+9e5Ofnw9vbG5MnT8bcuXMhFtvUt0NEREREZmBTFV5SUhLi4+PRrVs36HQ61Ldr7BtvvIEDBw5g6dKl6NChA86dO4cPPvgAarUaS5YssUJqIiIiIrIkgb6+qtBKdDodhMLaUQrLli3DpUuXjHpYdTodevTogTlz5uDJJ580tL/wwgs4ffo0Dh482OyZiYiIiMiybGoM661itSF6vR4ajQZOTk5G7U5OTvX2xhIRERFRy2dTBeudiEQiTJkyBVu3bsWFCxdQXl6Oo0eP4scff8RDDz1k7XhEREREZAE2NYa1MZYvX47ly5dj2rRphrb58+fjX//6123vGzZsWIPn8vLy0K1bN2zdutVsOYmIiIjIPFpcwfrOO+/gt99+w5tvvomgoCCcO3cO69atg0KhwNy5c016plarRXZ2tpmTEhEREZE5tKiCNTExEZ9//jk+/vhjDB06FADQu3dvaDQavP/++5gxYwbkcnm998bFxTX43Nv1vhIRERGRdbWoMazJyckAgM6dOxu1R0REoLq6Grm5udaIRUREREQW1KIK1vbt2wMALl++bNR+6dIlCAQC+Pr6WiMWEREREVmQTQ0JUKvViI+PBwBkZmairKwM+/fvBwD06dMHUVFRiIqKwvLly1FQUICAgABcuHABGzZswNSpU+Hg4GDN+ERERERkATa1cUBGRkaD40m//PJL9O3bF0qlEu+//z6OHj2KgoICeHt7Y9y4cXjsscdgb29v0ntvvfN241yJiIiIyDpsqmC1FhasRERERLarRY1hJSIiIqK2hwUrEREREdk0FqxEREREZNNYsBIRERGRTWPBSkREREQ2jQUrEREREdk0FqxEREREZNNsaqcrIiIiIqVSCZVKZZV3KxQKeHh43NU9H374IdauXWs4lkgk8PPzw5QpUzBnzhwIhc3bP3jixAnMnj0bO3bsQJcuXQAAYWFheP755zFnzpxmzWIuLFiJiIjIZiiVSsybNw9qtdoq73dwcMCGDRvuumi1t7fHF198AQCorKzEiRMnsGbNGuj1esybN88SUe/KN998A19fX2vHMBkLViIiIrIZKpUKarUas2bNgre3d7O+OycnB1u2bIFKpbrrglUoFCI6OtpwHBMTg8TERBw4cMAmCta/Z2uJWLASERGRzfH29kZgYKC1YzSJo6MjNBqN4fidd95BfHw8MjIyIJfL0bt3byxbtgyenp6Ga06fPo13330XV69ehU6ng5+fHx599FFMnjzZcM1vv/2GdevW4dq1a5DJZBg5ciReeOEFyGSyBrP8c0jArFmzIJPJMHnyZLz33nvIy8tDly5d8OabbyIgIMBwX3V1NdauXYtdu3ZBqVTC398fCxYswPjx4835R3VHLFiJiIiIzOBWcXprSMCBAwcwf/58w/mCggLMnz8fnp6eKCwsxKZNmzBr1izs2bMHYrEYZWVlmD9/Pnr27Il3330XEokEycnJRuN59+/fjyVLlmDKlCl48sknoVQqsWbNGqhUKrz33nt3lTchIQGFhYV49tlnodVq8dZbb+G5557DN998Y7jm6aefxpkzZ7Bw4UJ06NAB8fHxeO6556BQKBAbG9vEP7HGY8FKRERE1EQVFRWIjIw0ahszZozRcIBVq1YZvtZqtejevTsGDRqE48ePY+DAgbhx4wZKS0uxdOlShIWFAQD69etnuEev1+Ptt9/GmDFjsGLFCkO7h4cH5s2bhwULFqBjx46NzlxaWoqdO3fCzc3N8D28+OKLyMnJgbe3N44fP45Dhw7hs88+w8CBAwEAAwYMgFKpxIcfftisBSuXtSIiIiJqInt7e+zYsQM7duzAtm3b8PLLL+Pw4cN45ZVXDNfEx8djxowZ6NmzJyIiIjBo0CAAwM2bNwEAAQEBkMvleO2117B3714UFhYavePGjRvIzMzE6NGjodFoDP/r06cPhEIhLl26dFeZw8PDDcUqAISGhgKoHcsLAEeOHIGLiwtiYmKM3te/f38kJCRAq9Xe9Z+TqdjDSkRERNREQqHQsIQUAPTs2dPwMfu//vUvVFZWYsGCBRg2bBgee+wxtGvXDgKBAPfffz+qqqoAAM7Ozti0aRM++OADPP/889BqtejVqxdeeeUVhIWFoaioCACwcOHCejNkZ2ffVWaFQmF0bGdnBwCGPEVFRSguLq7Tc3yLUqlstolxLFiJiIiILCAkJAQAkJycjKtXr0Iul+O///2vYV3WzMzMOvd07doVGzduNIyDXb16NRYuXIiDBw/CxcUFAPDqq6+ia9eude79++Qtc3B2doabmxs2bNhQ7/m/985aGgtWIiIiIgtISkoCALi6uqKyshJ2dnYQCASG87t27WrwXnt7e8TGxiItLQ0rVqxAVVUVQkJC4O3tjfT0dMycOdPi+fv374+NGzfCzs4O4eHhFn/f7bBgJSIiImoinU6Hc+fOAQBqampw+fJlfPzxxwgNDUWvXr1QXV2NL774Av/3f/+He++9F2fPnsWPP/5o9IzffvsNO3bswPDhw+Hr64v8/Hxs3boVPXr0gFQqBQAsW7YMzz77LCoqKjB48GA4ODggKysL8fHxWLJkCYKDg832PQ0YMABDhgzB3LlzMXfuXISFhUGtViM5ORmpqalGE78sjQUrERER2ZxbE39ayjsrKysxffp0AIBYLIa3tzcmTJiARYsWwc7ODrGxsXj22WexdetWfP/99+jRowc++eQTjBw50vCMgIAACIVC/Pe//0VBQQFcXFwwcOBALF261HDN6NGjoVAosH79ekMPbfv27XHPPffA3d3d5PwN+eCDD7BhwwZ8/fXXyMzMhJOTEzp27IgpU6aY/V23I9Dr9fpmfaMNGjZsGAAgLi7OykmIiIjatpa6NStZFntYiYiIyGZ4eHhgw4YNRovlNyeFQsFi1QaxYCUiIiKb4uHhwaKRjHDjACIiIiKyaSxYiYiIiMimsWAlIiIiIpvGgpWIiIiIbBoLViIiIiKyaSxYiYiIiMimsWAlIiIiIpvGgpWIiIioiX766Sfcd9996NmzJ3r06IHRo0fj5ZdfRkFBgeGazZs3Iz4+vs69Q4cOxRtvvNFsWTMyMhAWFob9+/c32zubihsHEBERkU1RKpUtaqerTz/9FGvWrMEjjzyCp556Cnq9HklJSdi1axfy8vLQrl07AMCXX36JwYMHIzY21uj+tWvXQqFQmO17aI1YsBIREZHNUCqVeOTxR6CqLLHK+xX2zti8fvNdFa1btmzB5MmTsWzZMkNbbGws5s6dC51Od8f7IyIiTMralrBgJSIiIpuhUqmgqixBjye6w6W9a7O+uzizCGc+PguVSnVXBatKpYKnp2e954TC2tGXQ4cORWZmJr766it89dVXAIBVq1ZhypQpGDp0KAYPHoxXX30VALBs2TJcunQJL730ElatWoXU1FR07doVb731FuRyOZYvX47Dhw/Dzc0NS5cuxZgxYwzv++ezAODgwYNYuHAh4uLi4OfnV2/OsLAwPP/885gzZ46hbfPmzVi1ahWuXbsGAKipqcG7776Lffv2IT8/Hy4uLoiKisJ//vMfODk5NfrPyxQsWImIiMjmuLR3hUewu7VjNEpkZCT+97/
"text/plain": [
"<Figure size 700x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 1. PREPARE DATA\n",
"combined = pd.merge(baseline_stats, stim_stats, on='Fly_Label')\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",
"# 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': '#51ff4c'}\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, \n",
" gap=0.2, \n",
" 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",
"# 3. ADD MEDIAN LABELS\n",
"ax = plt.gca()\n",
"medians = plot_df.groupby(['Condition', 'State'], sort=False)['Hours'].median()\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",
"# 4. FORMATTING\n",
"sns.despine()\n",
"plt.ylabel('Average time spent asleep (hours)', fontsize=12)\n",
"plt.xlabel('')\n",
"plt.ylim(0, 18) \n",
"plt.legend(title='', frameon=False)\n",
"plt.tight_layout()\n",
"\n",
"plt.savefig(\"CantonS_Green.png\", dpi=600, bbox_inches='tight')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 53,
"id": "579fdddd-eb38-428c-8f44-fbccd3020ca6",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_42207/1824297848.py:45: 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": "iVBORw0KGgoAAAANSUhEUgAAAqwAAAJHCAYAAABVQQRxAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAmdVJREFUeJzs3XlYVPX+B/D3DMM2wLDIDrKKKCoqiiuK+25ppVZmetO0XNLUyvblZpZdb7fUW5pbWpamZu4bGpm74i4qiCA7yDbsMDPn9wc/5jqxCMMMM8D79Tw9l/M9y7yHO8KHc76LSBAEAURERERERkps6ABERERERLVhwUpERERERo0FKxEREREZNRasRERERGTUWLASERERkVFjwUpERERERo0FKxEREREZNRasDfTCCy/ghRdeMHQMIiIiomZLYugATV1qaqqhIxARERE1a7zDSkRERERGjQUrERERERk1FqxEREREZNRYsBIRERGRUWPBSkRERERGjQUrERERERk1FqxEREREZNRYsBIRERGRUWPBSkRERERGjQUrERERERk1FqxEREREZNRYsBIRERGRUWPBSkRERERGjQUrERERERk1FqxEREREZNRYsBIRERGRUWPBSkRERERGjQUrERERERk1FqxEREREZNRYsBIRERGRUWPBSkRERERGjQUrERERERk1FqxEREREZNRYsBIRERGRUWPBSkRERERGTWLoAI9KSEjA+vXrcfXqVcTExMDPzw/79u1T709KSsLgwYOrPdfMzAzXr1+v8drnzp3Diy++WKV91KhR+OqrrxoenoiIiIj0wqjusMbExCAyMhLe3t7w9/evst/Z2Rnbtm3T+O+XX36BtbU1+vfvX6fXWLZsmcb5CxYs0PG7oMc5d+4clixZUuP+QYMG1Xr+ypUrsWvXrhr3JyUlYcqUKVrno+ZB358zahn484rIOBhVwTpo0CBERkbim2++QYcOHarsNzMzQ5cuXTT+KysrQ0FBAcaMGVOn1wgICNA439vbW9dvg6qRn5+PK1euVGmXy+W4evUqTp8+DaVSWWX/yZMnAQB3795Fenp6lf1xcXFISkqCQqHAmTNnquwvLS3F+fPnG/4GqEnQ9+eMWgb+vCIyPkZVsIrF9Y+zb98+WFtbP/avXDKs5ORkvPXWW/j0009RVFQEADh8+DDGjx+Py5cvY/v27Zg4cSJu374NAEhMTMT06dOxceNGFBYW4u7du5g0aRJ+/vlnCIIAhUKB//73v3j55ZeRlJSEhw8fYvny5Vi0aBGys7MBVNwZGT9+PE6cOGGw902NS9+fM2oZ+POKyPiIBEEQDB2iOkuWLMGNGzc0+rD+XXl5OcLCwjBw4EB8/vnntV6vsg+rg4MDcnNz4eTkhNGjR2P+/PmwsLCo9dya+s0CQGpqKtzc3BAREVH7GyKUlZVhy5Yt2LRpEwoKChAeHo433ngDHh4eAICLFy/iyy+/xM2bN9GmTRvMmzdP43ufnZ2N//znP9i/fz8kEgmeffZZzJo1C1KpFACgUqnw22+/Yc2aNUhPT0e3bt2wZMkStG3b1iDvlwxD358zahn484rIuBjVoKv6+vPPP5Gbm1un7gA2NjaYMWMGQkNDYW5ujrNnz2LDhg2Ii4vDmjVrGiEtiUQiiMViiEQi9Xbl1zVt/92jd+H/vr/y+jVdj1oGfX/OqGXgzysi49Kk77AuWLAAFy5cwJ9//gkTE5N6v8ZPP/2ETz75BL/++iuCg4O1yln5FzXvsNbuzp07WLBgAfr27Yu+ffvi8OHDGDBgAL788ku8+OKLuHbtGuLj47F06VLMnj0bP/zwAz788EMAFYMWIiMj8eWXX+Lll1/Gw4cP4erqiszMTOzatQtLly6Fr68vZs+eDR8fH0ydOhVffvkl5s6di48++ggDBw7Em2++aeDvADUGfX/OevXqZeB3SI2BP6+IjJBgpN566y1h9OjRNe4vKCgQgoODhX/+859av0ZWVpbQtm1b4aefftL6GoMGDRIGDRqk9fkthVwuFy5fviwIgiCcPXtWeOuttwRBEIS8vDzhypUrwl9//SUoFApBEARh4MCB6vMiIyMFQRCEO3fuCGlpaYIgCMI333wj7Ny5UxAEQYiNjRUSExOF8vJy4dSpU4IgCEJiYqLwwgsvCIIgCCUlJcK5c+f0/wbJKOj7c0YtA39eERmfJtsl4OjRoygpKcHYsWMNHYXqwMbGBl26dKnSLpPJ0Llz5xrPq5yurKZ+XY9Of9anT58q+83NzdGjR496pqWmqjE+Z9T88ecVkfFpsl0CZsyYgYSEBBw9elTr19iyZQs+/fRT7NixA506ddLqGuwSQERERKRfRnWHtbi4GJGRkQAqphUpKCjAoUOHAAA9evSAg4MDgIrRl2fOnMHLL79c7XWSk5MxdOhQzJ49G3PnzgUALF68GN7e3ggKClIPutq0aROGDBmidbFKRERERPpnVAVrVlYW5s+fr9FWub1582b07NkTAHDw4EEoFIoauwMIggClUolHbx4HBARg79692LBhA8rLy+Hh4YFXXnkFM2fO1NO7ISIiIiJdMNouAU0FuwQQERER6ZdRrXRFRERERPR3LFiJiIiIyKgZVR9WMm6CIKC4uNjQMRqVpaUlV5/RM36uSB/4uSJqXliwUp0IgoBx48bh4sWLho7SqEJDQ/Hbb7/xl4Ce8HPFz5U+8HPFzxU1P+wSQHVSXFzc4n74A8CFCxda3F2axsTPFekDP1dEzQ/vsFK9Xb16FVKp1NAx9KqoqKjWFW1I9/i5In3g54qoeWDBSvUmlUqb/S8Aanz8XJE+8HNF1DywSwARERERGTUWrERERERk1FiwEhEREZFRY8FKREREREaNBSsRERERGTUWrERERERk1FiwEhEREZFRY8FKREREREaNBSsRERERGTWudEV1YmlpidDQUPXXzV1Le7+G0tK+zy3t/RpKS/s+t7T3Sy2TSBAEwdAhmrLBgwcDACIiIgycRP8qPyoikcjASRpHS3u/htLSvs8t7f0aSkv7Pre090stD++wUp21tB+ELe39GkpL+z63tPdrKC3t+9zS3i+1POzDSkRERERGjQUrERERERk1FqxEREREZNRYsBIRERGRUWPBSkRERERGjQUrERERERk1FqxEREREZNRYsBIRERGRUWPBSkRERERGjQUrERERERk1FqxEREREZNRYsBIRERGRUWPBSkRERERGjQUrERERERk1FqxEREREZNRYsBIRERGRUWPBSkRERERGjQUrERERERk1FqxEREREZNRYsBIRERGRUWPBSkRERERGjQUrERERERk1FqxEj6FQKKBSqQwdg4iIqMWSGDoAkbEqLS3Fnj17EB0dDVNTU/Tu3RsDBgwwdCwiIqIWh3dYiWpw9OhR3Lx5EyqVCqWlpfjjjz9w69YtQ8ciIiJqcXiHlZq1zMxMFBUVaXXuuXPnkJ+fDwAwNTWFlZUV7t69i6CgIF1GJCIiosdgwUrNVn5+Pt555x0IgqDV+Xfv3kVBQQEAQCQSYdiwYbCzs9NhQiIiIqoLFqzUbNnY2OCzzz6r9Q5ramoq1q1bhxkzZsDNzU1jX2JiInbv3g2FQgFTU1O4uLggNDRU37GJiIjob1iwUrPm5ORUp+Pc3Nzg7e2t0ebt7Y2OHTsiOjoa5ubm6NChA8zNzfURk4iIiGrBgpWoFnZ2dujdu7ehYxAREbVonCWAiIiIiIwaC1YiIiIiMmosWImIiIjIqLFgJSIiIiKjxoKViIiIiIwaC1YiIiIiMmosWImIiIjIqLFgJSIiIiKjxoKViIiIiIwaC1YiIiIiMmpGtTRrQkIC1q9fj6tXryImJgZ+fn7Yt2+fxjFTpkzB+fPnq5x74MAB+Pv713r99PR0fPrpp/jrr79gamqKoUOH4u2334a1tbVO3wcRERER6Y5RFawxMTGIjIxE586doVKpIAhCtceFhITgrbfe0mjz9PSs9drl5eWYMWMGAGDFihUoKSnBF198gUWLFmHNmjW6eQNEREREpHNGVbAOGjQIQ4YMAQAsWbIEN27cqPY4mUyGLl2
"text/plain": [
"<Figure size 700x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 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",
" # Use Paired T-Test if normal, Wilcoxon if not\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",
"# Melt the data for plotting\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",
"# 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': '#51ff4c'}\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",
"# 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",
"# 4. ADD SIGNIFICANCE BRACKETS\n",
"y_max = plot_df['Hours'].max()\n",
"y_line = y_max + 1.0 # Float the bracket 1 hour above the highest data point\n",
"h = 0.4 # Height of the bracket's downward ticks\n",
"\n",
"for i, cond in enumerate(order):\n",
" p = p_values[cond]\n",
" \n",
" # Determine the correct asterisk\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",
" # Bracket coordinates (Centers of the Baseline and Stimulus boxes)\n",
" x1, x2 = i - 0.2, i + 0.2\n",
" \n",
" # Draw the bracket line\n",
" plt.plot([x1, x1, x2, x2], [y_line, y_line+h, y_line+h, y_line], lw=1.5, c='k')\n",
" \n",
" # Place the text above the bracket\n",
" plt.text((x1+x2)*.5, y_line+h, star, ha='center', va='bottom', fontsize=12)\n",
"\n",
"# 5. FORMATTING\n",
"sns.despine()\n",
"plt.ylabel('Average time spent asleep (hours)', fontsize=12)\n",
"plt.xlabel('')\n",
"\n",
"plt.xlim(-0.6, 2.5) \n",
"\n",
"plt.legend(title='', frameon=False)\n",
"plt.tight_layout()\n",
"plt.ylim(0, max(18, y_line + h + 1.5))\n",
"\n",
"plt.legend(title='', frameon=False, loc='center left', bbox_to_anchor=(1, 0.5))\n",
"plt.tight_layout()\n",
"\n",
"plt.savefig(\"CantonS_Green.png\", dpi=600, bbox_inches='tight')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "3cc80754-211a-4020-904a-85f00a2ccfc7",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"--- Delta Sleep (Stimulus - Baseline) per Fly ---\n",
" Fly_Label Delta_24h Delta_Day Delta_Night\n",
"ETHOSCOPE_130 - Fly 01 -4.698148 -1.022981 -4.294444\n",
"ETHOSCOPE_130 - Fly 02 -8.853704 -1.936450 -7.458333\n",
"ETHOSCOPE_130 - Fly 03 -5.669444 -2.432787 -4.006481\n",
"ETHOSCOPE_130 - Fly 04 -6.782407 -4.508932 -3.067593\n",
"ETHOSCOPE_130 - Fly 05 -3.684259 -1.586263 -2.918519\n",
"ETHOSCOPE_130 - Fly 06 -4.603704 -2.163640 -3.142593\n",
"ETHOSCOPE_130 - Fly 07 -5.757407 -2.861012 -3.713889\n",
"ETHOSCOPE_130 - Fly 08 -9.345370 -4.335732 -5.690741\n",
"ETHOSCOPE_130 - Fly 09 -9.221296 -3.651625 -6.420370\n",
"ETHOSCOPE_130 - Fly 10 -6.031481 -3.995023 -2.764815\n",
"ETHOSCOPE_130 - Fly 11 -2.400926 -2.332318 -0.696296\n",
"ETHOSCOPE_130 - Fly 12 -0.500926 0.064048 -1.250000\n",
"ETHOSCOPE_130 - Fly 13 -1.065741 -1.056971 -0.970370\n",
"ETHOSCOPE_130 - Fly 14 1.658333 -0.019769 0.919444\n",
"ETHOSCOPE_130 - Fly 15 0.122222 0.348358 -0.883333\n",
"ETHOSCOPE_130 - Fly 16 -3.432407 -1.457392 -2.653704\n",
"ETHOSCOPE_130 - Fly 17 1.625926 1.842548 -0.953704\n",
"ETHOSCOPE_130 - Fly 18 -1.691667 0.025883 -2.420370\n",
"ETHOSCOPE_130 - Fly 19 -2.383333 -1.277552 -1.915741\n",
"ETHOSCOPE_130 - Fly 20 -1.791667 -1.456680 -0.970370\n",
"\n",
"==================================================\n",
"\n",
"--- Average Change (Delta) across all flies ---\n",
"Delta_24h: -3.73 ± 0.75 hours\n",
"Delta_Day: -1.69 ± 0.37 hours\n",
"Delta_Night: -2.76 ± 0.47 hours\n"
]
}
],
"source": [
"# 1. Ensure have the merged paired data\n",
"combined = pd.merge(baseline_stats, stim_stats, on='Fly_Label')\n",
"\n",
"# 2. Calculate the Delta (Stimulus - Baseline) for each fly\n",
"combined['Delta_24h'] = combined['Stim_Sleep_24h'] - combined['Base_Sleep_24h']\n",
"combined['Delta_Day'] = combined['Stim_Day_12h'] - combined['Base_Day_12h']\n",
"combined['Delta_Night'] = combined['Stim_Night_12h'] - combined['Base_Night_12h']\n",
"\n",
"# 3. Print the Delta for each individual fly\n",
"print(\"--- Delta Sleep (Stimulus - Baseline) per Fly ---\")\n",
"delta_table = combined[['Fly_Label', 'Delta_24h', 'Delta_Day', 'Delta_Night']]\n",
"print(delta_table.to_string(index=False))\n",
"print(\"\\n\" + \"=\"*50 + \"\\n\")\n",
"\n",
"# 4. Calculate and print the group averages\n",
"print(\"--- Average Change (Delta) across all flies ---\")\n",
"avg_delta = delta_table[['Delta_24h', 'Delta_Day', 'Delta_Night']].mean()\n",
"sem_delta = delta_table[['Delta_24h', 'Delta_Day', 'Delta_Night']].sem()\n",
"\n",
"for metric in ['Delta_24h', 'Delta_Day', 'Delta_Night']:\n",
" print(f\"{metric}: {avg_delta[metric]:.2f} ± {sem_delta[metric]:.2f} hours\")"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "4515719c-4438-462c-a989-f2cff18003d4",
"metadata": {},
"outputs": [],
"source": [
"#export to csv\n",
"delta_table['Condition'] = 'Green'\n",
"delta_table.to_csv('delta_green.csv', index=False)"
]
}
],
"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
}