Uniprotで調べた標的タンパクのSummaryとPDBを取得する

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です. f:id:keetane:20210202214623p:plain 以下,要所だけ説明.

# 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を作成出来ます,が... f:id:keetane:20210202215744p:plain ooops...みたいになります.
情報量が多くて絶望しそうになりますが,XMLなので情報がタグ付けされてます.
ざっくり言うと,[ID, name, Description, Database cross-references, annotation, sequence]みたいな構成になっています.
ここからBiopythonのinstanceで目的にあった情報を抽出してこれます. record.と入力した後にtabを押すといい感じに候補が出てきます.,f:id:keetane:20210202215855p:plain
例えばidなんかは比較的シンプルで,

record.id
# 'Q68DV7'

みたいに返ってきますが,Database cross-referencesとannotationは,ややむずです.

record.annotations

ではannotationがdictionaryで返ってきます.
f:id:keetane:20210202221301p:plain
つまり,keyでslicingしてやればvalueが返ってきます.
例えば,

record.annotations['comment_PTM']
# ['Autoubiquitinated.']

みたいにリストで返ってきます.
こいつ自己Ub化されるんか.

record.dbxrefs

でDatabase cross-referencesのリストが返ってきます. f:id:keetane:20210202221503p:plain
使いづら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üß.