{"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":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-10-08T20:20:03.894116Z","iopub.execute_input":"2023-10-08T20:20:03.894484Z","iopub.status.idle":"2023-10-08T20:20:04.460247Z","shell.execute_reply.started":"2023-10-08T20:20:03.894455Z","shell.execute_reply":"2023-10-08T20:20:04.459254Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# About Data\n- There is no image for tma==True","metadata":{}},{"cell_type":"code","source":"import pandas as pd \nimport os\nimport matplotlib.pyplot as plt\nimport cv2\nimport numpy as np\n\n\nfrom sklearn.preprocessing import LabelEncoder\nimport tensorflow as tf\nfrom tensorflow.keras.layers import Dense,Conv2D,MaxPooling2D,BatchNormalization,Flatten,Dropout\nfrom tensorflow.keras.models import Sequential\nfrom sklearn.metrics import accuracy_score,confusion_matrix,classification_report\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.model_selection import StratifiedKFold\nfrom imblearn.over_sampling import SMOTE\nfrom imblearn.under_sampling import RandomUnderSampler\nfrom imblearn.pipeline import Pipeline","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2023-10-08T20:26:34.433679Z","iopub.execute_input":"2023-10-08T20:26:34.43409Z","iopub.status.idle":"2023-10-08T20:26:34.935111Z","shell.execute_reply.started":"2023-10-08T20:26:34.434057Z","shell.execute_reply":"2023-10-08T20:26:34.934069Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train=pd.read_csv(\"/kaggle/input/UBC-OCEAN/train.csv\")","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:20:12.662165Z","iopub.execute_input":"2023-10-08T20:20:12.662677Z","iopub.status.idle":"2023-10-08T20:20:12.86335Z","shell.execute_reply.started":"2023-10-08T20:20:12.662652Z","shell.execute_reply":"2023-10-08T20:20:12.862188Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# test image in high resolution\nimg=cv2.imread(\"/kaggle/input/UBC-OCEAN/test_images/41.png\")\nplt.figure(figsize=(8,8))\nplt.imshow(img);","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:20:12.864569Z","iopub.execute_input":"2023-10-08T20:20:12.864872Z","iopub.status.idle":"2023-10-08T20:21:20.567555Z","shell.execute_reply.started":"2023-10-08T20:20:12.864833Z","shell.execute_reply":"2023-10-08T20:21:20.566589Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#  test_thumbnails\nimg=cv2.imread(\"/kaggle/input/UBC-OCEAN/test_thumbnails/41_thumbnail.png\")\nplt.figure(figsize=(8,8))\nplt.imshow(img)","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:21:20.570942Z","iopub.execute_input":"2023-10-08T20:21:20.571636Z","iopub.status.idle":"2023-10-08T20:21:22.059774Z","shell.execute_reply.started":"2023-10-08T20:21:20.571597Z","shell.execute_reply":"2023-10-08T20:21:22.058674Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:21:22.061326Z","iopub.execute_input":"2023-10-08T20:21:22.061689Z","iopub.status.idle":"2023-10-08T20:21:22.087647Z","shell.execute_reply.started":"2023-10-08T20:21:22.061657Z","shell.execute_reply":"2023-10-08T20:21:22.086742Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Explatory Data Analysis","metadata":{}},{"cell_type":"code","source":"ax=train.label.value_counts().plot.barh()\nax.bar_label(ax.containers[0])\nplt.title(\"Distribution of Labels\\n\",fontweight=\"bold\");","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:21:22.088995Z","iopub.execute_input":"2023-10-08T20:21:22.089268Z","iopub.status.idle":"2023-10-08T20:21:22.342786Z","shell.execute_reply.started":"2023-10-08T20:21:22.089246Z","shell.execute_reply":"2023-10-08T20:21:22.341815Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.label.value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:21:22.343974Z","iopub.execute_input":"2023-10-08T20:21:22.344591Z","iopub.status.idle":"2023-10-08T20:21:22.352263Z","shell.execute_reply.started":"2023-10-08T20:21:22.344566Z","shell.execute_reply":"2023-10-08T20:21:22.351186Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.pie(train.label.value_counts(),labels=[\"HGSC\",\"EC\",\"CC\",\"LGSC\",\"MC\"],labeldistance=1.1,autopct='%.1f%%');","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:21:22.353458Z","iopub.execute_input":"2023-10-08T20:21:22.353746Z","iopub.status.idle":"2023-10-08T20:21:22.487645Z","shell.execute_reply.started":"2023-10-08T20:21:22.353722Z","shell.execute_reply":"2023-10-08T20:21:22.486386Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.groupby(\"label\")[\"is_tma\"].value_counts().plot.barh(color=[\"red\",\"green\"]);","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:21:22.489351Z","iopub.execute_input":"2023-10-08T20:21:22.48984Z","iopub.status.idle":"2023-10-08T20:21:22.758017Z","shell.execute_reply.started":"2023-10-08T20:21:22.489802Z","shell.execute_reply":"2023-10-08T20:21:22.756925Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train[\"is_tma\"].value_counts().plot(kind=\"barh\");","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:21:22.759817Z","iopub.execute_input":"2023-10-08T20:21:22.760252Z","iopub.status.idle":"2023-10-08T20:21:22.950788Z","shell.execute_reply.started":"2023-10-08T20:21:22.760216Z","shell.execute_reply":"2023-10-08T20:21:22.949798Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(cv2.imread(\"/kaggle/input/UBC-OCEAN/train_thumbnails/\"+str(train.image_id.iloc[0])+\"_thumbnail.png\"))","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:21:22.95241Z","iopub.execute_input":"2023-10-08T20:21:22.953072Z","iopub.status.idle":"2023-10-08T20:21:24.8281Z","shell.execute_reply.started":"2023-10-08T20:21:22.953035Z","shell.execute_reply":"2023-10-08T20:21:24.827081Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"HGSC=train[train[\"label\"]==\"HGSC\"]\nEC=train[train[\"label\"]==\"EC\"]\nCC=train[train[\"label\"]==\"CC\"]\nLGSC=train[train[\"label\"]==\"LGSC\"]\nMC=train[train[\"label\"]==\"MC\"]","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:21:24.829533Z","iopub.execute_input":"2023-10-08T20:21:24.830156Z","iopub.status.idle":"2023-10-08T20:21:24.837625Z","shell.execute_reply.started":"2023-10-08T20:21:24.830124Z","shell.execute_reply":"2023-10-08T20:21:24.836822Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Compare non-tma images with tma images\nn_rows=5\nn_cols=2\nfig,axs=plt.subplots(n_rows,n_cols,figsize=(15,15),layout=\"tight\")\n\nlabels=[HGSC,EC,CC,LGSC,MC]\n\nfor i,lab in enumerate(labels):\n    axs[i,0].set_title(lab.label.iloc[0])\n    axs[i,0].axis(\"off\")\n    axs[i,0].imshow(cv2.imread(\"/kaggle/input/UBC-OCEAN/train_thumbnails/\"+str(lab.image_id.iloc[0])+\"_thumbnail.png\"))\n    \n    axs[i,1].set_title(lab.label.iloc[0]+\" gray\")\n    axs[i,1].axis(\"off\")\n    axs[i,1].imshow(cv2.imread(\"/kaggle/input/UBC-OCEAN/train_thumbnails/\"+str(lab.image_id.iloc[0])+\"_thumbnail.png\",0))\n        \n    i+=1\n","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:21:24.841804Z","iopub.execute_input":"2023-10-08T20:21:24.842195Z","iopub.status.idle":"2023-10-08T20:21:36.291502Z","shell.execute_reply.started":"2023-10-08T20:21:24.842169Z","shell.execute_reply":"2023-10-08T20:21:36.290446Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Preprocessing","metadata":{}},{"cell_type":"code","source":"# Before storing the images, drop the outliers which don't exist in train.csv\ntma=train[train[\"is_tma\"]==True]\nlen(tma)","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:21:36.292985Z","iopub.execute_input":"2023-10-08T20:21:36.293795Z","iopub.status.idle":"2023-10-08T20:21:36.301455Z","shell.execute_reply.started":"2023-10-08T20:21:36.293758Z","shell.execute_reply":"2023-10-08T20:21:36.300512Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Drop tma rows. Because there is no image for them\ntrain=train.drop(tma.index)","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:21:36.302689Z","iopub.execute_input":"2023-10-08T20:21:36.303004Z","iopub.status.idle":"2023-10-08T20:21:36.318832Z","shell.execute_reply.started":"2023-10-08T20:21:36.302973Z","shell.execute_reply":"2023-10-08T20:21:36.317921Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Now image shape and train.csv shape are the same\ntrain.shape","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:21:36.320251Z","iopub.execute_input":"2023-10-08T20:21:36.320533Z","iopub.status.idle":"2023-10-08T20:21:36.330681Z","shell.execute_reply.started":"2023-10-08T20:21:36.320508Z","shell.execute_reply":"2023-10-08T20:21:36.329899Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# We must store them based on the train.csv data\ntrain_images=[]    \n\nfor id in train.image_id:\n    img=cv2.imread(\"/kaggle/input/UBC-OCEAN/train_thumbnails/\"+str(id)+\"_thumbnail.png\",0)  # makes it gray\n    img=cv2.resize(img,(100,100))     #scaling\n    train_images.append(img)","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:21:36.331901Z","iopub.execute_input":"2023-10-08T20:21:36.332353Z","iopub.status.idle":"2023-10-08T20:23:20.869007Z","shell.execute_reply.started":"2023-10-08T20:21:36.332327Z","shell.execute_reply":"2023-10-08T20:23:20.867881Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Convert the labels to numbers with LabelEncoder\nle=LabelEncoder()\ny=le.fit_transform(train.label)\ny","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:23:20.870423Z","iopub.execute_input":"2023-10-08T20:23:20.870755Z","iopub.status.idle":"2023-10-08T20:23:20.878696Z","shell.execute_reply.started":"2023-10-08T20:23:20.870729Z","shell.execute_reply":"2023-10-08T20:23:20.877722Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"le.classes_","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:23:20.880309Z","iopub.execute_input":"2023-10-08T20:23:20.880679Z","iopub.status.idle":"2023-10-08T20:23:20.89489Z","shell.execute_reply.started":"2023-10-08T20:23:20.880646Z","shell.execute_reply":"2023-10-08T20:23:20.89378Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Rescale the images\nX=np.array(train_images)/255","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:23:20.896263Z","iopub.execute_input":"2023-10-08T20:23:20.896535Z","iopub.status.idle":"2023-10-08T20:23:20.914214Z","shell.execute_reply.started":"2023-10-08T20:23:20.896512Z","shell.execute_reply":"2023-10-08T20:23:20.913203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(X.shape,y.shape)","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:23:20.915454Z","iopub.execute_input":"2023-10-08T20:23:20.915772Z","iopub.status.idle":"2023-10-08T20:23:20.92156Z","shell.execute_reply.started":"2023-10-08T20:23:20.915746Z","shell.execute_reply":"2023-10-08T20:23:20.920538Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=42,test_size=.25)","metadata":{"jupyter":{"source_hidden":true},"execution":{"iopub.status.busy":"2023-10-08T20:23:20.922818Z","iopub.execute_input":"2023-10-08T20:23:20.923107Z","iopub.status.idle":"2023-10-08T20:23:20.933477Z","shell.execute_reply.started":"2023-10-08T20:23:20.923085Z","shell.execute_reply":"2023-10-08T20:23:20.932593Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Modelling","metadata":{}},{"cell_type":"code","source":"skf=StratifiedKFold(n_splits=4) #it is used for oversampled data","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:23:20.934527Z","iopub.execute_input":"2023-10-08T20:23:20.93538Z","iopub.status.idle":"2023-10-08T20:23:20.945423Z","shell.execute_reply.started":"2023-10-08T20:23:20.935353Z","shell.execute_reply":"2023-10-08T20:23:20.944535Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model=Sequential()\n#model.add(InputLayer(input_shape=(train_images.shape[1],train_images.shape[2]),1)))\nmodel.add(Conv2D(filters=12,kernel_size=(3,3),activation=\"relu\",input_shape=(X.shape[1],X.shape[2],1)))\n#model.add(BatchNormalization())\nmodel.add(Dropout(.2))\nmodel.add(Conv2D(24,(3,3),activation=\"relu\"))\nmodel.add(MaxPooling2D(pool_size=(2,2)))\nmodel.add(Dropout(.2))\nmodel.add(Flatten())\nmodel.add(Dense(20,activation=\"relu\"))\nmodel.add(Dense(5,\"sigmoid\"))\nmodel.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n              optimizer=\"adam\",metrics=\"accuracy\")","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:51:06.399691Z","iopub.execute_input":"2023-10-08T20:51:06.400052Z","iopub.status.idle":"2023-10-08T20:51:06.479773Z","shell.execute_reply.started":"2023-10-08T20:51:06.400023Z","shell.execute_reply":"2023-10-08T20:51:06.478904Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:51:06.929359Z","iopub.execute_input":"2023-10-08T20:51:06.929719Z","iopub.status.idle":"2023-10-08T20:51:06.954732Z","shell.execute_reply.started":"2023-10-08T20:51:06.92969Z","shell.execute_reply":"2023-10-08T20:51:06.953742Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#history=model.fit(X_train,y_train,batch_size=10,validation_data=(X_test,y_test),epochs=7,verbose=1)\n","metadata":{"jupyter":{"source_hidden":true},"execution":{"iopub.status.busy":"2023-10-08T20:23:21.225209Z","iopub.execute_input":"2023-10-08T20:23:21.226227Z","iopub.status.idle":"2023-10-08T20:23:21.230732Z","shell.execute_reply.started":"2023-10-08T20:23:21.226189Z","shell.execute_reply":"2023-10-08T20:23:21.229666Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs=6\nbatch_size=5\nhistoricals=np.zeros((skf.get_n_splits(),2))\nfor fold,(train_ind,val_ind) in enumerate(skf.split(X,y)):\n    X_train=X[train_ind]  #Even they are images we can take the exact indices\n    y_train=y[train_ind]\n    X_val=X[val_ind]    #The same with validation data \n    y_val=y[val_ind]\n    \n    history=model.fit(X_train,y_train,batch_size=batch_size,validation_data=(X_val,y_val),epochs=epochs,verbose=1)\n    \n    print(\"Evaluation Session :\")\n    loss,acc=model.evaluate(X_val,y_val)\n    historicals[fold]+=[loss,acc]\n    print(\"\\n\")\n    print(f\"In {fold+1}th fold, the evaluation scores are :\\nloss : {loss*100:.2f}%\\naccuracy : {acc*100:.2f}%\")\n    print(\"\\n\")\n    #historicals[fold]+=(loss,acc)\nprint(\"DONE...!\")\n    \n #   plt.plot(historicals)\n#plt.title(\"Validation Scores\\n\",weight = 'bold',fontsize=10)\n#plt.xlabel(\"Folds\")\n#plt.ylabel(\"Scores\")\n#plt.legend([\"Loss\",\"Accuracy\"],loc=\"upper left\")\n#plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:51:23.685833Z","iopub.execute_input":"2023-10-08T20:51:23.686263Z","iopub.status.idle":"2023-10-08T20:53:16.644979Z","shell.execute_reply.started":"2023-10-08T20:51:23.686235Z","shell.execute_reply":"2023-10-08T20:53:16.644172Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(f\"Model score is {acc*100:.2f}%\")","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:53:26.580899Z","iopub.execute_input":"2023-10-08T20:53:26.581282Z","iopub.status.idle":"2023-10-08T20:53:26.586806Z","shell.execute_reply.started":"2023-10-08T20:53:26.581252Z","shell.execute_reply":"2023-10-08T20:53:26.585837Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission","metadata":{}},{"cell_type":"code","source":"# We store our prediction based on test.csv\ntest=pd.read_csv(\"/kaggle/input/UBC-OCEAN/test.csv\")\ntest","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:53:32.947434Z","iopub.execute_input":"2023-10-08T20:53:32.947777Z","iopub.status.idle":"2023-10-08T20:53:32.962937Z","shell.execute_reply.started":"2023-10-08T20:53:32.94775Z","shell.execute_reply":"2023-10-08T20:53:32.961986Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds=[]\n\nfor id in test.image_id:\n    img=cv2.imread(\"/kaggle/input/UBC-OCEAN/test_thumbnails/\"+str(id)+\"_thumbnail.png\",0) \n    img=cv2.resize(img,(100,100))  \n    img=np.reshape(img,(1,100,100)) # transforms that our model accepts\n    pred=np.argmax(model.predict(img),axis=-1) # regard last dimension \n    label=le.inverse_transform([pred])[0]  # get label back\n    preds.append((id,label))","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:53:47.607207Z","iopub.execute_input":"2023-10-08T20:53:47.607594Z","iopub.status.idle":"2023-10-08T20:53:47.992997Z","shell.execute_reply.started":"2023-10-08T20:53:47.607563Z","shell.execute_reply":"2023-10-08T20:53:47.992126Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds=pd.DataFrame(preds,columns=[\"image_id\",\"label\"])\npreds","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:53:54.68071Z","iopub.execute_input":"2023-10-08T20:53:54.681065Z","iopub.status.idle":"2023-10-08T20:53:54.690649Z","shell.execute_reply.started":"2023-10-08T20:53:54.681039Z","shell.execute_reply":"2023-10-08T20:53:54.689582Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds.index=preds[\"image_id\"]\npreds=preds.drop(\"image_id\",axis=1)","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:53:55.958715Z","iopub.execute_input":"2023-10-08T20:53:55.959402Z","iopub.status.idle":"2023-10-08T20:53:55.966571Z","shell.execute_reply.started":"2023-10-08T20:53:55.959371Z","shell.execute_reply":"2023-10-08T20:53:55.965397Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds.to_csv(\"submission.csv\",header=True)","metadata":{"execution":{"iopub.status.busy":"2023-10-08T20:53:58.763039Z","iopub.execute_input":"2023-10-08T20:53:58.763386Z","iopub.status.idle":"2023-10-08T20:53:58.77122Z","shell.execute_reply.started":"2023-10-08T20:53:58.763359Z","shell.execute_reply":"2023-10-08T20:53:58.770243Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}