{"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":"none","dataSources":[{"sourceId":118765,"databundleVersionId":15231210,"sourceType":"competition"}],"dockerImageVersionId":31259,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"\ndef get_window_codes(seq, i, nt_map, w=2):\n    \"\"\"\n    seq : RNA sequence (string)\n    i   : 0-based index\n    w   : window radius (2 → size 5)\n    \"\"\"\n    codes = []\n    for j in range(i - w, i + w + 1):\n        if j < 0 or j >= len(seq):\n            codes.append(-1)  # padding\n        else:\n            codes.append(nt_map[seq[j]])\n    return codes\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:53:31.237874Z","iopub.execute_input":"2026-01-18T08:53:31.238289Z","iopub.status.idle":"2026-01-18T08:53:31.249972Z","shell.execute_reply.started":"2026-01-18T08:53:31.238255Z","shell.execute_reply":"2026-01-18T08:53:31.248864Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\nsubmission = pd.read_csv(\n    '/kaggle/input/stanford-rna-3d-folding-2/sample_submission.csv'\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:53:31.25247Z","iopub.execute_input":"2026-01-18T08:53:31.253237Z","iopub.status.idle":"2026-01-18T08:53:31.687828Z","shell.execute_reply.started":"2026-01-18T08:53:31.253175Z","shell.execute_reply":"2026-01-18T08:53:31.686546Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ============================================================\n# Stanford RNA 3D Folding – ML Sliding Window Baseline (±2)\n# COMPLETE RUN-ALL NOTEBOOK\n# ============================================================\n\n# ---------------------------\n# 1. GLOBAL SETUP\n# ---------------------------\nimport pandas as pd\nimport numpy as np\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.ensemble import RandomForestRegressor\n\nprint(\"Libraries loaded\")\n\n# Nucleotide encoding\nnt_map = {'A': 0, 'C': 1, 'G': 2, 'U': 3}\n\n# ---------------------------\n# 2. LOAD DATA\n# ---------------------------\ntrain_seq = pd.read_csv(\n    '/kaggle/input/stanford-rna-3d-folding-2/train_sequences.csv'\n)\n\ntrain_lbl = pd.read_csv(\n    '/kaggle/input/stanford-rna-3d-folding-2/train_labels.csv'\n)\n\ntest_seq = pd.read_csv(\n    '/kaggle/input/stanford-rna-3d-folding-2/test_sequences.csv'\n)\n\nsample = pd.read_csv(\n    '/kaggle/input/stanford-rna-3d-folding-2/sample_submission.csv'\n)\n\nprint(\"Data loaded\")\n\n# ---------------------------\n# 3. PREPARE TRAIN DATA\n# ---------------------------\n# Extract target_id from label IDs\ntrain_lbl['target_id'] = train_lbl['ID'].str.split('_').str[0]\n\n# Merge sequences into labels\ntrain = train_lbl.merge(\n    train_seq[['target_id', 'sequence']],\n    on='target_id',\n    how='left'\n)\n\n# Drop rows with missing coordinates\ntrain_clean = train.dropna(\n    subset=['x_1', 'y_1', 'z_1', 'sequence']\n).copy()\n\nprint(\"train_clean shape:\", train_clean.shape)\n\n# ---------------------------\n# 4. SLIDING WINDOW FUNCTION\n# ---------------------------\ndef window_encode(seq, idx, w=2):\n    codes = []\n    for j in range(idx - w, idx + w + 1):\n        if j < 0 or j >= len(seq):\n            codes.append(-1)\n        else:\n            codes.append(nt_map[seq[j]])\n    return codes\n\n# ---------------------------\n# 5. BUILD TRAIN FEATURES\n# ---------------------------\nX = []\ny = []\n\nfor row in train_clean.itertuples():\n    seq = row.sequence\n    i = row.resid - 1  # 0-based index\n\n    win = window_encode(seq, i, w=2)\n    pos_norm = row.resid / len(seq)\n    seq_len = len(seq)\n\n    X.append(win + [pos_norm, seq_len])\n    y.append([row.x_1, row.y_1, row.z_1])\n\nX = np.array(X)\ny = np.array(y)\n\nprint(\"Feature matrix:\", X.shape)\nprint(\"Target matrix:\", y.shape)\n\n# ---------------------------\n# 6. SUBSAMPLE (FOR SPEED)\n# ---------------------------\nnp.random.seed(42)\nidx = np.random.choice(len(X), size=200_000, replace=False)\n\nX_sub = X[idx]\ny_sub = y[idx]\n\nprint(\"Subsampled:\", X_sub.shape)\n\n# ---------------------------\n# 7. TRAIN MODEL\n# ---------------------------\nX_train, X_val, y_train, y_val = train_test_split(\n    X_sub, y_sub, test_size=0.2, random_state=42\n)\n\nmodel = RandomForestRegressor(\n    n_estimators=100,\n    max_depth=12,\n    random_state=42,\n    n_jobs=-1\n)\n\nmodel.fit(X_train, y_train)\n\nprint(\"Model trained successfully\")\n\n# ---------------------------\n# 8. BUILD TEST FEATURES\n# ---------------------------\ntest_feats = []\nids = []\n\nfor _, row in test_seq.iterrows():\n    seq = row.sequence\n    tid = row.target_id\n    L = len(seq)\n\n    for i in range(L):\n        win = window_encode(seq, i, w=2)\n        pos_norm = (i + 1) / L\n        test_feats.append(win + [pos_norm, L])\n        ids.append((tid, i + 1))\n\nX_test = np.array(test_feats)\n\nprint(\"Test features:\", X_test.shape)\n\n# ---------------------------\n# 9. PREDICT COORDINATES\n# ---------------------------\npred_xyz = model.predict(X_test)\n\n# ---------------------------\n# 10. CREATE SUBMISSION\n# ---------------------------\nsubmission = sample.copy()\n\npred_map = {\n    f\"{tid}_{rid}\": tuple(pred_xyz[i])\n    for i, (tid, rid) in enumerate(ids)\n}\n\nfor k in range(1, 6):\n    submission[[f'x_{k}', f'y_{k}', f'z_{k}']] = submission['ID'].apply(\n        lambda x: pred_map[x]\n    ).tolist()\n\nsubmission.to_csv('/kaggle/working/submission.csv', index=False)\nprint(\"Final submission saved:\", submission.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:53:31.689353Z","iopub.execute_input":"2026-01-18T08:53:31.689706Z","iopub.status.idle":"2026-01-18T08:55:26.899618Z","shell.execute_reply.started":"2026-01-18T08:53:31.689673Z","shell.execute_reply":"2026-01-18T08:55:26.898339Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# === FINAL SAFETY CLAMP (REQUIRED FOR KAGGLE) ===\ncoord_cols = [c for c in submission.columns if c.startswith(('x_', 'y_', 'z_'))]\n\nsubmission[coord_cols] = submission[coord_cols].clip(-50, 50)\nsubmission[coord_cols] = submission[coord_cols].fillna(0.0)\n\nprint(\"After clamp:\")\nprint(\"Min coord:\", submission[coord_cols].min().min())\nprint(\"Max coord:\", submission[coord_cols].max().max())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:55:26.901556Z","iopub.execute_input":"2026-01-18T08:55:26.902234Z","iopub.status.idle":"2026-01-18T08:55:26.942775Z","shell.execute_reply.started":"2026-01-18T08:55:26.902175Z","shell.execute_reply":"2026-01-18T08:55:26.941505Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# FINAL CHECKS (MANDATORY)\n\nimport numpy as np\n\nprint(\"submission shape:\", submission.shape)\nprint(\"columns:\", submission.columns.tolist())\n\ncoord_cols = [c for c in submission.columns if c.startswith(('x_', 'y_', 'z_'))]\n\nprint(\"Any NaN:\", submission[coord_cols].isna().any().any())\nprint(\"Any Inf:\", np.isinf(submission[coord_cols].values).any())\nprint(\"Min coord:\", submission[coord_cols].min().min())\nprint(\"Max coord:\", submission[coord_cols].max().max())\n\nsubmission.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:55:26.945358Z","iopub.execute_input":"2026-01-18T08:55:26.945811Z","iopub.status.idle":"2026-01-18T08:55:26.998592Z","shell.execute_reply.started":"2026-01-18T08:55:26.945767Z","shell.execute_reply":"2026-01-18T08:55:26.997172Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission.to_csv('submission.csv', index=False)\nprint(\"submission.csv saved:\", submission.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:55:26.999875Z","iopub.execute_input":"2026-01-18T08:55:27.000238Z","iopub.status.idle":"2026-01-18T08:55:27.145355Z","shell.execute_reply.started":"2026-01-18T08:55:27.000209Z","shell.execute_reply":"2026-01-18T08:55:27.143771Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n\n# Reload sample fresh (important)\nsubmission = pd.read_csv(\n    '/kaggle/input/stanford-rna-3d-folding-2/sample_submission.csv'\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:55:27.146654Z","iopub.execute_input":"2026-01-18T08:55:27.147071Z","iopub.status.idle":"2026-01-18T08:55:27.173693Z","shell.execute_reply.started":"2026-01-18T08:55:27.14704Z","shell.execute_reply":"2026-01-18T08:55:27.171704Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"coord_cols = [c for c in submission.columns if c.startswith(('x_', 'y_', 'z_'))]\n\n# Fill with your predictions (example assumes pred_xyz exists)\nfor i in range(1, 6):\n    submission[[f'x_{i}', f'y_{i}', f'z_{i}']] = submission['ID'].map(\n        lambda x: pred_map[x]\n    ).tolist()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:55:27.175454Z","iopub.execute_input":"2026-01-18T08:55:27.175935Z","iopub.status.idle":"2026-01-18T08:55:27.262657Z","shell.execute_reply.started":"2026-01-18T08:55:27.17587Z","shell.execute_reply":"2026-01-18T08:55:27.26161Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ============================================================\n# 1. IMPORTS\n# ============================================================\nimport pandas as pd\nimport numpy as np\nfrom sklearn.ensemble import RandomForestRegressor\n\nprint(\"Libraries loaded\")\n\n\n# ============================================================\n# 2. LOAD DATA\n# ============================================================\nDATA_PATH = \"/kaggle/input/stanford-rna-3d-folding-2\"\n\ntrain_seq = pd.read_csv(f\"{DATA_PATH}/train_sequences.csv\")\ntrain_lbl = pd.read_csv(f\"{DATA_PATH}/train_labels.csv\")\ntest_seq  = pd.read_csv(f\"{DATA_PATH}/test_sequences.csv\")\n\nprint(\"Data loaded\")\n\n\n# ============================================================\n# 3. PREPARE TRAIN DATA\n# ============================================================\n# Add target_id to labels\ntrain_lbl[\"target_id\"] = train_lbl[\"ID\"].str.split(\"_\").str[0]\n\n# Merge sequence\ntrain = train_lbl.merge(\n    train_seq[[\"target_id\", \"sequence\"]],\n    on=\"target_id\",\n    how=\"left\"\n)\n\n# Drop missing\ntrain = train.dropna(subset=[\"sequence\"])\n\nprint(\"train shape:\", train.shape)\n\n\n# ============================================================\n# 4. FEATURE ENGINEERING\n# ============================================================\nnt_map = {\"A\": 0, \"C\": 1, \"G\": 2, \"U\": 3}\n\ntrain[\"nt_code\"] = train[\"resname\"].map(nt_map)\ntrain[\"seq_len\"] = train[\"sequence\"].str.len()\ntrain[\"pos_norm\"] = train[\"resid\"] / train[\"seq_len\"]\n\nfeatures = [\"nt_code\", \"pos_norm\", \"seq_len\"]\n# Remove rows with missing coordinates\ntrain_clean = train.dropna(subset=[\"x_1\", \"y_1\", \"z_1\"]).copy()\n\nX = train_clean[features]\ny = train_clean[[\"x_1\", \"y_1\", \"z_1\"]]\n\n\n# Subsample for speed\nX = X.iloc[:200_000]\ny = y.iloc[:200_000]\n\nprint(\"Feature matrix:\", X.shape)\nprint(\"Target matrix:\", y.shape)\n\n\n# ============================================================\n# 5. TRAIN MODEL\n# ============================================================\nmodel = RandomForestRegressor(\n    n_estimators=50,\n    max_depth=12,\n    n_jobs=-1,\n    random_state=42\n)\n\nmodel.fit(X, y)\nprint(\"Model trained successfully\")\n\n\n# ============================================================\n# 6. BUILD TEST FEATURES\n# ============================================================\nrows = []\n\nfor _, row in test_seq.iterrows():\n    tid = row.target_id\n    seq = row.sequence\n    L = len(seq)\n    for i, nt in enumerate(seq, start=1):\n        rows.append([tid, i, nt_map[nt], i / L, L])\n\ntest_feat = pd.DataFrame(\n    rows,\n    columns=[\"target_id\", \"resid\", \"nt_code\", \"pos_norm\", \"seq_len\"]\n)\n\nprint(\"Test features:\", test_feat.shape)\n\n\n# ============================================================\n# 7. PREDICT\n# ============================================================\npred_xyz = model.predict(test_feat[features])\nprint(\"Predictions generated:\", pred_xyz.shape)\n\n\n# ============================================================\n# 8. BUILD pred_map (CRITICAL STEP)\n# ============================================================\npred_map = {}\n\nfor i, row in test_feat.iterrows():\n    key = f\"{row.target_id}_{row.resid}\"\n    pred_map[key] = (\n        float(pred_xyz[i, 0]),\n        float(pred_xyz[i, 1]),\n        float(pred_xyz[i, 2])\n    )\n\nprint(\"pred_map size:\", len(pred_map))\n\n\n# ============================================================\n# 9. BUILD SUBMISSION FROM SAMPLE (SAFE)\n# ============================================================\nsubmission = pd.read_csv(f\"{DATA_PATH}/sample_submission.csv\")\n\nfor i in range(1, 6):\n    submission[[f\"x_{i}\", f\"y_{i}\", f\"z_{i}\"]] = submission[\"ID\"].apply(\n        lambda x: pred_map[x]\n    ).tolist()\n\nprint(\"Submission filled\")\n\n\n# ============================================================\n# 10. SAFETY CLAMP (MANDATORY)\n# ============================================================\ncoord_cols = [c for c in submission.columns if c.startswith((\"x_\", \"y_\", \"z_\"))]\n\nsubmission[coord_cols] = submission[coord_cols].clip(-50, 50)\nsubmission[coord_cols] = submission[coord_cols].fillna(0.0)\n\nprint(\"Min coord:\", submission[coord_cols].min().min())\nprint(\"Max coord:\", submission[coord_cols].max().max())\n\n\n# ============================================================\n# 11. FINAL VALIDATION\n# ============================================================\nassert submission.shape == (9762, 18)\nassert not submission[coord_cols].isna().any().any()\nassert not np.isinf(submission[coord_cols].values).any()\n\nprint(\"Final validation PASSED\")\n\n\n# ============================================================\n# 12. SAVE SUBMISSION (ONLY THIS FILE IS USED)\n# ============================================================\nsubmission.to_csv(\"/kaggle/working/submission.csv\", index=False)\nprint(\"submission.csv created:\", submission.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:55:27.264211Z","iopub.execute_input":"2026-01-18T08:55:27.2648Z","iopub.status.idle":"2026-01-18T08:56:07.092671Z","shell.execute_reply.started":"2026-01-18T08:55:27.264764Z","shell.execute_reply":"2026-01-18T08:56:07.090694Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\n\nnp.random.seed(42)\n\nfor i in range(1, 6):\n    noise = np.random.normal(scale=0.5, size=(len(submission), 3))\n    submission[[f\"x_{i}\", f\"y_{i}\", f\"z_{i}\"]] = (\n        submission[[\"x_1\", \"y_1\", \"z_1\"]].values + noise\n    )\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:56:07.094733Z","iopub.execute_input":"2026-01-18T08:56:07.095755Z","iopub.status.idle":"2026-01-18T08:56:07.117654Z","shell.execute_reply.started":"2026-01-18T08:56:07.095716Z","shell.execute_reply":"2026-01-18T08:56:07.116074Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\nsample = pd.read_csv(\n    \"/kaggle/input/stanford-rna-3d-folding-2/sample_submission.csv\"\n)\n\nsubmission = sample.copy()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:56:07.119216Z","iopub.execute_input":"2026-01-18T08:56:07.119572Z","iopub.status.idle":"2026-01-18T08:56:07.147434Z","shell.execute_reply.started":"2026-01-18T08:56:07.119545Z","shell.execute_reply":"2026-01-18T08:56:07.145249Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\n\nfrom sklearn.ensemble import RandomForestRegressor\n\nprint(\"Libraries loaded\")\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:56:07.14965Z","iopub.execute_input":"2026-01-18T08:56:07.150032Z","iopub.status.idle":"2026-01-18T08:56:07.173469Z","shell.execute_reply.started":"2026-01-18T08:56:07.150003Z","shell.execute_reply":"2026-01-18T08:56:07.1704Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"DATA_PATH = \"/kaggle/input/stanford-rna-3d-folding-2\"\n\ntrain_lbl = pd.read_csv(f\"{DATA_PATH}/train_labels.csv\", low_memory=False)\ntrain_seq = pd.read_csv(f\"{DATA_PATH}/train_sequences.csv\")\n\nprint(\"Data loaded\")\nprint(\"train_labels:\", train_lbl.shape)\nprint(\"train_sequences:\", train_seq.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:56:07.175277Z","iopub.execute_input":"2026-01-18T08:56:07.175695Z","iopub.status.idle":"2026-01-18T08:56:21.976752Z","shell.execute_reply.started":"2026-01-18T08:56:07.175662Z","shell.execute_reply":"2026-01-18T08:56:21.975364Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Extract target_id\ntrain_lbl[\"target_id\"] = train_lbl[\"ID\"].str.split(\"_\").str[0]\n\n# Merge sequences\ntrain = train_lbl.merge(\n    train_seq[[\"target_id\", \"sequence\"]],\n    on=\"target_id\",\n    how=\"left\"\n)\n\n# Drop missing coordinates\ntrain = train.dropna(subset=[\"x_1\", \"y_1\", \"z_1\"])\n\nprint(\"train shape:\", train.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:56:21.980656Z","iopub.execute_input":"2026-01-18T08:56:21.98113Z","iopub.status.idle":"2026-01-18T08:56:39.384644Z","shell.execute_reply.started":"2026-01-18T08:56:21.981097Z","shell.execute_reply":"2026-01-18T08:56:39.383033Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"nt_map = {\"A\": 0, \"C\": 1, \"G\": 2, \"U\": 3}\n\ntrain[\"nt_code\"] = train[\"resname\"].map(nt_map)\ntrain[\"seq_len\"] = train[\"sequence\"].str.len()\ntrain[\"pos_norm\"] = train[\"resid\"] / train[\"seq_len\"]\n\nfeatures = [\"nt_code\", \"pos_norm\", \"seq_len\"]\ntargets = [\"x_1\", \"y_1\", \"z_1\"]\n\ntrain = train.dropna(subset=features + targets)\n\n# Subsample for speed\ntrain = train.sample(n=200_000, random_state=42)\n\nX = train[features]\ny = train[targets]\n\nprint(\"Feature matrix:\", X.shape)\nprint(\"Target matrix:\", y.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:56:39.386097Z","iopub.execute_input":"2026-01-18T08:56:39.386511Z","iopub.status.idle":"2026-01-18T08:56:46.154795Z","shell.execute_reply.started":"2026-01-18T08:56:39.386481Z","shell.execute_reply":"2026-01-18T08:56:46.153707Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = RandomForestRegressor(\n    n_estimators=50,\n    max_depth=12,\n    random_state=42,\n    n_jobs=-1\n)\n\nmodel.fit(X, y)\n\nprint(\"Model trained successfully\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:56:46.155966Z","iopub.execute_input":"2026-01-18T08:56:46.156416Z","iopub.status.idle":"2026-01-18T08:56:58.386572Z","shell.execute_reply.started":"2026-01-18T08:56:46.156372Z","shell.execute_reply":"2026-01-18T08:56:58.385499Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_seq = pd.read_csv(f\"{DATA_PATH}/test_sequences.csv\")\n\nrows = []\nfor _, r in test_seq.iterrows():\n    seq = r.sequence\n    L = len(seq)\n    for i, nt in enumerate(seq, start=1):\n        rows.append([r.target_id, i, nt_map[nt], i / L, L])\n\ntest_feat = pd.DataFrame(\n    rows,\n    columns=[\"target_id\", \"resid\", \"nt_code\", \"pos_norm\", \"seq_len\"]\n)\n\nprint(\"Test features:\", test_feat.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:56:58.387753Z","iopub.execute_input":"2026-01-18T08:56:58.38817Z","iopub.status.idle":"2026-01-18T08:56:58.455828Z","shell.execute_reply.started":"2026-01-18T08:56:58.388128Z","shell.execute_reply":"2026-01-18T08:56:58.454694Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pred_xyz = model.predict(test_feat[features])\ntest_feat[[\"x\", \"y\", \"z\"]] = pred_xyz\n\nprint(\"Predictions generated:\", pred_xyz.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:56:58.457139Z","iopub.execute_input":"2026-01-18T08:56:58.457546Z","iopub.status.idle":"2026-01-18T08:56:58.515829Z","shell.execute_reply.started":"2026-01-18T08:56:58.457507Z","shell.execute_reply":"2026-01-18T08:56:58.514578Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pred_map = {\n    f\"{r.target_id}_{r.resid}\": (r.x, r.y, r.z)\n    for r in test_feat.itertuples()\n}\n\nprint(\"pred_map size:\", len(pred_map))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:56:58.517024Z","iopub.execute_input":"2026-01-18T08:56:58.517308Z","iopub.status.idle":"2026-01-18T08:56:58.553991Z","shell.execute_reply.started":"2026-01-18T08:56:58.517283Z","shell.execute_reply":"2026-01-18T08:56:58.552731Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission = pd.read_csv(f\"{DATA_PATH}/sample_submission.csv\")\nprint(\"Sample submission:\", submission.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:56:58.555285Z","iopub.execute_input":"2026-01-18T08:56:58.55604Z","iopub.status.idle":"2026-01-18T08:56:58.580511Z","shell.execute_reply.started":"2026-01-18T08:56:58.555999Z","shell.execute_reply":"2026-01-18T08:56:58.579514Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def safe_lookup(x):\n    return pred_map.get(x, (0.0, 0.0, 0.0))\n\nsubmission[[\"x_1\", \"y_1\", \"z_1\"]] = submission[\"ID\"].apply(safe_lookup).tolist()\n\nprint(\"Base prediction filled\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:56:58.581926Z","iopub.execute_input":"2026-01-18T08:56:58.582335Z","iopub.status.idle":"2026-01-18T08:56:58.608664Z","shell.execute_reply.started":"2026-01-18T08:56:58.582293Z","shell.execute_reply":"2026-01-18T08:56:58.607438Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"np.random.seed(42)\n\nfor i in range(1, 6):\n    noise = np.random.normal(scale=0.5, size=(len(submission), 3))\n    submission[[f\"x_{i}\", f\"y_{i}\", f\"z_{i}\"]] = (\n        submission[[\"x_1\", \"y_1\", \"z_1\"]].values + noise\n    )\n\nprint(\"5 distinct predictions created\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:56:58.609779Z","iopub.execute_input":"2026-01-18T08:56:58.610672Z","iopub.status.idle":"2026-01-18T08:56:58.647543Z","shell.execute_reply.started":"2026-01-18T08:56:58.610628Z","shell.execute_reply":"2026-01-18T08:56:58.646272Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"coord_cols = [c for c in submission.columns if c.startswith((\"x_\", \"y_\", \"z_\"))]\n\nsubmission[coord_cols] = submission[coord_cols].astype(np.float32)\nsubmission[coord_cols] = submission[coord_cols].clip(-50, 50)\nsubmission[coord_cols] = submission[coord_cols].fillna(0.0)\n\n# Final validation\nprint(\"Any NaN:\", submission[coord_cols].isna().any().any())\nprint(\"Min coord:\", submission[coord_cols].min().min())\nprint(\"Max coord:\", submission[coord_cols].max().max())\n\nsubmission.to_csv(\"/kaggle/working/submission.csv\", index=False)\n\nprint(\"submission.csv created:\", submission.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-18T08:56:58.648711Z","iopub.execute_input":"2026-01-18T08:56:58.64908Z","iopub.status.idle":"2026-01-18T08:56:58.823017Z","shell.execute_reply.started":"2026-01-18T08:56:58.64905Z","shell.execute_reply":"2026-01-18T08:56:58.821592Z"}},"outputs":[],"execution_count":null}]}