使用Python ete3包快速大批量地寻找物种的NCBI Taxonomy分类的完整信息(物种名和Taxid可进行相互转换)
在生物信息学工作中,有时候需要将大量物种进行分类,虽说在NCBI的Taxonomy数据库能找到分类信息,但是单个寻找效率太低,数据库提供的ftp文件可读性也不高。ete3包相当于一个转换工具,用于将NCBI的分类数据进行解析,使我们能方便的获取物种或分类号的信息,在工作中必将提高工作效率。
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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)