python计算平均值输出两位小数_Python处理如何将相同基因的FPKM算一个平均值再输出...
前面的GTF类作为库写的已经足够好,下面主函数的逻辑改下就行了:
测试数据:
chrXStringTietranscript1546324731546331821000-.gene_id "STRG.136"; transcript_id "STRG.136.1"; reference_id "NR_027402_dup1"; ref_gene_id "NR_027402"; ref_gene_name "FAM223B"; cov "0.043709"; FPKM "25.671564"; TPM "43.296898";
chrXStringTieexon1546324731546331821000-.gene_id "STRG.136"; transcript_id "STRG.136.1"; exon_number "1"; reference_id "NR_027402_dup1"; ref_gene_id "NR_027402"; ref_gene_name "FAM223B"; cov "0.043709";
chrXStringTietranscript1546324731546331821000-.gene_id "STRG.136"; transcript_id "STRG.136.2"; reference_id "NR_027401"; ref_gene_id "NR_027401"; ref_gene_name "FAM223A"; cov "0.000000"; FPKM "0.000000"; TPM "0.000000";
chrXStringTieexon1548850421548855581000+.gene_id "STRG.137"; transcript_id "STRG.137.1"; exon_number "1"; reference_id "NM_080720"; ref_gene_id "NM_080720"; ref_gene_name "H2AFB3"; cov "0.056093";
chrXStringTietranscript1548850421548855581000+.gene_id "STRG.137"; transcript_id "STRG.137.2"; reference_id "NM_001017990"; ref_gene_id "NM_001017990"; ref_gene_name "H2AFB1"; cov "0.000000"; FPKM "0.000000"; TPM "0.000000";
chrXStringTieexon1548850421548855581000+.gene_id "STRG.137"; transcript_id "STRG.137.2"; exon_number "1"; reference_id "NM_001017990"; ref_gene_id "NM_001017990"; ref_gene_name "H2AFB1"; cov "0.000000";
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, absolute_import
class GTF(object):
def __init__(self):
"""
gtf文件的9列
"""
self._seqid = None
self._source = None
self._type = None
self._start = None
self._end = None
self._score = None
self._strand = None
self._phase = None
self._attributes = None
def parse_line(self, line):
"""
解析一行
:return: 填充完属性之后的对象
"""
(self._seqid, self._source, self._type, self._start, self._end,
self._score, self._strand, self._phase, attribute_string) = line.rstrip().split('\t')
self._attributes = {}
key_value_pair_set = attribute_string.split('; ') # 除了最后一个每个都是按照分号加空格分割的
for key_value_pair in key_value_pair_set[: -1]: # 最后一个比较特殊,特殊处理
key, value = key_value_pair.split(' ')
self._attributes[key] = value[1: -1] # 去除第一个字符和最后一个字符
key, value = key_value_pair_set[-1][: -1].split(' ') # 去除最后一个的分号
self._attributes[key] = value[1: -1]
return self
def get_transcript_fpkm(self):
if self._type == 'transcript':
return self._attributes.get('FPKM', None)
return None
def get_attribute(self, key):
return self._attributes.get(key, None)
if __name__ == '__main__':
import sys
from collections import defaultdict
try:
with open(sys.argv[1]) as f:
gene2fpkm = defaultdict(list)
for l in f:
if not l.startswith('#'): # 去除注释行
gtf = GTF().parse_line(l)
fpkm = gtf.get_transcript_fpkm()
tid = gtf.get_attribute('transcript_id')
if tid and fpkm:
gene2fpkm[tid].append(float(fpkm))
for gene, fpkm_list in gene2fpkm.items():
print('Transcript ID: %s, FPKM average: %.3f' % (gene, sum(fpkm_list)/len(fpkm_list)))
except IndexError:
print('Usage: python %s [path-to-gtf-file]' % __file__)
sys.exit(1)
运行:
python fpkm.py example.gtf
输出:
Transcript ID: STRG.136.1, FPKM average: 25.672Transcript ID: STRG.136.2, FPKM average: 0.000Transcript ID: STRG.137.2, FPKM average: 0.000
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
