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

时间:2019-05-04 11:50:49

标签: python bioinformatics 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”?

这在翻译比对序列中非常有用。例如,对齐的序列集以名为“ df”的pandas DataFrame的形式存储为:

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 个答案:

答案 0 :(得分:0)

注意:假设这些是框内(框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()