根据上一篇博客安装好dgl:计算生物学习——Code_创建异构图_①安装dgl-CSDN博客
一. 读取数据集
import torch as th
print(th.__version__)
import pandas as pd
import dgl
print(dgl.__version__)
# 1. 读取数据集_路径根据实际情况替换
dti_path = '/home/embark/rain/H/BindingDB_all.csv'
ddi_path = '/home/embark/rain/H/drugbank_ddi.csv'
ppi_path = '/home/embark/rain/wenxue/H/HuRI_ppi.csv'
dti_data = pd.read_csv(dti_path)
ddi_data = pd.read_csv(ddi_path)
ppi_data = pd.read_csv(ppi_path)
# 打印数据集的前几行以确认读取成功
print("DTI Data:")
print(dti_data.head())
print("\nDDI Data:")
print(ddi_data.head())
print("\nPPI Data:")
print(ppi_data.head())
结果如下:
二. 转换ID列
将ID列转换为类别型数据并将类别转换为数值编码的作用是将原本可能是字符串类型的ID(如Drug_ID
、Target_ID
等)转换成数值类型。这样做的目的是便于后续在图计算中处理这些ID,因为大多数图计算库(包括DGL)要求节点和边的ID是数值类型。
-
类别型数据转换:
astype('category')
:将ID列转换为类别型数据(category
)。cat.codes
:将类别型数据的每个唯一值映射为一个整数代码。这些整数代码是连续的,从0开始,每个唯一值对应一个唯一的整数代码。
-
保持相同ID的一致性:
- 同一个ID(例如,同一个
Drug_ID
或Protein_ID
)会被转换成相同的整数代码。这确保了在不同的数据集中(如DTI和PPI数据集中)出现的相同ID会被映射成相同的整数值。
- 同一个ID(例如,同一个
# 将ID列转换为类别型,然后转换为数值型
dti_data['Drug_ID'] = dti_data['Drug_ID'].astype('category').cat.codes
dti_data['Target_ID'] = dti_data['Target_ID'].astype('category').cat.codes
ddi_data['Drug1_ID'] = ddi_data['Drug1_ID'].astype('category').cat.codes
ddi_data['Drug2_ID'] = ddi_data['Drug2_ID'].astype('category').cat.codes
ppi_data['Protein1_ID'] = ppi_data['Protein1_ID'].astype('category').cat.codes
ppi_data['Protein2_ID'] = ppi_data['Protein2_ID'].astype('category').cat.codes
三. 创建异构图的边数据
# 创建异构图的边数据
graph_data = {
('drug', 'interacts_with', 'protein'): (th.tensor(dti_data['Drug_ID'].values, dtype=th.long), th.tensor(dti_data['Target_ID'].values, dtype=th.long)),
('drug', 'interacts_with', 'drug'): (th.tensor(ddi_data['Drug1_ID'].values, dtype=th.long), th.tensor(ddi_data['Drug2_ID'].values, dtype=th.long)),
('protein', 'interacts_with', 'protein'): (th.tensor(ppi_data['Protein1_ID'].values, dtype=th.long), th.tensor(ppi_data['Protein2_ID'].values, dtype=th.long))
}
四. 创建异构图
# 创建DGL异构图
hetero_graph = dgl.heterograph(graph_data)
# 打印异构图的信息
print(hetero_graph)
# 打印节点和边类型信息
print("Node types:", hetero_graph.ntypes)
print("Edge types:", hetero_graph.etypes)
print(hetero_graph)
Graph(num_nodes={'drug': 10636, 'protein': 6454},
num_edges={('drug', 'interacts_with', 'drug'): 191808, ('drug', 'interacts_with', 'protein'): 52274, ('protein', 'interacts_with', 'protein'): 52369},
metagraph=[('drug', 'drug', 'interacts_with'), ('drug', 'protein', 'interacts_with'), ('protein', 'protein', 'interacts_with')])
1. num_nodes
:
每种类型的节点的数量。
drug
: 10636个药物节点protein
: 6454个蛋白节点
2. num_edges
:每种类型的边的数量。每种边类型由三元组(源节点类型,边类型,目标节点类型)表示。
('drug', 'interacts_with', 'drug')
: 药物-药物之间的边有191808条。('drug', 'interacts_with', 'protein')
: 药物-蛋白之间的边有52274条。('protein', 'interacts_with', 'protein')
: 蛋白-蛋白之间的边有52369条。
3. metagraph
:节点类型和边类型之间的关系。
('drug', 'drug', 'interacts_with')
: 表示drug
节点之间存在interacts_with
关系。('drug', 'protein', 'interacts_with')
: 表示drug
节点与protein
节点之间存在interacts_with
关系。('protein', 'protein', 'interacts_with')
: 表示protein
节点之间存在interacts_with
关系。