{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceType":"competition","sourceId":99552,"databundleVersionId":13441085}],"dockerImageVersionId":31089,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# RSNA Intracranial Aneurysm Detection","metadata":{}},{"cell_type":"code","source":"import os, glob\nimport pandas as pd\nimport numpy as np\nimport pydicom\nimport nibabel as nib\nimport matplotlib.pyplot as plt","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-08-28T06:47:00.247465Z","iopub.execute_input":"2025-08-28T06:47:00.247775Z","iopub.status.idle":"2025-08-28T06:47:01.68608Z","shell.execute_reply.started":"2025-08-28T06:47:00.24775Z","shell.execute_reply":"2025-08-28T06:47:01.685028Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Data Setup","metadata":{}},{"cell_type":"code","source":"DATA_DIR = \"/kaggle/input/rsna-intracranial-aneurysm-detection\"\nprint(\"Data directory contents:\", os.listdir(DATA_DIR))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T06:47:01.687874Z","iopub.execute_input":"2025-08-28T06:47:01.688427Z","iopub.status.idle":"2025-08-28T06:47:01.69456Z","shell.execute_reply.started":"2025-08-28T06:47:01.688393Z","shell.execute_reply":"2025-08-28T06:47:01.693583Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df = pd.read_csv(f\"{DATA_DIR}/train.csv\")\nprint(f\"Train shape: {train_df.shape}\")\ntrain_df.head(2)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T06:47:02.046111Z","iopub.execute_input":"2025-08-28T06:47:02.046938Z","iopub.status.idle":"2025-08-28T06:47:02.109621Z","shell.execute_reply.started":"2025-08-28T06:47:02.046899Z","shell.execute_reply":"2025-08-28T06:47:02.108775Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"locs_df = pd.read_csv(f\"{DATA_DIR}/train_localizers.csv\") \nprint(f\"Localizers shape: {locs_df.shape}\")\nlocs_df.head(2)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T06:47:06.634813Z","iopub.execute_input":"2025-08-28T06:47:06.635171Z","iopub.status.idle":"2025-08-28T06:47:06.673209Z","shell.execute_reply.started":"2025-08-28T06:47:06.635143Z","shell.execute_reply":"2025-08-28T06:47:06.672383Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"location_cols = [\n    \"Left Infraclinoid Internal Carotid Artery\", \"Right Infraclinoid Internal Carotid Artery\",\n    \"Left Supraclinoid Internal Carotid Artery\", \"Right Supraclinoid Internal Carotid Artery\",\n    \"Left Middle Cerebral Artery\", \"Right Middle Cerebral Artery\", \"Anterior Communicating Artery\",\n    \"Left Anterior Cerebral Artery\", \"Right Anterior Cerebral Artery\", \"Left Posterior Communicating Artery\",\n    \"Right Posterior Communicating Artery\", \"Basilar Tip\", \"Other Posterior Circulation\"\n]\n\nprint(f\"Total location columns: {len(location_cols)}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T06:55:11.384073Z","iopub.execute_input":"2025-08-28T06:55:11.384515Z","iopub.status.idle":"2025-08-28T06:55:11.392224Z","shell.execute_reply.started":"2025-08-28T06:55:11.384484Z","shell.execute_reply":"2025-08-28T06:55:11.390866Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Dicom Files","metadata":{}},{"cell_type":"code","source":"series_root = f\"{DATA_DIR}/series\"\navailable_series = set(os.listdir(series_root)) if os.path.exists(series_root) else set()\nprint(f\"Available series folders: {len(available_series)}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T06:48:54.912683Z","iopub.execute_input":"2025-08-28T06:48:54.91301Z","iopub.status.idle":"2025-08-28T06:48:55.086351Z","shell.execute_reply.started":"2025-08-28T06:48:54.912984Z","shell.execute_reply":"2025-08-28T06:48:55.085328Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Data Coverage","metadata":{}},{"cell_type":"code","source":"train_df[\"has_dicom\"] = train_df[\"SeriesInstanceUID\"].isin(available_series)\ncoverage = train_df[\"has_dicom\"].mean()\nprint(f\"Coverage: {coverage:.1%} of train series have DICOM files\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T06:49:11.90021Z","iopub.execute_input":"2025-08-28T06:49:11.901396Z","iopub.status.idle":"2025-08-28T06:49:11.917873Z","shell.execute_reply.started":"2025-08-28T06:49:11.901361Z","shell.execute_reply":"2025-08-28T06:49:11.916943Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Data Splitting","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import GroupKFold\nfrom sklearn.metrics import roc_auc_score","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T06:49:31.195117Z","iopub.execute_input":"2025-08-28T06:49:31.195594Z","iopub.status.idle":"2025-08-28T06:49:31.996652Z","shell.execute_reply.started":"2025-08-28T06:49:31.19556Z","shell.execute_reply":"2025-08-28T06:49:31.99584Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"gkf = GroupKFold(n_splits=5)\ngroups = train_df[\"SeriesInstanceUID\"]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T06:49:40.899545Z","iopub.execute_input":"2025-08-28T06:49:40.900189Z","iopub.status.idle":"2025-08-28T06:49:40.905846Z","shell.execute_reply.started":"2025-08-28T06:49:40.900157Z","shell.execute_reply":"2025-08-28T06:49:40.904728Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"splits = list(gkf.split(train_df, train_df[\"Aneurysm Present\"], groups))\nprint(f\"Created {len(splits)} folds\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T06:49:53.953624Z","iopub.execute_input":"2025-08-28T06:49:53.953999Z","iopub.status.idle":"2025-08-28T06:49:53.977165Z","shell.execute_reply.started":"2025-08-28T06:49:53.953973Z","shell.execute_reply":"2025-08-28T06:49:53.976359Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for i, (train_idx, val_idx) in enumerate(splits[:2]):  # Check first 2 folds\n    val_pos_rate = train_df.iloc[val_idx][\"Aneurysm Present\"].mean()\n    print(f\"Fold {i}: val positive rate = {val_pos_rate:.3f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T06:50:05.742435Z","iopub.execute_input":"2025-08-28T06:50:05.743188Z","iopub.status.idle":"2025-08-28T06:50:05.756624Z","shell.execute_reply.started":"2025-08-28T06:50:05.743151Z","shell.execute_reply":"2025-08-28T06:50:05.755417Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Random Baseline Implementation","metadata":{}},{"cell_type":"code","source":"train_idx, val_idx = splits[0]  # Pick first fold\nval_df = train_df.iloc[val_idx].copy()\nn_val = len(val_df)\nprint(f\"Using fold 0: {n_val} validation samples\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T06:53:20.301149Z","iopub.execute_input":"2025-08-28T06:53:20.301509Z","iopub.status.idle":"2025-08-28T06:53:20.309458Z","shell.execute_reply.started":"2025-08-28T06:53:20.301486Z","shell.execute_reply":"2025-08-28T06:53:20.308332Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"np.random.seed(42)\nrandom_preds = np.random.uniform(0, 1, size=(n_val, 14))  # 14 = 1 presence + 13 locations\nprint(f\"Random predictions shape: {random_preds.shape}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T06:53:37.097498Z","iopub.execute_input":"2025-08-28T06:53:37.097829Z","iopub.status.idle":"2025-08-28T06:53:37.104458Z","shell.execute_reply.started":"2025-08-28T06:53:37.097806Z","shell.execute_reply":"2025-08-28T06:53:37.103404Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"presence_col = \"Aneurysm Present\"\ntrue_labels = val_df[location_cols + [presence_col]].values\nprint(f\"True labels shape: {true_labels.shape}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T06:55:19.590565Z","iopub.execute_input":"2025-08-28T06:55:19.591584Z","iopub.status.idle":"2025-08-28T06:55:19.600347Z","shell.execute_reply.started":"2025-08-28T06:55:19.591553Z","shell.execute_reply":"2025-08-28T06:55:19.59909Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"aucs = []\nfor i in range(14):\n    if len(np.unique(true_labels[:, i])) > 1:  # Need both classes\n        auc = roc_auc_score(true_labels[:, i], random_preds[:, i])\n        aucs.append(auc)\nprint(f\"Random baseline AUCs: {np.mean(aucs):.3f} ± {np.std(aucs):.3f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T06:55:37.135431Z","iopub.execute_input":"2025-08-28T06:55:37.136175Z","iopub.status.idle":"2025-08-28T06:55:37.179301Z","shell.execute_reply.started":"2025-08-28T06:55:37.136141Z","shell.execute_reply":"2025-08-28T06:55:37.177612Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Dicom Loading","metadata":{}},{"cell_type":"code","source":"test_series = val_df[val_df[\"has_dicom\"]][\"SeriesInstanceUID\"].iloc[0]\nprint(f\"Testing with series: {test_series}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T07:06:47.92796Z","iopub.execute_input":"2025-08-28T07:06:47.928337Z","iopub.status.idle":"2025-08-28T07:06:47.935252Z","shell.execute_reply.started":"2025-08-28T07:06:47.928311Z","shell.execute_reply":"2025-08-28T07:06:47.934407Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"series_path = f\"{series_root}/{test_series}\"\nprint(f\"Series path: {series_path}\")\nprint(f\"Path exists: {os.path.exists(series_path)}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T07:07:06.923875Z","iopub.execute_input":"2025-08-28T07:07:06.924191Z","iopub.status.idle":"2025-08-28T07:07:06.934466Z","shell.execute_reply.started":"2025-08-28T07:07:06.924167Z","shell.execute_reply":"2025-08-28T07:07:06.93305Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"if os.path.exists(series_path):\n    contents = os.listdir(series_path)\n    print(f\"Contents: {contents[:5]}\")  # First 5 items\nelse:\n    print(\"Series directory not found\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T07:07:17.997929Z","iopub.execute_input":"2025-08-28T07:07:17.998239Z","iopub.status.idle":"2025-08-28T07:07:18.157446Z","shell.execute_reply.started":"2025-08-28T07:07:17.998217Z","shell.execute_reply":"2025-08-28T07:07:18.156089Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dcm_pattern = f\"{series_root}/{test_series}/*.dcm\"\ndcm_files = sorted(glob.glob(dcm_pattern))\nprint(f\"Found {len(dcm_files)} DICOM files\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T07:07:46.75263Z","iopub.execute_input":"2025-08-28T07:07:46.753174Z","iopub.status.idle":"2025-08-28T07:07:46.765315Z","shell.execute_reply.started":"2025-08-28T07:07:46.75314Z","shell.execute_reply":"2025-08-28T07:07:46.763565Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"if dcm_files:\n    sample_dcm = pydicom.dcmread(dcm_files[0])  # Use first file: dcm_files[0]\n    print(f\"Modality: {sample_dcm.Modality}\")\n    print(f\"Image shape: {sample_dcm.pixel_array.shape}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T07:08:07.148371Z","iopub.execute_input":"2025-08-28T07:08:07.149791Z","iopub.status.idle":"2025-08-28T07:08:07.215638Z","shell.execute_reply.started":"2025-08-28T07:08:07.149716Z","shell.execute_reply":"2025-08-28T07:08:07.214297Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Simple Volume Reconstruction","metadata":{}},{"cell_type":"code","source":"slices = []\nfor dcm_path in dcm_files[:5]:  # Just first 5 for testing\n    ds = pydicom.dcmread(dcm_path)\n    slices.append((ds.InstanceNumber, ds.pixel_array, ds))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T07:08:25.882775Z","iopub.execute_input":"2025-08-28T07:08:25.884491Z","iopub.status.idle":"2025-08-28T07:08:26.007705Z","shell.execute_reply.started":"2025-08-28T07:08:25.884435Z","shell.execute_reply":"2025-08-28T07:08:26.00647Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"slices.sort(key=lambda x: x[0])  # Sort by InstanceNumber (index 0)\narrays = [s[1] for s in slices]  # Extract pixel arrays (index 1)\nvolume_sample = np.stack(arrays, axis=0)  # Shape: (slices, H, W)\nprint(f\"Sample volume shape: {volume_sample.shape}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T07:14:40.360499Z","iopub.execute_input":"2025-08-28T07:14:40.360886Z","iopub.status.idle":"2025-08-28T07:14:40.370401Z","shell.execute_reply.started":"2025-08-28T07:14:40.360861Z","shell.execute_reply":"2025-08-28T07:14:40.369264Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"if len(slices) > 0:\n    ds = slices[0][2]  # Get DICOM metadata from first slice\n    if hasattr(ds, \"RescaleSlope\") and hasattr(ds, \"RescaleIntercept\"):\n        volume_sample = volume_sample * ds.RescaleSlope + ds.RescaleIntercept\n        print(\"Applied rescale transformation\")\nelse:\n    print(\"No slices available for rescale\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T07:17:30.085671Z","iopub.execute_input":"2025-08-28T07:17:30.086046Z","iopub.status.idle":"2025-08-28T07:17:30.092271Z","shell.execute_reply.started":"2025-08-28T07:17:30.086021Z","shell.execute_reply":"2025-08-28T07:17:30.091164Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(6, 4))\nmid_slice = volume_sample[len(volume_sample)//2]\nplt.imshow(mid_slice, cmap='gray')\nplt.title(f\"Middle slice from {test_series}\")\nplt.axis('off')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T07:17:51.835425Z","iopub.execute_input":"2025-08-28T07:17:51.835805Z","iopub.status.idle":"2025-08-28T07:17:52.158224Z","shell.execute_reply.started":"2025-08-28T07:17:51.835779Z","shell.execute_reply":"2025-08-28T07:17:52.157308Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Submission Setup","metadata":{}},{"cell_type":"code","source":"# Define exact column order for submission (critical for API)\nSUBMISSION_COLS = [\n    'SeriesInstanceUID', 'Aneurysm Present',\n    'Left Infraclinoid Internal Carotid Artery', 'Right Infraclinoid Internal Carotid Artery',\n    'Left Supraclinoid Internal Carotid Artery', 'Right Supraclinoid Internal Carotid Artery',\n    'Left Middle Cerebral Artery', 'Right Middle Cerebral Artery',\n    'Anterior Communicating Artery', 'Left Anterior Cerebral Artery', 'Right Anterior Cerebral Artery',\n    'Left Posterior Communicating Artery', 'Right Posterior Communicating Artery',\n    'Basilar Tip', 'Other Posterior Circulation'\n]\nprint(f\"Submission has {len(SUBMISSION_COLS)} columns\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T07:24:31.307542Z","iopub.execute_input":"2025-08-28T07:24:31.307946Z","iopub.status.idle":"2025-08-28T07:24:31.31458Z","shell.execute_reply.started":"2025-08-28T07:24:31.307919Z","shell.execute_reply":"2025-08-28T07:24:31.313657Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Random Prediction","metadata":{}},{"cell_type":"code","source":"import numpy as np\n\ndef generate_random_predictions(series_id, seed=42):\n    \"\"\"Generate random predictions for one series\"\"\"\n    np.random.seed(seed + hash(series_id) % 1000)  # Series-specific seed\n    preds = np.random.uniform(0.1, 0.9, size=14)  # 14 targets\n    return [series_id] + list(preds)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T07:24:57.37375Z","iopub.execute_input":"2025-08-28T07:24:57.374267Z","iopub.status.idle":"2025-08-28T07:24:57.382147Z","shell.execute_reply.started":"2025-08-28T07:24:57.374231Z","shell.execute_reply":"2025-08-28T07:24:57.380437Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Test with dummy series ID\ntest_series = \"dummy_series_123\"\ntest_preds = generate_random_predictions(test_series)\nprint(f\"Generated {len(test_preds)} values for series {test_series}\")\nprint(f\"Sample predictions: {test_preds[1:4]}\")  # First 3 target probabilities","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T07:25:07.203956Z","iopub.execute_input":"2025-08-28T07:25:07.204501Z","iopub.status.idle":"2025-08-28T07:25:07.212412Z","shell.execute_reply.started":"2025-08-28T07:25:07.204459Z","shell.execute_reply":"2025-08-28T07:25:07.211006Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Submission Template","metadata":{}},{"cell_type":"markdown","source":"#### RSNA Intracranial Aneurysm Detection - Random Baseline Submission\nBased on the official demo submission template https://www.kaggle.com/code/ryanholbrook/rsna-aneurysm-detection-demo-submission","metadata":{"execution":{"iopub.status.busy":"2025-08-28T07:29:15.657469Z","iopub.execute_input":"2025-08-28T07:29:15.657854Z","iopub.status.idle":"2025-08-28T07:29:15.700976Z","shell.execute_reply.started":"2025-08-28T07:29:15.657827Z","shell.execute_reply":"2025-08-28T07:29:15.699794Z"}}},{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\n\n# Import the RSNA inference server\nimport kaggle_evaluation.rsna_inference_server\n\n# Define the 14 target columns in exact order\nTARGET_COLS = [\n    'Aneurysm Present',\n    'Left Infraclinoid Internal Carotid Artery', 'Right Infraclinoid Internal Carotid Artery',\n    'Left Supraclinoid Internal Carotid Artery', 'Right Supraclinoid Internal Carotid Artery',\n    'Left Middle Cerebral Artery', 'Right Middle Cerebral Artery',\n    'Anterior Communicating Artery', 'Left Anterior Cerebral Artery', 'Right Anterior Cerebral Artery',\n    'Left Posterior Communicating Artery', 'Right Posterior Communicating Artery',\n    'Basilar Tip', 'Other Posterior Circulation'\n]\n\ndef predict(series_id):\n    \"\"\"\n    Random baseline prediction function\n    \n    Args:\n        series_id: SeriesInstanceUID for the test series\n        \n    Returns:\n        list: List of 14 predictions (not dict!)\n    \"\"\"\n    # Series-specific random seed for reproducibility\n    np.random.seed(abs(hash(series_id)) % (2**32))\n    \n    # Generate 14 random probabilities (0.1 to 0.9)\n    predictions = np.random.uniform(0.1, 0.9, size=14)\n    \n    # Return as LIST (not dictionary)\n    return predictions.tolist()\n\n# Create the inference server with the predict function\ninference_server = kaggle_evaluation.rsna_inference_server.RSNAInferenceServer(predict)\n\n# Run the inference server\nif os.getenv('KAGGLE_IS_COMPETITION_RERUN'):\n    # Production submission mode\n    inference_server.serve()\nelse:\n    # Local testing mode - this runs your predictions on test data\n    inference_server.run_local_gateway()\n    \n    # Try to display results (use pandas since polars may not be available)\n    try:\n        if os.path.exists('/kaggle/working/submission.parquet'):\n            submission_df = pd.read_parquet('/kaggle/working/submission.parquet')\n        else:\n            # Fallback to CSV if parquet not available\n            submission_df = pd.read_csv('/kaggle/working/submission.csv')\n            \n        print(f\"Generated predictions for {len(submission_df)} test series\")\n        print(f\"\\nSubmission shape: {submission_df.shape}\")\n        print(f\"Columns: {list(submission_df.columns)}\")\n        print(\"\\nFirst few random predictions:\")\n        print(submission_df.head())\n        \n        # Show statistics of random predictions\n        pred_cols = [col for col in submission_df.columns if col != 'SeriesInstanceUID']\n        print(f\"\\nRandom baseline statistics:\")\n        for col in pred_cols[:5]:  # Show first 5 columns\n            mean_pred = submission_df[col].mean()\n            print(f\"{col}: mean = {mean_pred:.3f}\")\n            \n    except Exception as e:\n        print(f\"Could not display submission results: {e}\")\n\nprint(\"Random baseline submission process complete!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-28T07:42:51.132335Z","iopub.execute_input":"2025-08-28T07:42:51.133173Z","iopub.status.idle":"2025-08-28T07:42:51.18689Z","shell.execute_reply.started":"2025-08-28T07:42:51.133137Z","shell.execute_reply":"2025-08-28T07:42:51.185485Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}