{ "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
tax_idGeneIDSymbolchromosomemap_locationtype_of_genedescription
096061A1BG1919q13.4protein-codingalpha-1-B glycoprotein
196062A2M1212p13.31protein-codingalpha-2-macroglobulin
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
doidnamesourcepathophysiology
0DOID:2531hematologic cancerDOcancerslimneoplastic
1DOID:1319brain cancerDOcancerslimneoplastic
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
drugbank_idnametypegroupsatc_codescategoriesinchikeyinchi
0DB00014Goserelinsmall moleculeapprovedL02AE03NaNInChIKey=BLCLNMBMMGCOAS-URPVMXJPSA-NInChI=1S/C59H84N18O14/c1-31(2)22-40(49(82)68-3...
1DB00035Desmopressinsmall moleculeapprovedH01BA02Antidiuretic Agents|Hemostatics|Renal AgentsInChIKey=NFLWUMRGJYTJIN-NXBWRCJVSA-NInChI=1S/C46H64N14O12S2/c47-35(62)15-14-29-40(...
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
uberon_iduberon_namemesh_idmesh_namebto_id
0UBERON:0000002uterine cervixD002584Cervix UteriBTO:0001421
1UBERON:0000004noseD009666NoseBTO:0000840
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
mesh_idmesh_namein_hsdn
0D000006Abdomen, Acute1
1D000270Adie Syndrome0
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
identifiernameurln_genesn_coding_genessourcelicensegenescoding_genes
1860WP80_r68938Nucleotide GPCRshttp://www.wikipathways.org/instance/WP80_r689381111WikiPathwaysCC BY 3.010161|1241|134|135|136|140|2846|5028|5029|5030...10161|1241|134|135|136|140|2846|5028|5029|5030...
1861WP98_r72088Prostaglandin Synthesis and Regulationhttp://www.wikipathways.org/instance/WP98_r720883030WikiPathwaysCC BY 3.01583|1906|1909|1910|301|302|306|307|308|309|32...1583|1906|1909|1910|301|302|306|307|308|309|32...
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
class_idclass_nameclass_sourceclass_typeurl
240N0000005760Aminosalicylic AcidsFDAChemical/Ingredienthttp://purl.bioontology.org/ontology/NDFRT/N00...
241N0000005934ProgesteroneFDAChemical/Ingredienthttp://purl.bioontology.org/ontology/NDFRT/N00...
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
drugbank_iddrugbank_nameclass_idclass_name
1DB00014GoserelinN0000175654Gonadotropin Releasing Hormone Receptor Agonists
5DB00035DesmopressinN0000175914Increased Coagulation Factor VIII Activity
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
go_idgo_namego_domaintax_idannotation_typesizegene_idsgene_symbols
0GO:0000002mitochondrial genome maintenancebiological_process9606inferred25142|291|1763|1890|3980|4205|4358|4976|5428|708...PARP1|SLC25A4|DNA2|TYMP|LIG3|MEF2A|MPV17|OPA1|...
1GO:0000003reproductionbiological_process9606inferred133318|49|51|90|91|92|100|109|113|116|117|133|150|...ABAT|ACR|ACOX1|ACVR1|ACVR1B|ACVR2A|ADA|ADCY3|A...
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
doid_iddoid_nameentrez_gene_idgene_symbolsourceslicense
0DOID:2531Hematologic cancer25ABL1DISEASES|DisGeNETNaN
1DOID:2531Hematologic cancer27ABL2DisGeNETODbL 1.0
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
slim_idslim_nameentrez_gene_idgene_symboldirectionlog2_fold_changep_adjusted
0DOID:0050156idiopathic pulmonary fibrosis55768NGLY1down-0.0048260
1DOID:0050156idiopathic pulmonary fibrosis4927NUP88down-0.0059130
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
compound0compound1similarity
1557DB01489DB006830.5362
1571DB01489DB015670.6260
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
doid_codedoid_namemesh_idmesh_namecooccurrenceexpectedenrichmentodds_ratiop_fisher
0DOID:10652Alzheimer's diseaseD004314Down Syndrome80035.61960122.45954439.9183520
1DOID:10652Alzheimer's diseaseD008569Memory Disorders159376.58053220.80163141.8858770
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
doid_codedoid_nameuberon_iduberon_namecooccurrenceexpectedenrichmentodds_ratiop_fisher
0DOID:10652Alzheimer's diseaseUBERON:0000955brain112091182.6340699.47799574.2107610.000000e+00
1DOID:10652Alzheimer's diseaseUBERON:0001890forebrain1147.32635015.56027221.7337645.971023e-99
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
doid_code_0doid_name_0doid_code_1doid_name_1cooccurrenceexpectedenrichmentodds_ratiop_fisher
0DOID:10652Alzheimer's diseaseDOID:14330Parkinson's disease2760827.0981523.3369683.5773980.000000e+00
1DOID:10652Alzheimer's diseaseDOID:11949Creutzfeldt-Jakob disease33296.7230023.4324823.5933063.377672e-80
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
uberon_identrez_gene_idsourcesunbiasedlicense
41138UBERON:00000022Bgee1NaN
41139UBERON:00000029Bgee1NaN
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
GeneIDuberon_iddirection
372412UBERON:0000002upregulates
3724918UBERON:0000002downregulates
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
drugbank_identrez_gene_idsourcespubmed_idsactionsaffinity_nMlicenseurls
0DB000142798DrugBank (target)|DrugCentral (ChEMBL)20053189agonistNaNCC BY-NC 4.0https://www.ebi.ac.uk/chembl/compound/inspect/...
1DB000143973DrugBank (target)17016423|17139284|20053189agonistNaNCC BY-NC 4.0NaN
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
gene_0gene_1sourcesunbiased
01310hetio-dag0
111026hetio-dag0
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
source_entreztarget_entrezcorrelationn_ucsc_genesgene_pair
29932950.776231(9, 3295)
469233130.794721(9, 23313)
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
doid_iddrugbank_iddiseasedrugcategoryn_curatorsn_resourceskind
0DOID:10652DB00843Alzheimer's diseaseDonepezilDM21treats
1DOID:10652DB00674Alzheimer's diseaseGalantamineDM14treats
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
perturbagenentrez_gene_idz_scoresymbolstatusdirectionnlog10_bonferroni_pval
39856DB0902038954.077KTN1measuredup1.351
39857DB09020233684.062PPP1R13Bmeasuredup1.323
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
perturbagenentrez_gene_idz_scoresymbolstatusdirectionnlog10_bonferroni_pvalkind
027422-7.823VEGFAimputeddown10.475knockdown downregulates
126382-6.402SDC1imputeddown6.002knockdown downregulates
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
umls_cui_from_meddraside_effect_name
0C0863129AGEP
1C0001849AIDS dementia complex
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
drugbank_iddrugbank_nameumls_cui_from_meddraside_effect_name
6398DB01048AbacavirC0001849AIDS dementia complex
6399DB01048AbacavirC0232487Abdominal discomfort
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
metanodeabbreviationmetaedgesnodesunconnected_nodes
7AnatomyA44022
1Biological ProcessBP1113810
4Cellular ComponentCC113910
9CompoundC8155214
2DiseaseD81371
8GeneG16209451800
6Molecular FunctionMF128840
3PathwayPW118220
10Pharmacologic ClassPC13450
0Side EffectSE1573433
5SymptomS143823
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
metaedgeabbreviationedgessource_nodestarget_nodesunbiased
0Anatomy - downregulates - GeneAdG1022403615097102240
1Anatomy - expresses - GeneAeG52640724118094453477
2Anatomy - upregulates - GeneAuG97848361592997848
3Compound - binds - GeneCbG11571138916890
4Compound - causes - Side EffectCcSE138944107157010
5Compound - downregulates - GeneCdG21102734288021102
6Compound - palliates - DiseaseCpD390221500
7Compound - resembles - CompoundCrC6486104210546486
8Compound - treats - DiseaseCtD755387770
9Compound - upregulates - GeneCuG18756703324718756
10Disease - associates - GeneDaG1262313453921284
11Disease - downregulates - GeneDdG76234457457623
12Disease - localizes - AnatomyDlA36021333980
13Disease - presents - SymptomDpS33571334150
14Disease - resembles - DiseaseDrD5431121060
15Disease - upregulates - GeneDuG77314456307731
16Gene - covaries - GeneGcG616909043953261690
17Gene - interacts - GeneGiG14716495261408415517
18Gene - participates - Biological ProcessGpBP55950414772113810
19Gene - participates - Cellular ComponentGpCC735661058013910
20Gene - participates - Molecular FunctionGpMF972221306328840
21Gene - participates - PathwayGpPW84372897918220
22Gene > regulates > GeneGr>G26567246347048265672
23Pharmacologic Class - includes - CompoundPCiC10293457240
\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 }