{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"},{"sourceId":165404,"sourceType":"modelInstanceVersion","modelInstanceId":140738,"modelId":163343}],"dockerImageVersionId":30804,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Import Module","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport os\nimport numpy as np\nfrom scipy import stats\nfrom concurrent.futures import ThreadPoolExecutor\nfrom tqdm import tqdm\nimport seaborn as sns\nimport matplotlib.pyplot as plt","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:51:47.921653Z","iopub.execute_input":"2024-12-13T12:51:47.922080Z","iopub.status.idle":"2024-12-13T12:51:47.931032Z","shell.execute_reply.started":"2024-12-13T12:51:47.922041Z","shell.execute_reply":"2024-12-13T12:51:47.929592Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Load Data","metadata":{}},{"cell_type":"code","source":"train_df_path = '/kaggle/input/child-mind-institute-problematic-internet-use/train.csv'\ntrain_df = pd.read_csv(train_df_path)\ntest_df_path = '/kaggle/input/child-mind-institute-problematic-internet-use/test.csv'\ntest_df = pd.read_csv(test_df_path)\ntrain_parquet_path = \"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\"\ntest_parquet_path = \"/kaggle/input/child-mind-institute-problematic-internet-use/series_test.parquet\"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:51:47.933489Z","iopub.execute_input":"2024-12-13T12:51:47.933998Z","iopub.status.idle":"2024-12-13T12:51:47.987258Z","shell.execute_reply.started":"2024-12-13T12:51:47.933933Z","shell.execute_reply":"2024-12-13T12:51:47.985740Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Preprocess Training Data","metadata":{}},{"cell_type":"code","source":"def Preprocess_Training_Data(train_df: pd.DataFrame) -> pd.DataFrame: \n    return_df = train_df.copy()\n\n    age_masks = {\n        '5-7': (return_df['Basic_Demos-Age'] >= 5) & (return_df['Basic_Demos-Age'] <= 7),\n        '8-10': (return_df['Basic_Demos-Age'] >= 8) & (return_df['Basic_Demos-Age'] <= 10),\n        '11-13': (return_df['Basic_Demos-Age'] >= 11) & (return_df['Basic_Demos-Age'] <= 13),\n        '14-17': (return_df['Basic_Demos-Age'] >= 14) & (return_df['Basic_Demos-Age'] <= 17),\n        '18-22': (return_df['Basic_Demos-Age'] >= 18) & (return_df['Basic_Demos-Age'] <= 22),\n    }\n\n    sex_masks = {\n        '1': return_df['Basic_Demos-Sex'] == 1,\n        '0': return_df['Basic_Demos-Sex'] == 0,\n    }\n\n    season_features = ['CGAS-Season', 'Physical-Season', 'Fitness_Endurance-Season', 'FGC-Season', 'BIA-Season', 'SDS-Season']\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            for season_feature in season_features:\n                if return_df.loc[age_mask & sex_mask, season_feature].value_counts().empty:\n                    most_season = return_df[season_feature].value_counts().index[0]\n                    return_df.loc[sex_mask & age_mask & return_df[season_feature].isna(), season_feature] = most_season\n                else:\n                    most_season = return_df.loc[age_mask & sex_mask, season_feature].value_counts().index[0]\n                    return_df.loc[sex_mask & age_mask & return_df[season_feature].isna(), season_feature] = most_season\n    \n    # Physical Measures --------------------------------------------------------------------------------------------------- #\n    physical_measures = ['Physical-BMI', 'Physical-Height', 'Physical-Weight', 'Physical-Waist_Circumference', 'Physical-Diastolic_BP', 'Physical-Systolic_BP', 'Physical-HeartRate']\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            for physical_measure in physical_measures:\n                median = np.nan\n                if return_df.loc[age_mask & sex_mask, physical_measure].notna().any():\n                    median = return_df.loc[age_mask & sex_mask, physical_measure].median()\n                elif return_df.loc[sex_mask, physical_measure].notna().any():\n                    median = return_df.loc[sex_mask, physical_measure].median()\n                else:\n                    median = return_df[physical_measure].median()\n                return_df.loc[sex_mask & age_mask & return_df[physical_measure].isna(), physical_measure] = median\n\n    # Children's Global Assessment Scale ---------------------------------------------------------------------------------- #\n    return_df.loc[(return_df['CGAS-CGAS_Score']>100)|(return_df['CGAS-CGAS_Score']<0), 'CGAS-CGAS_Score'] = pd.NA\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            median = np.nan\n            if return_df.loc[age_mask & sex_mask, 'CGAS-CGAS_Score'].notna().any():\n                median = return_df.loc[age_mask & sex_mask, 'CGAS-CGAS_Score'].median()\n            elif return_df.loc[sex_mask, 'CGAS-CGAS_Score'].notna().any():\n                median = return_df.loc[sex_mask, 'CGAS-CGAS_Score'].median()\n            else:\n                median = return_df['CGAS-CGAS_Score'].median()\n            return_df.loc[sex_mask & age_mask & return_df['CGAS-CGAS_Score'].isna(), 'CGAS-CGAS_Score'] = median\n    \n    # FitnessGram Vitals and Treadmill ------------------------------------------------------------------------------------ #\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            mean_max_stage = np.nan\n            if return_df.loc[age_mask & sex_mask, 'Fitness_Endurance-Max_Stage'].notna().any():\n                mean_max_stage = return_df.loc[age_mask & sex_mask, 'Fitness_Endurance-Max_Stage'].median()\n            elif return_df.loc[sex_mask, 'Fitness_Endurance-Max_Stage'].notna().any():\n                mean_max_stage = return_df.loc[sex_mask, 'Fitness_Endurance-Max_Stage'].median()\n            else:\n                mean_max_stage = return_df['Fitness_Endurance-Max_Stage'].median()\n            return_df.loc[sex_mask & age_mask & return_df['Fitness_Endurance-Max_Stage'].isna(), 'Fitness_Endurance-Max_Stage'] = mean_max_stage\n            mean_sec = np.nan\n            if return_df.loc[age_mask & sex_mask, 'Fitness_Endurance-Time_Sec'].notna().any():\n                mean_sec = return_df.loc[age_mask & sex_mask, 'Fitness_Endurance-Time_Sec'].median()\n            elif return_df.loc[sex_mask, 'Fitness_Endurance-Time_Sec'].notna().any():\n                mean_sec = return_df.loc[sex_mask, 'Fitness_Endurance-Time_Sec'].median()\n            else:\n                mean_sec = return_df['Fitness_Endurance-Time_Sec'].median()\n            return_df.loc[sex_mask & age_mask & return_df['Fitness_Endurance-Time_Sec'].isna(), 'Fitness_Endurance-Time_Sec'] = mean_sec\n\n    # FitnessGram Child --------------------------------------------------------------------------------------------------- #\n    two_categorical_fgc_features = ['FGC-FGC_CU', 'FGC-FGC_PU', 'FGC-FGC_SRL', 'FGC-FGC_SRR', 'FGC-FGC_TL']\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items(): \n            for fgc_feature in two_categorical_fgc_features:\n                zone = fgc_feature+'_Zone'\n                mean = np.nan\n                if return_df.loc[age_mask & sex_mask & (return_df[zone]==1), fgc_feature].notna().any():\n                    mean = return_df.loc[age_mask & sex_mask & (return_df[zone]==1), fgc_feature].mean()\n                else:\n                    mean = return_df.loc[return_df[zone]==1, fgc_feature].mean()\n                return_df.loc[sex_mask & age_mask & return_df[fgc_feature].isna(), fgc_feature] = mean\n                return_df.loc[sex_mask & age_mask & return_df[zone].isna(), zone] = 1\n\n    three_categorical_fgc_features = ['FGC-FGC_GSND', 'FGC-FGC_GSD']\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            for fgc_feature in three_categorical_fgc_features:\n                zone = fgc_feature+'_Zone'\n                mean = np.nan\n                if return_df.loc[age_mask & sex_mask & (return_df[zone]==2), fgc_feature].notna().any():\n                    mean = return_df.loc[age_mask & sex_mask & (return_df[zone]==2), fgc_feature].mean()\n                else:\n                    mean = return_df.loc[return_df[zone]==2, fgc_feature].mean()\n                return_df.loc[sex_mask & age_mask & return_df[fgc_feature].isna(), fgc_feature] = mean\n                return_df.loc[sex_mask & age_mask & return_df[zone].isna(), zone] = 2\n    \n    # Sleep Disturbance Scale --------------------------------------------------------------------------------------------- #\n    return_df.loc[(return_df['SDS-SDS_Total_Raw']>100)|(return_df['SDS-SDS_Total_Raw']<0), 'SDS-SDS_Total_Raw'] = pd.NA\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            mean_sds = np.nan\n            if return_df.loc[age_mask & sex_mask, 'SDS-SDS_Total_Raw'].notna().any():\n                mean_sds = return_df.loc[age_mask & sex_mask, 'SDS-SDS_Total_Raw'].mean()\n            elif return_df.loc[sex_mask, 'SDS-SDS_Total_Raw'].notna().any():\n                mean_sds = return_df.loc[sex_mask, 'SDS-SDS_Total_Raw'].mean()\n            else:\n                mean_sds = return_df['SDS-SDS_Total_Raw'].mean()\n            return_df.loc[sex_mask & age_mask & return_df['SDS-SDS_Total_Raw'].isna(), 'SDS-SDS_Total_Raw'] = mean_sds\n    \n    # Bio-electric Impedance Analysis ------------------------------------------------------------------------------------- #\n    numerical_bia_features = ['BIA-BIA_BMC', 'BIA-BIA_BMI', 'BIA-BIA_BMR', 'BIA-BIA_DEE', 'BIA-BIA_ECW', 'BIA-BIA_FFM',\n       'BIA-BIA_FFMI', 'BIA-BIA_FMI', 'BIA-BIA_Fat', 'BIA-BIA_ICW', 'BIA-BIA_LDM', 'BIA-BIA_LST', 'BIA-BIA_SMM', 'BIA-BIA_TBW']\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            for bia_features in numerical_bia_features:\n                mean = np.nan\n                if return_df.loc[age_mask & sex_mask, bia_features].notna().any():\n                    mean = return_df.loc[age_mask & sex_mask, bia_features].mean()\n                elif return_df.loc[sex_mask, bia_features].notna().any():\n                    mean = return_df.loc[sex_mask, bia_features].mean()\n                else:\n                    mean = return_df[bia_features].mean()\n                return_df.loc[sex_mask & age_mask & return_df[bia_features].isna(), bia_features] = mean\n    return_df.loc[return_df['BIA-BIA_Activity_Level_num'].isna(), 'BIA-BIA_Activity_Level_num'] = 3\n    return_df.loc[return_df['BIA-BIA_Frame_num'].isna(), 'BIA-BIA_Frame_num'] = 2\n\n    # Physical Activity Questionnaire ------------------------------------------------------------------------------------- #\n    age_masks_PAQ = {\n        '5-13': (return_df['Basic_Demos-Age'] >= 5) & (return_df['Basic_Demos-Age'] <= 13),\n        '14-22': (return_df['Basic_Demos-Age'] >= 14) & (return_df['Basic_Demos-Age'] <= 22)\n    }\n    return_df['PAQ_Total'] = return_df['PAQ_A-PAQ_A_Total'].combine_first(return_df['PAQ_C-PAQ_C_Total'])\n    return_df['PAQ_Season'] = return_df['PAQ_A-Season'].combine_first(return_df['PAQ_C-Season'])\n    for range_label, age_mask in age_masks_PAQ.items():\n        for sex_label, sex_mask in sex_masks.items():\n            mean_paq = return_df.loc[age_mask & sex_mask, 'PAQ_Total'].mean()\n            return_df.loc[sex_mask & age_mask & return_df['PAQ_Total'].isna(), 'PAQ_Total'] = mean_paq\n            most_paq_season = return_df.loc[age_mask & sex_mask, 'PAQ_Season'].value_counts().index[0]\n            return_df.loc[sex_mask & age_mask & return_df['PAQ_Season'].isna(), 'PAQ_Season'] = most_paq_season\n    \n    return_df.drop(['Basic_Demos-Enroll_Season', 'PAQ_A-PAQ_A_Total', 'PAQ_C-PAQ_C_Total', 'PAQ_A-Season', 'PAQ_C-Season', 'SDS-SDS_Total_T', 'Fitness_Endurance-Time_Mins', 'PreInt_EduHx-Season', 'PreInt_EduHx-computerinternet_hoursday'], axis=1, inplace=True)\n    return_df.drop(['PCIAT-PCIAT_01', 'PCIAT-PCIAT_02', 'PCIAT-PCIAT_03', 'PCIAT-PCIAT_04', 'PCIAT-PCIAT_05', 'PCIAT-PCIAT_06', 'PCIAT-PCIAT_07', 'PCIAT-PCIAT_08', 'PCIAT-PCIAT_09', 'PCIAT-PCIAT_10',\n       'PCIAT-PCIAT_11', 'PCIAT-PCIAT_12', 'PCIAT-PCIAT_13', 'PCIAT-PCIAT_14', 'PCIAT-PCIAT_15', 'PCIAT-PCIAT_16', 'PCIAT-PCIAT_17', 'PCIAT-PCIAT_18', 'PCIAT-PCIAT_19', 'PCIAT-PCIAT_20'], axis=1, inplace=True)\n        \n    return return_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:51:48.169354Z","iopub.execute_input":"2024-12-13T12:51:48.169911Z","iopub.status.idle":"2024-12-13T12:51:48.214735Z","shell.execute_reply.started":"2024-12-13T12:51:48.169841Z","shell.execute_reply":"2024-12-13T12:51:48.213466Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Preprocess Training Parquet","metadata":{}},{"cell_type":"code","source":"def Preprocess_Training_Parquet(train_parquet_path) -> pd.DataFrame:\n    def Preprocess_Parquet(parquet: pd.DataFrame) -> pd.DataFrame:\n        data = parquet.copy()\n        data['timestamp'] = pd.to_datetime(data['relative_date_PCIAT'], unit='D') + pd.to_timedelta(data['time_of_day'])\n        # remenber the non-wear-flag \n        non_wear_flag = data['non-wear_flag'].sum()\n        total = len(data['non-wear_flag'])\n        \n        data = data[data['non-wear_flag'] == 0]\n        hour = pd.to_datetime(data['time_of_day']).dt.hour\n        time_masks = {\n            'morning': (hour >= 6) & (hour < 12),\n            'afternoon': (hour >= 12) & (hour < 17),\n            'evening': (hour >= 17) & (hour < 22),\n            'night': (hour >= 22) | (hour < 6)\n        }\n        \n        features = dict()\n        # season -----------------------------------------------------------------------------------------------#\n        features.update({\n            'actigraphy_season': data['quarter'].value_counts().index[0]\n        })\n        # weekend vs weekday -----------------------------------------------------------------------------------#\n        proportions = data['weekday'].isin([6, 7]).value_counts(normalize=True).to_dict()\n        features.update({\n            'weekend/weekday': proportions.get(True, 0)\n        })\n        # time base data ---------------------------------------------------------------------------------------#\n        for period, mask in time_masks.items():\n            features.update({\n                f'{period}_enmo_mean': data.loc[mask, 'enmo'].mean(),\n                f'{period}_enmo_std': data.loc[mask, 'enmo'].std(),\n                f'{period}_anglez_std': data.loc[mask, 'anglez'].std(),\n            })\n        # sleep quality ----------------------------------------------------------------------------------------#\n        sleep_hours = time_masks['night']\n        features.update({\n            'sleep_disruption_count': len(data.loc[sleep_hours & (data['enmo'] > data['enmo'].mean() + 2 * data['enmo'].std())]),\n            'light_exposure_during_sleep': data.loc[sleep_hours, 'light'].mean(),\n            'light_exposure_during_sleep_std': data.loc[sleep_hours, 'light'].std(),\n            'light_exposure_during_sleep_disruption': len(data.loc[sleep_hours & (data['light'] > data['light'].mean() + 2 * data['light'].std())]),\n            'sleep_position_changes': len(data.loc[sleep_hours & (abs(data['anglez'].diff()) > 60)]),\n            'good_sleep_cycle': int(data.loc[sleep_hours, 'light'].mean() < 50)\n        })\n        # non-wear metrices ------------------------------------------------------------------------------------#\n        features.update({\n            'wear_consistency': non_wear_flag / total,\n        })\n        # arm movement -----------------------------------------------------------------------------------------#\n        bins = [-90, -60, -30, 0, 30, 60, 90]\n        labels = ['anglez -90 to -60', 'anglez -60 to -30', 'anglez -30 to 0', 'anglez 0 to 30', 'anglez 30 to 60', 'anglez 60 to 90']\n        interval_proportion_dict = pd.cut(data['anglez'], bins=bins, labels=labels, right=False).value_counts(normalize=True).sort_index().to_dict()\n        features.update(interval_proportion_dict)\n\n        return pd.DataFrame([features])\n    \n    ids = os.listdir(train_parquet_path)\n    data_frames = []\n    for file_id in tqdm(ids, desc=\"Preprocess Training Parquet\"):\n        result = Preprocess_Parquet(pd.read_parquet(os.path.join(train_parquet_path, file_id, 'part-0.parquet')))\n        result['id'] = file_id.split('=')[1]\n        data_frames.append(result)\n\n    return pd.concat(data_frames, ignore_index=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:51:48.216753Z","iopub.execute_input":"2024-12-13T12:51:48.217176Z","iopub.status.idle":"2024-12-13T12:51:48.238904Z","shell.execute_reply.started":"2024-12-13T12:51:48.217139Z","shell.execute_reply":"2024-12-13T12:51:48.237549Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Merging data and qarquet","metadata":{}},{"cell_type":"code","source":"def Merging_Data_Parquet(data, parquet) -> pd.DataFrame:\n    merged_train_df = pd.merge(data, parquet, on='id', how='left')\n    merged_train_df['with_parquet'] = merged_train_df['actigraphy_season'].notna()\n    sex_masks = {\n        '1': merged_train_df['Basic_Demos-Sex'] == 1,\n        '0': merged_train_df['Basic_Demos-Sex'] == 0,\n    }\n\n    # --------------------------------------------------------------------------------------------------- #\n    time_zone_datas = ['morning_enmo_mean', 'morning_enmo_std', 'morning_anglez_std', 'afternoon_enmo_mean', 'afternoon_enmo_std', 'afternoon_anglez_std',\n                       'evening_enmo_mean', 'evening_enmo_std', 'evening_anglez_std', 'night_enmo_mean', 'night_enmo_std', 'night_anglez_std']\n    for sex_label, sex_mask in sex_masks.items():\n        for time_zone_data in time_zone_datas:\n            mean = np.nan\n            if merged_train_df.loc[sex_mask, time_zone_data].notna().any():\n                mean = merged_train_df.loc[sex_mask, time_zone_data].mean()\n            else:\n                mean = merged_train_df[time_zone_data].mean()\n            merged_train_df.loc[sex_mask & merged_train_df[time_zone_data].isna(), time_zone_data] = mean\n\n    # --------------------------------------------------------------------------------------------------- #\n    sleep_datas = ['sleep_disruption_count', 'light_exposure_during_sleep', 'light_exposure_during_sleep_std', \n                   'light_exposure_during_sleep_disruption', 'sleep_position_changes', 'good_sleep_cycle']\n    for sex_label, sex_mask in sex_masks.items():\n        for sleep_data in sleep_datas:\n            median = np.nan\n            if merged_train_df.loc[sex_mask, sleep_data].notna().any():\n                median = merged_train_df.loc[sex_mask, sleep_data].median()\n            else:\n                median = merged_train_df[sleep_data].median()\n            merged_train_df.loc[sex_mask & merged_train_df[sleep_data].isna(), sleep_data] = median\n\n    # --------------------------------------------------------------------------------------------------- #\n    angles_datas = ['anglez -90 to -60', 'anglez -60 to -30', 'anglez -30 to 0', 'anglez 0 to 30', 'anglez 30 to 60', 'anglez 60 to 90']\n    for sex_label, sex_mask in sex_masks.items():\n        for angles_data in angles_datas:\n            mean = np.nan\n            if merged_train_df.loc[sex_mask, angles_data].notna().any():\n                mean = merged_train_df.loc[sex_mask, angles_data].mean()\n            else:\n                mean = merged_train_df[angles_data].mean()\n            merged_train_df.loc[sex_mask & merged_train_df[angles_data].isna(), angles_data] = mean\n\n    season_mapping = {'Spring': 1, 'Summer': 2, 'Fall': 3, 'Winter': 4}\n    merged_train_df['CGAS-Season'] = merged_train_df['CGAS-Season'].map(season_mapping)\n    merged_train_df['Physical-Season'] = merged_train_df['Physical-Season'].map(season_mapping)\n    merged_train_df['FGC-Season'] = merged_train_df['FGC-Season'].map(season_mapping)\n    merged_train_df['Fitness_Endurance-Season'] = merged_train_df['Fitness_Endurance-Season'].map(season_mapping)\n    merged_train_df['BIA-Season'] = merged_train_df['BIA-Season'].map(season_mapping)\n    merged_train_df['PCIAT-Season'] = merged_train_df['PCIAT-Season'].map(season_mapping)\n    merged_train_df['SDS-Season'] = merged_train_df['SDS-Season'].map(season_mapping)\n    merged_train_df['PAQ_Season'] = merged_train_df['PAQ_Season'].map(season_mapping)\n    \n    columns_to_exclude = ['PCIAT-Season', 'PCIAT-PCIAT_Total', 'sii']\n    merged_train_df.fillna({col: 0 for col in merged_train_df.columns if col not in columns_to_exclude}, inplace=True)\n    \n    return merged_train_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:51:48.240315Z","iopub.execute_input":"2024-12-13T12:51:48.240647Z","iopub.status.idle":"2024-12-13T12:51:48.262174Z","shell.execute_reply.started":"2024-12-13T12:51:48.240618Z","shell.execute_reply":"2024-12-13T12:51:48.261191Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Preprocessing","metadata":{}},{"cell_type":"code","source":"post_train_data = Preprocess_Training_Data(train_df)\npost_train_parquet = Preprocess_Training_Parquet(train_parquet_path)\nmerged_train_df = Merging_Data_Parquet(post_train_data, post_train_parquet)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:51:48.265458Z","iopub.execute_input":"2024-12-13T12:51:48.265854Z","iopub.status.idle":"2024-12-13T12:55:05.554334Z","shell.execute_reply.started":"2024-12-13T12:51:48.265817Z","shell.execute_reply":"2024-12-13T12:55:05.553090Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"check_nan = merged_train_df[merged_train_df['with_parquet']==True].isna().sum()\ncheck_nan.sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:05.555773Z","iopub.execute_input":"2024-12-13T12:55:05.556139Z","iopub.status.idle":"2024-12-13T12:55:05.569273Z","shell.execute_reply.started":"2024-12-13T12:55:05.556104Z","shell.execute_reply":"2024-12-13T12:55:05.568049Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"post_train_data['sii'].isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:05.571000Z","iopub.execute_input":"2024-12-13T12:55:05.571400Z","iopub.status.idle":"2024-12-13T12:55:05.581370Z","shell.execute_reply.started":"2024-12-13T12:55:05.571361Z","shell.execute_reply":"2024-12-13T12:55:05.579986Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"merged_train_df['sii'].isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:05.582784Z","iopub.execute_input":"2024-12-13T12:55:05.583168Z","iopub.status.idle":"2024-12-13T12:55:05.606167Z","shell.execute_reply.started":"2024-12-13T12:55:05.583129Z","shell.execute_reply":"2024-12-13T12:55:05.603706Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"merged_train_df['PCIAT-Season'].isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:05.608007Z","iopub.execute_input":"2024-12-13T12:55:05.608541Z","iopub.status.idle":"2024-12-13T12:55:05.636125Z","shell.execute_reply.started":"2024-12-13T12:55:05.608481Z","shell.execute_reply":"2024-12-13T12:55:05.634093Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"merged_train_df['PCIAT-PCIAT_Total'].isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:05.638400Z","iopub.execute_input":"2024-12-13T12:55:05.638865Z","iopub.status.idle":"2024-12-13T12:55:05.656034Z","shell.execute_reply.started":"2024-12-13T12:55:05.638817Z","shell.execute_reply":"2024-12-13T12:55:05.654763Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Preprocess Test Data","metadata":{}},{"cell_type":"code","source":"def Preprocess_Test_Data(train_df: pd.DataFrame, test_df: pd.DataFrame) -> pd.DataFrame:\n    total_df = pd.concat([train_df, test_df], ignore_index=True) # contain both \n    total_df.drop_duplicates(subset=['id'])\n    \n    return_df = test_df.copy()\n\n    age_masks = {\n        '5-7': (total_df['Basic_Demos-Age'] >= 5) & (total_df['Basic_Demos-Age'] <= 7),\n        '8-10': (total_df['Basic_Demos-Age'] >= 8) & (total_df['Basic_Demos-Age'] <= 10),\n        '11-13': (total_df['Basic_Demos-Age'] >= 11) & (total_df['Basic_Demos-Age'] <= 13),\n        '14-17': (total_df['Basic_Demos-Age'] >= 14) & (total_df['Basic_Demos-Age'] <= 17),\n        '18-22': (total_df['Basic_Demos-Age'] >= 18) & (total_df['Basic_Demos-Age'] <= 22),\n    }\n\n    sex_masks = {\n        '1': total_df['Basic_Demos-Sex'] == 1,\n        '0': total_df['Basic_Demos-Sex'] == 0,\n    }\n\n    season_features = ['CGAS-Season', 'Physical-Season', 'Fitness_Endurance-Season', 'FGC-Season', 'BIA-Season', 'SDS-Season']\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            for season_feature in season_features:\n                if total_df.loc[age_mask & sex_mask, season_feature].value_counts().empty:\n                    most_season = total_df[season_feature].value_counts().index[0]\n                    return_df.loc[sex_mask & age_mask & return_df[season_feature].isna(), season_feature] = most_season\n                else:\n                    most_season = total_df.loc[age_mask & sex_mask, season_feature].value_counts().index[0]\n                    return_df.loc[sex_mask & age_mask & return_df[season_feature].isna(), season_feature] = most_season\n    \n    # Physical Measures --------------------------------------------------------------------------------------------------- #\n    physical_measures = ['Physical-BMI', 'Physical-Height', 'Physical-Weight', 'Physical-Waist_Circumference', 'Physical-Diastolic_BP', 'Physical-Systolic_BP', 'Physical-HeartRate']\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            for physical_measure in physical_measures:\n                median = np.nan\n                if total_df.loc[age_mask & sex_mask, physical_measure].notna().any():\n                    median = total_df.loc[age_mask & sex_mask, physical_measure].median()\n                elif total_df.loc[sex_mask, physical_measure].notna().any():\n                    median = total_df.loc[sex_mask, physical_measure].median()\n                else:\n                    median = total_df[physical_measure].median()\n                return_df.loc[sex_mask & age_mask & return_df[physical_measure].isna(), physical_measure] = median\n\n    # Children's Global Assessment Scale ---------------------------------------------------------------------------------- #\n    return_df.loc[(return_df['CGAS-CGAS_Score']>100)|(return_df['CGAS-CGAS_Score']<0), 'CGAS-CGAS_Score'] = pd.NA\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            median = np.nan\n            if total_df.loc[age_mask & sex_mask, 'CGAS-CGAS_Score'].notna().any():\n                median = total_df.loc[age_mask & sex_mask, 'CGAS-CGAS_Score'].median()\n            elif total_df.loc[sex_mask, 'CGAS-CGAS_Score'].notna().any():\n                median = total_df.loc[sex_mask, 'CGAS-CGAS_Score'].median()\n            else:\n                median = total_df['CGAS-CGAS_Score'].median()\n            return_df.loc[sex_mask & age_mask & return_df['CGAS-CGAS_Score'].isna(), 'CGAS-CGAS_Score'] = median\n    \n    # FitnessGram Vitals and Treadmill ------------------------------------------------------------------------------------ #\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            mean_max_stage = np.nan\n            if total_df.loc[age_mask & sex_mask, 'Fitness_Endurance-Max_Stage'].notna().any():\n                mean_max_stage = total_df.loc[age_mask & sex_mask, 'Fitness_Endurance-Max_Stage'].median()\n            elif total_df.loc[sex_mask, 'Fitness_Endurance-Max_Stage'].notna().any():\n                mean_max_stage = total_df.loc[sex_mask, 'Fitness_Endurance-Max_Stage'].median()\n            else:\n                mean_max_stage = total_df['Fitness_Endurance-Max_Stage'].median()\n            return_df.loc[sex_mask & age_mask & return_df['Fitness_Endurance-Max_Stage'].isna(), 'Fitness_Endurance-Max_Stage'] = mean_max_stage\n            mean_sec = np.nan\n            if total_df.loc[age_mask & sex_mask, 'Fitness_Endurance-Time_Sec'].notna().any():\n                mean_sec = total_df.loc[age_mask & sex_mask, 'Fitness_Endurance-Time_Sec'].median()\n            elif total_df.loc[sex_mask, 'Fitness_Endurance-Time_Sec'].notna().any():\n                mean_sec = total_df.loc[sex_mask, 'Fitness_Endurance-Time_Sec'].median()\n            else:\n                mean_sec = total_df['Fitness_Endurance-Time_Sec'].median()\n            return_df.loc[sex_mask & age_mask & return_df['Fitness_Endurance-Time_Sec'].isna(), 'Fitness_Endurance-Time_Sec'] = mean_sec\n\n    # FitnessGram Child --------------------------------------------------------------------------------------------------- #\n    two_categorical_fgc_features = ['FGC-FGC_CU', 'FGC-FGC_PU', 'FGC-FGC_SRL', 'FGC-FGC_SRR', 'FGC-FGC_TL']\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items(): \n            for fgc_feature in two_categorical_fgc_features:\n                zone = fgc_feature+'_Zone'\n                mean = np.nan\n                if total_df.loc[age_mask & sex_mask & (total_df[zone]==1), fgc_feature].notna().any():\n                    mean = total_df.loc[age_mask & sex_mask & (total_df[zone]==1), fgc_feature].mean()\n                else:\n                    mean = total_df.loc[total_df[zone]==1, fgc_feature].mean()\n                return_df.loc[sex_mask & age_mask & return_df[fgc_feature].isna(), fgc_feature] = mean\n                return_df.loc[sex_mask & age_mask & return_df[zone].isna(), zone] = 1\n\n    three_categorical_fgc_features = ['FGC-FGC_GSND', 'FGC-FGC_GSD']\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            for fgc_feature in three_categorical_fgc_features:\n                zone = fgc_feature+'_Zone'\n                mean = np.nan\n                if total_df.loc[age_mask & sex_mask & (total_df[zone]==2), fgc_feature].notna().any():\n                    mean = total_df.loc[age_mask & sex_mask & (total_df[zone]==2), fgc_feature].mean()\n                else:\n                    mean = total_df.loc[total_df[zone]==2, fgc_feature].mean()\n                return_df.loc[sex_mask & age_mask & return_df[fgc_feature].isna(), fgc_feature] = mean\n                return_df.loc[sex_mask & age_mask & return_df[zone].isna(), zone] = 2\n    \n    # Sleep Disturbance Scale --------------------------------------------------------------------------------------------- #\n    return_df.loc[(return_df['SDS-SDS_Total_Raw']>100)|(return_df['SDS-SDS_Total_Raw']<0), 'SDS-SDS_Total_Raw'] = pd.NA\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            mean_sds = np.nan\n            if total_df.loc[age_mask & sex_mask, 'SDS-SDS_Total_Raw'].notna().any():\n                mean_sds = total_df.loc[age_mask & sex_mask, 'SDS-SDS_Total_Raw'].mean()\n            elif total_df.loc[sex_mask, 'SDS-SDS_Total_Raw'].notna().any():\n                mean_sds = total_df.loc[sex_mask, 'SDS-SDS_Total_Raw'].mean()\n            else:\n                mean_sds = total_df['SDS-SDS_Total_Raw'].mean()\n            return_df.loc[sex_mask & age_mask & return_df['SDS-SDS_Total_Raw'].isna(), 'SDS-SDS_Total_Raw'] = mean_sds\n    \n    # Bio-electric Impedance Analysis ------------------------------------------------------------------------------------- #\n    numerical_bia_features = ['BIA-BIA_BMC', 'BIA-BIA_BMI', 'BIA-BIA_BMR', 'BIA-BIA_DEE', 'BIA-BIA_ECW', 'BIA-BIA_FFM',\n       'BIA-BIA_FFMI', 'BIA-BIA_FMI', 'BIA-BIA_Fat', 'BIA-BIA_ICW', 'BIA-BIA_LDM', 'BIA-BIA_LST', 'BIA-BIA_SMM', 'BIA-BIA_TBW']\n    for range_label, age_mask in age_masks.items():\n        for sex_label, sex_mask in sex_masks.items():\n            for bia_features in numerical_bia_features:\n                mean = np.nan\n                if total_df.loc[age_mask & sex_mask, bia_features].notna().any():\n                    mean = total_df.loc[age_mask & sex_mask, bia_features].mean()\n                elif total_df.loc[sex_mask, bia_features].notna().any():\n                    mean = total_df.loc[sex_mask, bia_features].mean()\n                else:\n                    mean = total_df[bia_features].mean()\n                return_df.loc[sex_mask & age_mask & return_df[bia_features].isna(), bia_features] = mean\n    return_df.loc[return_df['BIA-BIA_Activity_Level_num'].isna(), 'BIA-BIA_Activity_Level_num'] = 3\n    return_df.loc[return_df['BIA-BIA_Frame_num'].isna(), 'BIA-BIA_Frame_num'] = 2\n\n    # Physical Activity Questionnaire ------------------------------------------------------------------------------------- #\n    age_masks_PAQ = {\n        '5-13': (total_df['Basic_Demos-Age'] >= 5) & (total_df['Basic_Demos-Age'] <= 13),\n        '14-22': (total_df['Basic_Demos-Age'] >= 14) & (total_df['Basic_Demos-Age'] <= 22)\n    }\n\n    total_df['PAQ_Total'] = total_df['PAQ_A-PAQ_A_Total'].combine_first(total_df['PAQ_C-PAQ_C_Total'])\n    total_df['PAQ_Season'] = total_df['PAQ_A-Season'].combine_first(total_df['PAQ_C-Season'])\n    return_df['PAQ_Total'] = return_df['PAQ_A-PAQ_A_Total'].combine_first(return_df['PAQ_C-PAQ_C_Total'])\n    return_df['PAQ_Season'] = return_df['PAQ_A-Season'].combine_first(return_df['PAQ_C-Season'])\n    for range_label, age_mask in age_masks_PAQ.items():\n        for sex_label, sex_mask in sex_masks.items():\n            mean_paq = total_df.loc[age_mask & sex_mask, 'PAQ_Total'].mean()\n            return_df.loc[sex_mask & age_mask & return_df['PAQ_Total'].isna(), 'PAQ_Total'] = mean_paq\n            most_paq_season = total_df.loc[age_mask & sex_mask, 'PAQ_Season'].value_counts().index[0]\n            return_df.loc[sex_mask & age_mask & return_df['PAQ_Season'].isna(), 'PAQ_Season'] = most_paq_season\n    \n    return_df.drop(['Basic_Demos-Enroll_Season', 'PAQ_A-PAQ_A_Total', 'PAQ_C-PAQ_C_Total', 'PAQ_A-Season', 'PAQ_C-Season', 'SDS-SDS_Total_T', 'Fitness_Endurance-Time_Mins', 'PreInt_EduHx-Season', 'PreInt_EduHx-computerinternet_hoursday'], axis=1, inplace=True)\n        \n    return return_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:05.661662Z","iopub.execute_input":"2024-12-13T12:55:05.662086Z","iopub.status.idle":"2024-12-13T12:55:05.710940Z","shell.execute_reply.started":"2024-12-13T12:55:05.662046Z","shell.execute_reply":"2024-12-13T12:55:05.707092Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"post_test_data = Preprocess_Test_Data(train_df, test_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:05.712881Z","iopub.execute_input":"2024-12-13T12:55:05.713429Z","iopub.status.idle":"2024-12-13T12:55:07.289839Z","shell.execute_reply.started":"2024-12-13T12:55:05.713390Z","shell.execute_reply":"2024-12-13T12:55:07.288630Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Preprocess Test Parquet","metadata":{}},{"cell_type":"code","source":"## Test data's parquet is same as train data.\npost_test_parquet = Preprocess_Training_Parquet(test_parquet_path)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:07.292492Z","iopub.execute_input":"2024-12-13T12:55:07.292862Z","iopub.status.idle":"2024-12-13T12:55:07.509317Z","shell.execute_reply.started":"2024-12-13T12:55:07.292826Z","shell.execute_reply":"2024-12-13T12:55:07.507823Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Merging test data and test qarquet","metadata":{}},{"cell_type":"code","source":"def Merging_Test_Data_Parquet(train_data, train_parquet, test_data, test_parquet) -> pd.DataFrame:\n    merged_train_df = pd.merge(train_data, train_parquet, on='id', how='left')\n    merged_test_df = pd.merge(test_data, test_parquet, on='id', how='left')\n    merged_train_df['with_parquet'] = merged_train_df['actigraphy_season'].notna()\n    merged_test_df['with_parquet'] = merged_test_df['actigraphy_season'].notna()\n    total_merged_df = pd.concat([merged_train_df, merged_test_df], ignore_index=True)\n    total_merged_df.drop_duplicates(subset=['id'])\n    \n    sex_masks = {\n        '1': total_merged_df['Basic_Demos-Sex'] == 1,\n        '0': total_merged_df['Basic_Demos-Sex'] == 0,\n    }\n\n    # --------------------------------------------------------------------------------------------------- #\n    time_zone_datas = ['morning_enmo_mean', 'morning_enmo_std', 'morning_anglez_std', 'afternoon_enmo_mean', 'afternoon_enmo_std', 'afternoon_anglez_std',\n                       'evening_enmo_mean', 'evening_enmo_std', 'evening_anglez_std', 'night_enmo_mean', 'night_enmo_std', 'night_anglez_std']\n    for sex_label, sex_mask in sex_masks.items():\n        for time_zone_data in time_zone_datas:\n            mean = np.nan\n            if total_merged_df.loc[sex_mask, time_zone_data].notna().any():\n                mean = total_merged_df.loc[sex_mask, time_zone_data].mean()\n            else:\n                mean = total_merged_df[time_zone_data].mean()\n            merged_test_df.loc[sex_mask & merged_test_df[time_zone_data].isna(), time_zone_data] = mean\n\n    # --------------------------------------------------------------------------------------------------- #\n    sleep_datas = ['sleep_disruption_count', 'light_exposure_during_sleep', 'light_exposure_during_sleep_std', \n                   'light_exposure_during_sleep_disruption', 'sleep_position_changes', 'good_sleep_cycle']\n    for sex_label, sex_mask in sex_masks.items():\n        for sleep_data in sleep_datas:\n            median = np.nan\n            if total_merged_df.loc[sex_mask, sleep_data].notna().any():\n                median = total_merged_df.loc[sex_mask, sleep_data].median()\n            else:\n                median = total_merged_df[sleep_data].median()\n            merged_test_df.loc[sex_mask & merged_test_df[sleep_data].isna(), sleep_data] = median\n\n    # --------------------------------------------------------------------------------------------------- #\n    angles_datas = ['anglez -90 to -60', 'anglez -60 to -30', 'anglez -30 to 0', 'anglez 0 to 30', 'anglez 30 to 60', 'anglez 60 to 90']\n    for sex_label, sex_mask in sex_masks.items():\n        for angles_data in angles_datas:\n            mean = np.nan\n            if total_merged_df.loc[sex_mask, angles_data].notna().any():\n                mean = total_merged_df.loc[sex_mask, angles_data].mean()\n            else:\n                mean = total_merged_df[angles_data].mean()\n            merged_test_df.loc[sex_mask & merged_test_df[angles_data].isna(), angles_data] = mean\n\n    season_mapping = {'Spring': 1, 'Summer': 2, 'Fall': 3, 'Winter': 4}\n    merged_test_df['CGAS-Season'] = merged_test_df['CGAS-Season'].map(season_mapping)\n    merged_test_df['Physical-Season'] = merged_test_df['Physical-Season'].map(season_mapping)\n    merged_test_df['FGC-Season'] = merged_test_df['FGC-Season'].map(season_mapping)\n    merged_test_df['Fitness_Endurance-Season'] = merged_test_df['Fitness_Endurance-Season'].map(season_mapping)\n    merged_test_df['BIA-Season'] = merged_test_df['BIA-Season'].map(season_mapping)\n    merged_test_df['SDS-Season'] = merged_test_df['SDS-Season'].map(season_mapping)\n    merged_test_df['PAQ_Season'] = merged_test_df['PAQ_Season'].map(season_mapping)\n    merged_test_df = merged_test_df.fillna(0)\n\n    return merged_test_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:07.511497Z","iopub.execute_input":"2024-12-13T12:55:07.512167Z","iopub.status.idle":"2024-12-13T12:55:07.534477Z","shell.execute_reply.started":"2024-12-13T12:55:07.512103Z","shell.execute_reply":"2024-12-13T12:55:07.533063Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"merged_test_df = Merging_Test_Data_Parquet(post_train_data, post_train_parquet, post_test_data, post_test_parquet)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:07.536514Z","iopub.execute_input":"2024-12-13T12:55:07.537160Z","iopub.status.idle":"2024-12-13T12:55:07.746417Z","shell.execute_reply.started":"2024-12-13T12:55:07.537102Z","shell.execute_reply":"2024-12-13T12:55:07.745165Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"check_nan = merged_test_df[merged_test_df['with_parquet']==True].isna().sum()\ncheck_nan.sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:07.748497Z","iopub.execute_input":"2024-12-13T12:55:07.749097Z","iopub.status.idle":"2024-12-13T12:55:07.761818Z","shell.execute_reply.started":"2024-12-13T12:55:07.749043Z","shell.execute_reply":"2024-12-13T12:55:07.760192Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Result","metadata":{}},{"cell_type":"code","source":"merged_train_df\nmerged_train_df.to_pickle(\"/kaggle/working/merged_train_df.pkl\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:07.763350Z","iopub.execute_input":"2024-12-13T12:55:07.763707Z","iopub.status.idle":"2024-12-13T12:55:07.785719Z","shell.execute_reply.started":"2024-12-13T12:55:07.763672Z","shell.execute_reply":"2024-12-13T12:55:07.784139Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"merged_test_df\nmerged_test_df.to_pickle(\"/kaggle/working/merged_test_df.pkl\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:07.788532Z","iopub.execute_input":"2024-12-13T12:55:07.789040Z","iopub.status.idle":"2024-12-13T12:55:07.801817Z","shell.execute_reply.started":"2024-12-13T12:55:07.788978Z","shell.execute_reply":"2024-12-13T12:55:07.800529Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Check correlation","metadata":{}},{"cell_type":"code","source":"train_df = pd.read_pickle(\"/kaggle/working/merged_train_df.pkl\")\ntest_df = pd.read_pickle(\"/kaggle/working/merged_test_df.pkl\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:07.803399Z","iopub.execute_input":"2024-12-13T12:55:07.803782Z","iopub.status.idle":"2024-12-13T12:55:07.819713Z","shell.execute_reply.started":"2024-12-13T12:55:07.803743Z","shell.execute_reply":"2024-12-13T12:55:07.818309Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"check_corr = train_df.drop(columns=['PCIAT-Season', 'PCIAT-PCIAT_Total', 'id'])\ncorrelation_matrix = check_corr.corr()\n\nsii_correlation = correlation_matrix['sii'].sort_values(ascending=False)\n\nplt.figure(figsize=(10, 8))\nsns.heatmap(correlation_matrix, annot=False, cmap='coolwarm', vmin=-1, vmax=1)\nplt.title('Correlation Matrix with Sii')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:07.821328Z","iopub.execute_input":"2024-12-13T12:55:07.821818Z","iopub.status.idle":"2024-12-13T12:55:08.972880Z","shell.execute_reply.started":"2024-12-13T12:55:07.821770Z","shell.execute_reply":"2024-12-13T12:55:08.971463Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(sii_correlation.to_string())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:08.974404Z","iopub.execute_input":"2024-12-13T12:55:08.974767Z","iopub.status.idle":"2024-12-13T12:55:08.983831Z","shell.execute_reply.started":"2024-12-13T12:55:08.974734Z","shell.execute_reply":"2024-12-13T12:55:08.982514Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Import Module","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport os\nimport numpy as np\nfrom scipy import stats\nfrom concurrent.futures import ThreadPoolExecutor\nfrom tqdm import tqdm\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom imblearn.over_sampling import SMOTE\nimport xgboost as xgb\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.metrics import classification_report\nfrom sklearn.metrics import mean_squared_error, r2_score\nfrom sklearn.ensemble import VotingRegressor, RandomForestRegressor, GradientBoostingRegressor\nimport lightgbm as lgb\nfrom catboost import CatBoostRegressor","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:08.985758Z","iopub.execute_input":"2024-12-13T12:55:08.986269Z","iopub.status.idle":"2024-12-13T12:55:09.006001Z","shell.execute_reply.started":"2024-12-13T12:55:08.986186Z","shell.execute_reply":"2024-12-13T12:55:09.004356Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Load preprocessed data","metadata":{}},{"cell_type":"code","source":"train_df = pd.read_pickle(\"/kaggle/working/merged_train_df.pkl\")\ntest_df = pd.read_pickle(\"/kaggle/working/merged_test_df.pkl\")\ntrain_df.columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:09.008276Z","iopub.execute_input":"2024-12-13T12:55:09.008729Z","iopub.status.idle":"2024-12-13T12:55:09.033405Z","shell.execute_reply.started":"2024-12-13T12:55:09.008689Z","shell.execute_reply":"2024-12-13T12:55:09.031686Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Prepare training data","metadata":{}},{"cell_type":"code","source":"train_df[train_df['sii']==3]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:09.035130Z","iopub.execute_input":"2024-12-13T12:55:09.035637Z","iopub.status.idle":"2024-12-13T12:55:09.092574Z","shell.execute_reply.started":"2024-12-13T12:55:09.035575Z","shell.execute_reply":"2024-12-13T12:55:09.091159Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df = train_df.drop(columns=['PCIAT-Season'])\ntrain_df = train_df.dropna(subset=['PCIAT-PCIAT_Total'])\ntrain_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:09.094403Z","iopub.execute_input":"2024-12-13T12:55:09.094936Z","iopub.status.idle":"2024-12-13T12:55:09.144105Z","shell.execute_reply.started":"2024-12-13T12:55:09.094896Z","shell.execute_reply":"2024-12-13T12:55:09.142888Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.scatter(train_df['PCIAT-PCIAT_Total'], train_df['sii'], marker='o', linestyle='-')  # marker='o' adds points, linestyle='-' connects them\nplt.xlabel('PCIAT-PCIAT_Total')\nplt.ylabel('sii')\nplt.title('2D Plot of PCIAT-PCIAT_Total vs. sii')\nplt.grid(True)\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:09.145682Z","iopub.execute_input":"2024-12-13T12:55:09.146060Z","iopub.status.idle":"2024-12-13T12:55:09.378033Z","shell.execute_reply.started":"2024-12-13T12:55:09.146025Z","shell.execute_reply":"2024-12-13T12:55:09.376623Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df_with_parquet = train_df[train_df['with_parquet'] == True]\ntrain_df_without_parquet = train_df[train_df['with_parquet'] == False]\nparquet_features = ['actigraphy_season', 'weekend/weekday',\n       'morning_enmo_mean', 'morning_enmo_std', 'morning_anglez_std',\n       'afternoon_enmo_mean', 'afternoon_enmo_std', 'afternoon_anglez_std',\n       'evening_enmo_mean', 'evening_enmo_std', 'evening_anglez_std',\n       'night_enmo_mean', 'night_enmo_std', 'night_anglez_std',\n       'sleep_disruption_count', 'light_exposure_during_sleep',\n       'light_exposure_during_sleep_std',\n       'light_exposure_during_sleep_disruption', 'sleep_position_changes',\n       'good_sleep_cycle', 'wear_consistency', 'anglez -90 to -60',\n       'anglez -60 to -30', 'anglez -30 to 0', 'anglez 0 to 30',\n       'anglez 30 to 60', 'anglez 60 to 90', 'with_parquet']\ntrain_df_without_parquet = train_df_without_parquet.drop(columns = parquet_features)\ntrain_df_with_parquet = train_df_with_parquet.drop(columns = ['with_parquet'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:09.379468Z","iopub.execute_input":"2024-12-13T12:55:09.379812Z","iopub.status.idle":"2024-12-13T12:55:09.396387Z","shell.execute_reply.started":"2024-12-13T12:55:09.379778Z","shell.execute_reply":"2024-12-13T12:55:09.395000Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"key_features = ['Physical-Height', 'Basic_Demos-Age', 'Physical-Waist_Circumference',\n       'Physical-Weight', 'FGC-FGC_CU', 'BIA-BIA_BMI', 'Physical-BMI',\n       'SDS-SDS_Total_Raw', 'PAQ_Season', 'FGC-FGC_PU', 'FGC-FGC_GSD',\n       'FGC-FGC_GSND', 'Physical-Systolic_BP', 'BIA-BIA_Frame_num',\n       'FGC-FGC_TL', 'BIA-BIA_FFMI', 'Basic_Demos-Sex', 'afternoon_enmo_std',\n       'morning_enmo_std', 'evening_enmo_mean', 'morning_enmo_mean',\n       'afternoon_enmo_mean']\nkey_features_without_parqurt = list(set(key_features) - set(parquet_features))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:09.397945Z","iopub.execute_input":"2024-12-13T12:55:09.398483Z","iopub.status.idle":"2024-12-13T12:55:09.410875Z","shell.execute_reply.started":"2024-12-13T12:55:09.398427Z","shell.execute_reply":"2024-12-13T12:55:09.409571Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ground_truth_with_parquet = train_df_with_parquet[['id', 'sii']]\nground_truth_without_parquet = train_df_without_parquet[['id', 'sii']]\n#train_df_with_parquet = train_df_with_parquet.drop(columns = ['sii'])\n#train_df_without_parquet = train_df_without_parquet.drop(columns = ['sii'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:09.421274Z","iopub.execute_input":"2024-12-13T12:55:09.422505Z","iopub.status.idle":"2024-12-13T12:55:09.431453Z","shell.execute_reply.started":"2024-12-13T12:55:09.422444Z","shell.execute_reply":"2024-12-13T12:55:09.430159Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def map_to_class(y_values):\n    return np.select(\n        [\n            (y_values >= 0) & (y_values < 30),\n            (y_values >= 30) & (y_values < 50),\n            (y_values >= 50) & (y_values < 80),\n            (y_values >= 80) & (y_values <= 100),\n        ],\n        [0, 1, 2, 3],\n        default=-1\n    )","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:09.433526Z","iopub.execute_input":"2024-12-13T12:55:09.434328Z","iopub.status.idle":"2024-12-13T12:55:09.448889Z","shell.execute_reply.started":"2024-12-13T12:55:09.434273Z","shell.execute_reply":"2024-12-13T12:55:09.447729Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Train with XGBRegressor (with parquet)","metadata":{}},{"cell_type":"code","source":"y = train_df_with_parquet[['PCIAT-PCIAT_Total', 'sii']]\nX = train_df_with_parquet.drop(columns=['id', 'PCIAT-PCIAT_Total', 'sii'])\nX_train, X_test, y_train, y_test = train_test_split(X[key_features], y['PCIAT-PCIAT_Total'], test_size=0.2, random_state=42, stratify=y['sii'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:09.450801Z","iopub.execute_input":"2024-12-13T12:55:09.451309Z","iopub.status.idle":"2024-12-13T12:55:09.477331Z","shell.execute_reply.started":"2024-12-13T12:55:09.451254Z","shell.execute_reply":"2024-12-13T12:55:09.475874Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"(y_test>80).sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:09.478963Z","iopub.execute_input":"2024-12-13T12:55:09.479501Z","iopub.status.idle":"2024-12-13T12:55:09.492578Z","shell.execute_reply.started":"2024-12-13T12:55:09.479439Z","shell.execute_reply":"2024-12-13T12:55:09.491136Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"(y_train>80).sum()","metadata":{"execution":{"iopub.status.busy":"2024-12-13T12:55:09.494187Z","iopub.execute_input":"2024-12-13T12:55:09.494696Z","iopub.status.idle":"2024-12-13T12:55:09.508977Z","shell.execute_reply.started":"2024-12-13T12:55:09.494631Z","shell.execute_reply":"2024-12-13T12:55:09.507743Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"lgb_reg = lgb.LGBMRegressor(verbosity=-1)\nxgb_reg = xgb.XGBRegressor()\ncat_reg = CatBoostRegressor(verbose=0)  # Suppress output for simplicity\nrf_reg = RandomForestRegressor()\ngb_reg = GradientBoostingRegressor()\n\n# objective='reg:squarederror',\n# n_estimators=1000,\n# learning_rate=0.005,\n# max_depth=5,\n# subsample=0.6,\n# colsample_bytree=0.75,\n# early_stopping_rounds=50","metadata":{"execution":{"iopub.status.busy":"2024-12-13T12:55:09.510617Z","iopub.execute_input":"2024-12-13T12:55:09.511157Z","iopub.status.idle":"2024-12-13T12:55:09.523807Z","shell.execute_reply.started":"2024-12-13T12:55:09.511103Z","shell.execute_reply":"2024-12-13T12:55:09.522446Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"weights = np.where(y_train > np.percentile(y, 75), 5, 1)\n\nmodel_with_parquet = VotingRegressor(estimators=[\n    ('lightgbm', lgb_reg),\n    ('xgboost', xgb_reg),\n    ('catboost', cat_reg),\n    ('random_forest', rf_reg),\n    ('gradient_boosting', gb_reg)\n])\n\nmodel_with_parquet.fit(\n    X_train, y_train,\n    # sample_weight=weights,\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:09.525177Z","iopub.execute_input":"2024-12-13T12:55:09.525593Z","iopub.status.idle":"2024-12-13T12:55:13.582066Z","shell.execute_reply.started":"2024-12-13T12:55:09.525558Z","shell.execute_reply":"2024-12-13T12:55:13.580451Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y_pred = model_with_parquet.predict(X_test)\n\nmse = mean_squared_error(y_test, y_pred)\nr2 = r2_score(y_test, y_pred)\n\nprint(f\"MSE: {mse:.4f}\")\nprint(f\"R²: {r2:.4f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:13.584107Z","iopub.execute_input":"2024-12-13T12:55:13.584500Z","iopub.status.idle":"2024-12-13T12:55:13.618727Z","shell.execute_reply.started":"2024-12-13T12:55:13.584450Z","shell.execute_reply":"2024-12-13T12:55:13.617289Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y_pred_class = map_to_class(y_pred)\ny_true_class = map_to_class(y_test)\naccuracy = accuracy_score(y_pred_class, y_true_class)\nprint(f\"Accuracy: {accuracy:.2f}\")\nprint(classification_report(y_true=y_pred_class, y_pred=y_true_class))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:13.620328Z","iopub.execute_input":"2024-12-13T12:55:13.620865Z","iopub.status.idle":"2024-12-13T12:55:13.643752Z","shell.execute_reply.started":"2024-12-13T12:55:13.620813Z","shell.execute_reply":"2024-12-13T12:55:13.642435Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Train with XGBRegressor (without parquet)","metadata":{}},{"cell_type":"code","source":"y = train_df_without_parquet[['PCIAT-PCIAT_Total', 'sii']]\nX = train_df_without_parquet.drop(columns=['id', 'PCIAT-PCIAT_Total', 'sii'])\nX_train, X_test, y_train, y_test = train_test_split(X[key_features_without_parqurt], y['PCIAT-PCIAT_Total'], test_size=0.2, random_state=42, stratify=y['sii'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:13.645518Z","iopub.execute_input":"2024-12-13T12:55:13.645898Z","iopub.status.idle":"2024-12-13T12:55:13.660285Z","shell.execute_reply.started":"2024-12-13T12:55:13.645852Z","shell.execute_reply":"2024-12-13T12:55:13.658946Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"(y_test>=80).sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:13.661895Z","iopub.execute_input":"2024-12-13T12:55:13.662357Z","iopub.status.idle":"2024-12-13T12:55:13.681846Z","shell.execute_reply.started":"2024-12-13T12:55:13.662319Z","shell.execute_reply":"2024-12-13T12:55:13.680451Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"(y_train>=80).sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:13.683397Z","iopub.execute_input":"2024-12-13T12:55:13.683862Z","iopub.status.idle":"2024-12-13T12:55:13.696885Z","shell.execute_reply.started":"2024-12-13T12:55:13.683809Z","shell.execute_reply":"2024-12-13T12:55:13.695470Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# unique_classes, counts = np.unique(y_train, return_counts=True)\n# class_weights = np.sum(counts) / (len(unique_classes) * counts)\n# classes = np.unique(y_train)\n# class_weight_dict = {classes[i]: class_weights[i] for i in range(len(classes))}\n# print(\"Class weights:\", class_weight_dict)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:13.698485Z","iopub.execute_input":"2024-12-13T12:55:13.698871Z","iopub.status.idle":"2024-12-13T12:55:13.712811Z","shell.execute_reply.started":"2024-12-13T12:55:13.698836Z","shell.execute_reply":"2024-12-13T12:55:13.711461Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"lgb_reg = lgb.LGBMRegressor()\nxgb_reg = xgb.XGBRegressor()\ncat_reg = CatBoostRegressor(verbose=0)  # Suppress output for simplicity\nrf_reg = RandomForestRegressor()\ngb_reg = GradientBoostingRegressor()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:13.714323Z","iopub.execute_input":"2024-12-13T12:55:13.714749Z","iopub.status.idle":"2024-12-13T12:55:13.732175Z","shell.execute_reply.started":"2024-12-13T12:55:13.714713Z","shell.execute_reply":"2024-12-13T12:55:13.730994Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"weights = np.where(y_train > np.percentile(y, 75), 5, 1)\n\nmodel_without_parquet = VotingRegressor(estimators=[\n    ('lightgbm', lgb_reg),\n    ('xgboost', xgb_reg),\n    ('catboost', cat_reg),\n    ('random_forest', rf_reg),\n    ('gradient_boosting', gb_reg)\n])\n\nmodel_without_parquet.fit(\n    X_train, y_train,\n    # sample_weight=weights,\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:13.734155Z","iopub.execute_input":"2024-12-13T12:55:13.734705Z","iopub.status.idle":"2024-12-13T12:55:17.927427Z","shell.execute_reply.started":"2024-12-13T12:55:13.734653Z","shell.execute_reply":"2024-12-13T12:55:17.926339Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\ny_pred = model_without_parquet.predict(X_test)\n\n\nmse = mean_squared_error(y_test, y_pred)\nr2 = r2_score(y_test, y_pred)\n\nprint(f\"MSE: {mse:.4f}\")\nprint(f\"R²: {r2:.4f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:17.929569Z","iopub.execute_input":"2024-12-13T12:55:17.929966Z","iopub.status.idle":"2024-12-13T12:55:17.970436Z","shell.execute_reply.started":"2024-12-13T12:55:17.929919Z","shell.execute_reply":"2024-12-13T12:55:17.968935Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y_pred_class = map_to_class(y_pred)\ny_true_class = map_to_class(y_test)\naccuracy = accuracy_score(y_pred_class, y_true_class)\nprint(f\"Accuracy: {accuracy:.2f}\")\nprint(classification_report(y_true=y_pred_class, y_pred=y_true_class))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:17.972588Z","iopub.execute_input":"2024-12-13T12:55:17.973108Z","iopub.status.idle":"2024-12-13T12:55:17.995193Z","shell.execute_reply.started":"2024-12-13T12:55:17.973057Z","shell.execute_reply":"2024-12-13T12:55:17.993920Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Predict","metadata":{}},{"cell_type":"code","source":"test_df_with_parquet = test_df[test_df['with_parquet'] == True]\ntest_df_without_parquet = test_df[test_df['with_parquet'] == False]\nparquet_features = ['actigraphy_season', 'weekend/weekday',\n       'morning_enmo_mean', 'morning_enmo_std', 'morning_anglez_std',\n       'afternoon_enmo_mean', 'afternoon_enmo_std', 'afternoon_anglez_std',\n       'evening_enmo_mean', 'evening_enmo_std', 'evening_anglez_std',\n       'night_enmo_mean', 'night_enmo_std', 'night_anglez_std',\n       'sleep_disruption_count', 'light_exposure_during_sleep',\n       'light_exposure_during_sleep_std',\n       'light_exposure_during_sleep_disruption', 'sleep_position_changes',\n       'good_sleep_cycle', 'wear_consistency', 'anglez -90 to -60',\n       'anglez -60 to -30', 'anglez -30 to 0', 'anglez 0 to 30',\n       'anglez 30 to 60', 'anglez 60 to 90', 'with_parquet']\ntest_df_without_parquet = test_df_without_parquet.drop(columns = parquet_features)\ntest_df_with_parquet = test_df_with_parquet.drop(columns = ['with_parquet'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:17.996864Z","iopub.execute_input":"2024-12-13T12:55:17.997349Z","iopub.status.idle":"2024-12-13T12:55:18.011803Z","shell.execute_reply.started":"2024-12-13T12:55:17.997297Z","shell.execute_reply":"2024-12-13T12:55:18.010800Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_predict = test_df_without_parquet.drop(columns=['id'])\npred_result = model_without_parquet.predict(X_predict[key_features_without_parqurt])\npred_result = map_to_class(pred_result)\nlist_of_tuples = list(zip(pred_result, test_df_without_parquet['id'].values))\nresult_without_parquet = pd.DataFrame(list_of_tuples, columns=['sii', 'id'])\nresult_without_parquet","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:18.013274Z","iopub.execute_input":"2024-12-13T12:55:18.013623Z","iopub.status.idle":"2024-12-13T12:55:18.060256Z","shell.execute_reply.started":"2024-12-13T12:55:18.013587Z","shell.execute_reply":"2024-12-13T12:55:18.058742Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_predict = test_df_with_parquet.drop(columns=['id'])\npred_result = model_with_parquet.predict(X_predict[key_features])\npred_result = map_to_class(pred_result)\nlist_of_tuples = list(zip(pred_result, test_df_with_parquet['id'].values))\nresult_with_parquet = pd.DataFrame(list_of_tuples, columns=['sii', 'id'])\nresult_with_parquet","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:18.061597Z","iopub.execute_input":"2024-12-13T12:55:18.062036Z","iopub.status.idle":"2024-12-13T12:55:18.094472Z","shell.execute_reply.started":"2024-12-13T12:55:18.061999Z","shell.execute_reply":"2024-12-13T12:55:18.093079Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"result = pd.concat([result_with_parquet, result_without_parquet], ignore_index=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:18.095963Z","iopub.execute_input":"2024-12-13T12:55:18.096457Z","iopub.status.idle":"2024-12-13T12:55:18.103892Z","shell.execute_reply.started":"2024-12-13T12:55:18.096408Z","shell.execute_reply":"2024-12-13T12:55:18.102648Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"result.to_csv('/kaggle/working/submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-13T12:55:18.105861Z","iopub.execute_input":"2024-12-13T12:55:18.106376Z","iopub.status.idle":"2024-12-13T12:55:18.118285Z","shell.execute_reply.started":"2024-12-13T12:55:18.106323Z","shell.execute_reply":"2024-12-13T12:55:18.116824Z"}},"outputs":[],"execution_count":null}]}