本記事では化合物の標的タンパクをChEMBLから取得する手順を説明します。
1. ChEMBLについて
ChEMBLは欧州分子生物学研究所(EMBL)のバイオインフォマティクス研究所(EBI)が運営する医薬品などの化合物に関する薬物動態や活性のデータベースであり、化合物の標的タンパクに関する情報もあります。
ブラウザから検索をしたり、APIからデータを取得したり、あるいはデータベース自体をPostgreSQLのDBとしてダウンロードして利用できます。全て無料です。
ブラウザ:https://www.ebi.ac.uk/chembl
API:https://chembl.gitbook.io/chembl-interface-documentation/web-services/chembl-data-web-services
2. データベースのダウンロード
下記のFTPサイトからダウンロードできます。
上記のサイトからPostgreSQLの最新のデータベースを選択してダウンロードします。本記事執筆時点(2025/1/10)では以下のURLが最新でした。環境にもよりますがダウンロードには約1時間かかりました。
3. 環境構築
ダウンロードしたDBを解凍した後、PostgreSQLが使える環境をDockerで用意します。
Docker内でダウンロードしたDBに対してSQLを用いて標的化合物を調べます。
3.1. 解凍
作業ディレクトリへchembl_35_postgresql.tar.gz
を移動させ、以下のようにして解凍します。
$ tar -xzvf chembl_34_postgresql.tar.gz
3.2. Docker のインストール
Dockerの公式サイトからDocker Desktopをダウンロードし、インストールします。
3.3. Dockerの起動
インストールしただけではコンソールからdocker
などのコマンドが使えないので、アプリケーションとして起動します。
3.4. docker-compose用のファイルを準備
続いてデータベースを解凍して作成されたディレクトリのうちchembl35/chembl_35_postgresql
に下記のdocker-compose.yaml
を設置します。
version: "3.6" services: db: image: postgres:14.2 ports: - 5432:5432 tty: true environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password volumes: - ./db:/var/lib/postgresql/data
3.5. docker-composeでコンテナ起動
chembl35/chembl_35_postgresql
に移動し、以下のコマンドでDockerのコンテナを起動します。
chembl34/chembl_34_postgresql $ docker-compose up
3.7. データベースのファイルを移動
データベースの本体であるdmpファイルを適切な場所へ移動させておきます。
chembl34/chembl_34_postgresql $ mv chembl_34_postgresql.dmp db/chembl_34_postgresql.dmp
3.8. コンテナに入る
上記でコンテナを起動した状態のまま、新しいコンソールのウィンドウを開きます。
まずは先ほど起動したコンテナIDを以下のように調べます。
chembl34/chembl_34_postgresql $ docker container ls
得られたIDを用いて、以下のようにしてコンテナに入ります。
chembl34/chembl_34_postgresql $ docker exec -it [docker container id] bash
3.9. PostgreSQLサーバの起動
コンテナに入った後は、以下のようにしてPostgreSQLサーバを立ち上げます。これには30分〜の時間がかかりました。
(Docker内) $ pg_restore -d postgres /var/lib/postgresql/data/chembl_34_postgresql.dmp -U postgres -O
3.10. データベースの確認
上手くサーバが立ち上がり、データベースが読み込まれていた場合、以下のコマンドでPostgreSQLを立ち上げてテーブル一覧を表示できます。
(Docker内) $ psql -d postgres -U postgres posgre: /dt;
4. 化合物の標的タンパクリストの取得
ChEMBLのテーブル定義は下記URLのchembl_35 Schema Documentation
で確認できます。
https://ftp.ebi.ac.uk/pub/databases/chembl/ChEMBLdb/latest/
例えば以下のようなテーブルがあります。
- assays: 文献で報告されていた測定のリスト
- activities: 活性値やエンドポイント値など測定の結果
- compound_structures: SMILES等の化合物の構造情報
- target_dictionary: 化合物の標的のリスト
ユースケースが下記のURLに掲載されているので、参考にします。
https://chembl.gitbook.io/chembl-interface-documentation/frequently-asked-questions/schema-questions-and-sql-examples
今回の場合、下記のSQLで一時的に標的タンパクのリストをテーブルとして保存します。
CREATE TABLE TEMP_COMPOUND_TARGET AS SELECT DISTINCT m.chembl_id AS compound_chembl_id, s.canonical_smiles AS canonical_smiles, r.compound_name AS compound_name, r.cidx AS CID, s.standard_inchi AS inchi, s.standard_inchi_key AS inchi_key, t.chembl_id AS target_chembl_id, t.pref_name AS target_name, cs.accession AS uniprot_id FROM compound_structures s RIGHT JOIN molecule_dictionary m ON s.molregno = m.molregno JOIN compound_records r ON m.molregno = r.molregno JOIN docs d ON r.doc_id = d.doc_id JOIN activities act ON r.record_id = act.record_id JOIN assays a ON act.assay_id = a.assay_id JOIN target_dictionary t ON a.tid = t.tid JOIN target_components tc ON t.tid = tc.tid JOIN component_sequences cs ON tc.component_id = cs.component_id WHERE t.organism = 'Homo sapiens';
続いて、下記のようにしてCSVファイルに結果を出力します。
COPY TEMP_COMPOUND_TARGET TO '/var/lib/postgresql/data/TEMP_COMPOUND_TARGET.csv' DELIMITER ',' CSV HEADER;
5. Pythonから読み込む
上記で出力したファイルは、例えば下記のようにPythonで読み込めます。
import pandas as pd df_compounds = pd.read_csv('chembl_34/chembl_34_postgresql/db/TEMP_COMPOUND_TARGET.csv') df.head()
compound_chembl_id | canonical_smiles | compound_name | cid | inchi | inchi_key | target_chembl_id | target_name | uniprot_id |
CHEMBL1 | COc1ccc2c(c1)OC[C@H]1[C@@H]2C2=C(OC1(C)C)C1=C(… | (5S,14R,19S,28R)-10,23-dimethoxy-4,4,29,29-tet… | CLD0 | InChI=1S/C32H32O8/c1-31(2)19-13-37-21-11-15(35… | GHBOEFUAGSHXPO-XZOTUCIWSA-N | CHEMBL3004 | Multidrug resistance-associated protein 1 | P33527 |
CHEMBL1 | COc1ccc2c(c1)OC[C@H]1[C@@H]2C2=C(OC1(C)C)C1=C(… | (5S,14R,19S,28R)-10,23-dimethoxy-4,4,29,29-tet… | CLD0 | InChI=1S/C32H32O8/c1-31(2)19-13-37-21-11-15(35… | GHBOEFUAGSHXPO-XZOTUCIWSA-N | CHEMBL4302 | P-glycoprotein 1 | P08183 |
CHEMBL1 | COc1ccc2c(c1)OC[C@H]1[C@@H]2C2=C(OC1(C)C)C1=C(… | (5S,14R,19S,28R)-10,23-dimethoxy-4,4,29,29-tet… | CLD0 | InChI=1S/C32H32O8/c1-31(2)19-13-37-21-11-15(35… | GHBOEFUAGSHXPO-XZOTUCIWSA-N | CHEMBL5393 | ATP-binding cassette sub-family G member 2 | Q9UNQ0 |
CHEMBL10 | C[S+]([O-])c1ccc(-c2nc(-c3ccc(F)cc3)c(-c3ccncc… | 1-(4-(4-(4-fluorophenyl)-5-(pyridin-4-yl)-1H-i… | CLD0 | InChI=1S/C21H16FN3OS/c1-27(26)18-8-4-16(5-9-18… | CDMGBJANTYXAIV-UHFFFAOYSA-N | CHEMBL289 | Cytochrome P450 2D6 | P10635 |
CHEMBL10 | C[S+]([O-])c1ccc(-c2nc(-c3ccc(F)cc3)c(-c3ccncc… | 4-(2-(4-(methylsulfinyl)phenyl)-4-phenyl-1H-im… | CLD0 | InChI=1S/C21H16FN3OS/c1-27(26)18-8-4-16(5-9-18… | CDMGBJANTYXAIV-UHFFFAOYSA-N | CHEMBL2094115 | MAP kinase p38 | O15264 |
約126万種類の化合物があり、標的タンパクは約4500種類ほどあることが分かります。
# statistics compounds = df_compounds.inchi_key.drop_duplicates().tolist() compounds_proteins = df_compounds.uniprot_id.drop_duplicates().tolist() print(f'n_compounds: {len(compounds)}') print(f'n_proteins: {len(compounds_proteins)}')
n_compounds: 1258465
n_proteins: 4567
6. UniProt IDをシンボル表記に変換
こちらの記事に従い、RのbiomaRtを利用して UniProt IDとシンボル表記の対応表(uniprotID_to_symbols.csv
)を作成しておきます。
続いて以下のようにして標的タンパクをシンボル表記に変換します。
import pickle # 1. 標的タンパクのUniProt IDリストを作成して保存 uniprotIDs = df_compounds['uniprot_id'].drop_duplicates().tolist() f = open('id_conversion/target_protein_uniprotIDs.csv', 'w') f.writelines(['uniprot_id\n'] + [str(i) + '\n' for i in uniprotIDs]) f.close() # 2. RのbiomaRtで作成したUniProt IDとシンボル表記の対応表を作成して保存(uniprotID_to_symbols.csv) # 3. 対応表を読み込んで辞書に変換し df_unp_sym = pd.read_csv('id_conversion/uniprotID_to_symbols.csv', index_col=1) unp_sym = df_unp_sym['uniprot_gn_symbol'].to_dict() # 4. pickleで保存 with open('temp/uniprotID_to_symbol.pkl', 'wb') as tf: pickle.dump(unp_sym, tf) # 5. df_compoundsにシンボルの列を加える df_compounds['symbol'] = df_compounds['uniprot_id'].apply( lambda x: unp_sym[x] if x in unp_sym.keys() else np.nan ) # 6. 化合物のInChIKeyから標的タンパクのシンボル表記を得る辞書を作成 def makeList_groupby(df, col1, col2, unique=True): lcol1 = df[col1].tolist() scol1 = list(set(lcol1)) lcol2 = df[col2].tolist() c1_c2 = {c1:[] for c1 in scol1} for c1, c2 in zip(lcol1, lcol2): c1_c2[c1].append(c2) if unique: c1_c2 = {c1: list(set(c1_c2[c1])) for c1 in c1_c2.keys()} return c1_c2 ink_syms = makeList_groupby(df_compounds, 'inchi_key', 'symbol', unique=True) # 7. pickleで保存 TEMP_DIR = 'temp' with open(f'{TEMP_DIR}/compoundInChIKey_to_symbols.pkl', 'wb') as tf: pickle.dump(ink_syms, tf)
以下のように、df_compounds
にシンボル表記の列が加わりました。
df_compunds.head()
compound_chembl_id | canonical_smiles | compound_name | cid | inchi | inchi_key | target_chembl_id | target_name | uniprot_id | symbol |
CHEMBL1 | COc1ccc2c(c1)OC[C@H]1[C@@H]2C2=C(OC1(C)C)C1=C(… | (5S,14R,19S,28R)-10,23-dimethoxy-4,4,29,29-tet… | CLD0 | InChI=1S/C32H32O8/c1-31(2)19-13-37-21-11-15(35… | GHBOEFUAGSHXPO-XZOTUCIWSA-N | CHEMBL3004 | Multidrug resistance-associated protein 1 | P33527 | ABCC1 |
CHEMBL1 | COc1ccc2c(c1)OC[C@H]1[C@@H]2C2=C(OC1(C)C)C1=C(… | (5S,14R,19S,28R)-10,23-dimethoxy-4,4,29,29-tet… | CLD0 | InChI=1S/C32H32O8/c1-31(2)19-13-37-21-11-15(35… | GHBOEFUAGSHXPO-XZOTUCIWSA-N | CHEMBL4302 | P-glycoprotein 1 | P08183 | ABCB1 |
CHEMBL1 | COc1ccc2c(c1)OC[C@H]1[C@@H]2C2=C(OC1(C)C)C1=C(… | (5S,14R,19S,28R)-10,23-dimethoxy-4,4,29,29-tet… | CLD0 | InChI=1S/C32H32O8/c1-31(2)19-13-37-21-11-15(35… | GHBOEFUAGSHXPO-XZOTUCIWSA-N | CHEMBL5393 | ATP-binding cassette sub-family G member 2 | Q9UNQ0 | ABCG2 |
CHEMBL10 | C[S+]([O-])c1ccc(-c2nc(-c3ccc(F)cc3)c(-c3ccncc… | 1-(4-(4-(4-fluorophenyl)-5-(pyridin-4-yl)-1H-i… | CLD0 | InChI=1S/C21H16FN3OS/c1-27(26)18-8-4-16(5-9-18… | CDMGBJANTYXAIV-UHFFFAOYSA-N | CHEMBL289 | Cytochrome P450 2D6 | P10635 | CYP2D6 |
CHEMBL10 | C[S+]([O-])c1ccc(-c2nc(-c3ccc(F)cc3)c(-c3ccncc… | 4-(2-(4-(methylsulfinyl)phenyl)-4-phenyl-1H-im… | CLD0 | InChI=1S/C21H16FN3OS/c1-27(26)18-8-4-16(5-9-18… | CDMGBJANTYXAIV-UHFFFAOYSA-N | CHEMBL2094115 | MAP kinase p38 | O15264 | MAPK13 |
pickleで保存した結果は以下のようにロードします。
with open(f'{TEMP_DIR}/pathwayTerm_to_symbols.pkl', 'rb') as tf: ptm_syms = pickle.load(tf)
7. まとめ
本記事ではChEMBLのデータベースをダウンロードし、DockerにてPostgreSQLの環境を構築して標的タンパクをSQLで検索・保存し、Pythonで読み込める状態にしました。
コメント