Optogenetics-Sleep-Deprivation/11.60D05-GAL4_ChRmine_Red.ipynb

928 lines
377 KiB
Text
Raw Normal View History

{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"id": "ae9b8ff2-033e-4e48-926a-62c43535bba4",
"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": 3,
"id": "6cbb4f52-dd5f-4888-9c9e-ba4f1f6dc429",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'2.1.0'"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"etho.__version__"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "dc5c910a-b8ac-4574-87f6-3df51839a50e",
"metadata": {},
"outputs": [],
"source": [
"meta = '/home/rdingjin/UASxGal4_2026-05-05/metadata_phase6_60D(1.5).csv' \n",
"local = '/mnt/ethoscope_results'"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "78e2a925-62ab-4c2c-bd11-e27e1b6789f5",
"metadata": {},
"outputs": [],
"source": [
"metadata = etho.link_meta_index(meta, local)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "65d71cd5-21c5-4cc0-a19b-7de730b45a65",
"metadata": {},
"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": [
"data = etho.load_ethoscope(metadata, reference_hour = 9.0, FUN = etho.sleep_annotation)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "a2c12f1d-3ca9-469b-9447-7d117f320006",
"metadata": {},
"outputs": [],
"source": [
"df = etho.behavpy(data, metadata, check = True)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "e256c265-07b7-4d90-96ed-44d2aa76f14d",
"metadata": {},
"outputs": [],
"source": [
"df.to_pickle('/home/rdingjin/UASxGal4_2026-05-05/phase6.5.pkl')"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "1ee0efda-db87-4de1-8ee0-dea02fd3348f",
"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/UASxGal4_2026-05-05/phase6.5.pkl')"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "b3073dcc-7801-45dc-a24a-3e2e91006bdf",
"metadata": {},
"outputs": [],
"source": [
"df = df.baseline(column = 'baseline')"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "124a805c-1cf8-44d0-b114-71329cb0ede5",
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
" ==== METADATA ====\n",
"\n",
" date machine_name region_id \\\n",
"id \n",
"2026-05-06_12-33-12_13005e|01 2026-05-06 ETHOSCOPE_130 1 \n",
"2026-05-06_12-33-12_13005e|02 2026-05-06 ETHOSCOPE_130 2 \n",
"2026-05-06_12-33-12_13005e|03 2026-05-06 ETHOSCOPE_130 3 \n",
"2026-05-06_12-33-12_13005e|04 2026-05-06 ETHOSCOPE_130 4 \n",
"2026-05-06_12-33-12_13005e|05 2026-05-06 ETHOSCOPE_130 5 \n",
"2026-05-06_12-33-12_13005e|06 2026-05-06 ETHOSCOPE_130 6 \n",
"2026-05-06_12-33-12_13005e|07 2026-05-06 ETHOSCOPE_130 7 \n",
"2026-05-06_12-33-12_13005e|08 2026-05-06 ETHOSCOPE_130 8 \n",
"2026-05-06_12-33-12_13005e|09 2026-05-06 ETHOSCOPE_130 9 \n",
"2026-05-06_12-33-12_13005e|10 2026-05-06 ETHOSCOPE_130 10 \n",
"2026-05-06_12-33-12_13005e|11 2026-05-06 ETHOSCOPE_130 11 \n",
"2026-05-06_12-33-12_13005e|12 2026-05-06 ETHOSCOPE_130 12 \n",
"2026-05-06_12-33-12_13005e|13 2026-05-06 ETHOSCOPE_130 13 \n",
"2026-05-06_12-33-12_13005e|14 2026-05-06 ETHOSCOPE_130 14 \n",
"2026-05-06_12-33-12_13005e|15 2026-05-06 ETHOSCOPE_130 15 \n",
"2026-05-06_12-33-12_13005e|16 2026-05-06 ETHOSCOPE_130 16 \n",
"2026-05-06_12-33-12_13005e|17 2026-05-06 ETHOSCOPE_130 17 \n",
"2026-05-06_12-33-12_13005e|18 2026-05-06 ETHOSCOPE_130 18 \n",
"2026-05-06_12-33-12_13005e|19 2026-05-06 ETHOSCOPE_130 19 \n",
"2026-05-06_12-33-12_13005e|20 2026-05-06 ETHOSCOPE_130 20 \n",
"\n",
" sleep_deprived species \\\n",
"id \n",
"2026-05-06_12-33-12_13005e|01 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"2026-05-06_12-33-12_13005e|02 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"2026-05-06_12-33-12_13005e|03 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"2026-05-06_12-33-12_13005e|04 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"2026-05-06_12-33-12_13005e|05 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"2026-05-06_12-33-12_13005e|06 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"2026-05-06_12-33-12_13005e|07 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"2026-05-06_12-33-12_13005e|08 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"2026-05-06_12-33-12_13005e|09 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"2026-05-06_12-33-12_13005e|10 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"2026-05-06_12-33-12_13005e|11 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"2026-05-06_12-33-12_13005e|12 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"2026-05-06_12-33-12_13005e|13 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"2026-05-06_12-33-12_13005e|14 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"2026-05-06_12-33-12_13005e|15 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"2026-05-06_12-33-12_13005e|16 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"2026-05-06_12-33-12_13005e|17 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"2026-05-06_12-33-12_13005e|18 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"2026-05-06_12-33-12_13005e|19 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"2026-05-06_12-33-12_13005e|20 True UAS_ChRmine_attP5 x 60D05_Gal4 \n",
"\n",
" food baseline sex time \n",
"id \n",
"2026-05-06_12-33-12_13005e|01 normal_food 0 male 12-33-12 \n",
"2026-05-06_12-33-12_13005e|02 normal_food 0 male 12-33-12 \n",
"2026-05-06_12-33-12_13005e|03 normal_food 0 male 12-33-12 \n",
"2026-05-06_12-33-12_13005e|04 normal_food 0 male 12-33-12 \n",
"2026-05-06_12-33-12_13005e|05 normal_food 0 male 12-33-12 \n",
"2026-05-06_12-33-12_13005e|06 normal_food 0 male 12-33-12 \n",
"2026-05-06_12-33-12_13005e|07 normal_food 0 male 12-33-12 \n",
"2026-05-06_12-33-12_13005e|08 normal_food 0 male 12-33-12 \n",
"2026-05-06_12-33-12_13005e|09 normal_food 0 male 12-33-12 \n",
"2026-05-06_12-33-12_13005e|10 normal_food 0 male 12-33-12 \n",
"2026-05-06_12-33-12_13005e|11 normal_food 0 male 12-33-12 \n",
"2026-05-06_12-33-12_13005e|12 normal_food 0 male 12-33-12 \n",
"2026-05-06_12-33-12_13005e|13 normal_food 0 male 12-33-12 \n",
"2026-05-06_12-33-12_13005e|14 normal_food 0 male 12-33-12 \n",
"2026-05-06_12-33-12_13005e|15 normal_food 0 male 12-33-12 \n",
"2026-05-06_12-33-12_13005e|16 normal_food 0 male 12-33-12 \n",
"2026-05-06_12-33-12_13005e|17 normal_food 0 male 12-33-12 \n",
"2026-05-06_12-33-12_13005e|18 normal_food 0 male 12-33-12 \n",
"2026-05-06_12-33-12_13005e|19 normal_food 0 male 12-33-12 \n",
"2026-05-06_12-33-12_13005e|20 normal_food 0 male 12-33-12 \n",
" ====== DATA ======\n",
"\n",
" t x y w \\\n",
"id \n",
"2026-05-06_12-33-12_13005e|01 12790 278.000000 48.500000 29.666667 \n",
"2026-05-06_12-33-12_13005e|01 12800 47.695652 55.434783 18.956522 \n",
"2026-05-06_12-33-12_13005e|01 12810 9.142857 56.714286 9.476190 \n",
"2026-05-06_12-33-12_13005e|01 12820 52.040000 47.640000 36.040000 \n",
"2026-05-06_12-33-12_13005e|01 12830 173.782609 42.826087 33.913043 \n",
"... ... ... ... ... \n",
"2026-05-06_12-33-12_13005e|20 381150 237.352941 30.764706 29.941176 \n",
"2026-05-06_12-33-12_13005e|20 381160 246.190476 31.380952 29.857143 \n",
"2026-05-06_12-33-12_13005e|20 381170 419.318182 25.772727 28.636364 \n",
"2026-05-06_12-33-12_13005e|20 381180 514.478261 22.478261 26.956522 \n",
"2026-05-06_12-33-12_13005e|20 381190 347.000000 28.888889 29.555556 \n",
"\n",
" h phi max_velocity \\\n",
"id \n",
"2026-05-06_12-33-12_13005e|01 14.833333 29.833333 205.531667 \n",
"2026-05-06_12-33-12_13005e|01 11.086957 96.608696 32.053743 \n",
"2026-05-06_12-33-12_13005e|01 6.095238 142.142857 21.080395 \n",
"2026-05-06_12-33-12_13005e|01 6.200000 118.280000 143.178809 \n",
"2026-05-06_12-33-12_13005e|01 16.739130 77.434783 116.380105 \n",
"... ... ... ... \n",
"2026-05-06_12-33-12_13005e|20 11.294118 72.647059 1.636360 \n",
"2026-05-06_12-33-12_13005e|20 11.428571 43.333333 7.376982 \n",
"2026-05-06_12-33-12_13005e|20 10.590909 49.227273 19.993036 \n",
"2026-05-06_12-33-12_13005e|20 9.304348 22.086957 15.201231 \n",
"2026-05-06_12-33-12_13005e|20 11.555556 36.777778 23.816544 \n",
"\n",
" mean_velocity dist has_interacted \\\n",
"id \n",
"2026-05-06_12-33-12_13005e|01 47.979875 0.863638 0.0 \n",
"2026-05-06_12-33-12_13005e|01 19.209750 1.325473 0.0 \n",
"2026-05-06_12-33-12_13005e|01 7.528680 0.474307 0.0 \n",
"2026-05-06_12-33-12_13005e|01 43.262358 3.244677 0.0 \n",
"2026-05-06_12-33-12_13005e|01 25.457482 1.756566 0.0 \n",
"... ... ... ... \n",
"2026-05-06_12-33-12_13005e|20 0.957856 0.048851 0.0 \n",
"2026-05-06_12-33-12_13005e|20 1.726868 0.108793 0.0 \n",
"2026-05-06_12-33-12_13005e|20 10.336256 0.682193 0.0 \n",
"2026-05-06_12-33-12_13005e|20 10.050184 0.693463 0.0 \n",
"2026-05-06_12-33-12_13005e|20 13.449352 0.363133 0.0 \n",
"\n",
" beam_cross moving micro walk \\\n",
"id \n",
"2026-05-06_12-33-12_13005e|01 0.0 True False True \n",
"2026-05-06_12-33-12_13005e|01 0.0 True False True \n",
"2026-05-06_12-33-12_13005e|01 0.0 True False True \n",
"2026-05-06_12-33-12_13005e|01 0.0 True False True \n",
"2026-05-06_12-33-12_13005e|01 0.0 True False True \n",
"... ... ... ... ... \n",
"2026-05-06_12-33-12_13005e|20 0.0 True True False \n",
"2026-05-06_12-33-12_13005e|20 0.0 True False True \n",
"2026-05-06_12-33-12_13005e|20 0.0 True False True \n",
"2026-05-06_12-33-12_13005e|20 0.0 True False True \n",
"2026-05-06_12-33-12_13005e|20 0.0 True False True \n",
"\n",
" is_interpolated asleep \n",
"id \n",
"2026-05-06_12-33-12_13005e|01 False False \n",
"2026-05-06_12-33-12_13005e|01 False False \n",
"2026-05-06_12-33-12_13005e|01 False False \n",
"2026-05-06_12-33-12_13005e|01 False False \n",
"2026-05-06_12-33-12_13005e|01 False False \n",
"... ... ... \n",
"2026-05-06_12-33-12_13005e|20 False False \n",
"2026-05-06_12-33-12_13005e|20 False False \n",
"2026-05-06_12-33-12_13005e|20 False False \n",
"2026-05-06_12-33-12_13005e|20 False False \n",
"2026-05-06_12-33-12_13005e|20 False False \n",
"\n",
"[736658 rows x 16 columns]\n"
]
}
],
"source": [
"df.display()"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "de0b9beb-7861-4091-b443-1913e4aa04b8",
"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 900x200 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"start_hour = 0\n",
"end_hour = 120\n",
"fig = df.t_filter(start_time=start_hour, end_time=end_hour).heatmap(variable = 'asleep')\n",
"fig.show()"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "57702793-afd1-4824-b360-50f41cd2161e",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Task was destroyed but it is pending!\n",
"task: <Task pending name='Task-357' coro=<_async_in_context.<locals>.run_in_context() done, defined at /srv/venv/lib/python3.12/site-packages/ipykernel/utils.py:57> wait_for=<Task pending name='Task-358' coro=<Kernel.shell_main() running at /srv/venv/lib/python3.12/site-packages/ipykernel/kernelbase.py:597> cb=[Task.task_wakeup()]> cb=[ZMQStream._run_callback.<locals>._log_error() at /srv/venv/lib/python3.12/site-packages/zmq/eventloop/zmqstream.py:563]>\n",
"/srv/venv/lib/python3.12/site-packages/matplotlib/colors.py:221: RuntimeWarning: coroutine 'Kernel.shell_main' was never awaited\n",
" return isinstance(c, str) and _nth_color_re.match(c)\n",
"Task was destroyed but it is pending!\n",
"task: <Task pending name='Task-358' coro=<Kernel.shell_main() running at /srv/venv/lib/python3.12/site-packages/ipykernel/kernelbase.py:597> cb=[Task.task_wakeup()]>\n",
"Task was destroyed but it is pending!\n",
"task: <Task pending name='Task-428' coro=<_async_in_context.<locals>.run_in_context() done, defined at /srv/venv/lib/python3.12/site-packages/ipykernel/utils.py:57> wait_for=<Task pending name='Task-429' coro=<Kernel.shell_main() running at /srv/venv/lib/python3.12/site-packages/ipykernel/kernelbase.py:597> cb=[Task.task_wakeup()]> cb=[ZMQStream._run_callback.<locals>._log_error() at /srv/venv/lib/python3.12/site-packages/zmq/eventloop/zmqstream.py:563]>\n",
"Task was destroyed but it is pending!\n",
"task: <Task pending name='Task-429' coro=<Kernel.shell_main() running at /srv/venv/lib/python3.12/site-packages/ipykernel/kernelbase.py:597> cb=[Task.task_wakeup()]>\n",
"Task was destroyed but it is pending!\n",
"task: <Task pending name='Task-446' coro=<_async_in_context.<locals>.run_in_context() done, defined at /srv/venv/lib/python3.12/site-packages/ipykernel/utils.py:57> wait_for=<Task pending name='Task-447' coro=<Kernel.shell_main() running at /srv/venv/lib/python3.12/site-packages/ipykernel/kernelbase.py:597> cb=[Task.task_wakeup()]> cb=[ZMQStream._run_callback.<locals>._log_error() at /srv/venv/lib/python3.12/site-packages/zmq/eventloop/zmqstream.py:563]>\n",
"Task was destroyed but it is pending!\n",
"task: <Task pending name='Task-447' coro=<Kernel.shell_main() running at /srv/venv/lib/python3.12/site-packages/ipykernel/kernelbase.py:597> cb=[Task.task_wakeup()]>\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1200x475 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.t_filter(start_time=start_hour, end_time=end_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",
"# 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(\"Figure_6(11H)_1.png\", dpi=600, bbox_inches='tight')"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "f64dea93-8b25-462e-9e75-e47a3703f5e9",
"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 12.987037 5.466313 8.060185\n",
"ETHOSCOPE_130 - Fly 02 12.596296 3.925349 9.058333\n",
"ETHOSCOPE_130 - Fly 03 15.678704 6.970294 9.396296\n",
"ETHOSCOPE_130 - Fly 04 13.529630 5.893673 8.217593\n",
"ETHOSCOPE_130 - Fly 05 12.645370 5.422139 7.758333\n",
"ETHOSCOPE_130 - Fly 06 12.453704 4.972177 7.972222\n",
"ETHOSCOPE_130 - Fly 07 14.175000 5.282754 9.414815\n",
"ETHOSCOPE_130 - Fly 08 13.436111 5.295205 8.663889\n",
"ETHOSCOPE_130 - Fly 09 11.844444 5.215649 7.143519\n",
"ETHOSCOPE_130 - Fly 10 12.092593 4.393802 8.132407\n",
"ETHOSCOPE_130 - Fly 11 11.253704 4.912828 6.826852\n",
"ETHOSCOPE_130 - Fly 12 8.652778 4.488440 4.608333\n",
"ETHOSCOPE_130 - Fly 13 9.696296 3.550381 6.496296\n",
"ETHOSCOPE_130 - Fly 14 7.824074 3.367520 4.788889\n",
"ETHOSCOPE_130 - Fly 15 8.329630 3.111720 5.525000\n",
"ETHOSCOPE_130 - Fly 16 8.271296 4.223269 4.464815\n",
"ETHOSCOPE_130 - Fly 17 14.373148 6.240945 8.749074\n",
"ETHOSCOPE_130 - Fly 18 10.652778 3.946557 7.097222\n",
"ETHOSCOPE_130 - Fly 19 10.646296 4.459550 6.626852\n",
"ETHOSCOPE_130 - Fly 20 9.196296 4.010616 5.581481\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: 11.52 ± 0.51 hours\n",
"Median: 11.97 hours\n",
"\n",
"[ DAY TIME (ZT 0-12, Averaged to 12h blocks) ]\n",
"Mean ± SEM: 4.76 ± 0.22 hours\n",
"Median: 4.70 hours\n",
"\n",
"[ NIGHT TIME (ZT 12-24, Averaged to 12h blocks) ]\n",
"Mean ± SEM: 7.23 ± 0.35 hours\n",
"Median: 7.45 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",
"# (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": 27,
"id": "a89a9da0-2db2-4006-a9f0-0addb71ecac5",
"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 10.952778 2.461111 8.491667\n",
"ETHOSCOPE_130 - Fly 02 13.900000 4.361111 9.538889\n",
"ETHOSCOPE_130 - Fly 03 15.730556 6.113889 9.616667\n",
"ETHOSCOPE_130 - Fly 04 10.544444 3.269444 7.275000\n",
"ETHOSCOPE_130 - Fly 05 10.272222 3.363889 6.908333\n",
"ETHOSCOPE_130 - Fly 06 6.900000 1.163889 5.736111\n",
"ETHOSCOPE_130 - Fly 07 8.602778 3.177778 5.425000\n",
"ETHOSCOPE_130 - Fly 08 13.261111 4.894444 8.366667\n",
"ETHOSCOPE_130 - Fly 09 13.138889 4.861111 8.277778\n",
"ETHOSCOPE_130 - Fly 10 5.208333 1.405556 3.802778\n",
"ETHOSCOPE_130 - Fly 11 13.113889 5.294444 7.819444\n",
"ETHOSCOPE_130 - Fly 12 5.347222 1.197222 4.150000\n",
"ETHOSCOPE_130 - Fly 13 10.583333 2.397222 8.186111\n",
"ETHOSCOPE_130 - Fly 14 4.550000 0.463889 4.086111\n",
"ETHOSCOPE_130 - Fly 15 7.011111 1.947222 5.063889\n",
"ETHOSCOPE_130 - Fly 16 6.752778 3.908333 2.844444\n",
"ETHOSCOPE_130 - Fly 17 15.963889 6.947222 9.016667\n",
"ETHOSCOPE_130 - Fly 18 8.294444 0.827778 7.466667\n",
"ETHOSCOPE_130 - Fly 19 8.438889 3.330556 5.108333\n",
"ETHOSCOPE_130 - Fly 20 8.188889 2.391667 5.797222\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: 9.84 ± 0.78 hours\n",
"Median: 9.44 hours\n",
"\n",
"[ DAY TIME (ZT 0-12 during Stimulus) ]\n",
"Mean ± SEM: 3.19 ± 0.41 hours\n",
"Median: 3.22 hours\n",
"\n",
"[ NIGHT TIME (ZT 12-24 during Stimulus) ]\n",
"Mean ± SEM: 6.65 ± 0.46 hours\n",
"Median: 7.09 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": 28,
"id": "9be717e4-a077-468d-aafc-21479f1beac1",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"--- 24h Total Statistical Analysis ---\n",
"Shapiro-Wilk P-value (Normality of differences): 0.3626\n",
"Result: Data is normal. Used Paired T-test.\n",
"P-value: 7.3393e-03\n",
"Significance: **\n",
"\n",
"--- Daytime Statistical Analysis ---\n",
"Shapiro-Wilk P-value (Normality of differences): 0.3140\n",
"Result: Data is normal. Used Paired T-test.\n",
"P-value: 6.7606e-05\n",
"Significance: ****\n",
"\n",
"--- Nighttime Statistical Analysis ---\n",
"Shapiro-Wilk P-value (Normality of differences): 0.0515\n",
"Result: Data is normal. Used Paired T-test.\n",
"P-value: 1.1296e-01\n",
"Significance: ns\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": 44,
"id": "aa050760-cebb-436c-aa8b-888f951d6b5f",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"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",
"# 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}, 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",
" palette=['black', '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 remain exactly as provided\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 \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",
"# 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",
"\n",
"plt.ylim(0, max(20, y_line + h + 1.5)) \n",
"\n",
"# Legend moved completely outside the plot to the right\n",
"plt.legend(title='', frameon=False, loc='center left', bbox_to_anchor=(1, 0.5))\n",
"plt.tight_layout()\n",
"\n",
"plt.savefig(\"Phase6(60D)_Baseline_vs_Stimulus.png\", dpi=600, bbox_inches='tight')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "3d0190d5-7aad-4235-88cb-3705da502383",
"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 -2.034259 -3.005202 0.431481\n",
"ETHOSCOPE_130 - Fly 02 1.303704 0.435762 0.480556\n",
"ETHOSCOPE_130 - Fly 03 0.051852 -0.856405 0.220370\n",
"ETHOSCOPE_130 - Fly 04 -2.985185 -2.624229 -0.942593\n",
"ETHOSCOPE_130 - Fly 05 -2.373148 -2.058250 -0.850000\n",
"ETHOSCOPE_130 - Fly 06 -5.553704 -3.808288 -2.236111\n",
"ETHOSCOPE_130 - Fly 07 -5.572222 -2.104976 -3.989815\n",
"ETHOSCOPE_130 - Fly 08 -0.175000 -0.400761 -0.297222\n",
"ETHOSCOPE_130 - Fly 09 1.294444 -0.354538 1.134259\n",
"ETHOSCOPE_130 - Fly 10 -6.884259 -2.988246 -4.329630\n",
"ETHOSCOPE_130 - Fly 11 1.860185 0.381617 0.992593\n",
"ETHOSCOPE_130 - Fly 12 -3.305556 -3.291218 -0.458333\n",
"ETHOSCOPE_130 - Fly 13 0.887037 -1.153159 1.689815\n",
"ETHOSCOPE_130 - Fly 14 -3.274074 -2.903631 -0.702778\n",
"ETHOSCOPE_130 - Fly 15 -1.318519 -1.164498 -0.461111\n",
"ETHOSCOPE_130 - Fly 16 -1.518519 -0.314935 -1.620370\n",
"ETHOSCOPE_130 - Fly 17 1.590741 0.706277 0.267593\n",
"ETHOSCOPE_130 - Fly 18 -2.358333 -3.118779 0.369444\n",
"ETHOSCOPE_130 - Fly 19 -2.207407 -1.128994 -1.518519\n",
"ETHOSCOPE_130 - Fly 20 -1.007407 -1.618949 0.215741\n",
"\n",
"==================================================\n",
"\n",
"--- Average Change (Delta) across all flies ---\n",
"Delta_24h: -1.68 ± 0.56 hours\n",
"Delta_Day: -1.57 ± 0.31 hours\n",
"Delta_Night: -0.58 ± 0.35 hours\n"
]
}
],
"source": [
"#DELTA\n",
"\n",
"# 1. Ensure we 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": 45,
"id": "c2f2caff-7071-4a8b-afa4-fecc065c588e",
"metadata": {},
"outputs": [],
"source": [
"#export to csv\n",
"delta_table['Condition'] = 'Red'\n",
"delta_table.to_csv('delta_60D_phase6.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
}