{"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":"import pandas as pd\nimport numpy as np\nimport json\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport cv2\nimport os\nimport warnings\nwarnings.filterwarnings(\"ignore\")\nimport plotly.express as px\nimport PIL","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-08-20T16:08:07.464177Z","iopub.execute_input":"2023-08-20T16:08:07.464544Z","iopub.status.idle":"2023-08-20T16:08:08.762651Z","shell.execute_reply.started":"2023-08-20T16:08:07.464513Z","shell.execute_reply":"2023-08-20T16:08:08.761629Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"!nvidia-smi","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:08.764547Z","iopub.execute_input":"2023-08-20T16:08:08.764983Z","iopub.status.idle":"2023-08-20T16:08:09.749787Z","shell.execute_reply.started":"2023-08-20T16:08:08.764949Z","shell.execute_reply":"2023-08-20T16:08:09.748568Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dir = '../input/herbarium-2022-fgvc9/train_images/'\ntest_dir = '../input/herbarium-2022-fgvc9/test_images/'\n\nwith open(\"../input/herbarium-2022-fgvc9/train_metadata.json\") as json_file:\n    train_meta = json.load(json_file)\nwith open(\"../input/herbarium-2022-fgvc9/test_metadata.json\") as json_file:\n    test_meta = json.load(json_file)","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:09.752543Z","iopub.execute_input":"2023-08-20T16:08:09.752942Z","iopub.status.idle":"2023-08-20T16:08:23.895949Z","shell.execute_reply.started":"2023-08-20T16:08:09.752896Z","shell.execute_reply":"2023-08-20T16:08:23.894942Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df = pd.DataFrame(test_meta)\ntest_df.columns = ['file_name', 'image_id', 'license']","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:23.898726Z","iopub.execute_input":"2023-08-20T16:08:23.899539Z","iopub.status.idle":"2023-08-20T16:08:24.146167Z","shell.execute_reply.started":"2023-08-20T16:08:23.899504Z","shell.execute_reply":"2023-08-20T16:08:24.14515Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_meta","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:24.147484Z","iopub.execute_input":"2023-08-20T16:08:24.148413Z","iopub.status.idle":"2023-08-20T16:08:24.152766Z","shell.execute_reply.started":"2023-08-20T16:08:24.148378Z","shell.execute_reply":"2023-08-20T16:08:24.151722Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.DataFrame(train_meta['annotations'])\ntrain_df.head(5)","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:24.154057Z","iopub.execute_input":"2023-08-20T16:08:24.155011Z","iopub.status.idle":"2023-08-20T16:08:25.868167Z","shell.execute_reply.started":"2023-08-20T16:08:24.154977Z","shell.execute_reply":"2023-08-20T16:08:25.867103Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_cat = pd.DataFrame(train_meta['categories'])\n#train_cat.columns = [ 'category_id', 'scientificName','family', 'genus']\ntrain_cat.head(5)","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:25.869605Z","iopub.execute_input":"2023-08-20T16:08:25.87006Z","iopub.status.idle":"2023-08-20T16:08:25.912195Z","shell.execute_reply.started":"2023-08-20T16:08:25.870009Z","shell.execute_reply":"2023-08-20T16:08:25.91131Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_img = pd.DataFrame(train_meta['images'])\ntrain_img.columns = ['image_id','file_name', 'license']\ndisplay(train_img)","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:25.913652Z","iopub.execute_input":"2023-08-20T16:08:25.914016Z","iopub.status.idle":"2023-08-20T16:08:26.89897Z","shell.execute_reply.started":"2023-08-20T16:08:25.913983Z","shell.execute_reply":"2023-08-20T16:08:26.897976Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_gen = pd.DataFrame(train_meta['genera'])\ntrain_gen.columns = ['genus_id', 'genus']\ndisplay(train_gen)","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:26.900721Z","iopub.execute_input":"2023-08-20T16:08:26.901204Z","iopub.status.idle":"2023-08-20T16:08:26.918873Z","shell.execute_reply.started":"2023-08-20T16:08:26.901149Z","shell.execute_reply":"2023-08-20T16:08:26.918039Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = train_df.merge(train_cat, on='category_id', how='outer')\ntrain_df","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:26.92338Z","iopub.execute_input":"2023-08-20T16:08:26.923648Z","iopub.status.idle":"2023-08-20T16:08:27.174662Z","shell.execute_reply.started":"2023-08-20T16:08:26.923624Z","shell.execute_reply":"2023-08-20T16:08:27.173599Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = train_df.merge(train_img, on='image_id', how='outer')\ntrain_df","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:27.176086Z","iopub.execute_input":"2023-08-20T16:08:27.176503Z","iopub.status.idle":"2023-08-20T16:08:28.27914Z","shell.execute_reply.started":"2023-08-20T16:08:27.176468Z","shell.execute_reply":"2023-08-20T16:08:28.278085Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.columns","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:28.280902Z","iopub.execute_input":"2023-08-20T16:08:28.281415Z","iopub.status.idle":"2023-08-20T16:08:28.288602Z","shell.execute_reply.started":"2023-08-20T16:08:28.281381Z","shell.execute_reply":"2023-08-20T16:08:28.287572Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.head(5)","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:28.290303Z","iopub.execute_input":"2023-08-20T16:08:28.290736Z","iopub.status.idle":"2023-08-20T16:08:28.308464Z","shell.execute_reply.started":"2023-08-20T16:08:28.290702Z","shell.execute_reply":"2023-08-20T16:08:28.307191Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df[\"file_name\"] = train_dir + train_df[\"file_name\"]","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:28.31014Z","iopub.execute_input":"2023-08-20T16:08:28.310508Z","iopub.status.idle":"2023-08-20T16:08:28.458486Z","shell.execute_reply.started":"2023-08-20T16:08:28.310473Z","shell.execute_reply":"2023-08-20T16:08:28.457489Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.drop([\"image_id\", \"authors\", \"license\",\"institution_id\"], axis=1, inplace=True)","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:28.459863Z","iopub.execute_input":"2023-08-20T16:08:28.460878Z","iopub.status.idle":"2023-08-20T16:08:28.514912Z","shell.execute_reply.started":"2023-08-20T16:08:28.460836Z","shell.execute_reply":"2023-08-20T16:08:28.513862Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.info()","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:28.516171Z","iopub.execute_input":"2023-08-20T16:08:28.516517Z","iopub.status.idle":"2023-08-20T16:08:29.73596Z","shell.execute_reply.started":"2023-08-20T16:08:28.516483Z","shell.execute_reply":"2023-08-20T16:08:29.735066Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.head(5)","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:29.737538Z","iopub.execute_input":"2023-08-20T16:08:29.737879Z","iopub.status.idle":"2023-08-20T16:08:29.752935Z","shell.execute_reply.started":"2023-08-20T16:08:29.737845Z","shell.execute_reply":"2023-08-20T16:08:29.751796Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.nunique()","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:29.75436Z","iopub.execute_input":"2023-08-20T16:08:29.754722Z","iopub.status.idle":"2023-08-20T16:08:30.396747Z","shell.execute_reply.started":"2023-08-20T16:08:29.754686Z","shell.execute_reply":"2023-08-20T16:08:30.39573Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from IPython.display import Image, display\n\n# Assuming 'train_df' contains your DataFrame with an 'file_name' and 'label' column\n\nindex_to_view = 0  # Change this to the index of the row you want to view\n\n# Get the image file path and label from the DataFrame\nimage_path = train_df.loc[index_to_view, 'file_name']\nlabel = train_df.loc[index_to_view, 'family']  # Replace 'label' with the actual column name\n\n# Display the image and label using IPython's Image module\ndisplay(Image(filename=image_path))\nprint(\"Label:\", label)","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:30.398283Z","iopub.execute_input":"2023-08-20T16:08:30.398651Z","iopub.status.idle":"2023-08-20T16:08:30.459994Z","shell.execute_reply.started":"2023-08-20T16:08:30.398617Z","shell.execute_reply":"2023-08-20T16:08:30.459087Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# List of families to include in the filtered DataFrame\nselected_families = ['Pinaceae', 'Nyctaginaceae', 'Menispermaceae', 'Malvaceae', 'Fabaceae', 'Rosaceae',\n                     'Euphorbiaceae', 'Asteraceae', 'Cactaceae', 'Lamiaceae', 'Polygonaceae', 'Bromeliaceae',\n                     'Sapindaceae', 'Plantaginaceae', 'Berberidaceae', 'Amaranthaceae', 'Caryophyllaceae',\n                     'Orchidaceae', 'Calyceraceae', 'Arecaceae', 'Ranunculaceae', 'Acoraceae', 'Pteridaceae',\n                     'Schizaeaceae', 'Araceae', 'Bignoniaceae', 'Papaveraceae', 'Rhamnaceae', 'Viburnaceae',\n                     'Orobanchaceae', 'Ericaceae', 'Asparagaceae', 'Phytolaccaceae', 'Poaceae', 'Lauraceae',\n                     'Apiaceae', 'Nartheciaceae', 'Polemoniaceae', 'Alismataceae', 'Apocynaceae', 'Amaryllidaceae',\n                     'Betulaceae', 'Iridaceae', 'Verbenaceae', 'Gesneriaceae', 'Cyatheaceae', 'Alstroemeriaceae',\n                     'Picramniaceae', 'Melanthiaceae', 'Lythraceae', 'Vitaceae', 'Anacardiaceae']\n\n# Filter the DataFrame to include only the selected families\ntrain_df = train_df[train_df['family'].isin(selected_families)]","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:30.461142Z","iopub.execute_input":"2023-08-20T16:08:30.461528Z","iopub.status.idle":"2023-08-20T16:08:30.716774Z","shell.execute_reply.started":"2023-08-20T16:08:30.461495Z","shell.execute_reply":"2023-08-20T16:08:30.715821Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.info()","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:30.718185Z","iopub.execute_input":"2023-08-20T16:08:30.718526Z","iopub.status.idle":"2023-08-20T16:08:31.495139Z","shell.execute_reply.started":"2023-08-20T16:08:30.718494Z","shell.execute_reply":"2023-08-20T16:08:31.493669Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.head(5)","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:31.497504Z","iopub.execute_input":"2023-08-20T16:08:31.498198Z","iopub.status.idle":"2023-08-20T16:08:31.524824Z","shell.execute_reply.started":"2023-08-20T16:08:31.498161Z","shell.execute_reply":"2023-08-20T16:08:31.52382Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df[\"family\"].value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:31.526256Z","iopub.execute_input":"2023-08-20T16:08:31.527164Z","iopub.status.idle":"2023-08-20T16:08:31.623929Z","shell.execute_reply.started":"2023-08-20T16:08:31.527128Z","shell.execute_reply":"2023-08-20T16:08:31.622984Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Get the top 10 values in the 'family' column\ntop_10 = train_df['family'].value_counts().head(10)\ntop_10 = top_10.sort_values(ascending=True)\n# Create a horizontal bar chart\nplt.barh(top_10.index, top_10.values, color='green')\n\n# Add labels and title\nplt.xlabel('Count')\nplt.ylabel('Family')\nplt.title('Top 10 Families')\n\n# Display the chart\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:31.625437Z","iopub.execute_input":"2023-08-20T16:08:31.625774Z","iopub.status.idle":"2023-08-20T16:08:32.010174Z","shell.execute_reply.started":"2023-08-20T16:08:31.625741Z","shell.execute_reply":"2023-08-20T16:08:32.008993Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Get the top 10 values in the 'family' column\ntop_10 = train_df['genus'].value_counts().head(10)\ntop_10 = top_10.sort_values(ascending=True)\n# Create a horizontal bar chart\nplt.barh(top_10.index, top_10.values, color='green')\n\n# Add labels and title\nplt.xlabel('Count')\nplt.ylabel('Genus')\nplt.title('Top 10 Families')\n\n# Display the chart\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:32.011774Z","iopub.execute_input":"2023-08-20T16:08:32.012149Z","iopub.status.idle":"2023-08-20T16:08:32.371832Z","shell.execute_reply.started":"2023-08-20T16:08:32.012115Z","shell.execute_reply":"2023-08-20T16:08:32.370929Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Get the top 10 values in the 'family' column\ntop_10 = train_df['species'].value_counts().head(10)\ntop_10 = top_10.sort_values(ascending=True)\n# Create a horizontal bar chart\nplt.barh(top_10.index, top_10.values, color='green')\n\n# Add labels and title\nplt.xlabel('Count')\nplt.ylabel('species')\nplt.title('Top 10 Families')\n\n# Display the chart\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:32.373487Z","iopub.execute_input":"2023-08-20T16:08:32.374202Z","iopub.status.idle":"2023-08-20T16:08:32.724831Z","shell.execute_reply.started":"2023-08-20T16:08:32.374166Z","shell.execute_reply":"2023-08-20T16:08:32.723928Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Count the number of unique species within each genus and family\nfamily_counts = train_df.groupby('family')['species'].nunique().reset_index()\ngenus_counts = train_df.groupby(['family', 'genus'])['species'].nunique().reset_index()\n\n# Create a treemap using Plotly Express\nfig = px.treemap(genus_counts, \n                 path=['family', 'genus'],  # Define the hierarchy\n                 values='species',  # Use 'species' count as the values\n                 title='Hierarchical Treemap of Families, Genera, and Species Counts')\n\n# Show the treemap\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:32.726457Z","iopub.execute_input":"2023-08-20T16:08:32.727126Z","iopub.status.idle":"2023-08-20T16:08:34.592899Z","shell.execute_reply.started":"2023-08-20T16:08:32.727093Z","shell.execute_reply":"2023-08-20T16:08:34.592076Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"columns_to_drop = ['genus_id', 'category_id', 'scientificName']\ndf_family = train_df.drop(columns=columns_to_drop)\n","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:34.598304Z","iopub.execute_input":"2023-08-20T16:08:34.599186Z","iopub.status.idle":"2023-08-20T16:08:34.630084Z","shell.execute_reply.started":"2023-08-20T16:08:34.59915Z","shell.execute_reply":"2023-08-20T16:08:34.628931Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\n# Splitting the data into train and test sets\ntrain_data, test_data = train_test_split(df_family, test_size=0.2)","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:08:34.632207Z","iopub.execute_input":"2023-08-20T16:08:34.632884Z","iopub.status.idle":"2023-08-20T16:08:34.916709Z","shell.execute_reply.started":"2023-08-20T16:08:34.632848Z","shell.execute_reply":"2023-08-20T16:08:34.91559Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n# Data preprocessing\nbatch_size = 100\nnum_classes = 52  # Replace with the actual number of categories\nimage_size = (150, 150)  # Adjust the size as needed\nepochs = 4  # Adjust the number of training epochs\n\n# Create an ImageDataGenerator without shuffling\ntrain_datagen = ImageDataGenerator(rescale=1.0/255.0, validation_split=0.1)\n\n# Enable shuffling for training data generator\ntrain_generator = train_datagen.flow_from_dataframe(\n    dataframe=train_data,\n    x_col=\"file_name\",  # Column containing image file paths\n    y_col=\"family\",   # Column containing target labels\n    target_size=image_size,\n    batch_size=batch_size,\n    subset='training',\n    class_mode='categorical',  # Specify class mode\n    shuffle=True , # Enable shuffling during training,\n    seed=42\n)\n\n# Enable shuffling for validation data generator\nvalidation_generator = train_datagen.flow_from_dataframe(\n    dataframe=train_data,\n    x_col=\"file_name\",\n    y_col=\"family\",\n    target_size=image_size,\n    batch_size=batch_size,\n    subset='validation',\n    class_mode='categorical',\n    shuffle=True,# Enable shuffling during validation\n    seed=42\n\n)\n","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:25:15.928894Z","iopub.execute_input":"2023-08-20T16:25:15.929879Z","iopub.status.idle":"2023-08-20T16:30:51.161932Z","shell.execute_reply.started":"2023-08-20T16:25:15.929842Z","shell.execute_reply":"2023-08-20T16:30:51.160944Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Shape of the training set\ntrain_steps_per_epoch = train_generator.samples // train_generator.batch_size\ntrain_set_shape = (train_steps_per_epoch, train_generator.batch_size, *train_generator.image_shape)\nprint(\"Training set shape:\", train_set_shape)\n\n# Shape of the validation set\nvalidation_steps_per_epoch = validation_generator.samples // validation_generator.batch_size\nvalidation_set_shape = (validation_steps_per_epoch, validation_generator.batch_size, *validation_generator.image_shape)\nprint(\"Validation set shape:\", validation_set_shape)\n","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:32:44.634964Z","iopub.execute_input":"2023-08-20T16:32:44.635836Z","iopub.status.idle":"2023-08-20T16:32:44.643376Z","shell.execute_reply.started":"2023-08-20T16:32:44.6358Z","shell.execute_reply":"2023-08-20T16:32:44.642219Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras import layers, models\n\n# Define the model\nmodel = models.Sequential()\n\n# Convolutional Layer 1\nmodel.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)))\nmodel.add(layers.MaxPooling2D((2, 2)))\n\n\n# Convolutional Layer 3\nmodel.add(layers.Conv2D(128, (3, 3), activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\n\n# Flatten the output\nmodel.add(layers.Flatten())\n\n# Fully Connected Layers with Dropout\nmodel.add(layers.Dense(512, activation='relu'))\nmodel.add(layers.Dropout(0.5))  # Dropout layer with a 50% dropout rate\nmodel.add(layers.Dense(52, activation='softmax'))  # Assuming 52 classes for classification\n\n# Compile the model\nmodel.compile(optimizer='adam',\n              loss='categorical_crossentropy',\n              metrics=['accuracy'])\n\n# Print the model summary\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:36:18.359542Z","iopub.execute_input":"2023-08-20T16:36:18.359929Z","iopub.status.idle":"2023-08-20T16:36:18.458159Z","shell.execute_reply.started":"2023-08-20T16:36:18.359881Z","shell.execute_reply":"2023-08-20T16:36:18.457398Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs = 5\nhistory = model.fit(\n    train_generator,\n    validation_data=validation_generator,\n    epochs=epochs\n)\n","metadata":{"execution":{"iopub.status.busy":"2023-08-20T16:36:21.576561Z","iopub.execute_input":"2023-08-20T16:36:21.576931Z","iopub.status.idle":"2023-08-20T16:40:28.211389Z","shell.execute_reply.started":"2023-08-20T16:36:21.576899Z","shell.execute_reply":"2023-08-20T16:40:28.20714Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}