python生信小练习(四)

生信编程直播第一题:人类基因组的外显子区域到底有多长

方法1:分别以外显子坐标的起始、终止坐标作为字典的键值对

#计算人基因组的外显子长度
f5 = r'E:\Bioinformatics\data\human\CCDS.current.txt'
head = 1
exon = {}
for line in open(f5):
    if head:
        head -= 1
        continue
    temp = line.split('\t')
    if temp[9] != '-':    #添加条件:如果基因坐标不为空
        coordinate = temp[9].lstrip('[').rstrip(']').split(', ')
    for i in range(len(coordinate)):
        startCDS = coordinate[i].split('-')[0]
        exon[startCDS] = coordinate[i].split('-')[1]
length = 0
for startCDS, endCDS in exon.items():
    length += int(endCDS.strip("'")) - int(startCDS.strip("'")) +1    #要去除以字符串形式存储的数字的单引号,否则会报错
print(length)

方法2:以外显子起始、终止坐标创建等长列表进行计算

f5 = r'E:\Bioinformatics\data\human\CCDS.current.txt'
head = 1
startCDS = []
endCDS = []
for line in open(f5):
    if head:
        head -= 1
        continue
    temp = line.split('\t')
    if temp[9] != '-':
        coordinate = temp[9].lstrip('[').rstrip(']').split(', ')
    for i in range(len(coordinate)):
        startCDS.append(coordinate[i].split('-')[0])
        endCDS.append(coordinate[i].split('-')[1])
length = 0
for i in range(len(startCDS)):
    length += int(endCDS[i]) - int(startCDS[i]) +1    #要去除以字符串形式存储的数字的单引号,否则会报错
print(length)

生信编程直播第二题-hg19基因组序列的一些探究

因为自己目前研究番茄,所以以番茄基因组fasta文件为操作对象
首先,看一下该文件的大小:

番茄基因组fasta文件

不到一个G,约为822M
番茄一共有12条染色体,对每条染色体进行GC%, N%, Length, A, T, G, C, N统计(注意:在计算GC%时,需要去除N):
方法一:
思路为首先创建以染色体名称为key,序列为value的字典;随后,针对该字典中的value进行操作,针对序列进行遍历计数操作;最后,根据所记录的字符数进行GC%及N%的计算,并打印至屏幕。该方法非常消耗计算机资源。

import time
start = time.clock()
f = r'E:\Bioinformatics\data\S_lycopersicum_chromosomes.3.00.fa\S_lycopersicum_chromosomes.3.00.fa'
genome = {}
for line in open(f):
    if line.startswith('>'):
        chr_id = line.strip()
        genome[chr_id] = []
    else:
        genome[chr_id].append(line.strip())

print('Chr\tGC_ratio\tN_ratio\tLength\tA\tT\tG\tC\tN')
for chrom, seq in genome.items():
    seqTotal = ''.join(seq)
    ANum = 0
    TNum = 0
    GNum = 0
    CNum = 0
    NNum = 0
    GC_ratio = 0
    N_ratio = 0
    for i in seqTotal:
        if i == 'A' or i == 'a':
            ANum += 1
        elif i == 'T' or i == 't':
            TNum += 1
        elif i == 'G' or i == 'g':
            GNum += 1
        elif i == 'C' or i == 'c':
            CNum += 1
        elif i == 'N' or i == 'n':
            NNum += 1
    GC_ratio = '%.04f' % ((GNum + CNum)/(len(seqTotal)-NNum))
    N_ratio = '%.04f' % (NNum/len(seqTotal))
    print('{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}'.format(chrom, GC_ratio, N_ratio, len(seqTotal), ANum,
                                              TNum, GNum, CNum, NNum))
end = time.clock()
print("The function run time is : %.03f seconds" %(end-start))
番茄基因组信息

可以看到,耗时极长,共358秒。
对该程序进行改进是否会减少计算资源的消耗呢?

#改进版本,利用字符串计数方法 .count()
import time
start = time.clock()
f = r'E:\Bioinformatics\data\S_lycopersicum_chromosomes.3.00.fa\S_lycopersicum_chromosomes.3.00.fa'
genome = {}
for line in open(f):
    if line.startswith('>'):
        chr_id = line.strip()
        genome[chr_id] = []
    else:
        genome[chr_id].append(line.strip())

print('Chr\tGC_ratio\tN_ratio\tLength\tA\tT\tG\tC\tN')
for chrom, seq in genome.items():
    seqTotal = ''.join(seq)
    ANum = 0
    TNum = 0
    GNum = 0
    CNum = 0
    NNum = 0
    GC_ratio = 0
    N_ratio = 0
    ANum = seqTotal.count('A') + seqTotal.count('a')
    TNum = seqTotal.count('T') + seqTotal.count('t')
    GNum = seqTotal.count('G') + seqTotal.count('g')
    CNum = seqTotal.count('C') + seqTotal.count('c')
    NNum = seqTotal.count('N') + seqTotal.count('n')
    GC_ratio = '%.04f' % ((GNum + CNum)/(len(seqTotal)-NNum))
    N_ratio = '%.04f' % (NNum/len(seqTotal))
    print('{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}'.format(chrom, GC_ratio, N_ratio, len(seqTotal), ANum,
                                              TNum, GNum, CNum, NNum))
end = time.clock()
print("The function run time is : %.03f seconds" %(end-start))
方法一改进版

该方法居然快了近10倍!!看来在处理序列类对象的时候,尽量使用针对该类的方法,能不用循环就不用,这之间是“质”的差距。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,654评论 18 139
  • 首先是方法的选择。基于距离的方法有UPGMA、ME(Minimum Evolution,最小进化法)和NJ(Nei...
    相见很不晚阅读 24,925评论 1 57
  • 第十章 使用序列数据 生物信息学的核心问题之一是处理大量的(通常定义糟糕或模糊)文件格式。久而久之,一些特定的简单...
    yangliunk1987阅读 5,026评论 3 53
  • 接龙客栈灌水区正式成立,无论你是来自哪个专题的,想发牢骚的,想发照片的,想写点日记的,想……都可以来我们灌水区哈!...
    蔷薇下的阳光阅读 271评论 37 5
  • 花开易落,回到相逢, 最后时刻,想起曾经, 如何错过,几多泪朦, 已无所谓,结局成空。 我看到烟雨中凄恻的笑容, ...
    寒风易冷阅读 210评论 6 4