{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":104857,"databundleVersionId":12651513,"sourceType":"competition"}],"dockerImageVersionId":31041,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"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","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-06-14T11:29:32.547919Z","iopub.execute_input":"2025-06-14T11:29:32.548239Z","iopub.status.idle":"2025-06-14T11:29:32.555188Z","shell.execute_reply.started":"2025-06-14T11:29:32.548206Z","shell.execute_reply":"2025-06-14T11:29:32.553982Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install --upgrade xgboost","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T13:08:14.497319Z","iopub.execute_input":"2025-06-14T13:08:14.497943Z","iopub.status.idle":"2025-06-14T13:08:27.115906Z","shell.execute_reply.started":"2025-06-14T13:08:14.497913Z","shell.execute_reply":"2025-06-14T13:08:27.115149Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# -------------------- Imports --------------------\nimport pandas as pd\nimport numpy as np\nimport optuna\nimport xgboost as xgb\nimport lightgbm as lgb\nimport catboost as cb\nfrom sklearn.model_selection import KFold\nfrom sklearn.linear_model import Ridge\nfrom sklearn.metrics import mean_squared_error\n\n# -------------------- Load Data --------------------\ndf = pd.read_csv(\"/kaggle/input/burnout-datathon-ieeecsmuj/train.csv\")\ntarget = \"Lap_Time_Seconds\"\n\n# -------------------- Drop High Cardinality & Redundant Identifiers --------------------\ndrop_cols = [\n    \"Unique ID\", \"Rider_ID\", \"rider_name\", \"team_name\", \"bike_name\",\n    \"circuit_name\", \"shortname\", \"category_x\", \"year_x\"\n]\ndf.drop(columns=drop_cols, inplace=True)\n\n# -------------------- Target Encoding for Riders/Teams/Bikes --------------------\nfor col in [\"rider\", \"team\", \"bike\"]:\n    df[f\"tar_enc_{col}\"] = df.groupby(col)[target].transform(\"mean\")\n\n# -------------------- Feature Engineering --------------------\ndf[\"temp_diff\"] = df[\"Track_Temperature_Celsius\"] - df[\"Ambient_Temperature_Celsius\"]\ndf[\"speed_per_km\"] = df[\"Avg_Speed_kmh\"] / df[\"Circuit_Length_km\"]\ndf[\"degradation_per_corner\"] = df[\"Tire_Degradation_Factor_per_Lap\"] / df[\"Corners_per_Lap\"]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T11:36:07.180681Z","iopub.execute_input":"2025-06-14T11:36:07.181139Z","iopub.status.idle":"2025-06-14T11:36:22.007354Z","shell.execute_reply.started":"2025-06-14T11:36:07.181113Z","shell.execute_reply":"2025-06-14T11:36:22.006278Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# -------------------- Outlier Removal --------------------\nQ1, Q3 = df[target].quantile([0.01, 0.99])\ndf = df[(df[target] >= Q1) & (df[target] <= Q3)]\n\n# -------------------- Categorical Handling --------------------\ncat_cols = [\n    \"Track_Condition\", \"Tire_Compound_Front\", \"Tire_Compound_Rear\",\n    \"Penalty\", \"Session\", \"weather\", \"track\"\n]\ndf[cat_cols] = df[cat_cols].fillna(\"NaN\").astype(\"category\")\n\n# -------------------- Final Dataset --------------------\nX = df.drop([target], axis=1)\ny = np.sqrt(df[target])  # Square root transform for stability\n\n# -------------------- Model Training --------------------\ndef model_pipeline(X, y, cat_features):\n    oof_preds = {}\n    results = []\n    cv = KFold(n_splits=5, shuffle=True, random_state=42)\n\n    def run_model(model_class, name, **kwargs):\n        oof = np.zeros(len(y))\n        scores = []\n        for fold, (tr, va) in enumerate(cv.split(X), 1):\n            model = model_class(**kwargs)\n            model.fit(X.iloc[tr], y.iloc[tr], eval_set=[(X.iloc[va], y.iloc[va])], verbose=False)\n            preds = model.predict(X.iloc[va])\n            oof[va] = preds\n            score = mean_squared_error(y.iloc[va], preds, squared=False)\n            scores.append(score)\n            print(f\"{name} Fold {fold} RMSE: {score:.5f}\")\n        mean_rmse = np.mean(scores)\n        print(f\"{name} Mean RMSE: {mean_rmse:.5f}\")\n        oof_preds[name] = oof\n        results.append((name, mean_rmse))\n\n    run_model(xgb.XGBRegressor, \"xgb\", n_estimators=1000, early_stopping_rounds=50, random_state=42)\n    run_model(lgb.LGBMRegressor, \"lgb\", n_estimators=1000, early_stopping_rounds=50, random_state=42)\n    run_model(cb.CatBoostRegressor, \"catboost\", iterations=1000, early_stopping_rounds=50, cat_features=cat_features, verbose=0, random_state=42)\n\n    return oof_preds, results","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T11:36:44.703377Z","iopub.execute_input":"2025-06-14T11:36:44.703721Z","iopub.status.idle":"2025-06-14T11:36:47.231989Z","shell.execute_reply.started":"2025-06-14T11:36:44.703698Z","shell.execute_reply":"2025-06-14T11:36:47.230910Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# -------------------- Imports --------------------\nimport pandas as pd\nimport numpy as np\nimport optuna\nimport xgboost as xgb\nimport lightgbm as lgb\nimport catboost as cb\nfrom sklearn.model_selection import KFold\nfrom sklearn.linear_model import Ridge\nfrom sklearn.metrics import mean_squared_error\nimport matplotlib.pyplot as plt\nimport warnings\n\nwarnings.filterwarnings(\"ignore\")\n\n# -------------------- Load Data --------------------\ndf = pd.read_csv(\"/kaggle/input/burnout-datathon-ieeecsmuj/train.csv\")\ntarget = \"Lap_Time_Seconds\"\n\n# -------------------- Drop High Cardinality & Redundant Identifiers --------------------\ndrop_cols = [\n    \"Unique ID\", \"Rider_ID\", \"rider_name\", \"team_name\", \"bike_name\",\n    \"circuit_name\", \"shortname\", \"category_x\", \"year_x\"\n]\ndf['Penalty'] = df['Penalty'].fillna('DNS')\ndf.drop(columns=drop_cols, inplace=True)\n\n# -------------------- Target Encoding for Riders/Teams/Bikes --------------------\nfor col in [\"rider\", \"team\", \"bike\"]:\n    df[f\"tar_enc_{col}\"] = df.groupby(col)[target].transform(\"mean\")\n\n# -------------------- Feature Engineering --------------------\ndf[\"temp_diff\"] = df[\"Track_Temperature_Celsius\"] - df[\"Ambient_Temperature_Celsius\"]\ndf[\"speed_per_km\"] = df[\"Avg_Speed_kmh\"] / df[\"Circuit_Length_km\"]\ndf[\"degradation_per_corner\"] = df[\"Tire_Degradation_Factor_per_Lap\"] / df[\"Corners_per_Lap\"]\n\n# -------------------- Outlier Removal --------------------\nQ1, Q3 = df[target].quantile([0.01, 0.99])\ndf = df[(df[target] >= Q1) & (df[target] <= Q3)]\n\n# -------------------- Categorical Handling --------------------\ncat_cols = [\n    \"Track_Condition\", \"Tire_Compound_Front\", \"Tire_Compound_Rear\",\n    \"Penalty\", \"Session\", \"weather\", \"track\"\n]\ndf[cat_cols] = df[cat_cols].fillna(\"NaN\").astype(\"category\")\nfor col in df.select_dtypes(include='object').columns:\n    df[col] = df[col].astype('category')\n\n# -------------------- Final Dataset --------------------\nX = df.drop([target], axis=1)\ny = np.sqrt(df[target])\ncat_features_cb = [X.columns.get_loc(c) for c in cat_cols if c in X.columns]\n\n# -------------------- Model Training --------------------\ndef model_pipeline(X, y, cat_features_cb):\n    oof_preds = {}\n    results = []\n    cv = KFold(n_splits=5, shuffle=True, random_state=42)\n\n    def run_model(model_class, name, X_model, **kwargs):\n        oof = np.zeros(len(y))\n        scores = []\n        for fold, (tr, va) in enumerate(cv.split(X_model), 1):\n            if name == \"lgb\":\n                model = model_class(**kwargs)\n                model.fit(\n                    X_model.iloc[tr], y.iloc[tr],\n                    eval_set=[(X_model.iloc[va], y.iloc[va])],\n                    callbacks=[lgb.early_stopping(50), lgb.log_evaluation(0)]\n                )\n            elif name == \"catboost\":\n                model = model_class(**kwargs)\n                model.fit(\n                    X_model.iloc[tr], y.iloc[tr],\n                    eval_set=[(X_model.iloc[va], y.iloc[va])],\n                    cat_features=cat_features_cb\n                )\n            else:\n                model = model_class(**kwargs)\n                model.fit(\n                    X_model.iloc[tr], y.iloc[tr],\n                    eval_set=[(X_model.iloc[va], y.iloc[va])],\n                    early_stopping_rounds=50,\n                    verbose=False\n                )\n            preds = model.predict(X_model.iloc[va])\n            oof[va] = preds\n            score = mean_squared_error(y.iloc[va], preds, squared=False)\n            scores.append(score)\n            print(f\"{name.upper()} Fold {fold} RMSE: {score:.4f}\")\n        mean_rmse = np.mean(scores)\n        print(f\"{name.upper()} OOF RMSE: {mean_rmse:.4f}\\n\")\n        oof_preds[name] = oof\n        results.append((name, mean_rmse))\n\n    # -------- GPU-Enabled XGBoost --------\n    run_model(\n        xgb.XGBRegressor, \"xgb\", X,\n        n_estimators=1000,\n        tree_method='gpu_hist',\n        predictor='gpu_predictor',\n        enable_categorical=True,\n        random_state=42\n    )\n\n    # -------- LightGBM (CPU Recommended) --------\n    run_model(\n        lgb.LGBMRegressor, \"lgb\", X,\n        n_estimators=1000,\n        random_state=42\n    )\n\n    # -------- GPU-Enabled CatBoost --------\n    run_model(\n        cb.CatBoostRegressor, \"catboost\", X,\n        iterations=1000,\n        task_type=\"GPU\",\n        devices='0',\n        random_state=42\n    )\n\n    return oof_preds, results\n\n# -------------------- Run Models --------------------\noof_preds_dict, base_results = model_pipeline(X, y, cat_features_cb)\n\n# -------------------- Ridge Stacking --------------------\nX_oof = pd.DataFrame(oof_preds_dict)\n\ndef objective(trial):\n    alpha = trial.suggest_float(\"alpha\", 1e-3, 10.0, log=True)\n    ridge = Ridge(alpha=alpha)\n    scores = []\n    cv = KFold(n_splits=5, shuffle=True, random_state=42)\n    for tr, va in cv.split(X_oof):\n        ridge.fit(X_oof.iloc[tr], y.iloc[tr])\n        preds = ridge.predict(X_oof.iloc[va])\n        score = mean_squared_error(y.iloc[va], preds, squared=False)\n        scores.append(score)\n    return np.mean(scores)\n\nstudy = optuna.create_study(direction=\"minimize\")\nstudy.optimize(objective, n_trials=30)\n\nbest_params = study.best_params\nprint(\"Best Ridge Params:\", best_params)\n\nridge_model = Ridge(**best_params)\nridge_model.fit(X_oof, y)\nstacked_preds = ridge_model.predict(X_oof)\nstacked_rmse = mean_squared_error(y, stacked_preds, squared=False)\nprint(f\"Stacked Ridge RMSE: {stacked_rmse:.4f}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T13:13:33.906776Z","iopub.execute_input":"2025-06-14T13:13:33.907111Z","iopub.status.idle":"2025-06-14T13:34:45.189930Z","shell.execute_reply.started":"2025-06-14T13:13:33.907078Z","shell.execute_reply":"2025-06-14T13:34:45.189208Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import joblib\njoblib.dump(ridge_model, \"stacked_ridge_model.pkl\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T13:38:16.266217Z","iopub.execute_input":"2025-06-14T13:38:16.266526Z","iopub.status.idle":"2025-06-14T13:38:16.273275Z","shell.execute_reply.started":"2025-06-14T13:38:16.266504Z","shell.execute_reply":"2025-06-14T13:38:16.272675Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df1=pd.read_csv(\"/kaggle/input/burnout-datathon-ieeecsmuj/test.csv\")\nprint(df1.columns.tolist())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T13:40:48.996614Z","iopub.execute_input":"2025-06-14T13:40:48.997187Z","iopub.status.idle":"2025-06-14T13:40:52.313405Z","shell.execute_reply.started":"2025-06-14T13:40:48.997166Z","shell.execute_reply":"2025-06-14T13:40:52.312782Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load validation data\nval_df = pd.read_csv(\"/kaggle/input/burnout-datathon-ieeecsmuj/val.csv\")\n\n# Store true values and drop target for prediction\nval_true_y = np.sqrt(val_df[\"Lap_Time_Seconds\"])\nval_df.drop(\"Lap_Time_Seconds\", axis=1, inplace=True)\n\n# Drop high-cardinality and identifier columns\ndrop_cols = [\n    \"Unique ID\", \"Rider_ID\", \"rider_name\", \"team_name\", \"bike_name\",\n    \"circuit_name\", \"shortname\", \"category_x\", \"year_x\"\n]\nval_df['Penalty'] = val_df['Penalty'].fillna('DNS')\nval_df.drop(columns=drop_cols, inplace=True)\n\n# Target encoding (based on train df statistics)\nfor col in [\"rider\", \"team\", \"bike\"]:\n    val_df[f\"tar_enc_{col}\"] = val_df[col].map(df.groupby(col)[\"Lap_Time_Seconds\"].mean())\n\n# Feature Engineering\nval_df[\"temp_diff\"] = val_df[\"Track_Temperature_Celsius\"] - val_df[\"Ambient_Temperature_Celsius\"]\nval_df[\"speed_per_km\"] = val_df[\"Avg_Speed_kmh\"] / val_df[\"Circuit_Length_km\"]\nval_df[\"degradation_per_corner\"] = val_df[\"Tire_Degradation_Factor_per_Lap\"] / val_df[\"Corners_per_Lap\"]\n\n# Handle missing and categorical columns\ncat_cols = [\n    \"Track_Condition\", \"Tire_Compound_Front\", \"Tire_Compound_Rear\",\n    \"Penalty\", \"Session\", \"weather\", \"track\"\n]\nval_df[cat_cols] = val_df[cat_cols].fillna(\"NaN\").astype(\"category\")\nfor col in val_df.select_dtypes(include='object').columns:\n    val_df[col] = val_df[col].astype('category')\n\n# Ensure columns match training features\nval_df = val_df[X.columns]\n\nval_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T13:58:02.383390Z","iopub.execute_input":"2025-06-14T13:58:02.383696Z","iopub.status.idle":"2025-06-14T13:58:03.977901Z","shell.execute_reply.started":"2025-06-14T13:58:02.383676Z","shell.execute_reply":"2025-06-14T13:58:03.977150Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.metrics import mean_squared_error\nimport joblib\n\n# -------------------- Reload Ridge Stacking Model --------------------\nridge_model = joblib.load(\"stacked_ridge_model.pkl\")\n\n# -------------------- Retrain Base Models on Full Train Set --------------------\nxgb_model = xgb.XGBRegressor(n_estimators=1000, enable_categorical=True, random_state=42)\nlgb_model = lgb.LGBMRegressor(n_estimators=1000, random_state=42)\ncat_model = cb.CatBoostRegressor(iterations=1000, random_state=42, verbose=0)\n\n# Train each base model on full train data\nxgb_model.fit(X, y)\nlgb_model.fit(X, y)\ncat_model.fit(X, y, cat_features=cat_features_cb)\n\n# -------------------- Predict on val_df --------------------\nval_preds_xgb = xgb_model.predict(val_df)\nval_preds_lgb = lgb_model.predict(val_df)\nval_preds_cat = cat_model.predict(val_df)\n\n# -------------------- Stack Predictions --------------------\nval_stack_input = pd.DataFrame({\n    \"xgb\": val_preds_xgb,\n    \"lgb\": val_preds_lgb,\n    \"catboost\": val_preds_cat\n})\n\n# Ridge stack prediction\nstacked_val_preds = ridge_model.predict(val_stack_input)\n\n# -------------------- RMSE Evaluation --------------------\nrmse_val = mean_squared_error(val_true_y, stacked_val_preds, squared=False)\nprint(f\"✅ Stacked Ridge RMSE on val.csv: {rmse_val:.4f}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T14:01:25.850863Z","iopub.execute_input":"2025-06-14T14:01:25.851151Z","iopub.status.idle":"2025-06-14T14:20:13.516217Z","shell.execute_reply.started":"2025-06-14T14:01:25.851130Z","shell.execute_reply":"2025-06-14T14:20:13.515432Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import joblib\njoblib.dump(xgb_model, \"xgb_final_model.pkl\")\njoblib.dump(lgb_model, \"lgb_final_model.pkl\")\njoblib.dump(cat_model, \"catboost_final_model.pkl\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T14:25:00.920314Z","iopub.execute_input":"2025-06-14T14:25:00.920615Z","iopub.status.idle":"2025-06-14T14:25:01.043952Z","shell.execute_reply.started":"2025-06-14T14:25:00.920586Z","shell.execute_reply":"2025-06-14T14:25:01.043209Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport joblib\nfrom sklearn.metrics import mean_squared_error\n\n# -------------------- Load Data --------------------\ntest_df = pd.read_csv(\"/kaggle/input/burnout-datathon-ieeecsmuj/test.csv\")\nsample_submission = pd.read_csv(\"/kaggle/input/burnout-datathon-ieeecsmuj/sample_submission.csv\")\n\n# -------------------- Drop High Cardinality & Redundant Identifiers --------------------\ndrop_cols = [\n    \"Unique ID\", \"Rider_ID\", \"rider_name\", \"team_name\", \"bike_name\",\n    \"circuit_name\", \"shortname\", \"category_x\", \"year_x\"\n]\ntest_df['Penalty'] = test_df['Penalty'].fillna('DNS')\ntest_df.drop(columns=drop_cols, inplace=True)\n\n# -------------------- Target Encoding --------------------\n# Map using train dataframe statistics\nfor col in [\"rider\", \"team\", \"bike\"]:\n    test_df[f\"tar_enc_{col}\"] = test_df[col].map(df.groupby(col)[\"Lap_Time_Seconds\"].mean())\n\n# -------------------- Feature Engineering --------------------\ntest_df[\"temp_diff\"] = test_df[\"Track_Temperature_Celsius\"] - test_df[\"Ambient_Temperature_Celsius\"]\ntest_df[\"speed_per_km\"] = test_df[\"Avg_Speed_kmh\"] / test_df[\"Circuit_Length_km\"]\ntest_df[\"degradation_per_corner\"] = test_df[\"Tire_Degradation_Factor_per_Lap\"] / test_df[\"Corners_per_Lap\"]\n\n# -------------------- Handle Categorical Columns --------------------\ncat_cols = [\n    \"Track_Condition\", \"Tire_Compound_Front\", \"Tire_Compound_Rear\",\n    \"Penalty\", \"Session\", \"weather\", \"track\"\n]\ntest_df[cat_cols] = test_df[cat_cols].fillna(\"NaN\").astype(\"category\")\nfor col in test_df.select_dtypes(include='object').columns:\n    test_df[col] = test_df[col].astype('category')\n\n# -------------------- Align with Training Features --------------------\ntest_df = test_df[X.columns]\n\n# -------------------- Load Trained Models --------------------\nxgb_model = joblib.load(\"xgb_final_model.pkl\")\nlgb_model = joblib.load(\"lgb_final_model.pkl\")\ncat_model = joblib.load(\"catboost_final_model.pkl\")\nridge_model = joblib.load(\"stacked_ridge_model.pkl\")\n\n# -------------------- Predict with Base Models --------------------\ntest_preds_xgb = xgb_model.predict(test_df)\ntest_preds_lgb = lgb_model.predict(test_df)\ntest_preds_cat = cat_model.predict(test_df)\n\n# -------------------- Stack Predictions --------------------\ntest_stack_input = pd.DataFrame({\n    \"xgb\": test_preds_xgb,\n    \"lgb\": test_preds_lgb,\n    \"catboost\": test_preds_cat\n})\n\nfinal_preds = ridge_model.predict(test_stack_input)\nfinal_preds = final_preds ** 2  # Since we trained on sqrt of Lap_Time_Seconds\n\n# -------------------- Prepare Submission --------------------\nsample_submission[\"Lap_Time_Seconds\"] = final_preds\nsample_submission.to_csv(\"solution.csv\", index=False)\nprint(\"✅ solution.csv saved successfully!\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T14:29:04.803053Z","iopub.execute_input":"2025-06-14T14:29:04.803769Z","iopub.status.idle":"2025-06-14T14:29:31.147734Z","shell.execute_reply.started":"2025-06-14T14:29:04.803739Z","shell.execute_reply":"2025-06-14T14:29:31.146946Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nprint(os.getcwd())\nprint(os.listdir(\"/kaggle/working/\"))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T14:33:54.409598Z","iopub.execute_input":"2025-06-14T14:33:54.410273Z","iopub.status.idle":"2025-06-14T14:33:54.414453Z","shell.execute_reply.started":"2025-06-14T14:33:54.410250Z","shell.execute_reply":"2025-06-14T14:33:54.413798Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T14:41:27.695442Z","iopub.execute_input":"2025-06-14T14:41:27.696163Z","iopub.status.idle":"2025-06-14T14:41:27.700861Z","shell.execute_reply.started":"2025-06-14T14:41:27.696140Z","shell.execute_reply":"2025-06-14T14:41:27.700179Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}