{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":127713,"databundleVersionId":15291341,"sourceType":"competition"}],"dockerImageVersionId":31260,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# **Data**","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport seaborn as sns \nimport matplotlib.pyplot as plt  \n\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\nfrom collections import Counter \n\nfrom PIL import Image\nimport random\n\nimport os\nimport cv2\n\nimport tensorflow as tf \nimport keras\n\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import (\n    Conv2D, MaxPooling2D,\n    BatchNormalization,\n    Dense, Dropout, Flatten\n)\n\nfrom tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau\n\nfrom sklearn.metrics import classification_report, confusion_matrix","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-09T16:22:09.699230Z","iopub.execute_input":"2026-02-09T16:22:09.699567Z","iopub.status.idle":"2026-02-09T16:22:28.858472Z","shell.execute_reply.started":"2026-02-09T16:22:09.699543Z","shell.execute_reply":"2026-02-09T16:22:28.857762Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Paths \n\ntrain_dir = '/kaggle/input/anime-gender-classification/dataset/train_images'\nval_dir  = '/kaggle/input/anime-gender-classification/dataset/val_images'\n\ntrain_csv = '/kaggle/input/anime-gender-classification/dataset/train.csv'\nval_csv   = '/kaggle/input/anime-gender-classification/dataset/val.csv'\n\ntrain_df = pd.read_csv(train_csv)\nval_df   = pd.read_csv(val_csv)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-09T16:22:34.432483Z","iopub.execute_input":"2026-02-09T16:22:34.432791Z","iopub.status.idle":"2026-02-09T16:22:34.467770Z","shell.execute_reply.started":"2026-02-09T16:22:34.432759Z","shell.execute_reply":"2026-02-09T16:22:34.467115Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(f\"Training data size: {len(train_df)}\")\nprint(f\"Validation data size: {len(val_df)}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-09T16:22:42.141773Z","iopub.execute_input":"2026-02-09T16:22:42.142104Z","iopub.status.idle":"2026-02-09T16:22:42.147360Z","shell.execute_reply.started":"2026-02-09T16:22:42.142078Z","shell.execute_reply":"2026-02-09T16:22:42.146665Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Make sure that labels are string \n\ntrain_df['label'] = train_df['label'].astype(str)\nval_df['label']   = val_df['label'].astype(str)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-09T16:22:43.638384Z","iopub.execute_input":"2026-02-09T16:22:43.638694Z","iopub.status.idle":"2026-02-09T16:22:43.647988Z","shell.execute_reply.started":"2026-02-09T16:22:43.638667Z","shell.execute_reply":"2026-02-09T16:22:43.647139Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"0 → \"0\"\n\n1 → \"1\"\n\nTrue → \"True\"\n\n**Why**\n\nMany ML libraries (especially Keras, TensorFlow, ImageDataGenerator, flow_from_dataframe, etc.) treat binary class mode differently depending on \nthe label type.\n\n**Common reasons:**\n\n 1-Avoid class mode errors\n\n   * Some APIs expect class labels as strings, not integers.\n\n   * If labels are numeric, the library might think you’re doing regression instead of classification.\n\n 2-Consistent class handling\n\n   * Strings are treated as categorical labels, not numbers with mathematical meaning.\n\n   * Prevents weird bugs like wrong loss functions or output shapes.\n\n 3-Compatibility with generators\n \n     For example:\n      class_mode=\"binary\"\n      \n     often works more reliably when labels are strings.","metadata":{}},{"cell_type":"code","source":"train_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-08T18:47:55.581099Z","iopub.execute_input":"2026-02-08T18:47:55.581420Z","iopub.status.idle":"2026-02-08T18:47:55.605923Z","shell.execute_reply.started":"2026-02-08T18:47:55.581394Z","shell.execute_reply":"2026-02-08T18:47:55.605291Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":" train_dir = \"/kaggle/input/anime-gender-classification/dataset/train_images\"\n\nlabels = []     # ['masculine', 'feminine', 'feminine', 'feminine', 'feminine',.....]  \n\nfor img in os.listdir(train_dir):\n    if img.endswith(\".jpg\"):\n        label = img.split(\"_\")[0]   # feminine or masculine\n        labels.append(label)\n\ncounts = Counter(labels)\n\nprint(\"Class distribution:\")\nfor label, count in counts.items():\n    print(f\"{label}: {count}\")\n    \n# Or \n# Counter(f.split(\"_\")[0] for f in os.listdir(train_dir) if f.endswith(\".jpg\"))  # one line compact code","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-09T16:22:47.318513Z","iopub.execute_input":"2026-02-09T16:22:47.318880Z","iopub.status.idle":"2026-02-09T16:22:47.396215Z","shell.execute_reply.started":"2026-02-09T16:22:47.318841Z","shell.execute_reply":"2026-02-09T16:22:47.395429Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Why this is useful ?**\n\n  * Detect class imbalance\n\n  * Decide whether to use class weights\n\n  * Avoid biased models","metadata":{}},{"cell_type":"markdown","source":"# **Visualizations**","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(6, 4))\nplt.bar(counts.keys(), counts.values())\nplt.xlabel(\"Class\")\nplt.ylabel(\"Number of Images\")\nplt.title(\"Class Distribution in train_images\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-08T18:48:01.028222Z","iopub.execute_input":"2026-02-08T18:48:01.029192Z","iopub.status.idle":"2026-02-08T18:48:01.192142Z","shell.execute_reply.started":"2026-02-08T18:48:01.029163Z","shell.execute_reply":"2026-02-08T18:48:01.191443Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_dir = \"/kaggle/input/anime-gender-classification/dataset/train_images\"\n\nimage_files = [img for img in os.listdir(train_dir) if img.endswith(\".jpg\")] #['masculine_01629.jpg','feminine_02295.jpg','feminine_00611.jpg']\n\nsample_images = random.sample(image_files, 9)\n\nplt.figure(figsize=(10, 10))\n\nfor i, img_name in enumerate(sample_images):\n    img_path = os.path.join(train_dir, img_name)\n    img = Image.open(img_path)\n\n    plt.subplot(3, 3, i + 1)\n    plt.imshow(img)\n    plt.title(img_name.split(\"_\")[0])  # feminine / masculine\n    plt.axis(\"off\")\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-08T18:48:04.023283Z","iopub.execute_input":"2026-02-08T18:48:04.024099Z","iopub.status.idle":"2026-02-08T18:48:05.032940Z","shell.execute_reply.started":"2026-02-08T18:48:04.024068Z","shell.execute_reply":"2026-02-08T18:48:05.031955Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **Prepare Generator**","metadata":{}},{"cell_type":"code","source":"# Data augmentation for training\n\ntrain_datagen = ImageDataGenerator( \n    rescale=1.0/255,\n    rotation_range=20, \n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    zoom_range=0.15,\n    horizontal_flip=True,\n    fill_mode='nearest'\n\n)\n\n\ntrain_generator = train_datagen.flow_from_dataframe(\n    dataframe = train_df,\n    directory = train_dir,\n    x_col='id',\n    y_col='label',\n    target_size=(150, 150),                             \n    batch_size=32,                                      \n    seed=42,\n    class_mode='binary'\n   \n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-09T16:22:53.270783Z","iopub.execute_input":"2026-02-09T16:22:53.271111Z","iopub.status.idle":"2026-02-09T16:23:05.706893Z","shell.execute_reply.started":"2026-02-09T16:22:53.271083Z","shell.execute_reply":"2026-02-09T16:23:05.706120Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Validation \n\nvalidation_datagen  = ImageDataGenerator( rescale = 1.0/255.)    # Rescale pixel values to [0, 1]\n\nvalidation_generator = validation_datagen.flow_from_dataframe(\n    \n     dataframe=val_df,\n     directory=val_dir,\n     x_col='id',\n     y_col='label',\n     target_size = (150, 150),\n     batch_size=32,\n     class_mode  = 'binary',\n     shuffle = False                      #shuffle=False to keep the order of image labels matching the generator & \n                                                                         #get good results in Confusion_Matrix  \n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-09T16:23:08.119182Z","iopub.execute_input":"2026-02-09T16:23:08.119659Z","iopub.status.idle":"2026-02-09T16:23:09.686439Z","shell.execute_reply.started":"2026-02-09T16:23:08.119630Z","shell.execute_reply":"2026-02-09T16:23:09.685796Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# show augmentation\n\nplt.figure(figsize=(10, 10))\nfor i in range(0, 15):\n    plt.subplot(5, 3, i+1)\n    for img, label in train_generator:\n        image = img[0]\n        plt.imshow(image)\n        plt.axis(\"off\")\n        break\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-08T18:48:31.325502Z","iopub.execute_input":"2026-02-08T18:48:31.326129Z","iopub.status.idle":"2026-02-08T18:48:38.075036Z","shell.execute_reply.started":"2026-02-08T18:48:31.326105Z","shell.execute_reply":"2026-02-08T18:48:38.074092Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **Model**","metadata":{}},{"cell_type":"code","source":"model = Sequential([\n    \n    Conv2D(32, (3, 3), activation=\"relu\", input_shape=(150, 150, 3)),\n    BatchNormalization(),\n    MaxPooling2D(2,2),\n\n    Conv2D(64, (3, 3), activation=\"relu\"),\n    BatchNormalization(),\n    MaxPooling2D(2,2),\n\n    Conv2D(128, (3, 3), activation=\"relu\"),\n    BatchNormalization(),\n    MaxPooling2D(2,2),\n\n    Flatten(),\n    Dense(128, activation=\"relu\"),\n    Dropout(0.5),\n    Dense(1, activation=\"sigmoid\")  # binary output\n])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-09T16:23:13.560297Z","iopub.execute_input":"2026-02-09T16:23:13.560608Z","iopub.status.idle":"2026-02-09T16:23:15.901976Z","shell.execute_reply.started":"2026-02-09T16:23:13.560581Z","shell.execute_reply":"2026-02-09T16:23:15.901349Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"callbacks = [\n    EarlyStopping(\n        monitor=\"val_loss\",\n        patience=4,\n        restore_best_weights=True\n    ),\n    ReduceLROnPlateau(\n        monitor=\"val_loss\",\n        factor=0.3,\n        patience=2,\n        min_lr=1e-6\n    )\n]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-09T16:23:22.790670Z","iopub.execute_input":"2026-02-09T16:23:22.791544Z","iopub.status.idle":"2026-02-09T16:23:22.795603Z","shell.execute_reply.started":"2026-02-09T16:23:22.791512Z","shell.execute_reply":"2026-02-09T16:23:22.794739Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.compile(optimizer=\"adam\",loss=\"binary_crossentropy\",metrics=[\"accuracy\"])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-09T16:23:26.101427Z","iopub.execute_input":"2026-02-09T16:23:26.101761Z","iopub.status.idle":"2026-02-09T16:23:26.117381Z","shell.execute_reply.started":"2026-02-09T16:23:26.101735Z","shell.execute_reply":"2026-02-09T16:23:26.116490Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history = model.fit(train_generator,validation_data=validation_generator,epochs=15,callbacks=callbacks)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-09T16:23:27.981553Z","iopub.execute_input":"2026-02-09T16:23:27.981847Z","iopub.status.idle":"2026-02-09T16:34:09.360487Z","shell.execute_reply.started":"2026-02-09T16:23:27.981822Z","shell.execute_reply":"2026-02-09T16:34:09.359709Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.save(\"anime_gender_model.h5\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-09T16:34:14.867165Z","iopub.execute_input":"2026-02-09T16:34:14.867980Z","iopub.status.idle":"2026-02-09T16:34:15.011306Z","shell.execute_reply.started":"2026-02-09T16:34:14.867948Z","shell.execute_reply":"2026-02-09T16:34:15.010510Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-08T15:44:52.094439Z","iopub.execute_input":"2026-02-08T15:44:52.094753Z","iopub.status.idle":"2026-02-08T15:44:52.115951Z","shell.execute_reply.started":"2026-02-08T15:44:52.094728Z","shell.execute_reply":"2026-02-08T15:44:52.115272Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(1, figsize = (15,8))    \nplt.subplot(221)  \nplt.plot(history.history['accuracy'],'b')  \nplt.plot(history.history['val_accuracy'],'r')  \nplt.title('model accuracy')  \nplt.ylabel('accuracy')  \nplt.xlabel('epoch')  \nplt.legend(['train', 'valid']) \n    \nplt.subplot(222)  \nplt.plot(history.history['loss'],'b')  \nplt.plot(history.history['val_loss'],'r')  \nplt.title('model loss')  \nplt.ylabel('loss')  \nplt.xlabel('epoch')  \nplt.legend(['train', 'valid']) \n\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-08T19:38:39.016014Z","iopub.execute_input":"2026-02-08T19:38:39.016782Z","iopub.status.idle":"2026-02-08T19:38:39.254348Z","shell.execute_reply.started":"2026-02-08T19:38:39.016755Z","shell.execute_reply":"2026-02-08T19:38:39.253771Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **Evaluation**","metadata":{}},{"cell_type":"code","source":"model.evaluate(validation_generator)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-08T19:45:38.838916Z","iopub.execute_input":"2026-02-08T19:45:38.839250Z","iopub.status.idle":"2026-02-08T19:45:41.243753Z","shell.execute_reply.started":"2026-02-08T19:45:38.839223Z","shell.execute_reply":"2026-02-08T19:45:41.243152Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"predictions = model.predict(validation_generator)   #array([[6.3398965e-02],[9.6359056e-01],[6.0288010e-09],...]])\n    \npredicted_labels = (predictions > 0.5).astype(int).ravel()  #array([0, 1, 0, 0, 1,..])\n\ntrue_labels = validation_generator.classes  # [0,1,0,0,1,.......]\n\nlabels = ['Feminine', 'Masculine']\n\nprint(classification_report(true_labels,predicted_labels,target_names=labels))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-08T20:09:21.364874Z","iopub.execute_input":"2026-02-08T20:09:21.365469Z","iopub.status.idle":"2026-02-08T20:09:23.256834Z","shell.execute_reply.started":"2026-02-08T20:09:21.365442Z","shell.execute_reply":"2026-02-08T20:09:23.256114Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"confusion_mtx = confusion_matrix(true_labels,predicted_labels) \n\nf,ax = plt.subplots(figsize = (8,4),dpi=100)\nsns.heatmap(confusion_mtx, annot=True, linewidths=0.1,\n            cmap = \"coolwarm\", linecolor=\"white\",\n            fmt='.0f', ax=ax,cbar=False,\n            xticklabels=labels, yticklabels=labels)\n\nplt.xlabel(\"Predicted Label\",fontsize=10)\nplt.ylabel(\"True Label\",fontsize=10)\nplt.title(\"Confusion Matrix\",fontsize=13)\n\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-08T20:19:22.325917Z","iopub.execute_input":"2026-02-08T20:19:22.326188Z","iopub.status.idle":"2026-02-08T20:19:22.406653Z","shell.execute_reply.started":"2026-02-08T20:19:22.326166Z","shell.execute_reply":"2026-02-08T20:19:22.405896Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Get class index mapping\nclass_indices = validation_generator.class_indices\nidx_to_class = {v: k for k, v in class_indices.items()}\n\n# Get predictions\npred_probs = model.predict(validation_generator)\npred_labels = (pred_probs > 0.5).astype(int).ravel()\n\ntrue_labels = validation_generator.classes\nfilenames = validation_generator.filenames\n\n# Plot settings\nn_images = 9\nindices = random.sample(range(len(filenames)), n_images)\n\nplt.figure(figsize=(12, 12))\n\nfor i, idx in enumerate(indices):\n    img_path = validation_generator.directory + \"/\" + filenames[idx]\n    img = plt.imread(img_path)\n\n    true_label = idx_to_class[true_labels[idx]]\n    pred_label = idx_to_class[pred_labels[idx]]\n    confidence = pred_probs[idx][0]\n\n    plt.subplot(3, 3, i + 1)\n    plt.imshow(img)\n    plt.axis(\"off\")\n\n    plt.title(\n        f\"True: {true_label}\\nPred: {pred_label} ({confidence:.2f})\",\n        color=\"green\" if true_label == pred_label else \"red\"\n    )\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-08T20:30:26.962051Z","iopub.execute_input":"2026-02-08T20:30:26.962378Z","iopub.status.idle":"2026-02-08T20:30:30.558249Z","shell.execute_reply.started":"2026-02-08T20:30:26.962347Z","shell.execute_reply":"2026-02-08T20:30:30.556898Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **Predict Test Data**","metadata":{}},{"cell_type":"code","source":"test_datagen = ImageDataGenerator(rescale=1./255)\n\ntest_generator = test_datagen.flow_from_directory(\n    directory=\"/kaggle/input/anime-gender-classification/dataset\",\n    classes=[\"test_images\"],          #“Inside dataset/, read images from test_images/ even though it’s not a real class.”\n    target_size=(150, 150),\n    batch_size=32,\n    class_mode=None,              \n    shuffle=False                 \n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-08T21:28:26.051622Z","iopub.execute_input":"2026-02-08T21:28:26.052445Z","iopub.status.idle":"2026-02-08T21:28:26.338505Z","shell.execute_reply.started":"2026-02-08T21:28:26.052394Z","shell.execute_reply":"2026-02-08T21:28:26.337946Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_probs = model.predict(test_generator)\n\n# Convert probabilities to class labels\ntest_labels = (pred_probs > 0.5).astype(int).ravel()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-08T21:36:57.904887Z","iopub.execute_input":"2026-02-08T21:36:57.905214Z","iopub.status.idle":"2026-02-08T21:36:59.799203Z","shell.execute_reply.started":"2026-02-08T21:36:57.905189Z","shell.execute_reply":"2026-02-08T21:36:59.798597Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"label_map = {1: \"feminine\", 0: \"masculine\"}\npred_classes = [label_map[i] for i in test_labels]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-08T21:46:45.006862Z","iopub.execute_input":"2026-02-08T21:46:45.007541Z","iopub.status.idle":"2026-02-08T21:46:45.011095Z","shell.execute_reply.started":"2026-02-08T21:46:45.007515Z","shell.execute_reply":"2026-02-08T21:46:45.010420Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"filenames = test_generator.filenames\nfilenames = [f.replace(\"test_images/\", \"\") for f in filenames]\n\nsubmission_df = pd.DataFrame({\n    \"image\": filenames,\n    \"label\": pred_classes\n})\n\nsubmission_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-08T21:47:29.979714Z","iopub.execute_input":"2026-02-08T21:47:29.979976Z","iopub.status.idle":"2026-02-08T21:47:29.989402Z","shell.execute_reply.started":"2026-02-08T21:47:29.979955Z","shell.execute_reply":"2026-02-08T21:47:29.988668Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission_df = pd.DataFrame({\n    \"id\": filenames,\n    \"label\": test_labels\n})\n\nsubmission_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-08T21:51:07.684069Z","iopub.execute_input":"2026-02-08T21:51:07.684403Z","iopub.status.idle":"2026-02-08T21:51:07.692179Z","shell.execute_reply.started":"2026-02-08T21:51:07.684365Z","shell.execute_reply":"2026-02-08T21:51:07.691600Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **Submission**","metadata":{}},{"cell_type":"code","source":"submission_df.to_csv(\"submission.csv\", index=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-08T21:53:25.870513Z","iopub.execute_input":"2026-02-08T21:53:25.870816Z","iopub.status.idle":"2026-02-08T21:53:25.877039Z","shell.execute_reply.started":"2026-02-08T21:53:25.870794Z","shell.execute_reply":"2026-02-08T21:53:25.876338Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-08T21:53:28.337083Z","iopub.execute_input":"2026-02-08T21:53:28.337830Z","iopub.status.idle":"2026-02-08T21:53:28.345105Z","shell.execute_reply.started":"2026-02-08T21:53:28.337800Z","shell.execute_reply":"2026-02-08T21:53:28.344441Z"}},"outputs":[],"execution_count":null}]}