【ChEMBL】化合物の標的タンパクを調べる

pandas

本記事では化合物の標的タンパクを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_idcanonical_smilescompound_namecidinchiinchi_keytarget_chembl_idtarget_nameuniprot_id
CHEMBL1COc1ccc2c(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…CLD0InChI=1S/C32H32O8/c1-31(2)19-13-37-21-11-15(35…GHBOEFUAGSHXPO-XZOTUCIWSA-NCHEMBL3004Multidrug resistance-associated protein 1P33527
CHEMBL1COc1ccc2c(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…CLD0InChI=1S/C32H32O8/c1-31(2)19-13-37-21-11-15(35…GHBOEFUAGSHXPO-XZOTUCIWSA-NCHEMBL4302P-glycoprotein 1P08183
CHEMBL1COc1ccc2c(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…CLD0InChI=1S/C32H32O8/c1-31(2)19-13-37-21-11-15(35…GHBOEFUAGSHXPO-XZOTUCIWSA-NCHEMBL5393ATP-binding cassette sub-family G member 2Q9UNQ0
CHEMBL10C[S+]([O-])c1ccc(-c2nc(-c3ccc(F)cc3)c(-c3ccncc…1-(4-(4-(4-fluorophenyl)-5-(pyridin-4-yl)-1H-i…CLD0InChI=1S/C21H16FN3OS/c1-27(26)18-8-4-16(5-9-18…CDMGBJANTYXAIV-UHFFFAOYSA-NCHEMBL289Cytochrome P450 2D6P10635
CHEMBL10C[S+]([O-])c1ccc(-c2nc(-c3ccc(F)cc3)c(-c3ccncc…4-(2-(4-(methylsulfinyl)phenyl)-4-phenyl-1H-im…CLD0InChI=1S/C21H16FN3OS/c1-27(26)18-8-4-16(5-9-18…CDMGBJANTYXAIV-UHFFFAOYSA-NCHEMBL2094115MAP kinase p38O15264

約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_idcanonical_smilescompound_namecidinchiinchi_keytarget_chembl_idtarget_nameuniprot_idsymbol
CHEMBL1COc1ccc2c(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…CLD0InChI=1S/C32H32O8/c1-31(2)19-13-37-21-11-15(35…GHBOEFUAGSHXPO-XZOTUCIWSA-NCHEMBL3004Multidrug resistance-associated protein 1P33527ABCC1
CHEMBL1COc1ccc2c(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…CLD0InChI=1S/C32H32O8/c1-31(2)19-13-37-21-11-15(35…GHBOEFUAGSHXPO-XZOTUCIWSA-NCHEMBL4302P-glycoprotein 1P08183ABCB1
CHEMBL1COc1ccc2c(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…CLD0InChI=1S/C32H32O8/c1-31(2)19-13-37-21-11-15(35…GHBOEFUAGSHXPO-XZOTUCIWSA-NCHEMBL5393ATP-binding cassette sub-family G member 2Q9UNQ0ABCG2
CHEMBL10C[S+]([O-])c1ccc(-c2nc(-c3ccc(F)cc3)c(-c3ccncc…1-(4-(4-(4-fluorophenyl)-5-(pyridin-4-yl)-1H-i…CLD0InChI=1S/C21H16FN3OS/c1-27(26)18-8-4-16(5-9-18…CDMGBJANTYXAIV-UHFFFAOYSA-NCHEMBL289Cytochrome P450 2D6P10635CYP2D6
CHEMBL10C[S+]([O-])c1ccc(-c2nc(-c3ccc(F)cc3)c(-c3ccncc…4-(2-(4-(methylsulfinyl)phenyl)-4-phenyl-1H-im…CLD0InChI=1S/C21H16FN3OS/c1-27(26)18-8-4-16(5-9-18…CDMGBJANTYXAIV-UHFFFAOYSA-NCHEMBL2094115MAP kinase p38O15264MAPK13

pickleで保存した結果は以下のようにロードします。

with open(f'{TEMP_DIR}/pathwayTerm_to_symbols.pkl', 'rb') as tf:
    ptm_syms = pickle.load(tf)

7. まとめ

本記事ではChEMBLのデータベースをダウンロードし、DockerにてPostgreSQLの環境を構築して標的タンパクをSQLで検索・保存し、Pythonで読み込める状態にしました。

コメント