{"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":"# SIIM: Step-by-Step Image Detection for Beginners \n## Mini Part. Preprocessing for Multi-Output Regression that Detect Opacities\n\n👉 Part 1. [EDA to Preprocessing](https://www.kaggle.com/songseungwon/siim-covid-19-detection-10-step-tutorial-1)\n\n👉 Part 2. [Basic Modeling - Simplest Image Classification Models using Keras](https://www.kaggle.com/songseungwon/siim-covid-19-detection-10-step-tutorial-2)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-05-27T08:57:14.314239Z","iopub.execute_input":"2021-05-27T08:57:14.31471Z","iopub.status.idle":"2021-05-27T08:57:14.32385Z","shell.execute_reply.started":"2021-05-27T08:57:14.314558Z","shell.execute_reply":"2021-05-27T08:57:14.322456Z"}}},{"cell_type":"markdown","source":"> Index\n```\nStep 1. Import Dataset\nStep 2. Test Sample data(1 row) before make the preprocessing function\n     2-a. The image with the most opacity detected is taken as a sample\n     2-b. visualize resized image without boxes\n     2-c. extract position information\n     2-d. Extract all box's information for sample image.\n     2-e. Extract corrected positions that resizing ratio is calculated\n     2-f. visualize resized image with boxes\nStep 3. Build Function for reuse\n     3-a. Test the functions that go into the function\n     3-b. Build Function and Create New DataFrame with loop\n     3-c. concat dataframe and save\n```","metadata":{"execution":{"iopub.status.busy":"2021-05-27T08:55:25.019293Z","iopub.execute_input":"2021-05-27T08:55:25.020013Z","iopub.status.idle":"2021-05-27T08:55:25.028087Z","shell.execute_reply.started":"2021-05-27T08:55:25.019879Z","shell.execute_reply":"2021-05-27T08:55:25.026106Z"}}},{"cell_type":"markdown","source":"Now we are going to create a neural network (drawing boxes) that detects opacity. The model is planned to be constructed in the form of simply returning four continuous dependent variables y.\n\nTo do this, we need a training dataset consisting of X matrices in the form of images and 4-y vectors.\n\nLet's create a short training dataset in this mini part.","metadata":{}},{"cell_type":"markdown","source":"## Step 1. Import Dataset","metadata":{}},{"cell_type":"code","source":"import pandas as pd","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:26:25.038521Z","iopub.execute_input":"2021-05-27T17:26:25.039018Z","iopub.status.idle":"2021-05-27T17:26:25.043066Z","shell.execute_reply.started":"2021-05-27T17:26:25.038989Z","shell.execute_reply":"2021-05-27T17:26:25.041995Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/siim-covid19-preprocessed-datasettrain/custom_train.csv')","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:26:25.227505Z","iopub.execute_input":"2021-05-27T17:26:25.227852Z","iopub.status.idle":"2021-05-27T17:26:25.278623Z","shell.execute_reply.started":"2021-05-27T17:26:25.227823Z","shell.execute_reply":"2021-05-27T17:26:25.277541Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.head()","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:26:25.518599Z","iopub.execute_input":"2021-05-27T17:26:25.518943Z","iopub.status.idle":"2021-05-27T17:26:25.537625Z","shell.execute_reply.started":"2021-05-27T17:26:25.518915Z","shell.execute_reply":"2021-05-27T17:26:25.536576Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Step 2. Test Sample data(1 row) before make the preprocessing function","metadata":{}},{"cell_type":"markdown","source":"### 2-a. The image with the most opacity detected is taken as a sample.","metadata":{}},{"cell_type":"code","source":"sorted(train_df.OpacityCount.unique())","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:26:25.617837Z","iopub.execute_input":"2021-05-27T17:26:25.618474Z","iopub.status.idle":"2021-05-27T17:26:25.624117Z","shell.execute_reply.started":"2021-05-27T17:26:25.618441Z","shell.execute_reply":"2021-05-27T17:26:25.623502Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df[train_df.OpacityCount == 8]","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:26:26.249766Z","iopub.execute_input":"2021-05-27T17:26:26.250367Z","iopub.status.idle":"2021-05-27T17:26:26.268867Z","shell.execute_reply.started":"2021-05-27T17:26:26.250327Z","shell.execute_reply":"2021-05-27T17:26:26.267667Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_outlier = train_df[train_df.OpacityCount == 8]\nsample_outlier","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:26:26.474614Z","iopub.execute_input":"2021-05-27T17:26:26.474973Z","iopub.status.idle":"2021-05-27T17:26:26.495726Z","shell.execute_reply.started":"2021-05-27T17:26:26.474941Z","shell.execute_reply":"2021-05-27T17:26:26.494684Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 2-b. visualize resized image without boxes","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:26:28.318974Z","iopub.execute_input":"2021-05-27T17:26:28.319392Z","iopub.status.idle":"2021-05-27T17:26:28.324479Z","shell.execute_reply.started":"2021-05-27T17:26:28.319351Z","shell.execute_reply":"2021-05-27T17:26:28.323274Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img = plt.imread(sample_outlier.path.values[0])\nimg","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:26:28.993763Z","iopub.execute_input":"2021-05-27T17:26:28.99428Z","iopub.status.idle":"2021-05-27T17:26:29.008323Z","shell.execute_reply.started":"2021-05-27T17:26:28.994231Z","shell.execute_reply":"2021-05-27T17:26:29.00719Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(img, cmap='gray');","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:26:31.275567Z","iopub.execute_input":"2021-05-27T17:26:31.276128Z","iopub.status.idle":"2021-05-27T17:26:31.436516Z","shell.execute_reply.started":"2021-05-27T17:26:31.276092Z","shell.execute_reply":"2021-05-27T17:26:31.435606Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 2-c. extract position information","metadata":{}},{"cell_type":"code","source":"sample_box_position = sample_outlier.boxes.values[0]\nsample_box_position","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:26:31.547626Z","iopub.execute_input":"2021-05-27T17:26:31.548025Z","iopub.status.idle":"2021-05-27T17:26:31.554989Z","shell.execute_reply.started":"2021-05-27T17:26:31.547994Z","shell.execute_reply":"2021-05-27T17:26:31.553696Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('count of x : ',sample_box_position.count('x'))\nprint('count of y : ',sample_box_position.count('y'))\nprint('count of height : ',sample_box_position.count('height'))\nprint('count of width : ',sample_box_position.count('width'))","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:26:33.443457Z","iopub.execute_input":"2021-05-27T17:26:33.443812Z","iopub.status.idle":"2021-05-27T17:26:33.451587Z","shell.execute_reply.started":"2021-05-27T17:26:33.443783Z","shell.execute_reply":"2021-05-27T17:26:33.450324Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import re\np = re.compile(\"[-+]?\\d*\\.\\d+|\\d+\") # extract floats from a string\np_list = p.findall(sample_box_position) # return in word bundle form\nprint(p_list)\n\n# ^ : start char string\n# [0-9] : range (all of numbers)\n# + : no limit of count of each number\n# $ : end char string","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:26:34.998357Z","iopub.execute_input":"2021-05-27T17:26:34.998728Z","iopub.status.idle":"2021-05-27T17:26:35.005464Z","shell.execute_reply.started":"2021-05-27T17:26:34.998699Z","shell.execute_reply":"2021-05-27T17:26:35.00456Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"count_box = len(p_list) // 4\ncount_box","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:26:36.57101Z","iopub.execute_input":"2021-05-27T17:26:36.571504Z","iopub.status.idle":"2021-05-27T17:26:36.576918Z","shell.execute_reply.started":"2021-05-27T17:26:36.571473Z","shell.execute_reply":"2021-05-27T17:26:36.576032Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 2-d. Extract all box's information for sample image.","metadata":{"execution":{"iopub.status.busy":"2021-05-27T19:05:16.689531Z","iopub.execute_input":"2021-05-27T19:05:16.690031Z","iopub.status.idle":"2021-05-27T19:05:16.695305Z","shell.execute_reply.started":"2021-05-27T19:05:16.689993Z","shell.execute_reply":"2021-05-27T19:05:16.694218Z"}}},{"cell_type":"code","source":"x_idx = []\ny_idx = []\nheight_idx = []\nwidth_idx = []\nfor i in range(count_box):\n    i *= 4\n    x_idx.append(i)\n    y_idx.append(i+1)\n    height_idx.append(i+2)\n    width_idx.append(i+3)\nprint('x_idx : ',x_idx)\nprint('y_idx : ',y_idx)\nprint('height_idx : ',height_idx)\nprint('width_idx : ',width_idx)","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:26:38.248491Z","iopub.execute_input":"2021-05-27T17:26:38.248867Z","iopub.status.idle":"2021-05-27T17:26:38.257005Z","shell.execute_reply.started":"2021-05-27T17:26:38.248836Z","shell.execute_reply":"2021-05-27T17:26:38.256311Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"[p_list[x] for x in x_idx]","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:26:39.415105Z","iopub.execute_input":"2021-05-27T17:26:39.415603Z","iopub.status.idle":"2021-05-27T17:26:39.421806Z","shell.execute_reply.started":"2021-05-27T17:26:39.415572Z","shell.execute_reply":"2021-05-27T17:26:39.420857Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_list = [float(p_list[idx]) for idx in x_idx]\ny_list = [float(p_list[idx]) for idx in y_idx]\nheight_list = [float(p_list[idx]) for idx in height_idx]\nwidth_list = [float(p_list[idx]) for idx in width_idx]\nprint('x_list : ',x_list)\nprint('y_list : ',y_list)\nprint('height_list : ',height_list)\nprint('width_list : ',width_list)","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:26:42.751393Z","iopub.execute_input":"2021-05-27T17:26:42.751846Z","iopub.status.idle":"2021-05-27T17:26:42.764723Z","shell.execute_reply.started":"2021-05-27T17:26:42.751804Z","shell.execute_reply":"2021-05-27T17:26:42.763607Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 2-e. Extract corrected positions that resizing ratio is calculated","metadata":{}},{"cell_type":"code","source":"train_df[train_df.OpacityCount == 8]","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:26:45.664939Z","iopub.execute_input":"2021-05-27T17:26:45.665351Z","iopub.status.idle":"2021-05-27T17:26:45.685051Z","shell.execute_reply.started":"2021-05-27T17:26:45.665314Z","shell.execute_reply":"2021-05-27T17:26:45.683854Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_height_ratio = train_df[train_df.OpacityCount == 8].height_ratio.values\nsample_width_ratio = train_df[train_df.OpacityCount == 8].width_ratio.values","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:26:49.566963Z","iopub.execute_input":"2021-05-27T17:26:49.567361Z","iopub.status.idle":"2021-05-27T17:26:49.577862Z","shell.execute_reply.started":"2021-05-27T17:26:49.567326Z","shell.execute_reply":"2021-05-27T17:26:49.576455Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_list","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:27:02.352023Z","iopub.execute_input":"2021-05-27T17:27:02.352473Z","iopub.status.idle":"2021-05-27T17:27:02.359274Z","shell.execute_reply.started":"2021-05-27T17:27:02.352437Z","shell.execute_reply":"2021-05-27T17:27:02.358128Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_height_ratio","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:27:20.56212Z","iopub.execute_input":"2021-05-27T17:27:20.562543Z","iopub.status.idle":"2021-05-27T17:27:20.568718Z","shell.execute_reply.started":"2021-05-27T17:27:20.562507Z","shell.execute_reply":"2021-05-27T17:27:20.567747Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"resized_x_list = x_list*sample_width_ratio\nresized_y_list = y_list*sample_height_ratio\nresized_width_list = width_list*sample_width_ratio\nresized_height_list = height_list*sample_height_ratio","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:27:20.720802Z","iopub.execute_input":"2021-05-27T17:27:20.721346Z","iopub.status.idle":"2021-05-27T17:27:20.726048Z","shell.execute_reply.started":"2021-05-27T17:27:20.721312Z","shell.execute_reply":"2021-05-27T17:27:20.724959Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('resized_x_list : \\n',resized_x_list)\nprint('resized_y_list : \\n',resized_y_list)\nprint('resized_width_list : \\n',resized_width_list)\nprint('resized_height_list : \\n',resized_height_list)","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:27:20.8876Z","iopub.execute_input":"2021-05-27T17:27:20.88815Z","iopub.status.idle":"2021-05-27T17:27:20.897088Z","shell.execute_reply.started":"2021-05-27T17:27:20.888115Z","shell.execute_reply":"2021-05-27T17:27:20.895945Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 2-f. visualize resized image with boxes","metadata":{}},{"cell_type":"code","source":"import matplotlib\nimport matplotlib.pyplot as plt","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:27:21.228356Z","iopub.execute_input":"2021-05-27T17:27:21.228674Z","iopub.status.idle":"2021-05-27T17:27:21.232614Z","shell.execute_reply.started":"2021-05-27T17:27:21.228643Z","shell.execute_reply":"2021-05-27T17:27:21.231758Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"resized_x_list","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:27:21.397902Z","iopub.execute_input":"2021-05-27T17:27:21.398249Z","iopub.status.idle":"2021-05-27T17:27:21.404921Z","shell.execute_reply.started":"2021-05-27T17:27:21.398218Z","shell.execute_reply":"2021-05-27T17:27:21.40369Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"count_box","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:27:21.627978Z","iopub.execute_input":"2021-05-27T17:27:21.628316Z","iopub.status.idle":"2021-05-27T17:27:21.633713Z","shell.execute_reply.started":"2021-05-27T17:27:21.628288Z","shell.execute_reply":"2021-05-27T17:27:21.632808Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(1,1, figsize=(4,4))\nfor i in range(count_box):\n    p = matplotlib.patches.Rectangle((resized_x_list[i], resized_y_list[i]),\n                                      resized_width_list[i], resized_height_list[i],\n                                      ec='r', fc='none', lw=2.)\n    ax.add_patch(p)\n    \nax.imshow(img, cmap='gray')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:27:23.515928Z","iopub.execute_input":"2021-05-27T17:27:23.516347Z","iopub.status.idle":"2021-05-27T17:27:23.693798Z","shell.execute_reply.started":"2021-05-27T17:27:23.516312Z","shell.execute_reply":"2021-05-27T17:27:23.692619Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Step 3. Build Function for reuse","metadata":{}},{"cell_type":"code","source":"train_df.head()","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:27:23.768411Z","iopub.execute_input":"2021-05-27T17:27:23.7688Z","iopub.status.idle":"2021-05-27T17:27:23.78974Z","shell.execute_reply.started":"2021-05-27T17:27:23.76877Z","shell.execute_reply":"2021-05-27T17:27:23.788157Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 3-a. Test the functions that go into the function","metadata":{}},{"cell_type":"code","source":"p = re.compile(\"[-+]?\\d*\\.\\d+|\\d+\")\nbox_positions = train_df.boxes.apply(lambda x : p.findall(str(x)))\nbox_positions","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:27:23.883236Z","iopub.execute_input":"2021-05-27T17:27:23.883613Z","iopub.status.idle":"2021-05-27T17:27:23.976748Z","shell.execute_reply.started":"2021-05-27T17:27:23.883581Z","shell.execute_reply":"2021-05-27T17:27:23.975688Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.OpacityCount","metadata":{"execution":{"iopub.status.busy":"2021-05-27T17:27:25.404126Z","iopub.execute_input":"2021-05-27T17:27:25.404515Z","iopub.status.idle":"2021-05-27T17:27:25.412766Z","shell.execute_reply.started":"2021-05-27T17:27:25.404479Z","shell.execute_reply":"2021-05-27T17:27:25.411858Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 3-b. Build Function and Create New DataFrame with loop","metadata":{}},{"cell_type":"code","source":"import numpy as np\n\ndef resize_box_position(df, c):\n    count_box = train_df.OpacityCount[c]\n    x_idx = []\n    y_idx = []\n    height_idx = []\n    width_idx = []\n\n    for i in range(count_box):\n        i *= 4\n        x_idx.append(i)\n        y_idx.append(i+1)\n        height_idx.append(i+2)\n        width_idx.append(i+3)\n\n    if train_df.boxes[c] != train_df.boxes[c]:\n        return pd.Series([0,0,0,0], index=df.columns)\n    \n    else:\n        p_list = p.findall(train_df.boxes[c]) \n        x_list = [float(p_list[idx]) for idx in x_idx]\n        y_list = [float(p_list[idx]) for idx in y_idx]\n        height_list = [float(p_list[idx]) for idx in height_idx]\n        width_list = [float(p_list[idx]) for idx in width_idx]\n\n        x_ratio = np.array(train_df.width_ratio[c])\n        y_ratio = np.array(train_df.height_ratio[c])\n\n        resized_x_list = x_list*x_ratio\n        resized_y_list = y_list*y_ratio\n        resized_width_list = width_list*x_ratio\n        resized_height_list = height_list*y_ratio\n        return pd.Series([resized_x_list, resized_y_list, resized_width_list, resized_height_list], index=df.columns)","metadata":{"execution":{"iopub.status.busy":"2021-05-27T18:32:06.130712Z","iopub.execute_input":"2021-05-27T18:32:06.131103Z","iopub.status.idle":"2021-05-27T18:32:06.141884Z","shell.execute_reply.started":"2021-05-27T18:32:06.131069Z","shell.execute_reply":"2021-05-27T18:32:06.14089Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"resized_box_x = []\nresized_box_y = []\nresized_box_width = []\nresized_box_height = []\n\ndf = pd.DataFrame(columns=['resized_box_x', 'resized_box_y', 'resized_box_width', 'resized_box_height'])\n\nfor idx in train_df.index:\n    df = df.append(resize_box_position(df, idx), ignore_index=True)\n    if idx % 500 == 0:\n        print('saved - {}/{}'.format(idx, max(train_df.index)))\n    elif idx == 6333:\n        print('complete - {}/{}'.format(idx, max(train_df.index)))","metadata":{"execution":{"iopub.status.busy":"2021-05-27T18:33:01.621339Z","iopub.execute_input":"2021-05-27T18:33:01.621904Z","iopub.status.idle":"2021-05-27T18:33:17.280999Z","shell.execute_reply.started":"2021-05-27T18:33:01.62186Z","shell.execute_reply":"2021-05-27T18:33:17.279915Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df","metadata":{"execution":{"iopub.status.busy":"2021-05-27T18:33:19.804202Z","iopub.execute_input":"2021-05-27T18:33:19.804645Z","iopub.status.idle":"2021-05-27T18:33:19.831967Z","shell.execute_reply.started":"2021-05-27T18:33:19.804608Z","shell.execute_reply":"2021-05-27T18:33:19.830657Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 3-c. Concat DataFrame and Save","metadata":{}},{"cell_type":"code","source":"train_df = pd.concat([train_df,df], axis=1)\ntrain_df","metadata":{"execution":{"iopub.status.busy":"2021-05-27T18:37:13.680322Z","iopub.execute_input":"2021-05-27T18:37:13.680811Z","iopub.status.idle":"2021-05-27T18:37:13.731246Z","shell.execute_reply.started":"2021-05-27T18:37:13.68077Z","shell.execute_reply":"2021-05-27T18:37:13.729945Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.to_csv('train_full_info.csv')","metadata":{"execution":{"iopub.status.busy":"2021-05-27T18:38:29.361983Z","iopub.execute_input":"2021-05-27T18:38:29.362403Z","iopub.status.idle":"2021-05-27T18:38:30.966352Z","shell.execute_reply.started":"2021-05-27T18:38:29.362371Z","shell.execute_reply":"2021-05-27T18:38:30.964985Z"},"trusted":true},"execution_count":null,"outputs":[]}]}