Biopython给出ValueError:即使序列长度相同,序列也必须都具有相同的长度

问题描述 投票:1回答:2

我正在尝试通过根据数据制作.phy文件来创建系统发育树。

我有一个数据框

ndf =

ESV截断

1 esv1 TACGTAGGTG ...

2 esv2 TACGGAGGGT ...

3 esv3 TACGGGGGG ...

7 esv7 TACGTAGGGT ...

我检查了“ trunc”列元素的长度:

length_checker = np.vectorize(len)

arr_len = length_checker(ndf['trunc'])

所得的arr_len为所有元素赋予相同的长度(= 253)。

我将此数据帧保存为.phy文件,如下所示:

23 253

  1. esv1 TACGTAGGTGGCGAGCGTTATCCGGAATTATTGGGCGTAAAGCGCGCGCGCGCTGTTTCTTAAGTCTGATGTGAAAGCCCACGGCTCAACCGTGGAGGGTCATTGGAAACTGGGAATGTGTGCAGAAGAGGAAAGCGGAATTCCACTGTGTAGCGGTGTGCGCGTGCGCGGGGGCGCGAGGGCGCGGGAGCGGGCGCGGGAG<<<<

  2. 类似于this tutorial中使用的文件。

    但是,当我运行命令时aln = AlignIO.read('msa.phy', 'phylip')

  3. 我得到“ ValueError:序列必须都具有相同的长度”

    我不知道为什么要得到这个或如何解决它。非常感谢您的帮助!

  4. 谢谢

我正在尝试通过根据数据制作.phy文件来创建系统发育树。我有一个数据帧ndf = ESV trunc 1 esv1 TACGTAGGTG ... 2 esv2 TACGGAGGGT ... 3 esv3 ...

首先,请阅读对How to make good reproducible pandas examples的回答。将来请提供minimal reproducibl example

第二,Michael G绝对正确,因为phylip是一种非常特殊的语法格式。
下面的代码将使您能够从Pandas数据框中生成系统发育树。
首先进行一些导入,然后我们重新创建您的数据框。

import pandas as pd from Bio import Phylo from Bio.Phylo.TreeConstruction import DistanceCalculator from Bio.Phylo.TreeConstruction import DistanceTreeConstructor from Bio import AlignIO data = {'ESV' : ['esv1', 'esv2', 'esv3'], 'trunc': ['TACGTAGGTGGCGAGCGTTATCCGGAATTATTGGGCGTAAAGCGCGCGCAGGCGGTTTCTTAAGTCTGATGTGAAAGCCCACGGCTCAACCGTGGAGGGTCATTGGAAACTGGGAAACTTGAGTGCAGAAGAGGAAAGCGGAATTCCACGTGTAGCGGTGAAATGCGTAGAGATGTGGAGGAACACCAGTGGCGAAGGCGGCTTTCTGGTCTGTAACTGACGCTGAGGCGCGAAAGCGTGGGGAGCAAACAGG', 'TACGGAGGGTGCAAGCGTTATCCGGATTCACTGGGTTTAAAGGGTGCGTAGGTGGGTTGGTAAGTCAGTGGTGAAATCTCCGAGCTTAACTTGGAAACTGCCATTGATACTATTAATCTTGAATATTGTGGAGGTTAGCGGAATATGTCATGTAGCGGTGAAATGCTTAGAGATGACATAGAACACCAATTGCGAAGGCAGCTGGCTACACATATATTGACACTGAGGCACGAAAGCGTGGGGATCAAACAGG', 'TACGGGGGGGGCAAGCGTTGTTCGGAATTACTGGGCGTAAAGGGCGCGTAGGCGGCCAGACCAAGTCGAGTGTGAAATTGCAGGGCTTAACTTTGCAGGGTCGCTCGATACTGGTCGGCTAGAGTGTGGAAGAGGGTACTGGAATTCCCGGTGTAGCGGTGAAATGCGTAGATATCGGGAGGAACACCAGCGGCGAAGGCGGGTACCTGGGCCAACACTGACGCTGAGGCGCGAAAGCTAGGGGAGCAAACAG'] } ndf = pd.DataFrame.from_dict(data) print(ndf)

输出:

ESV trunc 0 esv1 TACGTAGGTGGCGAGCGTTATCCGGAATTATTGGGCGTAAAGCGCG... 1 esv2 TACGGAGGGTGCAAGCGTTATCCGGATTCACTGGGTTTAAAGGGTG... 2 esv3 TACGGGGGGGGCAAGCGTTGTTCGGAATTACTGGGCGTAAAGGGCG...

下一步,以正确的格式写入phylip文件。

with open("test.phy", 'w') as f:
    f.write("{:10} {}\n".format(ndf.shape[0], ndf.trunc.str.len()[0]))
    for row in ndf.iterrows():
        f.write("{:10} {}\n".format(*row[1].to_list()))

test.phy的输出:

         3 253
