{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":71549,"databundleVersionId":8561470,"sourceType":"competition"}],"dockerImageVersionId":30787,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"{\"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\":\"nvidiaTeslaT4\",\"dataSources\":[{\"sourceId\":71549,\"databundleVersionId\":8561470,\"sourceType\":\"competition\"}],\"dockerImageVersionId\":30787,\"isInternetEnabled\":true,\"language\":\"python\",\"sourceType\":\"notebook\",\"isGpuEnabled\":true}},\"nbformat_minor\":4,\"nbformat\":4,\"cells\":[{\"cell_type\":\"code\",\"source\":\"import pandas as pdimport matplotlib.pyplot as pltimport cv2import pydicomimport numpy as npimport osimport globfrom tqdm import tqdmfrom tqdm.auto import tqdm import warningstqdm.pandas() \",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:51:12.985424Z\",\"iopub.execute_input\":\"2024-11-14T08:51:12.985731Z\",\"iopub.status.idle\":\"2024-11-14T08:51:14.583480Z\",\"shell.execute_reply.started\":\"2024-11-14T08:51:12.985697Z\",\"shell.execute_reply\":\"2024-11-14T08:51:14.582459Z\"},\"trusted\":true},\"execution_count\":1,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"import randomimport numpy as npimport torchdef set_seed(seed=42):    random.seed(seed)    np.random.seed(seed)    torch.manual_seed(seed)    torch.cuda.manual_seed_all(seed)    # For deterministic behavior    torch.backends.cudnn.deterministic = True    torch.backends.cudnn.benchmark = Falseset_seed(42)\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:51:14.584817Z\",\"iopub.execute_input\":\"2024-11-14T08:51:14.585728Z\",\"iopub.status.idle\":\"2024-11-14T08:51:18.325651Z\",\"shell.execute_reply.started\":\"2024-11-14T08:51:14.585682Z\",\"shell.execute_reply\":\"2024-11-14T08:51:18.324699Z\"},\"trusted\":true},\"execution_count\":2,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"label_coordinates_df = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_label_coordinates.csv')train_series = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_series_descriptions.csv')df_train = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train.csv')\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:51:18.326864Z\",\"iopub.execute_input\":\"2024-11-14T08:51:18.327286Z\",\"iopub.status.idle\":\"2024-11-14T08:51:18.500849Z\",\"shell.execute_reply.started\":\"2024-11-14T08:51:18.327252Z\",\"shell.execute_reply\":\"2024-11-14T08:51:18.499832Z\"},\"trusted\":true},\"execution_count\":3,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"df_train.columns\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:51:18.502817Z\",\"iopub.execute_input\":\"2024-11-14T08:51:18.503581Z\",\"iopub.status.idle\":\"2024-11-14T08:51:18.510681Z\",\"shell.execute_reply.started\":\"2024-11-14T08:51:18.503542Z\",\"shell.execute_reply\":\"2024-11-14T08:51:18.509710Z\"},\"trusted\":true},\"execution_count\":4,\"outputs\":[{\"execution_count\":4,\"output_type\":\"execute_result\",\"data\":{\"text/plain\":\"Index(['study_id', 'spinal_canal_stenosis_l1_l2',       'spinal_canal_stenosis_l2_l3', 'spinal_canal_stenosis_l3_l4',       'spinal_canal_stenosis_l4_l5', 'spinal_canal_stenosis_l5_s1',       'left_neural_foraminal_narrowing_l1_l2',       'left_neural_foraminal_narrowing_l2_l3',       'left_neural_foraminal_narrowing_l3_l4',       'left_neural_foraminal_narrowing_l4_l5',       'left_neural_foraminal_narrowing_l5_s1',       'right_neural_foraminal_narrowing_l1_l2',       'right_neural_foraminal_narrowing_l2_l3',       'right_neural_foraminal_narrowing_l3_l4',       'right_neural_foraminal_narrowing_l4_l5',       'right_neural_foraminal_narrowing_l5_s1',       'left_subarticular_stenosis_l1_l2', 'left_subarticular_stenosis_l2_l3',       'left_subarticular_stenosis_l3_l4', 'left_subarticular_stenosis_l4_l5',       'left_subarticular_stenosis_l5_s1', 'right_subarticular_stenosis_l1_l2',       'right_subarticular_stenosis_l2_l3',       'right_subarticular_stenosis_l3_l4',       'right_subarticular_stenosis_l4_l5',       'right_subarticular_stenosis_l5_s1'],      dtype='object')\"},\"metadata\":{}}]},{\"cell_type\":\"code\",\"source\":\"train_series\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:51:33.776744Z\",\"iopub.execute_input\":\"2024-11-14T08:51:33.777630Z\",\"iopub.status.idle\":\"2024-11-14T08:51:33.788058Z\",\"shell.execute_reply.started\":\"2024-11-14T08:51:33.777588Z\",\"shell.execute_reply\":\"2024-11-14T08:51:33.787099Z\"},\"trusted\":true},\"execution_count\":6,\"outputs\":[{\"execution_count\":6,\"output_type\":\"execute_result\",\"data\":{\"text/plain\":\"        study_id   series_id series_description0        4003253   702807833   Sagittal T2/STIR1        4003253  1054713880        Sagittal T12        4003253  2448190387           Axial T23        4646740  3201256954           Axial T24        4646740  3486248476        Sagittal T1...          ...         ...                ...6289  4287160193  1507070277   Sagittal T2/STIR6290  4287160193  1820446240           Axial T26291  4290709089  3274612423   Sagittal T2/STIR6292  4290709089  3390218084           Axial T26293  4290709089  4237840455        Sagittal T1[6294 rows x 3 columns]\",\"text/html\":\"<div><style scoped>    .dataframe tbody tr th:only-of-type {        vertical-align: middle;    }    .dataframe tbody tr th {        vertical-align: top;    }    .dataframe thead th {        text-align: right;    }</style><table border=\\\"1\\\" class=\\\"dataframe\\\">  <thead>    <tr style=\\\"text-align: right;\\\">      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>series_description</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>4003253</td>      <td>702807833</td>      <td>Sagittal T2/STIR</td>    </tr>    <tr>      <th>1</th>      <td>4003253</td>      <td>1054713880</td>      <td>Sagittal T1</td>    </tr>    <tr>      <th>2</th>      <td>4003253</td>      <td>2448190387</td>      <td>Axial T2</td>    </tr>    <tr>      <th>3</th>      <td>4646740</td>      <td>3201256954</td>      <td>Axial T2</td>    </tr>    <tr>      <th>4</th>      <td>4646740</td>      <td>3486248476</td>      <td>Sagittal T1</td>    </tr>    <tr>      <th>...</th>      <td>...</td>      <td>...</td>      <td>...</td>    </tr>    <tr>      <th>6289</th>      <td>4287160193</td>      <td>1507070277</td>      <td>Sagittal T2/STIR</td>    </tr>    <tr>      <th>6290</th>      <td>4287160193</td>      <td>1820446240</td>      <td>Axial T2</td>    </tr>    <tr>      <th>6291</th>      <td>4290709089</td>      <td>3274612423</td>      <td>Sagittal T2/STIR</td>    </tr>    <tr>      <th>6292</th>      <td>4290709089</td>      <td>3390218084</td>      <td>Axial T2</td>    </tr>    <tr>      <th>6293</th>      <td>4290709089</td>      <td>4237840455</td>      <td>Sagittal T1</td>    </tr>  </tbody></table><p>6294 rows × 3 columns</p></div>\"},\"metadata\":{}}]},{\"cell_type\":\"code\",\"source\":\"label_coordinates_df\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:51:33.904964Z\",\"iopub.execute_input\":\"2024-11-14T08:51:33.905556Z\",\"iopub.status.idle\":\"2024-11-14T08:51:33.920506Z\",\"shell.execute_reply.started\":\"2024-11-14T08:51:33.905521Z\",\"shell.execute_reply\":\"2024-11-14T08:51:33.919472Z\"},\"trusted\":true},\"execution_count\":7,\"outputs\":[{\"execution_count\":7,\"output_type\":\"execute_result\",\"data\":{\"text/plain\":\"         study_id   series_id  instance_number  \\\\0         4003253   702807833                8   1         4003253   702807833                8   2         4003253   702807833                8   3         4003253   702807833                8   4         4003253   702807833                8   ...           ...         ...              ...   48687  4290709089  4237840455               11   48688  4290709089  4237840455               12   48689  4290709089  4237840455               12   48690  4290709089  4237840455               12   48691  4290709089  4237840455               12                                condition  level           x           y  0                Spinal Canal Stenosis  L1/L2  322.831858  227.964602  1                Spinal Canal Stenosis  L2/L3  320.571429  295.714286  2                Spinal Canal Stenosis  L3/L4  323.030303  371.818182  3                Spinal Canal Stenosis  L4/L5  335.292035  427.327434  4                Spinal Canal Stenosis  L5/S1  353.415929  483.964602  ...                                ...    ...         ...         ...  48687  Left Neural Foraminal Narrowing  L1/L2  219.465940   97.831063  48688  Left Neural Foraminal Narrowing  L2/L3  205.340599  140.207084  48689  Left Neural Foraminal Narrowing  L3/L4  202.724796  181.013624  48690  Left Neural Foraminal Narrowing  L4/L5  202.933333  219.733333  48691  Left Neural Foraminal Narrowing  L5/S1  211.813953  259.534884  [48692 rows x 7 columns]\",\"text/html\":\"<div><style scoped>    .dataframe tbody tr th:only-of-type {        vertical-align: middle;    }    .dataframe tbody tr th {        vertical-align: top;    }    .dataframe thead th {        text-align: right;    }</style><table border=\\\"1\\\" class=\\\"dataframe\\\">  <thead>    <tr style=\\\"text-align: right;\\\">      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>instance_number</th>      <th>condition</th>      <th>level</th>      <th>x</th>      <th>y</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>4003253</td>      <td>702807833</td>      <td>8</td>      <td>Spinal Canal Stenosis</td>      <td>L1/L2</td>      <td>322.831858</td>      <td>227.964602</td>    </tr>    <tr>      <th>1</th>      <td>4003253</td>      <td>702807833</td>      <td>8</td>      <td>Spinal Canal Stenosis</td>      <td>L2/L3</td>      <td>320.571429</td>      <td>295.714286</td>    </tr>    <tr>      <th>2</th>      <td>4003253</td>      <td>702807833</td>      <td>8</td>      <td>Spinal Canal Stenosis</td>      <td>L3/L4</td>      <td>323.030303</td>      <td>371.818182</td>    </tr>    <tr>      <th>3</th>      <td>4003253</td>      <td>702807833</td>      <td>8</td>      <td>Spinal Canal Stenosis</td>      <td>L4/L5</td>      <td>335.292035</td>      <td>427.327434</td>    </tr>    <tr>      <th>4</th>      <td>4003253</td>      <td>702807833</td>      <td>8</td>      <td>Spinal Canal Stenosis</td>      <td>L5/S1</td>      <td>353.415929</td>      <td>483.964602</td>    </tr>    <tr>      <th>...</th>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>    </tr>    <tr>      <th>48687</th>      <td>4290709089</td>      <td>4237840455</td>      <td>11</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L1/L2</td>      <td>219.465940</td>      <td>97.831063</td>    </tr>    <tr>      <th>48688</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L2/L3</td>      <td>205.340599</td>      <td>140.207084</td>    </tr>    <tr>      <th>48689</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L3/L4</td>      <td>202.724796</td>      <td>181.013624</td>    </tr>    <tr>      <th>48690</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L4/L5</td>      <td>202.933333</td>      <td>219.733333</td>    </tr>    <tr>      <th>48691</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L5/S1</td>      <td>211.813953</td>      <td>259.534884</td>    </tr>  </tbody></table><p>48692 rows × 7 columns</p></div>\"},\"metadata\":{}}]},{\"cell_type\":\"code\",\"source\":\"merged_outer_df = pd.merge(label_coordinates_df, train_series, on=['study_id', 'series_id'], how='outer')merged_outer_df\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:51:34.140737Z\",\"iopub.execute_input\":\"2024-11-14T08:51:34.141034Z\",\"iopub.status.idle\":\"2024-11-14T08:51:34.186585Z\",\"shell.execute_reply.started\":\"2024-11-14T08:51:34.141002Z\",\"shell.execute_reply\":\"2024-11-14T08:51:34.185627Z\"},\"trusted\":true},\"execution_count\":8,\"outputs\":[{\"execution_count\":8,\"output_type\":\"execute_result\",\"data\":{\"text/plain\":\"         study_id   series_id  instance_number  \\\\0         4003253   702807833              8.0   1         4003253   702807833              8.0   2         4003253   702807833              8.0   3         4003253   702807833              8.0   4         4003253   702807833              8.0   ...           ...         ...              ...   48690  4290709089  4237840455             11.0   48691  4290709089  4237840455             12.0   48692  4290709089  4237840455             12.0   48693  4290709089  4237840455             12.0   48694  4290709089  4237840455             12.0                                condition  level           x           y  \\\\0                Spinal Canal Stenosis  L1/L2  322.831858  227.964602   1                Spinal Canal Stenosis  L2/L3  320.571429  295.714286   2                Spinal Canal Stenosis  L3/L4  323.030303  371.818182   3                Spinal Canal Stenosis  L4/L5  335.292035  427.327434   4                Spinal Canal Stenosis  L5/S1  353.415929  483.964602   ...                                ...    ...         ...         ...   48690  Left Neural Foraminal Narrowing  L1/L2  219.465940   97.831063   48691  Left Neural Foraminal Narrowing  L2/L3  205.340599  140.207084   48692  Left Neural Foraminal Narrowing  L3/L4  202.724796  181.013624   48693  Left Neural Foraminal Narrowing  L4/L5  202.933333  219.733333   48694  Left Neural Foraminal Narrowing  L5/S1  211.813953  259.534884         series_description  0       Sagittal T2/STIR  1       Sagittal T2/STIR  2       Sagittal T2/STIR  3       Sagittal T2/STIR  4       Sagittal T2/STIR  ...                  ...  48690        Sagittal T1  48691        Sagittal T1  48692        Sagittal T1  48693        Sagittal T1  48694        Sagittal T1  [48695 rows x 8 columns]\",\"text/html\":\"<div><style scoped>    .dataframe tbody tr th:only-of-type {        vertical-align: middle;    }    .dataframe tbody tr th {        vertical-align: top;    }    .dataframe thead th {        text-align: right;    }</style><table border=\\\"1\\\" class=\\\"dataframe\\\">  <thead>    <tr style=\\\"text-align: right;\\\">      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>instance_number</th>      <th>condition</th>      <th>level</th>      <th>x</th>      <th>y</th>      <th>series_description</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L1/L2</td>      <td>322.831858</td>      <td>227.964602</td>      <td>Sagittal T2/STIR</td>    </tr>    <tr>      <th>1</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L2/L3</td>      <td>320.571429</td>      <td>295.714286</td>      <td>Sagittal T2/STIR</td>    </tr>    <tr>      <th>2</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L3/L4</td>      <td>323.030303</td>      <td>371.818182</td>      <td>Sagittal T2/STIR</td>    </tr>    <tr>      <th>3</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L4/L5</td>      <td>335.292035</td>      <td>427.327434</td>      <td>Sagittal T2/STIR</td>    </tr>    <tr>      <th>4</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L5/S1</td>      <td>353.415929</td>      <td>483.964602</td>      <td>Sagittal T2/STIR</td>    </tr>    <tr>      <th>...</th>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>    </tr>    <tr>      <th>48690</th>      <td>4290709089</td>      <td>4237840455</td>      <td>11.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L1/L2</td>      <td>219.465940</td>      <td>97.831063</td>      <td>Sagittal T1</td>    </tr>    <tr>      <th>48691</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L2/L3</td>      <td>205.340599</td>      <td>140.207084</td>      <td>Sagittal T1</td>    </tr>    <tr>      <th>48692</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L3/L4</td>      <td>202.724796</td>      <td>181.013624</td>      <td>Sagittal T1</td>    </tr>    <tr>      <th>48693</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L4/L5</td>      <td>202.933333</td>      <td>219.733333</td>      <td>Sagittal T1</td>    </tr>    <tr>      <th>48694</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L5/S1</td>      <td>211.813953</td>      <td>259.534884</td>      <td>Sagittal T1</td>    </tr>  </tbody></table><p>48695 rows × 8 columns</p></div>\"},\"metadata\":{}}]},{\"cell_type\":\"code\",\"source\":\"main_path = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images'def generate_filepath(row):    if pd.notna(row['study_id']) and pd.notna(row['series_id']) and pd.notna(row['instance_number']):        file_path = f\\\"{main_path}/{row['study_id']}/{row['series_id']}/{int(row['instance_number'])}.dcm\\\"        return file_path if os.path.exists(file_path) else None    return Nonemerged_outer_df['filepath'] = merged_outer_df.progress_apply(generate_filepath, axis=1)merged_outer_df\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:51:34.408000Z\",\"iopub.execute_input\":\"2024-11-14T08:51:34.408338Z\",\"iopub.status.idle\":\"2024-11-14T08:53:01.675877Z\",\"shell.execute_reply.started\":\"2024-11-14T08:51:34.408305Z\",\"shell.execute_reply\":\"2024-11-14T08:53:01.674919Z\"},\"trusted\":true},\"execution_count\":9,\"outputs\":[{\"output_type\":\"display_data\",\"data\":{\"text/plain\":\"  0%|          | 0/48695 [00:00<?, ?it/s]\",\"application/vnd.jupyter.widget-view+json\":{\"version_major\":2,\"version_minor\":0,\"model_id\":\"f2a472a513b3406b95af154064d09698\"}},\"metadata\":{}},{\"execution_count\":9,\"output_type\":\"execute_result\",\"data\":{\"text/plain\":\"         study_id   series_id  instance_number  \\\\0         4003253   702807833              8.0   1         4003253   702807833              8.0   2         4003253   702807833              8.0   3         4003253   702807833              8.0   4         4003253   702807833              8.0   ...           ...         ...              ...   48690  4290709089  4237840455             11.0   48691  4290709089  4237840455             12.0   48692  4290709089  4237840455             12.0   48693  4290709089  4237840455             12.0   48694  4290709089  4237840455             12.0                                condition  level           x           y  \\\\0                Spinal Canal Stenosis  L1/L2  322.831858  227.964602   1                Spinal Canal Stenosis  L2/L3  320.571429  295.714286   2                Spinal Canal Stenosis  L3/L4  323.030303  371.818182   3                Spinal Canal Stenosis  L4/L5  335.292035  427.327434   4                Spinal Canal Stenosis  L5/S1  353.415929  483.964602   ...                                ...    ...         ...         ...   48690  Left Neural Foraminal Narrowing  L1/L2  219.465940   97.831063   48691  Left Neural Foraminal Narrowing  L2/L3  205.340599  140.207084   48692  Left Neural Foraminal Narrowing  L3/L4  202.724796  181.013624   48693  Left Neural Foraminal Narrowing  L4/L5  202.933333  219.733333   48694  Left Neural Foraminal Narrowing  L5/S1  211.813953  259.534884         series_description                                           filepath  0       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  1       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  2       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  3       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  4       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  ...                  ...                                                ...  48690        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  48691        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  48692        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  48693        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  48694        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  [48695 rows x 9 columns]\",\"text/html\":\"<div><style scoped>    .dataframe tbody tr th:only-of-type {        vertical-align: middle;    }    .dataframe tbody tr th {        vertical-align: top;    }    .dataframe thead th {        text-align: right;    }</style><table border=\\\"1\\\" class=\\\"dataframe\\\">  <thead>    <tr style=\\\"text-align: right;\\\">      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>instance_number</th>      <th>condition</th>      <th>level</th>      <th>x</th>      <th>y</th>      <th>series_description</th>      <th>filepath</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L1/L2</td>      <td>322.831858</td>      <td>227.964602</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>1</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L2/L3</td>      <td>320.571429</td>      <td>295.714286</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>2</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L3/L4</td>      <td>323.030303</td>      <td>371.818182</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>3</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L4/L5</td>      <td>335.292035</td>      <td>427.327434</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>4</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L5/S1</td>      <td>353.415929</td>      <td>483.964602</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>...</th>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>    </tr>    <tr>      <th>48690</th>      <td>4290709089</td>      <td>4237840455</td>      <td>11.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L1/L2</td>      <td>219.465940</td>      <td>97.831063</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>48691</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L2/L3</td>      <td>205.340599</td>      <td>140.207084</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>48692</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L3/L4</td>      <td>202.724796</td>      <td>181.013624</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>48693</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L4/L5</td>      <td>202.933333</td>      <td>219.733333</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>48694</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L5/S1</td>      <td>211.813953</td>      <td>259.534884</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>  </tbody></table><p>48695 rows × 9 columns</p></div>\"},\"metadata\":{}}]},{\"cell_type\":\"code\",\"source\":\"nan_rows = merged_outer_df[merged_outer_df.isna().any(axis=1)]print(\\\"\\Rows with NaN values in merged_outer_df:\\\")nan_rows#The study-id 3008676218 doesn't have an samples in the trainnig data and there are labels and some of nan #let's just drop it# for the other case no data for these series id but it have other data that can complete the predictions\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:53:01.713622Z\",\"iopub.execute_input\":\"2024-11-14T08:53:01.713907Z\",\"iopub.status.idle\":\"2024-11-14T08:53:01.747619Z\",\"shell.execute_reply.started\":\"2024-11-14T08:53:01.713875Z\",\"shell.execute_reply\":\"2024-11-14T08:53:01.746738Z\"},\"trusted\":true},\"execution_count\":11,\"outputs\":[{\"name\":\"stdout\",\"text\":\"Rows with NaN values in merged_outer_df:\",\"output_type\":\"stream\"},{\"execution_count\":11,\"output_type\":\"execute_result\",\"data\":{\"text/plain\":\"         study_id   series_id  instance_number condition level   x   y  \\\\33978  3008676218   542282425              NaN       NaN   NaN NaN NaN   33979  3008676218  3636216534              NaN       NaN   NaN NaN NaN   41256  3637444890  3892989905              NaN       NaN   NaN NaN NaN         series_description filepath  33978        Sagittal T1     None  33979           Axial T2     None  41256   Sagittal T2/STIR     None  \",\"text/html\":\"<div><style scoped>    .dataframe tbody tr th:only-of-type {        vertical-align: middle;    }    .dataframe tbody tr th {        vertical-align: top;    }    .dataframe thead th {        text-align: right;    }</style><table border=\\\"1\\\" class=\\\"dataframe\\\">  <thead>    <tr style=\\\"text-align: right;\\\">      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>instance_number</th>      <th>condition</th>      <th>level</th>      <th>x</th>      <th>y</th>      <th>series_description</th>      <th>filepath</th>    </tr>  </thead>  <tbody>    <tr>      <th>33978</th>      <td>3008676218</td>      <td>542282425</td>      <td>NaN</td>      <td>NaN</td>      <td>NaN</td>      <td>NaN</td>      <td>NaN</td>      <td>Sagittal T1</td>      <td>None</td>    </tr>    <tr>      <th>33979</th>      <td>3008676218</td>      <td>3636216534</td>      <td>NaN</td>      <td>NaN</td>      <td>NaN</td>      <td>NaN</td>      <td>NaN</td>      <td>Axial T2</td>      <td>None</td>    </tr>    <tr>      <th>41256</th>      <td>3637444890</td>      <td>3892989905</td>      <td>NaN</td>      <td>NaN</td>      <td>NaN</td>      <td>NaN</td>      <td>NaN</td>      <td>Sagittal T2/STIR</td>      <td>None</td>    </tr>  </tbody></table></div>\"},\"metadata\":{}}]},{\"cell_type\":\"code\",\"source\":\"merged_outer_df = merged_outer_df.dropna()merged_outer_df\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:53:01.749913Z\",\"iopub.execute_input\":\"2024-11-14T08:53:01.750697Z\",\"iopub.status.idle\":\"2024-11-14T08:53:01.788342Z\",\"shell.execute_reply.started\":\"2024-11-14T08:53:01.750651Z\",\"shell.execute_reply\":\"2024-11-14T08:53:01.787548Z\"},\"trusted\":true},\"execution_count\":12,\"outputs\":[{\"execution_count\":12,\"output_type\":\"execute_result\",\"data\":{\"text/plain\":\"         study_id   series_id  instance_number  \\\\0         4003253   702807833              8.0   1         4003253   702807833              8.0   2         4003253   702807833              8.0   3         4003253   702807833              8.0   4         4003253   702807833              8.0   ...           ...         ...              ...   48690  4290709089  4237840455             11.0   48691  4290709089  4237840455             12.0   48692  4290709089  4237840455             12.0   48693  4290709089  4237840455             12.0   48694  4290709089  4237840455             12.0                                condition  level           x           y  \\\\0                Spinal Canal Stenosis  L1/L2  322.831858  227.964602   1                Spinal Canal Stenosis  L2/L3  320.571429  295.714286   2                Spinal Canal Stenosis  L3/L4  323.030303  371.818182   3                Spinal Canal Stenosis  L4/L5  335.292035  427.327434   4                Spinal Canal Stenosis  L5/S1  353.415929  483.964602   ...                                ...    ...         ...         ...   48690  Left Neural Foraminal Narrowing  L1/L2  219.465940   97.831063   48691  Left Neural Foraminal Narrowing  L2/L3  205.340599  140.207084   48692  Left Neural Foraminal Narrowing  L3/L4  202.724796  181.013624   48693  Left Neural Foraminal Narrowing  L4/L5  202.933333  219.733333   48694  Left Neural Foraminal Narrowing  L5/S1  211.813953  259.534884         series_description                                           filepath  0       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  1       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  2       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  3       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  4       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  ...                  ...                                                ...  48690        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  48691        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  48692        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  48693        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  48694        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  [48692 rows x 9 columns]\",\"text/html\":\"<div><style scoped>    .dataframe tbody tr th:only-of-type {        vertical-align: middle;    }    .dataframe tbody tr th {        vertical-align: top;    }    .dataframe thead th {        text-align: right;    }</style><table border=\\\"1\\\" class=\\\"dataframe\\\">  <thead>    <tr style=\\\"text-align: right;\\\">      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>instance_number</th>      <th>condition</th>      <th>level</th>      <th>x</th>      <th>y</th>      <th>series_description</th>      <th>filepath</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L1/L2</td>      <td>322.831858</td>      <td>227.964602</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>1</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L2/L3</td>      <td>320.571429</td>      <td>295.714286</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>2</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L3/L4</td>      <td>323.030303</td>      <td>371.818182</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>3</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L4/L5</td>      <td>335.292035</td>      <td>427.327434</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>4</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L5/S1</td>      <td>353.415929</td>      <td>483.964602</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>...</th>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>    </tr>    <tr>      <th>48690</th>      <td>4290709089</td>      <td>4237840455</td>      <td>11.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L1/L2</td>      <td>219.465940</td>      <td>97.831063</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>48691</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L2/L3</td>      <td>205.340599</td>      <td>140.207084</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>48692</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L3/L4</td>      <td>202.724796</td>      <td>181.013624</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>48693</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L4/L5</td>      <td>202.933333</td>      <td>219.733333</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>48694</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L5/S1</td>      <td>211.813953</td>      <td>259.534884</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>  </tbody></table><p>48692 rows × 9 columns</p></div>\"},\"metadata\":{}}]},{\"cell_type\":\"code\",\"source\":\"nan_rows = df_train[df_train.isna().any(axis=1)]print(\\\"\\Rows with NaN values in merged_outer_df:\\\")display(nan_rows)\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:53:01.789241Z\",\"iopub.execute_input\":\"2024-11-14T08:53:01.789500Z\",\"iopub.status.idle\":\"2024-11-14T08:53:01.822100Z\",\"shell.execute_reply.started\":\"2024-11-14T08:53:01.789472Z\",\"shell.execute_reply\":\"2024-11-14T08:53:01.821291Z\"},\"trusted\":true},\"execution_count\":13,\"outputs\":[{\"name\":\"stdout\",\"text\":\"Rows with NaN values in merged_outer_df:\",\"output_type\":\"stream\"},{\"output_type\":\"display_data\",\"data\":{\"text/plain\":\"        study_id spinal_canal_stenosis_l1_l2 spinal_canal_stenosis_l2_l3  \\\\16      46494080                 Normal/Mild                 Normal/Mild   24      64092030                 Normal/Mild                 Normal/Mild   30      74782131                 Normal/Mild                 Normal/Mild   43      97086905                 Normal/Mild                 Normal/Mild   73     159721286                 Normal/Mild                 Normal/Mild   ...          ...                         ...                         ...   1905  4140710202                 Normal/Mild                 Normal/Mild   1911  4146959702                 Normal/Mild                 Normal/Mild   1925  4175603528                 Normal/Mild                 Normal/Mild   1950  4232806580                 Normal/Mild                 Normal/Mild   1958  4255570773                 Normal/Mild                 Normal/Mild        spinal_canal_stenosis_l3_l4 spinal_canal_stenosis_l4_l5  \\\\16                      Moderate                 Normal/Mild   24                   Normal/Mild                 Normal/Mild   30                   Normal/Mild                 Normal/Mild   43                   Normal/Mild                 Normal/Mild   73                   Normal/Mild                    Moderate   ...                          ...                         ...   1905                 Normal/Mild                 Normal/Mild   1911                 Normal/Mild                 Normal/Mild   1925                 Normal/Mild                 Normal/Mild   1950                 Normal/Mild                 Normal/Mild   1958                 Normal/Mild                 Normal/Mild        spinal_canal_stenosis_l5_s1 left_neural_foraminal_narrowing_l1_l2  \\\\16                   Normal/Mild                           Normal/Mild   24                   Normal/Mild                           Normal/Mild   30                   Normal/Mild                           Normal/Mild   43                   Normal/Mild                           Normal/Mild   73                   Normal/Mild                           Normal/Mild   ...                          ...                                   ...   1905                 Normal/Mild                           Normal/Mild   1911                 Normal/Mild                           Normal/Mild   1925                 Normal/Mild                           Normal/Mild   1950                 Normal/Mild                           Normal/Mild   1958                 Normal/Mild                           Normal/Mild        left_neural_foraminal_narrowing_l2_l3  \\\\16                             Normal/Mild   24                             Normal/Mild   30                             Normal/Mild   43                             Normal/Mild   73                             Normal/Mild   ...                                    ...   1905                           Normal/Mild   1911                           Normal/Mild   1925                           Normal/Mild   1950                           Normal/Mild   1958                           Normal/Mild        left_neural_foraminal_narrowing_l3_l4  \\\\16                             Normal/Mild   24                             Normal/Mild   30                             Normal/Mild   43                                Moderate   73                                Moderate   ...                                    ...   1905                           Normal/Mild   1911                           Normal/Mild   1925                           Normal/Mild   1950                           Normal/Mild   1958                           Normal/Mild        left_neural_foraminal_narrowing_l4_l5  ...  \\\\16                             Normal/Mild  ...   24                                Moderate  ...   30                             Normal/Mild  ...   43                             Normal/Mild  ...   73                                Moderate  ...   ...                                    ...  ...   1905                              Moderate  ...   1911                           Normal/Mild  ...   1925                           Normal/Mild  ...   1950                           Normal/Mild  ...   1958                           Normal/Mild  ...        left_subarticular_stenosis_l1_l2 left_subarticular_stenosis_l2_l3  \\\\16                                NaN                              NaN   24                                NaN                      Normal/Mild   30                                NaN                      Normal/Mild   43                                NaN                      Normal/Mild   73                                NaN                              NaN   ...                               ...                              ...   1905                              NaN                      Normal/Mild   1911                              NaN                      Normal/Mild   1925                              NaN                      Normal/Mild   1950                              NaN                              NaN   1958                              NaN                      Normal/Mild        left_subarticular_stenosis_l3_l4 left_subarticular_stenosis_l4_l5  \\\\16                        Normal/Mild                         Moderate   24                                NaN                         Moderate   30                        Normal/Mild                      Normal/Mild   43                        Normal/Mild                         Moderate   73                        Normal/Mild                         Moderate   ...                               ...                              ...   1905                      Normal/Mild                         Moderate   1911                      Normal/Mild                      Normal/Mild   1925                      Normal/Mild                      Normal/Mild   1950                         Moderate                         Moderate   1958                      Normal/Mild                      Normal/Mild        left_subarticular_stenosis_l5_s1 right_subarticular_stenosis_l1_l2  \\\\16                           Moderate                               NaN   24                           Moderate                               NaN   30                        Normal/Mild                               NaN   43                        Normal/Mild                               NaN   73                        Normal/Mild                               NaN   ...                               ...                               ...   1905                      Normal/Mild                               NaN   1911                      Normal/Mild                               NaN   1925                      Normal/Mild                               NaN   1950                         Moderate                               NaN   1958                      Normal/Mild                               NaN        right_subarticular_stenosis_l2_l3 right_subarticular_stenosis_l3_l4  \\\\16                                 NaN                          Moderate   24                            Moderate                               NaN   30                         Normal/Mild                       Normal/Mild   43                         Normal/Mild                       Normal/Mild   73                                 NaN                          Moderate   ...                                ...                               ...   1905                       Normal/Mild                       Normal/Mild   1911                       Normal/Mild                       Normal/Mild   1925                       Normal/Mild                       Normal/Mild   1950                               NaN                       Normal/Mild   1958                       Normal/Mild                       Normal/Mild        right_subarticular_stenosis_l4_l5 right_subarticular_stenosis_l5_s1  16                            Moderate                       Normal/Mild  24                         Normal/Mild                       Normal/Mild  30                         Normal/Mild                       Normal/Mild  43                            Moderate                       Normal/Mild  73                              Severe                       Normal/Mild  ...                                ...                               ...  1905                       Normal/Mild                       Normal/Mild  1911                       Normal/Mild                       Normal/Mild  1925                       Normal/Mild                       Normal/Mild  1950                          Moderate                       Normal/Mild  1958                       Normal/Mild                       Normal/Mild  [185 rows x 26 columns]\",\"text/html\":\"<div><style scoped>    .dataframe tbody tr th:only-of-type {        vertical-align: middle;    }    .dataframe tbody tr th {        vertical-align: top;    }    .dataframe thead th {        text-align: right;    }</style><table border=\\\"1\\\" class=\\\"dataframe\\\">  <thead>    <tr style=\\\"text-align: right;\\\">      <th></th>      <th>study_id</th>      <th>spinal_canal_stenosis_l1_l2</th>      <th>spinal_canal_stenosis_l2_l3</th>      <th>spinal_canal_stenosis_l3_l4</th>      <th>spinal_canal_stenosis_l4_l5</th>      <th>spinal_canal_stenosis_l5_s1</th>      <th>left_neural_foraminal_narrowing_l1_l2</th>      <th>left_neural_foraminal_narrowing_l2_l3</th>      <th>left_neural_foraminal_narrowing_l3_l4</th>      <th>left_neural_foraminal_narrowing_l4_l5</th>      <th>...</th>      <th>left_subarticular_stenosis_l1_l2</th>      <th>left_subarticular_stenosis_l2_l3</th>      <th>left_subarticular_stenosis_l3_l4</th>      <th>left_subarticular_stenosis_l4_l5</th>      <th>left_subarticular_stenosis_l5_s1</th>      <th>right_subarticular_stenosis_l1_l2</th>      <th>right_subarticular_stenosis_l2_l3</th>      <th>right_subarticular_stenosis_l3_l4</th>      <th>right_subarticular_stenosis_l4_l5</th>      <th>right_subarticular_stenosis_l5_s1</th>    </tr>  </thead>  <tbody>    <tr>      <th>16</th>      <td>46494080</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>...</td>      <td>NaN</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Moderate</td>      <td>NaN</td>      <td>NaN</td>      <td>Moderate</td>      <td>Moderate</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>24</th>      <td>64092030</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>...</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>NaN</td>      <td>Moderate</td>      <td>Moderate</td>      <td>NaN</td>      <td>Moderate</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>30</th>      <td>74782131</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>...</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>43</th>      <td>97086905</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Normal/Mild</td>      <td>...</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Normal/Mild</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>73</th>      <td>159721286</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Moderate</td>      <td>...</td>      <td>NaN</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Normal/Mild</td>      <td>NaN</td>      <td>NaN</td>      <td>Moderate</td>      <td>Severe</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>...</th>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>    </tr>    <tr>      <th>1905</th>      <td>4140710202</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>...</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Normal/Mild</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>1911</th>      <td>4146959702</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>...</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>1925</th>      <td>4175603528</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>...</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>1950</th>      <td>4232806580</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>...</td>      <td>NaN</td>      <td>NaN</td>      <td>Moderate</td>      <td>Moderate</td>      <td>Moderate</td>      <td>NaN</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>1958</th>      <td>4255570773</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>...</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>    </tr>  </tbody></table><p>185 rows × 26 columns</p></div>\"},\"metadata\":{}}]},{\"cell_type\":\"code\",\"source\":\"def get_severity_column(condition, level):    # Convert the condition and level to match the column names in df_train    condition_formatted = condition.lower().replace(' ', '_')    level_formatted = level.lower().replace('/', '_')    return f\\\"{condition_formatted}_{level_formatted}\\\"# Add a new 'severity' column to merged_outer_dfdef map_severity(row):    # Get the severity column name for the row    severity_column = get_severity_column(row['condition'], row['level'])    # Fetch the severity value from df_train using study_id    severity_value = df_train.loc[df_train['study_id'] == row['study_id'], severity_column]    # Return the severity value if available, otherwise return None    return severity_value.values[0] if not severity_value.empty else None# Apply the mapping function to each row in merged_outer_dfmerged_outer_df.loc[:, 'severity'] = merged_outer_df.progress_apply(map_severity, axis=1)# Display the updated DataFrameprint(\\\"Merged DataFrame with Severity:\\\")merged_outer_df.head()\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:53:36.080865Z\",\"iopub.execute_input\":\"2024-11-14T08:53:36.081249Z\",\"iopub.status.idle\":\"2024-11-14T08:53:54.102834Z\",\"shell.execute_reply.started\":\"2024-11-14T08:53:36.081213Z\",\"shell.execute_reply\":\"2024-11-14T08:53:54.101921Z\"},\"trusted\":true},\"execution_count\":14,\"outputs\":[{\"output_type\":\"display_data\",\"data\":{\"text/plain\":\"  0%|          | 0/48692 [00:00<?, ?it/s]\",\"application/vnd.jupyter.widget-view+json\":{\"version_major\":2,\"version_minor\":0,\"model_id\":\"7a53f2b9b51c46718433f835cff76236\"}},\"metadata\":{}},{\"name\":\"stdout\",\"text\":\"Merged DataFrame with Severity:\",\"output_type\":\"stream\"},{\"name\":\"stderr\",\"text\":\"/tmp/ipykernel_30/2475733211.py:17: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.Try using .loc[row_indexer,col_indexer] = value insteadSee the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy  merged_outer_df.loc[:, 'severity'] = merged_outer_df.progress_apply(map_severity, axis=1)\",\"output_type\":\"stream\"},{\"execution_count\":14,\"output_type\":\"execute_result\",\"data\":{\"text/plain\":\"   study_id  series_id  instance_number              condition  level  \\\\0   4003253  702807833              8.0  Spinal Canal Stenosis  L1/L2   1   4003253  702807833              8.0  Spinal Canal Stenosis  L2/L3   2   4003253  702807833              8.0  Spinal Canal Stenosis  L3/L4   3   4003253  702807833              8.0  Spinal Canal Stenosis  L4/L5   4   4003253  702807833              8.0  Spinal Canal Stenosis  L5/S1               x           y series_description  \\\\0  322.831858  227.964602   Sagittal T2/STIR   1  320.571429  295.714286   Sagittal T2/STIR   2  323.030303  371.818182   Sagittal T2/STIR   3  335.292035  427.327434   Sagittal T2/STIR   4  353.415929  483.964602   Sagittal T2/STIR                                               filepath     severity  0  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  Normal/Mild  1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  Normal/Mild  2  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  Normal/Mild  3  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  Normal/Mild  4  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  Normal/Mild  \",\"text/html\":\"<div><style scoped>    .dataframe tbody tr th:only-of-type {        vertical-align: middle;    }    .dataframe tbody tr th {        vertical-align: top;    }    .dataframe thead th {        text-align: right;    }</style><table border=\\\"1\\\" class=\\\"dataframe\\\">  <thead>    <tr style=\\\"text-align: right;\\\">      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>instance_number</th>      <th>condition</th>      <th>level</th>      <th>x</th>      <th>y</th>      <th>series_description</th>      <th>filepath</th>      <th>severity</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L1/L2</td>      <td>322.831858</td>      <td>227.964602</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>1</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L2/L3</td>      <td>320.571429</td>      <td>295.714286</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>2</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L3/L4</td>      <td>323.030303</td>      <td>371.818182</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>3</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L4/L5</td>      <td>335.292035</td>      <td>427.327434</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>4</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L5/S1</td>      <td>353.415929</td>      <td>483.964602</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>      <td>Normal/Mild</td>    </tr>  </tbody></table></div>\"},\"metadata\":{}}]},{\"cell_type\":\"code\",\"source\":\"merged_outer_df['severity'].unique()\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:53:54.104331Z\",\"iopub.execute_input\":\"2024-11-14T08:53:54.104678Z\",\"iopub.status.idle\":\"2024-11-14T08:53:54.116031Z\",\"shell.execute_reply.started\":\"2024-11-14T08:53:54.104645Z\",\"shell.execute_reply\":\"2024-11-14T08:53:54.115212Z\"},\"trusted\":true},\"execution_count\":15,\"outputs\":[{\"execution_count\":15,\"output_type\":\"execute_result\",\"data\":{\"text/plain\":\"array(['Normal/Mild', 'Moderate', 'Severe', nan], dtype=object)\"},\"metadata\":{}}]},{\"cell_type\":\"code\",\"source\":\"# Group by 'study_id', 'series_id', and 'series_description' and aggregate the columns into listsgrouped_df = merged_outer_df.groupby(['study_id', 'series_id', 'series_description']).agg({    'instance_number': lambda x: list(x),    'condition': lambda x: list(x),    'level': lambda x: list(x),    'x': lambda x: list(x),    'y': lambda x: list(x),    'filepath': lambda x: list(x),    'severity': lambda x: list(x)}).reset_index()grouped_df\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:54:00.227068Z\",\"iopub.execute_input\":\"2024-11-14T08:54:00.227708Z\",\"iopub.status.idle\":\"2024-11-14T08:54:01.482381Z\",\"shell.execute_reply.started\":\"2024-11-14T08:54:00.227664Z\",\"shell.execute_reply\":\"2024-11-14T08:54:01.481484Z\"},\"trusted\":true},\"execution_count\":16,\"outputs\":[{\"execution_count\":16,\"output_type\":\"execute_result\",\"data\":{\"text/plain\":\"        study_id   series_id series_description  \\\\0        4003253   702807833   Sagittal T2/STIR   1        4003253  1054713880        Sagittal T1   2        4003253  2448190387           Axial T2   3        4646740  3201256954           Axial T2   4        4646740  3486248476        Sagittal T1   ...          ...         ...                ...   6286  4287160193  1507070277   Sagittal T2/STIR   6287  4287160193  1820446240           Axial T2   6288  4290709089  3274612423   Sagittal T2/STIR   6289  4290709089  3390218084           Axial T2   6290  4290709089  4237840455        Sagittal T1                                           instance_number  \\\\0                             [8.0, 8.0, 8.0, 8.0, 8.0]   1     [4.0, 4.0, 5.0, 6.0, 6.0, 11.0, 11.0, 11.0, 12...   2     [3.0, 4.0, 11.0, 11.0, 19.0, 19.0, 28.0, 28.0,...   3     [15.0, 16.0, 22.0, 22.0, 28.0, 29.0, 34.0, 34....   4     [5.0, 5.0, 5.0, 6.0, 7.0, 15.0, 15.0, 16.0, 17...   ...                                                 ...   6286                          [8.0, 8.0, 8.0, 8.0, 8.0]   6287  [4.0, 4.0, 9.0, 10.0, 16.0, 16.0, 22.0, 22.0, ...   6288                          [9.0, 9.0, 9.0, 9.0, 9.0]   6289  [2.0, 3.0, 5.0, 6.0, 10.0, 10.0, 15.0, 15.0, 2...   6290  [4.0, 4.0, 4.0, 4.0, 5.0, 11.0, 12.0, 12.0, 12...                                                 condition  \\\\0     [Spinal Canal Stenosis, Spinal Canal Stenosis,...   1     [Right Neural Foraminal Narrowing, Right Neura...   2     [Left Subarticular Stenosis, Right Subarticula...   3     [Right Subarticular Stenosis, Left Subarticula...   4     [Left Neural Foraminal Narrowing, Left Neural ...   ...                                                 ...   6286  [Spinal Canal Stenosis, Spinal Canal Stenosis,...   6287  [Left Subarticular Stenosis, Right Subarticula...   6288  [Spinal Canal Stenosis, Spinal Canal Stenosis,...   6289  [Right Subarticular Stenosis, Left Subarticula...   6290  [Right Neural Foraminal Narrowing, Right Neura...                                                     level  \\\\0                   [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   1     [L4/L5, L5/S1, L3/L4, L1/L2, L2/L3, L1/L2, L4/...   2     [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   3     [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   4     [L2/L3, L3/L4, L4/L5, L1/L2, L5/S1, L2/L3, L3/...   ...                                                 ...   6286                [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   6287  [L5/S1, L5/S1, L4/L5, L4/L5, L3/L4, L3/L4, L2/...   6288                [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   6289  [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   6290  [L2/L3, L3/L4, L4/L5, L5/S1, L1/L2, L1/L2, L2/...                                                         x  \\\\0     [322.83185840707966, 320.57142857142856, 323.0...   1     [187.96175908221795, 198.2409177820268, 187.22...   2     [179.12644787644788, 145.28877148997134, 180.9...   3     [184.18099547511312, 235.3170731707317, 235.31...   4     [234.09931142986449, 227.5139455762059, 225.63...   ...                                                 ...   6286  [391.2351904090268, 369.4354724964739, 373.587...   6287  [145.7037037037037, 112.16991150442476, 143.92...   6288  [181.66894664842684, 174.22708618331055, 174.2...   6289  [307.18084360986546, 352.53169907016064, 349.2...   6290  [208.10679881880364, 204.195638510915, 208.381...                                                         y  \\\\0     [227.9646017699115, 295.7142857142857, 371.818...   1     [251.83938814531547, 285.6137667304015, 210.72...   2     [161.23552123552125, 158.6246418338109, 158.76...   3     [263.23981900452486, 264.08362369337976, 254.7...   4     [196.620230591671, 256.8292898251205, 308.5714...   ...                                                 ...   6286  [235.6445698166432, 321.80535966149506, 391.35...   6287  [143.40740740740742, 143.34159292035395, 136.2...   6288  [88.86456908344734, 125.19835841313272, 160.65...   6289  [354.8699595361547, 358.1403212172443, 366.796...   6290  [140.20340382070157, 182.79159383993365, 222.9...                                                  filepath  \\\\0     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   1     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   2     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   3     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   4     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   ...                                                 ...   6286  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   6287  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   6288  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   6289  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   6290  [/kaggle/input/rsna-2024-lumbar-spine-degenera...                                                  severity  0     [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  1     [Moderate, Normal/Mild, Moderate, Normal/Mild,...  2     [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  3     [Normal/Mild, Normal/Mild, Normal/Mild, Modera...  4     [Normal/Mild, Normal/Mild, Moderate, Normal/Mi...  ...                                                 ...  6286  [Normal/Mild, Moderate, Normal/Mild, Normal/Mi...  6287  [Normal/Mild, Normal/Mild, Moderate, Moderate,...  6288  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  6289  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  6290  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  [6291 rows x 10 columns]\",\"text/html\":\"<div><style scoped>    .dataframe tbody tr th:only-of-type {        vertical-align: middle;    }    .dataframe tbody tr th {        vertical-align: top;    }    .dataframe thead th {        text-align: right;    }</style><table border=\\\"1\\\" class=\\\"dataframe\\\">  <thead>    <tr style=\\\"text-align: right;\\\">      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>series_description</th>      <th>instance_number</th>      <th>condition</th>      <th>level</th>      <th>x</th>      <th>y</th>      <th>filepath</th>      <th>severity</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>4003253</td>      <td>702807833</td>      <td>Sagittal T2/STIR</td>      <td>[8.0, 8.0, 8.0, 8.0, 8.0]</td>      <td>[Spinal Canal Stenosis, Spinal Canal Stenosis,...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]</td>      <td>[322.83185840707966, 320.57142857142856, 323.0...</td>      <td>[227.9646017699115, 295.7142857142857, 371.818...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>1</th>      <td>4003253</td>      <td>1054713880</td>      <td>Sagittal T1</td>      <td>[4.0, 4.0, 5.0, 6.0, 6.0, 11.0, 11.0, 11.0, 12...</td>      <td>[Right Neural Foraminal Narrowing, Right Neura...</td>      <td>[L4/L5, L5/S1, L3/L4, L1/L2, L2/L3, L1/L2, L4/...</td>      <td>[187.96175908221795, 198.2409177820268, 187.22...</td>      <td>[251.83938814531547, 285.6137667304015, 210.72...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Moderate, Normal/Mild, Moderate, Normal/Mild,...</td>    </tr>    <tr>      <th>2</th>      <td>4003253</td>      <td>2448190387</td>      <td>Axial T2</td>      <td>[3.0, 4.0, 11.0, 11.0, 19.0, 19.0, 28.0, 28.0,...</td>      <td>[Left Subarticular Stenosis, Right Subarticula...</td>      <td>[L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...</td>      <td>[179.12644787644788, 145.28877148997134, 180.9...</td>      <td>[161.23552123552125, 158.6246418338109, 158.76...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>3</th>      <td>4646740</td>      <td>3201256954</td>      <td>Axial T2</td>      <td>[15.0, 16.0, 22.0, 22.0, 28.0, 29.0, 34.0, 34....</td>      <td>[Right Subarticular Stenosis, Left Subarticula...</td>      <td>[L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...</td>      <td>[184.18099547511312, 235.3170731707317, 235.31...</td>      <td>[263.23981900452486, 264.08362369337976, 254.7...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Modera...</td>    </tr>    <tr>      <th>4</th>      <td>4646740</td>      <td>3486248476</td>      <td>Sagittal T1</td>      <td>[5.0, 5.0, 5.0, 6.0, 7.0, 15.0, 15.0, 16.0, 17...</td>      <td>[Left Neural Foraminal Narrowing, Left Neural ...</td>      <td>[L2/L3, L3/L4, L4/L5, L1/L2, L5/S1, L2/L3, L3/...</td>      <td>[234.09931142986449, 227.5139455762059, 225.63...</td>      <td>[196.620230591671, 256.8292898251205, 308.5714...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Moderate, Normal/Mi...</td>    </tr>    <tr>      <th>...</th>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>    </tr>    <tr>      <th>6286</th>      <td>4287160193</td>      <td>1507070277</td>      <td>Sagittal T2/STIR</td>      <td>[8.0, 8.0, 8.0, 8.0, 8.0]</td>      <td>[Spinal Canal Stenosis, Spinal Canal Stenosis,...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]</td>      <td>[391.2351904090268, 369.4354724964739, 373.587...</td>      <td>[235.6445698166432, 321.80535966149506, 391.35...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Moderate, Normal/Mild, Normal/Mi...</td>    </tr>    <tr>      <th>6287</th>      <td>4287160193</td>      <td>1820446240</td>      <td>Axial T2</td>      <td>[4.0, 4.0, 9.0, 10.0, 16.0, 16.0, 22.0, 22.0, ...</td>      <td>[Left Subarticular Stenosis, Right Subarticula...</td>      <td>[L5/S1, L5/S1, L4/L5, L4/L5, L3/L4, L3/L4, L2/...</td>      <td>[145.7037037037037, 112.16991150442476, 143.92...</td>      <td>[143.40740740740742, 143.34159292035395, 136.2...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Moderate, Moderate,...</td>    </tr>    <tr>      <th>6288</th>      <td>4290709089</td>      <td>3274612423</td>      <td>Sagittal T2/STIR</td>      <td>[9.0, 9.0, 9.0, 9.0, 9.0]</td>      <td>[Spinal Canal Stenosis, Spinal Canal Stenosis,...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]</td>      <td>[181.66894664842684, 174.22708618331055, 174.2...</td>      <td>[88.86456908344734, 125.19835841313272, 160.65...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>6289</th>      <td>4290709089</td>      <td>3390218084</td>      <td>Axial T2</td>      <td>[2.0, 3.0, 5.0, 6.0, 10.0, 10.0, 15.0, 15.0, 2...</td>      <td>[Right Subarticular Stenosis, Left Subarticula...</td>      <td>[L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...</td>      <td>[307.18084360986546, 352.53169907016064, 349.2...</td>      <td>[354.8699595361547, 358.1403212172443, 366.796...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>6290</th>      <td>4290709089</td>      <td>4237840455</td>      <td>Sagittal T1</td>      <td>[4.0, 4.0, 4.0, 4.0, 5.0, 11.0, 12.0, 12.0, 12...</td>      <td>[Right Neural Foraminal Narrowing, Right Neura...</td>      <td>[L2/L3, L3/L4, L4/L5, L5/S1, L1/L2, L1/L2, L2/...</td>      <td>[208.10679881880364, 204.195638510915, 208.381...</td>      <td>[140.20340382070157, 182.79159383993365, 222.9...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>  </tbody></table><p>6291 rows × 10 columns</p></div>\"},\"metadata\":{}}]},{\"cell_type\":\"markdown\",\"source\":\"So that means not all series have heir data available let's clean the merged dataframe then\",\"metadata\":{}},{\"cell_type\":\"code\",\"source\":\"columns_with_lists = ['instance_number', 'condition', 'level', 'x', 'y', 'filepath']def clean_nan_in_lists(row):    for col in columns_with_lists:        if isinstance(row[col], list):            row[col] = [item for item in row[col] if pd.notna(item)]            if not row[col]:                row[col] = None    return row# Apply the cleaning function to each rowcleaned_grouped_df = grouped_df.apply(clean_nan_in_lists, axis=1)# Remove rows where any column has become None (if required)cleaned_grouped_df = cleaned_grouped_df.dropna(subset=columns_with_lists, how='any')# Display the cleaned DataFrameprint(\\\"Cleaned DataFrame:\\\")cleaned_grouped_df\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:54:09.097309Z\",\"iopub.execute_input\":\"2024-11-14T08:54:09.097946Z\",\"iopub.status.idle\":\"2024-11-14T08:54:11.053823Z\",\"shell.execute_reply.started\":\"2024-11-14T08:54:09.097902Z\",\"shell.execute_reply\":\"2024-11-14T08:54:11.052919Z\"},\"trusted\":true},\"execution_count\":17,\"outputs\":[{\"name\":\"stdout\",\"text\":\"Cleaned DataFrame:\",\"output_type\":\"stream\"},{\"execution_count\":17,\"output_type\":\"execute_result\",\"data\":{\"text/plain\":\"        study_id   series_id series_description  \\\\0        4003253   702807833   Sagittal T2/STIR   1        4003253  1054713880        Sagittal T1   2        4003253  2448190387           Axial T2   3        4646740  3201256954           Axial T2   4        4646740  3486248476        Sagittal T1   ...          ...         ...                ...   6286  4287160193  1507070277   Sagittal T2/STIR   6287  4287160193  1820446240           Axial T2   6288  4290709089  3274612423   Sagittal T2/STIR   6289  4290709089  3390218084           Axial T2   6290  4290709089  4237840455        Sagittal T1                                           instance_number  \\\\0                             [8.0, 8.0, 8.0, 8.0, 8.0]   1     [4.0, 4.0, 5.0, 6.0, 6.0, 11.0, 11.0, 11.0, 12...   2     [3.0, 4.0, 11.0, 11.0, 19.0, 19.0, 28.0, 28.0,...   3     [15.0, 16.0, 22.0, 22.0, 28.0, 29.0, 34.0, 34....   4     [5.0, 5.0, 5.0, 6.0, 7.0, 15.0, 15.0, 16.0, 17...   ...                                                 ...   6286                          [8.0, 8.0, 8.0, 8.0, 8.0]   6287  [4.0, 4.0, 9.0, 10.0, 16.0, 16.0, 22.0, 22.0, ...   6288                          [9.0, 9.0, 9.0, 9.0, 9.0]   6289  [2.0, 3.0, 5.0, 6.0, 10.0, 10.0, 15.0, 15.0, 2...   6290  [4.0, 4.0, 4.0, 4.0, 5.0, 11.0, 12.0, 12.0, 12...                                                 condition  \\\\0     [Spinal Canal Stenosis, Spinal Canal Stenosis,...   1     [Right Neural Foraminal Narrowing, Right Neura...   2     [Left Subarticular Stenosis, Right Subarticula...   3     [Right Subarticular Stenosis, Left Subarticula...   4     [Left Neural Foraminal Narrowing, Left Neural ...   ...                                                 ...   6286  [Spinal Canal Stenosis, Spinal Canal Stenosis,...   6287  [Left Subarticular Stenosis, Right Subarticula...   6288  [Spinal Canal Stenosis, Spinal Canal Stenosis,...   6289  [Right Subarticular Stenosis, Left Subarticula...   6290  [Right Neural Foraminal Narrowing, Right Neura...                                                     level  \\\\0                   [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   1     [L4/L5, L5/S1, L3/L4, L1/L2, L2/L3, L1/L2, L4/...   2     [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   3     [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   4     [L2/L3, L3/L4, L4/L5, L1/L2, L5/S1, L2/L3, L3/...   ...                                                 ...   6286                [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   6287  [L5/S1, L5/S1, L4/L5, L4/L5, L3/L4, L3/L4, L2/...   6288                [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   6289  [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   6290  [L2/L3, L3/L4, L4/L5, L5/S1, L1/L2, L1/L2, L2/...                                                         x  \\\\0     [322.83185840707966, 320.57142857142856, 323.0...   1     [187.96175908221795, 198.2409177820268, 187.22...   2     [179.12644787644788, 145.28877148997134, 180.9...   3     [184.18099547511312, 235.3170731707317, 235.31...   4     [234.09931142986449, 227.5139455762059, 225.63...   ...                                                 ...   6286  [391.2351904090268, 369.4354724964739, 373.587...   6287  [145.7037037037037, 112.16991150442476, 143.92...   6288  [181.66894664842684, 174.22708618331055, 174.2...   6289  [307.18084360986546, 352.53169907016064, 349.2...   6290  [208.10679881880364, 204.195638510915, 208.381...                                                         y  \\\\0     [227.9646017699115, 295.7142857142857, 371.818...   1     [251.83938814531547, 285.6137667304015, 210.72...   2     [161.23552123552125, 158.6246418338109, 158.76...   3     [263.23981900452486, 264.08362369337976, 254.7...   4     [196.620230591671, 256.8292898251205, 308.5714...   ...                                                 ...   6286  [235.6445698166432, 321.80535966149506, 391.35...   6287  [143.40740740740742, 143.34159292035395, 136.2...   6288  [88.86456908344734, 125.19835841313272, 160.65...   6289  [354.8699595361547, 358.1403212172443, 366.796...   6290  [140.20340382070157, 182.79159383993365, 222.9...                                                  filepath  \\\\0     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   1     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   2     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   3     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   4     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   ...                                                 ...   6286  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   6287  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   6288  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   6289  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   6290  [/kaggle/input/rsna-2024-lumbar-spine-degenera...                                                  severity  0     [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  1     [Moderate, Normal/Mild, Moderate, Normal/Mild,...  2     [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  3     [Normal/Mild, Normal/Mild, Normal/Mild, Modera...  4     [Normal/Mild, Normal/Mild, Moderate, Normal/Mi...  ...                                                 ...  6286  [Normal/Mild, Moderate, Normal/Mild, Normal/Mi...  6287  [Normal/Mild, Normal/Mild, Moderate, Moderate,...  6288  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  6289  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  6290  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  [6291 rows x 10 columns]\",\"text/html\":\"<div><style scoped>    .dataframe tbody tr th:only-of-type {        vertical-align: middle;    }    .dataframe tbody tr th {        vertical-align: top;    }    .dataframe thead th {        text-align: right;    }</style><table border=\\\"1\\\" class=\\\"dataframe\\\">  <thead>    <tr style=\\\"text-align: right;\\\">      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>series_description</th>      <th>instance_number</th>      <th>condition</th>      <th>level</th>      <th>x</th>      <th>y</th>      <th>filepath</th>      <th>severity</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>4003253</td>      <td>702807833</td>      <td>Sagittal T2/STIR</td>      <td>[8.0, 8.0, 8.0, 8.0, 8.0]</td>      <td>[Spinal Canal Stenosis, Spinal Canal Stenosis,...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]</td>      <td>[322.83185840707966, 320.57142857142856, 323.0...</td>      <td>[227.9646017699115, 295.7142857142857, 371.818...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>1</th>      <td>4003253</td>      <td>1054713880</td>      <td>Sagittal T1</td>      <td>[4.0, 4.0, 5.0, 6.0, 6.0, 11.0, 11.0, 11.0, 12...</td>      <td>[Right Neural Foraminal Narrowing, Right Neura...</td>      <td>[L4/L5, L5/S1, L3/L4, L1/L2, L2/L3, L1/L2, L4/...</td>      <td>[187.96175908221795, 198.2409177820268, 187.22...</td>      <td>[251.83938814531547, 285.6137667304015, 210.72...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Moderate, Normal/Mild, Moderate, Normal/Mild,...</td>    </tr>    <tr>      <th>2</th>      <td>4003253</td>      <td>2448190387</td>      <td>Axial T2</td>      <td>[3.0, 4.0, 11.0, 11.0, 19.0, 19.0, 28.0, 28.0,...</td>      <td>[Left Subarticular Stenosis, Right Subarticula...</td>      <td>[L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...</td>      <td>[179.12644787644788, 145.28877148997134, 180.9...</td>      <td>[161.23552123552125, 158.6246418338109, 158.76...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>3</th>      <td>4646740</td>      <td>3201256954</td>      <td>Axial T2</td>      <td>[15.0, 16.0, 22.0, 22.0, 28.0, 29.0, 34.0, 34....</td>      <td>[Right Subarticular Stenosis, Left Subarticula...</td>      <td>[L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...</td>      <td>[184.18099547511312, 235.3170731707317, 235.31...</td>      <td>[263.23981900452486, 264.08362369337976, 254.7...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Modera...</td>    </tr>    <tr>      <th>4</th>      <td>4646740</td>      <td>3486248476</td>      <td>Sagittal T1</td>      <td>[5.0, 5.0, 5.0, 6.0, 7.0, 15.0, 15.0, 16.0, 17...</td>      <td>[Left Neural Foraminal Narrowing, Left Neural ...</td>      <td>[L2/L3, L3/L4, L4/L5, L1/L2, L5/S1, L2/L3, L3/...</td>      <td>[234.09931142986449, 227.5139455762059, 225.63...</td>      <td>[196.620230591671, 256.8292898251205, 308.5714...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Moderate, Normal/Mi...</td>    </tr>    <tr>      <th>...</th>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>    </tr>    <tr>      <th>6286</th>      <td>4287160193</td>      <td>1507070277</td>      <td>Sagittal T2/STIR</td>      <td>[8.0, 8.0, 8.0, 8.0, 8.0]</td>      <td>[Spinal Canal Stenosis, Spinal Canal Stenosis,...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]</td>      <td>[391.2351904090268, 369.4354724964739, 373.587...</td>      <td>[235.6445698166432, 321.80535966149506, 391.35...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Moderate, Normal/Mild, Normal/Mi...</td>    </tr>    <tr>      <th>6287</th>      <td>4287160193</td>      <td>1820446240</td>      <td>Axial T2</td>      <td>[4.0, 4.0, 9.0, 10.0, 16.0, 16.0, 22.0, 22.0, ...</td>      <td>[Left Subarticular Stenosis, Right Subarticula...</td>      <td>[L5/S1, L5/S1, L4/L5, L4/L5, L3/L4, L3/L4, L2/...</td>      <td>[145.7037037037037, 112.16991150442476, 143.92...</td>      <td>[143.40740740740742, 143.34159292035395, 136.2...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Moderate, Moderate,...</td>    </tr>    <tr>      <th>6288</th>      <td>4290709089</td>      <td>3274612423</td>      <td>Sagittal T2/STIR</td>      <td>[9.0, 9.0, 9.0, 9.0, 9.0]</td>      <td>[Spinal Canal Stenosis, Spinal Canal Stenosis,...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]</td>      <td>[181.66894664842684, 174.22708618331055, 174.2...</td>      <td>[88.86456908344734, 125.19835841313272, 160.65...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>6289</th>      <td>4290709089</td>      <td>3390218084</td>      <td>Axial T2</td>      <td>[2.0, 3.0, 5.0, 6.0, 10.0, 10.0, 15.0, 15.0, 2...</td>      <td>[Right Subarticular Stenosis, Left Subarticula...</td>      <td>[L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...</td>      <td>[307.18084360986546, 352.53169907016064, 349.2...</td>      <td>[354.8699595361547, 358.1403212172443, 366.796...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>6290</th>      <td>4290709089</td>      <td>4237840455</td>      <td>Sagittal T1</td>      <td>[4.0, 4.0, 4.0, 4.0, 5.0, 11.0, 12.0, 12.0, 12...</td>      <td>[Right Neural Foraminal Narrowing, Right Neura...</td>      <td>[L2/L3, L3/L4, L4/L5, L5/S1, L1/L2, L1/L2, L2/...</td>      <td>[208.10679881880364, 204.195638510915, 208.381...</td>      <td>[140.20340382070157, 182.79159383993365, 222.9...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>  </tbody></table><p>6291 rows × 10 columns</p></div>\"},\"metadata\":{}}]},{\"cell_type\":\"code\",\"source\":\"merged_outer_df['series_description'].unique()\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:54:12.039927Z\",\"iopub.execute_input\":\"2024-11-14T08:54:12.040738Z\",\"iopub.status.idle\":\"2024-11-14T08:54:12.050471Z\",\"shell.execute_reply.started\":\"2024-11-14T08:54:12.040696Z\",\"shell.execute_reply\":\"2024-11-14T08:54:12.049591Z\"},\"trusted\":true},\"execution_count\":18,\"outputs\":[{\"execution_count\":18,\"output_type\":\"execute_result\",\"data\":{\"text/plain\":\"array(['Sagittal T2/STIR', 'Sagittal T1', 'Axial T2'], dtype=object)\"},\"metadata\":{}}]},{\"cell_type\":\"code\",\"source\":\"from sklearn.model_selection import train_test_split# Check the distribution of the 'condition' columncondition_counts = cleaned_grouped_df['condition'].value_counts()# Find conditions with only one samplesingle_sample_conditions = condition_counts[condition_counts == 1]# Remove conditions with only one samplecleaned_grouped_df_filtered = cleaned_grouped_df[~cleaned_grouped_df['condition'].isin(single_sample_conditions.index)]# Perform the train-test splittrain_df, test_df = train_test_split(cleaned_grouped_df_filtered, test_size=0.5, stratify=cleaned_grouped_df_filtered['condition'])# Check the distribution in both splitsprint('Train Set Distribution:')print(train_df['condition'].value_counts())print('================')print('Test Set Distribution:')print(test_df['condition'].value_counts())\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:54:15.766289Z\",\"iopub.execute_input\":\"2024-11-14T08:54:15.766666Z\",\"iopub.status.idle\":\"2024-11-14T08:54:16.497676Z\",\"shell.execute_reply.started\":\"2024-11-14T08:54:15.766630Z\",\"shell.execute_reply\":\"2024-11-14T08:54:16.496738Z\"},\"trusted\":true},\"execution_count\":19,\"outputs\":[{\"name\":\"stdout\",\"text\":\"Train Set Distribution:condition[Spinal Canal Stenosis, Spinal Canal Stenosis, Spinal Canal Stenosis, Spinal Canal Stenosis, Spinal Canal Stenosis]                                                                                                                                                                                                                                949[Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing]    628[Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing]    349[Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis]                                                      313[Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis]                                                                                                                                                                                                   66                                                                                                                                                                                                                                                                                                                                                  ... [Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis]                                                                                                                1[Left Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis]                                                                                     1[Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis]                                                                                                                 1[Left Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis]                                                                                                                                                                                                       1[Right Subarticular Stenosis, Left Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis]                                                                                                                 1Name: count, Length: 96, dtype: int64================Test Set Distribution:condition[Spinal Canal Stenosis, Spinal Canal Stenosis, Spinal Canal Stenosis, Spinal Canal Stenosis, Spinal Canal Stenosis]                                                                                                                                                                                                                                949[Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing]    628[Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing]    349[Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis]                                                      314[Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis]                                                                                                                                                                                                   66                                                                                                                                                                                                                                                                                                                                                  ... [Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis]                                                                                    1[Right Subarticular Stenosis, Left Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis]                                                                                                                 1[Left Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis]                                                                                                                                                                                                      1[Left Subarticular Stenosis, Left Subarticular Stenosis, Left Subarticular Stenosis, Left Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis]                                                                                                                                                                            1[Left Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis]                                                                                                                                                                        1Name: count, Length: 96, dtype: int64\",\"output_type\":\"stream\"}]},{\"cell_type\":\"code\",\"source\":\"train_df\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:54:16.499168Z\",\"iopub.execute_input\":\"2024-11-14T08:54:16.499589Z\",\"iopub.status.idle\":\"2024-11-14T08:54:16.540081Z\",\"shell.execute_reply.started\":\"2024-11-14T08:54:16.499555Z\",\"shell.execute_reply\":\"2024-11-14T08:54:16.539121Z\"},\"trusted\":true},\"execution_count\":20,\"outputs\":[{\"execution_count\":20,\"output_type\":\"execute_result\",\"data\":{\"text/plain\":\"        study_id   series_id series_description  \\\\3707  2557856398  3170818407        Sagittal T1   4333  2953643785  2766425881           Axial T2   4615  3160528641  3180832116   Sagittal T2/STIR   4637  3168755174  3335509714        Sagittal T1   1510  1036203708  3261685527   Sagittal T2/STIR   ...          ...         ...                ...   531    344269999  2933376913   Sagittal T2/STIR   5805  3951588890  2308748816           Axial T2   2990  2065657198  4097481257           Axial T2   1044   712073652   239356302           Axial T2   3088  2141458217   498734191        Sagittal T1                                           instance_number  \\\\3707  [5.0, 5.0, 5.0, 6.0, 6.0, 13.0, 13.0, 13.0, 14...   4333  [14.0, 15.0, 21.0, 22.0, 29.0, 29.0, 35.0, 36....   4615                     [10.0, 10.0, 10.0, 10.0, 10.0]   4637  [3.0, 3.0, 3.0, 3.0, 3.0, 11.0, 11.0, 12.0, 12...   1510                          [9.0, 9.0, 9.0, 9.0, 9.0]   ...                                                 ...   531                           [7.0, 7.0, 7.0, 7.0, 7.0]   5805                                   [4.0, 8.0, 14.0]   2990  [13.0, 14.0, 21.0, 22.0, 28.0, 29.0, 35.0, 36....   1044  [6.0, 7.0, 10.0, 11.0, 14.0, 15.0, 19.0, 19.0,...   3088  [4.0, 4.0, 4.0, 4.0, 5.0, 10.0, 10.0, 11.0, 11...                                                 condition  \\\\3707  [Left Neural Foraminal Narrowing, Left Neural ...   4333  [Left Subarticular Stenosis, Right Subarticula...   4615  [Spinal Canal Stenosis, Spinal Canal Stenosis,...   4637  [Right Neural Foraminal Narrowing, Right Neura...   1510  [Spinal Canal Stenosis, Spinal Canal Stenosis,...   ...                                                 ...   531   [Spinal Canal Stenosis, Spinal Canal Stenosis,...   5805  [Left Subarticular Stenosis, Left Subarticular...   2990  [Left Subarticular Stenosis, Right Subarticula...   1044  [Left Subarticular Stenosis, Right Subarticula...   3088  [Left Neural Foraminal Narrowing, Left Neural ...                                                     level  \\\\3707  [L3/L4, L4/L5, L5/S1, L1/L2, L2/L3, L1/L2, L2/...   4333  [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   4615                [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   4637  [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1, L1/L2, L2/...   1510                [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   ...                                                 ...   531                 [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   5805                              [L3/L4, L4/L5, L5/S1]   2990  [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   1044  [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   3088  [L2/L3, L3/L4, L4/L5, L5/S1, L1/L2, L1/L2, L2/...                                                         x  \\\\3707  [254.4318181818182, 260.11743119266055, 272.33...   4333  [141.91087811271296, 117.01071428571429, 141.5...   4615  [236.16421215705583, 235.86706605920844, 235.7...   4637  [471.6423529411765, 455.3788235294118, 435.501...   1510  [213.89368362148988, 205.36496108409892, 199.9...   ...                                                 ...   531   [321.8079096045197, 302.3529411764706, 292.941...   5805  [265.7007984462668, 262.60714285714283, 260.39...   2990  [171.61061946902657, 146.66797488226058, 175.0...   1044  [164.98883261064594, 138.8921282798834, 139.82...   3088  [179.34065934065933, 178.63736263736263, 175.8...                                                         y  \\\\3707  [267.8787878787879, 323.87522935779816, 375.54...   4333  [152.32503276539973, 151.77142857142857, 142.2...   4615  [107.79395462933066, 171.6803656665286, 237.07...   4637  [276.4649448529412, 371.3355330882353, 472.530...   1510  [109.52065602589936, 153.71494553783413, 199.4...   ...                                                 ...   531   [163.91713747645952, 196.23529411764707, 234.8...   5805  [256.6629261976694, 261.5243849805784, 261.966...   2990  [195.5398230088496, 195.16483516483515, 189.87...   1044  [165.43541137111245, 166.06413994169097, 172.5...   3088  [146.1098901098901, 179.16483516483515, 213.62...                                                  filepath  \\\\3707  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   4333  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   4615  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   4637  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   1510  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   ...                                                 ...   531   [/kaggle/input/rsna-2024-lumbar-spine-degenera...   5805  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   2990  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   1044  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   3088  [/kaggle/input/rsna-2024-lumbar-spine-degenera...                                                  severity  3707  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  4333  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  4615  [Normal/Mild, Normal/Mild, Normal/Mild, Modera...  4637  [Normal/Mild, Normal/Mild, Moderate, Severe, S...  1510  [Normal/Mild, Normal/Mild, Normal/Mild, Modera...  ...                                                 ...  531   [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  5805                  [Normal/Mild, Moderate, Moderate]  2990  [Normal/Mild, Normal/Mild, Normal/Mild, Modera...  1044  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  3088  [Normal/Mild, Normal/Mild, Moderate, Severe, N...  [3121 rows x 10 columns]\",\"text/html\":\"<div><style scoped>    .dataframe tbody tr th:only-of-type {        vertical-align: middle;    }    .dataframe tbody tr th {        vertical-align: top;    }    .dataframe thead th {        text-align: right;    }</style><table border=\\\"1\\\" class=\\\"dataframe\\\">  <thead>    <tr style=\\\"text-align: right;\\\">      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>series_description</th>      <th>instance_number</th>      <th>condition</th>      <th>level</th>      <th>x</th>      <th>y</th>      <th>filepath</th>      <th>severity</th>    </tr>  </thead>  <tbody>    <tr>      <th>3707</th>      <td>2557856398</td>      <td>3170818407</td>      <td>Sagittal T1</td>      <td>[5.0, 5.0, 5.0, 6.0, 6.0, 13.0, 13.0, 13.0, 14...</td>      <td>[Left Neural Foraminal Narrowing, Left Neural ...</td>      <td>[L3/L4, L4/L5, L5/S1, L1/L2, L2/L3, L1/L2, L2/...</td>      <td>[254.4318181818182, 260.11743119266055, 272.33...</td>      <td>[267.8787878787879, 323.87522935779816, 375.54...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>4333</th>      <td>2953643785</td>      <td>2766425881</td>      <td>Axial T2</td>      <td>[14.0, 15.0, 21.0, 22.0, 29.0, 29.0, 35.0, 36....</td>      <td>[Left Subarticular Stenosis, Right Subarticula...</td>      <td>[L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...</td>      <td>[141.91087811271296, 117.01071428571429, 141.5...</td>      <td>[152.32503276539973, 151.77142857142857, 142.2...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>4615</th>      <td>3160528641</td>      <td>3180832116</td>      <td>Sagittal T2/STIR</td>      <td>[10.0, 10.0, 10.0, 10.0, 10.0]</td>      <td>[Spinal Canal Stenosis, Spinal Canal Stenosis,...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]</td>      <td>[236.16421215705583, 235.86706605920844, 235.7...</td>      <td>[107.79395462933066, 171.6803656665286, 237.07...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Modera...</td>    </tr>    <tr>      <th>4637</th>      <td>3168755174</td>      <td>3335509714</td>      <td>Sagittal T1</td>      <td>[3.0, 3.0, 3.0, 3.0, 3.0, 11.0, 11.0, 12.0, 12...</td>      <td>[Right Neural Foraminal Narrowing, Right Neura...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1, L1/L2, L2/...</td>      <td>[471.6423529411765, 455.3788235294118, 435.501...</td>      <td>[276.4649448529412, 371.3355330882353, 472.530...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Moderate, Severe, S...</td>    </tr>    <tr>      <th>1510</th>      <td>1036203708</td>      <td>3261685527</td>      <td>Sagittal T2/STIR</td>      <td>[9.0, 9.0, 9.0, 9.0, 9.0]</td>      <td>[Spinal Canal Stenosis, Spinal Canal Stenosis,...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]</td>      <td>[213.89368362148988, 205.36496108409892, 199.9...</td>      <td>[109.52065602589936, 153.71494553783413, 199.4...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Modera...</td>    </tr>    <tr>      <th>...</th>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>    </tr>    <tr>      <th>531</th>      <td>344269999</td>      <td>2933376913</td>      <td>Sagittal T2/STIR</td>      <td>[7.0, 7.0, 7.0, 7.0, 7.0]</td>      <td>[Spinal Canal Stenosis, Spinal Canal Stenosis,...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]</td>      <td>[321.8079096045197, 302.3529411764706, 292.941...</td>      <td>[163.91713747645952, 196.23529411764707, 234.8...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>5805</th>      <td>3951588890</td>      <td>2308748816</td>      <td>Axial T2</td>      <td>[4.0, 8.0, 14.0]</td>      <td>[Left Subarticular Stenosis, Left Subarticular...</td>      <td>[L3/L4, L4/L5, L5/S1]</td>      <td>[265.7007984462668, 262.60714285714283, 260.39...</td>      <td>[256.6629261976694, 261.5243849805784, 261.966...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Moderate, Moderate]</td>    </tr>    <tr>      <th>2990</th>      <td>2065657198</td>      <td>4097481257</td>      <td>Axial T2</td>      <td>[13.0, 14.0, 21.0, 22.0, 28.0, 29.0, 35.0, 36....</td>      <td>[Left Subarticular Stenosis, Right Subarticula...</td>      <td>[L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...</td>      <td>[171.61061946902657, 146.66797488226058, 175.0...</td>      <td>[195.5398230088496, 195.16483516483515, 189.87...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Modera...</td>    </tr>    <tr>      <th>1044</th>      <td>712073652</td>      <td>239356302</td>      <td>Axial T2</td>      <td>[6.0, 7.0, 10.0, 11.0, 14.0, 15.0, 19.0, 19.0,...</td>      <td>[Left Subarticular Stenosis, Right Subarticula...</td>      <td>[L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...</td>      <td>[164.98883261064594, 138.8921282798834, 139.82...</td>      <td>[165.43541137111245, 166.06413994169097, 172.5...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>3088</th>      <td>2141458217</td>      <td>498734191</td>      <td>Sagittal T1</td>      <td>[4.0, 4.0, 4.0, 4.0, 5.0, 10.0, 10.0, 11.0, 11...</td>      <td>[Left Neural Foraminal Narrowing, Left Neural ...</td>      <td>[L2/L3, L3/L4, L4/L5, L5/S1, L1/L2, L1/L2, L2/...</td>      <td>[179.34065934065933, 178.63736263736263, 175.8...</td>      <td>[146.1098901098901, 179.16483516483515, 213.62...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Moderate, Severe, N...</td>    </tr>  </tbody></table><p>3121 rows × 10 columns</p></div>\"},\"metadata\":{}}]},{\"cell_type\":\"code\",\"source\":\"print('Axial T2')display(merged_outer_df[merged_outer_df['series_description']==\\\"Axial T2\\\"][\\\"condition\\\"].value_counts())print('================')print('Sagittal T1')display(merged_outer_df[merged_outer_df['series_description']==\\\"Sagittal T1\\\"][\\\"condition\\\"].value_counts())print('================')print('Sagittal T2/STIR')display(merged_outer_df[merged_outer_df['series_description']==\\\"Sagittal T2/STIR\\\"][\\\"condition\\\"].value_counts())print('================')\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:54:20.786563Z\",\"iopub.execute_input\":\"2024-11-14T08:54:20.786945Z\",\"iopub.status.idle\":\"2024-11-14T08:54:20.843596Z\",\"shell.execute_reply.started\":\"2024-11-14T08:54:20.786907Z\",\"shell.execute_reply\":\"2024-11-14T08:54:20.842740Z\"},\"trusted\":true},\"execution_count\":21,\"outputs\":[{\"name\":\"stdout\",\"text\":\"Axial T2\",\"output_type\":\"stream\"},{\"output_type\":\"display_data\",\"data\":{\"text/plain\":\"conditionRight Subarticular Stenosis    9612Left Subarticular Stenosis     9608Name: count, dtype: int64\"},\"metadata\":{}},{\"name\":\"stdout\",\"text\":\"================Sagittal T1\",\"output_type\":\"stream\"},{\"output_type\":\"display_data\",\"data\":{\"text/plain\":\"conditionLeft Neural Foraminal Narrowing     9860Right Neural Foraminal Narrowing    9859Spinal Canal Stenosis                  5Name: count, dtype: int64\"},\"metadata\":{}},{\"name\":\"stdout\",\"text\":\"================Sagittal T2/STIR\",\"output_type\":\"stream\"},{\"output_type\":\"display_data\",\"data\":{\"text/plain\":\"conditionSpinal Canal Stenosis    9748Name: count, dtype: int64\"},\"metadata\":{}},{\"name\":\"stdout\",\"text\":\"================\",\"output_type\":\"stream\"}]},{\"cell_type\":\"markdown\",\"source\":\"## Cropping Images\",\"metadata\":{}},{\"cell_type\":\"code\",\"source\":\"import pydicomimport matplotlib.pyplot as plt# Select a sample rowrow = train_df.iloc[0]filepath = row['filepath'][0]  # Access the filepath of the first image in the list# Load DICOM imagedicom_data = pydicom.dcmread(filepath)# Plot the DICOM imageplt.imshow(dicom_data.pixel_array, cmap='gray')plt.title(f\\\"Study ID: {row['study_id']} | Series ID: {row['series_id']}\\\")plt.xlabel(f\\\"Condition: {row['condition'][0]}\\\")plt.ylabel(f\\\"Severity: {row['severity'][0]}\\\")plt.show()\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T09:02:10.621899Z\",\"iopub.execute_input\":\"2024-11-14T09:02:10.622254Z\",\"iopub.status.idle\":\"2024-11-14T09:02:10.918704Z\",\"shell.execute_reply.started\":\"2024-11-14T09:02:10.622220Z\",\"shell.execute_reply\":\"2024-11-14T09:02:10.917806Z\"},\"trusted\":true},\"execution_count\":23,\"outputs\":[{\"output_type\":\"display_data\",\"data\":{\"text/plain\":\"<Figure size 640x480 with 1 Axes>\",\"image/png\":\"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AeaUYH0iEy8D4E8//eTnNcjEyxvggw8+6BqAjDHmzJkzpmrVquJbkzQAjh492iQmJppjx465vm/ZsqVJSkpyfisXLFhgfD6f+emnn5xtcvsNsGvXriY8PNzs3bs36LUE45LVACkRERFo2LAhRo0ahXHjxuHs2bOYNm2adb9gYq8Ux5IVunbtinnz5mHnzp3YtGkTfv/9d9x77705OmYwdu7ciaNHj7rCC7LDjh07cP311yM2Nhb/+9//UKRIkSztV65cOQDnp9pnZdszZ87gxIkTAddPnjwZ1atXR/369f3WvfPOO6hXrx7Kli3r+r59+/Y4efKkS/PIqp2ZYRF8Yk3mJKrDhw+Lx7zqqqtQunRpP823T58+SE1NxW+//YbFixdj7dq1iI2NBQBUq1YNALB582bMnDkT7du3d+0bFxeHq6++2m/SSW7h8/lQrVo19O3bFz///DPCwsIc+zMnAL388suYPXt2wD8eLpGVyToZGRnw+XyYOXNmwGP+5z//cbZ99dVXsXz5cjz55JM4deoU+vXrh1q1avlNOMsNMucP5PTZoQTrE9lh0qRJCAsLw9133+23rnTp0khPT8e+fftc3585cwYHDx50+vaZM2fwwQcf4KabbnJpawULFkS7du2wePFinDlzxrNt77zzDlq1auXXH9q3b4/du3dj69atAIDHH38c11xzDZKTk7F161Zs3boVBw4cAHB+wtv27dtd1xRo4l7md4HCmE6dOoXp06ejTZs2fs9xVrhk4wCDkSkK04YMNtAVL148oLi+bds213KFChWQkZGBTZs2uWb3rVu3LuBxO3fujEGDBmHKlCk4deoUChYsiLvuusvrpWSJzIkNbdu2zfYxDh48iOuvvx6nT59GSkoKSpcuneV9N2/eDOD8bK2sbFu4cOGAMWcLFy7Exo0bMXz48ID7pqamonjx4n7fZ05ssc00DWRn/fr1MXv2bGcSTCa7d+/22zYYf//9d8AZitHR0a4JTz/++CMiIyPRrFkz53qAwP9snT171tPM2exSqVIlFC9e3HlWMmfnFS1aFG3atMm181SuXBnGGCQnJzv/AEjUqVMHderUwVNPPYXffvsNzZo1w/jx4/H888/nmk3p6emYPHmyk6ggNwnWJ7xw+vRpfPHFF2jZsmXAH/66desCABYvXowbb7zR+X7x4sXIyMhw1h88eBDnzp0L2s8yMjKy9Q9/ampq0GMC//c8bt++Hdu2bUNycrLftu3bt0dsbKzzG1y3bl388ssvyMjIcA3WCxcuRFRUVMC+M2PGDBw7dsz75Jf/zyX7BjhnzhwYY/y+/9///gcArh+06OjogANd5cqVcfToUSxfvtz5bs+ePX5hDO3atQMAv+wgY8aMCWhbiRIl0K5dO3z66aeYNGkSbrjhhoAzKnPKTz/9hBEjRiA5OdnVAbyEQZw4cQI33ngjdu3ahf/9738Bs00A56c982nIxhjnR4kOwIEyYfz111+YMWMGrr/+er9ZXsD5tz8AfrPdMqlWrRr+/PNPv5lgU6ZMQVhYmJMIwIudd955J4Dz2TQo77//PgoUKODM5Dtx4kTAafFffPEFDh8+7DcTj/Pbb7/hyy+/RM+ePZ03wSpVqiAsLAxTp0519eOdO3c6oRS5xcKFCwO+dS9atAgHDx50npX69eujcuXKeOWVVwKGjwS6r1mhY8eOCA8Px3PPPef3zBpjcPDgQQDn7x0f+OvUqYOwsDBxCrxX0tPT0a9fP6xZswb9+vVD0aJFnXVZDYPIaZ+w8b///Q9HjhwJ+sPeqlUrxMXFYdy4ca7vx40bh6ioKGeGeqlSpVCsWDFMnz7d9aZ3/PhxfPPNN05mIK9Uq1YNs2fPdu4dcL5dP//8cxQpUsT5Z+rdd9/F9OnTXX+ZSUpeeeUV15vy7bffjtTUVHz55ZfOdwcOHMC0adNwyy23uMI4Msn8J+a2227zfA3AJfwG2LdvX5w8eRK33XYbatSogTNnzuC3337D1KlTUbFiRdx///3OtvXr18ePP/6I1157DUlJSUhOTkbjxo3RuXNnDBkyBLfddpuTQWHcuHGoVq2aK/1O3bp1cffdd+Odd97B0aNHcdVVVyElJQUbN24Mal/Xrl1x++23AwBGjBiR4+v9/vvvsXbtWpw7dw6pqan46aefMHv2bFSoUAEzZsxwxXJlhkF069YNH330kXjcLl26YNGiRejRowfWrFnjiv2LiYlxsucsXboUd999N+6++25UqVLFcT3Mnz8fvXr1wpVXXunsd9dddyEyMhJXXXUVSpUqhdWrV+Pdd99FVFQUXnjhBT8b0tPTMXXqVDRp0iRojNDgwYPx/fff45prrkGfPn0QHx+Pb7/9Ft9//z3+9a9/Of8le7GzXr166NGjBz788EOcO3cOLVq0wNy5czFt2jQMHTrUOeaGDRvQpk0b3HXXXahRowbCwsKwePFifPrpp6hYsaIrZGHbtm2488470b59eyQmJmLVqlUYP348Lr/8cowaNcrZrmTJkujRowfef/99tG7dGh07dsSxY8fwzjvv4NSpU9kOYQnEJ598gkmTJuG2225D/fr1ERERgTVr1uDDDz9E4cKF8eSTTwIAwsLC8P7776Ndu3aoVasW7r//fpQpUwa7du3CnDlzULRoUXzzzTeez1+5cmU8//zzGDp0KLZu3YoOHTqgSJEi2LJlC6ZPn45evXrhsccew08//YQ+ffrgjjvuQLVq1XDu3Dl88sknCA8PR6dOnbJ17UePHnViZE+ePOlkgtm0aRM6d+7s92y+9dZbeO655zBnzhwxlMFLnwDO34Nt27Y5g+bPP//s/FN23333oUKFCq7tJ02ahEKFCgW97sjISIwYMQK9e/fGHXfcgbZt2+KXX37Bp59+ipEjRyIuLg7A+XCPxx57DE899RSaNGmCrl27Ij09HR988AF27tzpih8GgG+++QZ//fUXgPP/SC9fvtyxs3379s4/mk888QTuvfdeNG7cGL169UJkZCSmTJmCJUuW4Pnnn3ey6wTKypL5MtKiRQvXPwq33347mjRpgvvvvx+rV692MsGkp6fjueee8zvOoUOH8P3336NTp07Zz2TkWTW8SPj+++9Njx49TI0aNUxMTIyJiIgwVapUMX379vXLBLN27VrTvHlzZwo9FXZ/+OEHU7t2bRMREWGqV69uPv30Uz8R3xhjTp06Zfr162fi4+NNdHS0ueWWW8yOHTuCCtqnT582xYsXN7GxsVnOtCFNgsn8i4iIMImJiea6664zb7zxRsDJKl7CICpUqBB0cgKdYLF582Zzxx13mIoVK5rChQubqKgoU79+fTN+/HjXlHljjHnjjTdMo0aNTFxcnClQoIApXbq0uffee4PObJw5c6YBYN58803R1oULF5p27dqZxMREU7BgQVOtWjUzcuRI1+QkL3Yac34ywLPPPmsqVKhgChYsaKpUqeKaqGLM+YkLvXr1MjVq1DDR0dEmIiLCVK1a1QwYMMDs37/fte2hQ4fMrbfeahITE01ERIRJTk42Q4YMCXifzp49a8aOHWvq1q1rYmJiTExMjLn22mtdEwYksjoJZvny5Wbw4MHmyiuvdN2T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\"},\"metadata\":{}}]},{\"cell_type\":\"code\",\"source\":\"import pydicomfrom pydicom.pixel_data_handlers.util import apply_voi_lutimport numpy as npimport osimport pandas as pd# Define the new directory to save cropped DICOM filesnew_dir = 'train'os.makedirs(new_dir, exist_ok=True)  # Create the directory if it doesn't exist# Define the crop size (e.g., 50x50 pixels around the center point)crop_size = 100# Function to decompress, crop around (x, y) coordinates, and save as a new DICOM filedef decompress_and_crop_dicom(row, idx):    original_filepath = row['filepath'][idx]    dicom_data = pydicom.dcmread(original_filepath)        # Decompress the DICOM file    if dicom_data.file_meta.TransferSyntaxUID.is_compressed:        dicom_data.decompress()    # Get the pixel array    img = apply_voi_lut(dicom_data.pixel_array, dicom_data) if 'VOILUTFunction' in dicom_data else dicom_data.pixel_array    # Get the crop center coordinates    x_center = int(row['x'][idx])    y_center = int(row['y'][idx])    # Calculate the crop boundaries    x_start = max(x_center - crop_size // 2, 0)    x_end = min(x_center + crop_size // 2, img.shape[1])    y_start = max(y_center - crop_size // 2, 0)    y_end = min(y_center + crop_size // 2, img.shape[0])    # Crop the image    cropped_img = img[y_start:y_end, x_start:x_end]    # Update the DICOM object with the cropped image data    dicom_data.PixelData = cropped_img.tobytes()    dicom_data.Rows, dicom_data.Columns = cropped_img.shape    dicom_data.file_meta.TransferSyntaxUID = pydicom.uid.ExplicitVRLittleEndian  # Save as uncompressed    # Save the new DICOM file    new_filepath = os.path.join(new_dir, f\\\"{row['study_id']}_cropped_{idx}.dcm\\\")    dicom_data.save_as(new_filepath)    return new_filepath# Loop through each row and process all coordinatesfor i, row in train_df.iterrows():    new_filepaths = []    # Loop through each coordinate in the row    for idx in range(len(row['x'])):        new_filepath = decompress_and_crop_dicom(row, idx)        new_filepaths.append(new_filepath)    # Update the filepath column with the list of new filepaths    train_df.at[i, 'filepath'] = new_filepaths# Check the updated dataframeprint(train_df.head())\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T08:54:36.186041Z\",\"iopub.execute_input\":\"2024-11-14T08:54:36.186897Z\",\"iopub.status.idle\":\"2024-11-14T09:02:00.592680Z\",\"shell.execute_reply.started\":\"2024-11-14T08:54:36.186842Z\",\"shell.execute_reply\":\"2024-11-14T09:02:00.591699Z\"},\"trusted\":true},\"execution_count\":22,\"outputs\":[{\"name\":\"stdout\",\"text\":\"        study_id   series_id series_description  \\\\3707  2557856398  3170818407        Sagittal T1   4333  2953643785  2766425881           Axial T2   4615  3160528641  3180832116   Sagittal T2/STIR   4637  3168755174  3335509714        Sagittal T1   1510  1036203708  3261685527   Sagittal T2/STIR                                           instance_number  \\\\3707  [5.0, 5.0, 5.0, 6.0, 6.0, 13.0, 13.0, 13.0, 14...   4333  [14.0, 15.0, 21.0, 22.0, 29.0, 29.0, 35.0, 36....   4615                     [10.0, 10.0, 10.0, 10.0, 10.0]   4637  [3.0, 3.0, 3.0, 3.0, 3.0, 11.0, 11.0, 12.0, 12...   1510                          [9.0, 9.0, 9.0, 9.0, 9.0]                                                 condition  \\\\3707  [Left Neural Foraminal Narrowing, Left Neural ...   4333  [Left Subarticular Stenosis, Right Subarticula...   4615  [Spinal Canal Stenosis, Spinal Canal Stenosis,...   4637  [Right Neural Foraminal Narrowing, Right Neura...   1510  [Spinal Canal Stenosis, Spinal Canal Stenosis,...                                                     level  \\\\3707  [L3/L4, L4/L5, L5/S1, L1/L2, L2/L3, L1/L2, L2/...   4333  [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   4615                [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   4637  [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1, L1/L2, L2/...   1510                [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]                                                         x  \\\\3707  [254.4318181818182, 260.11743119266055, 272.33...   4333  [141.91087811271296, 117.01071428571429, 141.5...   4615  [236.16421215705583, 235.86706605920844, 235.7...   4637  [471.6423529411765, 455.3788235294118, 435.501...   1510  [213.89368362148988, 205.36496108409892, 199.9...                                                         y  \\\\3707  [267.8787878787879, 323.87522935779816, 375.54...   4333  [152.32503276539973, 151.77142857142857, 142.2...   4615  [107.79395462933066, 171.6803656665286, 237.07...   4637  [276.4649448529412, 371.3355330882353, 472.530...   1510  [109.52065602589936, 153.71494553783413, 199.4...                                                  filepath  \\\\3707  [train/2557856398_cropped_0.dcm, train/2557856...   4333  [train/2953643785_cropped_0.dcm, train/2953643...   4615  [train/3160528641_cropped_0.dcm, train/3160528...   4637  [train/3168755174_cropped_0.dcm, train/3168755...   1510  [train/1036203708_cropped_0.dcm, train/1036203...                                                  severity  3707  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  4333  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  4615  [Normal/Mild, Normal/Mild, Normal/Mild, Modera...  4637  [Normal/Mild, Normal/Mild, Moderate, Severe, S...  1510  [Normal/Mild, Normal/Mild, Normal/Mild, Modera...  \",\"output_type\":\"stream\"}]},{\"cell_type\":\"code\",\"source\":\"print(train_df.columns)print(train_df.shape)print(train_df.head(2))\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"# DELETE DIRECTORIESimport shutil# Path to the directory you want to deletedirectory_to_delete = '/kaggle/working/train'# Delete the directory and all its contentsshutil.rmtree(directory_to_delete)print(f\\\"Directory {directory_to_delete} and all its contents have been deleted.\\\")\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"markdown\",\"source\":\"### Read DICOM images\",\"metadata\":{}},{\"cell_type\":\"code\",\"source\":\"import pydicomimport matplotlib.pyplot as pltdef read_dicom(file_path):    \\\"\\\"\\\"    Reads a DICOM file from the given file path and returns the pixel data.        Parameters:    file_path (str): The path to the DICOM file.        Returns:    numpy.ndarray: The pixel data from the DICOM file, or None if an error occurs.    \\\"\\\"\\\"    try:        # Read the DICOM file        dicom_image = pydicom.dcmread(file_path)                return dicom_image.pixel_array        except Exception as e:        print(f\\\"An error occurred while reading the DICOM file {file_path}: {e}\\\")        return Nonedef visualize_dicom(pixel_array, title='DICOM Image'):    \\\"\\\"\\\"    Visualizes the pixel data of a DICOM image using matplotlib.        Parameters:    pixel_array (numpy.ndarray): The pixel data of the DICOM image.    title (str): Title for the plot.        Returns:    None    \\\"\\\"\\\"    try:        # Visualize the image using matplotlib        plt.figure(figsize=(6, 6))        plt.imshow(pixel_array, cmap='gray')        plt.title(title)        plt.axis('off')        plt.show()            except Exception as e:        print(f\\\"An error occurred while visualizing the DICOM image: {e}\\\")def read_multiple_dicoms(file_paths):    \\\"\\\"\\\"    Reads multiple DICOM files from a list of file paths and returns their pixel data.        Parameters:    file_paths (list of str): A list of paths to DICOM files.        Returns:    dict: A dictionary with file paths as keys and pixel data (numpy.ndarray) as values.    \\\"\\\"\\\"    dicom_images = {}        for file_path in file_paths:        pixel_data = read_dicom(file_path)        if pixel_data is not None:            dicom_images[file_path] = pixel_data        else:            print(f\\\"Failed to read DICOM file: {file_path}\\\")        return dicom_imagesdef visualize_multiple_dicoms(dicom_images):    \\\"\\\"\\\"    Visualizes multiple DICOM images from a dictionary of pixel data.        Parameters:    dicom_images (dict): A dictionary with file paths as keys and pixel data (numpy.ndarray) as values.        Returns:    None    \\\"\\\"\\\"    for file_path, pixel_array in dicom_images.items():        visualize_dicom(pixel_array, title=f'DICOM Image: {file_path.split(\\\"/\\\")[-1]}')\",\"metadata\":{\"execution\":{\"iopub.status.busy\":\"2024-11-14T09:02:20.945630Z\",\"iopub.execute_input\":\"2024-11-14T09:02:20.946012Z\",\"iopub.status.idle\":\"2024-11-14T09:02:20.957261Z\",\"shell.execute_reply.started\":\"2024-11-14T09:02:20.945974Z\",\"shell.execute_reply\":\"2024-11-14T09:02:20.956291Z\"},\"trusted\":true},\"execution_count\":24,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"read_dicom(cleaned_grouped_df.iloc[0]['filepath'][0]).shape\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"def read_multiple_dicoms(filepaths):    dicom_images = {}    for filepath in filepaths:        try:            dicom_data = dcmread(filepath)            dicom_images[filepath] = dicom_data.pixel_array        except Exception as e:            print(f\\\"Could not read DICOM file {filepath}: {e}\\\")    return dicom_imagesdef visualize_dicoms_grid_with_annotations(df, study_id, series_id):    \\\"\\\"\\\"    Visualizes cropped DICOM images in a grid format for a specific study and series ID,    including additional information such as series description, conditions, levels, and severity,    with annotations for each condition using the x and y coordinates.        Parameters:    df (DataFrame): The DataFrame containing DICOM data details.    study_id (int): The study ID to filter the data.    series_id (int): The series ID to filter the data.        Returns:    None    \\\"\\\"\\\"    # Filter the DataFrame based on the given study_id and series_id    filtered_df = df[(df['study_id'] == study_id) & (df['series_id'] == series_id)]    if filtered_df.empty:        print(f\\\"No images found for study ID {study_id} and series ID {series_id}.\\\")        return    # Extract all filepaths and related info from the filtered DataFrame    filepaths = []    xy_annotations = {}  # Dictionary to store x, y, conditions, levels, and severities for each file    for index, row in filtered_df.iterrows():        if isinstance(row['filepath'], list):            for i, file_path in enumerate(row['filepath']):                filepaths.append(file_path)                if file_path not in xy_annotations:                    xy_annotations[file_path] = {'x': [], 'y': [], 'condition': [], 'level': [], 'severity': []}                xy_annotations[file_path]['x'].append(row['x'][i])                xy_annotations[file_path]['y'].append(row['y'][i])                xy_annotations[file_path]['condition'].append(row['condition'][i])                xy_annotations[file_path]['level'].append(row['level'][i])                xy_annotations[file_path]['severity'].append(row['severity'][i])        else:            filepaths.append(row['filepath'])            if row['filepath'] not in xy_annotations:                xy_annotations[row['filepath']] = {'x': [row['x']], 'y': [row['y']],                                                    'condition': [row['condition']],                                                    'level': [row['level']],                                                    'severity': [row['severity']]}    # Read all DICOM files from the cropped image filepaths    dicom_images = read_multiple_dicoms(filepaths)    # Determine the number of images    num_images = len(dicom_images)    cols = 3  # Number of columns in the grid    rows = (num_images + cols - 1) // cols  # Calculate the number of rows needed    # Extract additional information to display    series_description = filtered_df['series_description'].values[0]    # Create a grid to visualize the DICOM images    fig, axes = plt.subplots(rows, cols, figsize=(15, 5 * rows))    axes = axes.flatten()    # Iterate through the DICOM images and display them in the grid    for idx, (file_path, pixel_array) in enumerate(dicom_images.items()):        axes[idx].imshow(pixel_array, cmap='gray')                # Add the image information in the title        title = f\\\"Series: {series_description}\\Image: {file_path.split('/')[-1]}\\\"        axes[idx].set_title(title, fontsize=8)        axes[idx].axis('off')        if file_path in xy_annotations:            for x, y, condition, level, severity in zip(xy_annotations[file_path]['x'],                                                         xy_annotations[file_path]['y'],                                                         xy_annotations[file_path]['condition'],                                                        xy_annotations[file_path]['level'],                                                        xy_annotations[file_path]['severity']):                circle = plt.Circle((x, y), radius=10, color='red', fill=False, linewidth=1.5)                axes[idx].add_patch(circle)                annotation_text = f\\\"Condition: {condition}\\Level: {level}\\Severity: {severity}\\\"                axes[idx].text(x, y, annotation_text, color='white', fontsize=8, fontweight='bold',                               ha='left', va='top', bbox=dict(facecolor='black', alpha=0.6, edgecolor='none'))    # Turn off any unused axes    for idx in range(num_images, len(axes)):        axes[idx].axis('off')    plt.tight_layout()    plt.show()# Usage example with specific study and series IDstudy_id = 4205258367  series_id = 2470721789  visualize_dicoms_grid_with_annotations(cleaned_grouped_df, study_id, series_id)\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"def visualize_dicoms_grid_with_annotations(df, study_id, series_id):    \\\"\\\"\\\"    Visualizes DICOM images in a grid format for a specific study and series ID,    including additional information such as series description, conditions, levels, and severity,    with annotations for each condition using the x and y coordinates.        Parameters:    df (DataFrame): The DataFrame containing DICOM data details.    study_id (int): The study ID to filter the data.    series_id (int): The series ID to filter the data.        Returns:    None    \\\"\\\"\\\"    # Filter the DataFrame based on the given study_id and series_id    filtered_df = df[(df['study_id'] == study_id) & (df['series_id'] == series_id)]    if filtered_df.empty:        print(f\\\"No images found for study ID {study_id} and series ID {series_id}.\\\")        return    # Extract all filepaths and related info from the filtered DataFrame    filepaths = []    xy_annotations = {}  # Dictionary to store x, y, conditions, levels, and severities for each file    for index, row in filtered_df.iterrows():        if isinstance(row['filepath'], list):            for i, file_path in enumerate(row['filepath']):                filepaths.append(file_path)                if file_path not in xy_annotations:                    xy_annotations[file_path] = {'x': [], 'y': [], 'condition': [], 'level': [], 'severity': []}                xy_annotations[file_path]['x'].append(row['x'][i])                xy_annotations[file_path]['y'].append(row['y'][i])                xy_annotations[file_path]['condition'].append(row['condition'][i])                xy_annotations[file_path]['level'].append(row['level'][i])                xy_annotations[file_path]['severity'].append(row['severity'][i])        else:            filepaths.append(row['filepath'])            if row['filepath'] not in xy_annotations:                xy_annotations[row['filepath']] = {'x': [row['x']], 'y': [row['y']],                                                    'condition': [row['condition']],                                                    'level': [row['level']],                                                    'severity': [row['severity']]}    # Read all DICOM files from the extracted filepaths    dicom_images = read_multiple_dicoms(filepaths)    # Determine the number of images    num_images = len(dicom_images)    cols = 3  # Number of columns in the grid    rows = (num_images + cols - 1) // cols  # Calculate the number of rows needed    # Extract additional information to display    series_description = filtered_df['series_description'].values[0]    # Create a grid to visualize the DICOM images    fig, axes = plt.subplots(rows, cols, figsize=(15, 5 * rows))    axes = axes.flatten()    # Iterate through the DICOM images and display them in the grid    for idx, (file_path, pixel_array) in enumerate(dicom_images.items()):        axes[idx].imshow(pixel_array, cmap='gray')                # Add the image information in the title        title = f\\\"Series: {series_description}\\Image: {file_path.split('/')[-1]}\\\"        axes[idx].set_title(title, fontsize=8)        axes[idx].axis('off')        if file_path in xy_annotations:            for x, y, condition, level, severity in zip(xy_annotations[file_path]['x'],                                                         xy_annotations[file_path]['y'],                                                         xy_annotations[file_path]['condition'],                                                        xy_annotations[file_path]['level'],                                                        xy_annotations[file_path]['severity']):                circle = plt.Circle((x, y), radius=10, color='red', fill=False, linewidth=1.5)                axes[idx].add_patch(circle)                annotation_text = f\\\"Condition: {condition}\\Level: {level}\\Severity: {severity}\\\"                axes[idx].text(x, y, annotation_text, color='white', fontsize=8, fontweight='bold',                               ha='left', va='top', bbox=dict(facecolor='black', alpha=0.6, edgecolor='none'))                print(file_path)    for idx in range(num_images, len(axes)):        axes[idx].axis('off')    plt.tight_layout()    plt.show()study_id = 4205258367  series_id = 2470721789  visualize_dicoms_grid_with_annotations(cleaned_grouped_df, study_id, series_id)\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"cleaned_grouped_df\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"cleaned_grouped_df.dtypes\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"markdown\",\"source\":\"## Prepare DF for training\",\"metadata\":{}},{\"cell_type\":\"code\",\"source\":\"expanded_df = cleaned_grouped_df.explode(['instance_number', 'condition', 'level', 'x', 'y', 'filepath', 'severity'])# Reset the index after expandingexpanded_df = expanded_df.reset_index(drop=True)expanded_df\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"df_encoded = pd.get_dummies(expanded_df, columns=['condition', 'level'])df_encoded\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"severity_mapping = {'Normal/Mild': 0, 'Moderate': 1, 'Severe': 2}df_encoded['severity'] = df_encoded['severity'].map(severity_mapping)df_encoded\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"most_frequent_value = df_encoded['severity'].mode()[0]print(\\\"Number of NaN values in 'severity' column before filling:\\\")print(df_encoded['severity'].isna().sum())df_encoded['severity'] = df_encoded['severity'].fillna(most_frequent_value)print(f\\\"The most frequent value in 'severity' is: {most_frequent_value}\\\")print(\\\"Number of NaN values in 'severity' column after filling:\\\")print(df_encoded['severity'].isna().sum())print(df_encoded['severity'].unique())print(df_encoded['severity'].dtype)\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"import pandas as pdfrom torch.utils.data import Dataset, DataLoaderimport torchvision.transforms as transformsimport torchimport pydicomimport numpy as npimport albumentations as Afrom albumentations.pytorch import ToTensorV2def read_dicom(file_path):    \\\"\\\"\\\"    Reads a DICOM file from the given file path and returns the pixel data.        Parameters:    file_path (str): The path to the DICOM file.        Returns:    numpy.ndarray: The pixel data from the DICOM file, or None if an error occurs.    \\\"\\\"\\\"    try:        dicom_image = pydicom.dcmread(file_path)                image_array = dicom_image.pixel_array.astype(np.float32)        return image_array        except Exception as e:        print(f\\\"An error occurred while reading the DICOM file {file_path}: {e}\\\")        return Noneclass CustomDataset(Dataset):    def __init__(self, dataframe, features_list, y_label=None, transform=None):        \\\"\\\"\\\"        Initializes the CustomDataset.                Parameters:        dataframe (DataFrame): The dataframe containing data.        features_list (list of str): List of column names to be used as features.        y_label (str, optional): Column name of the target label. Defaults to None for inference.        transform (callable, optional): A function/transform to apply to the images.        \\\"\\\"\\\"        self.dataframe = dataframe        self.features_list = features_list        self.y_label = y_label        self.transform = transform    def __len__(self):        return len(self.dataframe)    def __getitem__(self, index):        image_path = self.dataframe['filepath'].iloc[index]        image = read_dicom(image_path)        if image.max() != image.min():            image = (image - image.min()) / (image.max() - image.min())        else:            image = np.zeros_like(image, dtype=np.float32)        image = image.astype(np.float32)        image = np.stack([image, image, image], axis=-1)              if self.transform:            augmented = self.transform(image=image)            image = augmented['image']        else:            image = torch.tensor(image).permute(2, 0, 1)        features = self.dataframe[self.features_list].iloc[index].values.astype(np.float32)        features = torch.tensor(features)        if self.y_label:            label = self.dataframe[self.y_label].iloc[index]            label = torch.tensor(label, dtype=torch.long)            return image, features, label        else:            return image, features        features_list = [    'condition_Left Neural Foraminal Narrowing',    'condition_Left Subarticular Stenosis',    'condition_Right Neural Foraminal Narrowing',    'condition_Right Subarticular Stenosis',    'condition_Spinal Canal Stenosis',    'level_L1/L2',    'level_L2/L3',    'level_L3/L4',    'level_L4/L5',    'level_L5/S1']y_label = 'severity'normalize_mean = (0.485, 0.456, 0.406)normalize_std = (0.229, 0.224, 0.225)train_transform = A.Compose([    A.Resize(384, 384),    A.Rotate(limit=5, p=0.5),    A.HorizontalFlip(p=0.5),    A.VerticalFlip(p=0.1),      A.RandomBrightnessContrast(brightness_limit=0.1, contrast_limit=0.1, p=0.5),    A.ElasticTransform(alpha=1, sigma=50, alpha_affine=None, p=0.5),    A.GridDistortion(num_steps=5, distort_limit=0.03, p=0.5),    A.GaussNoise(var_limit=(0.001, 0.005), p=0.5),    A.Normalize(mean=normalize_mean, std=normalize_std, max_pixel_value=1.0),  # Set max_pixel_value=1.0    ToTensorV2(),])val_transform = A.Compose([    A.Resize(384, 384),    A.Normalize(mean=normalize_mean, std=normalize_std, max_pixel_value=1.0),    ToTensorV2(),])dataset = CustomDataset(df_encoded, features_list, y_label, transform=train_transform)data_loader = DataLoader(dataset, batch_size=32, shuffle=True)for images, features, labels in data_loader:    print(images.shape, features.shape, labels.shape)  # Display the shape of images, features, and labels    break  \",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"def visualize_image_processing(index):    # Access the row from the dataframe    row = df_encoded.iloc[index]    image_path = row['filepath']    features = row[features_list].values.astype(np.float32)    label = row[y_label]    image = read_dicom(image_path)    plt.figure(figsize=(6, 6))    plt.imshow(image, cmap='gray')    plt.title(f\\\"Original Image - Label: {label}\\\")    plt.axis('off')    plt.show()    print(image.shape)    print(f\\\"Original image: min={image.min()}, max={image.max()}\\\")    # Step 2: Normalize the image to [0, 1]    if image.max() != image.min():        image_norm = (image - image.min()) / (image.max() - image.min())    else:        image_norm = np.zeros_like(image, dtype=np.float32)    image_norm = image_norm.astype(np.float32)    print(image_norm.shape)    print(f\\\"Normalized image: min={image_norm.min()}, max={image_norm.max()}\\\")    # Visualize normalized image    plt.figure(figsize=(6, 6))    plt.imshow(image_norm, cmap='gray')    plt.title(\\\"Normalized Image\\\")    plt.axis('off')    plt.show()    # Step 3: Stack to 3 channels    image_3ch = np.stack([image_norm, image_norm, image_norm], axis=-1)    # Step 4: Apply transformations    if train_transform:        augmented = train_transform(image=image_3ch)        image_transformed = augmented['image']        # Unnormalize for visualization        mean = np.array(normalize_mean)        std = np.array(normalize_std)        image_unorm = image_transformed.permute(1, 2, 0).numpy()        image_unorm = (image_unorm * std) + mean  # Unnormalize        image_unorm = np.clip(image_unorm, 0, 1)        # Debugging: Check pixel values        print(f\\\"After unnormalization: min={image_unorm.min()}, max={image_unorm.max()}, dtype={image_unorm.dtype}\\\")    else:        image_transformed = torch.tensor(image_3ch).permute(2, 0, 1)        image_unorm = image_transformed.permute(1, 2, 0).numpy()    # Visualize transformed image    plt.figure(figsize=(6, 6))    plt.imshow(image_unorm)    plt.title(\\\"Transformed Image\\\")    plt.axis('off')    plt.show()\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"# Test with a specific indexvisualize_image_processing(index=0)  # Replace 0 with any index you'd like to test\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"markdown\",\"source\":\"### Split data\",\"metadata\":{}},{\"cell_type\":\"code\",\"source\":\"from sklearn.model_selection import train_test_split# Define the percentage of data to use for a quick runQUICK_RUN_PERCENTAGE = 1  # Use 20% of the data for a quick run# Sample the data for a quick runquick_run_df = df_encoded.sample(frac=QUICK_RUN_PERCENTAGE).reset_index(drop=True)# Define the test size percentageTEST_SIZE = 0.2  # 20% of the data will be used for testing# Split the sampled data into training and testing setstrain_df, val_df = train_test_split(quick_run_df, test_size=TEST_SIZE)# Reset indices after splittingtrain_df = train_df.reset_index(drop=True)val_df = val_df.reset_index(drop=True)print(f\\\"Total data size: {len(df_encoded)}\\\")print(f\\\"Total data size for quick run: {len(quick_run_df)}\\\")print(f\\\"Training set size: {len(train_df)}\\\")print(f\\\"Testing set size: {len(val_df)}\\\")\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"# Determine the number of workers automaticallyimport multiprocessingnum_workers = multiprocessing.cpu_count()print(f\\\"Number of CPU cores available: {num_workers}\\\")\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"# Create the datasetstrain_dataset = CustomDataset(train_df, features_list, y_label, transform=train_transform)val_dataset = CustomDataset(val_df, features_list, y_label, transform=val_transform)# Create the data loaders with the determined number of workerstrain_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=num_workers)val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False, num_workers=num_workers)print(f\\\"Number of batches in training set: {len(train_loader)}\\\")print(f\\\"Number of batches in testing set: {len(val_loader)}\\\")\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"import matplotlib.pyplot as pltdef visualize_batch(data_loader):    \\\"\\\"\\\"    Visualizes a batch of images and their corresponding labels from the DataLoader in a grid format.        Parameters:    data_loader (DataLoader): The DataLoader containing the dataset.        Returns:    None    \\\"\\\"\\\"    # Get one batch of data    images, features, labels = next(iter(data_loader))        # Determine the number of images in the batch    batch_size = images.shape[0]    cols = 4  # Number of columns in the grid    rows = (batch_size + cols - 1) // cols  # Calculate the number of rows needed    fig, axes = plt.subplots(rows, cols, figsize=(15, 5 * rows))    axes = axes.flatten()  # Flatten the axes array for easy iteration    for i in range(batch_size):        img = images[i].permute(1, 2, 0).numpy()  # Convert tensor to NumPy array with HWC format                # Plot image        axes[i].imshow(img, cmap='gray')        axes[i].set_title(f\\\"Label: {labels[i].item()}\\Features: {features[i].tolist()}\\\", fontsize=8)        axes[i].axis('off')    # Hide any unused subplots    for i in range(batch_size, len(axes)):        axes[i].axis('off')    plt.tight_layout()    plt.show()# Visualize a batch from the training setvisualize_batch(train_loader)\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"import matplotlib.pyplot as pltdef plot_label_distribution(train_df, test_df, y_label):    \\\"\\\"\\\"    Plots the distribution of labels in the training and validation sets.        Parameters:    train_df (DataFrame): The training dataframe.    test_df (DataFrame): The validation dataframe.    y_label (str): The column name of the target label.        Returns:    None    \\\"\\\"\\\"    # Calculate the label distribution in training and testing sets    train_distribution = train_df[y_label].value_counts().sort_index()    test_distribution = test_df[y_label].value_counts().sort_index()        # Plot the distribution    fig, ax = plt.subplots(1, 2, figsize=(12, 5))        train_distribution.plot(kind='bar', ax=ax[0], color='skyblue')    ax[0].set_title('Training Set Label Distribution')    ax[0].set_xlabel('Label')    ax[0].set_ylabel('Count')        test_distribution.plot(kind='bar', ax=ax[1], color='lightcoral')    ax[1].set_title('Validation Set Label Distribution')    ax[1].set_xlabel('Label')    ax[1].set_ylabel('Count')        plt.tight_layout()    plt.show()# Plot the distribution of labels in the training and validation setsplot_label_distribution(train_df, val_df, y_label)\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"markdown\",\"source\":\"## Model\",\"metadata\":{}},{\"cell_type\":\"code\",\"source\":\"# Set the device to GPU if available; otherwise, use CPUdevice = torch.device(\\\"cuda\\\" if torch.cuda.is_available() else \\\"cpu\\\")# Print the device being usedprint(f\\\"Using device: {device}\\\")\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"import torchimport torch.nn as nnimport torchvision.models as modelsclass EfficientNetWithFeatures(nn.Module):    def __init__(self, num_classes, num_features):        super(EfficientNetWithFeatures, self).__init__()        self.efficientnet = models.efficientnet_v2_s(weights='IMAGENET1K_V1')        # Freeze all layers first        for param in self.efficientnet.parameters():            param.requires_grad = False                    # Get the list of all parameters in EfficientNet        all_layers = list(self.efficientnet.parameters())        # Unfreeze the last 20 layers        for param in all_layers[-20:]:            param.requires_grad = True        num_features_eff = self.efficientnet.classifier[-1].in_features        self.efficientnet.classifier = nn.Identity()        # Define a more complex fully connected layer to combine EfficientNet embeddings with numerical features        self.fc1 = nn.Linear(num_features_eff + num_features, 256)        self.fc2 = nn.Linear(256, 128)        self.fc3 = nn.Linear(128, num_classes)        self.dropout = nn.Dropout(p=0.5)      def forward(self, image, features):        image_embedding = self.efficientnet(image)        # Concatenate EfficientNet embeddings with numerical features        combined_input = torch.cat((image_embedding, features), dim=1)        # Pass through the fully connected layers with dropout        x = torch.relu(self.fc1(combined_input))        x = self.dropout(x)  # Dropout after the first fully connected layer        x = torch.relu(self.fc2(x))        x = self.fc3(x)        return xnum_classes = 3  # Replace with the number of classes in your datasetnum_features = 10  # Initialize the custom modelmodel = EfficientNetWithFeatures(num_classes=num_classes, num_features=num_features).to(device)\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"from datetime import datetimeimport torchfrom tqdm import tqdmfrom sklearn.metrics import precision_score, recall_score, f1_score, confusion_matrixfrom torch.cuda.amp import GradScaler, autocastdef train_model(model, train_loader, criterion, optimizer, device, scaler):    model.train()    running_loss = 0.0    correct = 0    total = 0    for images, features, labels in tqdm(train_loader, desc=\\\"Training\\\"):        images, features, labels = images.to(device), features.to(device), labels.to(device)        optimizer.zero_grad()        with autocast():            outputs = model(images, features)            loss = criterion(outputs, labels)        scaler.scale(loss).backward()        scaler.step(optimizer)        scaler.update()        running_loss += loss.item()        _, predicted = torch.max(outputs, 1)        total += labels.size(0)        correct += (predicted == labels).sum().item()    epoch_loss = running_loss / len(train_loader)    epoch_acc = 100 * correct / total    return epoch_loss, epoch_accdef validate_model_with_metrics(model, val_loader, criterion, device, scaler):    model.eval()    running_loss = 0.0    correct = 0    total = 0    all_preds = []    all_labels = []    with torch.no_grad():        for images, features, labels in tqdm(val_loader, desc=\\\"Validation\\\"):            images, features, labels = images.to(device), features.to(device), labels.to(device)            with autocast():                outputs = model(images, features)                loss = criterion(outputs, labels)            running_loss += loss.item()            _, predicted = torch.max(outputs, 1)            total += labels.size(0)            correct += (predicted == labels).sum().item()            all_preds.extend(predicted.cpu().numpy())            all_labels.extend(labels.cpu().numpy())    epoch_loss = running_loss / len(val_loader)    epoch_acc = 100 * correct / total    precision = precision_score(all_labels, all_preds, average='weighted')    recall = recall_score(all_labels, all_preds, average='weighted')    f1 = f1_score(all_labels, all_preds, average='weighted')    cm = confusion_matrix(all_labels, all_preds)#     print(f\\\"Precision: {precision:.4f} | Recall: {recall:.4f} | F1-Score: {f1:.4f}\\\")#     print(\\\"Confusion Matrix:\\\")#     print(cm)    return epoch_loss, epoch_acc, precision, recall, f1, cm# Main training loop with early stopping and learning rate schedulerdef train_and_validate(model, train_loader, val_loader, criterion, optimizer, num_epochs, device, patience=5):    best_val_loss = float('inf')    best_val_f1 = 0.0    epochs_without_improvement = 0    save_path = f\\\"/kaggle/working/model_{datetime.now().strftime('%Y%m%d_%H%M%S')}.pth\\\"        #scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=num_epochs, eta_min=1e-6)    scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=3, verbose=True)    scaler = GradScaler()    for epoch in range(num_epochs):        print(f\\\"Epoch {epoch+1}/{num_epochs}\\\")        # Train the model        train_loss, train_acc = train_model(model, train_loader, criterion, optimizer, device, scaler)        print(f\\\"Train Loss: {train_loss:.4f} | Train Acc: {train_acc:.2f}%\\\")        # Validate the model with additional metrics        val_loss, val_acc, precision, recall, f1, cm = validate_model_with_metrics(model, val_loader, criterion, device, scaler)        print(f\\\"Validation Loss: {val_loss:.4f} | Validation Acc: {val_acc:.2f}%\\\")        print(f\\\"Precision: {precision:.4f} | Recall: {recall:.4f} | F1-Score: {f1:.4f}\\\")        # Step with the scheduler        scheduler.step(val_loss)        # Check for improvement based on validation loss and F1-Score        if val_loss < best_val_loss or f1 > best_val_f1:            if val_loss < best_val_loss:                print(f\\\"Validation loss decreased ({best_val_loss:.4f} --> {val_loss:.4f}).\\\")                best_val_loss = val_loss            if f1 > best_val_f1:                print(f\\\"F1-Score increased ({best_val_f1:.4f} --> {f1:.4f}).\\\")                best_val_f1 = f1                        print(\\\"Saving model...\\\")            torch.save(model.state_dict(), save_path)            epochs_without_improvement = 0  # Reset counter        else:            epochs_without_improvement += 1            print(f\\\"No improvement in validation metrics for {epochs_without_improvement} epochs.\\\")                # Early stopping        if epochs_without_improvement >= patience:            print(f\\\"Early stopping triggered after {patience} epochs without improvement.\\\")            break    print(\\\"Training complete.\\\")    print(f\\\"Best Validation Loss: {best_val_loss:.4f} | Best Validation F1-Score: {best_val_f1:.4f}\\\")    print(f\\\"Best model saved to: {save_path}\\\")    return save_path# Example usageclass_weights = torch.tensor([1.0, 2.0, 4.0], device=device)  # Example weights for each class severityfocal_loss = torch.hub.load(    'adeelh/pytorch-multi-class-focal-loss',    model='FocalLoss',    alpha=class_weights,    gamma=2,    reduction='mean',    force_reload=False,    trust_repo=True)criterion = focal_loss#criterion = nn.CrossEntropyLoss(weight=class_weights)optimizer = torch.optim.AdamW(model.parameters(), lr=1e-4, weight_decay=1e-4)\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"# Set the number of epochsnum_epochs = 25patience = 10saved_model_path = train_and_validate(model, train_loader, val_loader, criterion, optimizer, num_epochs, device, patience)\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"markdown\",\"source\":\"### Prepare test file for submission\",\"metadata\":{}},{\"cell_type\":\"code\",\"source\":\"test_df   = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_series_descriptions.csv')test_df\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"import osimport pandas as pdfrom tqdm import tqdm# Define mappings from series descriptions to conditionscondition_mapping = {    'Axial T2': ['Left Subarticular Stenosis', 'Right Subarticular Stenosis'],    'Sagittal T1': ['Right Neural Foraminal Narrowing', 'Left Neural Foraminal Narrowing', 'Spinal Canal Stenosis'],    'Sagittal T2/STIR': ['Spinal Canal Stenosis']}# Define all possible levelslevels = ['L1/L2', 'L2/L3', 'L3/L4', 'L4/L5', 'L5/S1']# Initialize a list to store each row's featuresexpanded_features = []# Main path for test imagesmain_path = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_images'# Iterate over each row in the test filefor idx, row in test_df.iterrows():    study_id = row['study_id']    series_id = row['series_id']    series_description = row['series_description']        # Define the directory path for the current study_id and series_id    dir_path = os.path.join(main_path, str(study_id), str(series_id))        # Check if the directory exists    if os.path.exists(dir_path):        # List all DICOM files (instances) in the directory        instance_files = [f for f in os.listdir(dir_path) if f.endswith('.dcm')]                # Get instance numbers from the file names        instance_numbers = [int(f.split('.')[0]) for f in instance_files]                # Generate rows for each instance        for instance_number in instance_numbers:            # Get the conditions corresponding to the series description            applicable_conditions = condition_mapping[series_description]            # Generate combinations for each condition and level            for condition in condition_mapping['Axial T2'] + condition_mapping['Sagittal T1'] + condition_mapping['Sagittal T2/STIR']:                for level in levels:                    features = {                        'study_id': study_id,                        'series_id': series_id,                        'instance_number': instance_number,                        'series_description': series_description,                        'condition': condition,                        'level': level                    }                    # Set True/False for the condition-level combination                    if condition in applicable_conditions:                        features['is_applicable'] = True                    else:                        features['is_applicable'] = False                    # Append features to the list                    expanded_features.append(features)# Convert to DataFrameexpanded_test_df = pd.DataFrame(expanded_features)# One-hot encode 'condition' and 'level' columnsencoded_df = pd.get_dummies(expanded_test_df[['condition', 'level']], prefix=['condition', 'level'])# Concatenate the original DataFrame with the encoded columnsexpanded_test_df = pd.concat([expanded_test_df, encoded_df], axis=1)# Keep only rows where 'is_applicable' is Trueexpanded_test_df = expanded_test_df[expanded_test_df['is_applicable']].reset_index(drop=True)# Generate the filepath for each rowdef generate_filepath(row):    file_path = f\\\"{main_path}/{row['study_id']}/{row['series_id']}/{int(row['instance_number'])}.dcm\\\"    return file_path if os.path.exists(file_path) else None# Apply the filepath generation functionexpanded_test_df['filepath'] = expanded_test_df.progress_apply(generate_filepath, axis=1)print(\\\"Expanded Test DataFrame:\\\")expanded_test_df\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"expanded_test_df['condition'].unique()\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"# Create the dataset and data loader for the test settest_dataset = CustomDataset(expanded_test_df, features_list, transform=val_trasform)test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)  # No shuffling for inference\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"# Initialize results storageresults = {    'row_id': [],    'normal_mild': [],    'moderate': [],    'severe': []}# Display initial messagedisplay(\\\"Starting inference on the test set...\\\")# Use tqdm to create a progress bar for the test_loaderwith torch.no_grad():  # Disable gradient computation for inference    for batch_idx, (images, features) in enumerate(tqdm(test_loader, desc=\\\"Processing batches\\\")):                # Move data to the appropriate device        images, features = images.to(device), features.to(device)        # Forward pass through the model        outputs = model(images, features)        # Get the predicted probabilities using softmax        probs = torch.softmax(outputs, dim=1)        # Iterate through the probabilities and corresponding rows in the batch        for i in range(len(probs)):            # Calculate the index in the DataFrame corresponding to this batch            df_index = batch_idx * test_loader.batch_size + i                        # Check if the index is within the bounds of the DataFrame            if df_index >= len(expanded_test_df):                continue  # Skip if index is out of bounds            # Extract study_id, condition, and level directly from the DataFrame            study_id = expanded_test_df.iloc[df_index]['study_id']            condition = expanded_test_df.iloc[df_index]['condition']            level = expanded_test_df.iloc[df_index]['level']            # Generate row_id            row_id = f\\\"{study_id}_{condition}_{level.replace('/', '_')}\\\".lower().replace(' ', '_')            # Append results            results['row_id'].append(row_id)            results['normal_mild'].append(probs[i, 0].item())  # Probability for 'Normal/Mild'            results['moderate'].append(probs[i, 1].item())    # Probability for 'Moderate'            results['severe'].append(probs[i, 2].item())      # Probability for 'Severe'# Convert the results to a DataFrameresults_df = pd.DataFrame(results)# Display the final resultsdisplay(results_df.head())\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"results_df['row_id'].unique()\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"import pandas as pd# Define all possible conditions and levelsconditions = [    'Left Neural Foraminal Narrowing', 'Left Subarticular Stenosis',    'Right Neural Foraminal Narrowing', 'Right Subarticular Stenosis',    'Spinal Canal Stenosis']levels = ['L1/L2', 'L2/L3', 'L3/L4', 'L4/L5', 'L5/S1']# Function to check and generate missing combinationsdef ensure_complete_results(results_df):    # List to store new rows for missing combinations    new_rows = []        # Extract study_id from row_id by splitting on underscores    results_df['study_id'] = results_df['row_id'].apply(lambda x: x.split('_')[0])    # Group by 'study_id' to check each group separately    grouped = results_df.groupby('study_id')        for study_id, group in grouped:        # Get current combinations for this study_id        current_combinations = set(group['row_id'])                # Generate all possible combinations for this study_id        all_combinations = {            f\\\"{study_id}_{condition.lower().replace(' ', '_')}_{level.replace('/', '_')}\\\".lower()            for condition in conditions            for level in levels        }                # Find missing combinations        missing_combinations = all_combinations - current_combinations                # Generate rows for missing combinations        for missing_row_id in missing_combinations:            # Extract condition and level from the missing row_id            condition = '_'.join(missing_row_id.split('_')[1:-1])            level = missing_row_id.split('_')[-1].replace('_', '/')                        # Create a new row with default or statistical values            new_row = {                'row_id': missing_row_id,                'normal_mild': 1/3,                  'moderate': 1/3,                'severe': 1/3            }                        new_rows.append(new_row)    # Convert new rows to DataFrame    new_rows_df = pd.DataFrame(new_rows)    complete_results_df = pd.concat([results_df, new_rows_df], ignore_index=True)        return complete_results_df.sort_values(by='row_id').reset_index(drop=True)results_df = ensure_complete_results(results_df)study_id_counts = results_df['row_id'].str.split('_').str[0].value_counts()display(study_id_counts)\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"results_df.head()\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"averaged_results_df = results_df[['row_id','normal_mild', 'moderate', 'severe']].groupby('row_id', as_index=False).mean()sum_probs = averaged_results_df[['normal_mild', 'moderate', 'severe']].sum(axis=1)# Normalize the columns so that each row sums to 1averaged_results_df['normal_mild'] = averaged_results_df['normal_mild'] / sum_probsaveraged_results_df['moderate'] = averaged_results_df['moderate'] / sum_probsaveraged_results_df['severe'] = averaged_results_df['severe'] / sum_probs# Verify that the sum of the three columns is 1 for each rowaveraged_results_df['sum_check'] = averaged_results_df[['normal_mild', 'moderate', 'severe']].sum(axis=1).apply(lambda x: round(x,2))averaged_results_df\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"final_df = averaged_results_df[['row_id', 'normal_mild', 'moderate', 'severe']]final_df\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"final_df.to_csv(\\\"/kaggle/working/submission.csv\\\", index=False)\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]},{\"cell_type\":\"code\",\"source\":\"\",\"metadata\":{\"trusted\":true},\"execution_count\":null,\"outputs\":[]}]}","metadata":{"_uuid":"f9f757df-12eb-41a3-a506-bc9e2b257340","_cell_guid":"0c58be27-0e0a-4172-9ef1-87313af99808","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-11-14T09:36:38.953088Z","iopub.execute_input":"2024-11-14T09:36:38.953483Z","iopub.status.idle":"2024-11-14T09:36:40.324153Z","shell.execute_reply.started":"2024-11-14T09:36:38.953447Z","shell.execute_reply":"2024-11-14T09:36:40.319145Z"}},"outputs":[{"traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)","Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m {\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mkernelspec\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mlanguage\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpython\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdisplay_name\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPython 3\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpython3\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mlanguage_info\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpython\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mversion\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m3.10.14\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmimetype\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/x-python\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcodemirror_mode\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mipython\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mversion\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m3\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpygments_lexer\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mipython3\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnbconvert_exporter\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpython\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfile_extension\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m.py\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mkaggle\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124maccelerator\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnvidiaTeslaT4\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdataSources\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msourceId\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m71549\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdatabundleVersionId\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m8561470\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msourceType\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcompetition\u001b[39m\u001b[38;5;124m\"\u001b[39m}],\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdockerImageVersionId\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m30787\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124misInternetEnabled\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[43mtrue\u001b[49m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mlanguage\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpython\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msourceType\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnotebook\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124misGpuEnabled\u001b[39m\u001b[38;5;124m\"\u001b[39m:true}},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnbformat_minor\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m4\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnbformat\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m4\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcells\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mimport pandas as pdimport matplotlib.pyplot as pltimport cv2import pydicomimport numpy as npimport osimport globfrom tqdm import tqdmfrom tqdm.auto import tqdm import warningstqdm.pandas() \u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:12.985424Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:12.985731Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:14.583480Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:12.985697Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:14.582459Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m1\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mimport randomimport numpy as npimport torchdef set_seed(seed=42):    random.seed(seed)    np.random.seed(seed)    torch.manual_seed(seed)    torch.cuda.manual_seed_all(seed)    # For deterministic behavior    torch.backends.cudnn.deterministic = True    torch.backends.cudnn.benchmark = Falseset_seed(42)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:14.584817Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:14.585728Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:18.325651Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:14.585682Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:18.324699Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m2\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mlabel_coordinates_df = pd.read_csv(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_label_coordinates.csv\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)train_series = pd.read_csv(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_series_descriptions.csv\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)df_train = pd.read_csv(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train.csv\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:18.326864Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:18.327286Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:18.500849Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:18.327252Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:18.499832Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m3\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdf_train.columns\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:18.502817Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:18.503581Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:18.510681Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:18.503542Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:18.509710Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m4\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m4\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecute_result\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIndex([\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstudy_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mspinal_canal_stenosis_l1_l2\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,       \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mspinal_canal_stenosis_l2_l3\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mspinal_canal_stenosis_l3_l4\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,       \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mspinal_canal_stenosis_l4_l5\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mspinal_canal_stenosis_l5_s1\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,       \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mleft_neural_foraminal_narrowing_l1_l2\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,       \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mleft_neural_foraminal_narrowing_l2_l3\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,       \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mleft_neural_foraminal_narrowing_l3_l4\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,       \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mleft_neural_foraminal_narrowing_l4_l5\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,       \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mleft_neural_foraminal_narrowing_l5_s1\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,       \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mright_neural_foraminal_narrowing_l1_l2\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,       \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mright_neural_foraminal_narrowing_l2_l3\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,       \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mright_neural_foraminal_narrowing_l3_l4\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,       \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mright_neural_foraminal_narrowing_l4_l5\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,       \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mright_neural_foraminal_narrowing_l5_s1\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,       \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mleft_subarticular_stenosis_l1_l2\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mleft_subarticular_stenosis_l2_l3\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,       \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mleft_subarticular_stenosis_l3_l4\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mleft_subarticular_stenosis_l4_l5\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,       \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mleft_subarticular_stenosis_l5_s1\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mright_subarticular_stenosis_l1_l2\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,       \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mright_subarticular_stenosis_l2_l3\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,       \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mright_subarticular_stenosis_l3_l4\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,       \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mright_subarticular_stenosis_l4_l5\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,       \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mright_subarticular_stenosis_l5_s1\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m],      dtype=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mobject\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}}]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrain_series\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:33.776744Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:33.777630Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:33.788058Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:33.777588Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:33.787099Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m6\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m6\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecute_result\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m        study_id   series_id series_description0        4003253   702807833   Sagittal T2/STIR1        4003253  1054713880        Sagittal T12        4003253  2448190387           Axial T23        4646740  3201256954           Axial T24        4646740  3486248476        Sagittal T1...          ...         ...                ...6289  4287160193  1507070277   Sagittal T2/STIR6290  4287160193  1820446240           Axial T26291  4290709089  3274612423   Sagittal T2/STIR6292  4290709089  3390218084           Axial T26293  4290709089  4237840455        Sagittal T1[6294 rows x 3 columns]\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/html\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m<div><style scoped>    .dataframe tbody tr th:only-of-type \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: middle;    }    .dataframe tbody tr th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: top;    }    .dataframe thead th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        text-align: right;    }</style><table border=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m1\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m class=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mdataframe\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>  <thead>    <tr style=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mtext-align: right;\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>series_description</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>4003253</td>      <td>702807833</td>      <td>Sagittal T2/STIR</td>    </tr>    <tr>      <th>1</th>      <td>4003253</td>      <td>1054713880</td>      <td>Sagittal T1</td>    </tr>    <tr>      <th>2</th>      <td>4003253</td>      <td>2448190387</td>      <td>Axial T2</td>    </tr>    <tr>      <th>3</th>      <td>4646740</td>      <td>3201256954</td>      <td>Axial T2</td>    </tr>    <tr>      <th>4</th>      <td>4646740</td>      <td>3486248476</td>      <td>Sagittal T1</td>    </tr>    <tr>      <th>...</th>      <td>...</td>      <td>...</td>      <td>...</td>    </tr>    <tr>      <th>6289</th>      <td>4287160193</td>      <td>1507070277</td>      <td>Sagittal T2/STIR</td>    </tr>    <tr>      <th>6290</th>      <td>4287160193</td>      <td>1820446240</td>      <td>Axial T2</td>    </tr>    <tr>      <th>6291</th>      <td>4290709089</td>      <td>3274612423</td>      <td>Sagittal T2/STIR</td>    </tr>    <tr>      <th>6292</th>      <td>4290709089</td>      <td>3390218084</td>      <td>Axial T2</td>    </tr>    <tr>      <th>6293</th>      <td>4290709089</td>      <td>4237840455</td>      <td>Sagittal T1</td>    </tr>  </tbody></table><p>6294 rows × 3 columns</p></div>\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}}]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mlabel_coordinates_df\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:33.904964Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:33.905556Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:33.920506Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:33.905521Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:33.919472Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m7\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m7\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecute_result\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m         study_id   series_id  instance_number  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0         4003253   702807833                8   1         4003253   702807833                8   2         4003253   702807833                8   3         4003253   702807833                8   4         4003253   702807833                8   ...           ...         ...              ...   48687  4290709089  4237840455               11   48688  4290709089  4237840455               12   48689  4290709089  4237840455               12   48690  4290709089  4237840455               12   48691  4290709089  4237840455               12                                condition  level           x           y  0                Spinal Canal Stenosis  L1/L2  322.831858  227.964602  1                Spinal Canal Stenosis  L2/L3  320.571429  295.714286  2                Spinal Canal Stenosis  L3/L4  323.030303  371.818182  3                Spinal Canal Stenosis  L4/L5  335.292035  427.327434  4                Spinal Canal Stenosis  L5/S1  353.415929  483.964602  ...                                ...    ...         ...         ...  48687  Left Neural Foraminal Narrowing  L1/L2  219.465940   97.831063  48688  Left Neural Foraminal Narrowing  L2/L3  205.340599  140.207084  48689  Left Neural Foraminal Narrowing  L3/L4  202.724796  181.013624  48690  Left Neural Foraminal Narrowing  L4/L5  202.933333  219.733333  48691  Left Neural Foraminal Narrowing  L5/S1  211.813953  259.534884  [48692 rows x 7 columns]\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/html\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m<div><style scoped>    .dataframe tbody tr th:only-of-type \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: middle;    }    .dataframe tbody tr th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: top;    }    .dataframe thead th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        text-align: right;    }</style><table border=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m1\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m class=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mdataframe\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>  <thead>    <tr style=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mtext-align: right;\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>instance_number</th>      <th>condition</th>      <th>level</th>      <th>x</th>      <th>y</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>4003253</td>      <td>702807833</td>      <td>8</td>      <td>Spinal Canal Stenosis</td>      <td>L1/L2</td>      <td>322.831858</td>      <td>227.964602</td>    </tr>    <tr>      <th>1</th>      <td>4003253</td>      <td>702807833</td>      <td>8</td>      <td>Spinal Canal Stenosis</td>      <td>L2/L3</td>      <td>320.571429</td>      <td>295.714286</td>    </tr>    <tr>      <th>2</th>      <td>4003253</td>      <td>702807833</td>      <td>8</td>      <td>Spinal Canal Stenosis</td>      <td>L3/L4</td>      <td>323.030303</td>      <td>371.818182</td>    </tr>    <tr>      <th>3</th>      <td>4003253</td>      <td>702807833</td>      <td>8</td>      <td>Spinal Canal Stenosis</td>      <td>L4/L5</td>      <td>335.292035</td>      <td>427.327434</td>    </tr>    <tr>      <th>4</th>      <td>4003253</td>      <td>702807833</td>      <td>8</td>      <td>Spinal Canal Stenosis</td>      <td>L5/S1</td>      <td>353.415929</td>      <td>483.964602</td>    </tr>    <tr>      <th>...</th>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>    </tr>    <tr>      <th>48687</th>      <td>4290709089</td>      <td>4237840455</td>      <td>11</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L1/L2</td>      <td>219.465940</td>      <td>97.831063</td>    </tr>    <tr>      <th>48688</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L2/L3</td>      <td>205.340599</td>      <td>140.207084</td>    </tr>    <tr>      <th>48689</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L3/L4</td>      <td>202.724796</td>      <td>181.013624</td>    </tr>    <tr>      <th>48690</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L4/L5</td>      <td>202.933333</td>      <td>219.733333</td>    </tr>    <tr>      <th>48691</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L5/S1</td>      <td>211.813953</td>      <td>259.534884</td>    </tr>  </tbody></table><p>48692 rows × 7 columns</p></div>\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}}]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmerged_outer_df = pd.merge(label_coordinates_df, train_series, on=[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstudy_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseries_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m], how=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mouter\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)merged_outer_df\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:34.140737Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:34.141034Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:34.186585Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:34.141002Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:34.185627Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m8\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m8\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecute_result\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m         study_id   series_id  instance_number  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0         4003253   702807833              8.0   1         4003253   702807833              8.0   2         4003253   702807833              8.0   3         4003253   702807833              8.0   4         4003253   702807833              8.0   ...           ...         ...              ...   48690  4290709089  4237840455             11.0   48691  4290709089  4237840455             12.0   48692  4290709089  4237840455             12.0   48693  4290709089  4237840455             12.0   48694  4290709089  4237840455             12.0                                condition  level           x           y  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0                Spinal Canal Stenosis  L1/L2  322.831858  227.964602   1                Spinal Canal Stenosis  L2/L3  320.571429  295.714286   2                Spinal Canal Stenosis  L3/L4  323.030303  371.818182   3                Spinal Canal Stenosis  L4/L5  335.292035  427.327434   4                Spinal Canal Stenosis  L5/S1  353.415929  483.964602   ...                                ...    ...         ...         ...   48690  Left Neural Foraminal Narrowing  L1/L2  219.465940   97.831063   48691  Left Neural Foraminal Narrowing  L2/L3  205.340599  140.207084   48692  Left Neural Foraminal Narrowing  L3/L4  202.724796  181.013624   48693  Left Neural Foraminal Narrowing  L4/L5  202.933333  219.733333   48694  Left Neural Foraminal Narrowing  L5/S1  211.813953  259.534884         series_description  0       Sagittal T2/STIR  1       Sagittal T2/STIR  2       Sagittal T2/STIR  3       Sagittal T2/STIR  4       Sagittal T2/STIR  ...                  ...  48690        Sagittal T1  48691        Sagittal T1  48692        Sagittal T1  48693        Sagittal T1  48694        Sagittal T1  [48695 rows x 8 columns]\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/html\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m<div><style scoped>    .dataframe tbody tr th:only-of-type \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: middle;    }    .dataframe tbody tr th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: top;    }    .dataframe thead th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        text-align: right;    }</style><table border=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m1\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m class=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mdataframe\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>  <thead>    <tr style=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mtext-align: right;\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>instance_number</th>      <th>condition</th>      <th>level</th>      <th>x</th>      <th>y</th>      <th>series_description</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L1/L2</td>      <td>322.831858</td>      <td>227.964602</td>      <td>Sagittal T2/STIR</td>    </tr>    <tr>      <th>1</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L2/L3</td>      <td>320.571429</td>      <td>295.714286</td>      <td>Sagittal T2/STIR</td>    </tr>    <tr>      <th>2</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L3/L4</td>      <td>323.030303</td>      <td>371.818182</td>      <td>Sagittal T2/STIR</td>    </tr>    <tr>      <th>3</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L4/L5</td>      <td>335.292035</td>      <td>427.327434</td>      <td>Sagittal T2/STIR</td>    </tr>    <tr>      <th>4</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L5/S1</td>      <td>353.415929</td>      <td>483.964602</td>      <td>Sagittal T2/STIR</td>    </tr>    <tr>      <th>...</th>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>    </tr>    <tr>      <th>48690</th>      <td>4290709089</td>      <td>4237840455</td>      <td>11.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L1/L2</td>      <td>219.465940</td>      <td>97.831063</td>      <td>Sagittal T1</td>    </tr>    <tr>      <th>48691</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L2/L3</td>      <td>205.340599</td>      <td>140.207084</td>      <td>Sagittal T1</td>    </tr>    <tr>      <th>48692</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L3/L4</td>      <td>202.724796</td>      <td>181.013624</td>      <td>Sagittal T1</td>    </tr>    <tr>      <th>48693</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L4/L5</td>      <td>202.933333</td>      <td>219.733333</td>      <td>Sagittal T1</td>    </tr>    <tr>      <th>48694</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L5/S1</td>      <td>211.813953</td>      <td>259.534884</td>      <td>Sagittal T1</td>    </tr>  </tbody></table><p>48695 rows × 8 columns</p></div>\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}}]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmain_path = \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdef generate_filepath(row):    if pd.notna(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstudy_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]) and pd.notna(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseries_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]) and pd.notna(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minstance_number\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]):        file_path = f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;132;01m{main_path}\u001b[39;00m\u001b[38;5;124m/\u001b[39m\u001b[38;5;132;01m{row['study_id']}\u001b[39;00m\u001b[38;5;124m/\u001b[39m\u001b[38;5;132;01m{row['series_id']}\u001b[39;00m\u001b[38;5;124m/\u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mint(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minstance_number\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m])}.dcm\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m        return file_path if os.path.exists(file_path) else None    return Nonemerged_outer_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] = merged_outer_df.progress_apply(generate_filepath, axis=1)merged_outer_df\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:34.408000Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:34.408338Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:01.675877Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:51:34.408305Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:01.674919Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m9\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdisplay_data\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m  0\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124m|          | 0/48695 [00:00<?, ?it/s]\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mapplication/vnd.jupyter.widget-view+json\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mversion_major\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m2\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mversion_minor\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m0\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmodel_id\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mf2a472a513b3406b95af154064d09698\u001b[39m\u001b[38;5;124m\"\u001b[39m}},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m9\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecute_result\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m         study_id   series_id  instance_number  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0         4003253   702807833              8.0   1         4003253   702807833              8.0   2         4003253   702807833              8.0   3         4003253   702807833              8.0   4         4003253   702807833              8.0   ...           ...         ...              ...   48690  4290709089  4237840455             11.0   48691  4290709089  4237840455             12.0   48692  4290709089  4237840455             12.0   48693  4290709089  4237840455             12.0   48694  4290709089  4237840455             12.0                                condition  level           x           y  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0                Spinal Canal Stenosis  L1/L2  322.831858  227.964602   1                Spinal Canal Stenosis  L2/L3  320.571429  295.714286   2                Spinal Canal Stenosis  L3/L4  323.030303  371.818182   3                Spinal Canal Stenosis  L4/L5  335.292035  427.327434   4                Spinal Canal Stenosis  L5/S1  353.415929  483.964602   ...                                ...    ...         ...         ...   48690  Left Neural Foraminal Narrowing  L1/L2  219.465940   97.831063   48691  Left Neural Foraminal Narrowing  L2/L3  205.340599  140.207084   48692  Left Neural Foraminal Narrowing  L3/L4  202.724796  181.013624   48693  Left Neural Foraminal Narrowing  L4/L5  202.933333  219.733333   48694  Left Neural Foraminal Narrowing  L5/S1  211.813953  259.534884         series_description                                           filepath  0       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  1       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  2       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  3       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  4       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  ...                  ...                                                ...  48690        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  48691        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  48692        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  48693        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  48694        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  [48695 rows x 9 columns]\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/html\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m<div><style scoped>    .dataframe tbody tr th:only-of-type \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: middle;    }    .dataframe tbody tr th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: top;    }    .dataframe thead th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        text-align: right;    }</style><table border=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m1\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m class=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mdataframe\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>  <thead>    <tr style=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mtext-align: right;\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>instance_number</th>      <th>condition</th>      <th>level</th>      <th>x</th>      <th>y</th>      <th>series_description</th>      <th>filepath</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L1/L2</td>      <td>322.831858</td>      <td>227.964602</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>1</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L2/L3</td>      <td>320.571429</td>      <td>295.714286</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>2</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L3/L4</td>      <td>323.030303</td>      <td>371.818182</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>3</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L4/L5</td>      <td>335.292035</td>      <td>427.327434</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>4</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L5/S1</td>      <td>353.415929</td>      <td>483.964602</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>...</th>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>    </tr>    <tr>      <th>48690</th>      <td>4290709089</td>      <td>4237840455</td>      <td>11.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L1/L2</td>      <td>219.465940</td>      <td>97.831063</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>48691</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L2/L3</td>      <td>205.340599</td>      <td>140.207084</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>48692</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L3/L4</td>      <td>202.724796</td>      <td>181.013624</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>48693</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L4/L5</td>      <td>202.933333</td>      <td>219.733333</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>48694</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L5/S1</td>      <td>211.813953</td>      <td>259.534884</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>  </tbody></table><p>48695 rows × 9 columns</p></div>\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}}]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnan_rows = merged_outer_df[merged_outer_df.isna().any(axis=1)]print(\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m\\\u001b[39m\u001b[38;5;124mRows with NaN values in merged_outer_df:\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)nan_rows#The study-id 3008676218 doesn\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt have an samples in the trainnig data and there are labels and some of nan #let\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms just drop it# for the other case no data for these series id but it have other data that can complete the predictions\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:01.713622Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:01.713907Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:01.747619Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:01.713875Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:01.746738Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m11\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstdout\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mRows with NaN values in merged_outer_df:\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstream\u001b[39m\u001b[38;5;124m\"\u001b[39m},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m11\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecute_result\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m         study_id   series_id  instance_number condition level   x   y  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m33978  3008676218   542282425              NaN       NaN   NaN NaN NaN   33979  3008676218  3636216534              NaN       NaN   NaN NaN NaN   41256  3637444890  3892989905              NaN       NaN   NaN NaN NaN         series_description filepath  33978        Sagittal T1     None  33979           Axial T2     None  41256   Sagittal T2/STIR     None  \u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/html\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m<div><style scoped>    .dataframe tbody tr th:only-of-type \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: middle;    }    .dataframe tbody tr th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: top;    }    .dataframe thead th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        text-align: right;    }</style><table border=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m1\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m class=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mdataframe\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>  <thead>    <tr style=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mtext-align: right;\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>instance_number</th>      <th>condition</th>      <th>level</th>      <th>x</th>      <th>y</th>      <th>series_description</th>      <th>filepath</th>    </tr>  </thead>  <tbody>    <tr>      <th>33978</th>      <td>3008676218</td>      <td>542282425</td>      <td>NaN</td>      <td>NaN</td>      <td>NaN</td>      <td>NaN</td>      <td>NaN</td>      <td>Sagittal T1</td>      <td>None</td>    </tr>    <tr>      <th>33979</th>      <td>3008676218</td>      <td>3636216534</td>      <td>NaN</td>      <td>NaN</td>      <td>NaN</td>      <td>NaN</td>      <td>NaN</td>      <td>Axial T2</td>      <td>None</td>    </tr>    <tr>      <th>41256</th>      <td>3637444890</td>      <td>3892989905</td>      <td>NaN</td>      <td>NaN</td>      <td>NaN</td>      <td>NaN</td>      <td>NaN</td>      <td>Sagittal T2/STIR</td>      <td>None</td>    </tr>  </tbody></table></div>\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}}]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmerged_outer_df = merged_outer_df.dropna()merged_outer_df\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:01.749913Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:01.750697Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:01.788342Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:01.750651Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:01.787548Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m12\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m12\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecute_result\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m         study_id   series_id  instance_number  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0         4003253   702807833              8.0   1         4003253   702807833              8.0   2         4003253   702807833              8.0   3         4003253   702807833              8.0   4         4003253   702807833              8.0   ...           ...         ...              ...   48690  4290709089  4237840455             11.0   48691  4290709089  4237840455             12.0   48692  4290709089  4237840455             12.0   48693  4290709089  4237840455             12.0   48694  4290709089  4237840455             12.0                                condition  level           x           y  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0                Spinal Canal Stenosis  L1/L2  322.831858  227.964602   1                Spinal Canal Stenosis  L2/L3  320.571429  295.714286   2                Spinal Canal Stenosis  L3/L4  323.030303  371.818182   3                Spinal Canal Stenosis  L4/L5  335.292035  427.327434   4                Spinal Canal Stenosis  L5/S1  353.415929  483.964602   ...                                ...    ...         ...         ...   48690  Left Neural Foraminal Narrowing  L1/L2  219.465940   97.831063   48691  Left Neural Foraminal Narrowing  L2/L3  205.340599  140.207084   48692  Left Neural Foraminal Narrowing  L3/L4  202.724796  181.013624   48693  Left Neural Foraminal Narrowing  L4/L5  202.933333  219.733333   48694  Left Neural Foraminal Narrowing  L5/S1  211.813953  259.534884         series_description                                           filepath  0       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  1       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  2       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  3       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  4       Sagittal T2/STIR  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  ...                  ...                                                ...  48690        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  48691        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  48692        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  48693        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  48694        Sagittal T1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  [48692 rows x 9 columns]\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/html\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m<div><style scoped>    .dataframe tbody tr th:only-of-type \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: middle;    }    .dataframe tbody tr th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: top;    }    .dataframe thead th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        text-align: right;    }</style><table border=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m1\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m class=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mdataframe\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>  <thead>    <tr style=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mtext-align: right;\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>instance_number</th>      <th>condition</th>      <th>level</th>      <th>x</th>      <th>y</th>      <th>series_description</th>      <th>filepath</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L1/L2</td>      <td>322.831858</td>      <td>227.964602</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>1</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L2/L3</td>      <td>320.571429</td>      <td>295.714286</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>2</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L3/L4</td>      <td>323.030303</td>      <td>371.818182</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>3</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L4/L5</td>      <td>335.292035</td>      <td>427.327434</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>4</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L5/S1</td>      <td>353.415929</td>      <td>483.964602</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>...</th>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>    </tr>    <tr>      <th>48690</th>      <td>4290709089</td>      <td>4237840455</td>      <td>11.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L1/L2</td>      <td>219.465940</td>      <td>97.831063</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>48691</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L2/L3</td>      <td>205.340599</td>      <td>140.207084</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>48692</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L3/L4</td>      <td>202.724796</td>      <td>181.013624</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>48693</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L4/L5</td>      <td>202.933333</td>      <td>219.733333</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>    <tr>      <th>48694</th>      <td>4290709089</td>      <td>4237840455</td>      <td>12.0</td>      <td>Left Neural Foraminal Narrowing</td>      <td>L5/S1</td>      <td>211.813953</td>      <td>259.534884</td>      <td>Sagittal T1</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>    </tr>  </tbody></table><p>48692 rows × 9 columns</p></div>\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}}]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnan_rows = df_train[df_train.isna().any(axis=1)]print(\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m\\\u001b[39m\u001b[38;5;124mRows with NaN values in merged_outer_df:\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)display(nan_rows)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:01.789241Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:01.789500Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:01.822100Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:01.789472Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:01.821291Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m13\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstdout\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mRows with NaN values in merged_outer_df:\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstream\u001b[39m\u001b[38;5;124m\"\u001b[39m},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdisplay_data\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m        study_id spinal_canal_stenosis_l1_l2 spinal_canal_stenosis_l2_l3  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m16      46494080                 Normal/Mild                 Normal/Mild   24      64092030                 Normal/Mild                 Normal/Mild   30      74782131                 Normal/Mild                 Normal/Mild   43      97086905                 Normal/Mild                 Normal/Mild   73     159721286                 Normal/Mild                 Normal/Mild   ...          ...                         ...                         ...   1905  4140710202                 Normal/Mild                 Normal/Mild   1911  4146959702                 Normal/Mild                 Normal/Mild   1925  4175603528                 Normal/Mild                 Normal/Mild   1950  4232806580                 Normal/Mild                 Normal/Mild   1958  4255570773                 Normal/Mild                 Normal/Mild        spinal_canal_stenosis_l3_l4 spinal_canal_stenosis_l4_l5  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m16                      Moderate                 Normal/Mild   24                   Normal/Mild                 Normal/Mild   30                   Normal/Mild                 Normal/Mild   43                   Normal/Mild                 Normal/Mild   73                   Normal/Mild                    Moderate   ...                          ...                         ...   1905                 Normal/Mild                 Normal/Mild   1911                 Normal/Mild                 Normal/Mild   1925                 Normal/Mild                 Normal/Mild   1950                 Normal/Mild                 Normal/Mild   1958                 Normal/Mild                 Normal/Mild        spinal_canal_stenosis_l5_s1 left_neural_foraminal_narrowing_l1_l2  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m16                   Normal/Mild                           Normal/Mild   24                   Normal/Mild                           Normal/Mild   30                   Normal/Mild                           Normal/Mild   43                   Normal/Mild                           Normal/Mild   73                   Normal/Mild                           Normal/Mild   ...                          ...                                   ...   1905                 Normal/Mild                           Normal/Mild   1911                 Normal/Mild                           Normal/Mild   1925                 Normal/Mild                           Normal/Mild   1950                 Normal/Mild                           Normal/Mild   1958                 Normal/Mild                           Normal/Mild        left_neural_foraminal_narrowing_l2_l3  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m16                             Normal/Mild   24                             Normal/Mild   30                             Normal/Mild   43                             Normal/Mild   73                             Normal/Mild   ...                                    ...   1905                           Normal/Mild   1911                           Normal/Mild   1925                           Normal/Mild   1950                           Normal/Mild   1958                           Normal/Mild        left_neural_foraminal_narrowing_l3_l4  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m16                             Normal/Mild   24                             Normal/Mild   30                             Normal/Mild   43                                Moderate   73                                Moderate   ...                                    ...   1905                           Normal/Mild   1911                           Normal/Mild   1925                           Normal/Mild   1950                           Normal/Mild   1958                           Normal/Mild        left_neural_foraminal_narrowing_l4_l5  ...  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m16                             Normal/Mild  ...   24                                Moderate  ...   30                             Normal/Mild  ...   43                             Normal/Mild  ...   73                                Moderate  ...   ...                                    ...  ...   1905                              Moderate  ...   1911                           Normal/Mild  ...   1925                           Normal/Mild  ...   1950                           Normal/Mild  ...   1958                           Normal/Mild  ...        left_subarticular_stenosis_l1_l2 left_subarticular_stenosis_l2_l3  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m16                                NaN                              NaN   24                                NaN                      Normal/Mild   30                                NaN                      Normal/Mild   43                                NaN                      Normal/Mild   73                                NaN                              NaN   ...                               ...                              ...   1905                              NaN                      Normal/Mild   1911                              NaN                      Normal/Mild   1925                              NaN                      Normal/Mild   1950                              NaN                              NaN   1958                              NaN                      Normal/Mild        left_subarticular_stenosis_l3_l4 left_subarticular_stenosis_l4_l5  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m16                        Normal/Mild                         Moderate   24                                NaN                         Moderate   30                        Normal/Mild                      Normal/Mild   43                        Normal/Mild                         Moderate   73                        Normal/Mild                         Moderate   ...                               ...                              ...   1905                      Normal/Mild                         Moderate   1911                      Normal/Mild                      Normal/Mild   1925                      Normal/Mild                      Normal/Mild   1950                         Moderate                         Moderate   1958                      Normal/Mild                      Normal/Mild        left_subarticular_stenosis_l5_s1 right_subarticular_stenosis_l1_l2  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m16                           Moderate                               NaN   24                           Moderate                               NaN   30                        Normal/Mild                               NaN   43                        Normal/Mild                               NaN   73                        Normal/Mild                               NaN   ...                               ...                               ...   1905                      Normal/Mild                               NaN   1911                      Normal/Mild                               NaN   1925                      Normal/Mild                               NaN   1950                         Moderate                               NaN   1958                      Normal/Mild                               NaN        right_subarticular_stenosis_l2_l3 right_subarticular_stenosis_l3_l4  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m16                                 NaN                          Moderate   24                            Moderate                               NaN   30                         Normal/Mild                       Normal/Mild   43                         Normal/Mild                       Normal/Mild   73                                 NaN                          Moderate   ...                                ...                               ...   1905                       Normal/Mild                       Normal/Mild   1911                       Normal/Mild                       Normal/Mild   1925                       Normal/Mild                       Normal/Mild   1950                               NaN                       Normal/Mild   1958                       Normal/Mild                       Normal/Mild        right_subarticular_stenosis_l4_l5 right_subarticular_stenosis_l5_s1  16                            Moderate                       Normal/Mild  24                         Normal/Mild                       Normal/Mild  30                         Normal/Mild                       Normal/Mild  43                            Moderate                       Normal/Mild  73                              Severe                       Normal/Mild  ...                                ...                               ...  1905                       Normal/Mild                       Normal/Mild  1911                       Normal/Mild                       Normal/Mild  1925                       Normal/Mild                       Normal/Mild  1950                          Moderate                       Normal/Mild  1958                       Normal/Mild                       Normal/Mild  [185 rows x 26 columns]\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/html\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m<div><style scoped>    .dataframe tbody tr th:only-of-type \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: middle;    }    .dataframe tbody tr th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: top;    }    .dataframe thead th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        text-align: right;    }</style><table border=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m1\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m class=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mdataframe\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>  <thead>    <tr style=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mtext-align: right;\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>      <th></th>      <th>study_id</th>      <th>spinal_canal_stenosis_l1_l2</th>      <th>spinal_canal_stenosis_l2_l3</th>      <th>spinal_canal_stenosis_l3_l4</th>      <th>spinal_canal_stenosis_l4_l5</th>      <th>spinal_canal_stenosis_l5_s1</th>      <th>left_neural_foraminal_narrowing_l1_l2</th>      <th>left_neural_foraminal_narrowing_l2_l3</th>      <th>left_neural_foraminal_narrowing_l3_l4</th>      <th>left_neural_foraminal_narrowing_l4_l5</th>      <th>...</th>      <th>left_subarticular_stenosis_l1_l2</th>      <th>left_subarticular_stenosis_l2_l3</th>      <th>left_subarticular_stenosis_l3_l4</th>      <th>left_subarticular_stenosis_l4_l5</th>      <th>left_subarticular_stenosis_l5_s1</th>      <th>right_subarticular_stenosis_l1_l2</th>      <th>right_subarticular_stenosis_l2_l3</th>      <th>right_subarticular_stenosis_l3_l4</th>      <th>right_subarticular_stenosis_l4_l5</th>      <th>right_subarticular_stenosis_l5_s1</th>    </tr>  </thead>  <tbody>    <tr>      <th>16</th>      <td>46494080</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>...</td>      <td>NaN</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Moderate</td>      <td>NaN</td>      <td>NaN</td>      <td>Moderate</td>      <td>Moderate</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>24</th>      <td>64092030</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>...</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>NaN</td>      <td>Moderate</td>      <td>Moderate</td>      <td>NaN</td>      <td>Moderate</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>30</th>      <td>74782131</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>...</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>43</th>      <td>97086905</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Normal/Mild</td>      <td>...</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Normal/Mild</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>73</th>      <td>159721286</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Moderate</td>      <td>...</td>      <td>NaN</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Normal/Mild</td>      <td>NaN</td>      <td>NaN</td>      <td>Moderate</td>      <td>Severe</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>...</th>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>    </tr>    <tr>      <th>1905</th>      <td>4140710202</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>...</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Normal/Mild</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>1911</th>      <td>4146959702</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>...</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>1925</th>      <td>4175603528</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>...</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>1950</th>      <td>4232806580</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>...</td>      <td>NaN</td>      <td>NaN</td>      <td>Moderate</td>      <td>Moderate</td>      <td>Moderate</td>      <td>NaN</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Moderate</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>1958</th>      <td>4255570773</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>...</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>NaN</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>      <td>Normal/Mild</td>    </tr>  </tbody></table><p>185 rows × 26 columns</p></div>\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}}]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdef get_severity_column(condition, level):    # Convert the condition and level to match the column names in df_train    condition_formatted = condition.lower().replace(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    level_formatted = level.lower().replace(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m/\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    return f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;132;01m{condition_formatted}\u001b[39;00m\u001b[38;5;124m_\u001b[39m\u001b[38;5;132;01m{level_formatted}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m# Add a new \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m column to merged_outer_dfdef map_severity(row):    # Get the severity column name for the row    severity_column = get_severity_column(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m], row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m])    # Fetch the severity value from df_train using study_id    severity_value = df_train.loc[df_train[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstudy_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] == row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstudy_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m], severity_column]    # Return the severity value if available, otherwise return None    return severity_value.values[0] if not severity_value.empty else None# Apply the mapping function to each row in merged_outer_dfmerged_outer_df.loc[:, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] = merged_outer_df.progress_apply(map_severity, axis=1)# Display the updated DataFrameprint(\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mMerged DataFrame with Severity:\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)merged_outer_df.head()\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:36.080865Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:36.081249Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:54.102834Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:36.081213Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:54.101921Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m14\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdisplay_data\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m  0\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124m|          | 0/48692 [00:00<?, ?it/s]\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mapplication/vnd.jupyter.widget-view+json\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mversion_major\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m2\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mversion_minor\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m0\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmodel_id\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m7a53f2b9b51c46718433f835cff76236\u001b[39m\u001b[38;5;124m\"\u001b[39m}},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstdout\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mMerged DataFrame with Severity:\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstream\u001b[39m\u001b[38;5;124m\"\u001b[39m},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstderr\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/tmp/ipykernel_30/2475733211.py:17: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.Try using .loc[row_indexer,col_indexer] = value insteadSee the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy  merged_outer_df.loc[:, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] = merged_outer_df.progress_apply(map_severity, axis=1)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstream\u001b[39m\u001b[38;5;124m\"\u001b[39m},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m14\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecute_result\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m   study_id  series_id  instance_number              condition  level  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0   4003253  702807833              8.0  Spinal Canal Stenosis  L1/L2   1   4003253  702807833              8.0  Spinal Canal Stenosis  L2/L3   2   4003253  702807833              8.0  Spinal Canal Stenosis  L3/L4   3   4003253  702807833              8.0  Spinal Canal Stenosis  L4/L5   4   4003253  702807833              8.0  Spinal Canal Stenosis  L5/S1               x           y series_description  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0  322.831858  227.964602   Sagittal T2/STIR   1  320.571429  295.714286   Sagittal T2/STIR   2  323.030303  371.818182   Sagittal T2/STIR   3  335.292035  427.327434   Sagittal T2/STIR   4  353.415929  483.964602   Sagittal T2/STIR                                               filepath     severity  0  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  Normal/Mild  1  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  Normal/Mild  2  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  Normal/Mild  3  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  Normal/Mild  4  /kaggle/input/rsna-2024-lumbar-spine-degenerat...  Normal/Mild  \u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/html\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m<div><style scoped>    .dataframe tbody tr th:only-of-type \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: middle;    }    .dataframe tbody tr th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: top;    }    .dataframe thead th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        text-align: right;    }</style><table border=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m1\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m class=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mdataframe\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>  <thead>    <tr style=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mtext-align: right;\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>instance_number</th>      <th>condition</th>      <th>level</th>      <th>x</th>      <th>y</th>      <th>series_description</th>      <th>filepath</th>      <th>severity</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L1/L2</td>      <td>322.831858</td>      <td>227.964602</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>1</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L2/L3</td>      <td>320.571429</td>      <td>295.714286</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>2</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L3/L4</td>      <td>323.030303</td>      <td>371.818182</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>3</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L4/L5</td>      <td>335.292035</td>      <td>427.327434</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>      <td>Normal/Mild</td>    </tr>    <tr>      <th>4</th>      <td>4003253</td>      <td>702807833</td>      <td>8.0</td>      <td>Spinal Canal Stenosis</td>      <td>L5/S1</td>      <td>353.415929</td>      <td>483.964602</td>      <td>Sagittal T2/STIR</td>      <td>/kaggle/input/rsna-2024-lumbar-spine-degenerat...</td>      <td>Normal/Mild</td>    </tr>  </tbody></table></div>\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}}]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmerged_outer_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].unique()\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:54.104331Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:54.104678Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:54.116031Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:54.104645Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:53:54.115212Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m15\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m15\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecute_result\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124marray([\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mNormal/Mild\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mModerate\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSevere\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, nan], dtype=object)\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}}]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m# Group by \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstudy_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseries_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, and \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseries_description\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m and aggregate the columns into listsgrouped_df = merged_outer_df.groupby([\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstudy_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseries_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseries_description\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]).agg(\u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minstance_number\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: lambda x: list(x),    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: lambda x: list(x),    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: lambda x: list(x),    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: lambda x: list(x),    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: lambda x: list(x),    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: lambda x: list(x),    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: lambda x: list(x)}).reset_index()grouped_df\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:00.227068Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:00.227708Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:01.482381Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:00.227664Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:01.481484Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m16\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m16\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecute_result\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m        study_id   series_id series_description  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0        4003253   702807833   Sagittal T2/STIR   1        4003253  1054713880        Sagittal T1   2        4003253  2448190387           Axial T2   3        4646740  3201256954           Axial T2   4        4646740  3486248476        Sagittal T1   ...          ...         ...                ...   6286  4287160193  1507070277   Sagittal T2/STIR   6287  4287160193  1820446240           Axial T2   6288  4290709089  3274612423   Sagittal T2/STIR   6289  4290709089  3390218084           Axial T2   6290  4290709089  4237840455        Sagittal T1                                           instance_number  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0                             [8.0, 8.0, 8.0, 8.0, 8.0]   1     [4.0, 4.0, 5.0, 6.0, 6.0, 11.0, 11.0, 11.0, 12...   2     [3.0, 4.0, 11.0, 11.0, 19.0, 19.0, 28.0, 28.0,...   3     [15.0, 16.0, 22.0, 22.0, 28.0, 29.0, 34.0, 34....   4     [5.0, 5.0, 5.0, 6.0, 7.0, 15.0, 15.0, 16.0, 17...   ...                                                 ...   6286                          [8.0, 8.0, 8.0, 8.0, 8.0]   6287  [4.0, 4.0, 9.0, 10.0, 16.0, 16.0, 22.0, 22.0, ...   6288                          [9.0, 9.0, 9.0, 9.0, 9.0]   6289  [2.0, 3.0, 5.0, 6.0, 10.0, 10.0, 15.0, 15.0, 2...   6290  [4.0, 4.0, 4.0, 4.0, 5.0, 11.0, 12.0, 12.0, 12...                                                 condition  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0     [Spinal Canal Stenosis, Spinal Canal Stenosis,...   1     [Right Neural Foraminal Narrowing, Right Neura...   2     [Left Subarticular Stenosis, Right Subarticula...   3     [Right Subarticular Stenosis, Left Subarticula...   4     [Left Neural Foraminal Narrowing, Left Neural ...   ...                                                 ...   6286  [Spinal Canal Stenosis, Spinal Canal Stenosis,...   6287  [Left Subarticular Stenosis, Right Subarticula...   6288  [Spinal Canal Stenosis, Spinal Canal Stenosis,...   6289  [Right Subarticular Stenosis, Left Subarticula...   6290  [Right Neural Foraminal Narrowing, Right Neura...                                                     level  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0                   [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   1     [L4/L5, L5/S1, L3/L4, L1/L2, L2/L3, L1/L2, L4/...   2     [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   3     [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   4     [L2/L3, L3/L4, L4/L5, L1/L2, L5/S1, L2/L3, L3/...   ...                                                 ...   6286                [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   6287  [L5/S1, L5/S1, L4/L5, L4/L5, L3/L4, L3/L4, L2/...   6288                [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   6289  [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   6290  [L2/L3, L3/L4, L4/L5, L5/S1, L1/L2, L1/L2, L2/...                                                         x  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0     [322.83185840707966, 320.57142857142856, 323.0...   1     [187.96175908221795, 198.2409177820268, 187.22...   2     [179.12644787644788, 145.28877148997134, 180.9...   3     [184.18099547511312, 235.3170731707317, 235.31...   4     [234.09931142986449, 227.5139455762059, 225.63...   ...                                                 ...   6286  [391.2351904090268, 369.4354724964739, 373.587...   6287  [145.7037037037037, 112.16991150442476, 143.92...   6288  [181.66894664842684, 174.22708618331055, 174.2...   6289  [307.18084360986546, 352.53169907016064, 349.2...   6290  [208.10679881880364, 204.195638510915, 208.381...                                                         y  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0     [227.9646017699115, 295.7142857142857, 371.818...   1     [251.83938814531547, 285.6137667304015, 210.72...   2     [161.23552123552125, 158.6246418338109, 158.76...   3     [263.23981900452486, 264.08362369337976, 254.7...   4     [196.620230591671, 256.8292898251205, 308.5714...   ...                                                 ...   6286  [235.6445698166432, 321.80535966149506, 391.35...   6287  [143.40740740740742, 143.34159292035395, 136.2...   6288  [88.86456908344734, 125.19835841313272, 160.65...   6289  [354.8699595361547, 358.1403212172443, 366.796...   6290  [140.20340382070157, 182.79159383993365, 222.9...                                                  filepath  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   1     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   2     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   3     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   4     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   ...                                                 ...   6286  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   6287  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   6288  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   6289  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   6290  [/kaggle/input/rsna-2024-lumbar-spine-degenera...                                                  severity  0     [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  1     [Moderate, Normal/Mild, Moderate, Normal/Mild,...  2     [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  3     [Normal/Mild, Normal/Mild, Normal/Mild, Modera...  4     [Normal/Mild, Normal/Mild, Moderate, Normal/Mi...  ...                                                 ...  6286  [Normal/Mild, Moderate, Normal/Mild, Normal/Mi...  6287  [Normal/Mild, Normal/Mild, Moderate, Moderate,...  6288  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  6289  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  6290  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  [6291 rows x 10 columns]\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/html\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m<div><style scoped>    .dataframe tbody tr th:only-of-type \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: middle;    }    .dataframe tbody tr th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: top;    }    .dataframe thead th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        text-align: right;    }</style><table border=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m1\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m class=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mdataframe\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>  <thead>    <tr style=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mtext-align: right;\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>series_description</th>      <th>instance_number</th>      <th>condition</th>      <th>level</th>      <th>x</th>      <th>y</th>      <th>filepath</th>      <th>severity</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>4003253</td>      <td>702807833</td>      <td>Sagittal T2/STIR</td>      <td>[8.0, 8.0, 8.0, 8.0, 8.0]</td>      <td>[Spinal Canal Stenosis, Spinal Canal Stenosis,...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]</td>      <td>[322.83185840707966, 320.57142857142856, 323.0...</td>      <td>[227.9646017699115, 295.7142857142857, 371.818...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>1</th>      <td>4003253</td>      <td>1054713880</td>      <td>Sagittal T1</td>      <td>[4.0, 4.0, 5.0, 6.0, 6.0, 11.0, 11.0, 11.0, 12...</td>      <td>[Right Neural Foraminal Narrowing, Right Neura...</td>      <td>[L4/L5, L5/S1, L3/L4, L1/L2, L2/L3, L1/L2, L4/...</td>      <td>[187.96175908221795, 198.2409177820268, 187.22...</td>      <td>[251.83938814531547, 285.6137667304015, 210.72...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Moderate, Normal/Mild, Moderate, Normal/Mild,...</td>    </tr>    <tr>      <th>2</th>      <td>4003253</td>      <td>2448190387</td>      <td>Axial T2</td>      <td>[3.0, 4.0, 11.0, 11.0, 19.0, 19.0, 28.0, 28.0,...</td>      <td>[Left Subarticular Stenosis, Right Subarticula...</td>      <td>[L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...</td>      <td>[179.12644787644788, 145.28877148997134, 180.9...</td>      <td>[161.23552123552125, 158.6246418338109, 158.76...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>3</th>      <td>4646740</td>      <td>3201256954</td>      <td>Axial T2</td>      <td>[15.0, 16.0, 22.0, 22.0, 28.0, 29.0, 34.0, 34....</td>      <td>[Right Subarticular Stenosis, Left Subarticula...</td>      <td>[L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...</td>      <td>[184.18099547511312, 235.3170731707317, 235.31...</td>      <td>[263.23981900452486, 264.08362369337976, 254.7...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Modera...</td>    </tr>    <tr>      <th>4</th>      <td>4646740</td>      <td>3486248476</td>      <td>Sagittal T1</td>      <td>[5.0, 5.0, 5.0, 6.0, 7.0, 15.0, 15.0, 16.0, 17...</td>      <td>[Left Neural Foraminal Narrowing, Left Neural ...</td>      <td>[L2/L3, L3/L4, L4/L5, L1/L2, L5/S1, L2/L3, L3/...</td>      <td>[234.09931142986449, 227.5139455762059, 225.63...</td>      <td>[196.620230591671, 256.8292898251205, 308.5714...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Moderate, Normal/Mi...</td>    </tr>    <tr>      <th>...</th>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>    </tr>    <tr>      <th>6286</th>      <td>4287160193</td>      <td>1507070277</td>      <td>Sagittal T2/STIR</td>      <td>[8.0, 8.0, 8.0, 8.0, 8.0]</td>      <td>[Spinal Canal Stenosis, Spinal Canal Stenosis,...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]</td>      <td>[391.2351904090268, 369.4354724964739, 373.587...</td>      <td>[235.6445698166432, 321.80535966149506, 391.35...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Moderate, Normal/Mild, Normal/Mi...</td>    </tr>    <tr>      <th>6287</th>      <td>4287160193</td>      <td>1820446240</td>      <td>Axial T2</td>      <td>[4.0, 4.0, 9.0, 10.0, 16.0, 16.0, 22.0, 22.0, ...</td>      <td>[Left Subarticular Stenosis, Right Subarticula...</td>      <td>[L5/S1, L5/S1, L4/L5, L4/L5, L3/L4, L3/L4, L2/...</td>      <td>[145.7037037037037, 112.16991150442476, 143.92...</td>      <td>[143.40740740740742, 143.34159292035395, 136.2...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Moderate, Moderate,...</td>    </tr>    <tr>      <th>6288</th>      <td>4290709089</td>      <td>3274612423</td>      <td>Sagittal T2/STIR</td>      <td>[9.0, 9.0, 9.0, 9.0, 9.0]</td>      <td>[Spinal Canal Stenosis, Spinal Canal Stenosis,...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]</td>      <td>[181.66894664842684, 174.22708618331055, 174.2...</td>      <td>[88.86456908344734, 125.19835841313272, 160.65...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>6289</th>      <td>4290709089</td>      <td>3390218084</td>      <td>Axial T2</td>      <td>[2.0, 3.0, 5.0, 6.0, 10.0, 10.0, 15.0, 15.0, 2...</td>      <td>[Right Subarticular Stenosis, Left Subarticula...</td>      <td>[L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...</td>      <td>[307.18084360986546, 352.53169907016064, 349.2...</td>      <td>[354.8699595361547, 358.1403212172443, 366.796...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>6290</th>      <td>4290709089</td>      <td>4237840455</td>      <td>Sagittal T1</td>      <td>[4.0, 4.0, 4.0, 4.0, 5.0, 11.0, 12.0, 12.0, 12...</td>      <td>[Right Neural Foraminal Narrowing, Right Neura...</td>      <td>[L2/L3, L3/L4, L4/L5, L5/S1, L1/L2, L1/L2, L2/...</td>      <td>[208.10679881880364, 204.195638510915, 208.381...</td>      <td>[140.20340382070157, 182.79159383993365, 222.9...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>  </tbody></table><p>6291 rows × 10 columns</p></div>\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}}]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmarkdown\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSo that means not all series have heir data available let\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms clean the merged dataframe then\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcolumns_with_lists = [\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minstance_number\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]def clean_nan_in_lists(row):    for col in columns_with_lists:        if isinstance(row[col], list):            row[col] = [item for item in row[col] if pd.notna(item)]            if not row[col]:                row[col] = None    return row# Apply the cleaning function to each rowcleaned_grouped_df = grouped_df.apply(clean_nan_in_lists, axis=1)# Remove rows where any column has become None (if required)cleaned_grouped_df = cleaned_grouped_df.dropna(subset=columns_with_lists, how=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124many\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)# Display the cleaned DataFrameprint(\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mCleaned DataFrame:\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)cleaned_grouped_df\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:09.097309Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:09.097946Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:11.053823Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:09.097902Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:11.052919Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m17\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstdout\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCleaned DataFrame:\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstream\u001b[39m\u001b[38;5;124m\"\u001b[39m},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m17\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecute_result\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m        study_id   series_id series_description  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0        4003253   702807833   Sagittal T2/STIR   1        4003253  1054713880        Sagittal T1   2        4003253  2448190387           Axial T2   3        4646740  3201256954           Axial T2   4        4646740  3486248476        Sagittal T1   ...          ...         ...                ...   6286  4287160193  1507070277   Sagittal T2/STIR   6287  4287160193  1820446240           Axial T2   6288  4290709089  3274612423   Sagittal T2/STIR   6289  4290709089  3390218084           Axial T2   6290  4290709089  4237840455        Sagittal T1                                           instance_number  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0                             [8.0, 8.0, 8.0, 8.0, 8.0]   1     [4.0, 4.0, 5.0, 6.0, 6.0, 11.0, 11.0, 11.0, 12...   2     [3.0, 4.0, 11.0, 11.0, 19.0, 19.0, 28.0, 28.0,...   3     [15.0, 16.0, 22.0, 22.0, 28.0, 29.0, 34.0, 34....   4     [5.0, 5.0, 5.0, 6.0, 7.0, 15.0, 15.0, 16.0, 17...   ...                                                 ...   6286                          [8.0, 8.0, 8.0, 8.0, 8.0]   6287  [4.0, 4.0, 9.0, 10.0, 16.0, 16.0, 22.0, 22.0, ...   6288                          [9.0, 9.0, 9.0, 9.0, 9.0]   6289  [2.0, 3.0, 5.0, 6.0, 10.0, 10.0, 15.0, 15.0, 2...   6290  [4.0, 4.0, 4.0, 4.0, 5.0, 11.0, 12.0, 12.0, 12...                                                 condition  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0     [Spinal Canal Stenosis, Spinal Canal Stenosis,...   1     [Right Neural Foraminal Narrowing, Right Neura...   2     [Left Subarticular Stenosis, Right Subarticula...   3     [Right Subarticular Stenosis, Left Subarticula...   4     [Left Neural Foraminal Narrowing, Left Neural ...   ...                                                 ...   6286  [Spinal Canal Stenosis, Spinal Canal Stenosis,...   6287  [Left Subarticular Stenosis, Right Subarticula...   6288  [Spinal Canal Stenosis, Spinal Canal Stenosis,...   6289  [Right Subarticular Stenosis, Left Subarticula...   6290  [Right Neural Foraminal Narrowing, Right Neura...                                                     level  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0                   [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   1     [L4/L5, L5/S1, L3/L4, L1/L2, L2/L3, L1/L2, L4/...   2     [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   3     [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   4     [L2/L3, L3/L4, L4/L5, L1/L2, L5/S1, L2/L3, L3/...   ...                                                 ...   6286                [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   6287  [L5/S1, L5/S1, L4/L5, L4/L5, L3/L4, L3/L4, L2/...   6288                [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   6289  [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   6290  [L2/L3, L3/L4, L4/L5, L5/S1, L1/L2, L1/L2, L2/...                                                         x  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0     [322.83185840707966, 320.57142857142856, 323.0...   1     [187.96175908221795, 198.2409177820268, 187.22...   2     [179.12644787644788, 145.28877148997134, 180.9...   3     [184.18099547511312, 235.3170731707317, 235.31...   4     [234.09931142986449, 227.5139455762059, 225.63...   ...                                                 ...   6286  [391.2351904090268, 369.4354724964739, 373.587...   6287  [145.7037037037037, 112.16991150442476, 143.92...   6288  [181.66894664842684, 174.22708618331055, 174.2...   6289  [307.18084360986546, 352.53169907016064, 349.2...   6290  [208.10679881880364, 204.195638510915, 208.381...                                                         y  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0     [227.9646017699115, 295.7142857142857, 371.818...   1     [251.83938814531547, 285.6137667304015, 210.72...   2     [161.23552123552125, 158.6246418338109, 158.76...   3     [263.23981900452486, 264.08362369337976, 254.7...   4     [196.620230591671, 256.8292898251205, 308.5714...   ...                                                 ...   6286  [235.6445698166432, 321.80535966149506, 391.35...   6287  [143.40740740740742, 143.34159292035395, 136.2...   6288  [88.86456908344734, 125.19835841313272, 160.65...   6289  [354.8699595361547, 358.1403212172443, 366.796...   6290  [140.20340382070157, 182.79159383993365, 222.9...                                                  filepath  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m0     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   1     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   2     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   3     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   4     [/kaggle/input/rsna-2024-lumbar-spine-degenera...   ...                                                 ...   6286  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   6287  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   6288  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   6289  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   6290  [/kaggle/input/rsna-2024-lumbar-spine-degenera...                                                  severity  0     [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  1     [Moderate, Normal/Mild, Moderate, Normal/Mild,...  2     [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  3     [Normal/Mild, Normal/Mild, Normal/Mild, Modera...  4     [Normal/Mild, Normal/Mild, Moderate, Normal/Mi...  ...                                                 ...  6286  [Normal/Mild, Moderate, Normal/Mild, Normal/Mi...  6287  [Normal/Mild, Normal/Mild, Moderate, Moderate,...  6288  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  6289  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  6290  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  [6291 rows x 10 columns]\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/html\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m<div><style scoped>    .dataframe tbody tr th:only-of-type \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: middle;    }    .dataframe tbody tr th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: top;    }    .dataframe thead th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        text-align: right;    }</style><table border=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m1\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m class=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mdataframe\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>  <thead>    <tr style=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mtext-align: right;\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>series_description</th>      <th>instance_number</th>      <th>condition</th>      <th>level</th>      <th>x</th>      <th>y</th>      <th>filepath</th>      <th>severity</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>4003253</td>      <td>702807833</td>      <td>Sagittal T2/STIR</td>      <td>[8.0, 8.0, 8.0, 8.0, 8.0]</td>      <td>[Spinal Canal Stenosis, Spinal Canal Stenosis,...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]</td>      <td>[322.83185840707966, 320.57142857142856, 323.0...</td>      <td>[227.9646017699115, 295.7142857142857, 371.818...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>1</th>      <td>4003253</td>      <td>1054713880</td>      <td>Sagittal T1</td>      <td>[4.0, 4.0, 5.0, 6.0, 6.0, 11.0, 11.0, 11.0, 12...</td>      <td>[Right Neural Foraminal Narrowing, Right Neura...</td>      <td>[L4/L5, L5/S1, L3/L4, L1/L2, L2/L3, L1/L2, L4/...</td>      <td>[187.96175908221795, 198.2409177820268, 187.22...</td>      <td>[251.83938814531547, 285.6137667304015, 210.72...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Moderate, Normal/Mild, Moderate, Normal/Mild,...</td>    </tr>    <tr>      <th>2</th>      <td>4003253</td>      <td>2448190387</td>      <td>Axial T2</td>      <td>[3.0, 4.0, 11.0, 11.0, 19.0, 19.0, 28.0, 28.0,...</td>      <td>[Left Subarticular Stenosis, Right Subarticula...</td>      <td>[L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...</td>      <td>[179.12644787644788, 145.28877148997134, 180.9...</td>      <td>[161.23552123552125, 158.6246418338109, 158.76...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>3</th>      <td>4646740</td>      <td>3201256954</td>      <td>Axial T2</td>      <td>[15.0, 16.0, 22.0, 22.0, 28.0, 29.0, 34.0, 34....</td>      <td>[Right Subarticular Stenosis, Left Subarticula...</td>      <td>[L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...</td>      <td>[184.18099547511312, 235.3170731707317, 235.31...</td>      <td>[263.23981900452486, 264.08362369337976, 254.7...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Modera...</td>    </tr>    <tr>      <th>4</th>      <td>4646740</td>      <td>3486248476</td>      <td>Sagittal T1</td>      <td>[5.0, 5.0, 5.0, 6.0, 7.0, 15.0, 15.0, 16.0, 17...</td>      <td>[Left Neural Foraminal Narrowing, Left Neural ...</td>      <td>[L2/L3, L3/L4, L4/L5, L1/L2, L5/S1, L2/L3, L3/...</td>      <td>[234.09931142986449, 227.5139455762059, 225.63...</td>      <td>[196.620230591671, 256.8292898251205, 308.5714...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Moderate, Normal/Mi...</td>    </tr>    <tr>      <th>...</th>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>    </tr>    <tr>      <th>6286</th>      <td>4287160193</td>      <td>1507070277</td>      <td>Sagittal T2/STIR</td>      <td>[8.0, 8.0, 8.0, 8.0, 8.0]</td>      <td>[Spinal Canal Stenosis, Spinal Canal Stenosis,...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]</td>      <td>[391.2351904090268, 369.4354724964739, 373.587...</td>      <td>[235.6445698166432, 321.80535966149506, 391.35...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Moderate, Normal/Mild, Normal/Mi...</td>    </tr>    <tr>      <th>6287</th>      <td>4287160193</td>      <td>1820446240</td>      <td>Axial T2</td>      <td>[4.0, 4.0, 9.0, 10.0, 16.0, 16.0, 22.0, 22.0, ...</td>      <td>[Left Subarticular Stenosis, Right Subarticula...</td>      <td>[L5/S1, L5/S1, L4/L5, L4/L5, L3/L4, L3/L4, L2/...</td>      <td>[145.7037037037037, 112.16991150442476, 143.92...</td>      <td>[143.40740740740742, 143.34159292035395, 136.2...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Moderate, Moderate,...</td>    </tr>    <tr>      <th>6288</th>      <td>4290709089</td>      <td>3274612423</td>      <td>Sagittal T2/STIR</td>      <td>[9.0, 9.0, 9.0, 9.0, 9.0]</td>      <td>[Spinal Canal Stenosis, Spinal Canal Stenosis,...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]</td>      <td>[181.66894664842684, 174.22708618331055, 174.2...</td>      <td>[88.86456908344734, 125.19835841313272, 160.65...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>6289</th>      <td>4290709089</td>      <td>3390218084</td>      <td>Axial T2</td>      <td>[2.0, 3.0, 5.0, 6.0, 10.0, 10.0, 15.0, 15.0, 2...</td>      <td>[Right Subarticular Stenosis, Left Subarticula...</td>      <td>[L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...</td>      <td>[307.18084360986546, 352.53169907016064, 349.2...</td>      <td>[354.8699595361547, 358.1403212172443, 366.796...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>6290</th>      <td>4290709089</td>      <td>4237840455</td>      <td>Sagittal T1</td>      <td>[4.0, 4.0, 4.0, 4.0, 5.0, 11.0, 12.0, 12.0, 12...</td>      <td>[Right Neural Foraminal Narrowing, Right Neura...</td>      <td>[L2/L3, L3/L4, L4/L5, L5/S1, L1/L2, L1/L2, L2/...</td>      <td>[208.10679881880364, 204.195638510915, 208.381...</td>      <td>[140.20340382070157, 182.79159383993365, 222.9...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>  </tbody></table><p>6291 rows × 10 columns</p></div>\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}}]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmerged_outer_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseries_description\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].unique()\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:12.039927Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:12.040738Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:12.050471Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:12.040696Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:12.049591Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m18\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m18\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecute_result\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124marray([\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSagittal T2/STIR\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSagittal T1\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mAxial T2\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m], dtype=object)\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}}]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfrom sklearn.model_selection import train_test_split# Check the distribution of the \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m columncondition_counts = cleaned_grouped_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].value_counts()# Find conditions with only one samplesingle_sample_conditions = condition_counts[condition_counts == 1]# Remove conditions with only one samplecleaned_grouped_df_filtered = cleaned_grouped_df[~cleaned_grouped_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].isin(single_sample_conditions.index)]# Perform the train-test splittrain_df, test_df = train_test_split(cleaned_grouped_df_filtered, test_size=0.5, stratify=cleaned_grouped_df_filtered[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m])# Check the distribution in both splitsprint(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mTrain Set Distribution:\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)print(train_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].value_counts())print(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m================\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)print(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mTest Set Distribution:\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)print(test_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].value_counts())\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:15.766289Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:15.766666Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:16.497676Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:15.766630Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:16.496738Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m19\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstdout\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTrain Set Distribution:condition[Spinal Canal Stenosis, Spinal Canal Stenosis, Spinal Canal Stenosis, Spinal Canal Stenosis, Spinal Canal Stenosis]                                                                                                                                                                                                                                949[Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing]    628[Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing]    349[Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis]                                                      313[Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis]                                                                                                                                                                                                   66                                                                                                                                                                                                                                                                                                                                                  ... [Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis]                                                                                                                1[Left Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis]                                                                                     1[Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis]                                                                                                                 1[Left Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis]                                                                                                                                                                                                       1[Right Subarticular Stenosis, Left Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis]                                                                                                                 1Name: count, Length: 96, dtype: int64================Test Set Distribution:condition[Spinal Canal Stenosis, Spinal Canal Stenosis, Spinal Canal Stenosis, Spinal Canal Stenosis, Spinal Canal Stenosis]                                                                                                                                                                                                                                949[Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing]    628[Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Left Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing, Right Neural Foraminal Narrowing]    349[Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis]                                                      314[Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis]                                                                                                                                                                                                   66                                                                                                                                                                                                                                                                                                                                                  ... [Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis]                                                                                    1[Right Subarticular Stenosis, Left Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis]                                                                                                                 1[Left Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis]                                                                                                                                                                                                      1[Left Subarticular Stenosis, Left Subarticular Stenosis, Left Subarticular Stenosis, Left Subarticular Stenosis, Left Subarticular Stenosis, Right Subarticular Stenosis]                                                                                                                                                                            1[Left Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis, Right Subarticular Stenosis]                                                                                                                                                                        1Name: count, Length: 96, dtype: int64\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstream\u001b[39m\u001b[38;5;124m\"\u001b[39m}]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrain_df\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:16.499168Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:16.499589Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:16.540081Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:16.499555Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:16.539121Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m20\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m20\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecute_result\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m        study_id   series_id series_description  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m3707  2557856398  3170818407        Sagittal T1   4333  2953643785  2766425881           Axial T2   4615  3160528641  3180832116   Sagittal T2/STIR   4637  3168755174  3335509714        Sagittal T1   1510  1036203708  3261685527   Sagittal T2/STIR   ...          ...         ...                ...   531    344269999  2933376913   Sagittal T2/STIR   5805  3951588890  2308748816           Axial T2   2990  2065657198  4097481257           Axial T2   1044   712073652   239356302           Axial T2   3088  2141458217   498734191        Sagittal T1                                           instance_number  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m3707  [5.0, 5.0, 5.0, 6.0, 6.0, 13.0, 13.0, 13.0, 14...   4333  [14.0, 15.0, 21.0, 22.0, 29.0, 29.0, 35.0, 36....   4615                     [10.0, 10.0, 10.0, 10.0, 10.0]   4637  [3.0, 3.0, 3.0, 3.0, 3.0, 11.0, 11.0, 12.0, 12...   1510                          [9.0, 9.0, 9.0, 9.0, 9.0]   ...                                                 ...   531                           [7.0, 7.0, 7.0, 7.0, 7.0]   5805                                   [4.0, 8.0, 14.0]   2990  [13.0, 14.0, 21.0, 22.0, 28.0, 29.0, 35.0, 36....   1044  [6.0, 7.0, 10.0, 11.0, 14.0, 15.0, 19.0, 19.0,...   3088  [4.0, 4.0, 4.0, 4.0, 5.0, 10.0, 10.0, 11.0, 11...                                                 condition  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m3707  [Left Neural Foraminal Narrowing, Left Neural ...   4333  [Left Subarticular Stenosis, Right Subarticula...   4615  [Spinal Canal Stenosis, Spinal Canal Stenosis,...   4637  [Right Neural Foraminal Narrowing, Right Neura...   1510  [Spinal Canal Stenosis, Spinal Canal Stenosis,...   ...                                                 ...   531   [Spinal Canal Stenosis, Spinal Canal Stenosis,...   5805  [Left Subarticular Stenosis, Left Subarticular...   2990  [Left Subarticular Stenosis, Right Subarticula...   1044  [Left Subarticular Stenosis, Right Subarticula...   3088  [Left Neural Foraminal Narrowing, Left Neural ...                                                     level  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m3707  [L3/L4, L4/L5, L5/S1, L1/L2, L2/L3, L1/L2, L2/...   4333  [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   4615                [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   4637  [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1, L1/L2, L2/...   1510                [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   ...                                                 ...   531                 [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   5805                              [L3/L4, L4/L5, L5/S1]   2990  [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   1044  [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   3088  [L2/L3, L3/L4, L4/L5, L5/S1, L1/L2, L1/L2, L2/...                                                         x  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m3707  [254.4318181818182, 260.11743119266055, 272.33...   4333  [141.91087811271296, 117.01071428571429, 141.5...   4615  [236.16421215705583, 235.86706605920844, 235.7...   4637  [471.6423529411765, 455.3788235294118, 435.501...   1510  [213.89368362148988, 205.36496108409892, 199.9...   ...                                                 ...   531   [321.8079096045197, 302.3529411764706, 292.941...   5805  [265.7007984462668, 262.60714285714283, 260.39...   2990  [171.61061946902657, 146.66797488226058, 175.0...   1044  [164.98883261064594, 138.8921282798834, 139.82...   3088  [179.34065934065933, 178.63736263736263, 175.8...                                                         y  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m3707  [267.8787878787879, 323.87522935779816, 375.54...   4333  [152.32503276539973, 151.77142857142857, 142.2...   4615  [107.79395462933066, 171.6803656665286, 237.07...   4637  [276.4649448529412, 371.3355330882353, 472.530...   1510  [109.52065602589936, 153.71494553783413, 199.4...   ...                                                 ...   531   [163.91713747645952, 196.23529411764707, 234.8...   5805  [256.6629261976694, 261.5243849805784, 261.966...   2990  [195.5398230088496, 195.16483516483515, 189.87...   1044  [165.43541137111245, 166.06413994169097, 172.5...   3088  [146.1098901098901, 179.16483516483515, 213.62...                                                  filepath  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m3707  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   4333  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   4615  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   4637  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   1510  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   ...                                                 ...   531   [/kaggle/input/rsna-2024-lumbar-spine-degenera...   5805  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   2990  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   1044  [/kaggle/input/rsna-2024-lumbar-spine-degenera...   3088  [/kaggle/input/rsna-2024-lumbar-spine-degenera...                                                  severity  3707  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  4333  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  4615  [Normal/Mild, Normal/Mild, Normal/Mild, Modera...  4637  [Normal/Mild, Normal/Mild, Moderate, Severe, S...  1510  [Normal/Mild, Normal/Mild, Normal/Mild, Modera...  ...                                                 ...  531   [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  5805                  [Normal/Mild, Moderate, Moderate]  2990  [Normal/Mild, Normal/Mild, Normal/Mild, Modera...  1044  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  3088  [Normal/Mild, Normal/Mild, Moderate, Severe, N...  [3121 rows x 10 columns]\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/html\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m<div><style scoped>    .dataframe tbody tr th:only-of-type \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: middle;    }    .dataframe tbody tr th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        vertical-align: top;    }    .dataframe thead th \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m        text-align: right;    }</style><table border=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m1\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m class=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mdataframe\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>  <thead>    <tr style=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mtext-align: right;\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m>      <th></th>      <th>study_id</th>      <th>series_id</th>      <th>series_description</th>      <th>instance_number</th>      <th>condition</th>      <th>level</th>      <th>x</th>      <th>y</th>      <th>filepath</th>      <th>severity</th>    </tr>  </thead>  <tbody>    <tr>      <th>3707</th>      <td>2557856398</td>      <td>3170818407</td>      <td>Sagittal T1</td>      <td>[5.0, 5.0, 5.0, 6.0, 6.0, 13.0, 13.0, 13.0, 14...</td>      <td>[Left Neural Foraminal Narrowing, Left Neural ...</td>      <td>[L3/L4, L4/L5, L5/S1, L1/L2, L2/L3, L1/L2, L2/...</td>      <td>[254.4318181818182, 260.11743119266055, 272.33...</td>      <td>[267.8787878787879, 323.87522935779816, 375.54...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>4333</th>      <td>2953643785</td>      <td>2766425881</td>      <td>Axial T2</td>      <td>[14.0, 15.0, 21.0, 22.0, 29.0, 29.0, 35.0, 36....</td>      <td>[Left Subarticular Stenosis, Right Subarticula...</td>      <td>[L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...</td>      <td>[141.91087811271296, 117.01071428571429, 141.5...</td>      <td>[152.32503276539973, 151.77142857142857, 142.2...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>4615</th>      <td>3160528641</td>      <td>3180832116</td>      <td>Sagittal T2/STIR</td>      <td>[10.0, 10.0, 10.0, 10.0, 10.0]</td>      <td>[Spinal Canal Stenosis, Spinal Canal Stenosis,...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]</td>      <td>[236.16421215705583, 235.86706605920844, 235.7...</td>      <td>[107.79395462933066, 171.6803656665286, 237.07...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Modera...</td>    </tr>    <tr>      <th>4637</th>      <td>3168755174</td>      <td>3335509714</td>      <td>Sagittal T1</td>      <td>[3.0, 3.0, 3.0, 3.0, 3.0, 11.0, 11.0, 12.0, 12...</td>      <td>[Right Neural Foraminal Narrowing, Right Neura...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1, L1/L2, L2/...</td>      <td>[471.6423529411765, 455.3788235294118, 435.501...</td>      <td>[276.4649448529412, 371.3355330882353, 472.530...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Moderate, Severe, S...</td>    </tr>    <tr>      <th>1510</th>      <td>1036203708</td>      <td>3261685527</td>      <td>Sagittal T2/STIR</td>      <td>[9.0, 9.0, 9.0, 9.0, 9.0]</td>      <td>[Spinal Canal Stenosis, Spinal Canal Stenosis,...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]</td>      <td>[213.89368362148988, 205.36496108409892, 199.9...</td>      <td>[109.52065602589936, 153.71494553783413, 199.4...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Modera...</td>    </tr>    <tr>      <th>...</th>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>      <td>...</td>    </tr>    <tr>      <th>531</th>      <td>344269999</td>      <td>2933376913</td>      <td>Sagittal T2/STIR</td>      <td>[7.0, 7.0, 7.0, 7.0, 7.0]</td>      <td>[Spinal Canal Stenosis, Spinal Canal Stenosis,...</td>      <td>[L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]</td>      <td>[321.8079096045197, 302.3529411764706, 292.941...</td>      <td>[163.91713747645952, 196.23529411764707, 234.8...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>5805</th>      <td>3951588890</td>      <td>2308748816</td>      <td>Axial T2</td>      <td>[4.0, 8.0, 14.0]</td>      <td>[Left Subarticular Stenosis, Left Subarticular...</td>      <td>[L3/L4, L4/L5, L5/S1]</td>      <td>[265.7007984462668, 262.60714285714283, 260.39...</td>      <td>[256.6629261976694, 261.5243849805784, 261.966...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Moderate, Moderate]</td>    </tr>    <tr>      <th>2990</th>      <td>2065657198</td>      <td>4097481257</td>      <td>Axial T2</td>      <td>[13.0, 14.0, 21.0, 22.0, 28.0, 29.0, 35.0, 36....</td>      <td>[Left Subarticular Stenosis, Right Subarticula...</td>      <td>[L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...</td>      <td>[171.61061946902657, 146.66797488226058, 175.0...</td>      <td>[195.5398230088496, 195.16483516483515, 189.87...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Modera...</td>    </tr>    <tr>      <th>1044</th>      <td>712073652</td>      <td>239356302</td>      <td>Axial T2</td>      <td>[6.0, 7.0, 10.0, 11.0, 14.0, 15.0, 19.0, 19.0,...</td>      <td>[Left Subarticular Stenosis, Right Subarticula...</td>      <td>[L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...</td>      <td>[164.98883261064594, 138.8921282798834, 139.82...</td>      <td>[165.43541137111245, 166.06413994169097, 172.5...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Normal/Mild, Normal...</td>    </tr>    <tr>      <th>3088</th>      <td>2141458217</td>      <td>498734191</td>      <td>Sagittal T1</td>      <td>[4.0, 4.0, 4.0, 4.0, 5.0, 10.0, 10.0, 11.0, 11...</td>      <td>[Left Neural Foraminal Narrowing, Left Neural ...</td>      <td>[L2/L3, L3/L4, L4/L5, L5/S1, L1/L2, L1/L2, L2/...</td>      <td>[179.34065934065933, 178.63736263736263, 175.8...</td>      <td>[146.1098901098901, 179.16483516483515, 213.62...</td>      <td>[/kaggle/input/rsna-2024-lumbar-spine-degenera...</td>      <td>[Normal/Mild, Normal/Mild, Moderate, Severe, N...</td>    </tr>  </tbody></table><p>3121 rows × 10 columns</p></div>\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}}]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mprint(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mAxial T2\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)display(merged_outer_df[merged_outer_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseries_description\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]==\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mAxial T2\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m][\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m].value_counts())print(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m================\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)print(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSagittal T1\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)display(merged_outer_df[merged_outer_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseries_description\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]==\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mSagittal T1\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m][\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m].value_counts())print(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m================\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)print(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSagittal T2/STIR\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)display(merged_outer_df[merged_outer_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseries_description\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]==\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mSagittal T2/STIR\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m][\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m].value_counts())print(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m================\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:20.786563Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:20.786945Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:20.843596Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:20.786907Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:20.842740Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m21\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstdout\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAxial T2\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstream\u001b[39m\u001b[38;5;124m\"\u001b[39m},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdisplay_data\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mconditionRight Subarticular Stenosis    9612Left Subarticular Stenosis     9608Name: count, dtype: int64\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstdout\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m================Sagittal T1\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstream\u001b[39m\u001b[38;5;124m\"\u001b[39m},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdisplay_data\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mconditionLeft Neural Foraminal Narrowing     9860Right Neural Foraminal Narrowing    9859Spinal Canal Stenosis                  5Name: count, dtype: int64\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstdout\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m================Sagittal T2/STIR\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstream\u001b[39m\u001b[38;5;124m\"\u001b[39m},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdisplay_data\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mconditionSpinal Canal Stenosis    9748Name: count, dtype: int64\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstdout\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m================\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstream\u001b[39m\u001b[38;5;124m\"\u001b[39m}]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmarkdown\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m## Cropping Images\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mimport pydicomimport matplotlib.pyplot as plt# Select a sample rowrow = train_df.iloc[0]filepath = row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m][0]  # Access the filepath of the first image in the list# Load DICOM imagedicom_data = pydicom.dcmread(filepath)# Plot the DICOM imageplt.imshow(dicom_data.pixel_array, cmap=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgray\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)plt.title(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mStudy ID: \u001b[39m\u001b[38;5;132;01m{row['study_id']}\u001b[39;00m\u001b[38;5;124m | Series ID: \u001b[39m\u001b[38;5;132;01m{row['series_id']}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)plt.xlabel(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mCondition: \u001b[39m\u001b[38;5;132;01m{row['condition'][0]}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)plt.ylabel(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mSeverity: \u001b[39m\u001b[38;5;132;01m{row['severity'][0]}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)plt.show()\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T09:02:10.621899Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T09:02:10.622254Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T09:02:10.918704Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T09:02:10.622220Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T09:02:10.917806Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m23\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdisplay_data\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext/plain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m<Figure size 640x480 with 1 Axes>\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mimage/png\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miVBORw0KGgoAAAANSUhEUgAAAcAAAAHHCAYAAAAoIIjLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACdTklEQVR4nO2dd3hV1fL3vyeBQAoEEiAh1NARUJAuCggoYkEEC4oCwhULHUXEq6IgYBdFhWtDVEDkKop6BTECKiIIiPTeW+iEJiVZ7x+82b/Zc86ZlZ1CwDOf58nznH12m7322mdlz3fNjM8YY6AoiqIoIUZYfhugKIqiKPmBDoCKoihKSKIDoKIoihKS6ACoKIqihCQ6ACqKoighiQ6AiqIoSkiiA6CiKIoSkugAqCiKooQkOgAqiqIoIYkOgDnE5/Ph2WefzW8zlBDk2WefRcWKFfPbDD+effZZ+Hy+/DZDUaxc0gPgihUrcPvtt6NChQooXLgwypQpg+uuuw5jx451bTdq1Ch89dVX+WOkB+bOnQufz4f//ve/zncfffQRfD6f81e4cGEkJSWhbdu2ePPNN3Hs2LEcnTMlJQU9evRAtWrVEBUVhUqVKuFf//oX9uzZ47dty5YtXbZk/t1www0BryPQ3++//+5st3Xr1qDb+Xw+PPDAA67jbtiwAZ07d0bZsmURFRWFGjVqYPjw4Th58mS27Mxk6dKlaN++PeLi4hAVFYXatWvjzTffdG0zatQoNGnSBCVLlkThwoVRtWpVDBgwAPv37/c73saNG3H77bejePHiiIqKwtVXX405c+YEPPfnn3+OJk2aoFixYoiPj0eLFi3w3XffBdw2J+zfvx/9+/dHjRo1EBkZiVKlSqFRo0YYMmQIjh8/nuvnu9B0794dMTExru9oPwgLC0PRokVRvXp13HfffZg9e3aOz+mlT4wcORLt27dHQkKC+E9zxYoVgz4PVatW9dv+gw8+QM2aNZ3z89++TH788Udce+21KFGiBIoVK4ZGjRrhk08+8dtu3LhxuOOOO1C+fHn4fD5079496PUvWbIEN998MxITExETE4PLL78cb775JtLT04Pus2nTJhQuXBg+nw+LFy/2W3/kyBH06tULJUuWRHR0NK699losXbrUtY30++Lz+TBy5Mig5+cUyPKWFxm//fYbrr32WpQvXx4PPPAAEhMTsWPHDvz+++9444030LdvX2fbUaNG4fbbb0eHDh3yz+AcMnz4cCQnJ+Ps2bPYu3cv5s6diwEDBuC1117DjBkzcPnll2fruEOGDMGhQ4dwxx13oGrVqti8eTPeeustfPvtt1i2bBkSExNd25ctWxajR492fZeUlBTw2P369UPDhg1d31WpUsX5XLJkyYAP4cyZMzFp0iRcf/31znc7duxAo0aNEBsbiz59+iAuLg4LFizAsGHDsGTJEnz99dfZsvOHH37ALbfcgnr16uHpp59GTEwMNm3ahJ07d7q2W7JkCerWrYvOnTujSJEiWLNmDd577z189913WLZsGaKjox07mzZtivDwcAwePBjR0dGYMGECrr/+eqSkpKB58+bOMceOHYt+/frhpptuwgsvvIC///4bH330EW6++WZ88cUX6NixY8B29cqhQ4fQoEEDpKWloUePHqhRowYOHjyI5cuXY9y4cXj44Yf9Bo+c8NRTT+GJJ57ItePlBNoPTpw4gY0bN+LLL7/Ep59+ijvvvBOffvopChYsmK1jZ7VPAOfbJDExEfXq1cOsWbOCHnPMmDF+/5Bs27YNTz31lOt5AID//Oc/eOihh9CpUycMGjQIv/zyC/r164eTJ09iyJAhznYzZsxAhw4d0LRpU+ft/PPPP0fXrl1x4MABDBw40Nn2xRdfxLFjx9CoUaOA/wTTa7/qqqtQtWpVDBkyBFFRUfj+++/Rv39/bNq0CW+88UbA/QYOHIgCBQrg9OnTfusyMjJw00034a+//sLgwYNRokQJvPPOO2jZsiWWLFni/ANQs2bNgL8bn3zyCX744Qe/dhIxlyg33nijKVmypDl8+LDfutTUVNdydHS06datW57YAcAMGzYsV441Z84cA8BMmzbN+W7ChAkGgPnjjz/8tk9JSTGRkZGmQoUK5uTJk9k657x580x6errfdwDMv//9b9f3LVq0MLVq1crWdXihdevWpmjRoubUqVPOdyNHjjQAzMqVK13bdu3a1QAwhw4d8mzn0aNHTUJCgrntttv82iAr/Pe//zUAzJQpU5zvHnnkEVOgQAGzdu1a57sTJ06YcuXKmSuvvNK1f9WqVU3Dhg1NRkaGy6aYmBjTvn176/mHDRtmKlSoYN3upZdeMgDM/Pnz/dYdPXrU1c454fjx47lynOzQrVs3Ex0d7fouWD84d+6ceeSRRwwA8/jjj+eqHYH6hDHGbNmyxRhjzP79+z3/ZowYMcLv/p08edLEx8ebm266ybVtly5dTHR0tOt5uO6660xSUpL5+++/ne/Onj1rKleubC6//HLX/lu3bnX6o/S7+cADD5iIiAhz8OBB1/fNmzc3RYsWDbjPzJkzTUREhHnqqacC/qZNnTrV73dj3759plixYubuu+8OeExKlSpVTNWqVa3bUS5ZF+imTZtQq1YtFCtWzG9dqVKlnM8+nw8nTpzAxIkTnVfkzNf67t27B9RQAmkYp0+fxsCBA1GyZEkUKVIE7du393tLmDNnDnw+H6ZPn+53zMmTJ8Pn82HBggXeLzYIrVq1wtNPP41t27bh008/db4/e/Ys1q5dK/4Hl0nz5s0RFhbm911cXBzWrFkTcJ9z585l2W127NgxnDt3LkvbAsCePXswZ84cdOzYEYULF3a+T0tLAwAkJCS4ti9dujTCwsIQERHh2c7JkycjNTUVI0eORFhYGE6cOIGMjIws25rZd44cOeJ898svv6BevXqoXr26811UVBTat2+PpUuXYsOGDa5rKlWqlKuvFS1aFDExMYiMjMyyHTY2bdqE8PBwNGnSxG9d0aJFXe0MAAsXLsQNN9yA2NhYREVFoUWLFpg/f75rm8xnZPXq1bjnnntQvHhxXH311a51nE8//RT169dHZGQk4uLi0LlzZ+zYscO1zYYNG9CpUyckJiaicOHCKFu2LDp37oyjR4/mtBkcwsPD8eabb+Kyyy7DW2+95Tr2gQMHsHbtWj+3elYJ1Cfo99lh8uTJSE5OxlVXXeV8N2fOHBw8eBCPPPKIa9vevXvjxIkTLjd6WloaihcvjkKFCjnfFShQACVKlPDrZxUqVMiSfpuWlobChQv7/f6WLl06YN89e/Ys+vfvj/79+6Ny5coBj/nf//4XCQkJLs9HyZIlceedd+Lrr78O+NaYyaJFi7Bx40Z06dLFajvlkh0AK1SogCVLlmDlypXidp988gkKFSqEa665Bp988gk++eQTPPjgg57P969//QtjxozB9ddfjxdeeAEFCxbETTfd5NqmZcuWKFeuHCZNmuS3/6RJk1C5cmU0bdrU87kl7rvvPgDnXXmZ7Nq1CzVr1sTQoUOzdczjx4/j+PHjKFGihN+69evXIzo6GkWKFEFiYiKefvppnD17NuBx7r//fucH9tprrw3o8+d89tlnyMjI8OvILVu2BAD07NkTy5Ytw44dOzB16lSMGzcO/fr1c7mbsmrnjz/+iKJFi2LXrl2oXr06YmJiULRoUTz88MP4+++//WwzxuDAgQPYu3ev424KDw93bAPO/6MU6AcgKioKwHnXEb2mmTNnYuzYsdi6dSvWrl2L3r174+jRo+jfv7+1rbJKhQoVkJ6eHtBtxPnpp5/QvHlzpKWlYdiwYRg1ahSOHDmCVq1aYdGiRX7b33HHHTh58iRGjRrlp9lSRo4cia5du6Jq1ap47bXXMGDAAMclnDlYnDlzBm3btsXvv/+Ovn374u2330avXr2wefNmvwElp4SHh+Puu+/GyZMn8euvvzrfv/XWW6hZs2bAaw1EVvpETvjzzz+xZs0a3HPPPX7fA0CDBg1c39evXx9hYWHOeuB8P1u1ahWefvppbNy4EZs2bcKIESOwePFiPP7449myq2XLlkhLS8ODDz6INWvWYNu2bRg/fjy+/PLLgL87Y8aMweHDh/HUU0+J13rllVf6/UPeqFEjnDx5EuvXrw+6b+ZvrtcB8JJ1gf7www8mPDzchIeHm6ZNm5rHH3/czJo1y5w5c8Zv22Cv8t26dQvoQho2bJihTbNs2TIDwDzyyCOu7e655x4/d8bQoUNNoUKFzJEjR5zv9u3bZwoUKGB1e3h1gWYSGxtr6tWr5yxv2bLFAMi22zfT5ZKSkuL6vkePHubZZ581X3zxhfn4449N+/btDQBz5513urabP3++6dSpk/nggw/M119/bUaPHm3i4+NN4cKFzdKlS8Vz169f35QuXTqgS3LEiBEmMjLSAHD+uJvWi52XX365iYqKMlFRUaZv377miy++MH379jUATOfOnf2Ou2fPHte5y5Yta6ZOnera5pZbbjHFihUzaWlpru+bNm1qAJhXXnnF+S41NdW0bt3adcwSJUqY3377TWyjTLLqAt27d68pWbKkAWBq1KhhHnroITN58mRXHzXGmIyMDFO1alXTtm1bl1v25MmTJjk52Vx33XWucwMI6Jriz8/WrVtNeHi4GTlypGu7FStWmAIFCjjf//nnn9l2nXtxgWYyffp0A8C88cYbfrbPmTMnS+fNSp+geHWBPvroowaAWb16tev73r17m/Dw8ID7lCxZ0tV/jx8/bu68807j8/kcO6OiosxXX30lnltygZ47d8706dPHFCxY0DlmeHi4GTdunN+2e/bsMUWKFDH/+c9/jDHBf9Oio6NNjx49/Pb/7rvvDAAzc+bMoLYkJCSYRo0aidcTiEt2ADTGmEWLFpnbbrvNREVFOTehZMmS5uuvv3Ztl9MBcNSoUQaAS9fJPD/vzGvWrDEAzPvvv+98N3bsWAPAbNiwQbye7A6AZcqUMVWqVBGPnVXmzZtnChQo4DdYBOOBBx4wAMyCBQvE7TZs2GAiIyNN27Ztg26zbt06A8AMHDgw4PpPPvnEtG3b1rz77rvmiy++MD169DA+n8+MHTs2W3ZWqlTJADAPPfSQa9sHH3zQADDr1693fX/69Gkze/Zs880335jhw4ebunXrmg8++MC1zf/+9z8DwLRr184sXbrUrFu3zvTv39/5oRgxYoSz7bFjx8wjjzxiunXrZqZNm2Y+/PBDU6dOHZOYmGjtK8ZkfQA0xpjdu3ebhx56yCQkJDjPSkREhBk+fLgz2C1dutQAMBMnTjT79+93/f3rX/8yhQoVcv4xyXxG5s2bF9Au+vy89tprxufzmQ0bNvgdt2bNmqZNmzbGGGM2b95sAJh//etf5sSJE1m6rkyyMwDOnj3bADDPP/+8p3NRstInKF4GwPT0dFOmTBnXP7eZ9OjRw0RGRgbcr1y5cubWW291ls+ePWueeuopc8cdd5gpU6aYTz/91DRv3tzExMSIz61t7sTrr79ubr75ZjNx4kQzdepU06FDB1OgQAEzffp013Zdu3Y1V1xxhdN3gv2mhYWFmYcfftjvPCkpKQaA33EzmTVrlt8/Mlnlkh4AMzl9+rRZtGiRGTp0qClcuLApWLCgWbVqlbM+pwPggw8+aMLCwszZs2dd2x09ejRgZ27YsKG59tprneUmTZqYJk2aWK8jt94As8uaNWtMXFycqVu3rt8bTDDWrl3r98MejM6dO5uIiAhz7ty5gOufeeYZA8AsXrzYb92UKVNMZGSk2bFjh+v77t27m6ioKHPgwAHPdtaqVSvgj3jmJKCJEyeKx5w/f74BYL755hvX92PHjjXR0dHOQFOlShVnIsrrr7/ubHfDDTeYm2++2bXvwYMHTVxcXJb+AfEyAGaSkZFh1q1bZ958801TpkwZA8C89957xpj/m4Qg/WVOrsh8RrZv3x7QLvr8PPzww+Ix6USMQYMGGQAmMjLSXH/99eatt97ye1MNRG69AeaUYH0iEy8D4E8//eTnNcjEyxvggw8+6BqAjDHmzJkzpmrVquJbkzQAjh492iQmJppjx465vm/ZsqVJSkpyfisXLFhgfD6f+emnn5xtcvsNsGvXriY8PNzs3bs36LUE45LVACkRERFo2LAhRo0ahXHjxuHs2bOYNm2adb9gYq8Ux5IVunbtinnz5mHnzp3YtGkTfv/9d9x77705OmYwdu7ciaNHj7rCC7LDjh07cP311yM2Nhb/+9//UKRIkSztV65cOQDnp9pnZdszZ87gxIkTAddPnjwZ1atXR/369f3WvfPOO6hXrx7Kli3r+r59+/Y4efKkS/PIqp2ZYRF8Yk3mJKrDhw+Lx7zqqqtQunRpP823T58+SE1NxW+//YbFixdj7dq1iI2NBQBUq1YNALB582bMnDkT7du3d+0bFxeHq6++2m/SSW7h8/lQrVo19O3bFz///DPCwsIc+zMnAL388suYPXt2wD8eLpGVyToZGRnw+XyYOXNmwGP+5z//cbZ99dVXsXz5cjz55JM4deoU+vXrh1q1avlNOMsNMucP5PTZoQTrE9lh0qRJCAsLw9133+23rnTp0khPT8e+fftc3585cwYHDx50+vaZM2fwwQcf4KabbnJpawULFkS7du2wePFinDlzxrNt77zzDlq1auXXH9q3b4/du3dj69atAIDHH38c11xzDZKTk7F161Zs3boVBw4cAHB+wtv27dtd1xRo4l7md4HCmE6dOoXp06ejTZs2fs9xVrhk4wCDkSkK04YMNtAVL148oLi+bds213KFChWQkZGBTZs2uWb3rVu3LuBxO3fujEGDBmHKlCk4deoUChYsiLvuusvrpWSJzIkNbdu2zfYxDh48iOuvvx6nT59GSkoKSpcuneV9N2/eDOD8bK2sbFu4cOGAMWcLFy7Exo0bMXz48ID7pqamonjx4n7fZ05ssc00DWRn/fr1MXv2bGcSTCa7d+/22zYYf//9d8AZitHR0a4JTz/++CMiIyPRrFkz53qAwP9snT171tPM2exSqVIlFC9e3HlWMmfnFS1aFG3atMm181SuXBnGGCQnJzv/AEjUqVMHderUwVNPPYXffvsNzZo1w/jx4/H888/nmk3p6emYPHmyk6ggNwnWJ7xw+vRpfPHFF2jZsmXAH/66desCABYvXowbb7zR+X7x4sXIyMhw1h88eBDnzp0L2s8yMjKy9Q9/ampq0GMC//c8bt++Hdu2bUNycrLftu3bt0dsbKzzG1y3bl388ssvyMjIcA3WCxcuRFRUVMC+M2PGDBw7dsz75Jf/zyX7BjhnzhwYY/y+/9///gcArh+06OjogANd5cqVcfToUSxfvtz5bs+ePX5hDO3atQMAv+wgY8aMCWhbiRIl0K5dO3z66aeYNGkSbrjhhoAzKnPKTz/9hBEjRiA5OdnVAbyEQZw4cQI33ngjdu3ahf/9738Bs00A56c982nIxhjnR4kOwIEyYfz111+YMWMGrr/+er9ZXsD5tz8AfrPdMqlWrRr+/PNPv5lgU6ZMQVhYmJMIwIudd955J4Dz2TQo77//PgoUKODM5Dtx4kTAafFffPEFDh8+7DcTj/Pbb7/hyy+/RM+ePZ03wSpVqiAsLAxTp0519eOdO3c6oRS5xcKFCwO+dS9atAgHDx50npX69eujcuXKeOWVVwKGjwS6r1mhY8eOCA8Px3PPPef3zBpjcPDgQQDn7x0f+OvUqYOwsDBxCrxX0tPT0a9fP6xZswb9+vVD0aJFnXVZDYPIaZ+w8b///Q9HjhwJ+sPeqlUrxMXFYdy4ca7vx40bh6ioKGeGeqlSpVCsWDFMnz7d9aZ3/PhxfPPNN05mIK9Uq1YNs2fPdu4dcL5dP//8cxQpUsT5Z+rdd9/F9OnTXX+ZSUpeeeUV15vy7bffjtTUVHz55ZfOdwcOHMC0adNwyy23uMI4Msn8J+a2227zfA3AJfwG2LdvX5w8eRK33XYbatSogTNnzuC3337D1KlTUbFiRdx///3OtvXr18ePP/6I1157DUlJSUhOTkbjxo3RuXNnDBkyBLfddpuTQWHcuHGoVq2aK/1O3bp1cffdd+Odd97B0aNHcdVVVyElJQUbN24Mal/Xrl1x++23AwBGjBiR4+v9/vvvsXbtWpw7dw6pqan46aefMHv2bFSoUAEzZsxwxXJlhkF069YNH330kXjcLl26YNGiRejRowfWrFnjiv2LiYlxsucsXboUd999N+6++25UqVLFcT3Mnz8fvXr1wpVXXunsd9dddyEyMhJXXXUVSpUqhdWrV+Pdd99FVFQUXnjhBT8b0tPTMXXqVDRp0iRojNDgwYPx/fff45prrkGfPn0QHx+Pb7/9Ft9//z3+9a9/Of8le7GzXr166NGjBz788EOcO3cOLVq0wNy5czFt2jQMHTrUOeaGDRvQpk0b3HXXXahRowbCwsKwePFifPrpp6hYsaIrZGHbtm2488470b59eyQmJmLVqlUYP348Lr/8cowaNcrZrmTJkujRowfef/99tG7dGh07dsSxY8fwzjvv4NSpU9kOYQnEJ598gkmTJuG2225D/fr1ERERgTVr1uDDDz9E4cKF8eSTTwIAwsLC8P7776Ndu3aoVasW7r//fpQpUwa7du3CnDlzULRoUXzzzTeez1+5cmU8//zzGDp0KLZu3YoOHTqgSJEi2LJlC6ZPn45evXrhsccew08//YQ+ffrgjjvuQLVq1XDu3Dl88sknCA8PR6dOnbJ17UePHnViZE+ePOlkgtm0aRM6d+7s92y+9dZbeO655zBnzhwxlMFLnwDO34Nt27Y5g+bPP//s/FN23333oUKFCq7tJ02ahEKFCgW97sjISIwYMQK9e/fGHXfcgbZt2+KXX37Bp59+ipEjRyIuLg7A+XCPxx57DE899RSaNGmCrl27Ij09HR988AF27tzpih8GgG+++QZ//fUXgPP/SC9fvtyxs3379s4/mk888QTuvfdeNG7cGL169UJkZCSmTJmCJUuW4Pnnn3ey6wTKypL5MtKiRQvXPwq33347mjRpgvvvvx+rV692MsGkp6fjueee8zvOoUOH8P3336NTp07Zz2TkWTW8SPj+++9Njx49TI0aNUxMTIyJiIgwVapUMX379vXLBLN27VrTvHlzZwo9FXZ/+OEHU7t2bRMREWGqV69uPv30Uz8R3xhjTp06Zfr162fi4+NNdHS0ueWWW8yOHTuCCtqnT582xYsXN7GxsVnOtCFNgsn8i4iIMImJiea6664zb7zxRsDJKl7CICpUqBB0cgKdYLF582Zzxx13mIoVK5rChQubqKgoU79+fTN+/HjXlHljjHnjjTdMo0aNTFxcnClQoIApXbq0uffee4PObJw5c6YBYN58803R1oULF5p27dqZxMREU7BgQVOtWjUzcuRI1+QkL3Yac34ywLPPPmsqVKhgChYsaKpUqeKaqGLM+YkLvXr1MjVq1DDR0dEmIiLCVK1a1QwYMMDs37/fte2hQ4fMrbfeahITE01ERIRJTk42Q4YMCXifzp49a8aOHWvq1q1rYmJiTExMjLn22mtdEwYksjoJZvny5Wbw4MHmyiuv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\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}}]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mimport pydicomfrom pydicom.pixel_data_handlers.util import apply_voi_lutimport numpy as npimport osimport pandas as pd# Define the new directory to save cropped DICOM filesnew_dir = \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtrain\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mos.makedirs(new_dir, exist_ok=True)  # Create the directory if it doesn\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt exist# Define the crop size (e.g., 50x50 pixels around the center point)crop_size = 100# Function to decompress, crop around (x, y) coordinates, and save as a new DICOM filedef decompress_and_crop_dicom(row, idx):    original_filepath = row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m][idx]    dicom_data = pydicom.dcmread(original_filepath)        # Decompress the DICOM file    if dicom_data.file_meta.TransferSyntaxUID.is_compressed:        dicom_data.decompress()    # Get the pixel array    img = apply_voi_lut(dicom_data.pixel_array, dicom_data) if \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mVOILUTFunction\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m in dicom_data else dicom_data.pixel_array    # Get the crop center coordinates    x_center = int(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m][idx])    y_center = int(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m][idx])    # Calculate the crop boundaries    x_start = max(x_center - crop_size // 2, 0)    x_end = min(x_center + crop_size // 2, img.shape[1])    y_start = max(y_center - crop_size // 2, 0)    y_end = min(y_center + crop_size // 2, img.shape[0])    # Crop the image    cropped_img = img[y_start:y_end, x_start:x_end]    # Update the DICOM object with the cropped image data    dicom_data.PixelData = cropped_img.tobytes()    dicom_data.Rows, dicom_data.Columns = cropped_img.shape    dicom_data.file_meta.TransferSyntaxUID = pydicom.uid.ExplicitVRLittleEndian  # Save as uncompressed    # Save the new DICOM file    new_filepath = os.path.join(new_dir, f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;132;01m{row['study_id']}\u001b[39;00m\u001b[38;5;124m_cropped_\u001b[39m\u001b[38;5;132;01m{idx}\u001b[39;00m\u001b[38;5;124m.dcm\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)    dicom_data.save_as(new_filepath)    return new_filepath# Loop through each row and process all coordinatesfor i, row in train_df.iterrows():    new_filepaths = []    # Loop through each coordinate in the row    for idx in range(len(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m])):        new_filepath = decompress_and_crop_dicom(row, idx)        new_filepaths.append(new_filepath)    # Update the filepath column with the list of new filepaths    train_df.at[i, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] = new_filepaths# Check the updated dataframeprint(train_df.head())\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:36.186041Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:36.186897Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T09:02:00.592680Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T08:54:36.186842Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T09:02:00.591699Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m22\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstdout\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m        study_id   series_id series_description  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m3707  2557856398  3170818407        Sagittal T1   4333  2953643785  2766425881           Axial T2   4615  3160528641  3180832116   Sagittal T2/STIR   4637  3168755174  3335509714        Sagittal T1   1510  1036203708  3261685527   Sagittal T2/STIR                                           instance_number  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m3707  [5.0, 5.0, 5.0, 6.0, 6.0, 13.0, 13.0, 13.0, 14...   4333  [14.0, 15.0, 21.0, 22.0, 29.0, 29.0, 35.0, 36....   4615                     [10.0, 10.0, 10.0, 10.0, 10.0]   4637  [3.0, 3.0, 3.0, 3.0, 3.0, 11.0, 11.0, 12.0, 12...   1510                          [9.0, 9.0, 9.0, 9.0, 9.0]                                                 condition  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m3707  [Left Neural Foraminal Narrowing, Left Neural ...   4333  [Left Subarticular Stenosis, Right Subarticula...   4615  [Spinal Canal Stenosis, Spinal Canal Stenosis,...   4637  [Right Neural Foraminal Narrowing, Right Neura...   1510  [Spinal Canal Stenosis, Spinal Canal Stenosis,...                                                     level  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m3707  [L3/L4, L4/L5, L5/S1, L1/L2, L2/L3, L1/L2, L2/...   4333  [L1/L2, L1/L2, L2/L3, L2/L3, L3/L4, L3/L4, L4/...   4615                [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]   4637  [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1, L1/L2, L2/...   1510                [L1/L2, L2/L3, L3/L4, L4/L5, L5/S1]                                                         x  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m3707  [254.4318181818182, 260.11743119266055, 272.33...   4333  [141.91087811271296, 117.01071428571429, 141.5...   4615  [236.16421215705583, 235.86706605920844, 235.7...   4637  [471.6423529411765, 455.3788235294118, 435.501...   1510  [213.89368362148988, 205.36496108409892, 199.9...                                                         y  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m3707  [267.8787878787879, 323.87522935779816, 375.54...   4333  [152.32503276539973, 151.77142857142857, 142.2...   4615  [107.79395462933066, 171.6803656665286, 237.07...   4637  [276.4649448529412, 371.3355330882353, 472.530...   1510  [109.52065602589936, 153.71494553783413, 199.4...                                                  filepath  \u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[38;5;124m3707  [train/2557856398_cropped_0.dcm, train/2557856...   4333  [train/2953643785_cropped_0.dcm, train/2953643...   4615  [train/3160528641_cropped_0.dcm, train/3160528...   4637  [train/3168755174_cropped_0.dcm, train/3168755...   1510  [train/1036203708_cropped_0.dcm, train/1036203...                                                  severity  3707  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  4333  [Normal/Mild, Normal/Mild, Normal/Mild, Normal...  4615  [Normal/Mild, Normal/Mild, Normal/Mild, Modera...  4637  [Normal/Mild, Normal/Mild, Moderate, Severe, S...  1510  [Normal/Mild, Normal/Mild, Normal/Mild, Modera...  \u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstream\u001b[39m\u001b[38;5;124m\"\u001b[39m}]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mprint(train_df.columns)print(train_df.shape)print(train_df.head(2))\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m# DELETE DIRECTORIESimport shutil# Path to the directory you want to deletedirectory_to_delete = \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m/kaggle/working/train\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m# Delete the directory and all its contentsshutil.rmtree(directory_to_delete)print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mDirectory \u001b[39m\u001b[38;5;132;01m{directory_to_delete}\u001b[39;00m\u001b[38;5;124m and all its contents have been deleted.\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmarkdown\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m### Read DICOM images\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mimport pydicomimport matplotlib.pyplot as pltdef read_dicom(file_path):    \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m    Reads a DICOM file from the given file path and returns the pixel data.        Parameters:    file_path (str): The path to the DICOM file.        Returns:    numpy.ndarray: The pixel data from the DICOM file, or None if an error occurs.    \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m    try:        # Read the DICOM file        dicom_image = pydicom.dcmread(file_path)                return dicom_image.pixel_array        except Exception as e:        print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mAn error occurred while reading the DICOM file \u001b[39m\u001b[38;5;132;01m{file_path}\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;132;01m{e}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)        return Nonedef visualize_dicom(pixel_array, title=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mDICOM Image\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m):    \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m    Visualizes the pixel data of a DICOM image using matplotlib.        Parameters:    pixel_array (numpy.ndarray): The pixel data of the DICOM image.    title (str): Title for the plot.        Returns:    None    \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m    try:        # Visualize the image using matplotlib        plt.figure(figsize=(6, 6))        plt.imshow(pixel_array, cmap=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgray\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)        plt.title(title)        plt.axis(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moff\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)        plt.show()            except Exception as e:        print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mAn error occurred while visualizing the DICOM image: \u001b[39m\u001b[38;5;132;01m{e}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)def read_multiple_dicoms(file_paths):    \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m    Reads multiple DICOM files from a list of file paths and returns their pixel data.        Parameters:    file_paths (list of str): A list of paths to DICOM files.        Returns:    dict: A dictionary with file paths as keys and pixel data (numpy.ndarray) as values.    \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m    dicom_images = \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m        for file_path in file_paths:        pixel_data = read_dicom(file_path)        if pixel_data is not None:            dicom_images[file_path] = pixel_data        else:            print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mFailed to read DICOM file: \u001b[39m\u001b[38;5;132;01m{file_path}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)        return dicom_imagesdef visualize_multiple_dicoms(dicom_images):    \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m    Visualizes multiple DICOM images from a dictionary of pixel data.        Parameters:    dicom_images (dict): A dictionary with file paths as keys and pixel data (numpy.ndarray) as values.        Returns:    None    \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m    for file_path, pixel_array in dicom_images.items():        visualize_dicom(pixel_array, title=f\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mDICOM Image: \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mfile_path.split(\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m/\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)[-1]}\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.busy\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T09:02:20.945630Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.execute_input\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T09:02:20.946012Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miopub.status.idle\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T09:02:20.957261Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply.started\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T09:02:20.945974Z\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell.execute_reply\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2024-11-14T09:02:20.956291Z\u001b[39m\u001b[38;5;124m\"\u001b[39m},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;241m24\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mread_dicom(cleaned_grouped_df.iloc[0][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m][0]).shape\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdef read_multiple_dicoms(filepaths):    dicom_images = \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m    for filepath in filepaths:        try:            dicom_data = dcmread(filepath)            dicom_images[filepath] = dicom_data.pixel_array        except Exception as e:            print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mCould not read DICOM file \u001b[39m\u001b[38;5;132;01m{filepath}\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;132;01m{e}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)    return dicom_imagesdef visualize_dicoms_grid_with_annotations(df, study_id, series_id):    \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m    Visualizes cropped DICOM images in a grid format for a specific study and series ID,    including additional information such as series description, conditions, levels, and severity,    with annotations for each condition using the x and y coordinates.        Parameters:    df (DataFrame): The DataFrame containing DICOM data details.    study_id (int): The study ID to filter the data.    series_id (int): The series ID to filter the data.        Returns:    None    \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m    # Filter the DataFrame based on the given study_id and series_id    filtered_df = df[(df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstudy_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] == study_id) & (df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseries_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] == series_id)]    if filtered_df.empty:        print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mNo images found for study ID \u001b[39m\u001b[38;5;132;01m{study_id}\u001b[39;00m\u001b[38;5;124m and series ID \u001b[39m\u001b[38;5;132;01m{series_id}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)        return    # Extract all filepaths and related info from the filtered DataFrame    filepaths = []    xy_annotations = \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m  # Dictionary to store x, y, conditions, levels, and severities for each file    for index, row in filtered_df.iterrows():        if isinstance(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m], list):            for i, file_path in enumerate(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]):                filepaths.append(file_path)                if file_path not in xy_annotations:                    xy_annotations[file_path] = \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [], \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [], \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [], \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [], \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: []}                xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].append(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m][i])                xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].append(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m][i])                xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].append(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m][i])                xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].append(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m][i])                xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].append(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m][i])        else:            filepaths.append(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m])            if row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] not in xy_annotations:                xy_annotations[row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]] = \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]], \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]],                                                    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]],                                                    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]],                                                    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]]}    # Read all DICOM files from the cropped image filepaths    dicom_images = read_multiple_dicoms(filepaths)    # Determine the number of images    num_images = len(dicom_images)    cols = 3  # Number of columns in the grid    rows = (num_images + cols - 1) // cols  # Calculate the number of rows needed    # Extract additional information to display    series_description = filtered_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseries_description\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].values[0]    # Create a grid to visualize the DICOM images    fig, axes = plt.subplots(rows, cols, figsize=(15, 5 * rows))    axes = axes.flatten()    # Iterate through the DICOM images and display them in the grid    for idx, (file_path, pixel_array) in enumerate(dicom_images.items()):        axes[idx].imshow(pixel_array, cmap=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgray\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)                # Add the image information in the title        title = f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mSeries: \u001b[39m\u001b[38;5;132;01m{series_description}\u001b[39;00m\u001b[38;5;124m\\\u001b[39m\u001b[38;5;124mImage: \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mfile_path.split(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m/\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)[-1]}\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m        axes[idx].set_title(title, fontsize=8)        axes[idx].axis(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moff\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)        if file_path in xy_annotations:            for x, y, condition, level, severity in zip(xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m],                                                         xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m],                                                         xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m],                                                        xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m],                                                        xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]):                circle = plt.Circle((x, y), radius=10, color=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mred\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, fill=False, linewidth=1.5)                axes[idx].add_patch(circle)                annotation_text = f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mCondition: \u001b[39m\u001b[38;5;132;01m{condition}\u001b[39;00m\u001b[38;5;124m\\\u001b[39m\u001b[38;5;124mLevel: \u001b[39m\u001b[38;5;132;01m{level}\u001b[39;00m\u001b[38;5;124m\\\u001b[39m\u001b[38;5;124mSeverity: \u001b[39m\u001b[38;5;132;01m{severity}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m                axes[idx].text(x, y, annotation_text, color=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mwhite\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, fontsize=8, fontweight=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbold\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,                               ha=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mleft\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, va=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtop\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, bbox=dict(facecolor=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mblack\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, alpha=0.6, edgecolor=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnone\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m))    # Turn off any unused axes    for idx in range(num_images, len(axes)):        axes[idx].axis(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moff\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    plt.tight_layout()    plt.show()# Usage example with specific study and series IDstudy_id = 4205258367  series_id = 2470721789  visualize_dicoms_grid_with_annotations(cleaned_grouped_df, study_id, series_id)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdef visualize_dicoms_grid_with_annotations(df, study_id, series_id):    \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m    Visualizes DICOM images in a grid format for a specific study and series ID,    including additional information such as series description, conditions, levels, and severity,    with annotations for each condition using the x and y coordinates.        Parameters:    df (DataFrame): The DataFrame containing DICOM data details.    study_id (int): The study ID to filter the data.    series_id (int): The series ID to filter the data.        Returns:    None    \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m    # Filter the DataFrame based on the given study_id and series_id    filtered_df = df[(df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstudy_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] == study_id) & (df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseries_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] == series_id)]    if filtered_df.empty:        print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mNo images found for study ID \u001b[39m\u001b[38;5;132;01m{study_id}\u001b[39;00m\u001b[38;5;124m and series ID \u001b[39m\u001b[38;5;132;01m{series_id}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)        return    # Extract all filepaths and related info from the filtered DataFrame    filepaths = []    xy_annotations = \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m  # Dictionary to store x, y, conditions, levels, and severities for each file    for index, row in filtered_df.iterrows():        if isinstance(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m], list):            for i, file_path in enumerate(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]):                filepaths.append(file_path)                if file_path not in xy_annotations:                    xy_annotations[file_path] = \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [], \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [], \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [], \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [], \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: []}                xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].append(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m][i])                xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].append(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m][i])                xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].append(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m][i])                xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].append(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m][i])                xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].append(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m][i])        else:            filepaths.append(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m])            if row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] not in xy_annotations:                xy_annotations[row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]] = \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]], \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]],                                                    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]],                                                    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]],                                                    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]]}    # Read all DICOM files from the extracted filepaths    dicom_images = read_multiple_dicoms(filepaths)    # Determine the number of images    num_images = len(dicom_images)    cols = 3  # Number of columns in the grid    rows = (num_images + cols - 1) // cols  # Calculate the number of rows needed    # Extract additional information to display    series_description = filtered_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseries_description\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].values[0]    # Create a grid to visualize the DICOM images    fig, axes = plt.subplots(rows, cols, figsize=(15, 5 * rows))    axes = axes.flatten()    # Iterate through the DICOM images and display them in the grid    for idx, (file_path, pixel_array) in enumerate(dicom_images.items()):        axes[idx].imshow(pixel_array, cmap=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgray\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)                # Add the image information in the title        title = f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mSeries: \u001b[39m\u001b[38;5;132;01m{series_description}\u001b[39;00m\u001b[38;5;124m\\\u001b[39m\u001b[38;5;124mImage: \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mfile_path.split(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m/\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)[-1]}\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m        axes[idx].set_title(title, fontsize=8)        axes[idx].axis(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moff\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)        if file_path in xy_annotations:            for x, y, condition, level, severity in zip(xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m],                                                         xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m],                                                         xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m],                                                        xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m],                                                        xy_annotations[file_path][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]):                circle = plt.Circle((x, y), radius=10, color=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mred\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, fill=False, linewidth=1.5)                axes[idx].add_patch(circle)                annotation_text = f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mCondition: \u001b[39m\u001b[38;5;132;01m{condition}\u001b[39;00m\u001b[38;5;124m\\\u001b[39m\u001b[38;5;124mLevel: \u001b[39m\u001b[38;5;132;01m{level}\u001b[39;00m\u001b[38;5;124m\\\u001b[39m\u001b[38;5;124mSeverity: \u001b[39m\u001b[38;5;132;01m{severity}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m                axes[idx].text(x, y, annotation_text, color=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mwhite\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, fontsize=8, fontweight=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbold\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,                               ha=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mleft\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, va=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtop\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, bbox=dict(facecolor=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mblack\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, alpha=0.6, edgecolor=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnone\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m))                print(file_path)    for idx in range(num_images, len(axes)):        axes[idx].axis(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moff\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    plt.tight_layout()    plt.show()study_id = 4205258367  series_id = 2470721789  visualize_dicoms_grid_with_annotations(cleaned_grouped_df, study_id, series_id)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcleaned_grouped_df\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcleaned_grouped_df.dtypes\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmarkdown\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m## Prepare DF for training\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexpanded_df = cleaned_grouped_df.explode([\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minstance_number\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m])# Reset the index after expandingexpanded_df = expanded_df.reset_index(drop=True)expanded_df\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdf_encoded = pd.get_dummies(expanded_df, columns=[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m])df_encoded\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mseverity_mapping = \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mNormal/Mild\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: 0, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mModerate\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: 1, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSevere\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: 2}df_encoded[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] = df_encoded[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].map(severity_mapping)df_encoded\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmost_frequent_value = df_encoded[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].mode()[0]print(\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mNumber of NaN values in \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m column before filling:\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)print(df_encoded[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].isna().sum())df_encoded[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] = df_encoded[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].fillna(most_frequent_value)print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mThe most frequent value in \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m is: \u001b[39m\u001b[38;5;132;01m{most_frequent_value}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)print(\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mNumber of NaN values in \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m column after filling:\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)print(df_encoded[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].isna().sum())print(df_encoded[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].unique())print(df_encoded[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].dtype)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mimport pandas as pdfrom torch.utils.data import Dataset, DataLoaderimport torchvision.transforms as transformsimport torchimport pydicomimport numpy as npimport albumentations as Afrom albumentations.pytorch import ToTensorV2def read_dicom(file_path):    \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m    Reads a DICOM file from the given file path and returns the pixel data.        Parameters:    file_path (str): The path to the DICOM file.        Returns:    numpy.ndarray: The pixel data from the DICOM file, or None if an error occurs.    \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m    try:        dicom_image = pydicom.dcmread(file_path)                image_array = dicom_image.pixel_array.astype(np.float32)        return image_array        except Exception as e:        print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mAn error occurred while reading the DICOM file \u001b[39m\u001b[38;5;132;01m{file_path}\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;132;01m{e}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)        return Noneclass CustomDataset(Dataset):    def __init__(self, dataframe, features_list, y_label=None, transform=None):        \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m        Initializes the CustomDataset.                Parameters:        dataframe (DataFrame): The dataframe containing data.        features_list (list of str): List of column names to be used as features.        y_label (str, optional): Column name of the target label. Defaults to None for inference.        transform (callable, optional): A function/transform to apply to the images.        \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m        self.dataframe = dataframe        self.features_list = features_list        self.y_label = y_label        self.transform = transform    def __len__(self):        return len(self.dataframe)    def __getitem__(self, index):        image_path = self.dataframe[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].iloc[index]        image = read_dicom(image_path)        if image.max() != image.min():            image = (image - image.min()) / (image.max() - image.min())        else:            image = np.zeros_like(image, dtype=np.float32)        image = image.astype(np.float32)        image = np.stack([image, image, image], axis=-1)              if self.transform:            augmented = self.transform(image=image)            image = augmented[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mimage\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]        else:            image = torch.tensor(image).permute(2, 0, 1)        features = self.dataframe[self.features_list].iloc[index].values.astype(np.float32)        features = torch.tensor(features)        if self.y_label:            label = self.dataframe[self.y_label].iloc[index]            label = torch.tensor(label, dtype=torch.long)            return image, features, label        else:            return image, features        features_list = [    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition_Left Neural Foraminal Narrowing\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition_Left Subarticular Stenosis\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition_Right Neural Foraminal Narrowing\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition_Right Subarticular Stenosis\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition_Spinal Canal Stenosis\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel_L1/L2\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel_L2/L3\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel_L3/L4\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel_L4/L5\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel_L5/S1\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]y_label = \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseverity\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnormalize_mean = (0.485, 0.456, 0.406)normalize_std = (0.229, 0.224, 0.225)train_transform = A.Compose([    A.Resize(384, 384),    A.Rotate(limit=5, p=0.5),    A.HorizontalFlip(p=0.5),    A.VerticalFlip(p=0.1),      A.RandomBrightnessContrast(brightness_limit=0.1, contrast_limit=0.1, p=0.5),    A.ElasticTransform(alpha=1, sigma=50, alpha_affine=None, p=0.5),    A.GridDistortion(num_steps=5, distort_limit=0.03, p=0.5),    A.GaussNoise(var_limit=(0.001, 0.005), p=0.5),    A.Normalize(mean=normalize_mean, std=normalize_std, max_pixel_value=1.0),  # Set max_pixel_value=1.0    ToTensorV2(),])val_transform = A.Compose([    A.Resize(384, 384),    A.Normalize(mean=normalize_mean, std=normalize_std, max_pixel_value=1.0),    ToTensorV2(),])dataset = CustomDataset(df_encoded, features_list, y_label, transform=train_transform)data_loader = DataLoader(dataset, batch_size=32, shuffle=True)for images, features, labels in data_loader:    print(images.shape, features.shape, labels.shape)  # Display the shape of images, features, and labels    break  \u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdef visualize_image_processing(index):    # Access the row from the dataframe    row = df_encoded.iloc[index]    image_path = row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]    features = row[features_list].values.astype(np.float32)    label = row[y_label]    image = read_dicom(image_path)    plt.figure(figsize=(6, 6))    plt.imshow(image, cmap=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgray\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    plt.title(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mOriginal Image - Label: \u001b[39m\u001b[38;5;132;01m{label}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)    plt.axis(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moff\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    plt.show()    print(image.shape)    print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mOriginal image: min=\u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mimage.min()}, max=\u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mimage.max()}\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)    # Step 2: Normalize the image to [0, 1]    if image.max() != image.min():        image_norm = (image - image.min()) / (image.max() - image.min())    else:        image_norm = np.zeros_like(image, dtype=np.float32)    image_norm = image_norm.astype(np.float32)    print(image_norm.shape)    print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mNormalized image: min=\u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mimage_norm.min()}, max=\u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mimage_norm.max()}\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)    # Visualize normalized image    plt.figure(figsize=(6, 6))    plt.imshow(image_norm, cmap=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgray\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    plt.title(\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mNormalized Image\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)    plt.axis(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moff\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    plt.show()    # Step 3: Stack to 3 channels    image_3ch = np.stack([image_norm, image_norm, image_norm], axis=-1)    # Step 4: Apply transformations    if train_transform:        augmented = train_transform(image=image_3ch)        image_transformed = augmented[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mimage\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]        # Unnormalize for visualization        mean = np.array(normalize_mean)        std = np.array(normalize_std)        image_unorm = image_transformed.permute(1, 2, 0).numpy()        image_unorm = (image_unorm * std) + mean  # Unnormalize        image_unorm = np.clip(image_unorm, 0, 1)        # Debugging: Check pixel values        print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mAfter unnormalization: min=\u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mimage_unorm.min()}, max=\u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mimage_unorm.max()}, dtype=\u001b[39m\u001b[38;5;132;01m{image_unorm.dtype}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)    else:        image_transformed = torch.tensor(image_3ch).permute(2, 0, 1)        image_unorm = image_transformed.permute(1, 2, 0).numpy()    # Visualize transformed image    plt.figure(figsize=(6, 6))    plt.imshow(image_unorm)    plt.title(\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mTransformed Image\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)    plt.axis(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moff\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    plt.show()\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m# Test with a specific indexvisualize_image_processing(index=0)  # Replace 0 with any index you\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124md like to test\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmarkdown\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m### Split data\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfrom sklearn.model_selection import train_test_split# Define the percentage of data to use for a quick runQUICK_RUN_PERCENTAGE = 1  # Use 20\u001b[39m\u001b[38;5;132;01m% o\u001b[39;00m\u001b[38;5;124mf the data for a quick run# Sample the data for a quick runquick_run_df = df_encoded.sample(frac=QUICK_RUN_PERCENTAGE).reset_index(drop=True)# Define the test size percentageTEST_SIZE = 0.2  # 20\u001b[39m\u001b[38;5;132;01m% o\u001b[39;00m\u001b[38;5;124mf the data will be used for testing# Split the sampled data into training and testing setstrain_df, val_df = train_test_split(quick_run_df, test_size=TEST_SIZE)# Reset indices after splittingtrain_df = train_df.reset_index(drop=True)val_df = val_df.reset_index(drop=True)print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mTotal data size: \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mlen(df_encoded)}\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mTotal data size for quick run: \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mlen(quick_run_df)}\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mTraining set size: \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mlen(train_df)}\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mTesting set size: \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mlen(val_df)}\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m# Determine the number of workers automaticallyimport multiprocessingnum_workers = multiprocessing.cpu_count()print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mNumber of CPU cores available: \u001b[39m\u001b[38;5;132;01m{num_workers}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m# Create the datasetstrain_dataset = CustomDataset(train_df, features_list, y_label, transform=train_transform)val_dataset = CustomDataset(val_df, features_list, y_label, transform=val_transform)# Create the data loaders with the determined number of workerstrain_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=num_workers)val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False, num_workers=num_workers)print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mNumber of batches in training set: \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mlen(train_loader)}\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mNumber of batches in testing set: \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mlen(val_loader)}\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mimport matplotlib.pyplot as pltdef visualize_batch(data_loader):    \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m    Visualizes a batch of images and their corresponding labels from the DataLoader in a grid format.        Parameters:    data_loader (DataLoader): The DataLoader containing the dataset.        Returns:    None    \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m    # Get one batch of data    images, features, labels = next(iter(data_loader))        # Determine the number of images in the batch    batch_size = images.shape[0]    cols = 4  # Number of columns in the grid    rows = (batch_size + cols - 1) // cols  # Calculate the number of rows needed    fig, axes = plt.subplots(rows, cols, figsize=(15, 5 * rows))    axes = axes.flatten()  # Flatten the axes array for easy iteration    for i in range(batch_size):        img = images[i].permute(1, 2, 0).numpy()  # Convert tensor to NumPy array with HWC format                # Plot image        axes[i].imshow(img, cmap=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgray\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)        axes[i].set_title(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mLabel: \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mlabels[i].item()}\u001b[39m\u001b[38;5;124m\\\u001b[39m\u001b[38;5;124mFeatures: \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mfeatures[i].tolist()}\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m, fontsize=8)        axes[i].axis(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moff\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    # Hide any unused subplots    for i in range(batch_size, len(axes)):        axes[i].axis(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moff\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    plt.tight_layout()    plt.show()# Visualize a batch from the training setvisualize_batch(train_loader)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mimport matplotlib.pyplot as pltdef plot_label_distribution(train_df, test_df, y_label):    \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m    Plots the distribution of labels in the training and validation sets.        Parameters:    train_df (DataFrame): The training dataframe.    test_df (DataFrame): The validation dataframe.    y_label (str): The column name of the target label.        Returns:    None    \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m    # Calculate the label distribution in training and testing sets    train_distribution = train_df[y_label].value_counts().sort_index()    test_distribution = test_df[y_label].value_counts().sort_index()        # Plot the distribution    fig, ax = plt.subplots(1, 2, figsize=(12, 5))        train_distribution.plot(kind=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbar\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, ax=ax[0], color=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mskyblue\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    ax[0].set_title(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mTraining Set Label Distribution\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    ax[0].set_xlabel(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mLabel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    ax[0].set_ylabel(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mCount\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)        test_distribution.plot(kind=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbar\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, ax=ax[1], color=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlightcoral\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    ax[1].set_title(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mValidation Set Label Distribution\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    ax[1].set_xlabel(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mLabel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    ax[1].set_ylabel(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mCount\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)        plt.tight_layout()    plt.show()# Plot the distribution of labels in the training and validation setsplot_label_distribution(train_df, val_df, y_label)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmarkdown\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m## Model\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m# Set the device to GPU if available; otherwise, use CPUdevice = torch.device(\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mcuda\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m if torch.cuda.is_available() else \u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mcpu\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)# Print the device being usedprint(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mUsing device: \u001b[39m\u001b[38;5;132;01m{device}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mimport torchimport torch.nn as nnimport torchvision.models as modelsclass EfficientNetWithFeatures(nn.Module):    def __init__(self, num_classes, num_features):        super(EfficientNetWithFeatures, self).__init__()        self.efficientnet = models.efficientnet_v2_s(weights=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mIMAGENET1K_V1\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)        # Freeze all layers first        for param in self.efficientnet.parameters():            param.requires_grad = False                    # Get the list of all parameters in EfficientNet        all_layers = list(self.efficientnet.parameters())        # Unfreeze the last 20 layers        for param in all_layers[-20:]:            param.requires_grad = True        num_features_eff = self.efficientnet.classifier[-1].in_features        self.efficientnet.classifier = nn.Identity()        # Define a more complex fully connected layer to combine EfficientNet embeddings with numerical features        self.fc1 = nn.Linear(num_features_eff + num_features, 256)        self.fc2 = nn.Linear(256, 128)        self.fc3 = nn.Linear(128, num_classes)        self.dropout = nn.Dropout(p=0.5)      def forward(self, image, features):        image_embedding = self.efficientnet(image)        # Concatenate EfficientNet embeddings with numerical features        combined_input = torch.cat((image_embedding, features), dim=1)        # Pass through the fully connected layers with dropout        x = torch.relu(self.fc1(combined_input))        x = self.dropout(x)  # Dropout after the first fully connected layer        x = torch.relu(self.fc2(x))        x = self.fc3(x)        return xnum_classes = 3  # Replace with the number of classes in your datasetnum_features = 10  # Initialize the custom modelmodel = EfficientNetWithFeatures(num_classes=num_classes, num_features=num_features).to(device)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfrom datetime import datetimeimport torchfrom tqdm import tqdmfrom sklearn.metrics import precision_score, recall_score, f1_score, confusion_matrixfrom torch.cuda.amp import GradScaler, autocastdef train_model(model, train_loader, criterion, optimizer, device, scaler):    model.train()    running_loss = 0.0    correct = 0    total = 0    for images, features, labels in tqdm(train_loader, desc=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mTraining\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m):        images, features, labels = images.to(device), features.to(device), labels.to(device)        optimizer.zero_grad()        with autocast():            outputs = model(images, features)            loss = criterion(outputs, labels)        scaler.scale(loss).backward()        scaler.step(optimizer)        scaler.update()        running_loss += loss.item()        _, predicted = torch.max(outputs, 1)        total += labels.size(0)        correct += (predicted == labels).sum().item()    epoch_loss = running_loss / len(train_loader)    epoch_acc = 100 * correct / total    return epoch_loss, epoch_accdef validate_model_with_metrics(model, val_loader, criterion, device, scaler):    model.eval()    running_loss = 0.0    correct = 0    total = 0    all_preds = []    all_labels = []    with torch.no_grad():        for images, features, labels in tqdm(val_loader, desc=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mValidation\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m):            images, features, labels = images.to(device), features.to(device), labels.to(device)            with autocast():                outputs = model(images, features)                loss = criterion(outputs, labels)            running_loss += loss.item()            _, predicted = torch.max(outputs, 1)            total += labels.size(0)            correct += (predicted == labels).sum().item()            all_preds.extend(predicted.cpu().numpy())            all_labels.extend(labels.cpu().numpy())    epoch_loss = running_loss / len(val_loader)    epoch_acc = 100 * correct / total    precision = precision_score(all_labels, all_preds, average=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mweighted\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    recall = recall_score(all_labels, all_preds, average=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mweighted\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    f1 = f1_score(all_labels, all_preds, average=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mweighted\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    cm = confusion_matrix(all_labels, all_preds)#     print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mPrecision: \u001b[39m\u001b[38;5;132;01m{precision:.4f}\u001b[39;00m\u001b[38;5;124m | Recall: \u001b[39m\u001b[38;5;132;01m{recall:.4f}\u001b[39;00m\u001b[38;5;124m | F1-Score: \u001b[39m\u001b[38;5;132;01m{f1:.4f}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)#     print(\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mConfusion Matrix:\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)#     print(cm)    return epoch_loss, epoch_acc, precision, recall, f1, cm# Main training loop with early stopping and learning rate schedulerdef train_and_validate(model, train_loader, val_loader, criterion, optimizer, num_epochs, device, patience=5):    best_val_loss = float(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)    best_val_f1 = 0.0    epochs_without_improvement = 0    save_path = f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m/kaggle/working/model_\u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mdatetime.now().strftime(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124mY\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124mm\u001b[39m\u001b[38;5;132;01m%d\u001b[39;00m\u001b[38;5;124m_\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124mH\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124mM\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124mS\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)}.pth\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m        #scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=num_epochs, eta_min=1e-6)    scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmin\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, factor=0.1, patience=3, verbose=True)    scaler = GradScaler()    for epoch in range(num_epochs):        print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mEpoch \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mepoch+1}/\u001b[39m\u001b[38;5;132;01m{num_epochs}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)        # Train the model        train_loss, train_acc = train_model(model, train_loader, criterion, optimizer, device, scaler)        print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mTrain Loss: \u001b[39m\u001b[38;5;132;01m{train_loss:.4f}\u001b[39;00m\u001b[38;5;124m | Train Acc: \u001b[39m\u001b[38;5;132;01m{train_acc:.2f}\u001b[39;00m\u001b[38;5;124m%\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)        # Validate the model with additional metrics        val_loss, val_acc, precision, recall, f1, cm = validate_model_with_metrics(model, val_loader, criterion, device, scaler)        print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mValidation Loss: \u001b[39m\u001b[38;5;132;01m{val_loss:.4f}\u001b[39;00m\u001b[38;5;124m | Validation Acc: \u001b[39m\u001b[38;5;132;01m{val_acc:.2f}\u001b[39;00m\u001b[38;5;124m%\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)        print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mPrecision: \u001b[39m\u001b[38;5;132;01m{precision:.4f}\u001b[39;00m\u001b[38;5;124m | Recall: \u001b[39m\u001b[38;5;132;01m{recall:.4f}\u001b[39;00m\u001b[38;5;124m | F1-Score: \u001b[39m\u001b[38;5;132;01m{f1:.4f}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)        # Step with the scheduler        scheduler.step(val_loss)        # Check for improvement based on validation loss and F1-Score        if val_loss < best_val_loss or f1 > best_val_f1:            if val_loss < best_val_loss:                print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mValidation loss decreased (\u001b[39m\u001b[38;5;132;01m{best_val_loss:.4f}\u001b[39;00m\u001b[38;5;124m --> \u001b[39m\u001b[38;5;132;01m{val_loss:.4f}\u001b[39;00m\u001b[38;5;124m).\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)                best_val_loss = val_loss            if f1 > best_val_f1:                print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mF1-Score increased (\u001b[39m\u001b[38;5;132;01m{best_val_f1:.4f}\u001b[39;00m\u001b[38;5;124m --> \u001b[39m\u001b[38;5;132;01m{f1:.4f}\u001b[39;00m\u001b[38;5;124m).\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)                best_val_f1 = f1                        print(\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mSaving model...\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)            torch.save(model.state_dict(), save_path)            epochs_without_improvement = 0  # Reset counter        else:            epochs_without_improvement += 1            print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mNo improvement in validation metrics for \u001b[39m\u001b[38;5;132;01m{epochs_without_improvement}\u001b[39;00m\u001b[38;5;124m epochs.\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)                # Early stopping        if epochs_without_improvement >= patience:            print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mEarly stopping triggered after \u001b[39m\u001b[38;5;132;01m{patience}\u001b[39;00m\u001b[38;5;124m epochs without improvement.\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)            break    print(\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mTraining complete.\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)    print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mBest Validation Loss: \u001b[39m\u001b[38;5;132;01m{best_val_loss:.4f}\u001b[39;00m\u001b[38;5;124m | Best Validation F1-Score: \u001b[39m\u001b[38;5;132;01m{best_val_f1:.4f}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)    print(f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mBest model saved to: \u001b[39m\u001b[38;5;132;01m{save_path}\u001b[39;00m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)    return save_path# Example usageclass_weights = torch.tensor([1.0, 2.0, 4.0], device=device)  # Example weights for each class severityfocal_loss = torch.hub.load(    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124madeelh/pytorch-multi-class-focal-loss\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,    model=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mFocalLoss\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,    alpha=class_weights,    gamma=2,    reduction=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmean\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,    force_reload=False,    trust_repo=True)criterion = focal_loss#criterion = nn.CrossEntropyLoss(weight=class_weights)optimizer = torch.optim.AdamW(model.parameters(), lr=1e-4, weight_decay=1e-4)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m# Set the number of epochsnum_epochs = 25patience = 10saved_model_path = train_and_validate(model, train_loader, val_loader, criterion, optimizer, num_epochs, device, patience)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmarkdown\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m### Prepare test file for submission\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{}},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtest_df   = pd.read_csv(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_series_descriptions.csv\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)test_df\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mimport osimport pandas as pdfrom tqdm import tqdm# Define mappings from series descriptions to conditionscondition_mapping = \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mAxial T2\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mLeft Subarticular Stenosis\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mRight Subarticular Stenosis\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m],    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSagittal T1\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mRight Neural Foraminal Narrowing\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mLeft Neural Foraminal Narrowing\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSpinal Canal Stenosis\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m],    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSagittal T2/STIR\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSpinal Canal Stenosis\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]}# Define all possible levelslevels = [\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mL1/L2\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mL2/L3\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mL3/L4\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mL4/L5\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mL5/S1\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]# Initialize a list to store each row\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms featuresexpanded_features = []# Main path for test imagesmain_path = \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_images\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m# Iterate over each row in the test filefor idx, row in test_df.iterrows():    study_id = row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstudy_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]    series_id = row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseries_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]    series_description = row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseries_description\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]        # Define the directory path for the current study_id and series_id    dir_path = os.path.join(main_path, str(study_id), str(series_id))        # Check if the directory exists    if os.path.exists(dir_path):        # List all DICOM files (instances) in the directory        instance_files = [f for f in os.listdir(dir_path) if f.endswith(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.dcm\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)]                # Get instance numbers from the file names        instance_numbers = [int(f.split(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)[0]) for f in instance_files]                # Generate rows for each instance        for instance_number in instance_numbers:            # Get the conditions corresponding to the series description            applicable_conditions = condition_mapping[series_description]            # Generate combinations for each condition and level            for condition in condition_mapping[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mAxial T2\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] + condition_mapping[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSagittal T1\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] + condition_mapping[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSagittal T2/STIR\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]:                for level in levels:                    features = \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m                        \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstudy_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: study_id,                        \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseries_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: series_id,                        \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minstance_number\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: instance_number,                        \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mseries_description\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: series_description,                        \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: condition,                        \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: level                    }                    # Set True/False for the condition-level combination                    if condition in applicable_conditions:                        features[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mis_applicable\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] = True                    else:                        features[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mis_applicable\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] = False                    # Append features to the list                    expanded_features.append(features)# Convert to DataFrameexpanded_test_df = pd.DataFrame(expanded_features)# One-hot encode \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m and \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m columnsencoded_df = pd.get_dummies(expanded_test_df[[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]], prefix=[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m])# Concatenate the original DataFrame with the encoded columnsexpanded_test_df = pd.concat([expanded_test_df, encoded_df], axis=1)# Keep only rows where \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mis_applicable\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m is Trueexpanded_test_df = expanded_test_df[expanded_test_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mis_applicable\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]].reset_index(drop=True)# Generate the filepath for each rowdef generate_filepath(row):    file_path = f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;132;01m{main_path}\u001b[39;00m\u001b[38;5;124m/\u001b[39m\u001b[38;5;132;01m{row['study_id']}\u001b[39;00m\u001b[38;5;124m/\u001b[39m\u001b[38;5;132;01m{row['series_id']}\u001b[39;00m\u001b[38;5;124m/\u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mint(row[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124minstance_number\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m])}.dcm\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m    return file_path if os.path.exists(file_path) else None# Apply the filepath generation functionexpanded_test_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfilepath\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] = expanded_test_df.progress_apply(generate_filepath, axis=1)print(\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mExpanded Test DataFrame:\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)expanded_test_df\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexpanded_test_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].unique()\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m# Create the dataset and data loader for the test settest_dataset = CustomDataset(expanded_test_df, features_list, transform=val_trasform)test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)  # No shuffling for inference\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m# Initialize results storageresults = \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrow_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [],    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnormal_mild\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [],    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmoderate\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: [],    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msevere\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: []}# Display initial messagedisplay(\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mStarting inference on the test set...\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)# Use tqdm to create a progress bar for the test_loaderwith torch.no_grad():  # Disable gradient computation for inference    for batch_idx, (images, features) in enumerate(tqdm(test_loader, desc=\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124mProcessing batches\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m)):                # Move data to the appropriate device        images, features = images.to(device), features.to(device)        # Forward pass through the model        outputs = model(images, features)        # Get the predicted probabilities using softmax        probs = torch.softmax(outputs, dim=1)        # Iterate through the probabilities and corresponding rows in the batch        for i in range(len(probs)):            # Calculate the index in the DataFrame corresponding to this batch            df_index = batch_idx * test_loader.batch_size + i                        # Check if the index is within the bounds of the DataFrame            if df_index >= len(expanded_test_df):                continue  # Skip if index is out of bounds            # Extract study_id, condition, and level directly from the DataFrame            study_id = expanded_test_df.iloc[df_index][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstudy_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]            condition = expanded_test_df.iloc[df_index][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcondition\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]            level = expanded_test_df.iloc[df_index][\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]            # Generate row_id            row_id = f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;132;01m{study_id}\u001b[39;00m\u001b[38;5;124m_\u001b[39m\u001b[38;5;132;01m{condition}\u001b[39;00m\u001b[38;5;124m_\u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mlevel.replace(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m/\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)}\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m.lower().replace(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)            # Append results            results[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrow_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].append(row_id)            results[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnormal_mild\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].append(probs[i, 0].item())  # Probability for \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mNormal/Mild\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m            results[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmoderate\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].append(probs[i, 1].item())    # Probability for \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mModerate\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m            results[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msevere\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].append(probs[i, 2].item())      # Probability for \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSevere\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m# Convert the results to a DataFrameresults_df = pd.DataFrame(results)# Display the final resultsdisplay(results_df.head())\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mresults_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrow_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].unique()\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mimport pandas as pd# Define all possible conditions and levelsconditions = [    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mLeft Neural Foraminal Narrowing\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mLeft Subarticular Stenosis\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mRight Neural Foraminal Narrowing\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mRight Subarticular Stenosis\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,    \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSpinal Canal Stenosis\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]levels = [\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mL1/L2\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mL2/L3\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mL3/L4\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mL4/L5\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mL5/S1\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]# Function to check and generate missing combinationsdef ensure_complete_results(results_df):    # List to store new rows for missing combinations    new_rows = []        # Extract study_id from row_id by splitting on underscores    results_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstudy_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] = results_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrow_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].apply(lambda x: x.split(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)[0])    # Group by \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstudy_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to check each group separately    grouped = results_df.groupby(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstudy_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)        for study_id, group in grouped:        # Get current combinations for this study_id        current_combinations = set(group[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrow_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m])                # Generate all possible combinations for this study_id        all_combinations = \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m            f\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;132;01m{study_id}\u001b[39;00m\u001b[38;5;124m_\u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mcondition.lower().replace(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)}_\u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124mlevel.replace(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m/\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)}\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m.lower()            for condition in conditions            for level in levels        }                # Find missing combinations        missing_combinations = all_combinations - current_combinations                # Generate rows for missing combinations        for missing_row_id in missing_combinations:            # Extract condition and level from the missing row_id            condition = \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.join(missing_row_id.split(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)[1:-1])            level = missing_row_id.split(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)[-1].replace(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m/\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)                        # Create a new row with default or statistical values            new_row = \u001b[39m\u001b[38;5;124m{\u001b[39m\u001b[38;5;124m                \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrow_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: missing_row_id,                \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnormal_mild\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: 1/3,                  \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmoderate\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: 1/3,                \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msevere\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m: 1/3            }                        new_rows.append(new_row)    # Convert new rows to DataFrame    new_rows_df = pd.DataFrame(new_rows)    complete_results_df = pd.concat([results_df, new_rows_df], ignore_index=True)        return complete_results_df.sort_values(by=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrow_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m).reset_index(drop=True)results_df = ensure_complete_results(results_df)study_id_counts = results_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrow_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m].str.split(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m).str[0].value_counts()display(study_id_counts)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mresults_df.head()\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124maveraged_results_df = results_df[[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrow_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m,\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnormal_mild\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmoderate\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msevere\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]].groupby(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrow_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, as_index=False).mean()sum_probs = averaged_results_df[[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnormal_mild\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmoderate\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msevere\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]].sum(axis=1)# Normalize the columns so that each row sums to 1averaged_results_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnormal_mild\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] = averaged_results_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnormal_mild\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] / sum_probsaveraged_results_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmoderate\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] = averaged_results_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmoderate\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] / sum_probsaveraged_results_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msevere\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] = averaged_results_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msevere\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] / sum_probs# Verify that the sum of the three columns is 1 for each rowaveraged_results_df[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msum_check\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m] = averaged_results_df[[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnormal_mild\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmoderate\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msevere\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]].sum(axis=1).apply(lambda x: round(x,2))averaged_results_df\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfinal_df = averaged_results_df[[\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrow_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnormal_mild\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmoderate\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msevere\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m]]final_df\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfinal_df.to_csv(\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m/kaggle/working/submission.csv\u001b[39m\u001b[38;5;130;01m\\\"\u001b[39;00m\u001b[38;5;124m, index=False)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]},{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcell_type\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcode\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msource\u001b[39m\u001b[38;5;124m\"\u001b[39m:\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmetadata\u001b[39m\u001b[38;5;124m\"\u001b[39m:{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrusted\u001b[39m\u001b[38;5;124m\"\u001b[39m:true},\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexecution_count\u001b[39m\u001b[38;5;124m\"\u001b[39m:null,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutputs\u001b[39m\u001b[38;5;124m\"\u001b[39m:[]}]}\n","\u001b[0;31mNameError\u001b[0m: name 'true' is not defined"],"ename":"NameError","evalue":"name 'true' is not defined","output_type":"error"}],"execution_count":1},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}