{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":91844,"databundleVersionId":11361821,"isSourceIdPinned":false,"sourceType":"competition"},{"sourceId":13694490,"sourceType":"datasetVersion","datasetId":8710577},{"sourceId":13694726,"sourceType":"datasetVersion","datasetId":8710758}],"dockerImageVersionId":31192,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\n\n# =====================================================\n# Step 1 — Ensemble weights\n# =====================================================\nsub_w = [0.75, 0.25]\n\n# =====================================================\n# Step 2 — Load submissions and sample\n# =====================================================\nsample = pd.read_csv('/kaggle/input/birdclef-2025/sample_submission.csv')\ndf0 = pd.read_csv('/kaggle/input/ensemble/submission.csv')\ndf1 = pd.read_csv('/kaggle/input/ensemble/submission1.csv')\n\n# =====================================================\n# Step 3 — Make sure both have same number of rows/columns\n# =====================================================\n# If they’re longer than sample, trim them\nmin_len = min(len(df0), len(df1), len(sample))\ndf0 = df0.head(min_len)\ndf1 = df1.head(min_len)\nsample = sample.head(min_len)\n\n# =====================================================\n# Step 4 — Weighted average of prediction columns\n# =====================================================\ndfs = sample.copy()\ndfs.iloc[:, 1:] = df0.iloc[:, 1:] * sub_w[0] + df1.iloc[:, 1:] * sub_w[1]\n\n# Replace row_ids with the sample’s (so Kaggle format is correct)\ndfs['row_id'] = sample['row_id']\n\n# =====================================================\n# Step 5 — Save final submission file\n# =====================================================\ndfs.to_csv('/kaggle/working/submission.csv', index=False)\n\nprint(\"✅ submission.csv created successfully (no NaNs)!\")\nprint(\"Shape:\", dfs.shape)\nprint(dfs.head())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T14:13:53.471687Z","iopub.execute_input":"2025-11-11T14:13:53.471945Z","iopub.status.idle":"2025-11-11T14:13:53.530675Z","shell.execute_reply.started":"2025-11-11T14:13:53.471930Z","shell.execute_reply":"2025-11-11T14:13:53.529769Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# import os\n# import pandas as pd\n\n# sub_w=[0.75, 0.25]\n\n\n# list_TARGETs = sorted(os.listdir('/kaggle/input/birdclef-2025/train_audio/'))\n# list_targets_0 = [f'{TARGET} 0' for TARGET in list_TARGETs]\n# list_targets_1 = [f'{TARGET} 1' for TARGET in list_TARGETs]\n\n# df0 = pd.read_csv(\"/kaggle/input/ensemble/submission.csv\")\n# df1 = pd.read_csv(\"/kaggle/input/ensemble/submission1.csv\")\n\n# df0 = df0.rename(columns={TARGET : f'{TARGET} 0' for TARGET in list_TARGETs})\n# df1 = df1.rename(columns={TARGET : f'{TARGET} 1' for TARGET in list_TARGETs})\n\n# dfs = pd.merge(df0,df1,on=['row_id'])\n\n# for i in range(len(list_TARGETs)):\n#     dfs[list_TARGETs[i]] = dfs[list_targets_0[i]]*sub_w[0] + sub_w[1]*dfs[list_targets_1[i]]\n             \n# for col0,col1 in zip(list_targets_0, list_targets_1):\n#     del dfs[col0]\n#     del dfs[col1]\n    \n    \n# dfs.to_csv(\"submission.csv\", index=False)\n\n\nimport os\nimport pandas as pd\n\n# =====================================================\n# STEP 1 — Setup\n# =====================================================\nsub_w = [0.75, 0.25]\n\n# Get all target species\nlist_TARGETs = sorted(os.listdir('/kaggle/input/birdclef-2025/train_audio/'))\nlist_targets_0 = [f'{TARGET} 0' for TARGET in list_TARGETs]\nlist_targets_1 = [f'{TARGET} 1' for TARGET in list_TARGETs]\n\n# =====================================================\n# STEP 2 — Read the two submission files\n# =====================================================\ndf0 = pd.read_csv('/kaggle/input/ensemble/submission.csv')\ndf1 = pd.read_csv('/kaggle/input/ensemble/submission1.csv')\n\n# Rename columns to distinguish sources\ndf0 = df0.rename(columns={TARGET: f'{TARGET} 0' for TARGET in list_TARGETs})\ndf1 = df1.rename(columns={TARGET: f'{TARGET} 1' for TARGET in list_TARGETs})\n\n# =====================================================\n# STEP 3 — Merge and compute ensemble\n# =====================================================\n# Merge with outer join to keep all rows\ndfs = pd.merge(df0, df1, on=['row_id'], how='outer').fillna(0)\n\nfor i in range(len(list_TARGETs)):\n    dfs[list_TARGETs[i]] = (\n        dfs[list_targets_0[i]] * sub_w[0] +\n        dfs[list_targets_1[i]] * sub_w[1]\n    )\n\n# Drop temporary columns\nfor col0, col1 in zip(list_targets_0, list_targets_1):\n    del dfs[col0]\n    del dfs[col1]\n\n\n# =====================================================\n# STEP 4 — Filter only valid test-like rows (_5, _10, _15)\n# =====================================================\ndfs = dfs[dfs['row_id'].str.endswith(('_5', '_10', '_15'))].reset_index(drop=True)\n\nprint(\"Filtered rows:\", dfs.shape[0])\nprint(\"Sample row_ids after filtering:\")\nprint(dfs['row_id'].head())\n\n# =====================================================\n# STEP 5 — Match the Kaggle sample submission format\n# =====================================================\nsample = pd.read_csv('/kaggle/input/birdclef-2025/sample_submission.csv')\n\n# Make sure column structure matches\nsample.iloc[:, 1:] = dfs.iloc[:len(sample), 1:].values\n\n# =====================================================\n# STEP 6 — Save final valid submission\n# =====================================================\nsample.to_csv('/kaggle/working/submission.csv', index=False)\n\nprint(\"✅ submission.csv created successfully!\")\nprint(sample.head())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T14:07:14.793445Z","iopub.execute_input":"2025-11-11T14:07:14.793737Z","iopub.status.idle":"2025-11-11T14:07:15.640329Z","shell.execute_reply.started":"2025-11-11T14:07:14.793718Z","shell.execute_reply":"2025-11-11T14:07:15.639159Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nprint(os.listdir('/kaggle/working'))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T14:07:15.641560Z","iopub.execute_input":"2025-11-11T14:07:15.641807Z","iopub.status.idle":"2025-11-11T14:07:15.646843Z","shell.execute_reply.started":"2025-11-11T14:07:15.641786Z","shell.execute_reply":"2025-11-11T14:07:15.645871Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Before filtering:\", len(pd.read_csv('/kaggle/input/ensemble/submission.csv')))\nprint(\"After merge:\", dfs.shape[0])\nprint(\"After filtering (_5,_10,_15):\", dfs.shape[0])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T14:07:15.745093Z","iopub.execute_input":"2025-11-11T14:07:15.745884Z","iopub.status.idle":"2025-11-11T14:07:15.761086Z","shell.execute_reply.started":"2025-11-11T14:07:15.745860Z","shell.execute_reply":"2025-11-11T14:07:15.760223Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dfs.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T14:07:17.362388Z","iopub.execute_input":"2025-11-11T14:07:17.362672Z","iopub.status.idle":"2025-11-11T14:07:17.378190Z","shell.execute_reply.started":"2025-11-11T14:07:17.362657Z","shell.execute_reply":"2025-11-11T14:07:17.377097Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample = pd.read_csv('/kaggle/input/birdclef-2025/sample_submission.csv')\nsample.head(100)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-11T14:08:10.843196Z","iopub.execute_input":"2025-11-11T14:08:10.843441Z","iopub.status.idle":"2025-11-11T14:08:10.866394Z","shell.execute_reply.started":"2025-11-11T14:08:10.843427Z","shell.execute_reply":"2025-11-11T14:08:10.865768Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}