{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"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":82611,"databundleVersionId":9553358,"sourceType":"competition"}],"dockerImageVersionId":30786,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"### Findings and Insights\n\n1. **Handling Missing Values**:  \n   - Initially, I attempted to fill the missing values (NaN) in the dataset using a forward fill and backward fill method, particularly for columns like **blood glucose**, **insulin**, and **heart rate**, within each participant's row. This approach helped maintain continuity in the time series data.\n   - For the remaining missing values,I filled them with `-1`. While assigning `-1` may not be appropriate in all scenarios, I observed that this helped improve the performance of XGBoost. This is likely because XGBoost, being a tree-based model, can distinguish between missing values more effectively when represented as a specific value like `-1`. Leaving these missing values unhandled resulted in an increase in RMSE.\n\n2. **Model Performance**:\n   - I trained various models, including **CatBoost**, **LightGBM**, and **XGBoost**, using 5-fold cross-validation.\n     - **CatBoost** and **LightGBM** yielded RMSE scores around **2.56** and **2.55**, respectively.\n     - **XGBoost** achieved a slightly higher RMSE score of **2.52**.\n   - Interestingly, when tuning the hyperparameters for XGBoost, I noticed a decrease in performance, leading to an increase in RMSE.\n\n3. **Observations**:\n   - The `-1` assignment for missing values appeared to aid XGBoost's handling of the dataset, allowing it to partition the data more effectively and treat these values as distinct indicators.\n   - Conversely, attempts to optimize XGBoost through hyperparameter tuning did not yield better performance; instead, it resulted in increased RMSE, suggesting that further tuning might not be beneficial in this context.\n\n4. **Conclusion**:\n   - To enhance model performance significantly, I believe that more effective **feature engineering** is crucial. could help reduce RMSE.\n   - Additionally, exploring alternative methods for integrating domain-specific knowledge about blood glucose levels and related physiological factors may further improve the model's predictive capabilities.\n","metadata":{}},{"cell_type":"code","source":"## This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session\npd.set_option('display.max_columns', None)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:15.207012Z","iopub.execute_input":"2024-10-17T10:40:15.207606Z","iopub.status.idle":"2024-10-17T10:40:15.218286Z","shell.execute_reply.started":"2024-10-17T10:40:15.207554Z","shell.execute_reply":"2024-10-17T10:40:15.216962Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# EDA","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv(\"/kaggle/input/brist1d/train.csv\")\n","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:15.220807Z","iopub.execute_input":"2024-10-17T10:40:15.221372Z","iopub.status.idle":"2024-10-17T10:40:23.511313Z","shell.execute_reply.started":"2024-10-17T10:40:15.22131Z","shell.execute_reply":"2024-10-17T10:40:23.509999Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head(10)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:23.513598Z","iopub.execute_input":"2024-10-17T10:40:23.514028Z","iopub.status.idle":"2024-10-17T10:40:23.894062Z","shell.execute_reply.started":"2024-10-17T10:40:23.513981Z","shell.execute_reply":"2024-10-17T10:40:23.892972Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import re\n\n# Find all bg columns and group them into 20-minute intervals\nbg_columns = [col for col in train.columns if col.startswith('bg-')]\ntrain[bg_columns] = train[bg_columns].fillna(method='ffill', axis=1)\ntrain[bg_columns] = train[bg_columns].fillna(method='bfill', axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:23.895624Z","iopub.execute_input":"2024-10-17T10:40:23.896047Z","iopub.status.idle":"2024-10-17T10:40:24.24616Z","shell.execute_reply.started":"2024-10-17T10:40:23.896005Z","shell.execute_reply":"2024-10-17T10:40:24.245202Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"insulin_columns = [col for col in train.columns if col.startswith('insulin-')]\n\n# Forward-fill NaN values row-wise across all insulin columns\ntrain[insulin_columns] = train[insulin_columns].fillna(method='ffill', axis=1)\ntrain[insulin_columns] = train[insulin_columns].fillna(method='bfill', axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:24.248386Z","iopub.execute_input":"2024-10-17T10:40:24.248764Z","iopub.status.idle":"2024-10-17T10:40:24.606801Z","shell.execute_reply.started":"2024-10-17T10:40:24.248725Z","shell.execute_reply":"2024-10-17T10:40:24.60568Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"hr_columns = [col for col in train.columns if col.startswith('hr-')]\n\n# Forward-fill NaN values row-wise across all insulin columns\ntrain[hr_columns] = train[hr_columns].fillna(method='ffill', axis=1)\ntrain[hr_columns] = train[hr_columns].fillna(method='bfill', axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:24.608028Z","iopub.execute_input":"2024-10-17T10:40:24.608392Z","iopub.status.idle":"2024-10-17T10:40:24.990149Z","shell.execute_reply.started":"2024-10-17T10:40:24.608353Z","shell.execute_reply":"2024-10-17T10:40:24.989066Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\n\n# Sample data\ndata = {'activity': ['Indoor climbing','Run','Strength training','Swim','Bike','Dancing','Stairclimber','Spinning','Walking','HIIT','Outdoor Bike','Walk','Aerobic Workout','Tennis','Workout','Hike','Zumba','Sport','Yoga','Swimming','Weights','Running']}\ndf = pd.DataFrame(data)\n\n# Create a dictionary that maps each unique activity to a number\nunique_activities = {activity: i+1 for i, activity in enumerate(df['activity'].dropna().unique())}\nprint(\"Activity Mapping Dictionary:\", unique_activities)\n\n","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:24.991436Z","iopub.execute_input":"2024-10-17T10:40:24.99179Z","iopub.status.idle":"2024-10-17T10:40:25.00081Z","shell.execute_reply.started":"2024-10-17T10:40:24.991754Z","shell.execute_reply":"2024-10-17T10:40:24.999492Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = {'participant': ['p01','p02','p03','p04','p05','p06','p07','p08','p09','p10','p11','p12','p13','p14','p15']}\ndf = pd.DataFrame(data)\n\n# Create a dictionary that maps each unique activity to a number\nunique_participant = {participant: i+1 for i, participant in enumerate(df['participant'].dropna().unique())}\nprint(\"Activity Mapping Dictionary:\", unique_participant)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:25.002975Z","iopub.execute_input":"2024-10-17T10:40:25.003519Z","iopub.status.idle":"2024-10-17T10:40:25.018234Z","shell.execute_reply.started":"2024-10-17T10:40:25.003466Z","shell.execute_reply":"2024-10-17T10:40:25.016865Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for col in train.columns:\n    if 'activity' in col:\n        # Assign values based on the dictionary and set -1 for empty values\n        train[col] = train[col].apply(lambda x: unique_activities.get(x, -1) if x != '' else -1)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:25.019611Z","iopub.execute_input":"2024-10-17T10:40:25.021314Z","iopub.status.idle":"2024-10-17T10:40:30.572589Z","shell.execute_reply.started":"2024-10-17T10:40:25.021267Z","shell.execute_reply":"2024-10-17T10:40:30.571436Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for col in train.columns:\n    if 'p_num'== col:\n        # Assign values based on the dictionary and set -1 for empty values\n        train[col] = train[col].apply(lambda x: unique_participant.get(x, -1) if x != '' else -1)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:30.574195Z","iopub.execute_input":"2024-10-17T10:40:30.57466Z","iopub.status.idle":"2024-10-17T10:40:30.671955Z","shell.execute_reply.started":"2024-10-17T10:40:30.574609Z","shell.execute_reply":"2024-10-17T10:40:30.670815Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head(10)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:30.694715Z","iopub.execute_input":"2024-10-17T10:40:30.695115Z","iopub.status.idle":"2024-10-17T10:40:31.105149Z","shell.execute_reply.started":"2024-10-17T10:40:30.695078Z","shell.execute_reply":"2024-10-17T10:40:31.104081Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train =train.fillna(-1)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:31.106402Z","iopub.execute_input":"2024-10-17T10:40:31.106723Z","iopub.status.idle":"2024-10-17T10:40:31.111461Z","shell.execute_reply.started":"2024-10-17T10:40:31.106689Z","shell.execute_reply":"2024-10-17T10:40:31.110251Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Extract components\ntrain['hour'] = pd.to_datetime(train['time'], format='%H:%M:%S').dt.hour\ntrain['minute'] = pd.to_datetime(train['time'], format='%H:%M:%S').dt.minute\ntrain['second'] = pd.to_datetime(train['time'], format='%H:%M:%S').dt.second\n\n# Display the updated DataFram\n","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:31.112855Z","iopub.execute_input":"2024-10-17T10:40:31.113763Z","iopub.status.idle":"2024-10-17T10:40:31.228372Z","shell.execute_reply.started":"2024-10-17T10:40:31.113721Z","shell.execute_reply":"2024-10-17T10:40:31.227116Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['hour_sin'] = np.sin(2 * np.pi * train['hour'] / 24)\ntrain['hour_cos'] = np.cos(2 * np.pi * train['hour'] / 24)\n\n# Similarly, you can create cyclical features for minutes or seconds if needed\ntrain['minute_sin'] = np.sin(2 * np.pi * train['minute'] / 60)\ntrain['minute_cos'] = np.cos(2 * np.pi * train['minute'] / 60)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:31.229775Z","iopub.execute_input":"2024-10-17T10:40:31.230427Z","iopub.status.idle":"2024-10-17T10:40:31.255537Z","shell.execute_reply.started":"2024-10-17T10:40:31.230385Z","shell.execute_reply":"2024-10-17T10:40:31.254361Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = train.drop(['hour','minute','second'],axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:31.256731Z","iopub.execute_input":"2024-10-17T10:40:31.257096Z","iopub.status.idle":"2024-10-17T10:40:31.634945Z","shell.execute_reply.started":"2024-10-17T10:40:31.257057Z","shell.execute_reply":"2024-10-17T10:40:31.633798Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head()","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:31.636248Z","iopub.execute_input":"2024-10-17T10:40:31.636568Z","iopub.status.idle":"2024-10-17T10:40:31.944036Z","shell.execute_reply.started":"2024-10-17T10:40:31.636535Z","shell.execute_reply":"2024-10-17T10:40:31.942996Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nX = train.drop(['id','time','bg+1:00'],axis=1)  # Feature columns\ny = train['bg+1:00']  # Target column","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:31.945439Z","iopub.execute_input":"2024-10-17T10:40:31.945849Z","iopub.status.idle":"2024-10-17T10:40:33.588661Z","shell.execute_reply.started":"2024-10-17T10:40:31.945805Z","shell.execute_reply":"2024-10-17T10:40:33.587473Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**same data preprocessing for test**","metadata":{}},{"cell_type":"code","source":"test = pd.read_csv(\"/kaggle/input/brist1d/test.csv\")","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:33.614124Z","iopub.execute_input":"2024-10-17T10:40:33.614496Z","iopub.status.idle":"2024-10-17T10:40:33.8438Z","shell.execute_reply.started":"2024-10-17T10:40:33.614459Z","shell.execute_reply":"2024-10-17T10:40:33.842662Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ntest[bg_columns] = test[bg_columns].fillna(method='ffill', axis=1)\ntest[bg_columns] = test[bg_columns].fillna(method='bfill', axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:33.845302Z","iopub.execute_input":"2024-10-17T10:40:33.845739Z","iopub.status.idle":"2024-10-17T10:40:33.883712Z","shell.execute_reply.started":"2024-10-17T10:40:33.845691Z","shell.execute_reply":"2024-10-17T10:40:33.882476Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test[insulin_columns] = test[insulin_columns].fillna(method='ffill', axis=1)\ntest[insulin_columns] = test[insulin_columns].fillna(method='bfill', axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:33.885723Z","iopub.execute_input":"2024-10-17T10:40:33.886146Z","iopub.status.idle":"2024-10-17T10:40:33.932039Z","shell.execute_reply.started":"2024-10-17T10:40:33.886107Z","shell.execute_reply":"2024-10-17T10:40:33.930693Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Forward-fill NaN values row-wise across all insulin columns\ntest[hr_columns] = test[hr_columns].fillna(method='ffill', axis=1)\ntest[hr_columns] = test[hr_columns].fillna(method='bfill', axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:33.933622Z","iopub.execute_input":"2024-10-17T10:40:33.934179Z","iopub.status.idle":"2024-10-17T10:40:33.979035Z","shell.execute_reply.started":"2024-10-17T10:40:33.934128Z","shell.execute_reply":"2024-10-17T10:40:33.97759Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for col in train.columns:\n    if 'activity' in col:\n        # Assign values based on the dictionary and set -1 for empty values\n        test[col] = test[col].apply(lambda x: unique_activities.get(x, -1) if x != '' else -1)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:33.980792Z","iopub.execute_input":"2024-10-17T10:40:33.981378Z","iopub.status.idle":"2024-10-17T10:40:34.169809Z","shell.execute_reply.started":"2024-10-17T10:40:33.981323Z","shell.execute_reply":"2024-10-17T10:40:34.166103Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for col in train.columns:\n    if 'p_num'== col:\n        # Assign values based on the dictionary and set -1 for empty values\n        test[col] = test[col].apply(lambda x: unique_participant.get(x, -1) if x != '' else -1)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:34.17182Z","iopub.execute_input":"2024-10-17T10:40:34.172363Z","iopub.status.idle":"2024-10-17T10:40:34.182093Z","shell.execute_reply.started":"2024-10-17T10:40:34.17231Z","shell.execute_reply":"2024-10-17T10:40:34.180859Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test =test.fillna(-1)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:34.205067Z","iopub.execute_input":"2024-10-17T10:40:34.206511Z","iopub.status.idle":"2024-10-17T10:40:34.211378Z","shell.execute_reply.started":"2024-10-17T10:40:34.206462Z","shell.execute_reply":"2024-10-17T10:40:34.209809Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test['hour'] = pd.to_datetime(test['time'], format='%H:%M:%S').dt.hour\ntest['minute'] = pd.to_datetime(test['time'], format='%H:%M:%S').dt.minute\ntest['second'] = pd.to_datetime(test['time'], format='%H:%M:%S').dt.second","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:34.212678Z","iopub.execute_input":"2024-10-17T10:40:34.213103Z","iopub.status.idle":"2024-10-17T10:40:34.23821Z","shell.execute_reply.started":"2024-10-17T10:40:34.213063Z","shell.execute_reply":"2024-10-17T10:40:34.237126Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test['hour_sin'] = np.sin(2 * np.pi * test['hour'] / 24)\ntest['hour_cos'] = np.cos(2 * np.pi * test['hour'] / 24)\n\n# Similarly, you can create cyclical features for minutes or seconds if needed\ntest['minute_sin'] = np.sin(2 * np.pi * test['minute'] / 60)\ntest['minute_cos'] = np.cos(2 * np.pi * test['minute'] / 60)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:34.239551Z","iopub.execute_input":"2024-10-17T10:40:34.240396Z","iopub.status.idle":"2024-10-17T10:40:34.253381Z","shell.execute_reply.started":"2024-10-17T10:40:34.240354Z","shell.execute_reply":"2024-10-17T10:40:34.25217Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.DataFrame()\nsubmission['id'] = test['id']","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:34.255414Z","iopub.execute_input":"2024-10-17T10:40:34.255768Z","iopub.status.idle":"2024-10-17T10:40:34.263022Z","shell.execute_reply.started":"2024-10-17T10:40:34.25573Z","shell.execute_reply":"2024-10-17T10:40:34.261837Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = test.drop(['hour','minute','second','id','time'],axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:34.264433Z","iopub.execute_input":"2024-10-17T10:40:34.264865Z","iopub.status.idle":"2024-10-17T10:40:34.288442Z","shell.execute_reply.started":"2024-10-17T10:40:34.264817Z","shell.execute_reply":"2024-10-17T10:40:34.287247Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model Traing","metadata":{}},{"cell_type":"code","source":"from xgboost import XGBRegressor\nfrom sklearn.model_selection import KFold\nfrom sklearn.metrics import mean_squared_error\nimport numpy as np\n\n# Initialize list to store models and predictions\nmodels = []\ntest_predictions = []\n\n# Define the custom scoring function (Root Mean Squared Error)\ndef rmse(y_true, y_pred):\n    return np.sqrt(mean_squared_error(y_true, y_pred))\n\n# Use KFold for cross-validation\nkf = KFold(n_splits=5, shuffle=True, random_state=42)\n\n# Train and store models, and make predictions\nfor train_index, val_index in kf.split(X):\n    X_train, X_val = X.iloc[train_index], X.iloc[val_index]\n    y_train, y_val = y.iloc[train_index], y.iloc[val_index]\n    \n    # Train the model on the training set\n    model = XGBRegressor(n_estimators=100, learning_rate=0.1, random_state=42)\n    model.fit(X_train, y_train)\n    \n    # Make predictions on the test set\n    y_test_pred = model.predict(test)\n    test_predictions.append(y_test_pred)\n\n# Take the mean of predictions from all 5 models\nfinal_predictions = np.mean(np.array(test_predictions), axis=0)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:40:34.354159Z","iopub.execute_input":"2024-10-17T10:40:34.354634Z","iopub.status.idle":"2024-10-17T10:42:58.905547Z","shell.execute_reply.started":"2024-10-17T10:40:34.354586Z","shell.execute_reply":"2024-10-17T10:42:58.904559Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission['bg+1:00'] = final_predictions","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:42:58.90679Z","iopub.execute_input":"2024-10-17T10:42:58.907575Z","iopub.status.idle":"2024-10-17T10:42:58.91347Z","shell.execute_reply.started":"2024-10-17T10:42:58.907531Z","shell.execute_reply":"2024-10-17T10:42:58.912301Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.head(20)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:42:58.915308Z","iopub.execute_input":"2024-10-17T10:42:58.915677Z","iopub.status.idle":"2024-10-17T10:42:58.930986Z","shell.execute_reply.started":"2024-10-17T10:42:58.915639Z","shell.execute_reply":"2024-10-17T10:42:58.929731Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T10:42:58.932509Z","iopub.execute_input":"2024-10-17T10:42:58.932852Z","iopub.status.idle":"2024-10-17T10:42:58.948805Z","shell.execute_reply.started":"2024-10-17T10:42:58.932816Z","shell.execute_reply":"2024-10-17T10:42:58.947485Z"},"trusted":true},"execution_count":null,"outputs":[]}]}