生物信息中的Python 01 | 从零开始处理基因序列

一、 序列数据的下载

在开始了解序列的处理流程时,我们先要知道序列下载网址。其中一个知名的网站就是NCBI (National Center for Biotechnology Information)美国国立生物技术信息中心。

1、通过如下的网站进入 NCBI ,可以看到它包含许多的子库,其中 Gene 就是我们一般下载基因序列的库,接下来,在后面的输入框输入 oct4 并点击 Search

NCBI: https://www.ncbi.nlm.nih.gov/

mark
2、可以看到该基因在不同物种和实验中所测得的相同基因序列,我们选择其中智人的POU5F1基因。

值得注意的是 POU5F1 是 Oct4 基因的别名,本质上指的一个基因

mark
3、向下滚动,直到看到如下图所示的 FASTA 链接,点击进入。
mark
4、在这个页面就可以看到通过测序技术所得到的DNA序列。
mark
5、通过如下步骤我们可以得到该基因序列的 fasta 格式文件
mark
6、你也可以按照上述步骤尝试获取[ Mus musculus ] 的 fasta 序列,我们后面的分析需要用到

二、 DNA序列基本处理

Python版本:Python 3.6

IDE:Pycharm (https://www.jetbrains.com/pycharm/) 下载 Pycharm 的免费社区版就足够我们学习使用

操作系统:Win7

0、在Pycharm里新建如下目录的项目
mark
1、进入main.py文件,我们先把序列文件读取出来看看,到底是怎样的结果
with open('res/sequence1.fasta') as file:
    for line in file:
        print (line)
2、可以看到Fasta格式开始于一个标识符>,然后是一行描述,下面是序列,直到下一个>,表示下一条序列
这些字符串看起来和下载 Fasta 文件页面显示的差不多,但是这不是我们想要的结果

Fasta 格式详解

mark
3、接下来我们把描述字段和序列分别提取并存储在字典中
fasta = {}
with open('res/sequence1.fasta') as file:
    sequence = ""
    for line in file:
        if line.startswith(">"):
            # 去除描述字段行中的\n和>
            name = line[1:].rstrip()
            fasta[name] = ''
            continue
        # 去除序列字段行中的\n,并将所有字符规范为大写字符
        fasta[name] += line.rstrip().upper()
print (fasta)

用函数把上面的代码装起来,方便后续调用

def get_fasta(fasta_path):
    fasta = {}
    with open(fasta_path) as file:
        sequence = ""
        for line in file:
            if line.startswith(">"):
                # 去除描述字段行中的\n和>
                name = line[1:].rstrip()
                fasta[name] = ''
                continue
            # 去除序列字段行中的\n,并将所有字符规范为大写字符
            fasta[name] += line.rstrip().upper()
    return fasta
4、拿到规范化的数据,我们现在来看看具有它具有的生物学意义,这里为了以后方便调用,使用函数的形式来实现
4.1 核苷酸计数,碱基偏好性:

这里的统计数值可以查看碱基偏好性。比如, 一定类型的小RNA会有特定的碱基偏好性,它的第一个碱基偏好U。可以用于评价数据质量。如果miRNA 第一碱基不是U偏好,说明数据或分析过程有问题。

# 核苷酸计数
def nt_count(seq):
    ntCounts = []
    for nt in ['A', 'C', 'G', 'T']:
        ntCounts.append(seq.count(nt))
    return ntCounts
4.2 GC含量:

(A+T)/(G+C)之比随DNA的种类不同而异。GC含量愈高,DNA的密度也愈高,同时热及碱不易使之变性,因此利用这一特性便可进行DNA的分离或测定。同时,物种的GC含量有着特异性,以此可以判断测序后的数据是否合格。

# CG 含量
from __future__ import division
def cg_content(seq):
    total = len(seq)
    gcCount = seq.count('G') + seq.count('C')
    gcContent = format(float(gcCount / total * 100), '.6f')
    return gcContent    
4.3 DNA 翻译为 RNA:
# DNA 翻译为 RNA
def dna_trans_rna(seq):
    rnaSeq = re.sub('T', 'U', seq)
    # method2: rnaSeq = dnaSeq.replace('T', 'U')
    return rnaSeq
4.4 RNA 翻译为 蛋白质:
def rna_trans_protein(rnaSeq):
    codonTable = {
        'AUA':'I', 'AUC':'I', 'AUU':'I', 'AUG':'M',
        'ACA':'T', 'ACC':'T', 'ACG':'T', 'ACU':'T',
        'AAC':'N', 'AAU':'N', 'AAA':'K', 'AAG':'K',
        'AGC':'S', 'AGU':'S', 'AGA':'R', 'AGG':'R',
        'CUA':'L', 'CUC':'L', 'CUG':'L', 'CUU':'L',
        'CCA':'P', 'CCC':'P', 'CCG':'P', 'CCU':'P',
        'CAC':'H', 'CAU':'H', 'CAA':'Q', 'CAG':'Q',
        'CGA':'R', 'CGC':'R', 'CGG':'R', 'CGU':'R',
        'GUA':'V', 'GUC':'V', 'GUG':'V', 'GUU':'V',
        'GCA':'A', 'GCC':'A', 'GCG':'A', 'GCU':'A',
        'GAC':'D', 'GAU':'D', 'GAA':'E', 'GAG':'E',
        'GGA':'G', 'GGC':'G', 'GGG':'G', 'GGU':'G',
        'UCA':'S', 'UCC':'S', 'UCG':'S', 'UCU':'S',
        'UUC':'F', 'UUU':'F', 'UUA':'L', 'UUG':'L',
        'UAC':'Y', 'UAU':'Y', 'UAA':'', 'UAG':'',
        'UGC':'C', 'UGU':'C', 'UGA':'', 'UGG':'W',
    }
    proteinSeq = ""
    for codonStart in range(0, len(rnaSeq), 3):
        codon = rnaSeq[codonStart:codonStart + 3]
        if codon in codonTable:
            proteinSeq += codonTable[codon]
    return proteinSeq
4.5 获取反向序列:
# 获取反向序列
def reverse_comple(type, seq):
    seq = seq[::-1]
    dnaTable = {
        "A":"T", "T":"A", "C":"G", "G":"C"
    }
    rnaTable = {
        "A": "T", "U": "A", "C": "G", "G": "C"
    }
    res = ""
    for ele in seq:
        if ele in seq:
            if type == "dna":
                res += dnaTable[ele]
            else:
                res += rnaTable[ele]
    return res
4.6 最后我们来一个main来把上面的函数统统运行一遍
if __name__ == '__main__':
    oct4 = get_fasta('res/sequence1.fasta')
    for name, sequence in oct4.items():
        print ("name: ", name)
        print ("sequence: ", sequence)
        print ("nt_count: ", nt_count(sequence))
        print ("cg_content: ", cg_content(sequence))
        rna = dna_trans_rna(sequence)
        print ("rna: ", rna)
        protein = rna_trans_protein(rna)
        print ("protein: ", protein)
        print ("reverse_comple: ", reverse_comple("dna", sequence))

部分结果如下:

mark

了解基因结构

生物信息中的Python 02 | 用biopython解析序列

生物信息中的Python 03 | 自动化操作NCBI

生物信息中的Python 04 | 批量下载基因与文献

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

推荐阅读更多精彩内容