Для работы с табличными данными очень рекомендую pandas.
Сначала вы хотите преобразовать выходные данные в pandas DataFrame
, который представляет собой структуру данных, которая хорошо подходит для хранения данных в табличной форме.
Для этот пример я использую tblastn
и файлы примеров four_human_proteins.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
Сначала нам нужно сказать pandas
какие столбцы содержат float
s.
>>> convert = {'pident': float,
'qcovs': float,
'evalue': float,
'qseqid': str}
>>> df = df.astype(convert)
Теперь теперь можно легко выполнять операции с столбцами над этим DataFrame df
. Определите свою функцию оценки и добавьте результат в качестве дополнительного столбца:
>>> df['score'] = df['qcovs'] / df['pident'] # adapt to your own needs
>>> print(df)
qseqid pident qcovs evalue score
0 sp|P08100|OPSD_HUMAN 96.552 100.0 0.000000e+00 1.035711
1 sp|P08100|OPSD_HUMAN 93.391 100.0 0.000000e+00 1.070767
2 sp|P08100|OPSD_HUMAN 95.092 94.0 0.000000e+00 0.988516
3 sp|P08100|OPSD_HUMAN 84.795 98.0 0.000000e+00 1.155729
4 sp|P08100|OPSD_HUMAN 82.164 98.0 0.000000e+00 1.192736
5 sp|P08100|OPSD_HUMAN 96.396 89.0 2.650000e-67 0.923275
6 sp|P08100|OPSD_HUMAN 92.308 89.0 7.500000e-36 0.964163
7 sp|P08100|OPSD_HUMAN 93.220 89.0 1.810000e-32 0.954731
8 sp|P08100|OPSD_HUMAN 96.296 89.0 6.370000e-32 0.924234
9 sp|P08100|OPSD_HUMAN 88.462 89.0 4.640000e-12 1.006082
И вы можете легко отсортировать DataFrame по этому score
столбцу
>>> df.sort_values(['score'], inplace=True)
>>> print(df)
qseqid pident qcovs evalue score
5 sp|P08100|OPSD_HUMAN 96.396 89.0 2.650000e-67 0.923275
8 sp|P08100|OPSD_HUMAN 96.296 89.0 6.370000e-32 0.924234
7 sp|P08100|OPSD_HUMAN 93.220 89.0 1.810000e-32 0.954731
6 sp|P08100|OPSD_HUMAN 92.308 89.0 7.500000e-36 0.964163
2 sp|P08100|OPSD_HUMAN 95.092 94.0 0.000000e+00 0.988516
9 sp|P08100|OPSD_HUMAN 88.462 89.0 4.640000e-12 1.006082
0 sp|P08100|OPSD_HUMAN 96.552 100.0 0.000000e+00 1.035711
1 sp|P08100|OPSD_HUMAN 93.391 100.0 0.000000e+00 1.070767
3 sp|P08100|OPSD_HUMAN 84.795 98.0 0.000000e+00 1.155729
4 sp|P08100|OPSD_HUMAN 82.164 98.0 0.000000e+00 1.192736