esv1       TACGTAGGTGGCGAGCGTTATCCGGAATTATTGGGCGTAAAGCGCGCGCAGGCGGTTTCTTAAGTCTGATGTGAAAGCCCACGGCTCAACCGTGGAGGGTCATTGGAAACTGGGAAACTTGAGTGCAGAAGAGGAAAGCGGAATTCCACGTGTAGCGGTGAAATGCGTAGAGATGTGGAGGAACACCAGTGGCGAAGGCGGCTTTCTGGTCTGTAACTGACGCTGAGGCGCGAAAGCGTGGGGAGCAAACAGG
esv2       TACGGAGGGTGCAAGCGTTATCCGGATTCACTGGGTTTAAAGGGTGCGTAGGTGGGTTGGTAAGTCAGTGGTGAAATCTCCGAGCTTAACTTGGAAACTGCCATTGATACTATTAATCTTGAATATTGTGGAGGTTAGCGGAATATGTCATGTAGCGGTGAAATGCTTAGAGATGACATAGAACACCAATTGCGAAGGCAGCTGGCTACACATATATTGACACTGAGGCACGAAAGCGTGGGGATCAAACAGG
esv3       TACGGGGGGGGCAAGCGTTGTTCGGAATTACTGGGCGTAAAGGGCGCGTAGGCGGCCAGACCAAGTCGAGTGTGAAATTGCAGGGCTTAACTTTGCAGGGTCGCTCGATACTGGTCGGCTAGAGTGTGGAAGAGGGTACTGGAATTCCCGGTGTAGCGGTGAAATGCGTAGATATCGGGAGGAACACCAGCGGCGAAGGCGGGTACCTGGGCCAACACTGACGCTGAGGCGCGAAAGCTAGGGGAGCAAACAG

现在,我们可以开始创建系统发育树。

# Read the sequences and align
aln = AlignIO.read('test.phy', 'phylip')
print(aln)

输出:

SingleLetterAlphabet() alignment with 3 rows and 253 columns
TACGTAGGTGGCGAGCGTTATCCGGAATTATTGGGCGTAAAGCG...AGG esv1
TACGGAGGGTGCAAGCGTTATCCGGATTCACTGGGTTTAAAGGG...AGG esv2
TACGGGGGGGGCAAGCGTTGTTCGGAATTACTGGGCGTAAAGGG...CAG esv3

计算距离矩阵:

calculator = DistanceCalculator('identity')
dm = calculator.get_distance(aln)
print(dm)

输出:

esv1    0
esv2    0.3003952569169961  0
esv3    0.6086956521739131  0.6245059288537549  0

使用UPGMA算法构建系统发育树并以ascii方式绘制树

constructor = DistanceTreeConstructor()
tree = constructor.upgma(dm)
Phylo.draw_ascii(tree)

输出:

  ________________________________________________________________________ esv3
_|
 |                                     ___________________________________ esv2
 |____________________________________|
                                      |___________________________________ esv1

或绘制一幅漂亮的树图:

Phylo.draw(tree)

输出:

enter image description here

通常,phylip是不同程序之间系统发育的最奇怪的形式。有严格的双引号格式和宽松的双引号格式等... t不容易知道所使用的分隔符,空格字符和/或回车符。

我认为您似乎在分类单元的名称(即序列标签)和序列名称之间留了一个空格,即。

2. esv2
Phylip格式正在监视标签和序列数据之间的空间。在此示例中,序列长度为3bp。使用“。”通常也不是一个好主意。该整数似乎并不表示行号。

另一个问题是,您可以/应该将序列与标签保持在同一行,并删除回车符,即。

esv2 TACGGAGGGTGCAAGCGTTATCCGGATTCACTGGGTTTAAAGGGTGCGTAGGTGGGTTGGTAAGTCAGTGGTGAAATCTCCGAGCTTAACTTGGAAACTGCCATTGATACTATTAATCTTGAATATTGTGGAGGTTAGCGGAATATGTCATGTAGCGGTGAAATGCTTAGAGATGACATAGAACACCAATTGCGAAGGCAGCTGGCTACACATATATTGACACTGAGGCACGAAAGCGTGGGGATCAAACAGG

有时回车确实有效(这可以是宽松的phylip格式),传统格式使用空格字符“”。我始终保持统一数量的空格以保持对齐方式...不确定是否需要。

[Note

如果分类名称超过10个字符,则需要宽松的phylip格式,在任何情况下,这种格式通常是个好主意。
最终解决方案是,所有其他失败的方法是转换为fasta,以fasta格式导入,然后转换为phylip。如果所有操作都失败,请回发更多的故障排除

Fasta格式删除“ 23 254”标题,然后每个序列如下所示,

>esv2 TACGGAGGGTGCAAGCGTTATCCGGATTCACTGGGTTTAAAGGGTGCGTAGGTGGGTTGGTAAGTCAGTGGTGAAATCTCCGAGCTTAACTTGGAAACTGCCATTGATACTATTAATCTTGAATATTGTGGAGGTTAGCGGAATATGTCATGTAGCGGTGAAATGCTTAGAGATGACATAGAACACCAATTGCGAAGGCAGCTGGCTACACATATATTGACACTGAGGCACGAAAGCGTGGGGATCAAACAGG

在esv2和序列之间总是有回车符。此外,始终使用“>”作为标签(分类名称)的前缀,而不会保留任何空格。您只需在python中通过reg-ex或“ re”进行转换即可。使用perl单缸纸将是s/^([az]+[0-9]+)/>$1/g类型代码。我很确定他们将是一个可以做到这一点的在线网站。


然后,您只需在导入命令中将“ phylip”替换为“ fasta”。导入后,您要求BioPython转换为所需的任何格式,并且应该没有任何问题。
python dataframe biopython phylogeny
2个回答
1
投票
首先进行一些导入,然后我们重新创建您的数据框。

2
投票
Phylip格式正在监视标签和序列数据之间的空间。在此示例中,序列长度为3bp。使用“。”通常也不是一个好主意。该整数似乎并不表示行号。

另一个问题是,您可以/应该将序列与标签保持在同一行,并删除回车符,即。

© www.soinside.com 2019 - 2024. All rights reserved.