タンパク質のRefSeqID(NPやXPから始まるID)を大量に持っていて、それをPython上でなんとかGene symbolに変換できないかを模索していた。
そんなとき、MyGene.info というサービスを見つけた。あまり日本語のドキュメントがないので軽く紹介しておく。
MyGene.info では様々なDBの遺伝子情報を扱える
MyGene.infoではNCBIのRefseq、EnsemblのIDなどを扱うことができるAPIを提供している。具体的にどういうものか見せると、
https://mygene.info/v3/query?q=NP_780694.3
というクエリ(リクエスト)に対し、
{"took":2,"total":1,"max_score":41.31855,"hits":[{"_id":"235472","_score":41.31855,"entrezgene":"235472","name":"protogenin","symbol":"Prtg","taxid":10090}]}
といったJSON形式での応答(200)が返ってくる。
これはNP_で始まっているNCBI Refseqのアミノ酸配列のIDであり、それに対して検索すると元の遺伝子の名前、遺伝子シンボル(Gene symbol)などを得ることができる。
昔NCBIのAPIについての記事を書いたが、それよりも高速であるし、Ensemblも使えるので応用の幅が広そうだ。色々なバイオインフォマティクスのアプリケーション開発に活用できそうである。
ちなみに遺伝子IDに対しても使うことができ、例えば Gene ID: 235472 について情報を得たい時、
https://mygene.info/v3/gene?id=235472&fields=all&dotfield=false&size=10
と入力する。先程とは少し異なり、v3の後ろが gene
になっている。また、fields
=all ですべての情報を取得、dotfield=false
でドットで区切られていないテキストを、size=10
で返ってくる情報の最大数を10に制限している。これの結果は、
{"AllianceGenome":"2444710","MGI":"MGI:2444710","_id":"235472","_version":1,"accession":{"genomic":["AC158997.2","CH466522.1","CT027588.10","NC_000075.7"],"protein":["AAI16337.1","AAI16338.1","AAU05740.1","ABC96181.1","BAC30243.1","BAC38947.1","EDL26270.1","NP_780694.3","Q2EY15.1"],"rna":["AK036172.1","AK039115.1","AK045117.1","AK083540.1","AK164458.1","AK168030.1","AY630257.1","BC116336.1","BC116337.1","DQ360114.1","NM_175485.4"],"translation":[{"protein":"AAU05740.1","rna":"AY630257.1"},{"protein":"BAC38947.1","rna":"AK083540.1"},{"protein":"ABC96181.1","rna":"DQ360114.1"},{"protein":"BAC30243.1","rna":"AK039115.1"},{中略}[72759710,72765114]],"strand":1,"transcript":"NM_175485","txend":72765114,"txstart":72655080}],"generif":[{"pubmed":16881056,"text":"Protogenin expression is restricted to posterior neural plate and mesoderm, with an anterior limit at the level of the rhombencephalon."},{"pubmed":20335479,"text":"these results suggested that expression of PRTG defines a stage between pluripotent epiblasts and committed neural progenitors, and its signaling plays a critical role in suppressing premature neuronal differentiation during early neural development."},{"pubmed":21108791,"text":"This study showed that Prtg, which is a highly expressed gene in the E10.5 mouse mandible, using a cDNA subtraction method between mandibles at E10.5 and E12.0."},{中略}[{"evidence":"IBA","gocategory":"CC","id":"GO:0005886","pubmed":21873635,"qualifier":"is_active_in","term":"plasma membrane"},{中略}["1438333_at","1438410_at","1456329_at"]},"symbol":"Prtg","taxid":10090,"type_of_gene":"protein-coding","unigene":["Mm.469160","Mm.31696"],"uniprot":{"Swiss-Prot":"Q2EY15"}}
といったようにその遺伝子に関するデータ(mRNAのID、またそのアミノ酸配列のID、文献情報等)が返ってくる。
さて、ブラウザに上記のようなクエリをいちいち打ち込んで返ってくる情報をコピペしているようでは日が暮れてしまう。自動化に向けてPythonを使って退屈な作業をやらせてみよう。
Python で MyGene.info の API を叩く
APIがあるので超簡単。普通にHTTPリクエストを送ればいい。
import requests
headers = {'content-type': 'application/x-www-form-urlencoded'}
params = 'q=NP_003133.1,NP_001688.1&scopes=refseq&fields=name,symbol'
res = requests.post('http://mygene.info/v3/query', data=params, headers=headers)
print(res.text)
これはNP_003133.1,NP_001688.1の2つのアミノ酸配列の情報のうち、遺伝子名とGene symbolを取得したいというクエリである。
$ python converter.py
[{"query":"NP_003133.1","_id":"6741","_score":39.406715,"name":"small RNA binding exonuclease protection factor La","symbol":"SSB"},{"query":"NP_001688.1","_id":"539","_score":44.421535,"name":"ATP synthase peripheral stalk subunit OSCP","symbol":"ATP5PO"}]
といったぐあいに返ってくる。結構早い。
q=
の部分をカンマ区切りで繋げていけばバッチ処理もバッチリだ。
先ほど紹介したように、/v3/gene に対して使うこともできる。ドキュメントを参照。
JSONの処理
詳しくは他のドキュメントを参照すればいいが、軽くメモ程度に。
JSON形式なので、PythonではJSONライブラリをインポートすれば扱える。
import requests, json
headers = {'content-type': 'application/x-www-form-urlencoded'}
params = 'q=NP_001716.3,NP_004130.2&scopes=refseq&fields=name,symbol'
res = requests.post('http://mygene.info/v3/query', data=params, headers=headers)
jdict = json.loads(res.text)
print(jdict)
for i in jdict:
print(i['query'], i["symbol"])
こんな具合にすれば、クエリのIDとGene symbolが両方取り出せる。