ete全称为Environment for Tree Exploration,直译就是树探索环境,此工具可以直接在终端输入
pip install ete3 进行安装即可。ete包主要功能与构建系统发生树有关,若是有相关需求可以查看其介绍文档,地址:The ETE tutorial。我主要使用到了其中的分类工具,即处理NCBI 的Taxonomy数据库的工具。此工具用于物种信息和分类号的转换十分简便,使用时是根据NCBI的最新分类文件来运作的,因此分类信息十分可靠。


下载升级数据库

ete3使用NCBI 的Taxonomy数据,因此需要首次使用时需要先下载数据。在应用中主要用到的是ete3包的NCBITaxa模块。首次使用NCBITaxa模块时会检测是否有分类数据存在,没有的话会自动下载。长期未更新时可以直接使用升级选项获取最新的分类数据。即:

from ete3 import NCBITaxa                       # 导入此模块
ncbi = NCBITaxa()
ncbi.update_taxonomy_database()                 # 升级

运行命令后显示如下,此文件taxdump.tar.gz来自于NCBI,网址为:https://ftp.ncbi.nih.gov/pub/taxonomy/

在这里插入图片描述等待下载结束即可(可能下载速度有点慢)。这样准备工作就OK啦。

NCBITaxa.get_rank()

用于获得输入的各个Taxid之间的按照分类单位(即界门纲目科属种等)大小进行排列的顺序,例:

from ete3 import NCBITaxa
ncbi = NCBITaxa()
print(ncbi.get_rank([93061,9443,1282,190485]))

结果:在这里插入图片描述

NCBITaxa.get_lineage()

用于获取输入Taxid代表的物种的完整分类信息,结果为一连串的Taxid号,例:

from ete3 import NCBITaxa
ncbi = NCBITaxa()
print(ncbi.get_lineage(294))

结果:
在这里插入图片描述

NCBITaxa.get_taxid_translator()

用于将Taxid转换为物种名或者对应的分类单位名,输入为列表形式。例:

from ete3 import NCBITaxa
ncbi = NCBITaxa()
print(ncbi.get_taxid_translator([9606]))

结果:
在这里插入图片描述

NCBITaxa.get_name_translator()

用于将物种名或者分类单位名转换为Taxid,输入为列表形式。例:

from ete3 import NCBITaxa
ncbi = NCBITaxa()
print(ncbi.get_name_translator(['Lactococcus lactis subsp. lactis']))

结果:
在这里插入图片描述

NCBITaxa.get_descendant_taxa()

用于获取某分类单位所包含之后的各后代名,例:

from ete3 import NCBITaxa
ncbi = NCBITaxa()
print(ncbi.get_descendant_taxa('Homo'))

结果:在这里插入图片描述
因此根据上述所有方法,若要根据某物种名获取物种的完整分类信息,那么可以首先使用get_name_translator()获取物种的分类id,再利用get_lineage()获取完整的分类信息的Taxid,最后使用NCBITaxa.get_taxid_translator()将Taxid批量转换为物种名即可。

例如若有如下这些物种待分类:

在这里插入图片描述
根据这些物种名寻找其分类信息,可采用如下代码:

from ete3 import NCBITaxa
ncbi = NCBITaxa()

with open('22.txt','r',encoding='UTF-8') as f:
	for line in f.readlines():
		line = line.strip()
		name2taxid = ncbi.get_name_translator([line])
		for value in name2taxid.values():
			b = str(name2taxid.values()).strip('dict_values([])')
			lineage = ncbi.get_lineage(b)
			names = ncbi.get_taxid_translator(lineage)
			list = []
			for taxid in lineage:
				list.append(names[taxid])
			print(list)

结果太长,此处仅展示2条:
[‘root’, ‘cellular organisms’, ‘Bacteria’, ‘Terrabacteria group’, ‘Firmicutes’, ‘Bacilli’, ‘Lactobacillales’, ‘Streptococcaceae’, ‘Lactococcus’, ‘Lactococcus lactis’, ‘Lactococcus lactis subsp. lactis’]
[‘root’, ‘cellular organisms’, ‘Bacteria’, ‘Terrabacteria group’, ‘Firmicutes’, ‘Bacilli’, ‘Bacillales’, ‘Staphylococcaceae’, ‘Staphylococcus’, ‘Staphylococcus epidermidis’]
可以看到这样分类出的结果是很准确的,因此此工具可以用于分类或其他用途。

叮!

参考:Dealing with the NCBI Taxonomy database
参考:https://zhuanlan.zhihu.com/p/59757585

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