{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"},"colab":{"provenance":[]},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":82611,"databundleVersionId":9553358,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# **BrisT1D Blood Glucose Prediction Competition**\n\nUsing historical blood glucose readings, insulin dosage, carbohydrate intake, and smartwatch activity data to predict future blood glucose.","metadata":{"id":"rIDUrOFYy-Pf"}},{"cell_type":"markdown","source":"\n\n**OBJECTIVE** : Using historical blood glucose readings, insulin dosage, carbohydrate intake, and smartwatch activity data to predict future blood glucose.\n\nOverview\n\nPredicting blood glucose fluctuations is crucial for managing type 1 diabetes. Developing effective algorithms for this can alleviate some of the challenges faced by individuals with the condition.\n\nGoal: Forecast blood glucose levels one hour ahead using the previous six hours of participant data.","metadata":{"id":"x6pjmrOdsB5-"}},{"cell_type":"markdown","source":"**DUE TO THE SIZE WE WILL FIRST EXTRACT OUT THE DATASET THROUGH KAGGLE**","metadata":{"id":"VwCoqZbisBz4"}},{"cell_type":"markdown","source":"INSTALLING AND IMPORTING KAGGLE","metadata":{"id":"H_smiQnXzWSW"}},{"cell_type":"code","source":"!pip install kaggle","metadata":{"id":"Mvj8LmRer8lK","outputId":"7dcc2dad-560f-4233-c12c-4a114a8c61a0"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#configuring the path of kaggle.json file\n!mkdir -p ~/.kaggle\n!cp kaggle.json ~/.kaggle/\n!chmod 600 ~/.kaggle/kaggle.json","metadata":{"id":"ewqqwrHqtjfP"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#dataset api\n!kaggle competitions download -c brist1d","metadata":{"id":"UHWZMlwTtu0f","outputId":"edbe44d5-481d-4dc8-a60a-36792bea1e7f"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!ls","metadata":{"id":"-VC4bIptuHUj","outputId":"cc4cdc36-6a05-4d2a-a9f6-3dc7f901e913"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#extracting the compressed dataset\nfrom zipfile import ZipFile\n#copy the path from the cifar-10 zop data\ndataset = '/content/brist1d.zip'\n\nwith ZipFile(dataset,'r') as zip:\n  zip.extractall()\n  #for cofirmation of extraction\n  print('the dataset is now extracted')","metadata":{"id":"vKgYc1N1uQg7","outputId":"a9e7a0fd-6b30-4e4a-af20-4461bcd87fe6"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!ls","metadata":{"id":"TM4DdcdFua-O","outputId":"1046753f-1d34-4486-cf7a-f0c69154f6a0"},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**IMPORTING ALL THE NECESSARY LIBRARIES**","metadata":{"id":"uhcByb_7zh8W"}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n#to keep everything in one plane\n%matplotlib inline","metadata":{"id":"dfVyzMHDvXz9"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# warnings module in Python provides a way to control how warnings handled within a Python script\nimport warnings\nwarnings.filterwarnings('ignore')#ignore the warnings","metadata":{"id":"hRVkyOQg9luS"},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**LOADING OF THE DATASET**","metadata":{"id":"RaLkhcAjzdJC"}},{"cell_type":"code","source":"#Load the training and testing datasets into pandas dataframes.\ntrain_df = pd.read_csv('train.csv')\ntest_df = pd.read_csv('test.csv')","metadata":{"id":"cVYiDqyj9uWT"},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**BASIC DATA INSPECTION**","metadata":{"id":"z9HPnabIzvd9"}},{"cell_type":"code","source":"print(train_df.head())  # display the first few rows","metadata":{"id":"wRTvY79F93LY","outputId":"99865ff6-8873-4ead-8b2a-5088a493a515"},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Understanding the Dataset Columns\n\n1. ID: A unique identifier for each row in the dataset.\n2. Participant Number (p_num): A code or ID that identifies the participant who provided the data.\n3. Time: The timestamp for each measurement, indicating when the data was collected.\n4. Blood Glucose Measurements: The columns labeled bg-5:55, bg-5:50, ..., bg+1:00 represent blood glucose measurements taken at different time points. For example, bg-5:55 represents the blood glucose measurement taken 5 minutes and 55 seconds before the current time.\n5. Activity Measurements: The columns labeled activity-0:40, activity-0:35, ..., activity-0:00 represent activity measurements taken at different time points. For example, activity-0:40 represents the activity measurement taken 40 minutes before the current time.","metadata":{"id":"IKFc9WUl-neH"}},{"cell_type":"code","source":"print(train_df.info())  # display a concise summary of the dataframe","metadata":{"id":"BzH4tIwp-q-m","outputId":"68e929ac-9f39-4197-ac51-dd1710bf9e0d"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Function to reduce memory usage\ndef reduce_memory(df):\n    start_mem = df.memory_usage().sum() / 1024**2\n    print(f\"Memory before optimization by train and test: {start_mem:.2f} MB\")\n\n    for col in df.columns:\n        col_type = df[col].dtype\n\n        if col_type != object:\n            if str(col_type).startswith(\"int\"):\n                df[col] = pd.to_numeric(df[col], downcast=\"integer\")\n            elif str(col_type).startswith(\"float\"):\n                df[col] = pd.to_numeric(df[col], downcast=\"float\")\n        else:\n            df[col] = df[col].astype(\"category\")\n\n    end_mem = df.memory_usage().sum() / 1024**2\n    print(f\"Memory after optimization by tain and test: {end_mem:.2f} MB\")\n    print(f\"Reduced by {(100 * (start_mem - end_mem) / start_mem):.1f}%\")\n\n    return df\n# Apply memory reduction\ntrain_df = reduce_memory(train_df)\ntest_df = reduce_memory(test_df)","metadata":{"id":"w27PNuvbHD6t","outputId":"c2fa34f4-cfa5-40eb-9379-4ac30e6f9370"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.shape","metadata":{"id":"6vaaunLiGAqz","outputId":"2737e383-b3a6-4942-b61d-2c3bd02cff52"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.columns","metadata":{"id":"jC-ytqj0_Mx3","outputId":"984339f7-ab22-4ab9-a922-754689d353f4"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(train_df.describe())  # display summary statistics for the dataframe","metadata":{"id":"SNEqvS5P-3Aa","outputId":"eb64c749-d3ba-43be-d231-5a750c7d15ef"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pd.set_option('display.max_rows', 1000)\npd.set_option('display.max_columns', 1000)","metadata":{"id":"bvSq0vWL_v8H"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.isnull().sum()","metadata":{"id":"B0mJ8ACU_UK0","outputId":"f80746b2-bc3d-47b0-bb6f-65ab1dd237a9"},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Explore the testing data","metadata":{"id":"NAwbfmFs_ASn"}},{"cell_type":"code","source":"#check if there are any rows with all null values:\nprint(train_df.isnull().all(axis=1).sum())","metadata":{"id":"YIrw7TzlJLhA","outputId":"70b429dc-21b4-492c-ee75-93944ba55d37"},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"1. Remove columns with a large number of null values (> 50%):\n    - activity columns (all)\n    - carbs columns (all)\n    - insulin columns (all)\n2. Impute null values with the mean or median for numerical columns:\n    - bg columns (impute with mean)\n    - hr columns (impute with mean)\n    - steps columns (impute with mean)\n    - cals columns (impute with mean)\n3. Retain columns with no or few null values:\n    - id\n    - p_num\n    - time\n    - bg+1:00","metadata":{"id":"t-3fYaI-KYSI"}},{"cell_type":"markdown","source":"For the activity columns (activity-0:40 to activity-0:00):\n\n- Since these columns have a high number of null values (over 170,000), it's likely that these values are not relevant for the prediction task.\n- Remove these columns from the dataset.\n\nFor the bg columns (bg-5:55 to bg-5:35):\n\n- Since these columns have a moderate number of null values (over 20,000), it's likely that these values are relevant for the prediction task.\n- Impute the null values with the mean of the respective column.","metadata":{"id":"Im5VY_3AIbTl"}},{"cell_type":"markdown","source":"**DATA HANDLING**","metadata":{"id":"dTSIVnj9z4_i"}},{"cell_type":"code","source":"# Remove the activity columns with high null values\nactivity_cols = [col for col in train_df.columns if 'activity' in col]\ntrain_df.drop(activity_cols, axis=1, inplace=True)\n\n# Impute null values in bg columns with the mean\nbg_cols = [col for col in train_df.columns if 'bg' in col]\nfor col in bg_cols:\n    train_df[col].fillna(train_df[col].mean(), inplace=True)","metadata":{"id":"PgBD8fX9HlKR"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Remove columns with a large number of null values (> 50%)\nactivity_cols = [col for col in train_df.columns if 'activity' in col]\ncarbs_cols = [col for col in train_df.columns if 'carbs' in col]\ninsulin_cols = [col for col in train_df.columns if 'insulin' in col]\ntrain_df.drop(activity_cols + carbs_cols + insulin_cols, axis=1, inplace=True)","metadata":{"id":"dm6A85W1JPY5"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Impute null values with the mean or median for numerical columns\nbg_cols = [col for col in train_df.columns if 'bg' in col]\nhr_cols = [col for col in train_df.columns if 'hr' in col]\nsteps_cols = [col for col in train_df.columns if 'steps' in col]\ncals_cols = [col for col in train_df.columns if 'cals' in col]\ntrain_df[bg_cols] = train_df[bg_cols].fillna(train_df[bg_cols].mean())\ntrain_df[hr_cols] = train_df[hr_cols].fillna(train_df[hr_cols].mean())\ntrain_df[steps_cols] = train_df[steps_cols].fillna(train_df[steps_cols].mean())\ntrain_df[cals_cols] = train_df[cals_cols].fillna(train_df[cals_cols].mean())","metadata":{"id":"fAmQcw63Kl-9"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df['p_num'].unique()","metadata":{"id":"ptk0fB1IBnmT","outputId":"1e9f588b-6cae-4f08-c64a-3a7723f8d44a"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Define the columns to remove\nremove_cols = ['p_num']\n\n# Remove the unwanted columns\ntrain_df.drop(remove_cols, axis=1, inplace=True)","metadata":{"id":"slDF0sL_Q3cx"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.shape","metadata":{"id":"VfYe3MeHK30-","outputId":"7614e377-7294-4fae-c332-bace605b6ff2"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.isnull().sum()","metadata":{"id":"xJ5NBY78Iyl1","outputId":"71eb71d7-3e03-4aea-c832-ce632f3da92f"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import StandardScaler\n\nscaler = StandardScaler()\ntrain_df[bg_cols + hr_cols + steps_cols + cals_cols] = scaler.fit_transform(train_df[bg_cols + hr_cols + steps_cols + cals_cols])","metadata":{"id":"wdl41wdr-9fp"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.dtypes","metadata":{"id":"epI5O8vaCh4C","outputId":"b112daec-7f88-4b6a-e6a3-055c632e2bd5"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Plot a histogram to visualize the data\ntrain_df['bg-5:55'].hist(bins=50)\nplt.title('Histogram of bg-5:55')\nplt.show()","metadata":{"id":"h-tyDBcADKRJ","outputId":"cf022b63-aaa6-4152-ad48-f058eed67f1b"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Calculate the z-score for each value in the column\nfrom scipy import stats\nz_scores = stats.zscore(train_df['bg-5:55'])\n\n# Print the values with a z-score greater than 3 or less than -3\nprint(train_df['bg-5:55'][(z_scores > 3) | (z_scores < -3)])","metadata":{"id":"EIUBOJl2DTH1","outputId":"2a451fda-307b-4f89-faba-40df9b0e5b80"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import OneHotEncoder\n\nencoder = OneHotEncoder()\nencoded_data = encoder.fit_transform(train_df[['time']])","metadata":{"id":"Yq7n6XljEBoi"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.columns","metadata":{"id":"QpeOKWLFEKc_","outputId":"cca48708-0784-4980-c4f4-c5c7792a16fd"},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**FEATURE ENGINEERING**","metadata":{"id":"iEuBZgny0CE_"}},{"cell_type":"code","source":"# Convert the 'time' column to datetime format\ntrain_df['time'] = pd.to_datetime(train_df['time'])\n\n# Extract hour, day, and month features\ntrain_df['hour'] = train_df['time'].dt.hour\ntrain_df['day'] = train_df['time'].dt.day\ntrain_df['month'] = train_df['time'].dt.month","metadata":{"id":"dLbNfgGeRvKO"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Average Heart Rate\ntrain_df['avg_hr_30min'] = train_df[['hr-5:55', 'hr-5:50', 'hr-5:45', 'hr-5:40', 'hr-5:35', 'hr-5:30']].mean(axis=1)","metadata":{"id":"6IYHfEVTSHRS"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Total Steps Taken\ntrain_df['total_steps_30min'] = train_df[['steps-5:55', 'steps-5:50', 'steps-5:45', 'steps-5:40', 'steps-5:35', 'steps-5:30']].sum(axis=1)","metadata":{"id":"livoTge6Ta68"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Calories Burned\ntrain_df['total_cals_30min'] = train_df[['cals-5:55', 'cals-5:50', 'cals-5:45', 'cals-5:40', 'cals-5:35', 'cals-5:30']].sum(axis=1)","metadata":{"id":"mEZEV8hHThHn"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Previous Blood Glucose Levels\ntrain_df['prev_bg_30min'] = train_df[['bg-5:55', 'bg-5:50', 'bg-5:45', 'bg-5:40', 'bg-5:35', 'bg-5:30']].mean(axis=1)","metadata":{"id":"fnoOEoTPToVd"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Time Since Last Meal\ntrain_df['time'] = train_df['time'].astype(str)\ntrain_df['time_since_last_meal'] = train_df.index.to_series().diff()","metadata":{"id":"0xvldGrhTxVt"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Time Since Last Insulin Dose\ntrain_df['time'] = pd.to_datetime(train_df['time'], format='%H:%M', errors='coerce')\ntrain_df['time_since_last_insulin'] = (train_df['time'] - train_df['time'].shift(1)).dt.total_seconds()","metadata":{"id":"siUDVHGYsZkb"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Average Blood Glucose Level\ntrain_df['avg_bg_30min'] = train_df[['bg-5:55', 'bg-5:50', 'bg-5:45', 'bg-5:40', 'bg-5:35', 'bg-5:30']].mean(axis=1)","metadata":{"id":"T3eRt_COs0Xa"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.metrics import mean_squared_error","metadata":{"id":"i63amRs4tTse"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(train_df.columns.tolist())","metadata":{"id":"IXvnX8AQw9A5","outputId":"6ee02299-03e8-4ba4-c65b-f87db8850f64"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(train_df.columns)","metadata":{"id":"HF6NZaJswqSZ","outputId":"c393ccbb-cea7-44dd-9bbd-b99510c62f84"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nX = train_df.drop(columns=['bg+1:00'])  # Features, remove the target column\ny = train_df['bg+1:00']  # Target column\n\n# Split the data into training and validation sets\nX_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)","metadata":{"id":"8-P_DqIOTbrA"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(X_train.info())","metadata":{"id":"iLodP-vgX9XC","outputId":"0ec109ed-d9a2-4059-b624-c9fbd94f9ff7"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Drop the 'id' column temporarily for preprocessing and model training\ntrain_df = train_df.drop('id', axis=1)","metadata":{"id":"pJWAooLwZ9aE"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Continue with preprocessing steps\ntrain_df['avg_bg_30min'] = train_df[['bg-5:55', 'bg-5:50', 'bg-5:45', 'bg-5:40', 'bg-5:35', 'bg-5:30']].mean(axis=1)\n\n# Continue with other feature engineering\ntrain_df['avg_hr_30min'] = train_df[['hr-5:55', 'hr-5:50', 'hr-5:45', 'hr-5:40', 'hr-5:35', 'hr-5:30']].mean(axis=1)\ntrain_df['total_steps_30min'] = train_df[['steps-5:55', 'steps-5:50', 'steps-5:45', 'steps-5:40', 'steps-5:35', 'steps-5:30']].sum(axis=1)\ntrain_df['total_cals_30min'] = train_df[['cals-5:55', 'cals-5:50', 'cals-5:45', 'cals-5:40', 'cals-5:35', 'cals-5:30']].sum(axis=1)\ntrain_df['prev_bg_30min'] = train_df[['bg-5:55', 'bg-5:50', 'bg-5:45', 'bg-5:40', 'bg-5:35', 'bg-5:30']].mean(axis=1)","metadata":{"id":"o-S21Cr-K7Eg"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Extract relevant time features (hour, day, month)\nX_train['hour'] = X_train['time'].dt.hour\nX_train['day'] = X_train['time'].dt.day\nX_train['month'] = X_train['time'].dt.month\n\n# Drop the original datetime column\nX_train.drop('time', axis=1, inplace=True)\nX_train= X_train.drop('id', axis=1)","metadata":{"id":"YxUMYFJ6caDZ"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(X_train.info())","metadata":{"id":"7l1CqHoxcG9O","outputId":"17639ee7-c75b-4044-c424-ec8769a53bb6"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import StandardScaler\n\nscaler = StandardScaler()\nX_train_scaled = scaler.fit_transform(X_train)  # Scale the features","metadata":{"id":"vNklgUejceci"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import time\nfrom sklearn.ensemble import RandomForestRegressor\n\n# Start the timer\nstart_time = time.time()\n\n# Initialize and train the model\nmodel = RandomForestRegressor(n_estimators=20, random_state=42, n_jobs=-1, max_depth=10)\nmodel.fit(X_train_scaled, y_train)\n\n# End the timer\nend_time = time.time()\n\n# Calculate the elapsed time\nelapsed_time = end_time - start_time\n\nprint(f\"Model training took {elapsed_time:.2f} seconds.\")","metadata":{"id":"hL9zSIvUVWTx","outputId":"e76efc75-6640-4855-c9da-795db003a867"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Ensure that both datasets have the same columns\nX_train, X_val = X_train.align(X_val, join='inner', axis=1)\n\n# Scale the data\nX_train_scaled = scaler.fit_transform(X_train)\nX_val_scaled = scaler.transform(X_val)","metadata":{"id":"3GV1ji5tXMYx"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# scale both datasets\nX_train_scaled = scaler.fit_transform(X_train)\nX_val_scaled = scaler.transform(X_val)","metadata":{"id":"oi0focpqc5rp"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_test = pd.read_csv('test.csv')","metadata":{"id":"Gk1HkyzgXvPq"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train.columns","metadata":{"id":"q_v1kG0Pe_wB","outputId":"8c92f012-dc36-4239-d9db-8bd71f8efab8"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(X_test.columns)","metadata":{"id":"YaNgQ_C7aqky","outputId":"189e066e-9293-4d7c-9996-c0879b9048e1"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_test['time'] = pd.to_datetime(X_test['time'], errors='coerce')  # Convert to datetime\nX_test['time_since_last_meal'] = X_test['time'].diff().dt.total_seconds()\nX_test['time_since_last_meal'].fillna(0, inplace=True)  # Fill NaNs with 0","metadata":{"id":"0vyluqf_fRvr"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Extract time-based features from the 'time' column\nX_test['time'] = pd.to_datetime(X_test['time'], errors='coerce')\nX_test['hour'] = X_test['time'].dt.hour\nX_test['day'] = X_test['time'].dt.day\nX_test['month'] = X_test['time'].dt.month\n# Ensure 'time' column is in datetime format\nX_test['time'] = pd.to_datetime(X_test['time'], format='%H:%M', errors='coerce')\n# Compute 'time_since_last_insulin' using the same logic as training\nX_test['time_since_last_insulin'] = (X_test['time'] - X_test['time'].shift(1)).dt.total_seconds()\n# Handle missing values (fill NaNs with 0 or any other logic you used in training)\nX_test['time_since_last_insulin'].fillna(0, inplace=True)\nX_test['avg_bg_30min'] = X_test[['bg-5:55', 'bg-5:50', 'bg-5:45', 'bg-5:40', 'bg-5:35', 'bg-5:30']].mean(axis=1)\nX_test.drop('time', axis=1, inplace=True)\n\n# Handle categorical columns\nfor col in X_test.select_dtypes(include=['object', 'category']).columns:\n    X_test[col] = X_test[col].astype('category').cat.codes\n\n# Fill missing values with 0\nX_test.fillna(0, inplace=True)","metadata":{"id":"EXdH99oKY5XF"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Training columns:\", list(X_train.columns))\nprint(\"Test columns (aligned):\", list(X_test_aligned.columns))","metadata":{"id":"wp9GJh5Xo1tP","outputId":"df8cdbfd-a682-46bb-ea67-af8eccc1fc2f"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"training_columns =['bg-5:55', 'bg-5:50', 'bg-5:45', 'bg-5:40', 'bg-5:35', 'bg-5:30', 'bg-5:25', 'bg-5:20', 'bg-5:15', 'bg-5:10', 'bg-5:05', 'bg-5:00', 'bg-4:55', 'bg-4:50', 'bg-4:45', 'bg-4:40', 'bg-4:35', 'bg-4:30', 'bg-4:25', 'bg-4:20', 'bg-4:15', 'bg-4:10', 'bg-4:05', 'bg-4:00', 'bg-3:55', 'bg-3:50', 'bg-3:45', 'bg-3:40', 'bg-3:35', 'bg-3:30', 'bg-3:25', 'bg-3:20', 'bg-3:15', 'bg-3:10', 'bg-3:05', 'bg-3:00', 'bg-2:55', 'bg-2:50', 'bg-2:45', 'bg-2:40', 'bg-2:35', 'bg-2:30', 'bg-2:25', 'bg-2:20', 'bg-2:15', 'bg-2:10', 'bg-2:05', 'bg-2:00', 'bg-1:55', 'bg-1:50', 'bg-1:45', 'bg-1:40', 'bg-1:35', 'bg-1:30', 'bg-1:25', 'bg-1:20', 'bg-1:15', 'bg-1:10', 'bg-1:05', 'bg-1:00', 'bg-0:55', 'bg-0:50', 'bg-0:45', 'bg-0:40', 'bg-0:35', 'bg-0:30', 'bg-0:25', 'bg-0:20', 'bg-0:15', 'bg-0:10', 'bg-0:05', 'bg-0:00', 'hr-5:55', 'hr-5:50', 'hr-5:45', 'hr-5:40', 'hr-5:35', 'hr-5:30', 'hr-5:25', 'hr-5:20', 'hr-5:15', 'hr-5:10', 'hr-5:05', 'hr-5:00', 'hr-4:55', 'hr-4:50', 'hr-4:45', 'hr-4:40', 'hr-4:35', 'hr-4:30', 'hr-4:25', 'hr-4:20', 'hr-4:15', 'hr-4:10', 'hr-4:05', 'hr-4:00', 'hr-3:55', 'hr-3:50', 'hr-3:45', 'hr-3:40', 'hr-3:35', 'hr-3:30', 'hr-3:25', 'hr-3:20', 'hr-3:15', 'hr-3:10', 'hr-3:05', 'hr-3:00', 'hr-2:55', 'hr-2:50', 'hr-2:45', 'hr-2:40', 'hr-2:35', 'hr-2:30', 'hr-2:25', 'hr-2:20', 'hr-2:15', 'hr-2:10', 'hr-2:05', 'hr-2:00', 'hr-1:55', 'hr-1:50', 'hr-1:45', 'hr-1:40', 'hr-1:35', 'hr-1:30', 'hr-1:25', 'hr-1:20', 'hr-1:15', 'hr-1:10', 'hr-1:05', 'hr-1:00', 'hr-0:55', 'hr-0:50', 'hr-0:45', 'hr-0:40', 'hr-0:35', 'hr-0:30', 'hr-0:25', 'hr-0:20', 'hr-0:15', 'hr-0:10', 'hr-0:05', 'hr-0:00', 'steps-5:55', 'steps-5:50', 'steps-5:45', 'steps-5:40', 'steps-5:35', 'steps-5:30', 'steps-5:25', 'steps-5:20', 'steps-5:15', 'steps-5:10', 'steps-5:05', 'steps-5:00', 'steps-4:55', 'steps-4:50', 'steps-4:45', 'steps-4:40', 'steps-4:35', 'steps-4:30', 'steps-4:25', 'steps-4:20', 'steps-4:15', 'steps-4:10', 'steps-4:05', 'steps-4:00', 'steps-3:55', 'steps-3:50', 'steps-3:45', 'steps-3:40', 'steps-3:35', 'steps-3:30', 'steps-3:25', 'steps-3:20', 'steps-3:15', 'steps-3:10', 'steps-3:05', 'steps-3:00', 'steps-2:55', 'steps-2:50', 'steps-2:45', 'steps-2:40', 'steps-2:35', 'steps-2:30', 'steps-2:25', 'steps-2:20', 'steps-2:15', 'steps-2:10', 'steps-2:05', 'steps-2:00', 'steps-1:55', 'steps-1:50', 'steps-1:45', 'steps-1:40', 'steps-1:35', 'steps-1:30', 'steps-1:25', 'steps-1:20', 'steps-1:15', 'steps-1:10', 'steps-1:05', 'steps-1:00', 'steps-0:55', 'steps-0:50', 'steps-0:45', 'steps-0:40', 'steps-0:35', 'steps-0:30', 'steps-0:25', 'steps-0:20', 'steps-0:15', 'steps-0:10', 'steps-0:05', 'steps-0:00', 'cals-5:55', 'cals-5:50', 'cals-5:45', 'cals-5:40', 'cals-5:35', 'cals-5:30', 'cals-5:25', 'cals-5:20', 'cals-5:15', 'cals-5:10', 'cals-5:05', 'cals-5:00', 'cals-4:55', 'cals-4:50', 'cals-4:45', 'cals-4:40', 'cals-4:35', 'cals-4:30', 'cals-4:25', 'cals-4:20', 'cals-4:15', 'cals-4:10', 'cals-4:05', 'cals-4:00', 'cals-3:55', 'cals-3:50', 'cals-3:45', 'cals-3:40', 'cals-3:35', 'cals-3:30', 'cals-3:25', 'cals-3:20', 'cals-3:15', 'cals-3:10', 'cals-3:05', 'cals-3:00', 'cals-2:55', 'cals-2:50', 'cals-2:45', 'cals-2:40', 'cals-2:35', 'cals-2:30', 'cals-2:25', 'cals-2:20', 'cals-2:15', 'cals-2:10', 'cals-2:05', 'cals-2:00', 'cals-1:55', 'cals-1:50', 'cals-1:45', 'cals-1:40', 'cals-1:35', 'cals-1:30', 'cals-1:25', 'cals-1:20', 'cals-1:15', 'cals-1:10', 'cals-1:05', 'cals-1:00', 'cals-0:55', 'cals-0:50', 'cals-0:45', 'cals-0:40', 'cals-0:35', 'cals-0:30', 'cals-0:25', 'cals-0:20', 'cals-0:15', 'cals-0:10', 'cals-0:05', 'cals-0:00', 'hour', 'day', 'month', 'avg_hr_30min', 'total_steps_30min', 'total_cals_30min', 'prev_bg_30min', 'time_since_last_meal', 'time_since_last_insulin', 'avg_bg_30min']","metadata":{"id":"DrhBoSLwtTQ6"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_test_aligned = X_test[train_columns]  # Use the columns from the training data","metadata":{"id":"tFh--diqfpDh"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Missing in X_test_aligned:\", X_train.columns.difference(X_test_aligned.columns))\nprint(\"Extra in X_test_aligned:\", X_test_aligned.columns.difference(X_train.columns))","metadata":{"id":"7g64_m2buKzO","outputId":"d59ee4e8-2d04-4220-b576-676393d0c87a"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Align the order of columns in test data with training data\nX_test_aligned = X_test[training_columns]  # Ensure 'training_columns' is a list of column names in order from the training set","metadata":{"id":"4oo5Ig_Zuzkr"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Check if the column order matches\nif list(X_train.columns) != list(X_test_aligned.columns):\n    print(\"Feature order mismatch!\")\n    print(\"Training feature order:\", list(X_train.columns))\n    print(\"Test feature order:\", list(X_test_aligned.columns))\n    X_test_aligned = X_test_aligned[X_train.columns]","metadata":{"id":"wbyIk5FDuatN"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Recreate derived features from training preprocessing\nX_test['avg_hr_30min'] = X_test[['hr-5:55', 'hr-5:50', 'hr-5:45', 'hr-5:40', 'hr-5:35', 'hr-5:30']].mean(axis=1)\nX_test['total_steps_30min'] = X_test[['steps-5:55', 'steps-5:50', 'steps-5:45', 'steps-5:40', 'steps-5:35', 'steps-5:30']].sum(axis=1)\nX_test['total_cals_30min'] = X_test[['cals-5:55', 'cals-5:50', 'cals-5:45', 'cals-5:40', 'cals-5:35', 'cals-5:30']].sum(axis=1)\nX_test['prev_bg_30min'] = X_test[['bg-5:55', 'bg-5:50', 'bg-5:45', 'bg-5:40', 'bg-5:35', 'bg-5:30']].mean(axis=1)","metadata":{"id":"mb162stct1vZ"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Reorder X_test_aligned columns to match the scaler's order\nX_test_aligned = X_test_aligned[X_train.columns]","metadata":{"id":"0H_7N8BsvTXO"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Check if there are missing or extra columns in X_test_aligned\nmissing_features = set(X_train.columns) - set(X_test_aligned.columns)\nextra_features = set(X_test_aligned.columns) - set(X_train.columns)\n\nprint(\"Missing features:\", missing_features)\nprint(\"Extra features:\", extra_features)\n\nfor feature in missing_features:\n    X_test_aligned[feature] = 0  # or some default value\nX_test_aligned = X_test_aligned[X_train.columns]","metadata":{"id":"NQikRUFnvd0k","outputId":"c32d3bd9-188d-497a-e614-4d76a1d4d105"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_test_scaled = scaler.transform(X_test_aligned)","metadata":{"id":"Hf6XZAcKvk-Y"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y_pred = model.predict(X_test_scaled)","metadata":{"id":"lJ4R_2vqvtRT"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df = pd.read_csv('/content/test.csv')","metadata":{"id":"cgmy1Depxo_4"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Prepare the submission file using the 'id' column from X_test\nsubmission = pd.DataFrame({\n    'id': df['id'],\n    'bg+1:00': y_pred  # model predictions for the test set\n})\n\n# Save the submission file\nsubmission.to_csv('submission.csv', index=False)\n\nprint(\"Submission file 'submission.csv' created successfully.\")","metadata":{"id":"RKgCO6J2xPyT","outputId":"4e2fd49a-16d3-4d9d-8325-9e861145dc9c"},"outputs":[],"execution_count":null}]}