{"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 is required due to this error: https://www.kaggle.com/product-feedback/279990\n!pip install --user torch==1.9.0 > /dev/null 2>&1\n\nimport pandas as pd\nfrom pathlib import Path\nfrom PIL import Image\nfrom tqdm.notebook import tqdm\nfrom mpl_toolkits.axes_grid1 import ImageGrid\nfrom PIL import Image, ImageStat\n\nfrom fastai.vision.all import *","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-02-16T08:11:52.999790Z","iopub.execute_input":"2022-02-16T08:11:53.000062Z","iopub.status.idle":"2022-02-16T08:12:00.400895Z","shell.execute_reply.started":"2022-02-16T08:11:53.000031Z","shell.execute_reply":"2022-02-16T08:12:00.400037Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Intro","metadata":{}},{"cell_type":"markdown","source":"In this notebook, I train a basic species classifier on the train set and then predict the species on the test set. The classifier is using resnet34 arch with images resized to 224x224.\n\nAt the end I perform anaylsis to compare the train species distribution with test. I also look at a couple of examples of the top species across both datasets.\n\nMy hope is this will go someways to understanding why the test set appears to be quite different to the train set. See [Adversarial Validation](https://www.kaggle.com/lextoumbourou/happywhale-adversarial-validation).","metadata":{}},{"cell_type":"markdown","source":"# Params","metadata":{}},{"cell_type":"code","source":"SEED = 420\nIMG_SIZE = 224\nBS = 64\nARCH = resnet34\nIMG_PATH_BASE = '../input/happy-whale-512'","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:05:37.428171Z","iopub.execute_input":"2022-02-16T08:05:37.429063Z","iopub.status.idle":"2022-02-16T08:05:37.434445Z","shell.execute_reply.started":"2022-02-16T08:05:37.429013Z","shell.execute_reply":"2022-02-16T08:05:37.433206Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Prepare Data","metadata":{}},{"cell_type":"code","source":"train_df = pd.read_csv('../input/happy-whale-dolphin-q-a-style-eda/train_stats.csv')\ntest_df = pd.read_csv('../input/happy-whale-dolphin-q-a-style-eda/test_stats.csv')","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:05:37.922413Z","iopub.execute_input":"2022-02-16T08:05:37.923243Z","iopub.status.idle":"2022-02-16T08:05:38.316488Z","shell.execute_reply.started":"2022-02-16T08:05:37.923177Z","shell.execute_reply":"2022-02-16T08:05:38.315632Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def remove_corrupt_examples(df, dataset):\n    valid_rows = []\n    num = 0\n    for idx, row in tqdm(df.iterrows(), total=len(df)):\n        try:\n            Image.open(Path(IMG_PATH_BASE)/f'{dataset}_images'/row.image)\n            valid_rows.append(row)\n        except Exception as e:\n            num += 1\n            continue\n\n    print(f'Found {num} corrupt examples')\n    \n    return pd.DataFrame(valid_rows)","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:05:38.318567Z","iopub.execute_input":"2022-02-16T08:05:38.318864Z","iopub.status.idle":"2022-02-16T08:05:38.326527Z","shell.execute_reply.started":"2022-02-16T08:05:38.318823Z","shell.execute_reply":"2022-02-16T08:05:38.325506Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = remove_corrupt_examples(train_df, 'train')\ntest_df = remove_corrupt_examples(test_df, 'test')","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:09:34.681058Z","iopub.execute_input":"2022-02-16T08:09:34.681378Z","iopub.status.idle":"2022-02-16T08:10:00.917146Z","shell.execute_reply.started":"2022-02-16T08:09:34.681343Z","shell.execute_reply":"2022-02-16T08:10:00.916280Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df['image_path'] = IMG_PATH_BASE + '/train_images/' + train_df.image\ntest_df['image_path'] = IMG_PATH_BASE + '/test_images/' + test_df.image","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:10:00.918873Z","iopub.execute_input":"2022-02-16T08:10:00.919302Z","iopub.status.idle":"2022-02-16T08:10:00.926169Z","shell.execute_reply.started":"2022-02-16T08:10:00.919264Z","shell.execute_reply":"2022-02-16T08:10:00.925392Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.species.value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:10:00.928587Z","iopub.execute_input":"2022-02-16T08:10:00.928770Z","iopub.status.idle":"2022-02-16T08:10:00.941976Z","shell.execute_reply.started":"2022-02-16T08:10:00.928748Z","shell.execute_reply":"2022-02-16T08:10:00.941118Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datablock = DataBlock(\n    blocks=(ImageBlock, CategoryBlock),\n    getters=[\n        ColReader('image_path'), ColReader('species')\n    ],\n    splitter=RandomSplitter(seed=SEED),\n    item_tfms=Resize(IMG_SIZE),\n    batch_tfms=aug_transforms(size=IMG_SIZE, max_rotate=30., min_scale=0.75, flip_vert=True, do_flip=True)\n)","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:10:00.943956Z","iopub.execute_input":"2022-02-16T08:10:00.944283Z","iopub.status.idle":"2022-02-16T08:10:00.953646Z","shell.execute_reply.started":"2022-02-16T08:10:00.944250Z","shell.execute_reply":"2022-02-16T08:10:00.952875Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dls = datablock.dataloaders(source=train_df, bs=BS)","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:10:00.955024Z","iopub.execute_input":"2022-02-16T08:10:00.955368Z","iopub.status.idle":"2022-02-16T08:10:01.232493Z","shell.execute_reply.started":"2022-02-16T08:10:00.955333Z","shell.execute_reply":"2022-02-16T08:10:01.231680Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dls.show_batch()","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:09:25.045834Z","iopub.status.idle":"2022-02-16T08:09:25.046337Z","shell.execute_reply.started":"2022-02-16T08:09:25.046068Z","shell.execute_reply":"2022-02-16T08:09:25.046092Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Train Model","metadata":{}},{"cell_type":"code","source":"def get_learner(dls, lr=1e-3):\n    opt_func = partial(Adam, lr=lr, wd=0.01, eps=1e-8)\n\n    learn = cnn_learner(\n        dls, ARCH, opt_func=opt_func, metrics=[accuracy]).to_fp16()\n\n    return learn","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:10:14.151130Z","iopub.execute_input":"2022-02-16T08:10:14.151408Z","iopub.status.idle":"2022-02-16T08:10:14.156886Z","shell.execute_reply.started":"2022-02-16T08:10:14.151370Z","shell.execute_reply":"2022-02-16T08:10:14.155896Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learn = get_learner(dls)","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:10:14.434318Z","iopub.execute_input":"2022-02-16T08:10:14.434769Z","iopub.status.idle":"2022-02-16T08:10:14.862308Z","shell.execute_reply.started":"2022-02-16T08:10:14.434732Z","shell.execute_reply":"2022-02-16T08:10:14.861516Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learn.fit_one_cycle(1)","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:10:15.416493Z","iopub.execute_input":"2022-02-16T08:10:15.417314Z","iopub.status.idle":"2022-02-16T08:10:24.552676Z","shell.execute_reply.started":"2022-02-16T08:10:15.417264Z","shell.execute_reply":"2022-02-16T08:10:24.547936Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learn.unfreeze()\nlearn.fit_one_cycle(4, slice(1e-4, 1e-3))","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:09:25.053425Z","iopub.status.idle":"2022-02-16T08:09:25.054207Z","shell.execute_reply.started":"2022-02-16T08:09:25.053947Z","shell.execute_reply":"2022-02-16T08:09:25.053975Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learn.save('species')","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:09:25.055239Z","iopub.status.idle":"2022-02-16T08:09:25.055988Z","shell.execute_reply.started":"2022-02-16T08:09:25.055738Z","shell.execute_reply":"2022-02-16T08:09:25.055763Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"loss, accuracy = learn.validate()","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:10:31.295910Z","iopub.execute_input":"2022-02-16T08:10:31.296188Z","iopub.status.idle":"2022-02-16T08:10:31.580959Z","shell.execute_reply.started":"2022-02-16T08:10:31.296157Z","shell.execute_reply":"2022-02-16T08:10:31.577605Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(accuracy)","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:09:25.059384Z","iopub.status.idle":"2022-02-16T08:09:25.060146Z","shell.execute_reply.started":"2022-02-16T08:09:25.059906Z","shell.execute_reply":"2022-02-16T08:09:25.059931Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learn.show_results(max_n=9)","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:09:25.061365Z","iopub.status.idle":"2022-02-16T08:09:25.062070Z","shell.execute_reply.started":"2022-02-16T08:09:25.061834Z","shell.execute_reply":"2022-02-16T08:09:25.061858Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Save Test Set Predictions","metadata":{}},{"cell_type":"code","source":"test_dl = dls.test_dl(test_df)","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:10:37.850673Z","iopub.execute_input":"2022-02-16T08:10:37.850951Z","iopub.status.idle":"2022-02-16T08:10:37.858599Z","shell.execute_reply.started":"2022-02-16T08:10:37.850916Z","shell.execute_reply":"2022-02-16T08:10:37.857629Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_preds, _ = learn.get_preds(dl=test_dl)","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:10:40.226053Z","iopub.execute_input":"2022-02-16T08:10:40.226785Z","iopub.status.idle":"2022-02-16T08:10:49.546934Z","shell.execute_reply.started":"2022-02-16T08:10:40.226746Z","shell.execute_reply":"2022-02-16T08:10:49.546063Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df['species_pred'] = [dls.vocab[i] for i in torch.argmax(test_preds, 1)]\ntest_df['species_prob'] = torch.max(test_preds, 1).values\n\ntest_df = test_df[['image', 'species_pred', 'species_prob']]\ntest_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:10:49.549073Z","iopub.execute_input":"2022-02-16T08:10:49.549366Z","iopub.status.idle":"2022-02-16T08:10:49.711078Z","shell.execute_reply.started":"2022-02-16T08:10:49.549326Z","shell.execute_reply":"2022-02-16T08:10:49.710138Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df.to_csv('test_species.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:09:25.069488Z","iopub.status.idle":"2022-02-16T08:09:25.070348Z","shell.execute_reply.started":"2022-02-16T08:09:25.070097Z","shell.execute_reply":"2022-02-16T08:09:25.070121Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Results","metadata":{}},{"cell_type":"markdown","source":"Let's compare the distribution of species predictions in the test set to train.","metadata":{}},{"cell_type":"markdown","source":"## Distribution","metadata":{}},{"cell_type":"code","source":"fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 5))\n\nplt.title('Train vs test species distribution')\ntrain_df.species.value_counts().plot(kind='bar', title='Train species', ax=axes[0])\ntest_df.species_pred.value_counts().plot(kind='bar', title='Test species', ax=axes[1])\naxes[0].bar_label(axes[0].containers[0], padding=5, rotation=45)\naxes[1].bar_label(axes[1].containers[0], padding=5, rotation=45)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:10:51.678837Z","iopub.execute_input":"2022-02-16T08:10:51.679567Z","iopub.status.idle":"2022-02-16T08:10:52.855009Z","shell.execute_reply.started":"2022-02-16T08:10:51.679518Z","shell.execute_reply":"2022-02-16T08:10:52.854214Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Species Counts in Test","metadata":{}},{"cell_type":"code","source":"test_df.species_pred.value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:11:06.195799Z","iopub.execute_input":"2022-02-16T08:11:06.196070Z","iopub.status.idle":"2022-02-16T08:11:06.203745Z","shell.execute_reply.started":"2022-02-16T08:11:06.196042Z","shell.execute_reply":"2022-02-16T08:11:06.202876Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Visualise Species Across Datasets","metadata":{}},{"cell_type":"markdown","source":"Let's look at some example of the most common species across datasets.","metadata":{}},{"cell_type":"code","source":"def image_grid(images, nrows_ncols, title=None, figsize=(16, 5)):\n    fig = plt.figure(figsize=figsize)\n    if title:\n        plt.title(title)\n\n    grid = ImageGrid(fig, 111, nrows_ncols=nrows_ncols, axes_pad=0.1)\n\n    for ax, im in zip(grid, images):\n        ax.imshow(im)\n\n    plt.show()\n\n\ndef load_images(image_ids, dataset, resize=(128, 128)):\n    output = []\n    for i in image_ids:\n        img = Image.open(Path(f'../input/happy-whale-and-dolphin/{dataset}_images')/i)\n        if resize:\n            img = img.resize(resize)\n            \n        output.append(img)\n        \n    return output","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:11:25.208077Z","iopub.execute_input":"2022-02-16T08:11:25.208586Z","iopub.status.idle":"2022-02-16T08:11:25.216471Z","shell.execute_reply.started":"2022-02-16T08:11:25.208545Z","shell.execute_reply":"2022-02-16T08:11:25.215414Z"},"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Humpback Whale","metadata":{}},{"cell_type":"code","source":"img_ids = list(train_df.query('species == \"humpback_whale\"').sample(10).image)\nimages = load_images(img_ids, 'train')\nimage_grid(images, nrows_ncols=(2, 5), figsize=(18, 8), title='Humpback Whale in Train')","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:13:30.644779Z","iopub.execute_input":"2022-02-16T08:13:30.645502Z","iopub.status.idle":"2022-02-16T08:13:33.947737Z","shell.execute_reply.started":"2022-02-16T08:13:30.645457Z","shell.execute_reply":"2022-02-16T08:13:33.947073Z"},"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_ids = list(test_df.query('species_pred == \"humpback_whale\"').sample(10).image)\nimages = load_images(img_ids, 'test')\nimage_grid(images, nrows_ncols=(2, 5), figsize=(18, 8), title='Humpback Whale in Test')","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:13:33.949440Z","iopub.execute_input":"2022-02-16T08:13:33.950156Z","iopub.status.idle":"2022-02-16T08:13:36.855814Z","shell.execute_reply.started":"2022-02-16T08:13:33.950114Z","shell.execute_reply":"2022-02-16T08:13:36.855107Z"},"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Bottlenose Dolphin","metadata":{}},{"cell_type":"code","source":"img_ids = list(train_df.query('species == \"bottlenose_dolphin\"').sample(10).image)\nimages = load_images(img_ids, 'train')\nimage_grid(images, nrows_ncols=(2, 5), figsize=(18, 8), title='Bottlenose Dolphin in Train')","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:12:00.402772Z","iopub.execute_input":"2022-02-16T08:12:00.403063Z","iopub.status.idle":"2022-02-16T08:12:14.246504Z","shell.execute_reply.started":"2022-02-16T08:12:00.403022Z","shell.execute_reply":"2022-02-16T08:12:14.245858Z"},"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_ids = list(test_df.query('species_pred == \"bottlenose_dolphin\"').sample(10).image)\nimages = load_images(img_ids, 'test')\nimage_grid(images, nrows_ncols=(2, 5), figsize=(18, 8), title='Bottlenose Dolphin in Test')","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:12:14.247787Z","iopub.execute_input":"2022-02-16T08:12:14.248653Z","iopub.status.idle":"2022-02-16T08:12:17.325329Z","shell.execute_reply.started":"2022-02-16T08:12:14.248608Z","shell.execute_reply":"2022-02-16T08:12:17.324478Z"},"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Beluga Whale","metadata":{}},{"cell_type":"code","source":"img_ids = list(train_df.query('species == \"beluga\"').sample(10).image)\nimages = load_images(img_ids, 'train')\nimage_grid(images, nrows_ncols=(2, 5), figsize=(18, 8), title='Beluga in Train')","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:14:11.279969Z","iopub.execute_input":"2022-02-16T08:14:11.280232Z","iopub.status.idle":"2022-02-16T08:14:13.099010Z","shell.execute_reply.started":"2022-02-16T08:14:11.280190Z","shell.execute_reply":"2022-02-16T08:14:13.098185Z"},"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_ids = list(test_df.query('species_pred == \"beluga\"').sample(10).image)\nimages = load_images(img_ids, 'test')\nimage_grid(images, nrows_ncols=(2, 5), figsize=(18, 8), title='Beluga in Test')","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:14:33.373354Z","iopub.execute_input":"2022-02-16T08:14:33.373805Z","iopub.status.idle":"2022-02-16T08:14:35.838115Z","shell.execute_reply.started":"2022-02-16T08:14:33.373769Z","shell.execute_reply":"2022-02-16T08:14:35.837206Z"},"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Blue Whale","metadata":{}},{"cell_type":"code","source":"img_ids = list(train_df.query('species == \"blue_whale\"').sample(10).image)\nimages = load_images(img_ids, 'train')\nimage_grid(images, nrows_ncols=(2, 5), figsize=(18, 8), title='Blue Whale in Train')","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:15:53.616262Z","iopub.execute_input":"2022-02-16T08:15:53.616925Z","iopub.status.idle":"2022-02-16T08:15:55.719710Z","shell.execute_reply.started":"2022-02-16T08:15:53.616888Z","shell.execute_reply":"2022-02-16T08:15:55.719094Z"},"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_ids = list(test_df.query('species_pred == \"blue_whale\"').sample(10).image)\nimages = load_images(img_ids, 'test')\nimage_grid(images, nrows_ncols=(2, 5), figsize=(18, 8), title='Blue Whale in Test')","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:16:04.095358Z","iopub.execute_input":"2022-02-16T08:16:04.095622Z","iopub.status.idle":"2022-02-16T08:16:06.116707Z","shell.execute_reply.started":"2022-02-16T08:16:04.095590Z","shell.execute_reply":"2022-02-16T08:16:06.116096Z"},"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### False Killer Whale","metadata":{}},{"cell_type":"code","source":"img_ids = list(train_df.query('species == \"false_killer_whale\"').sample(10).image)\nimages = load_images(img_ids, 'train')\nimage_grid(images, nrows_ncols=(2, 5), figsize=(18, 8), title='False Killer Whale in Train')","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:16:29.482143Z","iopub.execute_input":"2022-02-16T08:16:29.482791Z","iopub.status.idle":"2022-02-16T08:16:32.178053Z","shell.execute_reply.started":"2022-02-16T08:16:29.482754Z","shell.execute_reply":"2022-02-16T08:16:32.177132Z"},"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_ids = list(test_df.query('species_pred == \"false_killer_whale\"').sample(10).image)\nimages = load_images(img_ids, 'test')\nimage_grid(images, nrows_ncols=(2, 5), figsize=(18, 8), title='False Killer Whale in Test')","metadata":{"execution":{"iopub.status.busy":"2022-02-16T08:16:39.636672Z","iopub.execute_input":"2022-02-16T08:16:39.636954Z","iopub.status.idle":"2022-02-16T08:16:42.071804Z","shell.execute_reply.started":"2022-02-16T08:16:39.636922Z","shell.execute_reply":"2022-02-16T08:16:42.071103Z"},"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]}]}