{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "8180413b-33aa-4136-9aea-6a7c7251a020",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The autoreload extension is already loaded. To reload it, use:\n",
      "  %reload_ext autoreload\n"
     ]
    }
   ],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "%matplotlib inline\n",
    "\n",
    "import sys\n",
    "sys.path.append('../waves')\n",
    "from IPython.display import display\n",
    "from dbfread import DBF, FieldParser\n",
    "import matplotlib.pyplot as plt\n",
    "from utils_functions import *\n",
    "from build_df_functions import *\n",
    "from dbfread import DBF\n",
    "from dbfread.field_parser import FieldParser\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "import scipy.stats as stats\n",
    "from scipy.stats import wilcoxon\n",
    "from scipy.stats import t\n",
    "from scipy.stats import shapiro\n",
    "from collections import defaultdict\n",
    "import re\n",
    "from sklearn.cluster import KMeans\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "import statsmodels.formula.api as smf\n",
    "import statsmodels.api as sm\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.datasets import make_classification\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import classification_report\n",
    "from sklearn.linear_model import Ridge\n",
    "from pandas.api.types import (is_numeric_dtype, is_categorical_dtype, is_object_dtype, is_integer_dtype, is_float_dtype)\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.ticker import MaxNLocator\n",
    "from pandas.api.types import is_numeric_dtype, is_bool_dtype\n",
    "import scipy.stats as sts\n",
    "\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore') \n",
    "from statsmodels.stats.multitest import multipletests\n",
    "\n",
    "pd.options.mode.chained_assignment = None  # default='warn'\n",
    "\n",
    "\n",
    "def fmt_small_conditional(x):\n",
    "    if isinstance(x, (float, int)) and x != 0 and abs(x) < 1e-3:\n",
    "        return f\"{x:.2e}\"\n",
    "    elif isinstance(x, (float, int)):\n",
    "        return f\"{x:.3f}\"\n",
    "    else:\n",
    "        return x\n",
    "    \n",
    "fmt_small   = '{:.2f}'\n",
    "fmt_integer = '{:.0f}'\n",
    "fmt_boolean = lambda x: 'True' if x else 'False'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "2371c501-a335-4baa-bef2-2d3e4026d421",
   "metadata": {},
   "outputs": [],
   "source": [
    "feature_df = pd.read_csv('./data/FERTILI_features.csv', sep='\\t')\n",
    "#feature_df = feature_df.rename(columns={'Avg_Peak-to-Peak_Distance': 'avg_peak_peak_distance', 'Intra-monthly_Variability': 'monthly_Variability', 'Sawtooth Up_r2': 'Sawtooth_up_r2', 'Sawtooth Up_period': 'Sawtooth_up_period', 'Sawtooth Up_phase': 'Sawtooth_up_phase'})\n",
    "feature_df.columns = feature_df.columns.str.replace('-', '_').str.replace(' ', '_')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "1d9edaa8-f33e-49ee-b3a0-eb2ef92fb164",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Add age group\n",
    "feature_df              = add_age_group(feature_df, age_bins=[18, 35, 42])\n",
    "category_mapping        = {'18-35': 1, '35-42': 2}\n",
    "feature_df['Age_Group'] = feature_df['Age_Group'].replace(category_mapping)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a4d78692-0971-4e85-b5ca-391240d8cb05",
   "metadata": {
    "tags": []
   },
   "source": [
    "#### Some stats"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "ef768f01-e0d1-4be1-a1bd-5cdadbd09c79",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "num of cycles 6175\n",
      "num of participants 857\n"
     ]
    }
   ],
   "source": [
    "print('num of cycles', len(feature_df))\n",
    "print('num of participants', len(feature_df.CODICE.unique()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "2fd611d5-ad52-44c5-9e1f-a3617806603e",
   "metadata": {},
   "outputs": [],
   "source": [
    "features = feature_df.columns.drop(['CODICE', 'QUALIFI'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "b32f902a-8043-4909-975c-8e55059de35f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7.20536756126021"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "count_cycles = feature_df.groupby(\"CODICE\")[\"Age_at_Menses\"].count()\n",
    "count_cycles.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "f346a0e1-c08c-41c4-afa8-a0fce983f79e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Median = 4 cycles (IQR 2–9)\n",
      "Mean   = 7.2 ± 7.9 cycles\n",
      "Range  = 1–63 cycles\n"
     ]
    }
   ],
   "source": [
    "\n",
    "med   = count_cycles.median()\n",
    "q25   = count_cycles.quantile(0.25)\n",
    "q75   = count_cycles.quantile(0.75)\n",
    "mean  = count_cycles.mean()\n",
    "sd    = count_cycles.std()\n",
    "rng   = (count_cycles.min(), count_cycles.max())\n",
    "mad   = sts.median_abs_deviation(count_cycles)\n",
    "\n",
    "print(f\"Median = {med:.0f} cycles (IQR {q25:.0f}–{q75:.0f})\")\n",
    "print(f\"Mean   = {mean:.1f} ± {sd:.1f} cycles\")\n",
    "print(f\"Range  = {rng[0]}–{rng[1]} cycles\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "f888cec3-37dc-45da-8fbb-fd7f1be89398",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saved: violin_metrics_raw_points.png\n",
      "Saved: violin_metrics_standardized_points.png\n"
     ]
    }
   ],
   "source": [
    "\n",
    "\n",
    "\n",
    "plt.rcParams.update({\n",
    "    'font.size': 15,          # default font size\n",
    "    'font.weight': 'bold',    # make all text bold\n",
    "    'axes.titleweight': 'bold',\n",
    "    'axes.labelweight': 'bold'})\n",
    "\n",
    "#  helpers \n",
    "def zscore(series):\n",
    "    s = pd.to_numeric(series, errors='coerce').astype(float)\n",
    "    mu = np.nanmean(s)\n",
    "    sd = np.nanstd(s, ddof=0)\n",
    "    return (s - mu) / sd if sd and not np.isnan(sd) else s * np.nan\n",
    "\n",
    "def violin_with_points(ax, values, title=None, ylab=None, max_points=5000):\n",
    "    # Force to float to avoid boolean dtype issues inside numpy.percentile\n",
    "    v = pd.to_numeric(pd.Series(values), errors='coerce').astype(float).dropna().values\n",
    "    if v.size == 0:\n",
    "        ax.set_title(title or \"\", fontsize=9)\n",
    "        ax.set_xticks([])\n",
    "        ax.set_ylabel(ylab or \"\")\n",
    "        ax.grid(True, axis='y', alpha=0.2)\n",
    "        return\n",
    "\n",
    "    # If all values are identical, violinplot can still draw; it’ll degenerate to a line.\n",
    "    ax.violinplot([v], showmeans=False, showmedians=True, showextrema=False)\n",
    "\n",
    "    # Jittered raw points (cap to keep files small)\n",
    "    n_plot = min(len(v), max_points)\n",
    "    vv = v[np.random.choice(len(v), size=n_plot, replace=False)] if len(v) > n_plot else v\n",
    "    x = np.random.normal(loc=1.0, scale=0.03, size=len(vv))\n",
    "    ax.plot(x, vv, 'o', markersize=2, alpha=0.5)\n",
    "\n",
    "    ax.set_xticks([])\n",
    "    ax.set_ylabel(ylab or \"\")\n",
    "    ax.set_title(title or \"\", fontsize=9)\n",
    "    ax.yaxis.set_major_locator(MaxNLocator(nbins=6))\n",
    "    ax.grid(True, axis='y', alpha=0.2)\n",
    "\n",
    "def make_violin_grid(df, features, zscore_flag=False, filename=\"violin_metrics.png\", n_cols=5):\n",
    "    # Keep numeric columns; drop booleans explicitly (they’re “numeric” but cause issues)\n",
    "    numeric_feats = []\n",
    "    for f in features:\n",
    "        if f in df.columns and is_numeric_dtype(df[f]) and not is_bool_dtype(df[f]):\n",
    "            numeric_feats.append(f)\n",
    "    if not numeric_feats:\n",
    "        raise ValueError(\"No numeric (non-boolean) metrics available to plot.\")\n",
    "\n",
    "    # Prepare data (z-score if requested)\n",
    "    data = df.copy()\n",
    "    if zscore_flag:\n",
    "        for f in numeric_feats:\n",
    "            data[f] = zscore(data[f])\n",
    "\n",
    "    n = len(numeric_feats)\n",
    "    n_rows = int(np.ceil(n / n_cols))\n",
    "    fig, axes = plt.subplots(n_rows, n_cols, figsize=(3.2*n_cols, 2.8*n_rows), squeeze=False)\n",
    "    axes = axes.flatten()\n",
    "\n",
    "    last_i = -1\n",
    "    for i, feat in enumerate(numeric_feats):\n",
    "        last_i = i\n",
    "        ax = axes[i]\n",
    "        vals = pd.to_numeric(data[feat], errors='coerce').astype(float)  # <- cast to float here too\n",
    "        violin_with_points(ax, vals, title=feat + (\" (z)\" if zscore_flag else \"\"), \n",
    "                           ylab=\"Z-score\" if zscore_flag else \"Raw\")\n",
    "\n",
    "    # Remove any extra axes\n",
    "    for j in range(last_i + 1, len(axes)):\n",
    "        fig.delaxes(axes[j])\n",
    "\n",
    "    fig.tight_layout()\n",
    "    fig.savefig(filename, dpi=300, bbox_inches=\"tight\")\n",
    "    plt.close(fig)\n",
    "    print(f\"Saved: {filename}\")\n",
    "\n",
    "# ---------- run (two figures as requested) ----------\n",
    "\n",
    "make_violin_grid(feature_df, features_to_test_reduced, zscore_flag=False, filename=\"violin_metrics_raw_points.png\")\n",
    "make_violin_grid(feature_df, features_to_test_reduced, zscore_flag=True,  filename=\"violin_metrics_standardized_points.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8389bbec-5268-4d4a-9354-136b46de31c1",
   "metadata": {
    "tags": []
   },
   "source": [
    "#### Removal of pregnancies cycles"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "91143cbc-d85c-49f6-9f7c-4c1f858506f4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "num of cycles 5674\n",
      "num of participants 753\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Age_Group\n",
       "1    4654\n",
       "2    1020\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_non_conceptive_subset = feature_df.loc[~feature_df['conceptive']]\n",
    "\n",
    "print('num of cycles', len(df_non_conceptive_subset))\n",
    "print('num of participants', len(df_non_conceptive_subset.CODICE.unique()))\n",
    "\n",
    "df_non_conceptive_subset.Age_Group.value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "da1b03f2-baf3-423e-9dc4-b1e8149a8f21",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true,
    "tags": []
   },
   "source": [
    "#### Age group comparison"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "8dce8461-9032-478b-a4e9-fa140bfedf5d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['Mean_Temperature', 'Standard_Deviation', 'Skewness', 'Kurtosis',\n",
       "       'Average_Slope', 'Period', 'Amplitude', 'Avg_Peak_to_Peak_Distance',\n",
       "       'M5', 'L5', 'Relative_Amplitude', 'Intra_monthly_Variability',\n",
       "       'Cosine_r2', 'Square_r2', 'Zigzag_r2', 'Sawtooth_Up_r2', 'Half_Sine_r2',\n",
       "       'Gaussian_r2', 'dur_fol', 'num_T_vals_fol', 'mean_fol', 'std_fol',\n",
       "       'amp_raw_fol', 'amp_smooth_fol', 'smoothness_fol', 'dur_lut',\n",
       "       'num_T_vals_lut', 'mean_lut', 'std_lut', 'amp_raw_lut',\n",
       "       'amp_smooth_lut', 'smoothness_lut', 'acrophase_day', 'nadir_day',\n",
       "       'acrophase_angle_lut', 'nadir_angle_fol', 'slope_m_to_nadir',\n",
       "       'slope_nadir_to_acrophase', 'slope_acrophase_to_m'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "features_to_test = features[~features.str.contains('_phase|_period')]\n",
    "features_to_test = features_to_test.drop(['Age_at_Menses', 'Age_Group', 'conceptive', 'fertile_intercourse'])\n",
    "features_to_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "5bac8c6e-5821-460a-b018-f911eec8c215",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df_non_conceptive_subset['Age_at_Menses'].hist(bins=30)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "5c1d775c-284d-4b8b-ac84-b1c5262466d3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr:last-of-type th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th colspan=\"2\" halign=\"left\">Mean_Temperature</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Standard_Deviation</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Skewness</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Kurtosis</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Average_Slope</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Period</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Amplitude</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Avg_Peak_to_Peak_Distance</th>\n",
       "      <th colspan=\"2\" halign=\"left\">M5</th>\n",
       "      <th colspan=\"2\" halign=\"left\">L5</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Relative_Amplitude</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Intra_monthly_Variability</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Cosine_r2</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Cosine_period</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Cosine_phase</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Square_r2</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Square_period</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Square_phase</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Zigzag_r2</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Zigzag_period</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Zigzag_phase</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Sawtooth_Up_r2</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Sawtooth_Up_period</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Sawtooth_Up_phase</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Half_Sine_r2</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Half_Sine_period</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Half_Sine_phase</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Gaussian_r2</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Gaussian_period</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Gaussian_phase</th>\n",
       "      <th colspan=\"2\" halign=\"left\">dur_fol</th>\n",
       "      <th colspan=\"2\" halign=\"left\">num_T_vals_fol</th>\n",
       "      <th colspan=\"2\" halign=\"left\">mean_fol</th>\n",
       "      <th colspan=\"2\" halign=\"left\">std_fol</th>\n",
       "      <th colspan=\"2\" halign=\"left\">amp_raw_fol</th>\n",
       "      <th colspan=\"2\" halign=\"left\">amp_smooth_fol</th>\n",
       "      <th colspan=\"2\" halign=\"left\">smoothness_fol</th>\n",
       "      <th colspan=\"2\" halign=\"left\">dur_lut</th>\n",
       "      <th colspan=\"2\" halign=\"left\">num_T_vals_lut</th>\n",
       "      <th colspan=\"2\" halign=\"left\">mean_lut</th>\n",
       "      <th colspan=\"2\" halign=\"left\">std_lut</th>\n",
       "      <th colspan=\"2\" halign=\"left\">amp_raw_lut</th>\n",
       "      <th colspan=\"2\" halign=\"left\">amp_smooth_lut</th>\n",
       "      <th colspan=\"2\" halign=\"left\">smoothness_lut</th>\n",
       "      <th colspan=\"2\" halign=\"left\">acrophase_day</th>\n",
       "      <th colspan=\"2\" halign=\"left\">nadir_day</th>\n",
       "      <th colspan=\"2\" halign=\"left\">acrophase_angle_lut</th>\n",
       "      <th colspan=\"2\" halign=\"left\">nadir_angle_fol</th>\n",
       "      <th colspan=\"2\" halign=\"left\">slope_m_to_nadir</th>\n",
       "      <th colspan=\"2\" halign=\"left\">slope_nadir_to_acrophase</th>\n",
       "      <th colspan=\"2\" halign=\"left\">slope_acrophase_to_m</th>\n",
       "      <th colspan=\"2\" halign=\"left\">CODICE</th>\n",
       "      <th colspan=\"2\" halign=\"left\">Age_at_Menses</th>\n",
       "      <th colspan=\"2\" halign=\"left\">QUALIFI</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Age_Group</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>36.693</td>\n",
       "      <td>0.173</td>\n",
       "      <td>0.197</td>\n",
       "      <td>0.048</td>\n",
       "      <td>0.19</td>\n",
       "      <td>0.498</td>\n",
       "      <td>-0.868</td>\n",
       "      <td>0.615</td>\n",
       "      <td>0.074</td>\n",
       "      <td>0.023</td>\n",
       "      <td>25.989</td>\n",
       "      <td>3.446</td>\n",
       "      <td>0.523</td>\n",
       "      <td>0.147</td>\n",
       "      <td>4.330</td>\n",
       "      <td>1.455</td>\n",
       "      <td>36.947</td>\n",
       "      <td>0.182</td>\n",
       "      <td>36.458</td>\n",
       "      <td>0.185</td>\n",
       "      <td>0.007</td>\n",
       "      <td>0.002</td>\n",
       "      <td>0.666</td>\n",
       "      <td>0.419</td>\n",
       "      <td>0.670</td>\n",
       "      <td>0.195</td>\n",
       "      <td>28.934</td>\n",
       "      <td>5.238</td>\n",
       "      <td>12.892</td>\n",
       "      <td>9.214</td>\n",
       "      <td>0.679</td>\n",
       "      <td>0.167</td>\n",
       "      <td>25.722</td>\n",
       "      <td>4.232</td>\n",
       "      <td>10.321</td>\n",
       "      <td>8.645</td>\n",
       "      <td>0.651</td>\n",
       "      <td>0.190</td>\n",
       "      <td>28.318</td>\n",
       "      <td>4.503</td>\n",
       "      <td>14.87</td>\n",
       "      <td>8.370</td>\n",
       "      <td>0.644</td>\n",
       "      <td>0.149</td>\n",
       "      <td>31.244</td>\n",
       "      <td>5.216</td>\n",
       "      <td>17.767</td>\n",
       "      <td>8.568</td>\n",
       "      <td>0.714</td>\n",
       "      <td>0.175</td>\n",
       "      <td>29.602</td>\n",
       "      <td>5.029</td>\n",
       "      <td>13.746</td>\n",
       "      <td>8.729</td>\n",
       "      <td>0.637</td>\n",
       "      <td>0.16</td>\n",
       "      <td>32.772</td>\n",
       "      <td>4.269</td>\n",
       "      <td>16.682</td>\n",
       "      <td>11.650</td>\n",
       "      <td>16.205</td>\n",
       "      <td>3.282</td>\n",
       "      <td>11.884</td>\n",
       "      <td>4.010</td>\n",
       "      <td>36.559</td>\n",
       "      <td>0.177</td>\n",
       "      <td>0.124</td>\n",
       "      <td>0.056</td>\n",
       "      <td>0.398</td>\n",
       "      <td>0.203</td>\n",
       "      <td>0.249</td>\n",
       "      <td>0.146</td>\n",
       "      <td>0.114</td>\n",
       "      <td>0.054</td>\n",
       "      <td>9.766</td>\n",
       "      <td>3.510</td>\n",
       "      <td>9.381</td>\n",
       "      <td>3.416</td>\n",
       "      <td>36.862</td>\n",
       "      <td>0.174</td>\n",
       "      <td>0.132</td>\n",
       "      <td>0.057</td>\n",
       "      <td>0.393</td>\n",
       "      <td>0.195</td>\n",
       "      <td>0.346</td>\n",
       "      <td>0.148</td>\n",
       "      <td>0.106</td>\n",
       "      <td>0.053</td>\n",
       "      <td>23.474</td>\n",
       "      <td>3.608</td>\n",
       "      <td>17.679</td>\n",
       "      <td>3.671</td>\n",
       "      <td>138.737</td>\n",
       "      <td>39.167</td>\n",
       "      <td>196.996</td>\n",
       "      <td>19.560</td>\n",
       "      <td>0.002</td>\n",
       "      <td>0.017</td>\n",
       "      <td>0.06</td>\n",
       "      <td>0.039</td>\n",
       "      <td>-0.029</td>\n",
       "      <td>0.030</td>\n",
       "      <td>3.173348e+07</td>\n",
       "      <td>2.330931e+07</td>\n",
       "      <td>29.080</td>\n",
       "      <td>3.018</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>36.748</td>\n",
       "      <td>0.166</td>\n",
       "      <td>0.191</td>\n",
       "      <td>0.046</td>\n",
       "      <td>0.14</td>\n",
       "      <td>0.513</td>\n",
       "      <td>-0.910</td>\n",
       "      <td>0.578</td>\n",
       "      <td>0.070</td>\n",
       "      <td>0.022</td>\n",
       "      <td>24.697</td>\n",
       "      <td>3.716</td>\n",
       "      <td>0.504</td>\n",
       "      <td>0.140</td>\n",
       "      <td>4.259</td>\n",
       "      <td>1.443</td>\n",
       "      <td>36.986</td>\n",
       "      <td>0.174</td>\n",
       "      <td>36.521</td>\n",
       "      <td>0.172</td>\n",
       "      <td>0.006</td>\n",
       "      <td>0.002</td>\n",
       "      <td>0.609</td>\n",
       "      <td>0.365</td>\n",
       "      <td>0.709</td>\n",
       "      <td>0.166</td>\n",
       "      <td>27.999</td>\n",
       "      <td>5.151</td>\n",
       "      <td>12.043</td>\n",
       "      <td>8.765</td>\n",
       "      <td>0.717</td>\n",
       "      <td>0.149</td>\n",
       "      <td>24.905</td>\n",
       "      <td>3.614</td>\n",
       "      <td>9.208</td>\n",
       "      <td>7.554</td>\n",
       "      <td>0.685</td>\n",
       "      <td>0.163</td>\n",
       "      <td>27.671</td>\n",
       "      <td>4.330</td>\n",
       "      <td>14.18</td>\n",
       "      <td>8.142</td>\n",
       "      <td>0.681</td>\n",
       "      <td>0.135</td>\n",
       "      <td>31.479</td>\n",
       "      <td>5.226</td>\n",
       "      <td>18.303</td>\n",
       "      <td>8.639</td>\n",
       "      <td>0.747</td>\n",
       "      <td>0.150</td>\n",
       "      <td>29.238</td>\n",
       "      <td>5.102</td>\n",
       "      <td>13.319</td>\n",
       "      <td>9.230</td>\n",
       "      <td>0.667</td>\n",
       "      <td>0.15</td>\n",
       "      <td>32.783</td>\n",
       "      <td>4.285</td>\n",
       "      <td>15.340</td>\n",
       "      <td>11.391</td>\n",
       "      <td>15.171</td>\n",
       "      <td>2.970</td>\n",
       "      <td>11.238</td>\n",
       "      <td>3.616</td>\n",
       "      <td>36.614</td>\n",
       "      <td>0.172</td>\n",
       "      <td>0.117</td>\n",
       "      <td>0.055</td>\n",
       "      <td>0.374</td>\n",
       "      <td>0.195</td>\n",
       "      <td>0.233</td>\n",
       "      <td>0.146</td>\n",
       "      <td>0.107</td>\n",
       "      <td>0.053</td>\n",
       "      <td>9.552</td>\n",
       "      <td>3.682</td>\n",
       "      <td>9.305</td>\n",
       "      <td>3.619</td>\n",
       "      <td>36.911</td>\n",
       "      <td>0.162</td>\n",
       "      <td>0.122</td>\n",
       "      <td>0.057</td>\n",
       "      <td>0.356</td>\n",
       "      <td>0.191</td>\n",
       "      <td>0.321</td>\n",
       "      <td>0.145</td>\n",
       "      <td>0.100</td>\n",
       "      <td>0.052</td>\n",
       "      <td>21.989</td>\n",
       "      <td>3.472</td>\n",
       "      <td>16.686</td>\n",
       "      <td>3.441</td>\n",
       "      <td>134.160</td>\n",
       "      <td>40.444</td>\n",
       "      <td>198.751</td>\n",
       "      <td>23.938</td>\n",
       "      <td>0.004</td>\n",
       "      <td>0.019</td>\n",
       "      <td>0.06</td>\n",
       "      <td>0.040</td>\n",
       "      <td>-0.026</td>\n",
       "      <td>0.027</td>\n",
       "      <td>3.639942e+07</td>\n",
       "      <td>2.220592e+07</td>\n",
       "      <td>36.982</td>\n",
       "      <td>1.438</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          Mean_Temperature        Standard_Deviation        Skewness        Kurtosis        Average_Slope         Period        Amplitude        Avg_Peak_to_Peak_Distance             M5             L5        Relative_Amplitude        Intra_monthly_Variability        Cosine_r2        Cosine_period        Cosine_phase        Square_r2        Square_period        Square_phase        Zigzag_r2        Zigzag_period        Zigzag_phase        Sawtooth_Up_r2        Sawtooth_Up_period        Sawtooth_Up_phase        Half_Sine_r2        Half_Sine_period        Half_Sine_phase        Gaussian_r2       Gaussian_period        Gaussian_phase         dur_fol        num_T_vals_fol        mean_fol        std_fol        amp_raw_fol        amp_smooth_fol        smoothness_fol        dur_lut        num_T_vals_lut        mean_lut        std_lut        amp_raw_lut        amp_smooth_lut        smoothness_lut        acrophase_day        nadir_day        acrophase_angle_lut         nadir_angle_fol         slope_m_to_nadir        slope_nadir_to_acrophase        slope_acrophase_to_m               CODICE               Age_at_Menses        QUALIFI     \n",
       "                      mean    std               mean    std     mean    std     mean    std          mean    std    mean    std      mean    std                      mean    std    mean    std    mean    std               mean    std                      mean    std      mean    std          mean    std         mean    std      mean    std          mean    std         mean    std      mean    std          mean    std         mean    std           mean    std               mean    std              mean    std         mean    std             mean    std            mean    std        mean   std            mean    std           mean     std    mean    std           mean    std     mean    std    mean    std        mean    std           mean    std           mean    std    mean    std           mean    std     mean    std    mean    std        mean    std           mean    std           mean    std          mean    std      mean    std                mean     std            mean     std             mean    std                     mean    std                 mean    std          mean           std          mean    std    mean  std\n",
       "Age_Group                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             \n",
       "1                   36.693  0.173              0.197  0.048     0.19  0.498   -0.868  0.615         0.074  0.023  25.989  3.446     0.523  0.147                     4.330  1.455  36.947  0.182  36.458  0.185              0.007  0.002                     0.666  0.419     0.670  0.195        28.934  5.238       12.892  9.214     0.679  0.167        25.722  4.232       10.321  8.645     0.651  0.190        28.318  4.503        14.87  8.370          0.644  0.149             31.244  5.216            17.767  8.568        0.714  0.175           29.602  5.029          13.746  8.729       0.637  0.16          32.772  4.269         16.682  11.650  16.205  3.282         11.884  4.010   36.559  0.177   0.124  0.056       0.398  0.203          0.249  0.146          0.114  0.054   9.766  3.510          9.381  3.416   36.862  0.174   0.132  0.057       0.393  0.195          0.346  0.148          0.106  0.053        23.474  3.608    17.679  3.671             138.737  39.167         196.996  19.560            0.002  0.017                     0.06  0.039               -0.029  0.030  3.173348e+07  2.330931e+07        29.080  3.018     1.0  0.0\n",
       "2                   36.748  0.166              0.191  0.046     0.14  0.513   -0.910  0.578         0.070  0.022  24.697  3.716     0.504  0.140                     4.259  1.443  36.986  0.174  36.521  0.172              0.006  0.002                     0.609  0.365     0.709  0.166        27.999  5.151       12.043  8.765     0.717  0.149        24.905  3.614        9.208  7.554     0.685  0.163        27.671  4.330        14.18  8.142          0.681  0.135             31.479  5.226            18.303  8.639        0.747  0.150           29.238  5.102          13.319  9.230       0.667  0.15          32.783  4.285         15.340  11.391  15.171  2.970         11.238  3.616   36.614  0.172   0.117  0.055       0.374  0.195          0.233  0.146          0.107  0.053   9.552  3.682          9.305  3.619   36.911  0.162   0.122  0.057       0.356  0.191          0.321  0.145          0.100  0.052        21.989  3.472    16.686  3.441             134.160  40.444         198.751  23.938            0.004  0.019                     0.06  0.040               -0.026  0.027  3.639942e+07  2.220592e+07        36.982  1.438     1.0  0.0"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.set_option('display.max_columns', None)  # Show all columns\n",
    "pd.set_option('display.expand_frame_repr', False)  # Prevent column wrapping\n",
    "\n",
    "summary_stats = df_non_conceptive_subset.groupby(\"Age_Group\").describe().round(3)\n",
    "summary_stats = summary_stats.loc[:, (slice(None), ['mean', 'std'])]\n",
    "summary_stats"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "4342aa39-6107-4ba8-ab98-f346fb1a37d1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "bonferroni threshold value 0.0013\n",
      "number of comparisons:  39\n"
     ]
    }
   ],
   "source": [
    "from scipy.stats import chi2_contingency\n",
    "p_values = {}\n",
    "# Loop through each feature\n",
    "for feature in features:\n",
    "    if is_categorical_dtype(df_non_conceptive_subset[feature]):\n",
    "        df_non_conceptive_subset[feature] = df_non_conceptive_subset[feature].astype(\"category\")\n",
    "        ct = pd.crosstab(feature_df[\"Age_Group\"], feature_df[feature])\n",
    "\n",
    "        # 3) Run Chi‐square test of association\n",
    "        chi2, p_value, dof, expected = chi2_contingency(ct)\n",
    "        test_used     = \"Chi2\"\n",
    "\n",
    "    else:\n",
    "        \n",
    "        groups = [group.dropna().values for _, group in df_non_conceptive_subset.groupby(\"Age_Group\")[feature]]\n",
    "        # Test for normality (Shapiro-Wilk test on the first group as an approximation)\n",
    "        stat, p_normality = stats.shapiro(groups[0]) if len(groups[0]) >= 3 else (None, 1.0)\n",
    "        if p_normality > 0.05:  \n",
    "            stat, p_value = stats.f_oneway(*groups)\n",
    "            test_used     = \"ANOVA\"\n",
    "        else:\n",
    "            stat, p_value = stats.kruskal(*groups)\n",
    "            test_used     = \"Kruskal-Wallis\"\n",
    "    \n",
    "    p_values[feature] = {\"Test\": test_used, \"p-value\": p_value}\n",
    "\n",
    "# Convert to DataFrame\n",
    "p_values_df = pd.DataFrame(p_values).T\n",
    "\n",
    "#Positive result ?\n",
    "alpha=0.05\n",
    "#p_values_df['positive_test'] = p_values_df['p-value']<alpha \n",
    "p_values_df['positive_test_bonferroni'] = p_values_df['p-value']<alpha/len(features_to_test)\n",
    "\n",
    "print('bonferroni threshold value', round(alpha/len(features_to_test),4))\n",
    "print('number of comparisons: ', len(features_to_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "fc6b2431-b65c-4b51-bf64-8f35fe6bcbdc",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Correctly flatten your summary_stats DataFrame:\n",
    "summary_stats_flat = summary_stats.stack(level=0).reset_index()\n",
    "\n",
    "# Assign the correct column names:\n",
    "summary_stats_flat.columns = ['Age_Group', 'Feature', 'mean', 'std']\n",
    "\n",
    "# Now pivot clearly to reshape your DataFrame:\n",
    "summary_pivot = summary_stats_flat.pivot_table(\n",
    "    index='Feature',\n",
    "    columns='Age_Group',\n",
    "    values=['mean', 'std'])\n",
    "\n",
    "# Flatten MultiIndex columns clearly:\n",
    "summary_pivot.columns = [f'{stat}_AgeGroup_{age}' for stat, age in summary_pivot.columns]\n",
    "\n",
    "# Merge clearly with p_values_df:\n",
    "final_summary = summary_pivot.join(p_values_df.drop(['Test'], axis=1))\n",
    "\n",
    "# Order by p-value clearly:\n",
    "final_summary = final_summary.sort_values(by='p-value')\n",
    "\n",
    "# Remove rows clearly based on strings in the index:\n",
    "final_summary = final_summary[~final_summary.index.str.contains('_phase|_period')]\n",
    "\n",
    "# Order columns for clarity:\n",
    "cols_order = ['p-value', 'positive_test_bonferroni'] + \\\n",
    "             [col for col in final_summary.columns if col not in ['p-value', 'positive_test_bonferroni']]\n",
    "final_summary = final_summary[cols_order]\n",
    "\n",
    "final_summary = final_summary.drop(['Age_at_Menses', 'CODICE', 'QUALIFI'], axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "b20242ba-b1e7-41bc-9628-b37283ca4d3f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style type=\"text/css\">\n",
       "</style>\n",
       "<table id=\"T_5588f\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th class=\"blank level0\" >&nbsp;</th>\n",
       "      <th id=\"T_5588f_level0_col0\" class=\"col_heading level0 col0\" >p-value</th>\n",
       "      <th id=\"T_5588f_level0_col1\" class=\"col_heading level0 col1\" >positive_test_bonferroni</th>\n",
       "      <th id=\"T_5588f_level0_col2\" class=\"col_heading level0 col2\" >mean_AgeGroup_1</th>\n",
       "      <th id=\"T_5588f_level0_col3\" class=\"col_heading level0 col3\" >mean_AgeGroup_2</th>\n",
       "      <th id=\"T_5588f_level0_col4\" class=\"col_heading level0 col4\" >std_AgeGroup_1</th>\n",
       "      <th id=\"T_5588f_level0_col5\" class=\"col_heading level0 col5\" >std_AgeGroup_2</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th class=\"index_name level0\" >Feature</th>\n",
       "      <th class=\"blank col0\" >&nbsp;</th>\n",
       "      <th class=\"blank col1\" >&nbsp;</th>\n",
       "      <th class=\"blank col2\" >&nbsp;</th>\n",
       "      <th class=\"blank col3\" >&nbsp;</th>\n",
       "      <th class=\"blank col4\" >&nbsp;</th>\n",
       "      <th class=\"blank col5\" >&nbsp;</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row0\" class=\"row_heading level0 row0\" >Period</th>\n",
       "      <td id=\"T_5588f_row0_col0\" class=\"data row0 col0\" >7.17e-31</td>\n",
       "      <td id=\"T_5588f_row0_col1\" class=\"data row0 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row0_col2\" class=\"data row0 col2\" >25.99</td>\n",
       "      <td id=\"T_5588f_row0_col3\" class=\"data row0 col3\" >24.70</td>\n",
       "      <td id=\"T_5588f_row0_col4\" class=\"data row0 col4\" >3.45</td>\n",
       "      <td id=\"T_5588f_row0_col5\" class=\"data row0 col5\" >3.72</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row1\" class=\"row_heading level0 row1\" >acrophase_day</th>\n",
       "      <td id=\"T_5588f_row1_col0\" class=\"data row1 col0\" >3.73e-29</td>\n",
       "      <td id=\"T_5588f_row1_col1\" class=\"data row1 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row1_col2\" class=\"data row1 col2\" >23.47</td>\n",
       "      <td id=\"T_5588f_row1_col3\" class=\"data row1 col3\" >21.99</td>\n",
       "      <td id=\"T_5588f_row1_col4\" class=\"data row1 col4\" >3.61</td>\n",
       "      <td id=\"T_5588f_row1_col5\" class=\"data row1 col5\" >3.47</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row2\" class=\"row_heading level0 row2\" >dur_fol</th>\n",
       "      <td id=\"T_5588f_row2_col0\" class=\"data row2 col0\" >3.32e-20</td>\n",
       "      <td id=\"T_5588f_row2_col1\" class=\"data row2 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row2_col2\" class=\"data row2 col2\" >16.20</td>\n",
       "      <td id=\"T_5588f_row2_col3\" class=\"data row2 col3\" >15.17</td>\n",
       "      <td id=\"T_5588f_row2_col4\" class=\"data row2 col4\" >3.28</td>\n",
       "      <td id=\"T_5588f_row2_col5\" class=\"data row2 col5\" >2.97</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row3\" class=\"row_heading level0 row3\" >Mean_Temperature</th>\n",
       "      <td id=\"T_5588f_row3_col0\" class=\"data row3 col0\" >6.94e-20</td>\n",
       "      <td id=\"T_5588f_row3_col1\" class=\"data row3 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row3_col2\" class=\"data row3 col2\" >36.69</td>\n",
       "      <td id=\"T_5588f_row3_col3\" class=\"data row3 col3\" >36.75</td>\n",
       "      <td id=\"T_5588f_row3_col4\" class=\"data row3 col4\" >0.17</td>\n",
       "      <td id=\"T_5588f_row3_col5\" class=\"data row3 col5\" >0.17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row4\" class=\"row_heading level0 row4\" >L5</th>\n",
       "      <td id=\"T_5588f_row4_col0\" class=\"data row4 col0\" >1.90e-19</td>\n",
       "      <td id=\"T_5588f_row4_col1\" class=\"data row4 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row4_col2\" class=\"data row4 col2\" >36.46</td>\n",
       "      <td id=\"T_5588f_row4_col3\" class=\"data row4 col3\" >36.52</td>\n",
       "      <td id=\"T_5588f_row4_col4\" class=\"data row4 col4\" >0.18</td>\n",
       "      <td id=\"T_5588f_row4_col5\" class=\"data row4 col5\" >0.17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row5\" class=\"row_heading level0 row5\" >mean_lut</th>\n",
       "      <td id=\"T_5588f_row5_col0\" class=\"data row5 col0\" >3.07e-16</td>\n",
       "      <td id=\"T_5588f_row5_col1\" class=\"data row5 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row5_col2\" class=\"data row5 col2\" >36.86</td>\n",
       "      <td id=\"T_5588f_row5_col3\" class=\"data row5 col3\" >36.91</td>\n",
       "      <td id=\"T_5588f_row5_col4\" class=\"data row5 col4\" >0.17</td>\n",
       "      <td id=\"T_5588f_row5_col5\" class=\"data row5 col5\" >0.16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row6\" class=\"row_heading level0 row6\" >nadir_day</th>\n",
       "      <td id=\"T_5588f_row6_col0\" class=\"data row6 col0\" >3.44e-16</td>\n",
       "      <td id=\"T_5588f_row6_col1\" class=\"data row6 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row6_col2\" class=\"data row6 col2\" >17.68</td>\n",
       "      <td id=\"T_5588f_row6_col3\" class=\"data row6 col3\" >16.69</td>\n",
       "      <td id=\"T_5588f_row6_col4\" class=\"data row6 col4\" >3.67</td>\n",
       "      <td id=\"T_5588f_row6_col5\" class=\"data row6 col5\" >3.44</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row7\" class=\"row_heading level0 row7\" >mean_fol</th>\n",
       "      <td id=\"T_5588f_row7_col0\" class=\"data row7 col0\" >1.49e-15</td>\n",
       "      <td id=\"T_5588f_row7_col1\" class=\"data row7 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row7_col2\" class=\"data row7 col2\" >36.56</td>\n",
       "      <td id=\"T_5588f_row7_col3\" class=\"data row7 col3\" >36.61</td>\n",
       "      <td id=\"T_5588f_row7_col4\" class=\"data row7 col4\" >0.18</td>\n",
       "      <td id=\"T_5588f_row7_col5\" class=\"data row7 col5\" >0.17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row8\" class=\"row_heading level0 row8\" >Sawtooth_Up_r2</th>\n",
       "      <td id=\"T_5588f_row8_col0\" class=\"data row8 col0\" >6.87e-14</td>\n",
       "      <td id=\"T_5588f_row8_col1\" class=\"data row8 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row8_col2\" class=\"data row8 col2\" >0.64</td>\n",
       "      <td id=\"T_5588f_row8_col3\" class=\"data row8 col3\" >0.68</td>\n",
       "      <td id=\"T_5588f_row8_col4\" class=\"data row8 col4\" >0.15</td>\n",
       "      <td id=\"T_5588f_row8_col5\" class=\"data row8 col5\" >0.14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row9\" class=\"row_heading level0 row9\" >Square_r2</th>\n",
       "      <td id=\"T_5588f_row9_col0\" class=\"data row9 col0\" >1.46e-12</td>\n",
       "      <td id=\"T_5588f_row9_col1\" class=\"data row9 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row9_col2\" class=\"data row9 col2\" >0.68</td>\n",
       "      <td id=\"T_5588f_row9_col3\" class=\"data row9 col3\" >0.72</td>\n",
       "      <td id=\"T_5588f_row9_col4\" class=\"data row9 col4\" >0.17</td>\n",
       "      <td id=\"T_5588f_row9_col5\" class=\"data row9 col5\" >0.15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row10\" class=\"row_heading level0 row10\" >M5</th>\n",
       "      <td id=\"T_5588f_row10_col0\" class=\"data row10 col0\" >8.45e-11</td>\n",
       "      <td id=\"T_5588f_row10_col1\" class=\"data row10 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row10_col2\" class=\"data row10 col2\" >36.95</td>\n",
       "      <td id=\"T_5588f_row10_col3\" class=\"data row10 col3\" >36.99</td>\n",
       "      <td id=\"T_5588f_row10_col4\" class=\"data row10 col4\" >0.18</td>\n",
       "      <td id=\"T_5588f_row10_col5\" class=\"data row10 col5\" >0.17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row11\" class=\"row_heading level0 row11\" >Relative_Amplitude</th>\n",
       "      <td id=\"T_5588f_row11_col0\" class=\"data row11 col0\" >7.39e-09</td>\n",
       "      <td id=\"T_5588f_row11_col1\" class=\"data row11 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row11_col2\" class=\"data row11 col2\" >0.01</td>\n",
       "      <td id=\"T_5588f_row11_col3\" class=\"data row11 col3\" >0.01</td>\n",
       "      <td id=\"T_5588f_row11_col4\" class=\"data row11 col4\" >0.00</td>\n",
       "      <td id=\"T_5588f_row11_col5\" class=\"data row11 col5\" >0.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row12\" class=\"row_heading level0 row12\" >nadir_angle_fol</th>\n",
       "      <td id=\"T_5588f_row12_col0\" class=\"data row12 col0\" >1.98e-08</td>\n",
       "      <td id=\"T_5588f_row12_col1\" class=\"data row12 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row12_col2\" class=\"data row12 col2\" >197.00</td>\n",
       "      <td id=\"T_5588f_row12_col3\" class=\"data row12 col3\" >198.75</td>\n",
       "      <td id=\"T_5588f_row12_col4\" class=\"data row12 col4\" >19.56</td>\n",
       "      <td id=\"T_5588f_row12_col5\" class=\"data row12 col5\" >23.94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row13\" class=\"row_heading level0 row13\" >amp_raw_lut</th>\n",
       "      <td id=\"T_5588f_row13_col0\" class=\"data row13 col0\" >2.21e-08</td>\n",
       "      <td id=\"T_5588f_row13_col1\" class=\"data row13 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row13_col2\" class=\"data row13 col2\" >0.39</td>\n",
       "      <td id=\"T_5588f_row13_col3\" class=\"data row13 col3\" >0.36</td>\n",
       "      <td id=\"T_5588f_row13_col4\" class=\"data row13 col4\" >0.20</td>\n",
       "      <td id=\"T_5588f_row13_col5\" class=\"data row13 col5\" >0.19</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row14\" class=\"row_heading level0 row14\" >Average_Slope</th>\n",
       "      <td id=\"T_5588f_row14_col0\" class=\"data row14 col0\" >2.93e-08</td>\n",
       "      <td id=\"T_5588f_row14_col1\" class=\"data row14 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row14_col2\" class=\"data row14 col2\" >0.07</td>\n",
       "      <td id=\"T_5588f_row14_col3\" class=\"data row14 col3\" >0.07</td>\n",
       "      <td id=\"T_5588f_row14_col4\" class=\"data row14 col4\" >0.02</td>\n",
       "      <td id=\"T_5588f_row14_col5\" class=\"data row14 col5\" >0.02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row15\" class=\"row_heading level0 row15\" >std_lut</th>\n",
       "      <td id=\"T_5588f_row15_col0\" class=\"data row15 col0\" >4.44e-08</td>\n",
       "      <td id=\"T_5588f_row15_col1\" class=\"data row15 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row15_col2\" class=\"data row15 col2\" >0.13</td>\n",
       "      <td id=\"T_5588f_row15_col3\" class=\"data row15 col3\" >0.12</td>\n",
       "      <td id=\"T_5588f_row15_col4\" class=\"data row15 col4\" >0.06</td>\n",
       "      <td id=\"T_5588f_row15_col5\" class=\"data row15 col5\" >0.06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row16\" class=\"row_heading level0 row16\" >Half_Sine_r2</th>\n",
       "      <td id=\"T_5588f_row16_col0\" class=\"data row16 col0\" >6.91e-08</td>\n",
       "      <td id=\"T_5588f_row16_col1\" class=\"data row16 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row16_col2\" class=\"data row16 col2\" >0.71</td>\n",
       "      <td id=\"T_5588f_row16_col3\" class=\"data row16 col3\" >0.75</td>\n",
       "      <td id=\"T_5588f_row16_col4\" class=\"data row16 col4\" >0.17</td>\n",
       "      <td id=\"T_5588f_row16_col5\" class=\"data row16 col5\" >0.15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row17\" class=\"row_heading level0 row17\" >Cosine_r2</th>\n",
       "      <td id=\"T_5588f_row17_col0\" class=\"data row17 col0\" >1.07e-07</td>\n",
       "      <td id=\"T_5588f_row17_col1\" class=\"data row17 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row17_col2\" class=\"data row17 col2\" >0.67</td>\n",
       "      <td id=\"T_5588f_row17_col3\" class=\"data row17 col3\" >0.71</td>\n",
       "      <td id=\"T_5588f_row17_col4\" class=\"data row17 col4\" >0.20</td>\n",
       "      <td id=\"T_5588f_row17_col5\" class=\"data row17 col5\" >0.17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row18\" class=\"row_heading level0 row18\" >Gaussian_r2</th>\n",
       "      <td id=\"T_5588f_row18_col0\" class=\"data row18 col0\" >1.74e-07</td>\n",
       "      <td id=\"T_5588f_row18_col1\" class=\"data row18 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row18_col2\" class=\"data row18 col2\" >0.64</td>\n",
       "      <td id=\"T_5588f_row18_col3\" class=\"data row18 col3\" >0.67</td>\n",
       "      <td id=\"T_5588f_row18_col4\" class=\"data row18 col4\" >0.16</td>\n",
       "      <td id=\"T_5588f_row18_col5\" class=\"data row18 col5\" >0.15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row19\" class=\"row_heading level0 row19\" >amp_smooth_lut</th>\n",
       "      <td id=\"T_5588f_row19_col0\" class=\"data row19 col0\" >5.37e-07</td>\n",
       "      <td id=\"T_5588f_row19_col1\" class=\"data row19 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row19_col2\" class=\"data row19 col2\" >0.35</td>\n",
       "      <td id=\"T_5588f_row19_col3\" class=\"data row19 col3\" >0.32</td>\n",
       "      <td id=\"T_5588f_row19_col4\" class=\"data row19 col4\" >0.15</td>\n",
       "      <td id=\"T_5588f_row19_col5\" class=\"data row19 col5\" >0.14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row20\" class=\"row_heading level0 row20\" >Zigzag_r2</th>\n",
       "      <td id=\"T_5588f_row20_col0\" class=\"data row20 col0\" >3.09e-06</td>\n",
       "      <td id=\"T_5588f_row20_col1\" class=\"data row20 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row20_col2\" class=\"data row20 col2\" >0.65</td>\n",
       "      <td id=\"T_5588f_row20_col3\" class=\"data row20 col3\" >0.69</td>\n",
       "      <td id=\"T_5588f_row20_col4\" class=\"data row20 col4\" >0.19</td>\n",
       "      <td id=\"T_5588f_row20_col5\" class=\"data row20 col5\" >0.16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row21\" class=\"row_heading level0 row21\" >Amplitude</th>\n",
       "      <td id=\"T_5588f_row21_col0\" class=\"data row21 col0\" >8.30e-06</td>\n",
       "      <td id=\"T_5588f_row21_col1\" class=\"data row21 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row21_col2\" class=\"data row21 col2\" >0.52</td>\n",
       "      <td id=\"T_5588f_row21_col3\" class=\"data row21 col3\" >0.50</td>\n",
       "      <td id=\"T_5588f_row21_col4\" class=\"data row21 col4\" >0.15</td>\n",
       "      <td id=\"T_5588f_row21_col5\" class=\"data row21 col5\" >0.14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row22\" class=\"row_heading level0 row22\" >smoothness_fol</th>\n",
       "      <td id=\"T_5588f_row22_col0\" class=\"data row22 col0\" >2.98e-05</td>\n",
       "      <td id=\"T_5588f_row22_col1\" class=\"data row22 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row22_col2\" class=\"data row22 col2\" >0.11</td>\n",
       "      <td id=\"T_5588f_row22_col3\" class=\"data row22 col3\" >0.11</td>\n",
       "      <td id=\"T_5588f_row22_col4\" class=\"data row22 col4\" >0.05</td>\n",
       "      <td id=\"T_5588f_row22_col5\" class=\"data row22 col5\" >0.05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row23\" class=\"row_heading level0 row23\" >std_fol</th>\n",
       "      <td id=\"T_5588f_row23_col0\" class=\"data row23 col0\" >1.33e-04</td>\n",
       "      <td id=\"T_5588f_row23_col1\" class=\"data row23 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row23_col2\" class=\"data row23 col2\" >0.12</td>\n",
       "      <td id=\"T_5588f_row23_col3\" class=\"data row23 col3\" >0.12</td>\n",
       "      <td id=\"T_5588f_row23_col4\" class=\"data row23 col4\" >0.06</td>\n",
       "      <td id=\"T_5588f_row23_col5\" class=\"data row23 col5\" >0.06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row24\" class=\"row_heading level0 row24\" >amp_smooth_fol</th>\n",
       "      <td id=\"T_5588f_row24_col0\" class=\"data row24 col0\" >1.57e-04</td>\n",
       "      <td id=\"T_5588f_row24_col1\" class=\"data row24 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row24_col2\" class=\"data row24 col2\" >0.25</td>\n",
       "      <td id=\"T_5588f_row24_col3\" class=\"data row24 col3\" >0.23</td>\n",
       "      <td id=\"T_5588f_row24_col4\" class=\"data row24 col4\" >0.15</td>\n",
       "      <td id=\"T_5588f_row24_col5\" class=\"data row24 col5\" >0.15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row25\" class=\"row_heading level0 row25\" >num_T_vals_fol</th>\n",
       "      <td id=\"T_5588f_row25_col0\" class=\"data row25 col0\" >1.77e-04</td>\n",
       "      <td id=\"T_5588f_row25_col1\" class=\"data row25 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row25_col2\" class=\"data row25 col2\" >11.88</td>\n",
       "      <td id=\"T_5588f_row25_col3\" class=\"data row25 col3\" >11.24</td>\n",
       "      <td id=\"T_5588f_row25_col4\" class=\"data row25 col4\" >4.01</td>\n",
       "      <td id=\"T_5588f_row25_col5\" class=\"data row25 col5\" >3.62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row26\" class=\"row_heading level0 row26\" >amp_raw_fol</th>\n",
       "      <td id=\"T_5588f_row26_col0\" class=\"data row26 col0\" >2.84e-04</td>\n",
       "      <td id=\"T_5588f_row26_col1\" class=\"data row26 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row26_col2\" class=\"data row26 col2\" >0.40</td>\n",
       "      <td id=\"T_5588f_row26_col3\" class=\"data row26 col3\" >0.37</td>\n",
       "      <td id=\"T_5588f_row26_col4\" class=\"data row26 col4\" >0.20</td>\n",
       "      <td id=\"T_5588f_row26_col5\" class=\"data row26 col5\" >0.20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row27\" class=\"row_heading level0 row27\" >Intra_monthly_Variability</th>\n",
       "      <td id=\"T_5588f_row27_col0\" class=\"data row27 col0\" >4.20e-04</td>\n",
       "      <td id=\"T_5588f_row27_col1\" class=\"data row27 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row27_col2\" class=\"data row27 col2\" >0.67</td>\n",
       "      <td id=\"T_5588f_row27_col3\" class=\"data row27 col3\" >0.61</td>\n",
       "      <td id=\"T_5588f_row27_col4\" class=\"data row27 col4\" >0.42</td>\n",
       "      <td id=\"T_5588f_row27_col5\" class=\"data row27 col5\" >0.36</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row28\" class=\"row_heading level0 row28\" >Skewness</th>\n",
       "      <td id=\"T_5588f_row28_col0\" class=\"data row28 col0\" >5.00e-04</td>\n",
       "      <td id=\"T_5588f_row28_col1\" class=\"data row28 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row28_col2\" class=\"data row28 col2\" >0.19</td>\n",
       "      <td id=\"T_5588f_row28_col3\" class=\"data row28 col3\" >0.14</td>\n",
       "      <td id=\"T_5588f_row28_col4\" class=\"data row28 col4\" >0.50</td>\n",
       "      <td id=\"T_5588f_row28_col5\" class=\"data row28 col5\" >0.51</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row29\" class=\"row_heading level0 row29\" >smoothness_lut</th>\n",
       "      <td id=\"T_5588f_row29_col0\" class=\"data row29 col0\" >9.44e-04</td>\n",
       "      <td id=\"T_5588f_row29_col1\" class=\"data row29 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row29_col2\" class=\"data row29 col2\" >0.11</td>\n",
       "      <td id=\"T_5588f_row29_col3\" class=\"data row29 col3\" >0.10</td>\n",
       "      <td id=\"T_5588f_row29_col4\" class=\"data row29 col4\" >0.05</td>\n",
       "      <td id=\"T_5588f_row29_col5\" class=\"data row29 col5\" >0.05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row30\" class=\"row_heading level0 row30\" >Standard_Deviation</th>\n",
       "      <td id=\"T_5588f_row30_col0\" class=\"data row30 col0\" >0.001</td>\n",
       "      <td id=\"T_5588f_row30_col1\" class=\"data row30 col1\" >True</td>\n",
       "      <td id=\"T_5588f_row30_col2\" class=\"data row30 col2\" >0.20</td>\n",
       "      <td id=\"T_5588f_row30_col3\" class=\"data row30 col3\" >0.19</td>\n",
       "      <td id=\"T_5588f_row30_col4\" class=\"data row30 col4\" >0.05</td>\n",
       "      <td id=\"T_5588f_row30_col5\" class=\"data row30 col5\" >0.05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row31\" class=\"row_heading level0 row31\" >acrophase_angle_lut</th>\n",
       "      <td id=\"T_5588f_row31_col0\" class=\"data row31 col0\" >0.002</td>\n",
       "      <td id=\"T_5588f_row31_col1\" class=\"data row31 col1\" >False</td>\n",
       "      <td id=\"T_5588f_row31_col2\" class=\"data row31 col2\" >138.74</td>\n",
       "      <td id=\"T_5588f_row31_col3\" class=\"data row31 col3\" >134.16</td>\n",
       "      <td id=\"T_5588f_row31_col4\" class=\"data row31 col4\" >39.17</td>\n",
       "      <td id=\"T_5588f_row31_col5\" class=\"data row31 col5\" >40.44</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row32\" class=\"row_heading level0 row32\" >slope_acrophase_to_m</th>\n",
       "      <td id=\"T_5588f_row32_col0\" class=\"data row32 col0\" >0.018</td>\n",
       "      <td id=\"T_5588f_row32_col1\" class=\"data row32 col1\" >False</td>\n",
       "      <td id=\"T_5588f_row32_col2\" class=\"data row32 col2\" >-0.03</td>\n",
       "      <td id=\"T_5588f_row32_col3\" class=\"data row32 col3\" >-0.03</td>\n",
       "      <td id=\"T_5588f_row32_col4\" class=\"data row32 col4\" >0.03</td>\n",
       "      <td id=\"T_5588f_row32_col5\" class=\"data row32 col5\" >0.03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row33\" class=\"row_heading level0 row33\" >Kurtosis</th>\n",
       "      <td id=\"T_5588f_row33_col0\" class=\"data row33 col0\" >0.049</td>\n",
       "      <td id=\"T_5588f_row33_col1\" class=\"data row33 col1\" >False</td>\n",
       "      <td id=\"T_5588f_row33_col2\" class=\"data row33 col2\" >-0.87</td>\n",
       "      <td id=\"T_5588f_row33_col3\" class=\"data row33 col3\" >-0.91</td>\n",
       "      <td id=\"T_5588f_row33_col4\" class=\"data row33 col4\" >0.61</td>\n",
       "      <td id=\"T_5588f_row33_col5\" class=\"data row33 col5\" >0.58</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row34\" class=\"row_heading level0 row34\" >slope_m_to_nadir</th>\n",
       "      <td id=\"T_5588f_row34_col0\" class=\"data row34 col0\" >0.107</td>\n",
       "      <td id=\"T_5588f_row34_col1\" class=\"data row34 col1\" >False</td>\n",
       "      <td id=\"T_5588f_row34_col2\" class=\"data row34 col2\" >0.00</td>\n",
       "      <td id=\"T_5588f_row34_col3\" class=\"data row34 col3\" >0.00</td>\n",
       "      <td id=\"T_5588f_row34_col4\" class=\"data row34 col4\" >0.02</td>\n",
       "      <td id=\"T_5588f_row34_col5\" class=\"data row34 col5\" >0.02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row35\" class=\"row_heading level0 row35\" >dur_lut</th>\n",
       "      <td id=\"T_5588f_row35_col0\" class=\"data row35 col0\" >0.149</td>\n",
       "      <td id=\"T_5588f_row35_col1\" class=\"data row35 col1\" >False</td>\n",
       "      <td id=\"T_5588f_row35_col2\" class=\"data row35 col2\" >9.77</td>\n",
       "      <td id=\"T_5588f_row35_col3\" class=\"data row35 col3\" >9.55</td>\n",
       "      <td id=\"T_5588f_row35_col4\" class=\"data row35 col4\" >3.51</td>\n",
       "      <td id=\"T_5588f_row35_col5\" class=\"data row35 col5\" >3.68</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row36\" class=\"row_heading level0 row36\" >Avg_Peak_to_Peak_Distance</th>\n",
       "      <td id=\"T_5588f_row36_col0\" class=\"data row36 col0\" >0.188</td>\n",
       "      <td id=\"T_5588f_row36_col1\" class=\"data row36 col1\" >False</td>\n",
       "      <td id=\"T_5588f_row36_col2\" class=\"data row36 col2\" >4.33</td>\n",
       "      <td id=\"T_5588f_row36_col3\" class=\"data row36 col3\" >4.26</td>\n",
       "      <td id=\"T_5588f_row36_col4\" class=\"data row36 col4\" >1.46</td>\n",
       "      <td id=\"T_5588f_row36_col5\" class=\"data row36 col5\" >1.44</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row37\" class=\"row_heading level0 row37\" >num_T_vals_lut</th>\n",
       "      <td id=\"T_5588f_row37_col0\" class=\"data row37 col0\" >0.722</td>\n",
       "      <td id=\"T_5588f_row37_col1\" class=\"data row37 col1\" >False</td>\n",
       "      <td id=\"T_5588f_row37_col2\" class=\"data row37 col2\" >9.38</td>\n",
       "      <td id=\"T_5588f_row37_col3\" class=\"data row37 col3\" >9.30</td>\n",
       "      <td id=\"T_5588f_row37_col4\" class=\"data row37 col4\" >3.42</td>\n",
       "      <td id=\"T_5588f_row37_col5\" class=\"data row37 col5\" >3.62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_5588f_level0_row38\" class=\"row_heading level0 row38\" >slope_nadir_to_acrophase</th>\n",
       "      <td id=\"T_5588f_row38_col0\" class=\"data row38 col0\" >0.929</td>\n",
       "      <td id=\"T_5588f_row38_col1\" class=\"data row38 col1\" >False</td>\n",
       "      <td id=\"T_5588f_row38_col2\" class=\"data row38 col2\" >0.06</td>\n",
       "      <td id=\"T_5588f_row38_col3\" class=\"data row38 col3\" >0.06</td>\n",
       "      <td id=\"T_5588f_row38_col4\" class=\"data row38 col4\" >0.04</td>\n",
       "      <td id=\"T_5588f_row38_col5\" class=\"data row38 col5\" >0.04</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n"
      ],
      "text/plain": [
       "<pandas.io.formats.style.Styler at 0x323db1600>"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "# Apply formatting styles\n",
    "styled = final_summary.sort_values(by='p-value', ascending=True).style.format({\n",
    "    'Test':                     lambda x: x,\n",
    "    'p-value':                  fmt_small_conditional,\n",
    "    'positive_test_bonferroni': fmt_boolean,\n",
    "    'count_AgeGroup_1':         fmt_integer,\n",
    "    'mean_AgeGroup_1':          fmt_small,\n",
    "    'std_AgeGroup_1':           fmt_small,\n",
    "    'count_AgeGroup_2':         fmt_integer,\n",
    "    'mean_AgeGroup_2':          fmt_small,\n",
    "    'std_AgeGroup_2':           fmt_small,})\n",
    "\n",
    "# 3) display it\n",
    "styled\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b88931ac-0fd3-4bc5-a69b-f47bfeff7344",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true,
    "tags": []
   },
   "source": [
    "#### LMM for age at menses for every feature"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "969bf619-af65-47ba-9183-a17ffbad7bf3",
   "metadata": {},
   "outputs": [],
   "source": [
    "features_to_test_reduced = ['L5', 'M5', 'mean_fol', 'mean_lut', 'Mean_Temperature',\\\n",
    "'acrophase_angle_lut', 'acrophase_day', 'dur_fol', 'dur_lut', 'nadir_angle_fol', 'nadir_day', 'Period', \\\n",
    "'amp_smooth_fol', 'amp_smooth_lut', 'Amplitude', 'Average_Slope', 'Kurtosis', 'Skewness', 'slope_acrophase_to_m', \\\n",
    "'slope_m_to_nadir', 'slope_nadir_to_acrophase', 'smoothness_fol', 'smoothness_lut', 'Standard_Deviation', 'std_fol', 'std_lut', \\\n",
    "'Cosine_r2', 'Gaussian_r2', 'Half_Sine_r2', 'Sawtooth_Up_r2', 'Square_r2', 'Zigzag_r2']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "796a580d-5a7a-4fe4-8f09-f1095613651e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "753"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df_non_conceptive_subset.groupby(['CODICE'])['Age_at_Menses'].count())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "1aae2970-e98e-4960-ad70-508f4e1ee90d",
   "metadata": {},
   "outputs": [],
   "source": [
    "all_features = list(set(df_non_conceptive_subset.columns.to_list()) - set(['Age_at_Menses', 'Age_Group', 'Window_Start', 'Window_End', 'DONNA', 'DATA', 'QUALIFI', 'conceptive_group']))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "b66ebb5e-0df7-4042-b91d-2e9ede6ea7a1",
   "metadata": {},
   "outputs": [],
   "source": [
    "group_keys   = ['CODICE', 'Age_at_Menses']\n",
    "feature_cols = [c for c in all_features if c not in group_keys]\n",
    "\n",
    "feature_df_grouped = (df_non_conceptive_subset.groupby(group_keys)[feature_cols].mean(numeric_only=True).reset_index())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "e1f874b7-8adf-4c3a-ba5a-a50fdbd3b591",
   "metadata": {},
   "outputs": [],
   "source": [
    "three_way_table = feature_df_grouped.pivot(index='CODICE', columns='Age_at_Menses', values=all_features)\n",
    "\n",
    "# Convert to a NumPy tensor (Patients x Age_Years x Features)\n",
    "three_way_tensor = np.array([three_way_table[feature].values for feature in all_features])\n",
    "three_way_tensor = np.moveaxis(three_way_tensor, 0, -1)  "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9d5a158b-3af6-4597-9514-e901ecb45ed9",
   "metadata": {},
   "source": [
    "##### Recentering age to mean"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "cd343c15-18be-49b5-9c13-8836bb8a64b7",
   "metadata": {},
   "outputs": [],
   "source": [
    "# ------------------------------------------------------------------\n",
    "# 0 · Prep containers\n",
    "# ------------------------------------------------------------------\n",
    "coeffs, pvals, ci_low, ci_high, icc = {}, {}, {}, {}, {}\n",
    "\n",
    "# ------------------------------------------------------------------\n",
    "# 1 · Loop over every feature\n",
    "# ------------------------------------------------------------------\n",
    "for feature in features_to_test_reduced:\n",
    "    feature_data = three_way_table[feature]\n",
    "\n",
    "    df_long = (feature_data.reset_index()\n",
    "                   .melt(id_vars=\"CODICE\",\n",
    "                         var_name=\"Age_at_Menses\",\n",
    "                         value_name=\"Value\")\n",
    "                   .merge(site_lookup, on=\"CODICE\", how=\"left\")  # <- adds 'site'\n",
    "                   .dropna(subset=[\"Value\"])    )\n",
    "\n",
    "    # make sure it's treated as categorical (creates dummies automatically later)\n",
    "    df_long[\"site\"] = df_long[\"site\"].astype(\"category\")\n",
    "\n",
    "\n",
    "    # ----- treat age as numeric & centre at its mean ------------------\n",
    "    df_long['Age_at_Menses'] = (pd.to_numeric(df_long['Age_at_Menses'], errors='coerce')    )\n",
    "    mu_age = df_long['Age_at_Menses'].mean()\n",
    "    df_long['Age_c'] = df_long['Age_at_Menses'] - mu_age          # centred\n",
    "\n",
    "    # ----- fit random-intercept model; skip feature if it fails -------\n",
    "    try:\n",
    "        #Choose model to run\n",
    "\n",
    "        ### Model using participants as random effects:\n",
    "        model = smf.mixedlm(\"Value ~ Age_c\", df_long, groups=df_long[\"CODICE\"])\n",
    "        res = model.fit(reml=False, warn_convergence=False)\n",
    "\n",
    "        coeffs[feature]   = res.params['Age_c']\n",
    "        pvals[feature]    = res.pvalues['Age_c']\n",
    "        ci_low[feature], ci_high[feature] = res.conf_int().loc['Age_c']\n",
    "\n",
    "        # 2) extract variance components\n",
    "        var_between = res.cov_re.iloc[0, 0]   # random‐intercept variance\n",
    "        var_within  = res.scale              # residual variance\n",
    "\n",
    "        # 3) compute and store ICC\n",
    "        icc[feature] = var_between / (var_between + var_within)\n",
    "\n",
    "    except Exception as err:\n",
    "        warnings.warn(f\"{feature}: model failed - {err}\")\n",
    "        coeffs[feature] = pvals[feature] = ci_low[feature] = ci_high[feature] = np.nan\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "b2a3d10b-9ce5-498f-b7d9-3f7940c73878",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style type=\"text/css\">\n",
       "</style>\n",
       "<table id=\"T_f726a\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th class=\"blank level0\" >&nbsp;</th>\n",
       "      <th id=\"T_f726a_level0_col0\" class=\"col_heading level0 col0\" >Coefficient</th>\n",
       "      <th id=\"T_f726a_level0_col1\" class=\"col_heading level0 col1\" >CI_low_95%</th>\n",
       "      <th id=\"T_f726a_level0_col2\" class=\"col_heading level0 col2\" >CI_high_95%</th>\n",
       "      <th id=\"T_f726a_level0_col3\" class=\"col_heading level0 col3\" >ICC</th>\n",
       "      <th id=\"T_f726a_level0_col4\" class=\"col_heading level0 col4\" >P_value</th>\n",
       "      <th id=\"T_f726a_level0_col5\" class=\"col_heading level0 col5\" >BonferroniTest</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row0\" class=\"row_heading level0 row0\" >Period</th>\n",
       "      <td id=\"T_f726a_row0_col0\" class=\"data row0 col0\" >-0.194</td>\n",
       "      <td id=\"T_f726a_row0_col1\" class=\"data row0 col1\" >-0.239</td>\n",
       "      <td id=\"T_f726a_row0_col2\" class=\"data row0 col2\" >-0.149</td>\n",
       "      <td id=\"T_f726a_row0_col3\" class=\"data row0 col3\" >0.613</td>\n",
       "      <td id=\"T_f726a_row0_col4\" class=\"data row0 col4\" >2.11e-17</td>\n",
       "      <td id=\"T_f726a_row0_col5\" class=\"data row0 col5\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row1\" class=\"row_heading level0 row1\" >acrophase_day</th>\n",
       "      <td id=\"T_f726a_row1_col0\" class=\"data row1 col0\" >-0.192</td>\n",
       "      <td id=\"T_f726a_row1_col1\" class=\"data row1 col1\" >-0.238</td>\n",
       "      <td id=\"T_f726a_row1_col2\" class=\"data row1 col2\" >-0.146</td>\n",
       "      <td id=\"T_f726a_row1_col3\" class=\"data row1 col3\" >0.441</td>\n",
       "      <td id=\"T_f726a_row1_col4\" class=\"data row1 col4\" >2.52e-16</td>\n",
       "      <td id=\"T_f726a_row1_col5\" class=\"data row1 col5\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row2\" class=\"row_heading level0 row2\" >Gaussian_r2</th>\n",
       "      <td id=\"T_f726a_row2_col0\" class=\"data row2 col0\" >0.005</td>\n",
       "      <td id=\"T_f726a_row2_col1\" class=\"data row2 col1\" >0.003</td>\n",
       "      <td id=\"T_f726a_row2_col2\" class=\"data row2 col2\" >0.007</td>\n",
       "      <td id=\"T_f726a_row2_col3\" class=\"data row2 col3\" >0.310</td>\n",
       "      <td id=\"T_f726a_row2_col4\" class=\"data row2 col4\" >2.50e-07</td>\n",
       "      <td id=\"T_f726a_row2_col5\" class=\"data row2 col5\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row3\" class=\"row_heading level0 row3\" >dur_fol</th>\n",
       "      <td id=\"T_f726a_row3_col0\" class=\"data row3 col0\" >-0.118</td>\n",
       "      <td id=\"T_f726a_row3_col1\" class=\"data row3 col1\" >-0.163</td>\n",
       "      <td id=\"T_f726a_row3_col2\" class=\"data row3 col2\" >-0.072</td>\n",
       "      <td id=\"T_f726a_row3_col3\" class=\"data row3 col3\" >0.559</td>\n",
       "      <td id=\"T_f726a_row3_col4\" class=\"data row3 col4\" >3.84e-07</td>\n",
       "      <td id=\"T_f726a_row3_col5\" class=\"data row3 col5\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row4\" class=\"row_heading level0 row4\" >Sawtooth_Up_r2</th>\n",
       "      <td id=\"T_f726a_row4_col0\" class=\"data row4 col0\" >0.004</td>\n",
       "      <td id=\"T_f726a_row4_col1\" class=\"data row4 col1\" >0.002</td>\n",
       "      <td id=\"T_f726a_row4_col2\" class=\"data row4 col2\" >0.006</td>\n",
       "      <td id=\"T_f726a_row4_col3\" class=\"data row4 col3\" >0.325</td>\n",
       "      <td id=\"T_f726a_row4_col4\" class=\"data row4 col4\" >2.47e-06</td>\n",
       "      <td id=\"T_f726a_row4_col5\" class=\"data row4 col5\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row5\" class=\"row_heading level0 row5\" >nadir_day</th>\n",
       "      <td id=\"T_f726a_row5_col0\" class=\"data row5 col0\" >-0.109</td>\n",
       "      <td id=\"T_f726a_row5_col1\" class=\"data row5 col1\" >-0.158</td>\n",
       "      <td id=\"T_f726a_row5_col2\" class=\"data row5 col2\" >-0.061</td>\n",
       "      <td id=\"T_f726a_row5_col3\" class=\"data row5 col3\" >0.460</td>\n",
       "      <td id=\"T_f726a_row5_col4\" class=\"data row5 col4\" >8.66e-06</td>\n",
       "      <td id=\"T_f726a_row5_col5\" class=\"data row5 col5\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row6\" class=\"row_heading level0 row6\" >L5</th>\n",
       "      <td id=\"T_f726a_row6_col0\" class=\"data row6 col0\" >0.004</td>\n",
       "      <td id=\"T_f726a_row6_col1\" class=\"data row6 col1\" >0.002</td>\n",
       "      <td id=\"T_f726a_row6_col2\" class=\"data row6 col2\" >0.006</td>\n",
       "      <td id=\"T_f726a_row6_col3\" class=\"data row6 col3\" >0.809</td>\n",
       "      <td id=\"T_f726a_row6_col4\" class=\"data row6 col4\" >4.59e-04</td>\n",
       "      <td id=\"T_f726a_row6_col5\" class=\"data row6 col5\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row7\" class=\"row_heading level0 row7\" >Square_r2</th>\n",
       "      <td id=\"T_f726a_row7_col0\" class=\"data row7 col0\" >0.003</td>\n",
       "      <td id=\"T_f726a_row7_col1\" class=\"data row7 col1\" >0.001</td>\n",
       "      <td id=\"T_f726a_row7_col2\" class=\"data row7 col2\" >0.005</td>\n",
       "      <td id=\"T_f726a_row7_col3\" class=\"data row7 col3\" >0.315</td>\n",
       "      <td id=\"T_f726a_row7_col4\" class=\"data row7 col4\" >5.87e-04</td>\n",
       "      <td id=\"T_f726a_row7_col5\" class=\"data row7 col5\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row8\" class=\"row_heading level0 row8\" >Zigzag_r2</th>\n",
       "      <td id=\"T_f726a_row8_col0\" class=\"data row8 col0\" >0.004</td>\n",
       "      <td id=\"T_f726a_row8_col1\" class=\"data row8 col1\" >0.001</td>\n",
       "      <td id=\"T_f726a_row8_col2\" class=\"data row8 col2\" >0.006</td>\n",
       "      <td id=\"T_f726a_row8_col3\" class=\"data row8 col3\" >0.273</td>\n",
       "      <td id=\"T_f726a_row8_col4\" class=\"data row8 col4\" >0.001</td>\n",
       "      <td id=\"T_f726a_row8_col5\" class=\"data row8 col5\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row9\" class=\"row_heading level0 row9\" >amp_smooth_lut</th>\n",
       "      <td id=\"T_f726a_row9_col0\" class=\"data row9 col0\" >-0.003</td>\n",
       "      <td id=\"T_f726a_row9_col1\" class=\"data row9 col1\" >-0.004</td>\n",
       "      <td id=\"T_f726a_row9_col2\" class=\"data row9 col2\" >-0.001</td>\n",
       "      <td id=\"T_f726a_row9_col3\" class=\"data row9 col3\" >0.253</td>\n",
       "      <td id=\"T_f726a_row9_col4\" class=\"data row9 col4\" >0.001</td>\n",
       "      <td id=\"T_f726a_row9_col5\" class=\"data row9 col5\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row10\" class=\"row_heading level0 row10\" >Half_Sine_r2</th>\n",
       "      <td id=\"T_f726a_row10_col0\" class=\"data row10 col0\" >0.003</td>\n",
       "      <td id=\"T_f726a_row10_col1\" class=\"data row10 col1\" >0.001</td>\n",
       "      <td id=\"T_f726a_row10_col2\" class=\"data row10 col2\" >0.005</td>\n",
       "      <td id=\"T_f726a_row10_col3\" class=\"data row10 col3\" >0.310</td>\n",
       "      <td id=\"T_f726a_row10_col4\" class=\"data row10 col4\" >0.001</td>\n",
       "      <td id=\"T_f726a_row10_col5\" class=\"data row10 col5\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row11\" class=\"row_heading level0 row11\" >Cosine_r2</th>\n",
       "      <td id=\"T_f726a_row11_col0\" class=\"data row11 col0\" >0.004</td>\n",
       "      <td id=\"T_f726a_row11_col1\" class=\"data row11 col1\" >0.001</td>\n",
       "      <td id=\"T_f726a_row11_col2\" class=\"data row11 col2\" >0.006</td>\n",
       "      <td id=\"T_f726a_row11_col3\" class=\"data row11 col3\" >0.292</td>\n",
       "      <td id=\"T_f726a_row11_col4\" class=\"data row11 col4\" >0.001</td>\n",
       "      <td id=\"T_f726a_row11_col5\" class=\"data row11 col5\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row12\" class=\"row_heading level0 row12\" >slope_m_to_nadir</th>\n",
       "      <td id=\"T_f726a_row12_col0\" class=\"data row12 col0\" >2.56e-04</td>\n",
       "      <td id=\"T_f726a_row12_col1\" class=\"data row12 col1\" >8.47e-05</td>\n",
       "      <td id=\"T_f726a_row12_col2\" class=\"data row12 col2\" >4.28e-04</td>\n",
       "      <td id=\"T_f726a_row12_col3\" class=\"data row12 col3\" >0.153</td>\n",
       "      <td id=\"T_f726a_row12_col4\" class=\"data row12 col4\" >0.003</td>\n",
       "      <td id=\"T_f726a_row12_col5\" class=\"data row12 col5\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row13\" class=\"row_heading level0 row13\" >dur_lut</th>\n",
       "      <td id=\"T_f726a_row13_col0\" class=\"data row13 col0\" >-0.067</td>\n",
       "      <td id=\"T_f726a_row13_col1\" class=\"data row13 col1\" >-0.115</td>\n",
       "      <td id=\"T_f726a_row13_col2\" class=\"data row13 col2\" >-0.020</td>\n",
       "      <td id=\"T_f726a_row13_col3\" class=\"data row13 col3\" >0.549</td>\n",
       "      <td id=\"T_f726a_row13_col4\" class=\"data row13 col4\" >0.005</td>\n",
       "      <td id=\"T_f726a_row13_col5\" class=\"data row13 col5\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row14\" class=\"row_heading level0 row14\" >std_lut</th>\n",
       "      <td id=\"T_f726a_row14_col0\" class=\"data row14 col0\" >-8.52e-04</td>\n",
       "      <td id=\"T_f726a_row14_col1\" class=\"data row14 col1\" >-0.001</td>\n",
       "      <td id=\"T_f726a_row14_col2\" class=\"data row14 col2\" >-2.50e-04</td>\n",
       "      <td id=\"T_f726a_row14_col3\" class=\"data row14 col3\" >0.184</td>\n",
       "      <td id=\"T_f726a_row14_col4\" class=\"data row14 col4\" >0.006</td>\n",
       "      <td id=\"T_f726a_row14_col5\" class=\"data row14 col5\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row15\" class=\"row_heading level0 row15\" >Average_Slope</th>\n",
       "      <td id=\"T_f726a_row15_col0\" class=\"data row15 col0\" >-3.68e-04</td>\n",
       "      <td id=\"T_f726a_row15_col1\" class=\"data row15 col1\" >-6.48e-04</td>\n",
       "      <td id=\"T_f726a_row15_col2\" class=\"data row15 col2\" >-8.86e-05</td>\n",
       "      <td id=\"T_f726a_row15_col3\" class=\"data row15 col3\" >0.350</td>\n",
       "      <td id=\"T_f726a_row15_col4\" class=\"data row15 col4\" >0.010</td>\n",
       "      <td id=\"T_f726a_row15_col5\" class=\"data row15 col5\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row16\" class=\"row_heading level0 row16\" >smoothness_fol</th>\n",
       "      <td id=\"T_f726a_row16_col0\" class=\"data row16 col0\" >-8.07e-04</td>\n",
       "      <td id=\"T_f726a_row16_col1\" class=\"data row16 col1\" >-0.001</td>\n",
       "      <td id=\"T_f726a_row16_col2\" class=\"data row16 col2\" >-1.78e-04</td>\n",
       "      <td id=\"T_f726a_row16_col3\" class=\"data row16 col3\" >0.299</td>\n",
       "      <td id=\"T_f726a_row16_col4\" class=\"data row16 col4\" >0.012</td>\n",
       "      <td id=\"T_f726a_row16_col5\" class=\"data row16 col5\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row17\" class=\"row_heading level0 row17\" >Amplitude</th>\n",
       "      <td id=\"T_f726a_row17_col0\" class=\"data row17 col0\" >-0.002</td>\n",
       "      <td id=\"T_f726a_row17_col1\" class=\"data row17 col1\" >-0.004</td>\n",
       "      <td id=\"T_f726a_row17_col2\" class=\"data row17 col2\" >-4.78e-04</td>\n",
       "      <td id=\"T_f726a_row17_col3\" class=\"data row17 col3\" >0.297</td>\n",
       "      <td id=\"T_f726a_row17_col4\" class=\"data row17 col4\" >0.012</td>\n",
       "      <td id=\"T_f726a_row17_col5\" class=\"data row17 col5\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row18\" class=\"row_heading level0 row18\" >amp_smooth_fol</th>\n",
       "      <td id=\"T_f726a_row18_col0\" class=\"data row18 col0\" >-0.002</td>\n",
       "      <td id=\"T_f726a_row18_col1\" class=\"data row18 col1\" >-0.004</td>\n",
       "      <td id=\"T_f726a_row18_col2\" class=\"data row18 col2\" >-2.38e-04</td>\n",
       "      <td id=\"T_f726a_row18_col3\" class=\"data row18 col3\" >0.259</td>\n",
       "      <td id=\"T_f726a_row18_col4\" class=\"data row18 col4\" >0.025</td>\n",
       "      <td id=\"T_f726a_row18_col5\" class=\"data row18 col5\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row19\" class=\"row_heading level0 row19\" >acrophase_angle_lut</th>\n",
       "      <td id=\"T_f726a_row19_col0\" class=\"data row19 col0\" >-0.471</td>\n",
       "      <td id=\"T_f726a_row19_col1\" class=\"data row19 col1\" >-0.895</td>\n",
       "      <td id=\"T_f726a_row19_col2\" class=\"data row19 col2\" >-0.047</td>\n",
       "      <td id=\"T_f726a_row19_col3\" class=\"data row19 col3\" >0.224</td>\n",
       "      <td id=\"T_f726a_row19_col4\" class=\"data row19 col4\" >0.030</td>\n",
       "      <td id=\"T_f726a_row19_col5\" class=\"data row19 col5\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row20\" class=\"row_heading level0 row20\" >smoothness_lut</th>\n",
       "      <td id=\"T_f726a_row20_col0\" class=\"data row20 col0\" >-6.00e-04</td>\n",
       "      <td id=\"T_f726a_row20_col1\" class=\"data row20 col1\" >-0.001</td>\n",
       "      <td id=\"T_f726a_row20_col2\" class=\"data row20 col2\" >-2.66e-05</td>\n",
       "      <td id=\"T_f726a_row20_col3\" class=\"data row20 col3\" >0.215</td>\n",
       "      <td id=\"T_f726a_row20_col4\" class=\"data row20 col4\" >0.040</td>\n",
       "      <td id=\"T_f726a_row20_col5\" class=\"data row20 col5\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row21\" class=\"row_heading level0 row21\" >nadir_angle_fol</th>\n",
       "      <td id=\"T_f726a_row21_col0\" class=\"data row21 col0\" >0.215</td>\n",
       "      <td id=\"T_f726a_row21_col1\" class=\"data row21 col1\" >-0.002</td>\n",
       "      <td id=\"T_f726a_row21_col2\" class=\"data row21 col2\" >0.432</td>\n",
       "      <td id=\"T_f726a_row21_col3\" class=\"data row21 col3\" >0.198</td>\n",
       "      <td id=\"T_f726a_row21_col4\" class=\"data row21 col4\" >0.052</td>\n",
       "      <td id=\"T_f726a_row21_col5\" class=\"data row21 col5\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row22\" class=\"row_heading level0 row22\" >Standard_Deviation</th>\n",
       "      <td id=\"T_f726a_row22_col0\" class=\"data row22 col0\" >-4.98e-04</td>\n",
       "      <td id=\"T_f726a_row22_col1\" class=\"data row22 col1\" >-0.001</td>\n",
       "      <td id=\"T_f726a_row22_col2\" class=\"data row22 col2\" >5.72e-05</td>\n",
       "      <td id=\"T_f726a_row22_col3\" class=\"data row22 col3\" >0.292</td>\n",
       "      <td id=\"T_f726a_row22_col4\" class=\"data row22 col4\" >0.079</td>\n",
       "      <td id=\"T_f726a_row22_col5\" class=\"data row22 col5\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row23\" class=\"row_heading level0 row23\" >std_fol</th>\n",
       "      <td id=\"T_f726a_row23_col0\" class=\"data row23 col0\" >-5.27e-04</td>\n",
       "      <td id=\"T_f726a_row23_col1\" class=\"data row23 col1\" >-0.001</td>\n",
       "      <td id=\"T_f726a_row23_col2\" class=\"data row23 col2\" >1.08e-04</td>\n",
       "      <td id=\"T_f726a_row23_col3\" class=\"data row23 col3\" >0.250</td>\n",
       "      <td id=\"T_f726a_row23_col4\" class=\"data row23 col4\" >0.104</td>\n",
       "      <td id=\"T_f726a_row23_col5\" class=\"data row23 col5\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row24\" class=\"row_heading level0 row24\" >slope_acrophase_to_m</th>\n",
       "      <td id=\"T_f726a_row24_col0\" class=\"data row24 col0\" >2.32e-04</td>\n",
       "      <td id=\"T_f726a_row24_col1\" class=\"data row24 col1\" >-7.71e-05</td>\n",
       "      <td id=\"T_f726a_row24_col2\" class=\"data row24 col2\" >5.42e-04</td>\n",
       "      <td id=\"T_f726a_row24_col3\" class=\"data row24 col3\" >0.106</td>\n",
       "      <td id=\"T_f726a_row24_col4\" class=\"data row24 col4\" >0.141</td>\n",
       "      <td id=\"T_f726a_row24_col5\" class=\"data row24 col5\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row25\" class=\"row_heading level0 row25\" >Kurtosis</th>\n",
       "      <td id=\"T_f726a_row25_col0\" class=\"data row25 col0\" >-0.004</td>\n",
       "      <td id=\"T_f726a_row25_col1\" class=\"data row25 col1\" >-0.010</td>\n",
       "      <td id=\"T_f726a_row25_col2\" class=\"data row25 col2\" >0.002</td>\n",
       "      <td id=\"T_f726a_row25_col3\" class=\"data row25 col3\" >0.137</td>\n",
       "      <td id=\"T_f726a_row25_col4\" class=\"data row25 col4\" >0.219</td>\n",
       "      <td id=\"T_f726a_row25_col5\" class=\"data row25 col5\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row26\" class=\"row_heading level0 row26\" >M5</th>\n",
       "      <td id=\"T_f726a_row26_col0\" class=\"data row26 col0\" >-0.001</td>\n",
       "      <td id=\"T_f726a_row26_col1\" class=\"data row26 col1\" >-0.004</td>\n",
       "      <td id=\"T_f726a_row26_col2\" class=\"data row26 col2\" >0.001</td>\n",
       "      <td id=\"T_f726a_row26_col3\" class=\"data row26 col3\" >0.722</td>\n",
       "      <td id=\"T_f726a_row26_col4\" class=\"data row26 col4\" >0.301</td>\n",
       "      <td id=\"T_f726a_row26_col5\" class=\"data row26 col5\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row27\" class=\"row_heading level0 row27\" >Skewness</th>\n",
       "      <td id=\"T_f726a_row27_col0\" class=\"data row27 col0\" >-0.002</td>\n",
       "      <td id=\"T_f726a_row27_col1\" class=\"data row27 col1\" >-0.008</td>\n",
       "      <td id=\"T_f726a_row27_col2\" class=\"data row27 col2\" >0.003</td>\n",
       "      <td id=\"T_f726a_row27_col3\" class=\"data row27 col3\" >0.197</td>\n",
       "      <td id=\"T_f726a_row27_col4\" class=\"data row27 col4\" >0.352</td>\n",
       "      <td id=\"T_f726a_row27_col5\" class=\"data row27 col5\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row28\" class=\"row_heading level0 row28\" >mean_fol</th>\n",
       "      <td id=\"T_f726a_row28_col0\" class=\"data row28 col0\" >9.28e-04</td>\n",
       "      <td id=\"T_f726a_row28_col1\" class=\"data row28 col1\" >-0.001</td>\n",
       "      <td id=\"T_f726a_row28_col2\" class=\"data row28 col2\" >0.003</td>\n",
       "      <td id=\"T_f726a_row28_col3\" class=\"data row28 col3\" >0.805</td>\n",
       "      <td id=\"T_f726a_row28_col4\" class=\"data row28 col4\" >0.432</td>\n",
       "      <td id=\"T_f726a_row28_col5\" class=\"data row28 col5\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row29\" class=\"row_heading level0 row29\" >Mean_Temperature</th>\n",
       "      <td id=\"T_f726a_row29_col0\" class=\"data row29 col0\" >8.56e-04</td>\n",
       "      <td id=\"T_f726a_row29_col1\" class=\"data row29 col1\" >-0.001</td>\n",
       "      <td id=\"T_f726a_row29_col2\" class=\"data row29 col2\" >0.003</td>\n",
       "      <td id=\"T_f726a_row29_col3\" class=\"data row29 col3\" >0.827</td>\n",
       "      <td id=\"T_f726a_row29_col4\" class=\"data row29 col4\" >0.439</td>\n",
       "      <td id=\"T_f726a_row29_col5\" class=\"data row29 col5\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row30\" class=\"row_heading level0 row30\" >slope_nadir_to_acrophase</th>\n",
       "      <td id=\"T_f726a_row30_col0\" class=\"data row30 col0\" >1.19e-04</td>\n",
       "      <td id=\"T_f726a_row30_col1\" class=\"data row30 col1\" >-2.79e-04</td>\n",
       "      <td id=\"T_f726a_row30_col2\" class=\"data row30 col2\" >5.17e-04</td>\n",
       "      <td id=\"T_f726a_row30_col3\" class=\"data row30 col3\" >0.159</td>\n",
       "      <td id=\"T_f726a_row30_col4\" class=\"data row30 col4\" >0.558</td>\n",
       "      <td id=\"T_f726a_row30_col5\" class=\"data row30 col5\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_f726a_level0_row31\" class=\"row_heading level0 row31\" >mean_lut</th>\n",
       "      <td id=\"T_f726a_row31_col0\" class=\"data row31 col0\" >-3.57e-05</td>\n",
       "      <td id=\"T_f726a_row31_col1\" class=\"data row31 col1\" >-0.002</td>\n",
       "      <td id=\"T_f726a_row31_col2\" class=\"data row31 col2\" >0.002</td>\n",
       "      <td id=\"T_f726a_row31_col3\" class=\"data row31 col3\" >0.776</td>\n",
       "      <td id=\"T_f726a_row31_col4\" class=\"data row31 col4\" >0.976</td>\n",
       "      <td id=\"T_f726a_row31_col5\" class=\"data row31 col5\" >False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n"
      ],
      "text/plain": [
       "<pandas.io.formats.style.Styler at 0x335587a90>"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# ------------------------------------------------------------------\n",
    "# 2 · Put everything in a tidy frame\n",
    "# ------------------------------------------------------------------\n",
    "mixed_model_summary_table6 = (\n",
    "    pd.DataFrame({\n",
    "        'Coefficient' : coeffs,\n",
    "        'CI_low_95%'  : ci_low,\n",
    "        'CI_high_95%' : ci_high,\n",
    "        'ICC'         : icc,\n",
    "        'P_value'     : pvals,})\n",
    "    .dropna(subset=['P_value'])                  # drop failed models\n",
    "    .sort_values('P_value'))\n",
    "\n",
    "# ------------------------------------------------------------------\n",
    "# 3 · Multiple-testing correction\n",
    "# ------------------------------------------------------------------\n",
    "alpha = 0.05\n",
    "# --- Bonferroni\n",
    "mixed_model_summary_table6['BonferroniTest'] = (mixed_model_summary_table6['P_value'] < alpha / len(mixed_model_summary_table6))\n",
    "# --- Benjamini–Hochberg FDR\n",
    "#_, qvals, _, _ = multipletests(mixed_model_summary['P_value'],  method='fdr_bh', alpha=alpha)\n",
    "#mixed_model_summary['Q_value']      = qvals\n",
    "#mixed_model_summary['sig_FDR_0.05'] = qvals < alpha\n",
    "\n",
    "# 2) apply different formats per column\n",
    "styled_table_section_6 = mixed_model_summary_table6.style.format({\n",
    "    'Coefficient': fmt_small_conditional, \n",
    "    'CI_low_95%':  fmt_small_conditional, \n",
    "    'CI_high_95%': fmt_small_conditional, \n",
    "    'ICC':         fmt_small_conditional,\n",
    "    'P_value':     fmt_small_conditional, \n",
    "    'BonferroniTest': fmt_boolean,\n",
    "    #'Q_value': fmt_small\n",
    "})\n",
    "\n",
    "# 3) display it\n",
    "styled_table_section_6"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "12350ad6-9f39-45ec-a112-8c4dc4ad562c",
   "metadata": {
    "tags": []
   },
   "source": [
    "#### intra subject variability"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "e382592b-5470-4ef3-a5f7-831c3cd3996b",
   "metadata": {},
   "outputs": [],
   "source": [
    "WINDOW_CYCLES = 6         \n",
    "\n",
    "# what statistic do we want?\n",
    "USE_CV    = True # True ⇒ coefficient of variation; False ⇒ plain std\n",
    "MIN_VALID = 4    # require full window to call the std “valid”\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "43ecf291-cb02-46d0-b362-abf11e77ad5d",
   "metadata": {},
   "outputs": [],
   "source": [
    "import statsmodels.formula.api as smf\n",
    "### Table of STDs\n",
    "\n",
    "variability_tables = {}      # feature ➜ wide table (CODICE × Age) of within–window SD/CV\n",
    "\n",
    "for feature in features_to_test_reduced:\n",
    "    # A. long table (same as before)\n",
    "    df_long = (three_way_table[feature].reset_index()  \n",
    "        .melt(id_vars='CODICE', var_name='Age_at_Menses', value_name='Value')\n",
    "        .dropna(subset=['Value'])\n",
    "        .assign(Age_at_Menses=lambda d: pd.to_numeric(d['Age_at_Menses'], errors='coerce')).sort_values(['CODICE', 'Age_at_Menses'])    )\n",
    "\n",
    "    # B. rolling variability within each subject\n",
    "    def _rolling_stat(group):\n",
    "        vals = group['Value']\n",
    "        roll = vals.rolling(window=WINDOW_CYCLES, min_periods=MIN_VALID)\n",
    "        if USE_CV:\n",
    "            return roll.std() / roll.mean()\n",
    "        else:\n",
    "            return roll.std()\n",
    "\n",
    "    df_long['RollVar'] = (df_long.groupby('CODICE', group_keys=False).apply(_rolling_stat))\n",
    "\n",
    "    # keep only rows where rolling SD/CV is defined\n",
    "    df_var = (df_long.dropna(subset=['RollVar']).pivot(index='CODICE', columns='Age_at_Menses',values='RollVar'))\n",
    "    variability_tables[feature] = df_var\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "1bbe773d-1dad-4d74-a16e-06e95105c90a",
   "metadata": {},
   "outputs": [],
   "source": [
    "coef_var, p_var, icc_var = {}, {}, {}\n",
    "\n",
    "for feature, table_var in variability_tables.items():\n",
    "\n",
    "    df_long = (table_var\n",
    "        .reset_index()\n",
    "        .melt(id_vars='CODICE',var_name='Age_at_Menses',value_name='VarValue')\n",
    "        .dropna(subset=['VarValue'])\n",
    "        .assign(Age_at_Menses=lambda d: pd.to_numeric(d['Age_at_Menses'], errors='coerce')))\n",
    "\n",
    "    # centre age\n",
    "    mu_age = df_long['Age_at_Menses'].mean()\n",
    "    df_long['Age_c'] = df_long['Age_at_Menses'] - mu_age\n",
    "\n",
    "    try:\n",
    "        mod = smf.mixedlm(\"VarValue ~ Age_c\", df_long, groups=df_long[\"CODICE\"])\n",
    "        res = mod.fit(reml=False, warn_convergence=False)\n",
    "\n",
    "        # 1) store your slope and p-value as before\n",
    "        coef_var[feature] = res.params['Age_c']\n",
    "        p_var[feature]    = res.pvalues['Age_c']\n",
    "\n",
    "        # 2) extract variance components\n",
    "        var_between = res.cov_re.iloc[0, 0]   # random‐intercept variance\n",
    "        var_within  = res.scale              # residual variance\n",
    "\n",
    "        # 3) compute and store ICC\n",
    "        icc_var[feature] = var_between / (var_between + var_within)\n",
    "\n",
    "    except Exception as e:\n",
    "        warnings.warn(f\"{feature}: model failed ({e})\")\n",
    "        coef_var[feature] = p_var[feature] = icc_var[feature] = np.nan\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "c25afa39-c5b7-441e-aeaf-6a6160ed2ad0",
   "metadata": {},
   "outputs": [],
   "source": [
    "alpha = 0.05\n",
    "\n",
    "summary_var_table = (pd.DataFrame({'Coefficient_SDvsAge' : coef_var, 'P_value': p_var, 'ICC': icc_var }).dropna(subset=['P_value']).sort_values('P_value'))\n",
    "\n",
    "# Bonferroni\n",
    "summary_var_table['BonferroniTest'] = (summary_var_table['P_value'] < alpha / len(summary_var_table))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "3f3d4a21-5473-4178-8582-f49fa21e48a7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style type=\"text/css\">\n",
       "</style>\n",
       "<table id=\"T_ffb57\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th class=\"blank level0\" >&nbsp;</th>\n",
       "      <th id=\"T_ffb57_level0_col0\" class=\"col_heading level0 col0\" >Coefficient_SDvsAge</th>\n",
       "      <th id=\"T_ffb57_level0_col1\" class=\"col_heading level0 col1\" >ICC</th>\n",
       "      <th id=\"T_ffb57_level0_col2\" class=\"col_heading level0 col2\" >P_value</th>\n",
       "      <th id=\"T_ffb57_level0_col3\" class=\"col_heading level0 col3\" >BonferroniTest</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row0\" class=\"row_heading level0 row0\" >Period</th>\n",
       "      <td id=\"T_ffb57_row0_col0\" class=\"data row0 col0\" >0.004</td>\n",
       "      <td id=\"T_ffb57_row0_col1\" class=\"data row0 col1\" >0.7643</td>\n",
       "      <td id=\"T_ffb57_row0_col2\" class=\"data row0 col2\" >2.65e-18</td>\n",
       "      <td id=\"T_ffb57_row0_col3\" class=\"data row0 col3\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row1\" class=\"row_heading level0 row1\" >std_lut</th>\n",
       "      <td id=\"T_ffb57_row1_col0\" class=\"data row1 col0\" >0.011</td>\n",
       "      <td id=\"T_ffb57_row1_col1\" class=\"data row1 col1\" >0.5249</td>\n",
       "      <td id=\"T_ffb57_row1_col2\" class=\"data row1 col2\" >1.52e-10</td>\n",
       "      <td id=\"T_ffb57_row1_col3\" class=\"data row1 col3\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row2\" class=\"row_heading level0 row2\" >amp_smooth_lut</th>\n",
       "      <td id=\"T_ffb57_row2_col0\" class=\"data row2 col0\" >0.008</td>\n",
       "      <td id=\"T_ffb57_row2_col1\" class=\"data row2 col1\" >0.5784</td>\n",
       "      <td id=\"T_ffb57_row2_col2\" class=\"data row2 col2\" >1.71e-07</td>\n",
       "      <td id=\"T_ffb57_row2_col3\" class=\"data row2 col3\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row3\" class=\"row_heading level0 row3\" >smoothness_lut</th>\n",
       "      <td id=\"T_ffb57_row3_col0\" class=\"data row3 col0\" >0.009</td>\n",
       "      <td id=\"T_ffb57_row3_col1\" class=\"data row3 col1\" >0.5190</td>\n",
       "      <td id=\"T_ffb57_row3_col2\" class=\"data row3 col2\" >1.95e-07</td>\n",
       "      <td id=\"T_ffb57_row3_col3\" class=\"data row3 col3\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row4\" class=\"row_heading level0 row4\" >dur_lut</th>\n",
       "      <td id=\"T_ffb57_row4_col0\" class=\"data row4 col0\" >0.007</td>\n",
       "      <td id=\"T_ffb57_row4_col1\" class=\"data row4 col1\" >0.6811</td>\n",
       "      <td id=\"T_ffb57_row4_col2\" class=\"data row4 col2\" >4.97e-07</td>\n",
       "      <td id=\"T_ffb57_row4_col3\" class=\"data row4 col3\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row5\" class=\"row_heading level0 row5\" >Square_r2</th>\n",
       "      <td id=\"T_ffb57_row5_col0\" class=\"data row5 col0\" >-0.005</td>\n",
       "      <td id=\"T_ffb57_row5_col1\" class=\"data row5 col1\" >0.6638</td>\n",
       "      <td id=\"T_ffb57_row5_col2\" class=\"data row5 col2\" >1.10e-05</td>\n",
       "      <td id=\"T_ffb57_row5_col3\" class=\"data row5 col3\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row6\" class=\"row_heading level0 row6\" >Average_Slope</th>\n",
       "      <td id=\"T_ffb57_row6_col0\" class=\"data row6 col0\" >0.004</td>\n",
       "      <td id=\"T_ffb57_row6_col1\" class=\"data row6 col1\" >0.5716</td>\n",
       "      <td id=\"T_ffb57_row6_col2\" class=\"data row6 col2\" >5.04e-05</td>\n",
       "      <td id=\"T_ffb57_row6_col3\" class=\"data row6 col3\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row7\" class=\"row_heading level0 row7\" >Zigzag_r2</th>\n",
       "      <td id=\"T_ffb57_row7_col0\" class=\"data row7 col0\" >-0.006</td>\n",
       "      <td id=\"T_ffb57_row7_col1\" class=\"data row7 col1\" >0.6561</td>\n",
       "      <td id=\"T_ffb57_row7_col2\" class=\"data row7 col2\" >5.08e-05</td>\n",
       "      <td id=\"T_ffb57_row7_col3\" class=\"data row7 col3\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row8\" class=\"row_heading level0 row8\" >Cosine_r2</th>\n",
       "      <td id=\"T_ffb57_row8_col0\" class=\"data row8 col0\" >-0.006</td>\n",
       "      <td id=\"T_ffb57_row8_col1\" class=\"data row8 col1\" >0.6689</td>\n",
       "      <td id=\"T_ffb57_row8_col2\" class=\"data row8 col2\" >6.12e-05</td>\n",
       "      <td id=\"T_ffb57_row8_col3\" class=\"data row8 col3\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row9\" class=\"row_heading level0 row9\" >smoothness_fol</th>\n",
       "      <td id=\"T_ffb57_row9_col0\" class=\"data row9 col0\" >0.006</td>\n",
       "      <td id=\"T_ffb57_row9_col1\" class=\"data row9 col1\" >0.5982</td>\n",
       "      <td id=\"T_ffb57_row9_col2\" class=\"data row9 col2\" >1.15e-04</td>\n",
       "      <td id=\"T_ffb57_row9_col3\" class=\"data row9 col3\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row10\" class=\"row_heading level0 row10\" >std_fol</th>\n",
       "      <td id=\"T_ffb57_row10_col0\" class=\"data row10 col0\" >0.006</td>\n",
       "      <td id=\"T_ffb57_row10_col1\" class=\"data row10 col1\" >0.5667</td>\n",
       "      <td id=\"T_ffb57_row10_col2\" class=\"data row10 col2\" >1.29e-04</td>\n",
       "      <td id=\"T_ffb57_row10_col3\" class=\"data row10 col3\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row11\" class=\"row_heading level0 row11\" >Half_Sine_r2</th>\n",
       "      <td id=\"T_ffb57_row11_col0\" class=\"data row11 col0\" >-0.004</td>\n",
       "      <td id=\"T_ffb57_row11_col1\" class=\"data row11 col1\" >0.6879</td>\n",
       "      <td id=\"T_ffb57_row11_col2\" class=\"data row11 col2\" >2.72e-04</td>\n",
       "      <td id=\"T_ffb57_row11_col3\" class=\"data row11 col3\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row12\" class=\"row_heading level0 row12\" >amp_smooth_fol</th>\n",
       "      <td id=\"T_ffb57_row12_col0\" class=\"data row12 col0\" >0.006</td>\n",
       "      <td id=\"T_ffb57_row12_col1\" class=\"data row12 col1\" >0.5662</td>\n",
       "      <td id=\"T_ffb57_row12_col2\" class=\"data row12 col2\" >4.13e-04</td>\n",
       "      <td id=\"T_ffb57_row12_col3\" class=\"data row12 col3\" >True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row13\" class=\"row_heading level0 row13\" >Sawtooth_Up_r2</th>\n",
       "      <td id=\"T_ffb57_row13_col0\" class=\"data row13 col0\" >-0.003</td>\n",
       "      <td id=\"T_ffb57_row13_col1\" class=\"data row13 col1\" >0.6689</td>\n",
       "      <td id=\"T_ffb57_row13_col2\" class=\"data row13 col2\" >0.007</td>\n",
       "      <td id=\"T_ffb57_row13_col3\" class=\"data row13 col3\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row14\" class=\"row_heading level0 row14\" >Gaussian_r2</th>\n",
       "      <td id=\"T_ffb57_row14_col0\" class=\"data row14 col0\" >-0.003</td>\n",
       "      <td id=\"T_ffb57_row14_col1\" class=\"data row14 col1\" >0.6378</td>\n",
       "      <td id=\"T_ffb57_row14_col2\" class=\"data row14 col2\" >0.008</td>\n",
       "      <td id=\"T_ffb57_row14_col3\" class=\"data row14 col3\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row15\" class=\"row_heading level0 row15\" >slope_m_to_nadir</th>\n",
       "      <td id=\"T_ffb57_row15_col0\" class=\"data row15 col0\" >0.594</td>\n",
       "      <td id=\"T_ffb57_row15_col1\" class=\"data row15 col1\" >0.0048</td>\n",
       "      <td id=\"T_ffb57_row15_col2\" class=\"data row15 col2\" >0.034</td>\n",
       "      <td id=\"T_ffb57_row15_col3\" class=\"data row15 col3\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row16\" class=\"row_heading level0 row16\" >Mean_Temperature</th>\n",
       "      <td id=\"T_ffb57_row16_col0\" class=\"data row16 col0\" >-1.12e-05</td>\n",
       "      <td id=\"T_ffb57_row16_col1\" class=\"data row16 col1\" >0.5362</td>\n",
       "      <td id=\"T_ffb57_row16_col2\" class=\"data row16 col2\" >0.141</td>\n",
       "      <td id=\"T_ffb57_row16_col3\" class=\"data row16 col3\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row17\" class=\"row_heading level0 row17\" >acrophase_day</th>\n",
       "      <td id=\"T_ffb57_row17_col0\" class=\"data row17 col0\" >5.41e-04</td>\n",
       "      <td id=\"T_ffb57_row17_col1\" class=\"data row17 col1\" >0.6006</td>\n",
       "      <td id=\"T_ffb57_row17_col2\" class=\"data row17 col2\" >0.181</td>\n",
       "      <td id=\"T_ffb57_row17_col3\" class=\"data row17 col3\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row18\" class=\"row_heading level0 row18\" >mean_fol</th>\n",
       "      <td id=\"T_ffb57_row18_col0\" class=\"data row18 col0\" >-1.03e-05</td>\n",
       "      <td id=\"T_ffb57_row18_col1\" class=\"data row18 col1\" >0.5969</td>\n",
       "      <td id=\"T_ffb57_row18_col2\" class=\"data row18 col2\" >0.252</td>\n",
       "      <td id=\"T_ffb57_row18_col3\" class=\"data row18 col3\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row19\" class=\"row_heading level0 row19\" >slope_acrophase_to_m</th>\n",
       "      <td id=\"T_ffb57_row19_col0\" class=\"data row19 col0\" >-0.005</td>\n",
       "      <td id=\"T_ffb57_row19_col1\" class=\"data row19 col1\" >0.6696</td>\n",
       "      <td id=\"T_ffb57_row19_col2\" class=\"data row19 col2\" >0.262</td>\n",
       "      <td id=\"T_ffb57_row19_col3\" class=\"data row19 col3\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row20\" class=\"row_heading level0 row20\" >dur_fol</th>\n",
       "      <td id=\"T_ffb57_row20_col0\" class=\"data row20 col0\" >-5.87e-04</td>\n",
       "      <td id=\"T_ffb57_row20_col1\" class=\"data row20 col1\" >0.5433</td>\n",
       "      <td id=\"T_ffb57_row20_col2\" class=\"data row20 col2\" >0.290</td>\n",
       "      <td id=\"T_ffb57_row20_col3\" class=\"data row20 col3\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row21\" class=\"row_heading level0 row21\" >nadir_angle_fol</th>\n",
       "      <td id=\"T_ffb57_row21_col0\" class=\"data row21 col0\" >5.59e-04</td>\n",
       "      <td id=\"T_ffb57_row21_col1\" class=\"data row21 col1\" >0.5269</td>\n",
       "      <td id=\"T_ffb57_row21_col2\" class=\"data row21 col2\" >0.352</td>\n",
       "      <td id=\"T_ffb57_row21_col3\" class=\"data row21 col3\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row22\" class=\"row_heading level0 row22\" >Standard_Deviation</th>\n",
       "      <td id=\"T_ffb57_row22_col0\" class=\"data row22 col0\" >7.10e-04</td>\n",
       "      <td id=\"T_ffb57_row22_col1\" class=\"data row22 col1\" >0.5734</td>\n",
       "      <td id=\"T_ffb57_row22_col2\" class=\"data row22 col2\" >0.390</td>\n",
       "      <td id=\"T_ffb57_row22_col3\" class=\"data row22 col3\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row23\" class=\"row_heading level0 row23\" >Amplitude</th>\n",
       "      <td id=\"T_ffb57_row23_col0\" class=\"data row23 col0\" >6.42e-04</td>\n",
       "      <td id=\"T_ffb57_row23_col1\" class=\"data row23 col1\" >0.6277</td>\n",
       "      <td id=\"T_ffb57_row23_col2\" class=\"data row23 col2\" >0.515</td>\n",
       "      <td id=\"T_ffb57_row23_col3\" class=\"data row23 col3\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row24\" class=\"row_heading level0 row24\" >Skewness</th>\n",
       "      <td id=\"T_ffb57_row24_col0\" class=\"data row24 col0\" >-0.103</td>\n",
       "      <td id=\"T_ffb57_row24_col1\" class=\"data row24 col1\" >0.0000</td>\n",
       "      <td id=\"T_ffb57_row24_col2\" class=\"data row24 col2\" >0.586</td>\n",
       "      <td id=\"T_ffb57_row24_col3\" class=\"data row24 col3\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row25\" class=\"row_heading level0 row25\" >Kurtosis</th>\n",
       "      <td id=\"T_ffb57_row25_col0\" class=\"data row25 col0\" >-0.029</td>\n",
       "      <td id=\"T_ffb57_row25_col1\" class=\"data row25 col1\" >0.1089</td>\n",
       "      <td id=\"T_ffb57_row25_col2\" class=\"data row25 col2\" >0.641</td>\n",
       "      <td id=\"T_ffb57_row25_col3\" class=\"data row25 col3\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row26\" class=\"row_heading level0 row26\" >mean_lut</th>\n",
       "      <td id=\"T_ffb57_row26_col0\" class=\"data row26 col0\" >-3.59e-06</td>\n",
       "      <td id=\"T_ffb57_row26_col1\" class=\"data row26 col1\" >0.5124</td>\n",
       "      <td id=\"T_ffb57_row26_col2\" class=\"data row26 col2\" >0.688</td>\n",
       "      <td id=\"T_ffb57_row26_col3\" class=\"data row26 col3\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row27\" class=\"row_heading level0 row27\" >M5</th>\n",
       "      <td id=\"T_ffb57_row27_col0\" class=\"data row27 col0\" >-4.30e-06</td>\n",
       "      <td id=\"T_ffb57_row27_col1\" class=\"data row27 col1\" >0.5808</td>\n",
       "      <td id=\"T_ffb57_row27_col2\" class=\"data row27 col2\" >0.723</td>\n",
       "      <td id=\"T_ffb57_row27_col3\" class=\"data row27 col3\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row28\" class=\"row_heading level0 row28\" >nadir_day</th>\n",
       "      <td id=\"T_ffb57_row28_col0\" class=\"data row28 col0\" >-2.28e-04</td>\n",
       "      <td id=\"T_ffb57_row28_col1\" class=\"data row28 col1\" >0.5758</td>\n",
       "      <td id=\"T_ffb57_row28_col2\" class=\"data row28 col2\" >0.726</td>\n",
       "      <td id=\"T_ffb57_row28_col3\" class=\"data row28 col3\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row29\" class=\"row_heading level0 row29\" >acrophase_angle_lut</th>\n",
       "      <td id=\"T_ffb57_row29_col0\" class=\"data row29 col0\" >-3.71e-04</td>\n",
       "      <td id=\"T_ffb57_row29_col1\" class=\"data row29 col1\" >0.6151</td>\n",
       "      <td id=\"T_ffb57_row29_col2\" class=\"data row29 col2\" >0.745</td>\n",
       "      <td id=\"T_ffb57_row29_col3\" class=\"data row29 col3\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row30\" class=\"row_heading level0 row30\" >slope_nadir_to_acrophase</th>\n",
       "      <td id=\"T_ffb57_row30_col0\" class=\"data row30 col0\" >-0.009</td>\n",
       "      <td id=\"T_ffb57_row30_col1\" class=\"data row30 col1\" >0.0179</td>\n",
       "      <td id=\"T_ffb57_row30_col2\" class=\"data row30 col2\" >0.786</td>\n",
       "      <td id=\"T_ffb57_row30_col3\" class=\"data row30 col3\" >False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th id=\"T_ffb57_level0_row31\" class=\"row_heading level0 row31\" >L5</th>\n",
       "      <td id=\"T_ffb57_row31_col0\" class=\"data row31 col0\" >-2.09e-06</td>\n",
       "      <td id=\"T_ffb57_row31_col1\" class=\"data row31 col1\" >0.5346</td>\n",
       "      <td id=\"T_ffb57_row31_col2\" class=\"data row31 col2\" >0.802</td>\n",
       "      <td id=\"T_ffb57_row31_col3\" class=\"data row31 col3\" >False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n"
      ],
      "text/plain": [
       "<pandas.io.formats.style.Styler at 0x33e74a7d0>"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "summary_var_table = summary_var_table[['Coefficient_SDvsAge', 'ICC', 'P_value', 'BonferroniTest']]\n",
    "\n",
    "# 2) apply different formats per column\n",
    "styled_table = summary_var_table_7.style.format({\n",
    "    'Coefficient_SDvsAge':  fmt_small_conditional,\n",
    "    'P_value':               fmt_small_conditional,\n",
    "    'ICC':                   '{:.4f}',\n",
    "    'Q_value':               fmt_small_conditional})\n",
    "\n",
    "# 3) display it\n",
    "styled_table"
   ]
  }
 ],
 "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.10.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
