Source code for graphein.ppi.edges
"""Functions for adding edges to a PPI Graph from parsed STRING & BIOGRID API call outputs."""
# %%
# Graphein
# Author: Arian Jamasb <arian@jamasb.io>, Ramon Vinas
# License: MIT
# Project Website: https://github.com/a-r-j/graphein
# Code Repository: https://github.com/a-r-j/graphein
import logging
import networkx as nx
import pandas as pd
from graphein.ppi.parse_biogrid import BIOGRID_df
from graphein.ppi.parse_stringdb import STRING_df
log = logging.getLogger(__name__)
[docs]def add_string_edges(G: nx.Graph, **kwargs) -> nx.Graph:
"""
Adds edges from STRING PPI database (https://string-db.org/) to a PPI Graph.
:param G: Graph to edges to (populated with ``protein_id`` nodes).
:type G: nx.Graph
:param kwargs: Additional parameters to pass to STRING API calls.
:return: PPI Graph with STRING interactions added as edges.
:rtype: nx.Graph
"""
G.graph["sources"].append("string")
G.graph["string_df"] = STRING_df(
G.graph["protein_list"],
ncbi_taxon_id=G.graph["ncbi_taxon_id"],
kwargs=kwargs,
)
add_interacting_proteins(G, df=G.graph["string_df"], kind="string")
return G
[docs]def add_biogrid_edges(G: nx.Graph, **kwargs) -> nx.Graph:
"""
Adds edges from the BIOGRID database (https://thebiogrid.org/) to PPI Graph.
:param G: Graph to edges to (populated with ``protein_id`` nodes).
:type G: nx.Graph
:param kwargs: Additional parameters to pass to BIOGRID API calls.
:return: nx.Graph PPIGraph with BIOGRID interactions added as edges.
:rtype: nx.Graph
"""
G.graph["sources"].append("biogrid")
G.graph["biogrid_df"] = BIOGRID_df(
G.graph["protein_list"],
ncbi_taxon_id=G.graph["ncbi_taxon_id"],
kwargs=kwargs,
)
add_interacting_proteins(G, df=G.graph["biogrid_df"], kind="biogrid")
return G
[docs]def add_interacting_proteins(
G: nx.Graph, df: pd.DataFrame, kind: str
) -> nx.Graph:
"""
Generic function for adding interaction edges to PPI Graph.
You can use this function to additional interactions using a dataframe with columns ``"p1"`` and ``"p2"``.
:param G: PPI Graph to populate with edges.
:type G: nx.Graph
:param df: Dataframe containing edgelist.
:type df: pd.DataFrame
:param kind: name of interaction type.
:type kind: str
:returns: PPI Graph with pre-computed edges added.
:rtype: nx.Graph
"""
protein_1 = df["p1"].values
protein_2 = df["p2"].values
interacting_proteins = set(list(zip(protein_1, protein_2)))
for p1, p2 in interacting_proteins:
if G.has_edge(p1, p2):
G.edges[p1, p2]["kind"].add(kind)
else:
G.add_edge(p1, p2, kind={kind})
log.debug(f"Added {len(df)} {kind} interaction edges")
return G