Grüezi,
Biopythonのライブラリを使ってUniprotをいじってみたので,以下覚書.
# ライブラリのimport import pandas as pd from Bio import SeqIO from Bio.PDB import PDBList as pdbl from urllib.request import urlopen
# 調べたいタンパクのUniprotKB accession numberのリスト(一つでもOK) keys = [ 'Q96SW2', 'Q68DV7' ]
# 空のDataFrameを作成 summary = pd.DataFrame(index = keys, columns = ['name', 'description', 'pathway', 'tissue', 'subcellularlocation', 'function', 'PDB count', 'PDB'])
# Uniprotにアクセスしてtableを作成 for keyword in keys: handle = urlopen("http://www.uniprot.org/uniprot/" + keyword + ".xml") record = SeqIO.read(handle, "uniprot-xml") dbx = record.dbxrefs dfIO = pd.DataFrame(dbx) df = dfIO[0].str.split(':', expand=True) df.columns = ['name', 'id', 'and'] dfPDB = df[df['name']=='PDB'] PDBs = list(dfPDB['id']) summary['name'][keyword] = record.name summary['description'][keyword] = record.description summary['pathway'][keyword] = ''.join(record.annotations['comment_pathway']) summary['tissue'][keyword] = ''.join(record.annotations['comment_tissuespecificity']) summary['subcellularlocation'][keyword] = ', '.join(record.annotations['comment_subcellularlocation_location']) summary['function'][keyword] = ''.join(record.annotations['comment_function']) summary['PDB count'][keyword] = str(len(PDBs)) summary['PDB'][keyword] = ', '.join(PDBs) summary.T
# タンパク名のDirectoryを作成してPDBをDL for pdb_id in PDBs: pdbl().retrieve_pdb_file(pdb_id, pdir=record.description) print('fertig')
こんな感じのDataFrameが出力されればOKです.
以下,要所だけ説明.
# keywordのxmlにアクセス handle = urlopen("http://www.uniprot.org/uniprot/" + keyword + ".xml") # recordの作成 record = SeqIO.read(handle, "uniprot-xml") print(record)
XMLはタグ付きの情報なわけですが,Uniprotのxmlは私のような素人にはちょっと複雑です.
Biopythonを使うと,dic形式っぽいrecordを作成出来ます,が...
ooops...みたいになります.
情報量が多くて絶望しそうになりますが,XMLなので情報がタグ付けされてます.
ざっくり言うと,[ID, name, Description, Database cross-references, annotation, sequence]みたいな構成になっています.
ここからBiopythonのinstanceで目的にあった情報を抽出してこれます.
record.
と入力した後にtabを押すといい感じに候補が出てきます.,
例えばidなんかは比較的シンプルで,
record.id
# 'Q68DV7'
みたいに返ってきますが,Database cross-referencesとannotationは,ややむずです.
record.annotations
ではannotationがdictionaryで返ってきます.
つまり,key
でslicingしてやればvalue
が返ってきます.
例えば,
record.annotations['comment_PTM'] # ['Autoubiquitinated.']
みたいにリストで返ってきます.
こいつ自己Ub化されるんか.
record.dbxrefs
でDatabase cross-referencesのリストが返ってきます.
使いづらw
ここで欲しい情報だけとってくるのにひと工夫必要でした.
# Database cross-referencesのDataFrame作成 dbx = record.dbxrefs dfIO = pd.DataFrame(dbx) # ':' でstringを分割 df = dfIO[0].str.split(':', expand=True) # カラム名の割り当て df.columns = ['name', 'id', 'and'] # 'PDB'を含むrowをfilter dfPDB = df[df['name']=='PDB'] # PDB IDをリストに変換 PDBs = list(dfPDB['id']) PDBs # ['4KNG']
私が欲しいのはPDB IDのリストなんで上の処理ですが,DOIやPubMed IDでも同じことがもちろん出来ます.
Database cross-referencesもannotationみたいに最初からdictionaryでくれれば苦労が少ない気が...
さてさて,以上の内容をfor
文で回してあげたのが冒頭のスクリプトで,複数のタンパクのsummaryをUniprotからDataFrameへと出力出来ます.
ちなみに今回例にしたRNF43ですが,先日PROTACの報告がありました.
膜局在型E3Ligaseなんてものがあるらしく,標的とRNF43をバイスペ抗体で近づけてやるとpolyUb63化されてLysosomeで分解されるんだとか.
「節子,それPROTACちゃう,LYTACや」
ってツッコミはなかったのかなーとか思ったり.
ちなみに本当はlxmlというライブラリを使った方が色々情報取れるはずなんですが,それは勉強中なので宿題ということで. seiyakukenkyusya.com
それではBis Wald, tschüß.