{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Integrate resources to create a drug repurposing hetnet"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import pandas\n",
"import seaborn\n",
"\n",
"import hetio.hetnet\n",
"import hetio.readwrite\n",
"import hetio.stats\n",
"\n",
"from utils import rawgit, obo_iri"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"## Define the metagraph and instantiate the graph"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"kind_to_abbev = {\n",
" \n",
" # metanodes\n",
" 'Compound': 'C',\n",
" 'Disease': 'D',\n",
" 'Gene': 'G',\n",
" 'Anatomy': 'A',\n",
" 'Symptom': 'S',\n",
" 'Side Effect': 'SE',\n",
" 'Pathway': 'PW',\n",
" 'Pharmacologic Class': 'PC',\n",
" 'Biological Process': 'BP',\n",
" 'Cellular Component': 'CC',\n",
" 'Molecular Function': 'MF',\n",
" \n",
" # metaedges\n",
" 'treats': 't',\n",
" 'palliates': 'p',\n",
" 'binds': 'b',\n",
" 'expresses': 'e',\n",
" 'regulates': 'r',\n",
" 'upregulates': 'u',\n",
" 'downregulates': 'd',\n",
" 'interacts': 'i',\n",
" 'includes': 'i',\n",
" 'covaries': 'c',\n",
" 'regulates': 'r',\n",
" 'participates': 'p',\n",
" 'resembles': 'r',\n",
" 'associates': 'a',\n",
" 'localizes': 'l',\n",
" 'presents': 'p',\n",
" 'causes': 'c',\n",
"}\n",
"\n",
"metaedge_tuples = [\n",
" ('Compound', 'Disease', 'treats', 'both'),\n",
" ('Compound', 'Disease', 'palliates', 'both'),\n",
" ('Compound', 'Gene', 'binds', 'both'),\n",
" ('Compound', 'Gene', 'upregulates', 'both'),\n",
" ('Compound', 'Gene', 'downregulates', 'both'),\n",
" ('Compound', 'Compound', 'resembles', 'both'),\n",
" ('Compound', 'Side Effect', 'causes', 'both'),\n",
" ('Pharmacologic Class', 'Compound', 'includes', 'both'),\n",
" ('Anatomy', 'Gene', 'expresses', 'both'),\n",
" ('Anatomy', 'Gene', 'upregulates', 'both'),\n",
" ('Anatomy', 'Gene', 'downregulates', 'both'),\n",
" ('Gene', 'Gene', 'interacts', 'both'),\n",
" ('Gene', 'Gene', 'covaries', 'both'),\n",
" ('Gene', 'Gene', 'regulates', 'forward'),\n",
" ('Gene', 'Pathway', 'participates', 'both'),\n",
" ('Gene', 'Biological Process', 'participates', 'both'),\n",
" ('Gene', 'Cellular Component', 'participates', 'both'),\n",
" ('Gene', 'Molecular Function', 'participates', 'both'),\n",
" ('Disease', 'Disease', 'resembles', 'both'),\n",
" ('Disease', 'Gene', 'associates', 'both'),\n",
" ('Disease', 'Gene', 'upregulates', 'both'),\n",
" ('Disease', 'Gene', 'downregulates', 'both'),\n",
" ('Disease', 'Anatomy', 'localizes', 'both'),\n",
" ('Disease', 'Symptom', 'presents', 'both'),\n",
"]\n",
"metagraph = hetio.hetnet.MetaGraph.from_edge_tuples(metaedge_tuples, kind_to_abbev)\n",
"graph = hetio.hetnet.Graph(metagraph)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Gene Nodes"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"
\n",
" \n",
" \n",
" | \n",
" tax_id | \n",
" GeneID | \n",
" Symbol | \n",
" chromosome | \n",
" map_location | \n",
" type_of_gene | \n",
" description | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 9606 | \n",
" 1 | \n",
" A1BG | \n",
" 19 | \n",
" 19q13.4 | \n",
" protein-coding | \n",
" alpha-1-B glycoprotein | \n",
"
\n",
" \n",
" 1 | \n",
" 9606 | \n",
" 2 | \n",
" A2M | \n",
" 12 | \n",
" 12p13.31 | \n",
" protein-coding | \n",
" alpha-2-macroglobulin | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" tax_id GeneID Symbol chromosome map_location type_of_gene \\\n",
"0 9606 1 A1BG 19 19q13.4 protein-coding \n",
"1 9606 2 A2M 12 12p13.31 protein-coding \n",
"\n",
" description \n",
"0 alpha-1-B glycoprotein \n",
"1 alpha-2-macroglobulin "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commit = 'a7362748a34211e5df6f2d185bb3246279760546'\n",
"url = rawgit('dhimmel', 'entrez-gene', commit, 'data/genes-human.tsv')\n",
"gene_df = pandas.read_table(url)\n",
"gene_df = gene_df[gene_df.type_of_gene == 'protein-coding']\n",
"coding_genes = set(gene_df.GeneID)\n",
"gene_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for i, row in gene_df.iterrows():\n",
" if row.type_of_gene != 'protein-coding':\n",
" continue\n",
" data = {\n",
" 'description': row['description'],\n",
" 'source': 'Entrez Gene',\n",
" 'url': 'http://identifiers.org/ncbigene/{}'.format(row.GeneID),\n",
" 'license': 'CC0 1.0',\n",
" }\n",
" if pandas.notnull(row['chromosome']):\n",
" data['chromosome'] = row['chromosome']\n",
" graph.add_node(kind = 'Gene', identifier=row.GeneID, name=row.Symbol, data=data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Disease Nodes"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" doid | \n",
" name | \n",
" source | \n",
" pathophysiology | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" DOID:2531 | \n",
" hematologic cancer | \n",
" DOcancerslim | \n",
" neoplastic | \n",
"
\n",
" \n",
" 1 | \n",
" DOID:1319 | \n",
" brain cancer | \n",
" DOcancerslim | \n",
" neoplastic | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" doid name source pathophysiology\n",
"0 DOID:2531 hematologic cancer DOcancerslim neoplastic\n",
"1 DOID:1319 brain cancer DOcancerslim neoplastic"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commit = '75050ea2d4f60e745d3f3578ae03560a2cc0e444'\n",
"url = rawgit('dhimmel', 'disease-ontology', commit, 'data/slim-terms.tsv')\n",
"disease_df = pandas.read_table(url)\n",
"disease_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for i, row in disease_df.iterrows():\n",
" data = {\n",
" 'source': 'Disease Ontology',\n",
" 'url': obo_iri(row.doid),\n",
" 'license': 'CC BY 3.0',\n",
" }\n",
" graph.add_node(kind='Disease', identifier=row.doid, name=row['name'], data=data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Compound Nodes"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" drugbank_id | \n",
" name | \n",
" type | \n",
" groups | \n",
" atc_codes | \n",
" categories | \n",
" inchikey | \n",
" inchi | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" DB00014 | \n",
" Goserelin | \n",
" small molecule | \n",
" approved | \n",
" L02AE03 | \n",
" NaN | \n",
" InChIKey=BLCLNMBMMGCOAS-URPVMXJPSA-N | \n",
" InChI=1S/C59H84N18O14/c1-31(2)22-40(49(82)68-3... | \n",
"
\n",
" \n",
" 1 | \n",
" DB00035 | \n",
" Desmopressin | \n",
" small molecule | \n",
" approved | \n",
" H01BA02 | \n",
" Antidiuretic Agents|Hemostatics|Renal Agents | \n",
" InChIKey=NFLWUMRGJYTJIN-NXBWRCJVSA-N | \n",
" InChI=1S/C46H64N14O12S2/c47-35(62)15-14-29-40(... | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" drugbank_id name type groups atc_codes \\\n",
"0 DB00014 Goserelin small molecule approved L02AE03 \n",
"1 DB00035 Desmopressin small molecule approved H01BA02 \n",
"\n",
" categories \\\n",
"0 NaN \n",
"1 Antidiuretic Agents|Hemostatics|Renal Agents \n",
"\n",
" inchikey \\\n",
"0 InChIKey=BLCLNMBMMGCOAS-URPVMXJPSA-N \n",
"1 InChIKey=NFLWUMRGJYTJIN-NXBWRCJVSA-N \n",
"\n",
" inchi \n",
"0 InChI=1S/C59H84N18O14/c1-31(2)22-40(49(82)68-3... \n",
"1 InChI=1S/C46H64N14O12S2/c47-35(62)15-14-29-40(... "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commit = '3e87872db5fca5ac427ce27464ab945c0ceb4ec6'\n",
"url = rawgit('dhimmel', 'drugbank', commit, 'data/drugbank-slim.tsv')\n",
"compound_df = pandas.read_table(url)\n",
"compound_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for i, row in compound_df.iterrows():\n",
" url = 'http://www.drugbank.ca/drugs/' + row.drugbank_id\n",
" data = {\n",
" 'source': 'DrugBank',\n",
" 'inchikey': row.inchikey,\n",
" 'inchi': row.inchi, 'url': url,\n",
" 'license': 'CC BY-NC 4.0',\n",
" }\n",
" graph.add_node(kind='Compound', identifier=row.drugbank_id, name=row['name'], data=data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Anotomy nodes"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" uberon_id | \n",
" uberon_name | \n",
" mesh_id | \n",
" mesh_name | \n",
" bto_id | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" UBERON:0000002 | \n",
" uterine cervix | \n",
" D002584 | \n",
" Cervix Uteri | \n",
" BTO:0001421 | \n",
"
\n",
" \n",
" 1 | \n",
" UBERON:0000004 | \n",
" nose | \n",
" D009666 | \n",
" Nose | \n",
" BTO:0000840 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" uberon_id uberon_name mesh_id mesh_name bto_id\n",
"0 UBERON:0000002 uterine cervix D002584 Cervix Uteri BTO:0001421\n",
"1 UBERON:0000004 nose D009666 Nose BTO:0000840"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commit = '134f23479186abba03ba340fc6dc90e16c781920'\n",
"url = rawgit('dhimmel', 'uberon', commit, 'data/hetio-slim.tsv')\n",
"uberon_df = pandas.read_table(url)\n",
"uberon_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"for i, row in uberon_df.iterrows():\n",
" data = {\n",
" 'source': 'Uberon',\n",
" 'url': obo_iri(row['uberon_id']),\n",
" 'license': 'CC BY 3.0',\n",
" }\n",
" for xref in 'mesh_id', 'bto_id':\n",
" if pandas.notnull(row[xref]):\n",
" data[xref] = row[xref]\n",
" graph.add_node(kind='Anatomy', identifier=row['uberon_id'], name=row['uberon_name'], data=data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Symptom Nodes"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" mesh_id | \n",
" mesh_name | \n",
" in_hsdn | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" D000006 | \n",
" Abdomen, Acute | \n",
" 1 | \n",
"
\n",
" \n",
" 1 | \n",
" D000270 | \n",
" Adie Syndrome | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" mesh_id mesh_name in_hsdn\n",
"0 D000006 Abdomen, Acute 1\n",
"1 D000270 Adie Syndrome 0"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commit = 'a7036a37302973b15ab949aab4056d9bc062910e'\n",
"url = rawgit('dhimmel', 'mesh', commit, 'data/symptoms.tsv')\n",
"symptom_df = pandas.read_table(url)\n",
"symptom_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"for i, row in symptom_df.iterrows():\n",
" url = 'http://identifiers.org/mesh/{}'.format(row.mesh_id)\n",
" data = {\n",
" 'source': 'MeSH',\n",
" 'url': url,\n",
" 'license': 'CC0 1.0',\n",
" }\n",
" graph.add_node(kind='Symptom', identifier=row.mesh_id, name=row.mesh_name, data=data)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"## Pathway Nodes and Edges"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" identifier | \n",
" name | \n",
" url | \n",
" n_genes | \n",
" n_coding_genes | \n",
" source | \n",
" license | \n",
" genes | \n",
" coding_genes | \n",
"
\n",
" \n",
" \n",
" \n",
" 1860 | \n",
" WP80_r68938 | \n",
" Nucleotide GPCRs | \n",
" http://www.wikipathways.org/instance/WP80_r68938 | \n",
" 11 | \n",
" 11 | \n",
" WikiPathways | \n",
" CC BY 3.0 | \n",
" 10161|1241|134|135|136|140|2846|5028|5029|5030... | \n",
" 10161|1241|134|135|136|140|2846|5028|5029|5030... | \n",
"
\n",
" \n",
" 1861 | \n",
" WP98_r72088 | \n",
" Prostaglandin Synthesis and Regulation | \n",
" http://www.wikipathways.org/instance/WP98_r72088 | \n",
" 30 | \n",
" 30 | \n",
" WikiPathways | \n",
" CC BY 3.0 | \n",
" 1583|1906|1909|1910|301|302|306|307|308|309|32... | \n",
" 1583|1906|1909|1910|301|302|306|307|308|309|32... | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" identifier name \\\n",
"1860 WP80_r68938 Nucleotide GPCRs \n",
"1861 WP98_r72088 Prostaglandin Synthesis and Regulation \n",
"\n",
" url n_genes \\\n",
"1860 http://www.wikipathways.org/instance/WP80_r68938 11 \n",
"1861 http://www.wikipathways.org/instance/WP98_r72088 30 \n",
"\n",
" n_coding_genes source license \\\n",
"1860 11 WikiPathways CC BY 3.0 \n",
"1861 30 WikiPathways CC BY 3.0 \n",
"\n",
" genes \\\n",
"1860 10161|1241|134|135|136|140|2846|5028|5029|5030... \n",
"1861 1583|1906|1909|1910|301|302|306|307|308|309|32... \n",
"\n",
" coding_genes \n",
"1860 10161|1241|134|135|136|140|2846|5028|5029|5030... \n",
"1861 1583|1906|1909|1910|301|302|306|307|308|309|32... "
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commit = '1bd2c68853e38297d20f8f885419ff81fc0608a8'\n",
"url = rawgit('dhimmel', 'pathways', commit, 'data/pathways.tsv')\n",
"pathway_df = pandas.read_table(url)\n",
"pathway_df = pathway_df.query(\"n_coding_genes > 1\")\n",
"source_map = {\n",
" 'wikipathways': 'WikiPathways',\n",
" 'reactome': 'Reactome via Pathway Commons',\n",
" 'pid': 'PID via Pathway Commons',\n",
"}\n",
"pathway_df.source = pathway_df.source.map(source_map)\n",
"pathway_df.tail(2)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for i, row in pathway_df.iterrows():\n",
" pathway_id = row.identifier\n",
" data = {'license': row.license, 'source': row.source}\n",
" if pandas.notnull(row.url):\n",
" data['url'] = row.url\n",
" graph.add_node(kind='Pathway', identifier=pathway_id, name=row['name'], data=data)\n",
" for gene in row.coding_genes.split('|'):\n",
" gene = int(gene)\n",
" source_id = 'Gene', gene\n",
" target_id = 'Pathway', pathway_id\n",
" edge_data = data.copy()\n",
" edge_data['unbiased'] = False\n",
" graph.add_edge(source_id, target_id, 'participates', 'both', edge_data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pharmacologic Classes"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" class_id | \n",
" class_name | \n",
" class_source | \n",
" class_type | \n",
" url | \n",
"
\n",
" \n",
" \n",
" \n",
" 240 | \n",
" N0000005760 | \n",
" Aminosalicylic Acids | \n",
" FDA | \n",
" Chemical/Ingredient | \n",
" http://purl.bioontology.org/ontology/NDFRT/N00... | \n",
"
\n",
" \n",
" 241 | \n",
" N0000005934 | \n",
" Progesterone | \n",
" FDA | \n",
" Chemical/Ingredient | \n",
" http://purl.bioontology.org/ontology/NDFRT/N00... | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" class_id class_name class_source class_type \\\n",
"240 N0000005760 Aminosalicylic Acids FDA Chemical/Ingredient \n",
"241 N0000005934 Progesterone FDA Chemical/Ingredient \n",
"\n",
" url \n",
"240 http://purl.bioontology.org/ontology/NDFRT/N00... \n",
"241 http://purl.bioontology.org/ontology/NDFRT/N00... "
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commit = '0e085ddb6aa42be367c85eba424edea716bebd94'\n",
"url = rawgit('dhimmel', 'drugcentral', commit, 'rephetio/classes.tsv')\n",
"class_df = pandas.read_table(url)\n",
"class_types = {'Physiologic Effect', 'Mechanism of Action', 'Chemical/Ingredient'}\n",
"class_df = class_df.query(\"class_type in @class_types\")\n",
"class_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for row in class_df.itertuples():\n",
" data = {\n",
" 'source': '{} via DrugCentral'.format(row.class_source),\n",
" 'class_type': row.class_type,\n",
" 'license': 'CC BY 4.0',\n",
" 'url': row.url,\n",
" }\n",
" graph.add_node(kind='Pharmacologic Class', identifier=row.class_id, name=row.class_name, data=data)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" drugbank_id | \n",
" drugbank_name | \n",
" class_id | \n",
" class_name | \n",
"
\n",
" \n",
" \n",
" \n",
" 1 | \n",
" DB00014 | \n",
" Goserelin | \n",
" N0000175654 | \n",
" Gonadotropin Releasing Hormone Receptor Agonists | \n",
"
\n",
" \n",
" 5 | \n",
" DB00035 | \n",
" Desmopressin | \n",
" N0000175914 | \n",
" Increased Coagulation Factor VIII Activity | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" drugbank_id drugbank_name class_id \\\n",
"1 DB00014 Goserelin N0000175654 \n",
"5 DB00035 Desmopressin N0000175914 \n",
"\n",
" class_name \n",
"1 Gonadotropin Releasing Hormone Receptor Agonists \n",
"5 Increased Coagulation Factor VIII Activity "
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"url = rawgit('dhimmel', 'drugcentral', commit, 'rephetio/drug-to-class.tsv')\n",
"drug_class_df = pandas.read_table(url)\n",
"drug_class_df = drug_class_df.query(\"class_id in @class_df.class_id\")\n",
"drug_class_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for row in drug_class_df.itertuples():\n",
" data = {\n",
" 'source': 'DrugCentral',\n",
" 'license': 'CC BY 4.0',\n",
" 'unbiased': False,\n",
" }\n",
" source_id = 'Pharmacologic Class', row.class_id\n",
" target_id = 'Compound', row.drugbank_id\n",
" graph.add_edge(source_id, target_id, 'includes', 'both', data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Gene Ontology Domains"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" go_id | \n",
" go_name | \n",
" go_domain | \n",
" tax_id | \n",
" annotation_type | \n",
" size | \n",
" gene_ids | \n",
" gene_symbols | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" GO:0000002 | \n",
" mitochondrial genome maintenance | \n",
" biological_process | \n",
" 9606 | \n",
" inferred | \n",
" 25 | \n",
" 142|291|1763|1890|3980|4205|4358|4976|5428|708... | \n",
" PARP1|SLC25A4|DNA2|TYMP|LIG3|MEF2A|MPV17|OPA1|... | \n",
"
\n",
" \n",
" 1 | \n",
" GO:0000003 | \n",
" reproduction | \n",
" biological_process | \n",
" 9606 | \n",
" inferred | \n",
" 1333 | \n",
" 18|49|51|90|91|92|100|109|113|116|117|133|150|... | \n",
" ABAT|ACR|ACOX1|ACVR1|ACVR1B|ACVR2A|ADA|ADCY3|A... | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" go_id go_name go_domain tax_id \\\n",
"0 GO:0000002 mitochondrial genome maintenance biological_process 9606 \n",
"1 GO:0000003 reproduction biological_process 9606 \n",
"\n",
" annotation_type size gene_ids \\\n",
"0 inferred 25 142|291|1763|1890|3980|4205|4358|4976|5428|708... \n",
"1 inferred 1333 18|49|51|90|91|92|100|109|113|116|117|133|150|... \n",
"\n",
" gene_symbols \n",
"0 PARP1|SLC25A4|DNA2|TYMP|LIG3|MEF2A|MPV17|OPA1|... \n",
"1 ABAT|ACR|ACOX1|ACVR1|ACVR1B|ACVR2A|ADA|ADCY3|A... "
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commit = '87bab297f55db283e65a7a984607316b409415ae'\n",
"url = rawgit('dhimmel', 'gene-ontology', commit, 'annotations/taxid_9606/GO_annotations-9606-inferred-allev.tsv')\n",
"go_df = pandas.read_table(url)\n",
"go_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for i, row in go_df.iterrows():\n",
" genes = coding_genes & set(map(int, row.gene_ids.split('|')))\n",
" if 2 > len(genes) or len(genes) > 1000:\n",
" continue\n",
" kind = row['go_domain'].replace('_', ' ').title()\n",
" data = {'source': 'Gene Ontology', 'url': obo_iri(row.go_id), 'license': 'CC BY 4.0'}\n",
" target = graph.add_node(kind=kind, identifier=row['go_id'], name=row['go_name'], data=data)\n",
" target_id = target.get_id()\n",
" for gene in genes:\n",
" source_id = 'Gene', gene\n",
" data = {'source': 'NCBI gene2go', 'unbiased': False, 'license': 'CC BY 4.0'}\n",
" graph.add_edge(source_id, target_id, 'participates', 'both', data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Disease-gene associations from compilation"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" doid_id | \n",
" doid_name | \n",
" entrez_gene_id | \n",
" gene_symbol | \n",
" sources | \n",
" license | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" DOID:2531 | \n",
" Hematologic cancer | \n",
" 25 | \n",
" ABL1 | \n",
" DISEASES|DisGeNET | \n",
" NaN | \n",
"
\n",
" \n",
" 1 | \n",
" DOID:2531 | \n",
" Hematologic cancer | \n",
" 27 | \n",
" ABL2 | \n",
" DisGeNET | \n",
" ODbL 1.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" doid_id doid_name entrez_gene_id gene_symbol \\\n",
"0 DOID:2531 Hematologic cancer 25 ABL1 \n",
"1 DOID:2531 Hematologic cancer 27 ABL2 \n",
"\n",
" sources license \n",
"0 DISEASES|DisGeNET NaN \n",
"1 DisGeNET ODbL 1.0 "
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"association_df = pandas.read_table('compile/DaG-association.tsv')\n",
"association_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"for i, row in association_df.iterrows():\n",
" source_id = 'Disease', row.doid_id\n",
" target_id = 'Gene', row.entrez_gene_id\n",
" sources = sorted(row.sources.split('|'))\n",
" data = {'sources': sources, 'unbiased': 'GWAS Catalog' in sources}\n",
" if pandas.notnull(row['license']):\n",
" data['license'] = row['license']\n",
" graph.add_edge(source_id, target_id, 'associates', 'both', data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Disease-gene differential expression"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" slim_id | \n",
" slim_name | \n",
" entrez_gene_id | \n",
" gene_symbol | \n",
" direction | \n",
" log2_fold_change | \n",
" p_adjusted | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" DOID:0050156 | \n",
" idiopathic pulmonary fibrosis | \n",
" 55768 | \n",
" NGLY1 | \n",
" down | \n",
" -0.004826 | \n",
" 0 | \n",
"
\n",
" \n",
" 1 | \n",
" DOID:0050156 | \n",
" idiopathic pulmonary fibrosis | \n",
" 4927 | \n",
" NUP88 | \n",
" down | \n",
" -0.005913 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" slim_id slim_name entrez_gene_id gene_symbol \\\n",
"0 DOID:0050156 idiopathic pulmonary fibrosis 55768 NGLY1 \n",
"1 DOID:0050156 idiopathic pulmonary fibrosis 4927 NUP88 \n",
"\n",
" direction log2_fold_change p_adjusted \n",
"0 down -0.004826 0 \n",
"1 down -0.005913 0 "
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commit = '1a11633b5e0095454453335be82012a9f0f482e4'\n",
"url = rawgit('dhimmel', 'stargeo', commit, 'data/diffex.tsv')\n",
"stargeo_df = pandas.read_table(url)\n",
"# Filter to at most 250 up and 250 down-regulated genes per disease\n",
"stargeo_df = stargeo_df.groupby(['slim_id', 'direction']).apply(\n",
" lambda df: df.nsmallest(250, 'p_adjusted')).reset_index(drop=True)\n",
"stargeo_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for row in stargeo_df.itertuples():\n",
" source_id = 'Disease', row.slim_id\n",
" target_id = 'Gene', row.entrez_gene_id\n",
" kind = row.direction + 'regulates'\n",
" data = {\n",
" 'source': 'STARGEO',\n",
" 'log2_fold_change': round(row.log2_fold_change, 5),\n",
" 'unbiased': True,\n",
" 'license': 'CC0 1.0'\n",
" }\n",
" graph.add_edge(source_id, target_id, kind, 'both', data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Chemical similarity"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" compound0 | \n",
" compound1 | \n",
" similarity | \n",
"
\n",
" \n",
" \n",
" \n",
" 1557 | \n",
" DB01489 | \n",
" DB00683 | \n",
" 0.5362 | \n",
"
\n",
" \n",
" 1571 | \n",
" DB01489 | \n",
" DB01567 | \n",
" 0.6260 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" compound0 compound1 similarity\n",
"1557 DB01489 DB00683 0.5362\n",
"1571 DB01489 DB01567 0.6260"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commit = '3e87872db5fca5ac427ce27464ab945c0ceb4ec6'\n",
"url = rawgit('dhimmel', 'drugbank', commit, 'data/similarity-slim.tsv.gz')\n",
"chemical_df = pandas.read_table(url, compression='gzip')\n",
"chemical_df = chemical_df[chemical_df.similarity >= 0.5]\n",
"chemical_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for i, row in chemical_df.iterrows():\n",
" source_id = 'Compound', row.compound0\n",
" target_id = 'Compound', row.compound1\n",
" data = {\n",
" 'source': 'Dice similarity of ECFPs',\n",
" 'similarity': round(row.similarity, 4),\n",
" 'unbiased': True,\n",
" 'license': 'CC0 1.0',\n",
" }\n",
" graph.add_edge(source_id, target_id, 'resembles', 'both', data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## MEDLINE cooccurrence data"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"medline_data = {\n",
" 'source': 'MEDLINE cooccurrence',\n",
" 'unbiased': False,\n",
" 'license': 'CC0 1.0',\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Symptom edges"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" doid_code | \n",
" doid_name | \n",
" mesh_id | \n",
" mesh_name | \n",
" cooccurrence | \n",
" expected | \n",
" enrichment | \n",
" odds_ratio | \n",
" p_fisher | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" DOID:10652 | \n",
" Alzheimer's disease | \n",
" D004314 | \n",
" Down Syndrome | \n",
" 800 | \n",
" 35.619601 | \n",
" 22.459544 | \n",
" 39.918352 | \n",
" 0 | \n",
"
\n",
" \n",
" 1 | \n",
" DOID:10652 | \n",
" Alzheimer's disease | \n",
" D008569 | \n",
" Memory Disorders | \n",
" 1593 | \n",
" 76.580532 | \n",
" 20.801631 | \n",
" 41.885877 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" doid_code doid_name mesh_id mesh_name cooccurrence \\\n",
"0 DOID:10652 Alzheimer's disease D004314 Down Syndrome 800 \n",
"1 DOID:10652 Alzheimer's disease D008569 Memory Disorders 1593 \n",
"\n",
" expected enrichment odds_ratio p_fisher \n",
"0 35.619601 22.459544 39.918352 0 \n",
"1 76.580532 20.801631 41.885877 0 "
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commit = '60d611892bf387b5b23c5f2e2e3bc472cfce85f3'\n",
"url = rawgit('dhimmel', 'medline', commit, 'data/disease-symptom-cooccurrence.tsv')\n",
"disease_symptom_df = pandas.read_table(url)\n",
"disease_symptom_df = disease_symptom_df[disease_symptom_df.p_fisher < 0.005]\n",
"disease_symptom_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for i, row in disease_symptom_df.iterrows():\n",
" source_id = 'Disease', row.doid_code\n",
" target_id = 'Symptom', row.mesh_id\n",
" data = medline_data.copy()\n",
" graph.add_edge(source_id, target_id, 'presents', 'both', data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Disease-localization edges"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" doid_code | \n",
" doid_name | \n",
" uberon_id | \n",
" uberon_name | \n",
" cooccurrence | \n",
" expected | \n",
" enrichment | \n",
" odds_ratio | \n",
" p_fisher | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" DOID:10652 | \n",
" Alzheimer's disease | \n",
" UBERON:0000955 | \n",
" brain | \n",
" 11209 | \n",
" 1182.634069 | \n",
" 9.477995 | \n",
" 74.210761 | \n",
" 0.000000e+00 | \n",
"
\n",
" \n",
" 1 | \n",
" DOID:10652 | \n",
" Alzheimer's disease | \n",
" UBERON:0001890 | \n",
" forebrain | \n",
" 114 | \n",
" 7.326350 | \n",
" 15.560272 | \n",
" 21.733764 | \n",
" 5.971023e-99 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" doid_code doid_name uberon_id uberon_name cooccurrence \\\n",
"0 DOID:10652 Alzheimer's disease UBERON:0000955 brain 11209 \n",
"1 DOID:10652 Alzheimer's disease UBERON:0001890 forebrain 114 \n",
"\n",
" expected enrichment odds_ratio p_fisher \n",
"0 1182.634069 9.477995 74.210761 0.000000e+00 \n",
"1 7.326350 15.560272 21.733764 5.971023e-99 "
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commit = '60d611892bf387b5b23c5f2e2e3bc472cfce85f3'\n",
"url = rawgit('dhimmel', 'medline', commit, 'data/disease-uberon-cooccurrence.tsv')\n",
"disease_anatomy_df = pandas.read_table(url)\n",
"disease_anatomy_df = disease_anatomy_df[disease_anatomy_df.p_fisher < 0.005]\n",
"disease_anatomy_df = disease_anatomy_df[disease_anatomy_df.uberon_id.isin(uberon_df['uberon_id'])]\n",
"disease_anatomy_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for i, row in disease_anatomy_df.iterrows():\n",
" source_id = 'Disease', row.doid_code\n",
" target_id = 'Anatomy', row.uberon_id\n",
" data = medline_data.copy()\n",
" graph.add_edge(source_id, target_id, 'localizes', 'both', data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Disease-disease similarity"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" doid_code_0 | \n",
" doid_name_0 | \n",
" doid_code_1 | \n",
" doid_name_1 | \n",
" cooccurrence | \n",
" expected | \n",
" enrichment | \n",
" odds_ratio | \n",
" p_fisher | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" DOID:10652 | \n",
" Alzheimer's disease | \n",
" DOID:14330 | \n",
" Parkinson's disease | \n",
" 2760 | \n",
" 827.098152 | \n",
" 3.336968 | \n",
" 3.577398 | \n",
" 0.000000e+00 | \n",
"
\n",
" \n",
" 1 | \n",
" DOID:10652 | \n",
" Alzheimer's disease | \n",
" DOID:11949 | \n",
" Creutzfeldt-Jakob disease | \n",
" 332 | \n",
" 96.723002 | \n",
" 3.432482 | \n",
" 3.593306 | \n",
" 3.377672e-80 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" doid_code_0 doid_name_0 doid_code_1 doid_name_1 \\\n",
"0 DOID:10652 Alzheimer's disease DOID:14330 Parkinson's disease \n",
"1 DOID:10652 Alzheimer's disease DOID:11949 Creutzfeldt-Jakob disease \n",
"\n",
" cooccurrence expected enrichment odds_ratio p_fisher \n",
"0 2760 827.098152 3.336968 3.577398 0.000000e+00 \n",
"1 332 96.723002 3.432482 3.593306 3.377672e-80 "
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commit = '60d611892bf387b5b23c5f2e2e3bc472cfce85f3'\n",
"url = rawgit('dhimmel', 'medline', commit, 'data/disease-disease-cooccurrence.tsv')\n",
"disease_similarity_df = pandas.read_table(url)\n",
"disease_similarity_df = disease_similarity_df[-disease_similarity_df[['doid_code_0', 'doid_code_1']].apply(frozenset, 1).duplicated()]\n",
"disease_similarity_df = disease_similarity_df[disease_similarity_df.p_fisher < 0.005]\n",
"disease_similarity_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"for i, row in disease_similarity_df.iterrows():\n",
" source_id = 'Disease', row.doid_code_0\n",
" target_id = 'Disease', row.doid_code_1\n",
" data = medline_data.copy()\n",
" graph.add_edge(source_id, target_id, 'resembles', 'both', data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Anatomy-gene expression presence"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" uberon_id | \n",
" entrez_gene_id | \n",
" sources | \n",
" unbiased | \n",
" license | \n",
"
\n",
" \n",
" \n",
" \n",
" 41138 | \n",
" UBERON:0000002 | \n",
" 2 | \n",
" Bgee | \n",
" 1 | \n",
" NaN | \n",
"
\n",
" \n",
" 41139 | \n",
" UBERON:0000002 | \n",
" 9 | \n",
" Bgee | \n",
" 1 | \n",
" NaN | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" uberon_id entrez_gene_id sources unbiased license\n",
"41138 UBERON:0000002 2 Bgee 1 NaN\n",
"41139 UBERON:0000002 9 Bgee 1 NaN"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"expr_df = pandas.read_table('compile/AeG-expression.tsv.gz', low_memory=False)\n",
"expr_df = expr_df[expr_df.uberon_id.isin(uberon_df.uberon_id) & expr_df.entrez_gene_id.isin(coding_genes)]\n",
"expr_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for i, row in expr_df.iterrows():\n",
" source_id = 'Gene', row['entrez_gene_id']\n",
" target_id = 'Anatomy', row['uberon_id']\n",
" data = {'unbiased': bool(row['unbiased'])}\n",
" if pandas.notnull(row['license']):\n",
" data['license'] = row['license']\n",
" data['sources'] = row['sources'].split('|')\n",
" graph.add_edge(source_id, target_id, 'expresses', 'both', data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Anatomy-gene differential expression"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" GeneID | \n",
" uberon_id | \n",
" direction | \n",
"
\n",
" \n",
" \n",
" \n",
" 37241 | \n",
" 2 | \n",
" UBERON:0000002 | \n",
" upregulates | \n",
"
\n",
" \n",
" 37249 | \n",
" 18 | \n",
" UBERON:0000002 | \n",
" downregulates | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" GeneID uberon_id direction\n",
"37241 2 UBERON:0000002 upregulates\n",
"37249 18 UBERON:0000002 downregulates"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commit = '08ba54e83ee8e28dec22b4351d29e23f1d034d30'\n",
"url = rawgit('dhimmel', 'bgee', commit, 'data/diffex.tsv.gz')\n",
"diffex_df = pandas.read_table(url, compression='gzip')\n",
"diffex_df = pandas.melt(diffex_df, id_vars='GeneID', var_name='uberon_id', value_name='direction')\n",
"diffex_df = diffex_df.query(\"direction != 0\")\n",
"diffex_df = diffex_df[diffex_df.uberon_id.isin(uberon_df.uberon_id) & diffex_df.GeneID.isin(coding_genes)]\n",
"diffex_df = diffex_df.replace({'direction': {-1: 'downregulates', 1: 'upregulates'}})\n",
"diffex_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for i, row in diffex_df.iterrows():\n",
" source_id = 'Gene', row['GeneID']\n",
" target_id = 'Anatomy', row['uberon_id']\n",
" data = {'source': 'Bgee', 'unbiased': True}\n",
" graph.add_edge(source_id, target_id, row['direction'], 'both', data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Compound bindings"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" drugbank_id | \n",
" entrez_gene_id | \n",
" sources | \n",
" pubmed_ids | \n",
" actions | \n",
" affinity_nM | \n",
" license | \n",
" urls | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" DB00014 | \n",
" 2798 | \n",
" DrugBank (target)|DrugCentral (ChEMBL) | \n",
" 20053189 | \n",
" agonist | \n",
" NaN | \n",
" CC BY-NC 4.0 | \n",
" https://www.ebi.ac.uk/chembl/compound/inspect/... | \n",
"
\n",
" \n",
" 1 | \n",
" DB00014 | \n",
" 3973 | \n",
" DrugBank (target) | \n",
" 17016423|17139284|20053189 | \n",
" agonist | \n",
" NaN | \n",
" CC BY-NC 4.0 | \n",
" NaN | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" drugbank_id entrez_gene_id sources \\\n",
"0 DB00014 2798 DrugBank (target)|DrugCentral (ChEMBL) \n",
"1 DB00014 3973 DrugBank (target) \n",
"\n",
" pubmed_ids actions affinity_nM license \\\n",
"0 20053189 agonist NaN CC BY-NC 4.0 \n",
"1 17016423|17139284|20053189 agonist NaN CC BY-NC 4.0 \n",
"\n",
" urls \n",
"0 https://www.ebi.ac.uk/chembl/compound/inspect/... \n",
"1 NaN "
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"binding_df = pandas.read_table('compile/CbG-binding.tsv')\n",
"binding_df = binding_df.merge(compound_df[['drugbank_id']])\n",
"binding_df = binding_df[binding_df.entrez_gene_id.isin(coding_genes)]\n",
"binding_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for i, row in binding_df.iterrows():\n",
" source_id = 'Compound', row.drugbank_id\n",
" target_id = 'Gene', row.entrez_gene_id\n",
" data = {'unbiased': False}\n",
" # singular fields\n",
" for key in 'affinity_nM', 'license':\n",
" value = row[key]\n",
" if pandas.notnull(value):\n",
" data[key] = value\n",
" # compound fields\n",
" for key in 'sources', 'pubmed_ids', 'actions', 'urls':\n",
" value = row[key]\n",
" if pandas.notnull(value):\n",
" data[key] = value.split('|')\n",
" graph.add_edge(source_id, target_id, 'binds', 'both', data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Protein Interactions"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" gene_0 | \n",
" gene_1 | \n",
" sources | \n",
" unbiased | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" 310 | \n",
" hetio-dag | \n",
" 0 | \n",
"
\n",
" \n",
" 1 | \n",
" 1 | \n",
" 1026 | \n",
" hetio-dag | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" gene_0 gene_1 sources unbiased\n",
"0 1 310 hetio-dag 0\n",
"1 1 1026 hetio-dag 0"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commit = 'f6a7edbc8de6ba2d7fe1ef3fee4d89e5b8d0b900'\n",
"url = rawgit('dhimmel', 'ppi', commit, 'data/ppi-hetio-ind.tsv')\n",
"ppi_df = pandas.read_table(url)\n",
"ppi_df = ppi_df[ppi_df.gene_0.isin(coding_genes) & ppi_df.gene_1.isin(coding_genes)]\n",
"# Consider allowing self-interactions in future versions of Hetionet by removing following \n",
"# line of code. See https://github.com/dhimmel/hetio/issues/10\n",
"ppi_df = ppi_df.query(\"gene_0 != gene_1\")\n",
"ppi_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for i, row in ppi_df.iterrows():\n",
" source_id = 'Gene', row.gene_0\n",
" target_id = 'Gene', row.gene_1\n",
" data = {\n",
" 'sources': row.sources.split('|'),\n",
" 'unbiased': bool(row.unbiased),\n",
" }\n",
" graph.add_edge(source_id, target_id, 'interacts', 'both', data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Evolutionary rate covariation"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" source_entrez | \n",
" target_entrez | \n",
" correlation | \n",
" n_ucsc_genes | \n",
" gene_pair | \n",
"
\n",
" \n",
" \n",
" \n",
" 29 | \n",
" 9 | \n",
" 3295 | \n",
" 0.77623 | \n",
" 1 | \n",
" (9, 3295) | \n",
"
\n",
" \n",
" 46 | \n",
" 9 | \n",
" 23313 | \n",
" 0.79472 | \n",
" 1 | \n",
" (9, 23313) | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" source_entrez target_entrez correlation n_ucsc_genes gene_pair\n",
"29 9 3295 0.77623 1 (9, 3295)\n",
"46 9 23313 0.79472 1 (9, 23313)"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commit = '757733f77a89499439c887acb88456e011c5322e'\n",
"url = rawgit('dhimmel', 'erc', commit, 'data/erc_mam33-entrez-gt-0.6.tsv.gz')\n",
"erc_df = pandas.read_table(url, compression='gzip')\n",
"erc_df = erc_df[erc_df.correlation >= 0.75]\n",
"erc_df = erc_df[erc_df.source_entrez.isin(coding_genes) & erc_df.target_entrez.isin(coding_genes)]\n",
"# Drop self-loops (see https://github.com/dhimmel/erc/issues/2)\n",
"erc_df = erc_df.query(\"source_entrez != target_entrez\")\n",
"# Drop duplicate gene pair(s) (see https://github.com/dhimmel/erc/issues/1)\n",
"erc_df['gene_pair'] = list(map(frozenset, zip(erc_df.source_entrez, erc_df.target_entrez)))\n",
"erc_df = erc_df.drop_duplicates('gene_pair', keep='last')\n",
"erc_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for i, row in erc_df.iterrows():\n",
" source_id = 'Gene', row.source_entrez\n",
" target_id = 'Gene', row.target_entrez\n",
" data = {\n",
" 'source': 'ERC',\n",
" 'unbiased': True,\n",
" }\n",
" graph.add_edge(source_id, target_id, 'covaries', 'both', data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Indications from the PharmacotherapyDB"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" doid_id | \n",
" drugbank_id | \n",
" disease | \n",
" drug | \n",
" category | \n",
" n_curators | \n",
" n_resources | \n",
" kind | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" DOID:10652 | \n",
" DB00843 | \n",
" Alzheimer's disease | \n",
" Donepezil | \n",
" DM | \n",
" 2 | \n",
" 1 | \n",
" treats | \n",
"
\n",
" \n",
" 1 | \n",
" DOID:10652 | \n",
" DB00674 | \n",
" Alzheimer's disease | \n",
" Galantamine | \n",
" DM | \n",
" 1 | \n",
" 4 | \n",
" treats | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" doid_id drugbank_id disease drug category \\\n",
"0 DOID:10652 DB00843 Alzheimer's disease Donepezil DM \n",
"1 DOID:10652 DB00674 Alzheimer's disease Galantamine DM \n",
"\n",
" n_curators n_resources kind \n",
"0 2 1 treats \n",
"1 1 4 treats "
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commit = '11d535ba0884ee56c3cd5756fdfb4985f313bd80'\n",
"url = rawgit('dhimmel', 'indications', commit, 'catalog/indications.tsv')\n",
"indication_df = pandas.read_table(url)\n",
"categories = {'DM', 'SYM'}\n",
"indication_df = indication_df.query(\"category in @categories\").copy()\n",
"indication_df['kind'] = indication_df.category.map({'DM': 'treats', 'SYM': 'palliates'})\n",
"indication_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"for i, row in indication_df.iterrows():\n",
" source_id = 'Disease', row.doid_id\n",
" target_id = 'Compound', row.drugbank_id\n",
" data = {'source': 'PharmacotherapyDB', 'unbiased': False, 'license': 'CC0 1.0'}\n",
" graph.add_edge(source_id, target_id, row['kind'], 'both', data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## LINCS L1000 relationships"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"commit = 'abcb12f942f93e3ee839e5e3593f930df2c56845'"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def filter_l1000_df(df, n):\n",
" \"\"\"\n",
" Filter LINCS L1000 differentially expression genes to at most `n` genes\n",
" per perturbagen-direction-status combination.\n",
" \"\"\"\n",
" df = df.groupby(['perturbagen', 'direction', 'status']).apply(\n",
" lambda x: x.nlargest(n, 'nlog10_bonferroni_pval')).reset_index(drop=True)\n",
" return df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### LINCS compound-gene dysregulation"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" perturbagen | \n",
" entrez_gene_id | \n",
" z_score | \n",
" symbol | \n",
" status | \n",
" direction | \n",
" nlog10_bonferroni_pval | \n",
"
\n",
" \n",
" \n",
" \n",
" 39856 | \n",
" DB09020 | \n",
" 3895 | \n",
" 4.077 | \n",
" KTN1 | \n",
" measured | \n",
" up | \n",
" 1.351 | \n",
"
\n",
" \n",
" 39857 | \n",
" DB09020 | \n",
" 23368 | \n",
" 4.062 | \n",
" PPP1R13B | \n",
" measured | \n",
" up | \n",
" 1.323 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" perturbagen entrez_gene_id z_score symbol status direction \\\n",
"39856 DB09020 3895 4.077 KTN1 measured up \n",
"39857 DB09020 23368 4.062 PPP1R13B measured up \n",
"\n",
" nlog10_bonferroni_pval \n",
"39856 1.351 \n",
"39857 1.323 "
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"url = rawgit('dhimmel', 'lincs', commit, 'data/consensi/signif/dysreg-drugbank.tsv')\n",
"l1000_df = pandas.read_table(url)\n",
"l1000_df = l1000_df.query(\"perturbagen in @compound_df.drugbank_id and entrez_gene_id in @coding_genes\")\n",
"l1000_df = filter_l1000_df(l1000_df, n=125)\n",
"l1000_df.tail(2)"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"mapper = {'up': 'upregulates', 'down': 'downregulates'}\n",
"for row in l1000_df.itertuples():\n",
" source_id = 'Compound', row.perturbagen\n",
" target_id = 'Gene', row.entrez_gene_id\n",
" data = {\n",
" 'source': 'LINCS L1000',\n",
" 'z_score': round(row.z_score, 3),\n",
" 'method': row.status,\n",
" 'unbiased': True,\n",
" }\n",
" kind = mapper[row.direction]\n",
" graph.add_edge(source_id, target_id, kind, 'both', data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### LINCS genetic perturbations"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"url = rawgit('dhimmel', 'lincs', commit, 'data/consensi/signif/dysreg-knockdown.tsv')\n",
"l1000_kd_df = filter_l1000_df(pandas.read_table(url), n=50)\n",
"\n",
"url = rawgit('dhimmel', 'lincs', commit, 'data/consensi/signif/dysreg-overexpression.tsv')\n",
"l1000_oe_df = filter_l1000_df(pandas.read_table(url), n=50)"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" perturbagen | \n",
" entrez_gene_id | \n",
" z_score | \n",
" symbol | \n",
" status | \n",
" direction | \n",
" nlog10_bonferroni_pval | \n",
" kind | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 2 | \n",
" 7422 | \n",
" -7.823 | \n",
" VEGFA | \n",
" imputed | \n",
" down | \n",
" 10.475 | \n",
" knockdown downregulates | \n",
"
\n",
" \n",
" 1 | \n",
" 2 | \n",
" 6382 | \n",
" -6.402 | \n",
" SDC1 | \n",
" imputed | \n",
" down | \n",
" 6.002 | \n",
" knockdown downregulates | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" perturbagen entrez_gene_id z_score symbol status direction \\\n",
"0 2 7422 -7.823 VEGFA imputed down \n",
"1 2 6382 -6.402 SDC1 imputed down \n",
"\n",
" nlog10_bonferroni_pval kind \n",
"0 10.475 knockdown downregulates \n",
"1 6.002 knockdown downregulates "
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mapper = {'up': 'knockdown upregulates', 'down': 'knockdown downregulates'}\n",
"l1000_kd_df['kind'] = l1000_kd_df.direction.map(lambda x: mapper[x])\n",
"\n",
"mapper = {'up': 'overexpression upregulates', 'down': 'overexpression downregulates'}\n",
"l1000_oe_df['kind'] = l1000_oe_df.direction.map(lambda x: mapper[x])\n",
"\n",
"l1000_genetic_df = pandas.concat([l1000_kd_df, l1000_oe_df])\n",
"l1000_genetic_df = l1000_genetic_df.query('perturbagen in @coding_genes and entrez_gene_id in @coding_genes')\n",
"l1000_genetic_df = l1000_genetic_df.query('perturbagen != entrez_gene_id')\n",
"\n",
"l1000_genetic_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for (pert, gene), df in l1000_genetic_df.groupby(['perturbagen', 'entrez_gene_id'], sort=False):\n",
" source_id = 'Gene', pert\n",
" target_id = 'Gene', gene\n",
" method, = df.status.unique()\n",
" data = {'source': 'LINCS L1000', 'subtypes': list(df.kind), 'method': method, 'unbiased': True}\n",
" graph.add_edge(source_id, target_id, 'regulates', 'forward', data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Side Effects - SIDER"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" umls_cui_from_meddra | \n",
" side_effect_name | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" C0863129 | \n",
" AGEP | \n",
"
\n",
" \n",
" 1 | \n",
" C0001849 | \n",
" AIDS dementia complex | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" umls_cui_from_meddra side_effect_name\n",
"0 C0863129 AGEP\n",
"1 C0001849 AIDS dementia complex"
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"commit = 'be3adebc0d845baaddb907a880890cb5e85f5801'\n",
"url = rawgit('dhimmel', 'SIDER4', commit, 'data/side-effect-terms.tsv')\n",
"side_effect_df = pandas.read_table(url)\n",
"side_effect_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for i, row in side_effect_df.iterrows():\n",
" umls_id = row['umls_cui_from_meddra']\n",
" data = {\n",
" 'source': 'UMLS via SIDER 4.1',\n",
" 'url': 'http://identifiers.org/umls/{}'.format(umls_id),\n",
" 'license': 'CC BY-NC-SA 4.0',\n",
" }\n",
" graph.add_node(kind='Side Effect', identifier=umls_id, name=row['side_effect_name'], data=data)"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" drugbank_id | \n",
" drugbank_name | \n",
" umls_cui_from_meddra | \n",
" side_effect_name | \n",
"
\n",
" \n",
" \n",
" \n",
" 6398 | \n",
" DB01048 | \n",
" Abacavir | \n",
" C0001849 | \n",
" AIDS dementia complex | \n",
"
\n",
" \n",
" 6399 | \n",
" DB01048 | \n",
" Abacavir | \n",
" C0232487 | \n",
" Abdominal discomfort | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" drugbank_id drugbank_name umls_cui_from_meddra side_effect_name\n",
"6398 DB01048 Abacavir C0001849 AIDS dementia complex\n",
"6399 DB01048 Abacavir C0232487 Abdominal discomfort"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"url = rawgit('dhimmel', 'SIDER4', commit, 'data/side-effects.tsv')\n",
"sider_df = pandas.read_table(url)\n",
"sider_df = sider_df[sider_df.drugbank_id.isin(compound_df.drugbank_id)]\n",
"sider_df.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for i, row in sider_df.iterrows():\n",
" umls_id = row.umls_cui_from_meddra\n",
" source_id = 'Compound', row.drugbank_id\n",
" target_id = 'Side Effect', umls_id\n",
" data = {\n",
" 'source': 'SIDER 4.1',\n",
" 'url': 'http://sideeffects.embl.de/se/{}/'.format(umls_id),\n",
" 'unbiased': False,\n",
" 'license': 'CC BY-NC-SA 4.0',\n",
" }\n",
" graph.add_edge(source_id, target_id, 'causes', 'both', data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Network visualizations and stats"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Export node degree tables\n",
"hetio.stats.degrees_to_excel(graph, 'data/summary/degrees.xlsx')"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Create and save degree distribution vizualizations\n",
"# Commented out due to https://github.com/ContinuumIO/anaconda-issues/issues/368\n",
"# hetio.stats.plot_degrees(graph, 'viz/degrees.pdf')"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" metanode | \n",
" abbreviation | \n",
" metaedges | \n",
" nodes | \n",
" unconnected_nodes | \n",
"
\n",
" \n",
" \n",
" \n",
" 7 | \n",
" Anatomy | \n",
" A | \n",
" 4 | \n",
" 402 | \n",
" 2 | \n",
"
\n",
" \n",
" 1 | \n",
" Biological Process | \n",
" BP | \n",
" 1 | \n",
" 11381 | \n",
" 0 | \n",
"
\n",
" \n",
" 4 | \n",
" Cellular Component | \n",
" CC | \n",
" 1 | \n",
" 1391 | \n",
" 0 | \n",
"
\n",
" \n",
" 9 | \n",
" Compound | \n",
" C | \n",
" 8 | \n",
" 1552 | \n",
" 14 | \n",
"
\n",
" \n",
" 2 | \n",
" Disease | \n",
" D | \n",
" 8 | \n",
" 137 | \n",
" 1 | \n",
"
\n",
" \n",
" 8 | \n",
" Gene | \n",
" G | \n",
" 16 | \n",
" 20945 | \n",
" 1800 | \n",
"
\n",
" \n",
" 6 | \n",
" Molecular Function | \n",
" MF | \n",
" 1 | \n",
" 2884 | \n",
" 0 | \n",
"
\n",
" \n",
" 3 | \n",
" Pathway | \n",
" PW | \n",
" 1 | \n",
" 1822 | \n",
" 0 | \n",
"
\n",
" \n",
" 10 | \n",
" Pharmacologic Class | \n",
" PC | \n",
" 1 | \n",
" 345 | \n",
" 0 | \n",
"
\n",
" \n",
" 0 | \n",
" Side Effect | \n",
" SE | \n",
" 1 | \n",
" 5734 | \n",
" 33 | \n",
"
\n",
" \n",
" 5 | \n",
" Symptom | \n",
" S | \n",
" 1 | \n",
" 438 | \n",
" 23 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" metanode abbreviation metaedges nodes unconnected_nodes\n",
"7 Anatomy A 4 402 2\n",
"1 Biological Process BP 1 11381 0\n",
"4 Cellular Component CC 1 1391 0\n",
"9 Compound C 8 1552 14\n",
"2 Disease D 8 137 1\n",
"8 Gene G 16 20945 1800\n",
"6 Molecular Function MF 1 2884 0\n",
"3 Pathway PW 1 1822 0\n",
"10 Pharmacologic Class PC 1 345 0\n",
"0 Side Effect SE 1 5734 33\n",
"5 Symptom S 1 438 23"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Summary of metanodes and cooresponding nodes\n",
"metanode_df = hetio.stats.get_metanode_df(graph)\n",
"metanode_df.to_csv('data/summary/metanodes.tsv', sep='\\t', index=False)\n",
"metanode_df"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"47031"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Total number of nodes\n",
"metanode_df.nodes.sum()"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" metaedge | \n",
" abbreviation | \n",
" edges | \n",
" source_nodes | \n",
" target_nodes | \n",
" unbiased | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Anatomy - downregulates - Gene | \n",
" AdG | \n",
" 102240 | \n",
" 36 | \n",
" 15097 | \n",
" 102240 | \n",
"
\n",
" \n",
" 1 | \n",
" Anatomy - expresses - Gene | \n",
" AeG | \n",
" 526407 | \n",
" 241 | \n",
" 18094 | \n",
" 453477 | \n",
"
\n",
" \n",
" 2 | \n",
" Anatomy - upregulates - Gene | \n",
" AuG | \n",
" 97848 | \n",
" 36 | \n",
" 15929 | \n",
" 97848 | \n",
"
\n",
" \n",
" 3 | \n",
" Compound - binds - Gene | \n",
" CbG | \n",
" 11571 | \n",
" 1389 | \n",
" 1689 | \n",
" 0 | \n",
"
\n",
" \n",
" 4 | \n",
" Compound - causes - Side Effect | \n",
" CcSE | \n",
" 138944 | \n",
" 1071 | \n",
" 5701 | \n",
" 0 | \n",
"
\n",
" \n",
" 5 | \n",
" Compound - downregulates - Gene | \n",
" CdG | \n",
" 21102 | \n",
" 734 | \n",
" 2880 | \n",
" 21102 | \n",
"
\n",
" \n",
" 6 | \n",
" Compound - palliates - Disease | \n",
" CpD | \n",
" 390 | \n",
" 221 | \n",
" 50 | \n",
" 0 | \n",
"
\n",
" \n",
" 7 | \n",
" Compound - resembles - Compound | \n",
" CrC | \n",
" 6486 | \n",
" 1042 | \n",
" 1054 | \n",
" 6486 | \n",
"
\n",
" \n",
" 8 | \n",
" Compound - treats - Disease | \n",
" CtD | \n",
" 755 | \n",
" 387 | \n",
" 77 | \n",
" 0 | \n",
"
\n",
" \n",
" 9 | \n",
" Compound - upregulates - Gene | \n",
" CuG | \n",
" 18756 | \n",
" 703 | \n",
" 3247 | \n",
" 18756 | \n",
"
\n",
" \n",
" 10 | \n",
" Disease - associates - Gene | \n",
" DaG | \n",
" 12623 | \n",
" 134 | \n",
" 5392 | \n",
" 1284 | \n",
"
\n",
" \n",
" 11 | \n",
" Disease - downregulates - Gene | \n",
" DdG | \n",
" 7623 | \n",
" 44 | \n",
" 5745 | \n",
" 7623 | \n",
"
\n",
" \n",
" 12 | \n",
" Disease - localizes - Anatomy | \n",
" DlA | \n",
" 3602 | \n",
" 133 | \n",
" 398 | \n",
" 0 | \n",
"
\n",
" \n",
" 13 | \n",
" Disease - presents - Symptom | \n",
" DpS | \n",
" 3357 | \n",
" 133 | \n",
" 415 | \n",
" 0 | \n",
"
\n",
" \n",
" 14 | \n",
" Disease - resembles - Disease | \n",
" DrD | \n",
" 543 | \n",
" 112 | \n",
" 106 | \n",
" 0 | \n",
"
\n",
" \n",
" 15 | \n",
" Disease - upregulates - Gene | \n",
" DuG | \n",
" 7731 | \n",
" 44 | \n",
" 5630 | \n",
" 7731 | \n",
"
\n",
" \n",
" 16 | \n",
" Gene - covaries - Gene | \n",
" GcG | \n",
" 61690 | \n",
" 9043 | \n",
" 9532 | \n",
" 61690 | \n",
"
\n",
" \n",
" 17 | \n",
" Gene - interacts - Gene | \n",
" GiG | \n",
" 147164 | \n",
" 9526 | \n",
" 14084 | \n",
" 15517 | \n",
"
\n",
" \n",
" 18 | \n",
" Gene - participates - Biological Process | \n",
" GpBP | \n",
" 559504 | \n",
" 14772 | \n",
" 11381 | \n",
" 0 | \n",
"
\n",
" \n",
" 19 | \n",
" Gene - participates - Cellular Component | \n",
" GpCC | \n",
" 73566 | \n",
" 10580 | \n",
" 1391 | \n",
" 0 | \n",
"
\n",
" \n",
" 20 | \n",
" Gene - participates - Molecular Function | \n",
" GpMF | \n",
" 97222 | \n",
" 13063 | \n",
" 2884 | \n",
" 0 | \n",
"
\n",
" \n",
" 21 | \n",
" Gene - participates - Pathway | \n",
" GpPW | \n",
" 84372 | \n",
" 8979 | \n",
" 1822 | \n",
" 0 | \n",
"
\n",
" \n",
" 22 | \n",
" Gene > regulates > Gene | \n",
" Gr>G | \n",
" 265672 | \n",
" 4634 | \n",
" 7048 | \n",
" 265672 | \n",
"
\n",
" \n",
" 23 | \n",
" Pharmacologic Class - includes - Compound | \n",
" PCiC | \n",
" 1029 | \n",
" 345 | \n",
" 724 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" metaedge abbreviation edges \\\n",
"0 Anatomy - downregulates - Gene AdG 102240 \n",
"1 Anatomy - expresses - Gene AeG 526407 \n",
"2 Anatomy - upregulates - Gene AuG 97848 \n",
"3 Compound - binds - Gene CbG 11571 \n",
"4 Compound - causes - Side Effect CcSE 138944 \n",
"5 Compound - downregulates - Gene CdG 21102 \n",
"6 Compound - palliates - Disease CpD 390 \n",
"7 Compound - resembles - Compound CrC 6486 \n",
"8 Compound - treats - Disease CtD 755 \n",
"9 Compound - upregulates - Gene CuG 18756 \n",
"10 Disease - associates - Gene DaG 12623 \n",
"11 Disease - downregulates - Gene DdG 7623 \n",
"12 Disease - localizes - Anatomy DlA 3602 \n",
"13 Disease - presents - Symptom DpS 3357 \n",
"14 Disease - resembles - Disease DrD 543 \n",
"15 Disease - upregulates - Gene DuG 7731 \n",
"16 Gene - covaries - Gene GcG 61690 \n",
"17 Gene - interacts - Gene GiG 147164 \n",
"18 Gene - participates - Biological Process GpBP 559504 \n",
"19 Gene - participates - Cellular Component GpCC 73566 \n",
"20 Gene - participates - Molecular Function GpMF 97222 \n",
"21 Gene - participates - Pathway GpPW 84372 \n",
"22 Gene > regulates > Gene Gr>G 265672 \n",
"23 Pharmacologic Class - includes - Compound PCiC 1029 \n",
"\n",
" source_nodes target_nodes unbiased \n",
"0 36 15097 102240 \n",
"1 241 18094 453477 \n",
"2 36 15929 97848 \n",
"3 1389 1689 0 \n",
"4 1071 5701 0 \n",
"5 734 2880 21102 \n",
"6 221 50 0 \n",
"7 1042 1054 6486 \n",
"8 387 77 0 \n",
"9 703 3247 18756 \n",
"10 134 5392 1284 \n",
"11 44 5745 7623 \n",
"12 133 398 0 \n",
"13 133 415 0 \n",
"14 112 106 0 \n",
"15 44 5630 7731 \n",
"16 9043 9532 61690 \n",
"17 9526 14084 15517 \n",
"18 14772 11381 0 \n",
"19 10580 1391 0 \n",
"20 13063 2884 0 \n",
"21 8979 1822 0 \n",
"22 4634 7048 265672 \n",
"23 345 724 0 "
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Summary of metaedges and cooresponding edges\n",
"metaedge_df = hetio.stats.get_metaedge_df(graph)\n",
"\n",
"# Calculate number of unbiased edges\n",
"rows = list()\n",
"for metaedge, edges in graph.get_metaedge_to_edges(exclude_inverts=True).items():\n",
" unbiased = sum(edge.data['unbiased'] for edge in edges)\n",
" rows.append({'metaedge': str(metaedge), 'unbiased': unbiased})\n",
"\n",
"metaedge_df = metaedge_df.merge(pandas.DataFrame(rows))\n",
"metaedge_df.to_csv('data/summary/metaedges.tsv', sep='\\t', index=False)\n",
"metaedge_df"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Summary of different styles for representing each metaedge\n",
"metaedge_style_df = hetio.stats.get_metaedge_style_df(metagraph)\n",
"metaedge_style_df.to_csv('data/summary/metaedge-styles.tsv', sep='\\t', index=False)"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"2250197"
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Number of edges in the network\n",
"metaedge_df.edges.sum()"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"## Save graph"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Write nodes to a table\n",
"path = 'data/nodes.tsv'\n",
"hetio.readwrite.write_nodetable(graph, path)\n",
"\n",
"# Write edges to a table\n",
"path = 'data/edges.sif.gz'\n",
"hetio.readwrite.write_sif(graph, path)"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Write a subset of edges to a table\n",
"path = 'data/edges-10.sif'\n",
"hetio.readwrite.write_sif(graph, path, max_edges=10)\n",
"\n",
"path = 'data/edges-5k.sif.gz'\n",
"hetio.readwrite.write_sif(graph, path, max_edges=5000)"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Write metagraph as json\n",
"path = 'data/metagraph.json'\n",
"hetio.readwrite.write_metagraph(metagraph, path)"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Write graph as json\n",
"path = 'data/hetnet.json.bz2'\n",
"hetio.readwrite.write_graph(graph, path)"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"963ce4060456e7a6c98398f4f96a4a570875100ab6a5a98cd39e9f05627be284 data/hetnet.json.bz2\r\n"
]
}
],
"source": [
"! sha256sum data/hetnet.json.bz2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Barplots of metaedge and metanode counts"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nAAAAAElFTkSuQmCC\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = seaborn.barplot(x='metanode', y='nodes', data=metanode_df.sort_values('nodes'))\n",
"for tick in ax.get_xticklabels():\n",
" tick.set_rotation(90)\n",
"ax.set_xlabel(''); ax.set_ylabel('nodes');"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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\niLI2wf4d4ApgE+ASUo+oL7nVstzepB7ocaSJwiKGkYLV7mloZ8tgNaVI/JVzT+kjJPPjGUXzOHk+\na7TtCyX9lDSC+57tX7WQeQdpYbRrctzRf2eZluun51ia4aS8SleQzDxnOS1j0Eqult7nAlI0ctn0\nPm2fW3/qA87OLqRlzarr2X5frvNMkudbGYXSKkdWIf24LpWeMds/VEqx9C7SwlXHOa8yORDtrEo2\nPa6QO7dvIc3xXt1itLKeUrYCSPegfrvwN1tPKJQUpX5nH/uH0Hpi8H2S+ko3P4SCjKCkHl2z74qo\nTXLuUrevmxRc2Yqfk0YVH3DvOJIbJF3TWFjS50mKZBXSROL+wE9tf7OxbBOq9tx+BhyilJjuAFJe\no1MoVmJfB7aRtAvJQWJT0qJlrX60pwP7KC1o9A6SY8a5JLNkKz5DWtjsQ8A9tr8k6fekEWArdnRP\nep9fO6f3KZCBaufWn/raNavOX9XU9tyikX2LY7Y7oVv1urT1jEk6u0nbds4u9EXBwVXbWZXzSQk9\n/0IKsr6IZJJs5q7cmFqlcqBpKJTirLl9YrvMGiR9yZVJltdKfn9Ja5K8TOaSlhtu2UuS9E7n4DJJ\n60k6CHjM9vn5mMf0IfZ10vzHF4HLbb+s9hLF3UPKefQO0mjubsqtSPmq7b9I+h5wku0/qGfBoFa8\nbPvfkj4I/DibEIue75dtd0n6EqmH+pR6Fl9qxdx8/N3pWZBryVYCmarpfaqcW3/qa9esunSDp1av\nUbibB8atqBQMWWOF+u0Sk/JVr0u7z1gt88VOpN/cjSR36i1II5UiKrWz6kiKtJzyr/MI9VTbk/vq\nNNawXdXDcQEWeYVS5IHyWkNp0aoPkTxAlgCOkTS5mblF0vGASHnGViL9GE4BNsuKplkW0pWA7Ukv\no9Mk/Y7k4lw2Mvxc4GZS5HRtTY2zKU6jP0zSV0lOBEcqrd5X5iX4z9z7HunkZrkPUJS99hUlL7b3\nAAcrLY5WpqMwRSnzgPOL6WCgjDtn1fQ+Vc6tP/W1a1Z9gd4p7OtH4a0C4/5E7+dhSt12mVF31evS\n1jPmnE1C0hfcO+nrhUorGxbxT6V4nFFttrPqaH2EkivwR4DN8yT76AKZjrDIK5TXIR8ENnZelS33\ndG6iubllK/esUrcPcKVzSgulQMc+cQrYuhS4VMmNdDeSknlC0s9dHBA5yvYJddt3lDS3fITk67+L\n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\nTkSuQmCC\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = seaborn.barplot(x='metaedge', y='edges', data=metaedge_df.sort_values('edges'))\n",
"for tick in ax.get_xticklabels():\n",
" tick.set_rotation(90)\n",
"ax.set_xlabel(''); ax.set_ylabel('edges');"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}