Snowflake Knowledge - INSIGHT LAB

【Streamlit実践】化合物データを可視化 - 簡単・自在にカスタムできる!

作成者: neco|2024年5月22日

はじめに

Streamlitは、データ可視化のウェブアプリを簡単に作成・共有するためのオープンソースのPythonライブラリです。

Snowflake上にも作成することができるため、Snowflakeのデータを可視化するために今後利用が増えていくことが考えられます。※詳しくは、Streamlit in Snowflakeドキュメントを参照して下さい。

そこで今回、Streamlitの利便性を示すために、薬学専攻の筆者が自分で使用してみたいと考える化合物データやタンパク質構造の可視化ツールを作成しました。

注:Snowflakeは使用していません。以下紹介する内容Snowflakeでそのまま実装できるわけではありません。

準備

以下の必要なPythonパッケージをインストールしましょう。

  • streamlit:streamlitのパッケージ
  • rdkit:化合物データ処理用パッケージ
  • pubchempy:PubChemからデータを取得するためのパッケージ
  • stmol:Streamlitで化合物画像を描出するためのコンポーネント(タンパク質も可視化できる)。注)たくさんの依存対象のパッケージのインストールも必要になります。仮想環境作成を推奨します。
  • py3Dmol:3Dで化合物を描出するためのパッケージ

詳細

以下、作成したコードです。適当なファイル名(○○.py)で保存しましょう。

import streamlit as st
from rdkit import Chem
from rdkit.Chem import AllChem
from rdkit.Chem import Draw
import pubchempy as pcp
import pandas as pd
from stmol import showmol
import py3Dmol

st.subheader("**Input compound's name or PDB ID.**")

# ラジオボタン
select = st.radio("Compound's name or PDB ID ?", ["Compound's name", "PDB ID"])

# 入力フォーム
with st.form('my_form'):
    input = st.text_input('Input ' + select + '.')
    submitted = st.form_submit_button('Submit')

           

# 化合物(3次元)を取得するための関数
def get_optimized_3Dmol(cmp_name: str):
    
        raw_sdf = pcp.get_sdf(cmp_name, 'name')
        mol = Chem.MolFromMolBlock(raw_sdf)
        Chem.AddHs(mol, addCoords=True)
        AllChem.EmbedMolecule(mol, AllChem.ETKDG())
        AllChem.MMFFOptimizeMoleculeConfs(mol)
        Draw.MolsToGridImage([mol])
        target_sdf = Chem.MolToMolBlock(mol)

        view = py3Dmol.view(data=target_sdf)
        view.setStyle({'stick': {}})

        return view

           

# submitボタンによる処理
if submitted:
    try:
        if select == "Compound's name":
           
            properties = ['iupacname', 'molecularformula', 'molecularweight', 'XLogP', 'exactmass', 'TPSA', 'IsomericSMILES']
            # 化合物データの取得
            df = pcp.get_properties(properties, input, 'name', as_dataframe=True)


            # 化合物(2次元)の描出
            cmp_smiles = Chem.MolFromSmiles(df['IsomericSMILES'].values[0])
            img = Draw.MolsToGridImage([cmp_smiles])
            st.image(img)


            # 化合物データ表の表示
            st.write(df[['IUPACName', 'MolecularFormula', 'MolecularWeight','ExactMass' , 'XLogP', 'TPSA']])

            # 化合物(3次元)の描出
            view = get_optimized_3Dmol(input)        
            showmol(view, height=500, width=800)


         # タンパク質構造の描出
        elif select == "PDB ID":
            view = py3Dmol.view(query='pdb:' + input) 
            view.setStyle({'cartoon':{'color':'spectrum'}})
            showmol(view, height=500,width=800)

    except:
        st.write("Invalid input.")
    
    finally:
        submitted = False

else:
    st.write("Input and submit.")

実行結果

streamlit run ○○.pyをCLIで実行すると以下の画面がブラウザに表示されます。

  • 初期画面
  • 化合物名を入力してSubmitすると以下の画面になります。平坦な化合物構造式、化合物物性値、化合物3D構造が表示されます。
  • 化合物3D構造はドラッグすると角度や大きさが変わります。↓はドラッグした結果。
  • 以下のようにPDB(Protein Data Bank)IDを入力すると入力したタンパク質の3D構造が表示されます。
  • こちらもドラッグすると角度や大きさが変わります。↓はドラッグした結果。

このように、可視化したいデータを選んでアプリにできます!

Streamlit in Snowflakeでの制約(2024/05/21時点)

特筆すべき制約として以下があります。

  • 使用できるPythonパッケージは、Snowflake Anaconda Channelに記載されているリストのものになります。上記ではRDKitは含まれますが、pubchempy、py3Dmolなどは含まれません。
  • カスタムコンポーネントははサポートされていません。
  • 外部 API にアクセスできません。

その他の制約も含めて詳細が制限とサポートされていない機能に記載されています。

おわりに

  • 簡単に少ないコードで表示したいデータを可視化できました。
  • 表示したいデータをカスタマイズでき、便利だと思いました。
  • Snowflakeのデータと組み合わせれば、簡単にデータの可視化と共有が可能となり、迅速なデータ利用が可能になると考えています。