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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部