{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":87793,"databundleVersionId":11403143,"sourceType":"competition"}],"dockerImageVersionId":30918,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-03-16T08:41:55.004590Z","iopub.execute_input":"2025-03-16T08:41:55.004917Z","iopub.status.idle":"2025-03-16T08:41:55.899664Z","shell.execute_reply.started":"2025-03-16T08:41:55.004893Z","shell.execute_reply":"2025-03-16T08:41:55.898761Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nimport pandas as pd\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow.keras.layers import Input, Dense, Conv1D, LSTM, GlobalAveragePooling1D\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.optimizers import Adam\nfrom sklearn.model_selection import train_test_split","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-16T08:41:55.900939Z","iopub.execute_input":"2025-03-16T08:41:55.901291Z","iopub.status.idle":"2025-03-16T08:41:55.905377Z","shell.execute_reply.started":"2025-03-16T08:41:55.901254Z","shell.execute_reply":"2025-03-16T08:41:55.904590Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nfrom datetime import datetime\n\n# 1. 加载数据（注意列名修正）\ntrain_df = pd.read_csv(\"/kaggle/input/stanford-rna-3d-folding/train_sequences.csv\")\ntrain_labels = pd.read_csv(\"/kaggle/input/stanford-rna-3d-folding/train_labels.csv\")\n\n# 2. 从labels的ID列提取target_id（假设ID格式为\"T1001_chainA\"）\ntrain_labels['target_id'] = train_labels['ID'].str.split('_').str[0]  # 关键修正！\n\n# 3. 时间字段转换\ntrain_df['temporal_cutoff'] = pd.to_datetime(train_df['temporal_cutoff'])\n\n# 4. 按时间划分训练/验证集（示例：以2023-06-01为分界线）\ncutoff_date = datetime(2023, 6, 1)\nphase1_train = train_df[train_df['temporal_cutoff'] < cutoff_date]\nphase1_valid = train_df[train_df['temporal_cutoff'] >= cutoff_date]\n\n# 5. 关联标签数据（使用提取后的target_id）\nphase1_train_labels = train_labels[train_labels['target_id'].isin(phase1_train['target_id'])]\nphase1_valid_labels = train_labels[train_labels['target_id'].isin(phase1_valid['target_id'])]\n\nprint(\"训练集样本数:\", len(phase1_train))\nprint(\"验证集样本数:\", len(phase1_valid))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-16T08:41:55.907006Z","iopub.execute_input":"2025-03-16T08:41:55.907211Z","iopub.status.idle":"2025-03-16T08:41:56.503267Z","shell.execute_reply.started":"2025-03-16T08:41:55.907191Z","shell.execute_reply":"2025-03-16T08:41:56.502574Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import Input, Conv1D, LSTM, Dense\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import ModelCheckpoint\n\n# 1. 数据预处理函数\ndef encode_sequence(sequence, max_len=200):\n    # 在 encoding 字典中添加对 'X' 和 '-' 字符的编码\n    encoding = {'A': [1, 0, 0, 0], 'C': [0, 1, 0, 0], 'G': [0, 0, 1, 0], 'U': [0, 0, 0, 1], '-': [0, 0, 0, 0], 'X': [0, 0, 0, 0]}\n    encoded = np.array([encoding[base] for base in sequence])\n    if len(encoded) < max_len:\n        encoded = np.pad(encoded, ((0, max_len - len(encoded)), (0, 0)), 'constant')\n    return encoded[:max_len]\n\n# 假设的 process_labels 函数，需要根据实际情况修改\ndef process_labels(train_labels, target_id):\n    # 这里简单返回一个随机的形状为 (200, 3) 的数组，实际需要根据标签数据进行处理\n    return np.random.rand(200, 3)\n\n# 2. 模型构建\ndef build_model(input_dim=4, max_len=200):\n    inputs = Input(shape=(max_len, input_dim))\n\n    x = Conv1D(128, 3, activation='relu', padding='same')(inputs)\n    x = Conv1D(256, 3, activation='relu', padding='same')(x)\n\n    x = LSTM(256, return_sequences=True)(x)\n    x = LSTM(256, return_sequences=True)(x)\n\n    outputs = Dense(3, activation='linear')(x)\n\n    model = Model(inputs=inputs, outputs=outputs)\n    model.compile(optimizer=Adam(learning_rate=1e-4), loss='mse')\n    return model\n\n# 3. 训练函数\ndef train_model(train_sequences, train_labels, epochs=50):\n    X_train = np.array([encode_sequence(seq) for seq in train_sequences])\n    y_train = np.array([process_labels(train_labels, tid) for tid in train_sequences.index])\n\n    model = build_model()\n\n    # 保存最佳模型，修改文件后缀为 .keras\n    checkpoint = ModelCheckpoint(\n        'best_model.keras',\n        monitor='loss',\n        verbose=1,\n        save_best_only=True,\n        mode='min'\n    )\n\n    model.fit(X_train, y_train,\n              epochs=epochs,\n              batch_size=16,\n              callbacks=[checkpoint])\n\n    return model\n\n# 4. 预测函数\ndef predict_structures(model, sequence, max_len=200, num_models=5):\n    encoded = encode_sequence(sequence, max_len)\n    X = np.expand_dims(encoded, axis=0)\n\n    predictions = []\n    for _ in range(num_models):\n        tf.random.set_seed(_)\n        pred = model.predict(X)  # 形状：(1, max_len, 3)\n        predictions.append(pred)\n\n    combined = np.concatenate(predictions, axis=2)  # 形状：(1, max_len, 15)\n    return combined.reshape(1, max_len, 5, 3)  # 形状：(1, max_len, 5, 3)\n\n# 5. 生成提交文件\ndef create_submission(test_sequences, predictions, output_file='submission.csv'):\n    rows = []\n    for idx, (target_id, seq) in enumerate(zip(test_sequences['target_id'], test_sequences['sequence'])):\n        residues = min(len(seq), 200)  # 确保不会超出预测数组的长度\n        for res in range(residues):\n            row = {\n                'ID': target_id,\n                'resname': seq[res],\n                'resid': res + 1\n            }\n            for m in range(5):\n                row[f'x_{m + 1}'] = predictions[idx][0, res, m, 0]\n                row[f'y_{m + 1}'] = predictions[idx][0, res, m, 1]\n                row[f'z_{m + 1}'] = predictions[idx][0, res, m, 2]\n            rows.append(row)\n\n    submission_df = pd.DataFrame(rows)\n    submission_df.to_csv(output_file, index=False)\n\n# 主程序入口\nif __name__ == \"__main__\":\n    # 加载数据（示例路径）\n    train_df = pd.read_csv(\"/kaggle/input/stanford-rna-3d-folding/train_sequences.csv\")\n    train_labels = pd.read_csv(\"/kaggle/input/stanford-rna-3d-folding/train_labels.csv\")\n\n    # 数据关联（假设ID格式为\"T1001_chainA\"）\n    train_labels['target_id'] = train_labels['ID'].str.split('_').str[0]\n\n    # 简单训练（示例使用全部数据，实际应划分验证集）\n    model = train_model(train_df['sequence'], train_labels)\n\n    # 加载测试数据\n    test_df = pd.read_csv(\"/kaggle/input/stanford-rna-3d-folding/test_sequences.csv\")\n\n    # 生成预测\n    predictions = []\n    for seq in test_df['sequence']:\n        pred = predict_structures(model, seq)\n        predictions.append(pred)\n\n    # 创建提交文件\n    create_submission(test_df, predictions)\n    print(\"提交文件已生成：submission.csv\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-16T08:41:56.504293Z","iopub.execute_input":"2025-03-16T08:41:56.504637Z","iopub.status.idle":"2025-03-16T08:43:07.553273Z","shell.execute_reply.started":"2025-03-16T08:41:56.504605Z","shell.execute_reply":"2025-03-16T08:43:07.552604Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import Input, Conv1D, LSTM, Dense\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import ModelCheckpoint\n\n# 1. 数据预处理函数，动态处理序列长度，容错处理未知字符，并进行填充\ndef encode_sequence(sequence, max_len=None):\n    encoding = {'A': [1, 0, 0, 0], 'C': [0, 1, 0, 0], 'G': [0, 0, 1, 0], 'U': [0, 0, 0, 1]}\n    encoded = np.array([encoding.get(base, [0, 0, 0, 0]) for base in sequence])\n    if max_len is not None:\n        if len(encoded) < max_len:\n            encoded = np.pad(encoded, ((0, max_len - len(encoded)), (0, 0)), 'constant')\n        elif len(encoded) > max_len:\n            encoded = encoded[:max_len]\n    return encoded\n\n# 假设的 process_labels 函数，需要根据实际情况修改\ndef process_labels(train_df, train_labels, target_id):\n    # 从 train_df 中获取序列信息\n    seq = train_df[train_df.index == target_id]['sequence'].values[0]\n    seq_length = len(seq)\n    return np.random.rand(seq_length, 3)\n\n# 2. 模型构建\ndef build_model(input_dim=4):\n    inputs = Input(shape=(None, input_dim))\n\n    x = Conv1D(128, 3, activation='relu', padding='same')(inputs)\n    x = Conv1D(256, 3, activation='relu', padding='same')(x)\n\n    x = LSTM(256, return_sequences=True)(x)\n    x = LSTM(256, return_sequences=True)(x)\n\n    outputs = Dense(3, activation='linear')(x)\n\n    model = Model(inputs=inputs, outputs=outputs)\n    model.compile(optimizer=Adam(learning_rate=1e-4), loss='mse')\n    return model\n\n# 3. 训练函数\ndef train_model(train_df, train_sequences, train_labels, epochs=50):\n    max_len = max([len(seq) for seq in train_sequences])\n    X_train = np.array([encode_sequence(seq, max_len) for seq in train_sequences])\n    y_train = []\n    for tid in train_sequences.index:\n        label = process_labels(train_df, train_labels, tid)\n        if len(label) < max_len:\n            label = np.pad(label, ((0, max_len - len(label)), (0, 0)), 'constant')\n        elif len(label) > max_len:\n            label = label[:max_len]\n        y_train.append(label)\n    y_train = np.array(y_train)\n\n    model = build_model()\n\n    # 保存最佳模型，修改文件后缀为 .keras\n    checkpoint = ModelCheckpoint(\n        'best_model.keras',\n        monitor='loss',\n        verbose=1,\n        save_best_only=True,\n        mode='min'\n    )\n\n    model.fit(X_train, y_train,\n              epochs=epochs,\n              batch_size=16,\n              callbacks=[checkpoint])\n\n    return model\n\n# 4. 预测函数，支持任意长度序列\ndef predict_structures(model, sequence, num_models=5):\n    encoded = encode_sequence(sequence)\n    X = np.expand_dims(encoded, axis=0)\n\n    predictions = []\n    for _ in range(num_models):\n        tf.random.set_seed(_)\n        pred = model.predict(X)  # 形状：(1, 序列长度, 3)\n        predictions.append(pred)\n\n    combined = np.concatenate(predictions, axis=2)  # 形状：(1, 序列长度, 15)\n    return combined.reshape(1, len(sequence), 5, 3)\n\n# 5. 生成提交文件，确保格式正确\ndef create_submission(test_sequences, predictions, output_file='submission.csv'):\n    rows = []\n    for idx, (target_id, seq) in enumerate(zip(test_sequences['target_id'], test_sequences['sequence'])):\n        residues = len(seq)\n        for res in range(residues):\n            row = {\n                'ID': target_id,\n                'resname': seq[res],\n                'resid': res + 1\n            }\n            for m in range(5):\n                row[f'x_{m + 1}'] = predictions[idx][0, res, m, 0]\n                row[f'y_{m + 1}'] = predictions[idx][0, res, m, 1]\n                row[f'z_{m + 1}'] = predictions[idx][0, res, m, 2]\n            rows.append(row)\n\n    submission_df = pd.DataFrame(rows)\n    submission_df = submission_df.round(4)  # 确保坐标精度为4位小数\n    submission_df.to_csv(output_file, index=False)\n\n# 主程序入口\nif __name__ == \"__main__\":\n    # 加载数据（示例路径）\n    train_df = pd.read_csv(\"/kaggle/input/stanford-rna-3d-folding/train_sequences.csv\")\n    train_labels = pd.read_csv(\"/kaggle/input/stanford-rna-3d-folding/train_labels.csv\")\n\n    # 数据关联（假设ID格式为\"T1001_chainA\"）\n    train_labels['target_id'] = train_labels['ID'].str.split('_').str[0]\n\n    # 简单训练（示例使用全部数据，实际应划分验证集）\n    model = train_model(train_df, train_df['sequence'], train_labels)\n\n    # 加载测试数据\n    test_df = pd.read_csv(\"/kaggle/input/stanford-rna-3d-folding/test_sequences.csv\")\n\n    # 生成预测\n    predictions = []\n    for seq in test_df['sequence']:\n        pred = predict_structures(model, seq)\n        predictions.append(pred)\n\n    # 创建提交文件\n    create_submission(test_df, predictions)\n    print(\"提交文件已生成：submission.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-16T09:10:02.634743Z","iopub.execute_input":"2025-03-16T09:10:02.635154Z","iopub.status.idle":"2025-03-16T09:28:01.295121Z","shell.execute_reply.started":"2025-03-16T09:10:02.635122Z","shell.execute_reply":"2025-03-16T09:28:01.294200Z"}},"outputs":[],"execution_count":null}]}