{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"References:\nhttps://www.kaggle.com/ammarnassanalhajali/brain-tumor-3d-training","metadata":{}},{"cell_type":"markdown","source":"# **Import Libraries**","metadata":{}},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torchvision.transforms as transforms\nimport torch.nn.functional as F\nimport sklearn\nimport torchvision\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import LabelEncoder\nimport numpy as np\nimport pandas as pd\nimport os\nimport matplotlib.pyplot as plt\nimport PIL\nfrom PIL import Image\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\nimport seaborn as sns\nimport glob\nfrom pathlib import Path\nimport cv2\ntorch.manual_seed(1)\nnp.random.seed(1)\nimport re\nimport pydicom\nimport math\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:31.239769Z","iopub.execute_input":"2021-10-27T23:37:31.240129Z","iopub.status.idle":"2021-10-27T23:37:31.248857Z","shell.execute_reply.started":"2021-10-27T23:37:31.240096Z","shell.execute_reply":"2021-10-27T23:37:31.248013Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"IMAGE_SIZE = 256\nNUM_IMAGES = 64\nBATCH_SIZE= 4","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:31.250756Z","iopub.execute_input":"2021-10-27T23:37:31.251225Z","iopub.status.idle":"2021-10-27T23:37:31.267129Z","shell.execute_reply.started":"2021-10-27T23:37:31.251186Z","shell.execute_reply":"2021-10-27T23:37:31.266403Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Data Loading and Visualizations**","metadata":{}},{"cell_type":"code","source":"def loading_image(path, img_size=IMAGE_SIZE):\n    dicom = pydicom.read_file(path)\n    data = dicom.pixel_array\n    data = apply_voi_lut(dicom.pixel_array, dicom)\n    data = cv2.resize(data, (img_size, img_size))\n    return data","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:31.2683Z","iopub.execute_input":"2021-10-27T23:37:31.268643Z","iopub.status.idle":"2021-10-27T23:37:31.277693Z","shell.execute_reply.started":"2021-10-27T23:37:31.268607Z","shell.execute_reply":"2021-10-27T23:37:31.276868Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_3d_image(idx, mri_type, num_imgs=NUM_IMAGES, split='train'):\n    files = sorted(glob.glob(f\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/{split}/{idx}/{mri_type}/*.dcm\"), \n                   key=lambda var:[int(x) if x.isdigit() else x for x in re.findall(r'[^0-9]|[0-9]+', var)])\n    middle = int(len(files) / 2)\n    half_num_imgs = int(num_imgs / 2)\n    start = max(0, middle - half_num_imgs)\n    end = min(len(files) + 1, middle + half_num_imgs)\n#     for i, f in enumerate(files[start:end]):\n#         if i == 0:\n#             img3d = loading_image(f)\n#         else:\n#             img3d = np.stack([loading_image(f)])\n    arrays = [loading_image(f) for f in files[start:end]]\n#     print(arrays)\n    img3d = np.stack(arrays, axis=2)\n    \n    if img3d.shape[-1] < num_imgs:\n        n_zero = np.zeros((IMAGE_SIZE, IMAGE_SIZE, num_imgs - img3d.shape[-1]))\n        img3d = np.concatenate((img3d,  n_zero), axis=-1)\n        \n    if np.min(img3d) < np.max(img3d):\n        img3d = img3d - np.min(img3d)\n        img3d = img3d / np.max(img3d)\n\n    return img3d\n","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:31.278738Z","iopub.execute_input":"2021-10-27T23:37:31.27953Z","iopub.status.idle":"2021-10-27T23:37:31.294571Z","shell.execute_reply.started":"2021-10-27T23:37:31.279496Z","shell.execute_reply":"2021-10-27T23:37:31.293757Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Dicom Imgs took too much memory so switched to png dataset**","metadata":{}},{"cell_type":"code","source":"def load_png(path, img_size=IMAGE_SIZE):\n    img = Image.open(path)\n    img = np.array(img)\n    img = cv2.resize(img, (img_size, img_size))\n    \n    return img","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:31.296533Z","iopub.execute_input":"2021-10-27T23:37:31.296946Z","iopub.status.idle":"2021-10-27T23:37:31.30486Z","shell.execute_reply.started":"2021-10-27T23:37:31.296911Z","shell.execute_reply":"2021-10-27T23:37:31.30396Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_3d_png(idx, mri_type, num_imgs=NUM_IMAGES, split='train'):\n    files = sorted(glob.glob(f\"../input/rsna-miccai-png/{split}/{idx}/{mri_type}/*.png\"), \n                   key=lambda var:[int(x) if x.isdigit() else x for x in re.findall(r'[^0-9]|[0-9]+', var)])\n    middle = int(len(files) / 2)\n    half_num_imgs = int(num_imgs / 2)\n    start = max(0, middle - half_num_imgs)\n    end = min(len(files) + 1, middle + half_num_imgs)\n    arrays = [load_png(f) for f in files[start:end]]\n#     raise ValueError(idx)\n#     print(idx)\n#     print(len(arrays))\n    img3d = np.stack(arrays, axis=2)\n    \n    if img3d.shape[-1] < num_imgs:\n        n_zero = np.zeros((IMAGE_SIZE, IMAGE_SIZE, num_imgs - img3d.shape[-1]))\n        img3d = np.concatenate((img3d,  n_zero), axis=-1)\n\n    return img3d\n","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:31.306365Z","iopub.execute_input":"2021-10-27T23:37:31.306774Z","iopub.status.idle":"2021-10-27T23:37:31.316766Z","shell.execute_reply.started":"2021-10-27T23:37:31.306738Z","shell.execute_reply":"2021-10-27T23:37:31.315859Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_labels = pd.read_csv('../input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv')\n\ntrain_files = sorted(os.listdir('../input/rsna-miccai-png/train'))\n\ntrain_files = pd.Series(train_files, name='train_files')\ntrain_labels = pd.concat([train_labels, train_files], axis=1)\ntrain_labels","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:31.319285Z","iopub.execute_input":"2021-10-27T23:37:31.319566Z","iopub.status.idle":"2021-10-27T23:37:31.35382Z","shell.execute_reply.started":"2021-10-27T23:37:31.319524Z","shell.execute_reply":"2021-10-27T23:37:31.352964Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # 109 and 709 don't have flair images so for this dataset. \n# train_labels = train_labels[train_labels['BraTS21ID'] != 109]\n# train_labels = train_labels[train_labels['BraTS21ID'] != 709]","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:31.363105Z","iopub.execute_input":"2021-10-27T23:37:31.363347Z","iopub.status.idle":"2021-10-27T23:37:31.367275Z","shell.execute_reply.started":"2021-10-27T23:37:31.363298Z","shell.execute_reply":"2021-10-27T23:37:31.366492Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Check the class balance","metadata":{}},{"cell_type":"code","source":"train_labels['MGMT_value'].value_counts()\n\ntrain_labels[\"MGMT_value\"].value_counts().head(2).plot(kind = 'pie', autopct='%1.1f%%', figsize=(8, 8)).legend()","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:31.369449Z","iopub.execute_input":"2021-10-27T23:37:31.370182Z","iopub.status.idle":"2021-10-27T23:37:31.549466Z","shell.execute_reply.started":"2021-10-27T23:37:31.370136Z","shell.execute_reply":"2021-10-27T23:37:31.548707Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Fairly balanced train set.","metadata":{}},{"cell_type":"code","source":"test_data = pd.read_csv('../input/rsna-miccai-brain-tumor-radiogenomic-classification/sample_submission.csv')\ntest_ids = []\nfor f in test_data.itertuples():\n    test_ids.append(f[1])","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:31.550521Z","iopub.execute_input":"2021-10-27T23:37:31.551935Z","iopub.status.idle":"2021-10-27T23:37:31.559987Z","shell.execute_reply.started":"2021-10-27T23:37:31.551894Z","shell.execute_reply":"2021-10-27T23:37:31.559234Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"a = load_3d_png(\"00000\", \"FLAIR\")\nprint(a.shape)","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:31.561515Z","iopub.execute_input":"2021-10-27T23:37:31.561944Z","iopub.status.idle":"2021-10-27T23:37:31.818181Z","shell.execute_reply.started":"2021-10-27T23:37:31.561908Z","shell.execute_reply":"2021-10-27T23:37:31.8169Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(load_3d_png(\"00122\", \"FLAIR\")[:, :, 2], cmap='gray')","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:31.820354Z","iopub.execute_input":"2021-10-27T23:37:31.820691Z","iopub.status.idle":"2021-10-27T23:37:32.118742Z","shell.execute_reply.started":"2021-10-27T23:37:31.820652Z","shell.execute_reply":"2021-10-27T23:37:32.118068Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Dataset and DataLoader**","metadata":{}},{"cell_type":"code","source":"class TumorDataset(torch.utils.data.Dataset):\n    def __init__(self, df=train_labels, transform=transforms.Compose([transforms.ToTensor()]), mri_type=\"FLAIR\", train=True):\n        self.df = df\n        self.transform = transform\n        self.type = mri_type\n        self.train = train\n        \n    \n    def __len__(self):\n        return len(self.df)\n    \n    def __getitem__(self, idx):\n            if self.train == True:\n                patient_id = self.df.iloc[idx, 2]\n                \n                image = load_3d_png(str(patient_id), self.type)\n                image = self.transform(image)\n                image = image[None, :, :, :]\n                label = self.df.iloc[idx, 1]\n                label = torch.tensor(label)\n                \n                return image, label\n            \n            else:\n                patient_id = self.df[idx]\n                patient_id = str(patient_id)\n                for i in range(5 - len(patient_id)):\n                    patient_id = '0' + patient_id\n                \n                \n                image = load_3d_image(patient_id, self.type, split='test')\n                image = self.transform(image)\n                image = image[None, :, :, :]\n                \n                return image, idx","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:32.119919Z","iopub.execute_input":"2021-10-27T23:37:32.120158Z","iopub.status.idle":"2021-10-27T23:37:32.131365Z","shell.execute_reply.started":"2021-10-27T23:37:32.120125Z","shell.execute_reply":"2021-10-27T23:37:32.130728Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = TumorDataset()\ntest_dataset = TumorDataset(df=test_ids, train=False)","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:32.132841Z","iopub.execute_input":"2021-10-27T23:37:32.133097Z","iopub.status.idle":"2021-10-27T23:37:32.145682Z","shell.execute_reply.started":"2021-10-27T23:37:32.133061Z","shell.execute_reply":"2021-10-27T23:37:32.145006Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=BATCH_SIZE, num_workers=4)\ntest_loader = torch.utils.data.DataLoader(test_dataset, batch_size=BATCH_SIZE, num_workers=4)","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:32.147516Z","iopub.execute_input":"2021-10-27T23:37:32.147808Z","iopub.status.idle":"2021-10-27T23:37:32.156243Z","shell.execute_reply.started":"2021-10-27T23:37:32.14776Z","shell.execute_reply":"2021-10-27T23:37:32.155289Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\ndevice","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:32.157213Z","iopub.execute_input":"2021-10-27T23:37:32.157407Z","iopub.status.idle":"2021-10-27T23:37:32.167442Z","shell.execute_reply.started":"2021-10-27T23:37:32.157384Z","shell.execute_reply":"2021-10-27T23:37:32.166714Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Simple Model Architecture**","metadata":{}},{"cell_type":"code","source":"class ThreeDNetwork(nn.Module):\n    \n    # Set up the layers\n    def conv_layer(self, in_channels, out_channels, kernel_size, stride=2):\n        conv_layer = nn.Sequential(\n            nn.Conv3d(in_channels, out_channels, kernel_size, stride=stride),\n            nn.LeakyReLU(),\n            nn.MaxPool3d((2, 2, 2)),\n            nn.BatchNorm3d(out_channels))\n        return conv_layer\n    \n    def __init__(self, batch_size=BATCH_SIZE):\n        super(ThreeDNetwork, self).__init__()\n        self.batch_size = batch_size\n        self.block1 = nn.Sequential(\n            self.conv_layer(1, 64, 3, 2),\n            self.conv_layer(64, 128, 3, 2))\n        \n        self.fc = nn.Sequential(\n            nn.Linear(86400, 1024),\n            nn.LeakyReLU(),\n            nn.BatchNorm1d(1024),\n            nn.Dropout(0.2),\n            nn.Linear(1024, 1))\n        \n    def forward(self, x):\n        x = self.block1(x)\n        x = x.view(-1, 86400)\n        x = self.fc(x)\n        return x","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:32.168647Z","iopub.execute_input":"2021-10-27T23:37:32.169017Z","iopub.status.idle":"2021-10-27T23:37:32.180209Z","shell.execute_reply.started":"2021-10-27T23:37:32.168985Z","shell.execute_reply":"2021-10-27T23:37:32.179501Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = ThreeDNetwork()","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:32.181446Z","iopub.execute_input":"2021-10-27T23:37:32.181788Z","iopub.status.idle":"2021-10-27T23:37:32.842878Z","shell.execute_reply.started":"2021-10-27T23:37:32.181754Z","shell.execute_reply":"2021-10-27T23:37:32.842094Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(model)","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:32.844178Z","iopub.execute_input":"2021-10-27T23:37:32.844453Z","iopub.status.idle":"2021-10-27T23:37:32.850558Z","shell.execute_reply.started":"2021-10-27T23:37:32.844416Z","shell.execute_reply":"2021-10-27T23:37:32.849766Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Training**","metadata":{}},{"cell_type":"code","source":"# optimizer\n# Adam: adaptive momemtum optimization\noptimizer = torch.optim.Adam(model.parameters(), lr=0.001)\n\n# Creates a criterion that measures the Binary Cross Entropy between the target and the input probabilities\ntrain_criterion = nn.BCELoss()\n\n# decrease the learning rate when a metric has stopped improving\nlr_scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, factor=0.1, patience=4, cooldown=2, verbose=True)\n\n\n# train the data\nmodel = model.to(device)\ntrain_criterion = train_criterion.to(device)\n\n# # helper\n# def one_hot(arr):\n#     return [[1, 0] if a_i == 0 else [0, 1] for a_i in arr]","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:32.851771Z","iopub.execute_input":"2021-10-27T23:37:32.852203Z","iopub.status.idle":"2021-10-27T23:37:32.955095Z","shell.execute_reply.started":"2021-10-27T23:37:32.85216Z","shell.execute_reply":"2021-10-27T23:37:32.954353Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs = 3\n\ntotal_train_loss = []\nbest_train_loss = np.Inf\n\nfor epoch in range(epochs): \n    print('Epoch: ', epoch + 1)\n    train_loss = []\n    train_correct = 0\n    train_total = 0\n    for image, target in train_loader:\n        optimizer.zero_grad()\n        new_target = []\n        for element in target:\n            new_target.append([element])\n        new_target = torch.tensor(new_target, dtype=torch.float)\n        image = image.float()\n        image, new_target = image.to(device), new_target.to(device)\n        output = model(image)\n        output = nn.Sigmoid()(output)\n        loss = train_criterion(output, new_target)\n        loss.backward()\n        optimizer.step()\n        train_loss.append(loss.item())\n            \n    epoch_train_loss = np.mean(train_loss)\n    print(f'Epoch {epoch + 1}, train loss: {epoch_train_loss:.4f}')\n    \n    if epoch_train_loss < best_train_loss:\n        torch.save(model.state_dict(), 'tumor.pth')\n        print('Model improved. Saving model.')\n        best_train_loss = epoch_train_loss\n        \n    lr_scheduler.step(epoch_train_loss)\n    total_train_loss.append(epoch_train_loss)","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:32.958262Z","iopub.execute_input":"2021-10-27T23:37:32.95846Z","iopub.status.idle":"2021-10-27T23:37:43.402499Z","shell.execute_reply.started":"2021-10-27T23:37:32.958436Z","shell.execute_reply":"2021-10-27T23:37:43.378091Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"total_train_loss\nep_list = list(range(1, epochs+1))\nplt.plot(ep_list,total_train_loss)\nplt.title(\"Train loss\")\nplt.xlabel(\"epoch\")\nplt.ylabel(\"Train loss value\")","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:43.41061Z","iopub.status.idle":"2021-10-27T23:37:43.418187Z","shell.execute_reply.started":"2021-10-27T23:37:43.41787Z","shell.execute_reply":"2021-10-27T23:37:43.417911Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Evaluation","metadata":{}},{"cell_type":"code","source":"def rounding(num):\n    return math.floor(num + 0.5)","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:43.438117Z","iopub.status.idle":"2021-10-27T23:37:43.446171Z","shell.execute_reply.started":"2021-10-27T23:37:43.44586Z","shell.execute_reply":"2021-10-27T23:37:43.445896Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.load_state_dict(torch.load('tumor.pth'))","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:43.464759Z","iopub.status.idle":"2021-10-27T23:37:43.474179Z","shell.execute_reply.started":"2021-10-27T23:37:43.473862Z","shell.execute_reply":"2021-10-27T23:37:43.473898Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"correct = 0\ntotal = 0\ny_test = []\ny_pred = []\nwith torch.no_grad():\n    model.eval()\n    for image, target in train_loader:\n        new_target = []\n        for element in target:\n            new_target.append([element])\n            y_test.append([element])\n        #A torch.Tensor is a multi-dimensional matrix containing elements of a single data type.\n        new_target = torch.tensor(new_target, dtype=torch.int)\n        image = image.float()\n        image, new_target = image.to(device), new_target.to(device)\n        output = model(image)\n        output = nn.Sigmoid()(output)\n        predicted = []\n        for element in output:\n            predicted.append([rounding(element)])\n            y_pred.append([rounding(element)])\n        predicted = torch.tensor(predicted, dtype=torch.int)\n        predicted = predicted.to(device)\n        total += BATCH_SIZE\n        \n        num_correct = 0\n        for i, element in enumerate(predicted):\n            if element == new_target[i]:\n                num_correct += 1\n                \n        correct += num_correct\n\nprint('Train Accuracy: %d %%' % (100 * correct / total))","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:43.485774Z","iopub.status.idle":"2021-10-27T23:37:43.495187Z","shell.execute_reply.started":"2021-10-27T23:37:43.49487Z","shell.execute_reply":"2021-10-27T23:37:43.494907Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import classification_report\n\nprint(\"Final result of the model\\n{}\".format(classification_report(y_test,y_pred)))","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:43.503575Z","iopub.status.idle":"2021-10-27T23:37:43.504081Z","shell.execute_reply.started":"2021-10-27T23:37:43.503769Z","shell.execute_reply":"2021-10-27T23:37:43.503827Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix,ConfusionMatrixDisplay\ncm = confusion_matrix(y_train,y_pred)\n\ndisp = ConfusionMatrixDisplay(confusion_matrix=cm)\ndisp.plot()","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:43.512564Z","iopub.status.idle":"2021-10-27T23:37:43.519522Z","shell.execute_reply.started":"2021-10-27T23:37:43.519194Z","shell.execute_reply":"2021-10-27T23:37:43.519232Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Inference**","metadata":{}},{"cell_type":"code","source":"id_series = []\nmgmt_series = []\n\nwith torch.no_grad():\n    for image, idx in test_loader:\n        image = image.float()\n        image = image.to(device)\n        output = model(image)\n        output = nn.Sigmoid()(output)\n        for element in output:\n            for el in element.cpu().numpy():\n                mgmt_series.append(float(math.trunc(el * 10000) / 10000.0))\n        idx = idx.tolist()\n        for element in idx:\n            id_series.append(element)","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:43.52602Z","iopub.status.idle":"2021-10-27T23:37:43.532213Z","shell.execute_reply.started":"2021-10-27T23:37:43.531896Z","shell.execute_reply":"2021-10-27T23:37:43.531944Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"brats_id_series = []\nfor idx in id_series:\n    brats_id_series.append(int(test_ids[idx]))","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:43.536151Z","iopub.status.idle":"2021-10-27T23:37:43.536621Z","shell.execute_reply.started":"2021-10-27T23:37:43.536367Z","shell.execute_reply":"2021-10-27T23:37:43.536394Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"brats_id_series = pd.Series(brats_id_series, name='BraTS21ID')\nmgmt_series = pd.Series(mgmt_series, name='MGMT_value')\ntest_preds = pd.concat([brats_id_series, mgmt_series], axis=1)","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:43.55214Z","iopub.status.idle":"2021-10-27T23:37:43.562742Z","shell.execute_reply.started":"2021-10-27T23:37:43.562419Z","shell.execute_reply":"2021-10-27T23:37:43.562454Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# prediction = pd.concat([x.set_index('BraTS21ID') for x in brats_id_series], axis=1).mean(axis=1)\n# prediction = pd.DataFrame(prediction, columns=['MGMT_value']).reset_index()\n# prediction.to_csv('submission.csv',index=False)","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:43.569708Z","iopub.status.idle":"2021-10-27T23:37:43.571123Z","shell.execute_reply.started":"2021-10-27T23:37:43.570855Z","shell.execute_reply":"2021-10-27T23:37:43.570884Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_preds.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:43.577684Z","iopub.status.idle":"2021-10-27T23:37:43.588166Z","shell.execute_reply.started":"2021-10-27T23:37:43.587858Z","shell.execute_reply":"2021-10-27T23:37:43.587891Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_preds","metadata":{"execution":{"iopub.status.busy":"2021-10-27T23:37:43.593647Z","iopub.status.idle":"2021-10-27T23:37:43.601145Z","shell.execute_reply.started":"2021-10-27T23:37:43.600859Z","shell.execute_reply":"2021-10-27T23:37:43.600892Z"},"trusted":true},"execution_count":null,"outputs":[]}]}