生物医学网络科学Biomedical Network Science
网络分析流程与 NetworkX 实践04 / 16

数据读写与格式转换

阅读
约 5 分钟

生物医学网络数据以多种形式出现:数据库导出的边表(STRING、BioGRID、TRRUST)、实验或影像处理流程输出的连接矩阵(脑网络)、桌面软件保存的 GraphML/GEXF 文件、网页可视化使用的 JSON。正确地在这些表示之间转换,是保证后续计算正确的前提。

常见格式

格式 内容 能否保存孤立点 能否保存节点/边属性 NetworkX 读 / 写 适用场合
边表(edge list,CSV/TSV) 每行一条边,可带权重列 否(需另附节点表) 边属性可作为列;节点属性需另表 read_edgelist / write_edgelist;from_pandas_edgelist / to_pandas_edgelist 数据库导出、最通用的交换格式
邻接表(adjacency list) 每行一个节点及其全部邻居 是 否 read_adjlist / write_adjlist 简单无权图
邻接矩阵 N×NN\times N 数组 是 只有一个边权;节点身份靠行列顺序 from_numpy_array / to_numpy_array 脑连接矩阵、相关矩阵、线性代数计算
稀疏矩阵(SciPy CSR/COO) 只存非零元 是 同上 from_scipy_sparse_array / to_scipy_sparse_array 大规模网络的矩阵运算
GraphML XML,带类型声明 是 是(标量属性) read_graphml / write_graphml 与 Cytoscape、Gephi、igraph、graph-tool 交换
GEXF XML,Gephi 原生格式,可含动态信息 是 是 read_gexf / write_gexf 导入 Gephi 作图
GML 文本,层级键值 是 是 read_gml / write_gml 一些经典数据集的发布格式
node-link JSON 节点列表 + 边列表 是 是(可 JSON 化的任意属性) node_link_data / node_link_graph 网页可视化(D3.js 等)、Web API
Cytoscape JSON Cytoscape.js 使用的结构 是 是 cytoscape_data / cytoscape_graph 与 Cytoscape.js / Cytoscape 交换

与 pandas、NumPy、SciPy 互转

读写中的细节

  1. 标识符:STRING 的蛋白标识形如“物种编号.Ensembl 蛋白 ID”(人类为 9606.ENSP…),需要映射为基因名才能与其他数据对接;映射常是一对多或多对一,要写明规则并报告映射失败的数目。
  2. 数据类型:从 GraphML 读回时节点 id 一律是字符串,原来的整数节点 1 会变成 "1";与其他数据合并前要统一类型。GraphML 只支持标量属性,列表类属性(例如一个基因所属的多个通路)需要先转成分隔符字符串或改用 JSON。
  3. 方向与重复:同一条无向边在边表中可能出现两次(A–B 与 B–A),读入 nx.Graph 会自动合并,读入 nx.DiGraph 则成为两条有向边;STRING 的完整下载文件中每对蛋白就是双向各列一次。
  4. 孤立点:边表天然不含孤立点。若研究问题涉及“某些基因在网络中没有任何连接”(例如疾病基因的网络覆盖率),需要另外维护节点全集。

格式转换后要做往返检查:节点数、边数、权重总和、若干条具体边的属性是否与原始数据一致。代码示例“格式互转”把同一个小网络依次转为边表、稠密矩阵、CSR 稀疏矩阵、GraphML 与 node-link JSON,结果显示:边表往返后孤立点丢失(6 个节点变成 5 个),其余表示保留了全部节点和边;含列表的节点属性写 GraphML 时报错,转为字符串后才能写入。