Snakemake,熊猫和NCBI:如何将熊猫数据框与远程NCBI搜索结合?

时间:2019-08-29 02:05:02

标签: pandas snakemake

我对Snakemake还是很陌生,并且在尝试编写规则时遇到了麻烦。

我一直在尝试结合使用snakemake.remote.NCBI和访问熊猫数据框并使用通配符,但是我似乎无法使其工作。

我有一个名为基因组.tsv的tsv文件,其中有几列,其中每一行都是一个物种。一个是“ id”,并具有该物种基因组的基因库ID。另一个“物种”具有每个物种唯一的短字符串。在我的Snakefile中,基因组.tsv是作为基因组导入的,只有id和物类列,然后将物类设置为基因组索引并从基因组中删除。

我想使用“物种”中的值作为工作流程中通配符{spe​​cies}的值,我希望我的规则使用snakemake.remote.NCBI以fasta格式下载每个物种的基因组序列,然后输出到文件“ {species} _gen.fa”

from snakemake.remote.NCBI import RemoteProvider as NCBIRemoteProvider
import pandas as pd

configfile: "config.yaml"

NCBI = NCBIRemoteProvider(email=config["email"]) # email required by NCBI to prevent abuse

genomes = pd.read_table(config["genomes"], usecols=["species","id"]).set_index("species")

SPECIES = genomes.index.values.tolist()

rule all:
    input: expand("{species}_gen.fasta",species=SPECIES)

rule download_and_count:
    input:
        lambda wildcards: NCBI.remote(str(genomes[str(wildcards.species)]) + ".fasta", db="nuccore")
    output:
        "{species}_gen.fasta"
    shell:
        "{input} > {output}"

当前,尝试运行我的代码会导致密钥错误,但是它说密钥是物种的值,因此它应该能够从基因组中获取相应的genbank id。

编辑:这是错误

InputFunctionException in line 18 of /home/sjenkins/work/olflo/Snakefile:
KeyError: 'cappil'
Wildcards:
species=cappil

cappil是{species}的有效值,我认为它应该可用作索引。这是基因组的前几行,以供参考:

species id  accession   name    assembly
cappil  8252558 GCA_004027915.1 Capromys_pilorides_(Desmarest's_hutia)  CapPil_v1_BIUU
cavape  1067048 GCA_000688575.1 Cavia_aperea_(Brazilian_guinea_pig) CavAp1.0
cavpor  175118  GCA_000151735.1 Cavia_porcellus_(domestic_guinea_pig)   Cavpor3.0

更新:

我尝试将输入行更改为:

lambda wildcards: NCBI.remote(str(genomes[genomes['species'] == wildcards.species].iloc[0]['id']) + ".fasta", db="nuccore")

但是这给了我错误消息:

回溯(最近通话最近):   在第547行的“ makemake”文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/init.py”中     export_cwl = export_cwl)   在执行的文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/workflow.py”中,行421     dag.init()   初始化文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/dag.py”,第122行     作业= self.update([作业],进度=进度)   更新文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/dag.py”,第603行     进度=进度)   在update_中的文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/dag.py”中,第666行     进度=进度)   更新文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/dag.py”,第603行     进度=进度)   在update_中的文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/dag.py”中,第655行     missing_input = job.missing_input   文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/jobs.py”,第398行,位于missing_input中     对于self.input中的f   在第399行的文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/jobs.py”中     如果不存在,则self.subworkflow_input中不存在f。   存在文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/io.py”,存在于第208行     返回self.exists_remote   包装中的文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/io.py”,行119     v = func(self,* args,** kwargs)   文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/io.py”,第258行,位于exist_remote     返回self.remote_object.exists()   存在文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/remote/NCBI.py”,存在     可能性_request_options = self._ncbi.guess_db_options_for_extension(self.file_ext,db = self.db,rettype = self.rettype,retmode = self.retmode)   File_ext中的文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/remote/NCBI.py”,行110     附件,版本,file_ext = self._ncbi.parse_accession_str(self.local_file())   在parse_accession_str中的第366行,文件“ /home/sjenkins/miniconda3/envs/olflo/lib/python3.7/site-packages/snakemake/remote/NCBI.py”     断言file_ext,“必须定义file_ext:{}。{}..。可能的值包括:{}”。format(accession,version,“,” .join(list(self.valid_extensions)))) AssertionError:必须定义file_ext:...可能的值包括:est,ssexemplar,gb.xml,docset,fasta.xml,fasta,fasta_cds_na,abstract,txt,gp,medline,chr,flt,同系物,alignmentscores,gbwithparts, seqid,fasta_cds_aa,gpc,uilist,uilist.xml,rsr,xml,gb,gene_table,gss,ft,gp.xml,acc,asn1,gbc

2 个答案:

答案 0 :(得分:2)

我认为您应该拥有:

genomes = pd.read_table(config["genomes"], usecols=["species","id"])

SPECIES = list(genomes['species'])

,然后使用以下命令访问给定物种的ID:

lambda wildcards: str(genomes[genomes['species'] == wildcards.species].iloc[0]['id'])

答案 1 :(得分:1)

好吧,事实证明,我得到AssertionError: file_ext must be defined:的原因是,如果NCBIRemoteProvider给出的文件名没有有效的Genbank登录号,则NCBIRemoteProvider无法识别该文件扩展名。我给它提供了带有genbank id的文件名,因此它返回了该错误。

另外,似乎整个基因组序列都没有返回所有序列的登录号。而是为wgs报告提供了登录号,然后为每个支架提供了登录号。我决定尝试手动下载所需的基因组,而不是尝试下载所有支架然后组合它们。