{"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","_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-12-06T11:52:32.41024Z","iopub.execute_input":"2022-12-06T11:52:32.410755Z","iopub.status.idle":"2022-12-06T11:52:42.28973Z","shell.execute_reply.started":"2022-12-06T11:52:32.410711Z","shell.execute_reply":"2022-12-06T11:52:42.288403Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Import libraries","metadata":{}},{"cell_type":"code","source":"import plotly.express as px\nimport plotly.graph_objects as go\nfrom plotly.subplots import make_subplots\nimport matplotlib.pyplot as plt\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-12-06T11:35:36.903027Z","iopub.execute_input":"2022-12-06T11:35:36.903496Z","iopub.status.idle":"2022-12-06T11:35:38.25242Z","shell.execute_reply.started":"2022-12-06T11:35:36.903453Z","shell.execute_reply":"2022-12-06T11:35:38.251537Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Reading and exploring csv data","metadata":{}},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/rsna-breast-cancer-detection/train.csv')\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:35:41.028021Z","iopub.execute_input":"2022-12-06T11:35:41.028551Z","iopub.status.idle":"2022-12-06T11:35:41.179959Z","shell.execute_reply.started":"2022-12-06T11:35:41.0285Z","shell.execute_reply":"2022-12-06T11:35:41.178752Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.info()","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:35:41.463584Z","iopub.execute_input":"2022-12-06T11:35:41.464019Z","iopub.status.idle":"2022-12-06T11:35:41.500559Z","shell.execute_reply.started":"2022-12-06T11:35:41.463982Z","shell.execute_reply":"2022-12-06T11:35:41.499275Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.isnull().sum()","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:35:41.920993Z","iopub.execute_input":"2022-12-06T11:35:41.922266Z","iopub.status.idle":"2022-12-06T11:35:41.939621Z","shell.execute_reply.started":"2022-12-06T11:35:41.922213Z","shell.execute_reply":"2022-12-06T11:35:41.938416Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"4\">Overall there are 54706 entries in train.csv file. <br>\n<br>3 columns have missing values: age - 37, BIRADS - 28420, density - 25236. </font>","metadata":{}},{"cell_type":"code","source":"train_df['site_id'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:35:42.867635Z","iopub.execute_input":"2022-12-06T11:35:42.868971Z","iopub.status.idle":"2022-12-06T11:35:42.878283Z","shell.execute_reply.started":"2022-12-06T11:35:42.868921Z","shell.execute_reply":"2022-12-06T11:35:42.877392Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"4\">Images come from 2 source hospitals.</font>","metadata":{}},{"cell_type":"code","source":"frequency_table = train_df['patient_id'].value_counts().rename_axis('unique_values').reset_index(name='counts')\nfrequency_table.info()","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:35:43.923785Z","iopub.execute_input":"2022-12-06T11:35:43.924884Z","iopub.status.idle":"2022-12-06T11:35:43.941361Z","shell.execute_reply.started":"2022-12-06T11:35:43.924839Z","shell.execute_reply":"2022-12-06T11:35:43.940474Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"frequency_table","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:35:44.466013Z","iopub.execute_input":"2022-12-06T11:35:44.466645Z","iopub.status.idle":"2022-12-06T11:35:44.478737Z","shell.execute_reply.started":"2022-12-06T11:35:44.466606Z","shell.execute_reply":"2022-12-06T11:35:44.477895Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"4\">There are 11913 unique patients.</font>","metadata":{}},{"cell_type":"code","source":"df = frequency_table['counts'].value_counts().rename_axis('number_of_im_per_patient').reset_index(name='counts')\n\n\ndf['percent'] = ((df['counts'] / df['counts'].sum())*100).round(2).astype(str) + '%'\ncolors = ['#014f86', '#2a6f97', '#2c7da0','#468faf', '#61a5c2', '#89c2d9', '#a9d6e5']\n\n\nfig = go.Figure(go.Bar(\n            x=df['number_of_im_per_patient'],\n            y=df['counts'],\n            text=df['percent'],\n            marker_color=colors\n                        ))\n\nfig.update_traces(texttemplate='%{text}', \n                  textposition='outside',\n                  cliponaxis = False,\n                  hovertemplate='<b>Count</b>: %{y}<extra></extra> ',\n                  textfont_size=17)\n                  \nfig.update_xaxes(showgrid=False)\nfig.update_yaxes(showgrid=False)\n \nfig.update_layout(showlegend=False, \n                  plot_bgcolor='white', \n                  margin=dict(pad=20),\n                  xaxis={'showticklabels': True},\n                  yaxis_title=None,\n                  xaxis_title=None,\n                  yaxis={'categoryorder':'total ascending'},\n                  title_text=\"<b>Number of images per patient</b>\",\n                  title_x=0.5,\n                  font=dict(family=\"serif\", size=17, color='#000000'),\n                  title_font_size=30)\nfig.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-12-06T11:35:45.453385Z","iopub.execute_input":"2022-12-06T11:35:45.454196Z","iopub.status.idle":"2022-12-06T11:35:45.68135Z","shell.execute_reply.started":"2022-12-06T11:35:45.454148Z","shell.execute_reply":"2022-12-06T11:35:45.680025Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"4\">Most of the patients have from 4 to 8 images.</font>","metadata":{}},{"cell_type":"code","source":"train_df['image_id'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:35:46.783937Z","iopub.execute_input":"2022-12-06T11:35:46.785292Z","iopub.status.idle":"2022-12-06T11:35:46.803181Z","shell.execute_reply.started":"2022-12-06T11:35:46.785237Z","shell.execute_reply":"2022-12-06T11:35:46.8019Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"4\">Image ids are unique.</font>","metadata":{}},{"cell_type":"code","source":"train_df['laterality'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:35:47.791395Z","iopub.execute_input":"2022-12-06T11:35:47.792554Z","iopub.status.idle":"2022-12-06T11:35:47.802667Z","shell.execute_reply.started":"2022-12-06T11:35:47.792504Z","shell.execute_reply":"2022-12-06T11:35:47.801735Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"4\">Right and left sides are balanced.</font>","metadata":{}},{"cell_type":"code","source":"train_df['view'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:35:48.757299Z","iopub.execute_input":"2022-12-06T11:35:48.757786Z","iopub.status.idle":"2022-12-06T11:35:48.769591Z","shell.execute_reply.started":"2022-12-06T11:35:48.75774Z","shell.execute_reply":"2022-12-06T11:35:48.768428Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"4\">Two standard views are majority:</font>\n* <font size=\"4\">mediolateral oblique (MLO)</font>\n* <font size=\"4\">craniocaudal (CC)</font>\n<font size=\"4\"><br><br>But some images from different views also present.</font>","metadata":{}},{"cell_type":"code","source":"unique_p = train_df.drop_duplicates(['patient_id'],keep='first')","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:35:49.761581Z","iopub.execute_input":"2022-12-06T11:35:49.762064Z","iopub.status.idle":"2022-12-06T11:35:49.774995Z","shell.execute_reply.started":"2022-12-06T11:35:49.762022Z","shell.execute_reply":"2022-12-06T11:35:49.773555Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cancer_0 = unique_p[unique_p['cancer']==0]['age'].value_counts().rename_axis('age').reset_index(name='counts')\ncancer_1 = unique_p[unique_p['cancer']==1]['age'].value_counts().rename_axis('age').reset_index(name='counts')\n\ncancer_0['percent'] = ((cancer_0['counts'] / cancer_0['counts'].sum())*100).round(2).astype(str) + '%'\ncancer_1['percent'] = ((cancer_1['counts'] / cancer_1['counts'].sum())*100).round(2).astype(str) + '%'\ncolors = ['#014f86', '#2a6f97', '#2c7da0','#468faf', '#61a5c2', '#89c2d9', '#a9d6e5']\n\n\nfig = go.Figure(data=[go.Bar(x=cancer_0['counts'],y=cancer_0['age'],text=cancer_0['percent'],orientation='h'),\n                go.Bar(x=cancer_1['counts'],y=cancer_1['age'],text=cancer_1['percent'],orientation='h')\n                     ])\n\nfig.update_traces(texttemplate='%{text}', \n                  textposition='outside',\n                  cliponaxis = False,\n                  hovertemplate='<b>Count</b>: %{x}<extra></extra> ',\n                  textfont_size=17)\n                  \nfig.update_xaxes(showgrid=False)\nfig.update_yaxes(showgrid=False)\nfig.update_layout(showlegend=False,\n                  barmode='stack',\n                  plot_bgcolor='white', \n                  margin=dict(pad=20),\n                  width=800,\n                  height=1200,\n                  xaxis={'showticklabels': False},\n                  yaxis_range = [24, 90],\n                  yaxis_title=None,\n                  xaxis_title=None,\n                  yaxis={'categoryorder':'total ascending'},\n                  title_text=\"<b>Age distribution</b>\",\n                  title_x=0.5,\n                  font=dict(family=\"serif\", size=17, color='#000000'),\n                  title_font_size=30)\n\nfig.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-12-06T11:35:50.332914Z","iopub.execute_input":"2022-12-06T11:35:50.33332Z","iopub.status.idle":"2022-12-06T11:35:50.386081Z","shell.execute_reply.started":"2022-12-06T11:35:50.333279Z","shell.execute_reply":"2022-12-06T11:35:50.384968Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"4\">Most of the patients lay in age range from 40 to 75.</font>","metadata":{}},{"cell_type":"code","source":"cancer_df = train_df['cancer'].value_counts().rename_axis('cancer').reset_index(name='counts')\n\npatients_cancer = unique_p.groupby('cancer').size().rename_axis('cancer').reset_index(name='patients')","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:35:51.672012Z","iopub.execute_input":"2022-12-06T11:35:51.673309Z","iopub.status.idle":"2022-12-06T11:35:51.686429Z","shell.execute_reply.started":"2022-12-06T11:35:51.673248Z","shell.execute_reply":"2022-12-06T11:35:51.68519Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = make_subplots(rows=1, cols=2, \n                    subplot_titles=(\"<b>by image</b>\", \"<b>by patient</b>\"),\n                    specs=[[{'type':'domain'}, {'type':'domain'}]],\n                    shared_yaxes=True)\n\n\nfig.add_trace(go.Pie(labels=cancer_df['cancer'], \n                     values=cancer_df['counts']),1, 1)\n\nfig.add_trace(go.Pie(labels=patients_cancer['cancer'], \n                     values=patients_cancer['patients']), 1, 2)\n\nfig.add_annotation(x=0.1, y=-0.1,showarrow=False,\n            text=\"Number of unique patients diagnosted with cancer: {}\".format(patients_cancer['patients'][1]))\nfig.add_annotation(x=0.1, y=-0.2, showarrow=False,\n            text=\"Number of unique patients diagnosted with NO cancer: {}\".format(patients_cancer['patients'][0]))\n\n\nfig.update_traces(hoverinfo='percent+value', \n                  textinfo='label', \n                  textfont_size=20,\n                  marker=dict(colors=['blue', 'red'], line=dict(color='white', width=2)))\n\nfig.update_layout(showlegend=False, \n                  title_text=\"<b>Cancer Distribution</b>\",\n                  title_x=0.5,\n                  font=dict(family='serif', size=20, color='#000000'))\n\nfig.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-12-06T11:35:52.331589Z","iopub.execute_input":"2022-12-06T11:35:52.332077Z","iopub.status.idle":"2022-12-06T11:35:52.521146Z","shell.execute_reply.started":"2022-12-06T11:35:52.332038Z","shell.execute_reply":"2022-12-06T11:35:52.520096Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<font size=\"4\">Only 2.12% of all train images have marked with cancer.</font>","metadata":{}},{"cell_type":"markdown","source":"# Load DICOM","metadata":{}},{"cell_type":"code","source":"import pydicom\nimport glob","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:35:54.072255Z","iopub.execute_input":"2022-12-06T11:35:54.072967Z","iopub.status.idle":"2022-12-06T11:35:54.20124Z","shell.execute_reply.started":"2022-12-06T11:35:54.072923Z","shell.execute_reply":"2022-12-06T11:35:54.200348Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## First, read all of my DICOM files into a list\ndicoms_10006 = glob.glob(\"../input/rsna-breast-cancer-detection/train_images/10006/*.dcm\")","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:35:54.570625Z","iopub.execute_input":"2022-12-06T11:35:54.571143Z","iopub.status.idle":"2022-12-06T11:35:54.57873Z","shell.execute_reply.started":"2022-12-06T11:35:54.571101Z","shell.execute_reply":"2022-12-06T11:35:54.577616Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dicoms_10006","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:35:55.083482Z","iopub.execute_input":"2022-12-06T11:35:55.084783Z","iopub.status.idle":"2022-12-06T11:35:55.093703Z","shell.execute_reply.started":"2022-12-06T11:35:55.084702Z","shell.execute_reply":"2022-12-06T11:35:55.092419Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dcm = pydicom.dcmread(dicoms_10006[0])","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:35:56.483847Z","iopub.execute_input":"2022-12-06T11:35:56.48438Z","iopub.status.idle":"2022-12-06T11:35:56.596599Z","shell.execute_reply.started":"2022-12-06T11:35:56.48434Z","shell.execute_reply":"2022-12-06T11:35:56.595502Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dcm","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:35:57.106432Z","iopub.execute_input":"2022-12-06T11:35:57.106891Z","iopub.status.idle":"2022-12-06T11:35:57.116067Z","shell.execute_reply.started":"2022-12-06T11:35:57.10685Z","shell.execute_reply":"2022-12-06T11:35:57.114902Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize = (10,8))\nplt.imshow(dcm.pixel_array, cmap=plt.cm.bone)\nplt.axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-12-01T15:46:40.463824Z","iopub.execute_input":"2022-12-01T15:46:40.464176Z","iopub.status.idle":"2022-12-01T15:46:42.617072Z","shell.execute_reply.started":"2022-12-01T15:46:40.46415Z","shell.execute_reply":"2022-12-01T15:46:42.616355Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import math\n\ndef show_images_per_patient(patient):\n    ## First, read all of my DICOM files into a list\n    dicoms = glob.glob(\"../input/rsna-breast-cancer-detection/train_images/{}/*.dcm\".format(patient))\n    dcm_list = [pydicom.dcmread(img) for img in dicoms]\n    plt.figure(figsize = (10,8))\n  \n    for i in range(len(dcm_list)):\n        ax = plt.subplot(math.ceil(len(dcm_list)/2),2,i+1)\n        # display an image\n        plt.imshow(dcm_list[i].pixel_array,cmap = plt.cm.bone)\n        #plt.axis(\"off\")","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:48:58.074055Z","iopub.execute_input":"2022-12-06T11:48:58.074954Z","iopub.status.idle":"2022-12-06T11:48:58.083566Z","shell.execute_reply.started":"2022-12-06T11:48:58.074908Z","shell.execute_reply":"2022-12-06T11:48:58.082271Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"patient = '10042'\ndicoms = glob.glob(\"../input/rsna-breast-cancer-detection/train_images/{}/*.dcm\".format(patient))\ndcm_list = [pydicom.dcmread(img) for img in dicoms]\ndcm_list","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:53:29.094016Z","iopub.execute_input":"2022-12-06T11:53:29.095264Z","iopub.status.idle":"2022-12-06T11:53:29.143222Z","shell.execute_reply.started":"2022-12-06T11:53:29.095204Z","shell.execute_reply":"2022-12-06T11:53:29.141882Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dcm_list[0].pixel_array","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:50:07.175509Z","iopub.execute_input":"2022-12-06T11:50:07.176826Z","iopub.status.idle":"2022-12-06T11:50:07.202848Z","shell.execute_reply.started":"2022-12-06T11:50:07.176774Z","shell.execute_reply":"2022-12-06T11:50:07.201123Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize = (10,8))\n  \nfor i in range(len(dcm_list)):\n    ax = plt.subplot(math.ceil(len(dcm_list)/2),2,i+1)\n    # display an image\n    plt.imshow(dcm_list[i].pixel_array,cmap = plt.cm.bone)\n    #plt.axis(\"off\")","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:49:39.37923Z","iopub.execute_input":"2022-12-06T11:49:39.37972Z","iopub.status.idle":"2022-12-06T11:49:39.616577Z","shell.execute_reply.started":"2022-12-06T11:49:39.379667Z","shell.execute_reply":"2022-12-06T11:49:39.615037Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"math.ceil(len(dcm_list)/2)","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:49:15.547Z","iopub.execute_input":"2022-12-06T11:49:15.547459Z","iopub.status.idle":"2022-12-06T11:49:15.556499Z","shell.execute_reply.started":"2022-12-06T11:49:15.547417Z","shell.execute_reply":"2022-12-06T11:49:15.555053Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"show_images_per_patient(10102)","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:57:50.095215Z","iopub.execute_input":"2022-12-06T11:57:50.095739Z","iopub.status.idle":"2022-12-06T11:57:52.20033Z","shell.execute_reply.started":"2022-12-06T11:57:50.09567Z","shell.execute_reply":"2022-12-06T11:57:52.198572Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize = (10,8))\n  \nfor i in range(len(dcm_list)):\n    ax = plt.subplot(round(len(dcm_list)/2),2,i+1)\n    # display an image\n    plt.imshow(dcm_list[i].pixel_array,cmap = plt.cm.bone)\n    #plt.axis(\"off\")","metadata":{"execution":{"iopub.status.busy":"2022-12-06T11:44:52.235026Z","iopub.execute_input":"2022-12-06T11:44:52.235674Z","iopub.status.idle":"2022-12-06T11:44:59.24287Z","shell.execute_reply.started":"2022-12-06T11:44:52.235622Z","shell.execute_reply":"2022-12-06T11:44:59.241471Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}