生物信息中的Python 01 | 從零開始處理基因序列

一、 序列數(shù)據(jù)的下載

在開始了解序列的處理流程時,我們先要知道序列下載網(wǎng)址。其中一個知名的網(wǎng)站就是NCBI (National Center for Biotechnology Information)美國國立生物技術(shù)信息中心。

1、通過如下的網(wǎng)站進入 NCBI ,可以看到它包含許多的子庫,其中 Gene 就是我們一般下載基因序列的庫,接下來,在后面的輸入框輸入 oct4 并點擊 Search

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

mark
2、可以看到該基因在不同物種和實驗中所測得的相同基因序列,我們選擇其中智人的POU5F1基因。

值得注意的是 POU5F1 是 Oct4 基因的別名,本質(zhì)上指的一個基因

mark
3、向下滾動,直到看到如下圖所示的 FASTA 鏈接,點擊進入。
mark
4、在這個頁面就可以看到通過測序技術(shù)所得到的DNA序列。
mark
5、通過如下步驟我們可以得到該基因序列的 fasta 格式文件
mark
6、你也可以按照上述步驟嘗試獲取[ Mus musculus ] 的 fasta 序列,我們后面的分析需要用到

二、 DNA序列基本處理

Python版本:Python 3.6

IDE:Pycharm (https://www.jetbrains.com/pycharm/) 下載 Pycharm 的免費社區(qū)版就足夠我們學習使用

操作系統(tǒng):Win7

0、在Pycharm里新建如下目錄的項目
mark
1、進入main.py文件,我們先把序列文件讀取出來看看,到底是怎樣的結(jié)果
with open('res/sequence1.fasta') as file:
    for line in file:
        print (line)
2、可以看到Fasta格式開始于一個標識符>,然后是一行描述,下面是序列,直到下一個>,表示下一條序列
這些字符串看起來和下載 Fasta 文件頁面顯示的差不多,但是這不是我們想要的結(jié)果

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,并將所有字符規(guī)范為大寫字符
        fasta[name] += line.rstrip().upper()
print (fasta)

用函數(shù)把上面的代碼裝起來,方便后續(xù)調(diào)用

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,并將所有字符規(guī)范為大寫字符
            fasta[name] += line.rstrip().upper()
    return fasta
4、拿到規(guī)范化的數(shù)據(jù),我們現(xiàn)在來看看具有它具有的生物學意義,這里為了以后方便調(diào)用,使用函數(shù)的形式來實現(xiàn)
4.1 核苷酸計數(shù),堿基偏好性:

這里的統(tǒng)計數(shù)值可以查看堿基偏好性。比如, 一定類型的小RNA會有特定的堿基偏好性,它的第一個堿基偏好U。可以用于評價數(shù)據(jù)質(zhì)量。如果miRNA 第一堿基不是U偏好,說明數(shù)據(jù)或分析過程有問題。

# 核苷酸計數(shù)
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含量有著特異性,以此可以判斷測序后的數(shù)據(jù)是否合格。

# 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 翻譯為 蛋白質(zhì):
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來把上面的函數(shù)統(tǒng)統(tǒng)運行一遍
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))

部分結(jié)果如下:

mark

了解基因結(jié)構(gòu)

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

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

生物信息中的Python 04 | 批量下載基因與文獻

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容