如何处理 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
我需要用 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