{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport random","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-09-02T13:28:03.135106Z","iopub.execute_input":"2023-09-02T13:28:03.135481Z","iopub.status.idle":"2023-09-02T13:28:04.684425Z","shell.execute_reply.started":"2023-09-02T13:28:03.13545Z","shell.execute_reply":"2023-09-02T13:28:04.683392Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Thanks every one for providing insight on your work \nhttps://www.kaggle.com/code/jocelyndumlao/unleashing-the-healing-potential-abdominal-trauma\nhttps://www.kaggle.com/competitions/rsna-2023-abdominal-trauma-detection/discussion/427795\nhttps://www.kaggle.com/code/franklinshih0617/rsna-abdominal-trauma-detect-eda-animation","metadata":{}},{"cell_type":"code","source":"df = pd.read_csv('/kaggle/input/rsna-2023-abdominal-trauma-detection/train_series_meta.csv')\ndf_label = pd.read_csv('/kaggle/input/rsna-2023-abdominal-trauma-detection/image_level_labels.csv')\ndf_train = pd.read_csv('/kaggle/input/rsna-2023-abdominal-trauma-detection/train.csv')","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:28:04.686055Z","iopub.execute_input":"2023-09-02T13:28:04.686336Z","iopub.status.idle":"2023-09-02T13:28:04.74046Z","shell.execute_reply.started":"2023-09-02T13:28:04.686311Z","shell.execute_reply":"2023-09-02T13:28:04.739082Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train.head()","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:28:04.742122Z","iopub.execute_input":"2023-09-02T13:28:04.742469Z","iopub.status.idle":"2023-09-02T13:28:04.769577Z","shell.execute_reply.started":"2023-09-02T13:28:04.742437Z","shell.execute_reply":"2023-09-02T13:28:04.768622Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train['bowel_healthy'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:28:04.772681Z","iopub.execute_input":"2023-09-02T13:28:04.773404Z","iopub.status.idle":"2023-09-02T13:28:04.790365Z","shell.execute_reply.started":"2023-09-02T13:28:04.773368Z","shell.execute_reply":"2023-09-02T13:28:04.788793Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Remove the 'patient_id' column from the DataFrame\ndf_train = df_train.drop(columns=['patient_id'])\n\n# Get the number of columns in the DataFrame\nnum_cols = len(df_train.columns)\n\n# Calculate the number of rows and columns for subplots\nnum_rows = (num_cols - 1) // 4 + 1\nnum_cols_subplot = min(num_cols, 4)\n\n# Create subplots\nfig, axes = plt.subplots(num_rows, num_cols_subplot, figsize=(15, 5*num_rows))\n\n# Flatten the axes array to make it easier to iterate through the subplots\naxes = axes.flatten()\n\n# Plot count plot for each boolean column in a separate subplot\nfor i, column in enumerate(df_train.columns):\n    sns.countplot(data=df_train, x=column, ax=axes[i])\n    axes[i].set_xlabel(column)\n    axes[i].set_ylabel('Count')\n    axes[i].set_title(f'Count Plot of {column}')\n\n# Hide any empty subplots\nfor i in range(num_cols_subplot * num_rows, len(axes)):\n    axes[i].axis('off')\n\n# Adjust layout to avoid overlapping labels\nplt.tight_layout()\n\n# Show the plots in a single window\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:28:04.791809Z","iopub.execute_input":"2023-09-02T13:28:04.792192Z","iopub.status.idle":"2023-09-02T13:28:07.379579Z","shell.execute_reply.started":"2023-09-02T13:28:04.79216Z","shell.execute_reply":"2023-09-02T13:28:07.378576Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_count = df_train.apply(pd.Series.value_counts)\n\n# Create a grouped bar plot\nplt.figure(figsize=(15, 6))\ndf_count.T.plot(kind='bar', stacked=True)\nplt.xlabel('Columns')\nplt.ylabel('Count')\nplt.title('Count of True and False Values in Boolean Columns')\nplt.xticks(rotation=90)\nplt.legend(title='Boolean Value', loc='upper right')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:28:07.380853Z","iopub.execute_input":"2023-09-02T13:28:07.381181Z","iopub.status.idle":"2023-09-02T13:28:07.736228Z","shell.execute_reply.started":"2023-09-02T13:28:07.381153Z","shell.execute_reply":"2023-09-02T13:28:07.734117Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import nibabel as nib\nimport shutil","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:28:07.740179Z","iopub.execute_input":"2023-09-02T13:28:07.741263Z","iopub.status.idle":"2023-09-02T13:28:08.195633Z","shell.execute_reply.started":"2023-09-02T13:28:07.74122Z","shell.execute_reply":"2023-09-02T13:28:08.194467Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\n\n# Source directory containing the files without extension\nsrc_directory = '/kaggle/input/rsna-2023-abdominal-trauma-detection/segmentations/'\n\n# Destination directory where the NIfTI files will be copied with '.nii' extension\ndst_directory = '/kaggle/working/'\n\n# List all the files in the source directory\nfile_list = os.listdir(src_directory)\n\nfor filename in file_list:\n    # Check if the file does not have an extension (you may need to adapt this condition if there are other files in the folder)\n    if '.' not in filename:\n        # Construct the source and destination paths for the file\n        src_file = os.path.join(src_directory, filename)\n        dst_file = os.path.join(dst_directory, f\"{filename}.nii\")\n        \n        # Copy the file with the '.nii' extension\n        shutil.copyfile(src_file, dst_file)\n\nprint(\"Conversion completed.\")\n","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:28:08.198221Z","iopub.execute_input":"2023-09-02T13:28:08.198617Z","iopub.status.idle":"2023-09-02T13:28:08.246223Z","shell.execute_reply.started":"2023-09-02T13:28:08.198585Z","shell.execute_reply":"2023-09-02T13:28:08.244473Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Copy a random label file to /kaggle/working directory (with .nii file extension)\nsrc = '/kaggle/input/rsna-2023-abdominal-trauma-detection/segmentations/10000.nii'\ndst = '/kaggle/working/10000.nii'\n\nshutil.copyfile(src, dst)\n\n# Check the shape\nimg = nib.load(dst).get_fdata()\nprint(img.shape)\n# Plot a single frame from the middle of the stack\nplt.imshow(img[:,:,150])\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:32:36.827391Z","iopub.execute_input":"2023-09-02T13:32:36.827784Z","iopub.status.idle":"2023-09-02T13:32:39.848204Z","shell.execute_reply.started":"2023-09-02T13:32:36.82775Z","shell.execute_reply":"2023-09-02T13:32:39.84726Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(img[:,:,300])\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:32:45.614611Z","iopub.execute_input":"2023-09-02T13:32:45.615035Z","iopub.status.idle":"2023-09-02T13:32:45.783155Z","shell.execute_reply.started":"2023-09-02T13:32:45.615008Z","shell.execute_reply":"2023-09-02T13:32:45.781763Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"shutil.copyfile(src, dst)","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:28:08.666381Z","iopub.status.idle":"2023-09-02T13:28:08.66674Z","shell.execute_reply.started":"2023-09-02T13:28:08.666574Z","shell.execute_reply":"2023-09-02T13:28:08.66659Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"nifti_img = nib.load('/kaggle/input/rsna-2023-abdominal-trauma-detection/segmentations/10109.nii')","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:33:14.914404Z","iopub.execute_input":"2023-09-02T13:33:14.914786Z","iopub.status.idle":"2023-09-02T13:33:14.93521Z","shell.execute_reply.started":"2023-09-02T13:33:14.914757Z","shell.execute_reply":"2023-09-02T13:33:14.933217Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train_numeric = df_train.astype(int)\n\n# Calculate the percentage distribution of boolean values for each column\ndf_percentage = df_train_numeric.mean() * 100\n\n# Create a stacked bar plot\nplt.figure(figsize=(12, 6))\ndf_percentage.plot(kind='bar', color=['red', 'blue'], alpha=0.7)\nplt.xlabel('Columns')\nplt.ylabel('Percentage')\nplt.title('Percentage Distribution of Boolean Columns')\nplt.xticks(rotation=90)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:33:17.730282Z","iopub.execute_input":"2023-09-02T13:33:17.730627Z","iopub.status.idle":"2023-09-02T13:33:17.981039Z","shell.execute_reply.started":"2023-09-02T13:33:17.7306Z","shell.execute_reply":"2023-09-02T13:33:17.980158Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Correlation Heatmap\nplt.figure(figsize=(15, 6))\nsns.heatmap(df_train.corr(), annot=True, cmap='coolwarm', fmt='.2f')\nplt.title('Correlation Heatmap')\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:33:18.845805Z","iopub.execute_input":"2023-09-02T13:33:18.84715Z","iopub.status.idle":"2023-09-02T13:33:19.540055Z","shell.execute_reply.started":"2023-09-02T13:33:18.847107Z","shell.execute_reply":"2023-09-02T13:33:19.539112Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install pydicom matplotlib","metadata":{"_kg_hide-output":false,"execution":{"iopub.status.busy":"2023-09-02T13:33:20.301385Z","iopub.execute_input":"2023-09-02T13:33:20.301967Z","iopub.status.idle":"2023-09-02T13:33:31.442073Z","shell.execute_reply.started":"2023-09-02T13:33:20.30194Z","shell.execute_reply":"2023-09-02T13:33:31.440652Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport numpy as np\nimport pydicom\nimport matplotlib.pyplot as plt\nfrom matplotlib.colors import Normalize\n\ndef load_dicom_images(directory):\n    dicom_images = []\n    for filename in os.listdir(directory):\n        if filename.endswith(\".dcm\"):\n            dicom_file = os.path.join(directory, filename)\n            dicom_image = pydicom.dcmread(dicom_file)\n            dicom_images.append(dicom_image)\n    return dicom_images\n\ndef rescale_pixel_array(pixel_array, window_level, window_width):\n    # Rescale the pixel values based on the window level and window width\n    min_value = window_level - window_width // 2\n    max_value = window_level + window_width // 2\n    rescaled_pixel_array = np.clip(pixel_array, min_value, max_value)\n    rescaled_pixel_array = (rescaled_pixel_array - min_value) / (max_value - min_value)\n    return rescaled_pixel_array\n\ndef visualize_dicom_images(dicom_images, num_rows=4, num_cols=4, window_level=40, window_width=80):\n    # Create a grid of subplots for image visualization\n    fig, axes = plt.subplots(num_rows, num_cols, figsize=(15, 15))\n\n    # Iterate through the DICOM images and plot them\n    for i, ax in enumerate(axes.flat):\n        if i < len(dicom_images):\n            dicom_image = dicom_images[i]\n            image_data = dicom_image.pixel_array.astype(np.float32)\n            rescaled_image = rescale_pixel_array(image_data, window_level, window_width)\n            ax.imshow(rescaled_image, cmap=plt.cm.bone)\n            ax.axis(\"off\")\n            ax.set_title(f\"Slice {i+1}\")\n\n        # Hide any empty subplots\n        else:\n            ax.axis(\"off\")\n\n    # Add a color bar to indicate pixel intensity values\n    cax = fig.add_axes([0.92, 0.15, 0.02, 0.7])\n    norm = Normalize(vmin=0, vmax=1)\n    cbar = plt.colorbar(plt.cm.ScalarMappable(norm=norm, cmap=plt.cm.bone), cax=cax)\n    cbar.ax.set_ylabel(\"Pixel Intensity\")\n\n    plt.tight_layout()\n    plt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:33:31.444451Z","iopub.execute_input":"2023-09-02T13:33:31.444799Z","iopub.status.idle":"2023-09-02T13:33:31.458142Z","shell.execute_reply.started":"2023-09-02T13:33:31.444768Z","shell.execute_reply":"2023-09-02T13:33:31.45643Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"path_to_directory = \"/kaggle/input/rsna-2023-abdominal-trauma-detection/train_images/49954/41479\"\ndicom_images = load_dicom_images(path_to_directory)\nvisualize_dicom_images(dicom_images, num_rows=3, num_cols=3, window_level=40, window_width=80)","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:33:32.059816Z","iopub.execute_input":"2023-09-02T13:33:32.060695Z","iopub.status.idle":"2023-09-02T13:33:39.804838Z","shell.execute_reply.started":"2023-09-02T13:33:32.060665Z","shell.execute_reply":"2023-09-02T13:33:39.803972Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_dicom_images(dicom_images, num_rows=4, num_cols=4, window_level=40, window_width=80):\n    fig, axes = plt.subplots(num_rows, num_cols, figsize=(15, 15))\n\n    for i, ax in enumerate(axes.flat):\n        if i < len(dicom_images):\n            dicom_image = dicom_images[i]\n            image_data = dicom_image.pixel_array.astype(np.float32)\n            rescaled_image = rescale_pixel_array(image_data, window_level, window_width)\n            ax.imshow(rescaled_image, cmap=plt.cm.bone)\n            ax.axis('off')\n            ax.set_title(f\"Image {i+1}\")\n        else:\n            ax.axis('off')\n\n    plt.tight_layout()\n    plt.show()\n\npath_to_directory = \"/kaggle/input/rsna-2023-abdominal-trauma-detection/train_images/10004/51033\"\ndicom_images = []\n\n# Load only 10 DICOM images\ncount = 0\nfor filename in os.listdir(path_to_directory):\n    if filename.endswith(\".dcm\"):\n        dicom_file = os.path.join(path_to_directory, filename)\n        dicom_image = pydicom.dcmread(dicom_file)\n        dicom_images.append(dicom_image)\n        count += 1\n        if count == 12:\n            break\n\n# Plot 10 DICOM images in a grid\nplot_dicom_images(dicom_images, num_rows=3, num_cols=4, window_level=40, window_width=80)","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:33:40.689062Z","iopub.execute_input":"2023-09-02T13:33:40.690243Z","iopub.status.idle":"2023-09-02T13:33:42.479368Z","shell.execute_reply.started":"2023-09-02T13:33:40.690193Z","shell.execute_reply":"2023-09-02T13:33:42.477459Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def random_sample_files(directory_path, sample_size):\n    # Get a list of all files in the directory\n    file_list = os.listdir(directory_path)\n    \n    # Check if the number of files in the directory is smaller than the desired sample size\n    if len(file_list) < sample_size:\n        raise ValueError(\"Sample size is greater than the number of files in the directory.\")\n    \n    # Randomly sample files from the list\n    random_sample = random.sample(file_list, sample_size)\n    \n    return random_sample\n\ndef plot_dicom_images(directory_path, image_samples):\n    num_rows = 2\n    num_cols = 3\n    fig, axes = plt.subplots(num_rows, num_cols, figsize=(15, 15))\n\n    for i, fig_name in enumerate(image_samples, start=1):\n        dicom_file = os.path.join(directory_path, fig_name)\n        dicom_image = pydicom.read_file(dicom_file)\n        image_data = dicom_image.pixel_array\n        ax = axes.flat[i - 1]\n        ax.imshow(image_data, cmap=plt.cm.turbo)\n        ax.axis('off')\n        ax.set_title(f'Image Sample {i}')\n\n    # Hide any empty subplots\n    for i in range(len(image_samples), num_rows * num_cols):\n        axes.flat[i].axis('off')\n\n    plt.tight_layout()\n    plt.show()\n\n# Example usage:\ndirectory_path = '/kaggle/input/rsna-2023-abdominal-trauma-detection/train_images/10065/37324'\nsample_size = 6\nimage_samples = random_sample_files(directory_path, sample_size)\nplot_dicom_images(directory_path, image_samples)","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:33:42.481561Z","iopub.execute_input":"2023-09-02T13:33:42.481887Z","iopub.status.idle":"2023-09-02T13:33:43.549273Z","shell.execute_reply.started":"2023-09-02T13:33:42.481859Z","shell.execute_reply":"2023-09-02T13:33:43.547144Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from matplotlib.animation import FuncAnimation\nfrom IPython.display import HTML\n\n\ndef animate_dicom_images(dicom_images, window_level=30, window_width=50):\n    num_frames = min(len(dicom_images), 20)  # Limit to the first 20 DICOM images\n    fig, ax = plt.subplots(figsize=(6, 6))\n    ax.axis('off')\n    \n    def update(frame):\n        ax.clear()\n        dicom_image = dicom_images[frame]\n        image_data = dicom_image.pixel_array.astype(np.float32)\n        rescaled_image = rescale_pixel_array(image_data, window_level, window_width)\n        ax.imshow(rescaled_image, cmap='viridis')  # Use 'viridis' colormap for color\n        ax.set_title(f\"Slice {frame + 1}\")\n\n    anim = FuncAnimation(fig, update, frames=num_frames, interval=200)\n    return anim\n\npath_to_directory = \"/kaggle/input/rsna-2023-abdominal-trauma-detection/train_images/49954/41479\"\ndicom_images = load_dicom_images(path_to_directory)\n\n# Set the window level and window width for rescaling pixel values (you can adjust these values)\nwindow_level = 30\nwindow_width = 50\n\nanimation = animate_dicom_images(dicom_images, window_level, window_width)\n\nHTML(animation.to_jshtml())\n","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:33:43.550747Z","iopub.execute_input":"2023-09-02T13:33:43.551585Z","iopub.status.idle":"2023-09-02T13:33:48.362995Z","shell.execute_reply.started":"2023-09-02T13:33:43.55155Z","shell.execute_reply":"2023-09-02T13:33:48.361793Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import nibabel as nib\nimport shutil\n\n# Copy a random label file to /kaggle/working directory (without .nii file extension)\nsrc = '/kaggle/input/rsna-2023-abdominal-trauma-detection/segmentations/6130.nii'\ndst = '/kaggle/working/1000.nii'\n\nshutil.copyfile(src, dst);\n\n# Check the shape\nimg = nib.load(dst).get_fdata()\nprint(img.shape)\n\n# Plot a single frame from the middle of the stack\nplt.imshow(img[:,:,150])\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:34:32.225838Z","iopub.execute_input":"2023-09-02T13:34:32.226205Z","iopub.status.idle":"2023-09-02T13:34:33.650587Z","shell.execute_reply.started":"2023-09-02T13:34:32.226178Z","shell.execute_reply":"2023-09-02T13:34:33.649386Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install medpy","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:34:39.45863Z","iopub.execute_input":"2023-09-02T13:34:39.459049Z","iopub.status.idle":"2023-09-02T13:34:58.260195Z","shell.execute_reply.started":"2023-09-02T13:34:39.459017Z","shell.execute_reply":"2023-09-02T13:34:58.258561Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import medpy.io as mio\nimport matplotlib.pyplot as plt\n\ndef load_nifti_segmentation(file_path):\n    # Load the NIfTI file using medpy\n    segmentation_data, _ = mio.load(file_path)\n    \n    return segmentation_data\n\n\nfile_path = dst  \nsegmentation_data = load_nifti_segmentation(file_path)\n\n# Display a slice of the segmentation (you can adjust the slice index)\nslice_index = 50\nplt.imshow(segmentation_data[:, :, slice_index], cmap='jet')\nplt.colorbar()\nplt.title(\"Segmentation Slice\")\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:34:58.262727Z","iopub.execute_input":"2023-09-02T13:34:58.263206Z","iopub.status.idle":"2023-09-02T13:34:59.558829Z","shell.execute_reply.started":"2023-09-02T13:34:58.263166Z","shell.execute_reply":"2023-09-02T13:34:59.557155Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import medpy.io as mio\nimport matplotlib.pyplot as plt\n\ndef load_nifti_segmentation(file_path):\n    # Load the NIfTI file using medpy\n    segmentation_data, _ = mio.load(file_path)\n    \n    return segmentation_data\n\n\nfile_path = dst  \nsegmentation_data = load_nifti_segmentation(file_path)\n\n# Display a slice of the segmentation (you can adjust the slice index)\nslice_index = 100\nplt.imshow(segmentation_data[:, :, slice_index], cmap='jet')\nplt.colorbar()\nplt.title(\"Segmentation Slice\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-09-02T13:35:19.279179Z","iopub.execute_input":"2023-09-02T13:35:19.279519Z","iopub.status.idle":"2023-09-02T13:35:19.862328Z","shell.execute_reply.started":"2023-09-02T13:35:19.279492Z","shell.execute_reply":"2023-09-02T13:35:19.860587Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}],"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"}}