{"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":"# Prepare data","metadata":{}},{"cell_type":"code","source":"!pip install --upgrade fastai\nimport os\nimport numpy as np\nimport pandas as pd\nfrom fastai.vision.all import *\nnp.set_printoptions(threshold=sys.maxsize)\n\n# setup data paths\ninput_dir = os.path.join(\"/kaggle\", \"input\", \"digit-recognizer\")\ntrain_data_raw = os.path.join(input_dir, \"train.csv\")\ntest_data_raw = os.path.join(input_dir, \"test.csv\")\nimages_dir = os.path.join(\"/kaggle\", \"working\", \"images\")\nif not os.path.exists(images_dir): os.makedirs(images_dir, exist_ok=True)\n\n# function to create images from csv\ndef save_as_img(dir_path, element, img_data, label=None):\n    if label is None: label = \"\" # test data has no label\n    label_dir = os.path.join(dir_path, str(label))\n    os.makedirs(label_dir, exist_ok=True)\n    file_name = str(element) + \".jpeg\"\n    img_path = os.path.join(label_dir, file_name)\n    if not os.path.exists(img_path):\n        img_data = img_data.values\n        img_data = img_data.reshape(28, 28)\n        img_data = img_data.astype(np.uint8)\n        img = Image.fromarray(img_data)\n        img.save(img_path)\n\n# function to iterate over data\ndef run_over_data(data, data_label):\n    for element, row in data:\n        if data_label == \"train\":\n            label = row[0]\n            img_data = row[1:]\n            save_path = os.path.join(images_dir, data_label)\n            save_as_img(save_path, element, img_data, label)\n        else:\n            # test data has no label\n            img_data = row\n            save_path = os.path.join(images_dir, data_label)\n            save_as_img(save_path, element, img_data, label=None)\n\n# load data via pd\ntrain = pd.read_csv(train_data_raw).iterrows()\ntest = pd.read_csv(test_data_raw).iterrows()\n\n# save images\nrun_over_data(train,\"train\")\nrun_over_data(test,\"test\")","metadata":{"execution":{"iopub.status.busy":"2023-09-20T18:14:08.238936Z","iopub.execute_input":"2023-09-20T18:14:08.239438Z","iopub.status.idle":"2023-09-20T18:14:43.916421Z","shell.execute_reply.started":"2023-09-20T18:14:08.239394Z","shell.execute_reply":"2023-09-20T18:14:43.915169Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Cleanup broken images","metadata":{}},{"cell_type":"code","source":"list_to_remove = [Path('/kaggle/working/images/train/3/16220.jpeg'),Path('/kaggle/working/images/train/1/7389.jpeg'),Path('/kaggle/working/images/train/4/37013.jpeg'),Path('/kaggle/working/images/train/9/15065.jpeg'),Path('/kaggle/working/images/train/3/28560.jpeg'),Path('/kaggle/working/images/train/6/27478.jpeg'),Path('/kaggle/working/images/train/6/18283.jpeg'),Path('/kaggle/working/images/train/6/3997.jpeg'),Path('/kaggle/working/images/train/7/27307.jpeg'),Path('/kaggle/working/images/train/1/18989.jpeg'),Path('/kaggle/working/images/train/3/6163.jpeg'),\nPath('/kaggle/working/images/train/5/19478.jpeg'),Path('/kaggle/working/images/train/4/516.jpeg'),Path('/kaggle/working/images/train/3/20172.jpeg'),Path('/kaggle/working/images/train/0/2915.jpeg'),Path('/kaggle/working/images/train/9/799.jpeg'),Path('/kaggle/working/images/train/8/5747.jpeg'),Path('/kaggle/working/images/train/9/35063.jpeg'),Path('/kaggle/working/images/train/8/25073.jpeg'),Path('/kaggle/working/images/train/7/38424.jpeg'),\nPath('/kaggle/working/images/train/3/20638.jpeg'),Path('/kaggle/working/images/train/3/24237.jpeg'),Path('/kaggle/working/images/train/9/38927.jpeg'),Path('/kaggle/working/images/train/9/29678.jpeg'),Path('/kaggle/working/images/train/3/13309.jpeg'),Path('/kaggle/working/images/train/9/3912.jpeg'),Path('/kaggle/working/images/train/3/4392.jpeg'),Path('/kaggle/working/images/train/8/8136.jpeg'),Path('/kaggle/working/images/train/0/7505.jpeg'),Path('/kaggle/working/images/train/9/23005.jpeg'),\nPath('/kaggle/working/images/train/3/39816.jpeg'),Path('/kaggle/working/images/train/3/25074.jpeg'),Path('/kaggle/working/images/train/8/38049.jpeg'),Path('/kaggle/working/images/train/2/38874.jpeg'),Path('/kaggle/working/images/train/2/35094.jpeg'),Path('/kaggle/working/images/train/2/7475.jpeg'),Path('/kaggle/working/images/train/9/28134.jpeg'),Path('/kaggle/working/images/train/1/191.jpeg'),Path('/kaggle/working/images/train/3/90.jpeg'),Path('/kaggle/working/images/train/1/36763.jpeg'),\nPath('/kaggle/working/images/train/2/3960.jpeg'),Path('/kaggle/working/images/train/9/40257.jpeg'),Path('/kaggle/working/images/train/8/22089.jpeg'),Path('/kaggle/working/images/train/8/32770.jpeg'),Path('/kaggle/working/images/train/9/2723.jpeg'),Path('/kaggle/working/images/train/9/13920.jpeg'),Path('/kaggle/working/images/train/4/5659.jpeg'),Path('/kaggle/working/images/train/4/1224.jpeg'),Path('/kaggle/working/images/train/0/14090.jpeg'),Path('/kaggle/working/images/train/1/8147.jpeg'),\nPath('/kaggle/working/images/train/9/34117.jpeg'),Path('/kaggle/working/images/train/9/30794.jpeg'),Path('/kaggle/working/images/train/7/679.jpeg'),Path('/kaggle/working/images/train/0/23231.jpeg'),Path('/kaggle/working/images/train/7/24210.jpeg'),Path('/kaggle/working/images/train/0/6543.jpeg'),Path('/kaggle/working/images/train/4/34775.jpeg'),Path('/kaggle/working/images/train/9/17489.jpeg'),Path('/kaggle/working/images/train/8/39114.jpeg'),Path('/kaggle/working/images/train/1/6515.jpeg'),\nPath('/kaggle/working/images/train/9/25747.jpeg'),Path('/kaggle/working/images/train/4/4072.jpeg'),Path('/kaggle/working/images/train/7/504.jpeg'),Path('/kaggle/working/images/train/7/28529.jpeg'),Path('/kaggle/working/images/train/4/6112.jpeg'),Path('/kaggle/working/images/train/2/1869.jpeg'),Path('/kaggle/working/images/train/7/12532.jpeg'),Path('/kaggle/working/images/train/1/24622.jpeg'),Path('/kaggle/working/images/train/8/30019.jpeg'),Path('/kaggle/working/images/train/7/40010.jpeg'),\nPath('/kaggle/working/images/train/2/10644.jpeg'),Path('/kaggle/working/images/train/9/24462.jpeg'),Path('/kaggle/working/images/train/9/19386.jpeg'),Path('/kaggle/working/images/train/8/13864.jpeg'),Path('/kaggle/working/images/train/6/31730.jpeg'),Path('/kaggle/working/images/train/7/41833.jpeg'),Path('/kaggle/working/images/train/4/3309.jpeg'),Path('/kaggle/working/images/train/2/40637.jpeg'),Path('/kaggle/working/images/train/0/7369.jpeg'),Path('/kaggle/working/images/train/1/11983.jpeg'),\nPath('/kaggle/working/images/train/3/25112.jpeg'),Path('/kaggle/working/images/train/9/27211.jpeg'),Path('/kaggle/working/images/train/4/30548.jpeg'),Path('/kaggle/working/images/train/1/12468.jpeg'),Path('/kaggle/working/images/train/9/12772.jpeg'),Path('/kaggle/working/images/train/7/16337.jpeg'),Path('/kaggle/working/images/train/6/5320.jpeg'),Path('/kaggle/working/images/train/2/27063.jpeg'),Path('/kaggle/working/images/train/3/9693.jpeg'),Path('/kaggle/working/images/train/7/8638.jpeg'),\nPath('/kaggle/working/images/train/9/37947.jpeg'),Path('/kaggle/working/images/train/8/31876.jpeg'),Path('/kaggle/working/images/train/2/20891.jpeg'),Path('/kaggle/working/images/train/9/429.jpeg'),Path('/kaggle/working/images/train/2/5288.jpeg'),Path('/kaggle/working/images/train/7/21824.jpeg'),Path('/kaggle/working/images/train/1/622.jpeg'),Path('/kaggle/working/images/train/0/18260.jpeg'),Path('/kaggle/working/images/train/5/11037.jpeg'),Path('/kaggle/working/images/train/5/1001.jpeg'),\nPath('/kaggle/working/images/train/6/5124.jpeg') ,Path('/kaggle/working/images/train/5/32054.jpeg') ,Path('/kaggle/working/images/train/6/17399.jpeg') ,Path('/kaggle/working/images/train/9/33675.jpeg') ,Path('/kaggle/working/images/train/7/4254.jpeg') ,Path('/kaggle/working/images/train/7/2981.jpeg') ,Path('/kaggle/working/images/train/5/25172.jpeg') ,Path('/kaggle/working/images/train/7/10384.jpeg') ,Path('/kaggle/working/images/train/8/17325.jpeg') ,Path('/kaggle/working/images/train/1/41275.jpeg'),\nPath('/kaggle/working/images/train/1/29296.jpeg') ,Path('/kaggle/working/images/train/9/29238.jpeg') ,Path('/kaggle/working/images/train/4/37544.jpeg') ,Path('/kaggle/working/images/train/4/15281.jpeg') ,Path('/kaggle/working/images/train/0/8062.jpeg') ,Path('/kaggle/working/images/train/1/5843.jpeg') ,Path('/kaggle/working/images/train/5/41294.jpeg') ,Path('/kaggle/working/images/train/4/26182.jpeg') ,Path('/kaggle/working/images/train/1/13477.jpeg') ,Path('/kaggle/working/images/train/0/23327.jpeg'),\nPath('/kaggle/working/images/train/0/36755.jpeg') ,Path('/kaggle/working/images/train/7/4047.jpeg') ,Path('/kaggle/working/images/train/1/13929.jpeg') ,Path('/kaggle/working/images/train/6/7833.jpeg') ,Path('/kaggle/working/images/train/8/9956.jpeg') ,Path('/kaggle/working/images/train/4/30543.jpeg') ,Path('/kaggle/working/images/train/6/35710.jpeg') ,Path('/kaggle/working/images/train/5/36390.jpeg') ,Path('/kaggle/working/images/train/7/6952.jpeg') ,Path('/kaggle/working/images/train/6/24307.jpeg'),\nPath('/kaggle/working/images/train/6/9472.jpeg') ,Path('/kaggle/working/images/train/5/36453.jpeg') ,Path('/kaggle/working/images/train/2/644.jpeg') ,Path('/kaggle/working/images/train/3/14101.jpeg') ,Path('/kaggle/working/images/train/7/11033.jpeg') ,Path('/kaggle/working/images/train/3/1901.jpeg') ,Path('/kaggle/working/images/train/2/26661.jpeg') ,Path('/kaggle/working/images/train/3/24153.jpeg') ,Path('/kaggle/working/images/train/9/23135.jpeg') ,Path('/kaggle/working/images/train/2/16598.jpeg'),\nPath('/kaggle/working/images/train/2/759.jpeg') ,Path('/kaggle/working/images/train/5/10803.jpeg') ,Path('/kaggle/working/images/train/5/453.jpeg') ,Path('/kaggle/working/images/train/1/17219.jpeg') ,Path('/kaggle/working/images/train/0/17016.jpeg') ,Path('/kaggle/working/images/train/1/11960.jpeg') ,Path('/kaggle/working/images/train/9/30278.jpeg') ,Path('/kaggle/working/images/train/7/5690.jpeg') ,Path('/kaggle/working/images/train/0/22833.jpeg') ,Path('/kaggle/working/images/train/5/40604.jpeg'),\nPath('/kaggle/working/images/train/4/23788.jpeg') ,Path('/kaggle/working/images/train/1/19811.jpeg') ,Path('/kaggle/working/images/train/3/5734.jpeg') ,Path('/kaggle/working/images/train/9/2513.jpeg') ,Path('/kaggle/working/images/train/7/40246.jpeg') ,Path('/kaggle/working/images/train/4/4924.jpeg') ,Path('/kaggle/working/images/train/7/9612.jpeg') ,Path('/kaggle/working/images/train/9/21130.jpeg') ,Path('/kaggle/working/images/train/6/10535.jpeg') ,Path('/kaggle/working/images/train/8/29063.jpeg'),\nPath('/kaggle/working/images/train/1/7526.jpeg') ,Path('/kaggle/working/images/train/3/19285.jpeg') ,Path('/kaggle/working/images/train/7/19599.jpeg') ,Path('/kaggle/working/images/train/2/21199.jpeg') ,Path('/kaggle/working/images/train/1/34124.jpeg') ,Path('/kaggle/working/images/train/0/39283.jpeg') ,Path('/kaggle/working/images/train/7/8873.jpeg') ,Path('/kaggle/working/images/train/7/21778.jpeg') ,Path('/kaggle/working/images/train/9/37162.jpeg') ,Path('/kaggle/working/images/train/8/5896.jpeg'),\n\nPath('/kaggle/working/images/train/9/38343.jpeg') ,Path('/kaggle/working/images/train/7/21717.jpeg') ,Path('/kaggle/working/images/train/9/27861.jpeg') ,Path('/kaggle/working/images/train/5/13609.jpeg') ,Path('/kaggle/working/images/train/0/38911.jpeg') ,Path('/kaggle/working/images/train/9/35883.jpeg') ,Path('/kaggle/working/images/train/8/30363.jpeg') ,Path('/kaggle/working/images/train/3/27313.jpeg') ,Path('/kaggle/working/images/train/9/14143.jpeg') ,Path('/kaggle/working/images/train/2/11094.jpeg'),\nPath('/kaggle/working/images/train/9/28197.jpeg') ,Path('/kaggle/working/images/train/2/40976.jpeg') ,Path('/kaggle/working/images/train/5/15796.jpeg') ,Path('/kaggle/working/images/train/8/25619.jpeg') ,Path('/kaggle/working/images/train/0/15356.jpeg') ,Path('/kaggle/working/images/train/3/3095.jpeg') ,Path('/kaggle/working/images/train/5/25468.jpeg') ,Path('/kaggle/working/images/train/9/2372.jpeg') ,Path('/kaggle/working/images/train/8/197.jpeg') ,Path('/kaggle/working/images/train/8/22888.jpeg'),\nPath('/kaggle/working/images/train/2/15429.jpeg') ,Path('/kaggle/working/images/train/4/1538.jpeg') ,Path('/kaggle/working/images/train/9/7764.jpeg') ,Path('/kaggle/working/images/train/1/39143.jpeg') ,Path('/kaggle/working/images/train/0/3059.jpeg') ,Path('/kaggle/working/images/train/7/29172.jpeg') ,Path('/kaggle/working/images/train/4/36830.jpeg') ,Path('/kaggle/working/images/train/9/39558.jpeg') ,Path('/kaggle/working/images/train/0/15790.jpeg') ,Path('/kaggle/working/images/train/6/20669.jpeg'),\nPath('/kaggle/working/images/train/5/125.jpeg') ,Path('/kaggle/working/images/train/2/24499.jpeg') ,Path('/kaggle/working/images/train/4/41691.jpeg') ,Path('/kaggle/working/images/train/9/36569.jpeg') ,Path('/kaggle/working/images/train/5/26785.jpeg') ,Path('/kaggle/working/images/train/2/24971.jpeg') ,Path('/kaggle/working/images/train/9/12520.jpeg') ,Path('/kaggle/working/images/train/2/5390.jpeg') ,Path('/kaggle/working/images/train/9/20954.jpeg') ,Path('/kaggle/working/images/train/6/4020.jpeg') ,\nPath('/kaggle/working/images/train/6/27977.jpeg') ,Path('/kaggle/working/images/train/9/31781.jpeg') ,Path('/kaggle/working/images/train/2/26848.jpeg') ,Path('/kaggle/working/images/train/8/36984.jpeg') ,Path('/kaggle/working/images/train/6/35007.jpeg') ,Path('/kaggle/working/images/train/5/37625.jpeg') ,Path('/kaggle/working/images/train/8/7992.jpeg') ,Path('/kaggle/working/images/train/8/40868.jpeg') ,Path('/kaggle/working/images/train/0/4400.jpeg') ,Path('/kaggle/working/images/train/6/28733.jpeg') ,\nPath('/kaggle/working/images/train/3/37706.jpeg') ,Path('/kaggle/working/images/train/3/32468.jpeg') ,Path('/kaggle/working/images/train/7/25234.jpeg') ,Path('/kaggle/working/images/train/2/14924.jpeg') ,Path('/kaggle/working/images/train/5/13928.jpeg') ,Path('/kaggle/working/images/train/9/34274.jpeg') ,Path('/kaggle/working/images/train/1/7173.jpeg') ,Path('/kaggle/working/images/train/0/18898.jpeg') ,Path('/kaggle/working/images/train/7/18909.jpeg') ,Path('/kaggle/working/images/train/2/4972.jpeg') ,\n\n                 ]\n\nfor i in list_to_remove:\n    if os.path.exists(i):\n        os.remove(i)","metadata":{"execution":{"iopub.status.busy":"2023-09-20T18:14:43.922645Z","iopub.execute_input":"2023-09-20T18:14:43.925200Z","iopub.status.idle":"2023-09-20T18:14:43.990054Z","shell.execute_reply.started":"2023-09-20T18:14:43.925141Z","shell.execute_reply":"2023-09-20T18:14:43.989055Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Create DataBlock","metadata":{}},{"cell_type":"code","source":"data_loader = DataBlock(\n    blocks=(ImageBlock, CategoryBlock),\n    get_items=get_image_files,\n    splitter=RandomSplitter(valid_pct=0.2, seed=69), # should use seed to properly evaluate accuracy of the model\n    get_y=lambda x: Path(x).parent.name, \n    batch_tfms=aug_transforms(do_flip=False, max_zoom=1.25)\n).dataloaders(images_dir + '/train')","metadata":{"execution":{"iopub.status.busy":"2023-09-20T18:14:43.994681Z","iopub.execute_input":"2023-09-20T18:14:43.997536Z","iopub.status.idle":"2023-09-20T18:14:49.570861Z","shell.execute_reply.started":"2023-09-20T18:14:43.997494Z","shell.execute_reply":"2023-09-20T18:14:49.569769Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Find optimal learning rate","metadata":{}},{"cell_type":"code","source":"learn = vision_learner(data_loader, resnet34, metrics=[error_rate, accuracy]).to_fp16()\n# print(learn, dir(learn.model))\n\n# learn.lr_find(suggest_funcs=(valley, slide))\n\n#\"https://download.pytorch.org/models/resnet152-394f9c45.pth\"\n#\"https://download.pytorch.org/models/resnet18-f37072fd.pth\" # resnet18\n#\"https://download.pytorch.org/models/resnet34-b627a593.pth\" # resnet34\n#\"https://download.pytorch.org/models/resnet50-0676ba61.pth\" # resnet50\n#\"https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_1k_224.pth\"","metadata":{"execution":{"iopub.status.busy":"2023-09-20T18:14:49.577411Z","iopub.execute_input":"2023-09-20T18:14:49.579952Z","iopub.status.idle":"2023-09-20T18:14:50.328427Z","shell.execute_reply.started":"2023-09-20T18:14:49.579908Z","shell.execute_reply":"2023-09-20T18:14:50.327306Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Train model","metadata":{}},{"cell_type":"code","source":"learn.fine_tune(17, 0.01) # should be 17 epochs","metadata":{"execution":{"iopub.status.busy":"2023-09-20T18:14:50.330077Z","iopub.execute_input":"2023-09-20T18:14:50.330798Z","iopub.status.idle":"2023-09-20T18:41:29.596608Z","shell.execute_reply.started":"2023-09-20T18:14:50.330756Z","shell.execute_reply":"2023-09-20T18:41:29.595406Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Validate","metadata":{}},{"cell_type":"code","source":"probs, targs = learn.get_preds(dl=data_loader.valid)\nerror_rate(probs, targs)","metadata":{"execution":{"iopub.status.busy":"2023-09-20T18:41:29.601549Z","iopub.execute_input":"2023-09-20T18:41:29.604485Z","iopub.status.idle":"2023-09-20T18:41:44.475844Z","shell.execute_reply.started":"2023-09-20T18:41:29.604433Z","shell.execute_reply":"2023-09-20T18:41:44.474666Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Save model\n","metadata":{}},{"cell_type":"code","source":"learn.save('resnet34ft')","metadata":{"execution":{"iopub.status.busy":"2023-09-20T18:41:44.480919Z","iopub.execute_input":"2023-09-20T18:41:44.483501Z","iopub.status.idle":"2023-09-20T18:41:45.405290Z","shell.execute_reply.started":"2023-09-20T18:41:44.483453Z","shell.execute_reply":"2023-09-20T18:41:45.403954Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learn.show_results()","metadata":{"execution":{"iopub.status.busy":"2023-09-20T18:41:45.411322Z","iopub.execute_input":"2023-09-20T18:41:45.413941Z","iopub.status.idle":"2023-09-20T18:41:46.219653Z","shell.execute_reply.started":"2023-09-20T18:41:45.413897Z","shell.execute_reply":"2023-09-20T18:41:46.218652Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Check which images nn has struggle with","metadata":{}},{"cell_type":"code","source":"interp = Interpretation.from_learner(learn)\ninterp.plot_top_losses(30, figsize=(15,10))\nfull_list = interp.top_losses(30, items=True)[-1]\n# print(\"[\")\n# for i in full_list:\n#     print(repr(i),\",\")\n# print(\"]\")","metadata":{"execution":{"iopub.status.busy":"2023-09-20T18:41:46.224399Z","iopub.execute_input":"2023-09-20T18:41:46.226938Z","iopub.status.idle":"2023-09-20T18:42:02.517929Z","shell.execute_reply.started":"2023-09-20T18:41:46.226894Z","shell.execute_reply":"2023-09-20T18:42:02.516749Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Check results against test dataset","metadata":{}},{"cell_type":"code","source":"test_imgs = get_image_files(images_dir+\"/test\")\ntest_data_loader = learn.dls.test_dl(test_imgs)\n\npredictions, _ = learn.tta(dl=test_data_loader)\npredictions = np.argmax(predictions,axis=1)","metadata":{"execution":{"iopub.status.busy":"2023-09-20T18:42:02.524980Z","iopub.execute_input":"2023-09-20T18:42:02.528311Z","iopub.status.idle":"2023-09-20T18:44:59.492541Z","shell.execute_reply.started":"2023-09-20T18:42:02.528258Z","shell.execute_reply":"2023-09-20T18:44:59.491338Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Prepare submission file","metadata":{}},{"cell_type":"code","source":"img_id = [int(os.path.splitext(os.path.split(path)[-1])[0]) for path in test_imgs]\nimg_id = [id_num+1 for id_num in img_id]\n\nsubmission  = pd.DataFrame({\"ImageId\": img_id, \"Label\": predictions})\nif os.path.exists(\"submission.csv\"): os.remove(\"submission.csv\")\nsubmission.to_csv(\"submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2023-09-20T18:44:59.497680Z","iopub.execute_input":"2023-09-20T18:44:59.500213Z","iopub.status.idle":"2023-09-20T18:44:59.881109Z","shell.execute_reply.started":"2023-09-20T18:44:59.500155Z","shell.execute_reply":"2023-09-20T18:44:59.880012Z"},"trusted":true},"execution_count":null,"outputs":[]}]}