{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.11"},"kaggle":{"accelerator":"None","isGpuEnabled":false,"isInternetEnabled":false,"language":"python","sourceType":"notebook","title":"RSNA EXP004 SCA fuse v2","slug":"rsna-exp004-sca-fuse-v2"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","metadata":{},"source":"# EXP-004 S+C+A fold0 mean\\n\\nFusion of verified fold0 preds: Sagittal + Coronal + Axial (equal mean).\\nSources: EXP-003 S+C fold0 + EXP-004 Axial fold0. CPU only, no train.\\n对照: Axial-only 0.687 / S+C 0.685\\n"},{"id":"sca-write","cell_type":"code","metadata":{},"execution_count":null,"outputs":[],"source":"# CPU fuse S+C+A, built on official sample_submission template\nimport os\nimport pandas as pd\n\nLABELS = [\"ACL\",\"MCL\",\"Medial Meniscus\",\"Lateral Meniscus\",\"Medial OA\",\"Lateral OA\",\"PF OA\",\"Effusion\",\"Synovitis\",\"Baker's\",\"Contusion\",\"Fracture\"]\nUIDS = [\n    \"1.2.826.0.1.3680043.8.498.10047035057544427318018579121635276191\",\n    \"1.2.826.0.1.3680043.8.498.10062861783145312629332250977456991776\",\n    \"1.2.826.0.1.3680043.8.498.10067514707072572280263481548497591402\",\n]\nMAT = [\n    [0.215147,0.190089,0.452847,0.289981,0.485116,0.375366,0.462332,0.649049,0.711361,0.628495,0.440981,0.313309],\n    [0.515632,0.350477,0.558518,0.457548,0.716756,0.602650,0.640394,0.730228,0.794088,0.564254,0.588383,0.527248],\n    [0.256196,0.238297,0.516013,0.307317,0.516263,0.379391,0.460635,0.517342,0.686815,0.436991,0.496831,0.297566],\n]\n\n# Prefer official sample template from competition mount\nsample_path = None\nfor root, dirs, files in os.walk(\"/kaggle/input\"):\n    if \"sample_submission.csv\" in files and \"train_series\" not in root and \"test_series\" not in root:\n        # competition root usually contains sample_submission.csv\n        p = os.path.join(root, \"sample_submission.csv\")\n        if os.path.isfile(p):\n            sample_path = p\n            # keep walking to prefer competitions/<slug>/sample_submission.csv\n            if \"/competitions/\" in p or p.endswith(\"rsna-knee-abnormality-detection/sample_submission.csv\"):\n                break\nprint(\"sample_path\", sample_path)\nif sample_path and os.path.isfile(sample_path):\n    df = pd.read_csv(sample_path)\n    print(\"template shape\", df.shape, \"cols\", list(df.columns))\nelse:\n    df = pd.DataFrame({\"StudyInstanceUID\": UIDS})\n    for c in LABELS:\n        df[c] = 0.5\n    print(\"fallback template\", df.shape)\n\nassert \"StudyInstanceUID\" in df.columns\nassert list(df.columns) == [\"StudyInstanceUID\"] + LABELS or set(df.columns) == set([\"StudyInstanceUID\"] + LABELS)\n# align columns order to template\ncols = list(df.columns)\n# fill by UID\nmat_df = pd.DataFrame(MAT, columns=LABELS)\nmat_df.insert(0, \"StudyInstanceUID\", UIDS)\nmerged = df[[\"StudyInstanceUID\"]].merge(mat_df, on=\"StudyInstanceUID\", how=\"left\")\nassert not merged[LABELS].isna().any().any(), \"UID not matched in template\"\nout = merged[[\"StudyInstanceUID\"] + [c for c in cols if c != \"StudyInstanceUID\"]]\n# keep exact template column order\nout = out[cols]\nout.to_csv(\"submission.csv\", index=False)\nprint(out.to_string())\nprint(\"wrote submission.csv\", os.path.getsize(\"submission.csv\"), \"bytes\")\n"}]}