参考资料,学习如何使用Bash和/或Biopython管理表格数据(来自BLAST + 6格式)

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

我正在运行BLAST,并希望使用BLAST + 6格式处理输出。

例如,我想获取每个匹配的E值,查询覆盖率和身份,然后将它们插入一个方程式中,该方程式将三者均权重为一个“分数”。然后,我想将所有比分都放到一张桌子中,这样我就可以通过降低“得分”来对每个匹配进行排序。

我还想为数据库中的每个BLAST命中生成一个ORF,并将它们添加到表中的相应位置。

有人可以指出我可以搜索的任何资源/关键字,以了解如何处理表格数据吗?

示例:

blastn  -query genes.fasta  -subject genome.fasta  -outfmt "6 qseqid pident qcovs  evalue"

输出:

    qseqid pident qcovs evalue   
0   moaC     100.00    0.0       161.0      
1   moaC     99.38     1.0       161.0  

我想从每一列中获取值并将它们用作方程式中的变量,然后在相应的行中打印该值。我将对blast使用bash脚本或BioPython,因此我想将数据处理作为其中的一部分

而不是该示例的解决方案,我想看看是否有可以了解该主题的资源(到现在为止,我将使用电子表格程序来处理表格数据)

python bash tabular biopython blast
1个回答
2
投票

对于使用表格数据,我真的建议使用pandas

首先,您要将输出转换为pandas DataFrame,这是一种非常适合存储表格形式数据的数据结构。

对于此示例,我正在使用pandas DataFrame和示例文件tblastnfour_human_proteins.fasta

four_human_proteins.fasta

首先,我们要告诉rhodopsin_nucs.fasta哪些列包含rhodopsin_nucs.fasta

>>> import pandas as pd
>>> from Bio.Blast.Applications import NcbiblastnCommandline
>>> cline = NcbiblastnCommandline(cmd='/path/to/BLAST+/2.8.1/bin/tblastn', 
                          query='four_human_proteins.fasta', 
                          subject='rhodopsin_nucs.fasta', 
                          evalue='1e-10',
                          outfmt='"6 qseqid pident qcovs evalue"')
>>> print(cline)
/path/to/BLAST+/2.8.1/bin/tblastn -outfmt "6 qseqid pident qcovs evalue" -query four_human_proteins.fasta -evalue 1e-10 -subject rhodopsin_nucs.fasta

>>> blast_output = cline()[0].strip()
>>> print(blast_output) 
sp|P08100|OPSD_HUMAN    96.552  100 0.0
sp|P08100|OPSD_HUMAN    93.391  100 0.0
sp|P08100|OPSD_HUMAN    95.092  94  0.0
sp|P08100|OPSD_HUMAN    84.795  98  0.0
sp|P08100|OPSD_HUMAN    82.164  98  0.0
sp|P08100|OPSD_HUMAN    96.396  89  2.65e-67
sp|P08100|OPSD_HUMAN    92.308  89  7.50e-36
sp|P08100|OPSD_HUMAN    93.220  89  1.81e-32
sp|P08100|OPSD_HUMAN    96.296  89  6.37e-32
sp|P08100|OPSD_HUMAN    88.462  89  4.64e-12


>>> headers = ['qseqid', 'pident', 'qcovs', 'evalue']
>>> rows = [line.split() for line in blast_output.splitlines()]    
>>> df = pd.DataFrame(rows, columns=headers)
>>> print(df)
    qseqid  pident  qcovs   evalue
0   sp|P08100|OPSD_HUMAN    96.552  100     0.0
1   sp|P08100|OPSD_HUMAN    93.391  100     0.0
2   sp|P08100|OPSD_HUMAN    95.092  94  0.0
3   sp|P08100|OPSD_HUMAN    84.795  98  0.0
4   sp|P08100|OPSD_HUMAN    82.164  98  0.0
5   sp|P08100|OPSD_HUMAN    96.396  89  2.65e-67
6   sp|P08100|OPSD_HUMAN    92.308  89  7.50e-36
7   sp|P08100|OPSD_HUMAN    93.220  89  1.81e-32
8   sp|P08100|OPSD_HUMAN    96.296  89  6.37e-32
9   sp|P08100|OPSD_HUMAN    88.462  89  4.64e-12

现在现在可以轻松地对此DataFrame pandas执行按列的操作。定义得分函数,并将结果添加为额外的列:

float

并且您可以通过此>>> convert = {'pident': float, 'qcovs': float, 'evalue': float, 'qseqid': str} >>> df = df.astype(convert) 列轻松地对DataFrame进行排序

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