如何处理 biopython 翻译过程中的空白

How to deal with gaps during translation with biopython

我需要用 biopython 翻译对齐的 DNA 序列

from Bio.Seq import Seq
from Bio.Alphabet import generic_dna
seq = Seq("tt-aaaatg")
seq.translate()

运行 这个脚本会报错:

Bio.Data.CodonTable.TranslationError: Codon 'TT-' is invalid.

有没有办法将 'tt-' 翻译成 X,因此整个翻译序列将是 'XKM'?

这对于翻译比对序列非常有用。例如,一个对齐的序列集以 pandas DataFrame 的形式存储,命名为 "df" as:

import pandas as pd

df = pd.DataFrame([['A',Seq("tt-aaaatg")],['B',Seq("tttaaaatg")],['C',Seq("tttaaaatg")]],columns=['seqName','seq'])

print(df)

df 将显示为:

seqName                seq
        A                 Seq("tt-aaaatg")
        B                 Seq("tttaaaatg")
        C                 Seq("tt-aaaatg")

如果'tt-'可以翻译成"x",那么使用代码:

df['prot'] = pd.Seris([x.translate() for x in df.seq])

我们可以得到:

  seqName                          seq           prot
0       A           (t, t, g, a, a, a, a, t, g)  (X, K, M)
1       B           (t, t, t, a, a, a, a, t, g)  (F, K, M)
2       C           (t, t, t, a, a, a, a, t, g)  (F, K, M)

然而,当前的 biopython 无法将 "tt-" 转换为 "X",它只会抛出错误。在我看来,我必须删除对齐序列中的所有空白,然后翻译它们,然后我必须重新对齐翻译的蛋白质序列。

你是怎么处理这样的问题的?提前谢谢你。

注意:假设这些是框内(框 1)氨基酸编码比对中真正的 1bp 缺失。

为此,您可以使用如下自定义翻译功能:

def translate_dna(sequence):
"""
:param sequence: (str) a DNA sequence string
:return: (str) a protein string from the forward reading frame 1
"""

codontable = {'ATA': 'I', 'ATC': 'I', 'ATT': 'I', 'ATG': 'M',
              'ACA': 'T', 'ACC': 'T', 'ACG': 'T', 'ACT': 'T',
              'AAC': 'N', 'AAT': 'N', 'AAA': 'K', 'AAG': 'K',
              'AGC': 'S', 'AGT': 'S', 'AGA': 'R', 'AGG': 'R',
              'CTA': 'L', 'CTC': 'L', 'CTG': 'L', 'CTT': 'L',
              'CCA': 'P', 'CCC': 'P', 'CCG': 'P', 'CCT': 'P',
              'CAC': 'H', 'CAT': 'H', 'CAA': 'Q', 'CAG': 'Q',
              'CGA': 'R', 'CGC': 'R', 'CGG': 'R', 'CGT': 'R',
              'GTA': 'V', 'GTC': 'V', 'GTG': 'V', 'GTT': 'V',
              'GCA': 'A', 'GCC': 'A', 'GCG': 'A', 'GCT': 'A',
              'GAC': 'D', 'GAT': 'D', 'GAA': 'E', 'GAG': 'E',
              'GGA': 'G', 'GGC': 'G', 'GGG': 'G', 'GGT': 'G',
              'TCA': 'S', 'TCC': 'S', 'TCG': 'S', 'TCT': 'S',
              'TTC': 'F', 'TTT': 'F', 'TTA': 'L', 'TTG': 'L',
              'TAC': 'Y', 'TAT': 'Y', 'TAA': '*', 'TAG': '*',
              'TGC': 'C', 'TGT': 'C', 'TGA': '*', 'TGG': 'W',
              '---': '-',
              }

seq = sequence.upper()
prot = []

for n in range(0, len(seq), 3):
    if seq[n:n + 3] in codontable:
        residue = codontable[seq[n:n + 3]]
    else:
        residue = "X"

    prot.append(residue)

return "".join(prot)

else 语句将导致任何无法识别的密码子(包括简并碱基的存在)被翻译为 x。 只需将序列字符串传递给此函数即可。 如果您的序列存储为 seq 对象,您可以像这样修改函数中的行:

seq = sequence.seq.upper()

一种可能的解决方法是用 N 替换所有空位(“-”)。这样 Biopython 会自动将密码子如“tt-”翻译成 X,您可以继续进行分析。

首先,假设我们有您的数据

import pandas as pd
from Bio.Seq import Seq
# It is better to save the strings in the dataframe
df = pd.DataFrame([['A',"tt-aaaatg"],['B',"tttaaaatg"],['C',"tttaaaatg"]],columns=['seqName','seq'])

然后结合使用str.replace和Seq.translate方法

df['prot'] = pd.Series([
    str(Seq(x.replace("-","n")).translate()) for x in df.seq
])

那么您的最终数据框将如下所示

print(df)

  seqName        seq prot
0       A  tt-aaaatg  XKM
1       B  tttaaaatg  FKM
2       C  tttaaaatg  FKM