{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":87793,"databundleVersionId":12024591,"sourceType":"competition"}],"dockerImageVersionId":31012,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\n# Load data with enhanced debugging\nbase_path = \"/kaggle/input/stanford-rna-3d-folding\"\n\ndef debug_load(file_name):\n    path = f\"{base_path}/{file_name}\"\n    print(f\"\\nLoading {file_name}...\")\n    if not os.path.exists(path):\n        print(f\"File not found: {path}\")\n        return None\n    \n    df = pd.read_csv(path)\n    print(f\"Loaded {len(df)} rows\")\n    print(\"Sample data:\")\n    display(df.head(2))\n    print(\"Columns:\", df.columns.tolist())\n    return df\n\n# Load all files with debugging\nprint(\"===== Loading Data Files =====\")\ntrain_seq = debug_load(\"train_sequences.csv\")\ntrain_labels = debug_load(\"train_labels.csv\")\nval_seq = debug_load(\"validation_sequences.csv\")\nval_labels = debug_load(\"validation_labels.csv\")\ntest_seq = debug_load(\"test_sequences.csv\")\n\n# Verify merge keys exist\nprint(\"\\n===== Checking Merge Keys =====\")\nfor df, name in [(train_seq, \"train_seq\"), (train_labels, \"train_labels\"),\n                 (val_seq, \"val_seq\"), (val_labels, \"val_labels\")]:\n    if df is not None:\n        print(f\"{name} has 'target_id' column: {'target_id' in df.columns}\")\n\n# Standardize column names\nif train_labels is not None and 'ID' in train_labels.columns:\n    train_labels.rename(columns={'ID': 'target_id'}, inplace=True)\nif val_labels is not None and 'ID' in val_labels.columns:\n    val_labels.rename(columns={'ID': 'target_id'}, inplace=True)\n\n# Merge with intersection to ensure valid matches\nprint(\"\\n===== Merging Data =====\")\ndef safe_merge(left, right, name):\n    if left is None or right is None:\n        print(f\"Cannot merge {name} - one or both DataFrames are None\")\n        return None\n    \n    common_ids = set(left['target_id']).intersection(set(right['target_id']))\n    print(f\"{name}: {len(common_ids)} common target_ids\")\n    \n    merged = pd.merge(left, right, on='target_id', how='inner')\n    print(f\"Merged {len(merged)} rows (from {len(left)} + {len(right)})\")\n    if len(merged) > 0:\n        print(\"Merged columns:\", merged.columns.tolist())\n    return merged\n\ntrain_data = safe_merge(train_seq, train_labels, \"Training Data\")\nval_data = safe_merge(val_seq, val_labels, \"Validation Data\")\n\n# Basic EDA only if we have data\nif train_data is not None and len(train_data) > 0:\n    print(\"\\n===== Available Columns for EDA =====\")\n    print(train_data.columns.tolist())\n    \n    # Sequence length distribution\n    if 'sequence' in train_data.columns:\n        plt.figure(figsize=(12, 6))\n        train_data['sequence'].str.len().hist(bins=30)\n        plt.title('Sequence Length Distribution')\n        plt.xlabel('Length')\n        plt.ylabel('Count')\n        plt.show()\n    \n    # Residue distribution if column exists\n    if 'resname' in train_data.columns:\n        plt.figure(figsize=(12, 6))\n        sns.countplot(x=train_data['resname'].dropna())\n        plt.title('Residue Distribution')\n        plt.xticks(rotation=45)\n        plt.show()\n    else:\n        print(\"'resname' column not found for distribution plot\")\nelse:\n    print(\"\\nNo training data available for EDA\")\n\n# Only proceed with modeling if we have valid data\nif (train_data is not None and len(train_data) > 0 and \n    test_seq is not None and len(test_seq) > 0):\n    \n    print(\"\\n===== Preparing Baseline Model =====\")\n    # Prepare features (using sequence length)\n    train_data['seq_length'] = train_data['sequence'].str.len()\n    test_seq['seq_length'] = test_seq['sequence'].str.len()\n    \n    # Train simple model\n    from sklearn.neighbors import KNeighborsRegressor\n    knn = KNeighborsRegressor(n_neighbors=3)\n    knn.fit(train_data[['seq_length']], train_data[['x_1', 'y_1', 'z_1']])\n    \n    # Make predictions\n    preds = knn.predict(test_seq[['seq_length']])\n    \n    # Create submission\n    submission = pd.DataFrame({\n        'ID': test_seq['target_id'] + \"_centroid\",\n        'x_1': preds[:, 0],\n        'y_1': preds[:, 1],\n        'z_1': preds[:, 2]\n    })\n    submission.to_csv(\"/kaggle/working/submission.csv\", index=False)\n    print(\"Submission saved:\")\n    display(submission.head())\nelse:\n    print(\"\\nInsufficient data for modeling\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-05-11T04:23:33.657793Z","iopub.execute_input":"2025-05-11T04:23:33.658680Z","iopub.status.idle":"2025-05-11T04:23:34.079809Z","shell.execute_reply.started":"2025-05-11T04:23:33.658644Z","shell.execute_reply":"2025-05-11T04:23:34.078806Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}