iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 22
0
自我挑戰組

猶豫就會敗北,果斷就會白給|園藝 boy 的生物資訊冒險記趣,跟上學術潮流不走冤望路 feat. RNA-Sick系列 第 22

RNA-Sick@Day22 > 誰能阻止少年專題生呢?他們聽不到|用程式上 NCBI 資料庫 feat. NCBI Entrez

請證明你不是機器人

繪製親緣關係樹的前置工作中,搜集所有適合一起比對的基因之序列是十分累人的工作。我不寫程式以前,會找一首喜歡的專輯,放著聽,然後開始開啟大量瀏覽器分頁在 NCBI 上一個一個地輸入基因代號,祈禱自己不會搞混頁面,點選超連結下載需要的序列,在音樂中消耗掉這樣枯燥的重複性工作與生命。而我也看著每個專題生走過這樣的過程,抱怨著 NCBI 的介面很醜對人來說很難讀,感覺就像是給機器讀的,殊不知那些頁面真的是給機器讀的啊~來吧!來把你體內的機器人釋放出來吧!


(截圖來自 AEON FLUX)

用 bioPython 腳本讀取 NCBI Gene 資料庫

Entrez 是 NCBI 的跨資料庫搜尋引擎,Entrez 一詞源自法語,意思爲「進來吧!」,Entrez Programming Utilities (E-utilities) 就是讓我們可以程式化存取的入口,以下我們將使用 bioPython 存取其中的 Gene 資料庫,輸入 Gene Symbol,輸出對應的 refseq 之 轉錄產物和蛋白質 accession number。


(截圖來自 REDLINE)

從 Bio 引入需要的 Entrez,並且填入你自己的 email 讓 NCBI 知道是誰在使用。gene_symbol 變數用以儲存待會要查的基因之 accession number。使用 Entrez.efetch 取得 gene 資料庫的資訊,暫時存在 handle 中,選擇的格式是 xml。將 handle 中的東西讀取出來並儲存於 gene_symbol 同名檔案中。

from Bio import Entrez
Entrez.email = "your_email@gmail.com"
gene_symbol = 'LOC111024533'
handle = Entrez.efetch(db="gene", id=gene_symbol, retmode="xml")
saving_file = open(gene_symbol, "w")
saving_file.write(handle.read())
saving_file.close()

先存起來再讀取的目的是為了節省時間,NCBI 還是希望大家不要氾濫地程式化存取資料庫,有限制一定的存取頻率,而這些基本規則已經被寫在 bioPython 中了。因此透過網路對 Entrez 存取一次之後先存在本機,之後再陸續拆解已經存取於本機的檔案來取出需要的資訊。我們儲存的格式是 XML,如下圖所示。

前面說了我們想要取出對應的轉錄產物和蛋白質產物之 refseq 編號,大概摸索一下 XML 檔案就可以找到我們想要取出的資訊在哪裡,用一個迴圈搭配例外處理來挖出需要的資訊吧~

transcript_refseq_list = []
protein_refseq_list = []
handle = open(gene_symbol)
records = Entrez.parse(handle)
for record in records:
    try:
        transcript_list = record['Entrezgene_locus'][0]['Gene-commentary_products']
        for transcript_info in transcript_list:
            transcript_refseq = transcript_info['Gene-commentary_accession']
            protein_list = transcript_info['Gene-commentary_products']
            for protein_refseq in protein_list:
                protein = protein_refseq['Gene-commentary_accession']
                print(protein)
                protein_refseq_list.append(protein)
            transcript_refseq_list.append(transcript_refseq)
            print(transcript_refseq)
    except:
        print(gene_symbol)

執行結果:

XP_022158021
XM_022302329
XP_022158157
XM_022302465
XP_022157959
XM_022302267
XP_022158088
XM_022302396

掌握程式化存取 Entrez 會是超棒的事情,查詢基因、蛋白質等等相關資料只是基本,該資料庫也包括了 PUBMED 文獻資料庫,也就是說可以程式化地搜集文獻,比如說自動比對不同的關鍵字之文獻搜尋結果數量,或是利用自然語言處理來擷取個篇文獻摘要中提及的基因關係建立基因調控網絡。在寫這篇文的時候才發現有一個今年發表的 Entrezpy 好像也很棒但是還沒研究,放在下方供大家參考~

以上就是簡單的 Entrez 使用範例,如果有誤或是無法執行或是想了解更多請留言告訴我~

參考資料與延伸閱讀

Biopython Tutorial and Cookbook

A General Introduction to the E-utilities

Entrezpy: a Python library to dynamically interact with the NCBI Entrez databases

關於作者

謝晨 (Chen Hsieh),臺大園藝暨景觀學系研究所碩士。讀碩士前的興趣是懷著寫點程式妄圖解決農業問題的夢想參加比賽,拿了幾個黑客松與 Open Data 創新應用競賽的獎,卻都沒有勇氣將項目經營下去;研究所期間的興趣轉換成讀學術期刊的出刊電子報。靠著這些興趣當選 107 學年的臺大優秀青年,畢業後卻成了無業的實驗室居民。現在在農場旁的研究館辦公室寫點東西,希望可以跟世界分享生物資訊與園藝的樂趣!

感謝選擇匿名的朋友協助校閱初稿與提供意見,也敬請各位讀者不吝指教!

E-mail

Facebook

Twitter

Linkedin

RNA-Sick.me


上一篇
RNA-Sick@Day21 > 是擅長畫 Pathway 的朋友啊|用程式來查京都基因與基因體百科全書 feat. KEGG REST API
下一篇
RNA-Sick@Day23 > 基因調控什麼的最喜歡了|啟動子區段序列之順式作用元件分析 feat. PLACE database
系列文
猶豫就會敗北,果斷就會白給|園藝 boy 的生物資訊冒險記趣,跟上學術潮流不走冤望路 feat. RNA-Sick30

尚未有邦友留言

立即登入留言