{ "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", " 'perturbation': 'PB',\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", " '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", " ('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", " ('perturbation', 'gene', 'regulates', '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", " 'url': 'http://identifiers.org/ncbigene/{}'.format(row.GeneID),\n", " 'license': 'CC0 1.0',\n", " }\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 = '72614ade9f1cc5a5317b8f6836e1e464b31d5587'\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 = {'url': obo_iri(row.doid), 'license': 'CC BY 3.0'}\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 = {'inchikey': row.inchikey, 'inchi': row.inchi, 'url': url, 'license': 'CC BY-NC 4.0'}\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 = {'url': obo_iri(row['uberon_id']), 'license': 'CC BY 3.0'}\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://www.nlm.nih.gov/cgi/mesh/2015/MB_cgi?field=uid&term={}'.format(row.mesh_id)\n", " data = {'url': url, 'license': 'CC0 1.0'}\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
1622WP80_r68938Nucleotide GPCRshttp://www.wikipathways.org/instance/WP80_r689381212wikipathwaysCC-BY 3.010161|1241|134|135|136|140|2846|5028|5029|5030...10161|1241|134|135|136|140|2846|5028|5029|5030...
1623WP98_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", "1622 WP80_r68938 Nucleotide GPCRs \n", "1623 WP98_r72088 Prostaglandin Synthesis and Regulation \n", "\n", " url n_genes \\\n", "1622 http://www.wikipathways.org/instance/WP80_r68938 12 \n", "1623 http://www.wikipathways.org/instance/WP98_r72088 30 \n", "\n", " n_coding_genes source license \\\n", "1622 12 wikipathways CC-BY 3.0 \n", "1623 30 wikipathways CC-BY 3.0 \n", "\n", " genes \\\n", "1622 10161|1241|134|135|136|140|2846|5028|5029|5030... \n", "1623 1583|1906|1909|1910|301|302|306|307|308|309|32... \n", "\n", " coding_genes \n", "1622 10161|1241|134|135|136|140|2846|5028|5029|5030... \n", "1623 1583|1906|1909|1910|301|302|306|307|308|309|32... " ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "commit = '4916b525722f94f61d59ed38cb67aa3052404610'\n", "url = rawgit('dhimmel', 'pathways', commit, 'data/pathways.tsv')\n", "pathway_df = pandas.read_table(url)\n", "pathway_df = pathway_df[pathway_df.n_coding_genes > 1]\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 = {'url': row.url, 'license': row.license}\n", " graph.add_node(kind='pathway', identifier=pathway_id, name=row['name'], data=data)\n", " \n", " for gene in row.coding_genes.split('|'):\n", " gene = int(gene)\n", " source_id = 'gene', gene\n", " target_id = 'pathway', pathway_id\n", " data = {'unbiased': False, 'url': row.url, 'license': row.license}\n", " graph.add_edge(source_id, target_id, 'participates', 'both', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Gene Ontology Domains" ] }, { "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", " \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": 15, "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": 16, "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('_', ' ')\n", " data = {'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 = {'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": 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", " \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": 17, "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": 18, "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": 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", "
slim_idslim_nameentrez_gene_idgene_symboldirectionlog2_fold_changep_adjusted
0DOID:10652Alzheimer's disease65985AACSdown-0.0360000
1DOID:10652Alzheimer's disease79719AAGABdown-0.0518230
\n", "
" ], "text/plain": [ " slim_id slim_name entrez_gene_id gene_symbol direction \\\n", "0 DOID:10652 Alzheimer's disease 65985 AACS down \n", "1 DOID:10652 Alzheimer's disease 79719 AAGAB down \n", "\n", " log2_fold_change p_adjusted \n", "0 -0.036000 0 \n", "1 -0.051823 0 " ] }, "execution_count": 19, "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", "stargeo_df.head(2)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [], "source": [ "for i, row in stargeo_df.iterrows():\n", " source_id = 'disease', row.slim_id\n", " target_id = 'gene', row.entrez_gene_id\n", " kind = row.direction + 'regulates'\n", " data = {'unbiased': True, 'license': 'CC0 1.0'}\n", " graph.add_edge(source_id, target_id, kind, 'both', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Chemical similarity" ] }, { "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", "
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": 21, "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": 22, "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 = {'similarity': row.similarity, 'unbiased': True, 'license': 'CC0 1.0'}\n", " graph.add_edge(source_id, target_id, 'resembles', 'both', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Symptom edges" ] }, { "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", " \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": 23, "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": 24, "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 = {'unbiased': False, 'license': 'CC0 1.0'}\n", " graph.add_edge(source_id, target_id, 'presents', 'both', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Disease-localization edges" ] }, { "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", " \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": 25, "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": 26, "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 = {'unbiased': False, 'license': 'CC0 1.0'}\n", " graph.add_edge(source_id, target_id, 'localizes', 'both', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Disease-disease similarity" ] }, { "cell_type": "code", "execution_count": 27, "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": 27, "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": 28, "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 = {'unbiased': False, 'license': 'CC0 1.0'}\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": 29, "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": 29, "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": 30, "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", " graph.add_edge(source_id, target_id, 'expresses', 'both', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Anatomy-gene differential expression" ] }, { "cell_type": "code", "execution_count": 31, "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": 31, "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": 32, "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 = {'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": 33, "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", "
drugbank_identrez_gene_idsourcespubmed_idsactionsaffinity_nMlicense
0DB000142798DrugBank (target)20053189agonistNaNNaN
1DB000143973DrugBank (target)17016423|17139284|20053189agonistNaNNaN
\n", "
" ], "text/plain": [ " drugbank_id entrez_gene_id sources pubmed_ids \\\n", "0 DB00014 2798 DrugBank (target) 20053189 \n", "1 DB00014 3973 DrugBank (target) 17016423|17139284|20053189 \n", "\n", " actions affinity_nM license \n", "0 agonist NaN NaN \n", "1 agonist NaN NaN " ] }, "execution_count": 33, "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": 34, "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':\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": 35, "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": 35, "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", "ppi_df.head(2)" ] }, { "cell_type": "code", "execution_count": 36, "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": 37, "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", "
source_entreztarget_entrezcorrelationn_ucsc_genes
29932950.776231
469233130.794721
\n", "
" ], "text/plain": [ " source_entrez target_entrez correlation n_ucsc_genes\n", "29 9 3295 0.77623 1\n", "46 9 23313 0.79472 1" ] }, "execution_count": 37, "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", "erc_df.head(2)" ] }, { "cell_type": "code", "execution_count": 38, "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 = {'unbiased': True}\n", " graph.add_edge(source_id, target_id, 'covaries', 'both', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## MSigDB -- Perturbations" ] }, { "cell_type": "code", "execution_count": 39, "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", "
collectiongene_seturlgenes
0c1.allchr10p11http://www.broadinstitute.org/gsea/msigdb/card...58|1326|3688|3799|6840|6935|7581|7587|8325|845...
1c1.allchr10p12http://www.broadinstitute.org/gsea/msigdb/card...783|1390|4360|8028|8029|8559|8829|9317|10529|2...
\n", "
" ], "text/plain": [ " collection gene_set url \\\n", "0 c1.all chr10p11 http://www.broadinstitute.org/gsea/msigdb/card... \n", "1 c1.all chr10p12 http://www.broadinstitute.org/gsea/msigdb/card... \n", "\n", " genes \n", "0 58|1326|3688|3799|6840|6935|7581|7587|8325|845... \n", "1 783|1390|4360|8028|8029|8559|8829|9317|10529|2... " ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "commit = '019dc51bf24d79c035741b01b0641c52c10cfabc'\n", "url = rawgit('dhimmel', 'msigdb', commit, 'data/msigdb.tsv')\n", "msigdb_df = pandas.read_table(url)\n", "msigdb_df.head(2)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [], "source": [ "for i, row in msigdb_df[msigdb_df.collection == 'c2.cgp'].iterrows():\n", " graph.add_node('perturbation', row.gene_set, data={'url': row.url})\n", " genes = [int(gene) for gene in row.genes.split('|')]\n", " target_id = 'perturbation', row.gene_set\n", " for gene in genes:\n", " source_id = 'gene', gene\n", " data = {'unbiased': False}\n", " graph.add_edge(source_id, target_id, 'regulates', 'both', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Indications" ] }, { "cell_type": "code", "execution_count": 41, "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", "
drugdiseaseCSHAJGPKCSH_notesAJG_notesPK_notesgoogleuptodatedrug_urldisease_urltie3-person consensuspouya agreed with at least one persondrugbank_iddoid_idkind
0Acarbosetype 2 diabetes mellitusDMSYMDM(glucosidase inhibitor)NaNNaNhttps://www.google.com/webhp#q=Acarbosehttp://www.uptodate.com/contents/search?search...http://www.drugbank.ca/drugs/DB00284http://www.disease-ontology.org/term/DOID%3A9352TrueFalseTrueDB00284DOID:9352treats
1AcebutololhypertensionDMSYMDM(cardioselective beta blockerNaNNaNhttps://www.google.com/webhp#q=Acebutololhttp://www.uptodate.com/contents/search?search...http://www.drugbank.ca/drugs/DB01193http://www.disease-ontology.org/term/DOID%3A10763TrueFalseTrueDB01193DOID:10763treats
\n", "
" ], "text/plain": [ " drug disease CSH AJG PK \\\n", "0 Acarbose type 2 diabetes mellitus DM SYM DM \n", "1 Acebutolol hypertension DM SYM DM \n", "\n", " CSH_notes AJG_notes PK_notes \\\n", "0 (glucosidase inhibitor) NaN NaN \n", "1 (cardioselective beta blocker NaN NaN \n", "\n", " google \\\n", "0 https://www.google.com/webhp#q=Acarbose \n", "1 https://www.google.com/webhp#q=Acebutolol \n", "\n", " uptodate \\\n", "0 http://www.uptodate.com/contents/search?search... \n", "1 http://www.uptodate.com/contents/search?search... \n", "\n", " drug_url \\\n", "0 http://www.drugbank.ca/drugs/DB00284 \n", "1 http://www.drugbank.ca/drugs/DB01193 \n", "\n", " disease_url tie 3-person consensus \\\n", "0 http://www.disease-ontology.org/term/DOID%3A9352 True False \n", "1 http://www.disease-ontology.org/term/DOID%3A10763 True False \n", "\n", " pouya agreed with at least one person drugbank_id doid_id kind \n", "0 True DB00284 DOID:9352 treats \n", "1 True DB01193 DOID:10763 treats " ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "commit = '49cf8e3858f124e552051fc1e8c1c229a43dadf6'\n", "url = rawgit('dhimmel', 'indications', commit, 'curation/pk/curation-PK.tsv')\n", "indication_df = pandas.read_table(url)\n", "indication_df['drugbank_id'] = indication_df.drug_url.map(lambda x: x.rsplit('/', 1)[-1])\n", "indication_df['doid_id'] = indication_df.disease_url.map(lambda x: x.rsplit('/', 1)[-1].replace('%3A', ':'))\n", "# Use PK's calls, excluding lone calls.\n", "# indication_df = indication_df[indication_df['pouya agreed with at least one person']] # exclude lone calls\n", "dm_df = indication_df.query(\"PK == 'DM'\").copy()\n", "dm_df['kind'] = 'treats'\n", "sym_df = indication_df.query(\"PK == 'SYM'\").copy()\n", "sym_df['kind'] = 'palliates'\n", "indication_df = pandas.concat([dm_df, sym_df])\n", "indication_df.head(2)" ] }, { "cell_type": "code", "execution_count": 42, "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 = {'unbiased': False, 'license': 'CC0 1.0'}\n", " graph.add_edge(source_id, target_id, row['kind'], 'both', data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## LINCS compound-gene dysregulation" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": true }, "outputs": [], "source": [ "commit = 'abcb12f942f93e3ee839e5e3593f930df2c56845'" ] }, { "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", "
perturbagenentrez_gene_idz_scoresymbolstatusdirectionnlog10_bonferroni_pval
0DB0001466764.844SPAG4measuredup2.905
1DB000911625.960AARSmeasuredup144.863
\n", "
" ], "text/plain": [ " perturbagen entrez_gene_id z_score symbol status direction \\\n", "0 DB00014 6676 4.844 SPAG4 measured up \n", "1 DB00091 16 25.960 AARS measured up \n", "\n", " nlog10_bonferroni_pval \n", "0 2.905 \n", "1 144.863 " ] }, "execution_count": 44, "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.head(2)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [], "source": [ "mapper = {'up': 'upregulates', 'down': 'downregulates'}\n", "for i, row in l1000_df.iterrows():\n", " source_id = 'compound', row.perturbagen\n", " target_id = 'gene', row.entrez_gene_id\n", " data = {'z_score': row.z_score, 'method': row.status, 'unbiased': True}\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": 46, "metadata": { "collapsed": true }, "outputs": [], "source": [ "url = rawgit('dhimmel', 'lincs', commit, 'data/consensi/signif/dysreg-knockdown.tsv')\n", "l1000_kd_df = pandas.read_table(url)\n", "\n", "url = rawgit('dhimmel', 'lincs', commit, 'data/consensi/signif/dysreg-overexpression.tsv')\n", "l1000_oe_df = pandas.read_table(url)" ] }, { "cell_type": "code", "execution_count": 47, "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
02133-5.495ADMimputeddown3.596knockdown downregulates
12501-4.317ALDH7A1measureddown1.811knockdown downregulates
\n", "
" ], "text/plain": [ " perturbagen entrez_gene_id z_score symbol status direction \\\n", "0 2 133 -5.495 ADM imputed down \n", "1 2 501 -4.317 ALDH7A1 measured down \n", "\n", " nlog10_bonferroni_pval kind \n", "0 3.596 knockdown downregulates \n", "1 1.811 knockdown downregulates " ] }, "execution_count": 47, "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": 48, "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 = {'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": 49, "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": 49, "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": 50, "metadata": { "collapsed": false }, "outputs": [], "source": [ "for i, row in side_effect_df.iterrows():\n", " umls_id = row['umls_cui_from_meddra']\n", " data = {'url': 'http://sideeffects.embl.de/se/{}/'.format(umls_id), 'license': 'CC BY-NC-SA 4.0'}\n", " graph.add_node(kind='side effect', identifier=umls_id, name=row['side_effect_name'])" ] }, { "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", "
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": 51, "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": 52, "metadata": { "collapsed": false }, "outputs": [], "source": [ "for i, row in sider_df.iterrows():\n", " source_id = 'compound', row.drugbank_id\n", " target_id = 'side effect', row.umls_cui_from_meddra\n", " data = {'unbiased': False, 'license': 'CC BY-NC-SA 4.0'}\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": 53, "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": 54, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Create and save degree distribution vizualizations\n", "hetio.stats.plot_degrees(graph, 'viz/degrees.pdf')" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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
9anatomyA44022
8biological processBP1113810
1cellular componentCC113910
7compoundC7155218
10diseaseD81371
5geneG17209451540
3molecular functionMF128840
0pathwayPW116200
6perturbationPB133960
4side effectSE1573433
2symptomS143823
\n", "
" ], "text/plain": [ " metanode abbreviation metaedges nodes unconnected_nodes\n", "9 anatomy A 4 402 2\n", "8 biological process BP 1 11381 0\n", "1 cellular component CC 1 1391 0\n", "7 compound C 7 1552 18\n", "10 disease D 8 137 1\n", "5 gene G 17 20945 1540\n", "3 molecular function MF 1 2884 0\n", "0 pathway PW 1 1620 0\n", "6 perturbation PB 1 3396 0\n", "4 side effect SE 1 5734 33\n", "2 symptom S 1 438 23" ] }, "execution_count": 55, "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": 56, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "49880" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Total number of nodes\n", "metanode_df.nodes.sum()" ] }, { "cell_type": "code", "execution_count": 57, "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 - geneCbG10747137715860
4compound - causes - side effectCcSE138944107157010
5compound - downregulates - geneCdG36396734476236396
6compound - palliates - diseaseCpD390221500
7compound - resembles - compoundCrC6486104210546486
8compound - treats - diseaseCtD755387770
9compound - upregulates - geneCuG32069703495132069
10disease - associates - geneDaG1262313453921284
11disease - downregulates - geneDdG48688461653048688
12disease - localizes - anatomyDlA36021333980
13disease - presents - symptomDpS33571334150
14disease - resembles - diseaseDrD5431121060
15disease - upregulates - geneDuG50287461619550287
16gene - covaries - geneGcG616909043953261690
17gene - interacts - geneGiG14716495261408415517
18gene - participates - biological processGpBP55950414772113810
19gene - participates - cellular componentGpCC735661058013910
20gene - participates - molecular functionGpMF972221306328840
21gene - participates - pathwayGpPW78045941916200
22gene > regulates > geneGr>G36231046347373362310
23perturbation - regulates - genePBrG3665203396182450
\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 10747 \n", "4 compound - causes - side effect CcSE 138944 \n", "5 compound - downregulates - gene CdG 36396 \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 32069 \n", "10 disease - associates - gene DaG 12623 \n", "11 disease - downregulates - gene DdG 48688 \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 50287 \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 78045 \n", "22 gene > regulates > gene Gr>G 362310 \n", "23 perturbation - regulates - gene PBrG 366520 \n", "\n", " source_nodes target_nodes unbiased \n", "0 36 15097 102240 \n", "1 241 18094 453477 \n", "2 36 15929 97848 \n", "3 1377 1586 0 \n", "4 1071 5701 0 \n", "5 734 4762 36396 \n", "6 221 50 0 \n", "7 1042 1054 6486 \n", "8 387 77 0 \n", "9 703 4951 32069 \n", "10 134 5392 1284 \n", "11 46 16530 48688 \n", "12 133 398 0 \n", "13 133 415 0 \n", "14 112 106 0 \n", "15 46 16195 50287 \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 9419 1620 0 \n", "22 4634 7373 362310 \n", "23 3396 18245 0 " ] }, "execution_count": 57, "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": 58, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "2817403" ] }, "execution_count": 58, "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": 59, "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": 60, "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": 61, "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": 62, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Write graph as json\n", "path = 'data/hetnet.json.gz'\n", "hetio.readwrite.write_graph(graph, path)" ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "93cc031ecf72db52a73ff0a180792f5a917e8047d4dfcb109a595b7315705eb1 data/hetnet.json.gz\r\n" ] } ], "source": [ "! sha256sum data/hetnet.json.gz" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Barplots of metaedge and metanode counts" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\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": 66, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZQAAAGoCAYAAABhfRN2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXmYXGWV/z8hgAIJSEISiewRv+AyjKIgTAhuyKai4wa4\ngoIgIuI2DoILw+IyKOCwKIJsIiLu7CqjrCo6KuYnfsXEBpQtJIEEEwIk/fvj3EpXmnTXW7erKtv5\nPE891XX7PffeulV1z/uedVR/fz9JkiRJMlLWWtEnkCRJkqwepEJJkiRJOkIqlCRJkqQjpEJJkiRJ\nOkIqlCRJkqQjpEJJkiRJOsLa3T6ApE8ArwPWAc4EbgDOB5YA020fUY07BDgUeAI40faVkp4OXAxM\nBOYB77I9W9JLgVOrsT+xfXy1j08B+1bbj7Z9W7ffX5IkSRJ0dYUiaXdgF9u7Ai8DtgC+BBxje3dg\nLUn7SZoEHAnsAuwFnCxpHeBw4Hbb04CLgOOqXZ8F7G97N2BnSTtIeiEwzfbOwAHAGd18b0mSJMmy\ndNvktScwXdIPgB8BVwAvsn1j9f+rgT2AnYCbbD9pex5wJ7ADMBW4pmnsKyWNBda13Vdtv7bax1Tg\nOgDb9wCjJY3v8vtLkiRJKrpt8tqEWJW8BtiGUCrNSmw+sCEwFnikafujwEaDts9v2jZv0D62ARYC\ns5ezj+ZtSZIkSZfotkKZDdxh+0ngL5IeAzZr+v9Y4GFCQWw4aPvcavvYQWPnDzH28aaxzeOH5Mkn\nF/evvfboNt9SkiTJGs+o5W3stkK5Cfgg8GVJk4ENgJ9J2t32L4C9geuB24ATJa0LrAdsB0wHbgH2\nAX5TPd9oe76kRZK2BvoIs9pngMXA5yWdAmwOjLI9Z7iTmzt3QYffbpIkyerPhAljl7u9qwqlitTa\nTdKvCY12OKEEvl453e8ALrfdL+l0QgGNIpz2j0s6C7hA0o3AIuDAateHAZcQ5rPrGtFc1bhbq30c\n0c33liRJkizLqDW52vCsWfPX3DefJElSkwkTxi7X5JWJjUmSJElHSIWSJEmSdIRUKEmSJElHSIWS\nJEmSdIRUKEmSJElHSIWSJEmSdIRUKEmSJElHSIWSJEmSdIRUKEmSJElHSIWSJEmSdISud2xMkiRJ\nVk4WL15MX9/M4vFbbbUNo0cPXaE9FUqSJMkaSl/fTO666Cq2GD+p5di7Zz8A79iHKVO2HXJMKpQk\nSZI1mC3GT2LKxM1aDywgfShJkiRJR0iFkiRJknSEVChJkiRJR0iFkiRJknSEVChJkiRJR0iFkiRJ\nknSEVChJkiRJR0iFkiRJknSEVChJkiRJR8hM+SRJklWcTtfkqksqlCRJklWcvr6Z9J3/C7YYP7nl\n2Ltn3wvvZtiaXHVJhZIkSbIasMX4yUyZuMUKPYf0oSRJkiQdIRVKkiRJ0hFSoSRJkiQdIRVKkiRJ\n0hG67pSX9Fvgkerl34CTgPOBJcB020dU4w4BDgWeAE60faWkpwMXAxOBecC7bM+W9FLg1GrsT2wf\nX+3jU8C+1fajbd/W7feXJEmSBF1doUh6GoDtV1SP9wBfAo6xvTuwlqT9JE0CjgR2AfYCTpa0DnA4\ncLvtacBFwHHVrs8C9re9G7CzpB0kvRCYZntn4ADgjG6+tyRJkmRZum3y2gHYQNK1kn4qaWfgRbZv\nrP5/NbAHsBNwk+0nbc8D7qxkpwLXNI19paSxwLq2+6rt11b7mApcB2D7HmC0pPFdfn9JkiRJRbcV\nygLgi7b3JFYb3wRGNf1/PrAhMJYBsxjAo8BGg7bPb9o2b9A+Bo9t3keSJEnSA7rtQ/kL8FcA23dK\nmg28qOn/Y4GHCQWx4aDtc6vtYweNnT/E2MebxjaPH5KNN16ftdfufPmBJEmSXjJ37hgeamP8uHFj\nmDBhLHPnjmF2Dbmh6LZCORh4AXCEpMmEIrhO0u62fwHsDVwP3AacKGldYD1gO2A6cAuwD/Cb6vlG\n2/MlLZK0NdAH7Al8BlgMfF7SKcDmwCjbc4Y7ublzF3T47SZJkvSeOXMebXv8rFnza8sNpVS6rVDO\nBb4h6UYiquvdwGzg65XT/Q7gctv9kk4HbiJMYsfYflzSWcAFlfwi4MBqv4cBlxAmu+sa0VzVuFur\nfRzR5feWJEmSNDGqv79/RZ/DCmPWrPlr7ptPkmS1YcaMO1ny4zuLannNePBu1nrttkyZsi0zZtxJ\n/1W/ZcrEzQrk/s6ofXZkypRtmTBh7KjljcnExiRJkqQjpEJJkiRJOkIqlCRJkqQjpEJJkiRJOkIq\nlCRJkqQjpEJJkiRJOkIqlCRJkqQjpEJJkiRJOkIqlCRJkqQjpEJJkiRJOkIqlCRJkqQjpEJJkiRJ\nOkIqlCRJkqQjpEJJkiRJOkIqlCRJkqQjpEJJkiRJOkIqlCRJkqQjpEJJkiRJOkIqlCRJkqQjpEJJ\nkiRJOkIqlCRJkqQjpEJJkiRJOkIqlCRJkqQjpEJJkiRJOkIqlCRJkqQjpEJJkiRJOkIqlCRJkqQj\npEJJkiRJOkIqlCRJkqQjpEJJkiRJOsLa3T6ApInAb4BXAYuB84ElwHTbR1RjDgEOBZ4ATrR9paSn\nAxcDE4F5wLtsz5b0UuDUauxPbB9f7eNTwL7V9qNt39bt95YkSZIM0NUViqS1gbOBBdWmLwHH2N4d\nWEvSfpImAUcCuwB7ASdLWgc4HLjd9jTgIuC4ah9nAfvb3g3YWdIOkl4ITLO9M3AAcEY331eSJEny\nVLpt8vpvQgHcC4wCXmT7xup/VwN7ADsBN9l+0vY84E5gB2AqcE3T2FdKGgusa7uv2n5ttY+pwHUA\ntu8BRksa3+X3liRJkjTRNZOXpHcDD9r+iaRjqs3NCmw+sCEwFnikafujwEaDts9v2jZv0D62ARYC\ns5ezj+ZtT2Hjjddn7bVHl7+pJEmSlZC5c8fwUBvjx40bw4QJY5k7d8zwN8kh5Iaimz6Ug4AlkvYg\nVhwXAhOa/j8WeJhQEBsO2j632j520Nj5Q4x9vGls8/hhmTt3QashSZIkKz1z5jza9vhZs+bXlhtK\nqXTN5GV7d9svt/1y4PfAO4CrJU2rhuwN3AjcBkyVtK6kjYDtgOnALcA+1dh9gBttzwcWSdpa0ihg\nz2oftwB7SholaQtglO053XpvSZIkyVPpepTXID4KnFM53e8ALrfdL+l04CbCz3KM7cclnQVcIOlG\nYBFwYLWPw4BLCGV4XSOaqxp3a7WPI3r5ppIkSRIY1d/fv6LPYYUxa9b8NffNJ0my2jBjxp0s+fGd\nTJm4ReuxD97NWq/dlilTtmXGjDvpv+q3TJm4WYHc3xm1z45MmbItEyaMHbW8MZnYmCRJknSEVChJ\nkiRJR0iFkiRJknSEVChJkiRJR0iFkiRJknSEVChJkiRJR0iFkiRJknSEXic2JkmSJEOwePFi+vpm\nFo/faqttGD165alHmAolSZKkw7SrGCCUQ1/fTP523v+xxbhntRx/95x/wMEwZcq2dU+z46RCSZIk\n6TB9fTPx+Wbzca0z1wHumXM3vDv+3mLcs5gyYevunVwXSYWSJEnSBTYftwXbTJyyok+jp6RTPkmS\nJOkIqVCSJEmSjpAKJUmSJOkIqVCSJEmSjpAKJUmSJOkIqVCSJEmSjpAKJUmSJOkIqVCSJEmSjpAK\nJUmSJOkIxQpF0qbV826SjpC0QfdOK0mSJFnVKFIoks4CjpX0XOAS4EXAhd08sSRJkmTVonSFshPw\nAeAtwLm23wOUVT1LkiRJ1ghKFcroaux+wNWS1gfS5JUkSZIspVShXAjcB/TZ/hXwW+CrXTurJEmS\nZJWjSKHY/hKwqe03VJt2s31a904rSZIkWdUodcpvCVwj6c4q2usySVt19cySJEmSVYpSk9dXgS8C\njwL3A98io7ySJEmSJkoVyia2rwOw3W/7HGDD7p1WkiRJsqpR2gJ4oaTNgH4ASVOBRa2EJK0FnAMI\nWAIcVsmdX72ebvuIauwhwKHAE8CJtq+U9HTgYmAiMA94l+3Zkl4KnFqN/Ynt46t9fArYt9p+tO3b\nCt9fkiRJMkJKVygfBq4AtpX0eyK58agCudcC/banAscBJwFfAo6xvTuwlqT9JE0CjgR2AfYCTpa0\nDnA4cLvtacBF1T4AzgL2t70bsLOkHSS9EJhme2fgAOCMwveWJEmSdIDSKK/bgJcALwXeCTzb9i8L\n5H5IrDoAtgTmAi+yfWO17WpgDyJx8ibbT9qeB9wJ7ABMBa5pGvtKSWOBdW33VduvrfYxFWiY5e4B\nRksaX/L+kiRJkpFTZPKSdN6gTf2SFgJ3AOfYfnwoWdtLJJ0PvB54M3HzbzCf8MWMBR5p2v4osNGg\n7fObts0btI9tgIXA7OXso3nbMmy88fqsvfboof6dJElSi7lzx7CAhW3JjBs3BoBZPNCWzIQJY5k7\ndwwPtXmshtyQN8hh5Iai1IeyGBgHXFC93p+4sS8GzgYOHk7Y9rslTQRuA9Zr+tdY4GFCQWw4aPvc\navvYQWPnDzH28aaxzeOHZO7cBcP9O0mSpBZz5jzaM5lZs+a3LTtSuaGUSqkP5YW232j7R7Z/BLwN\n2Mr2UcCOQwlJerukT1QvHyMU0G8k7V5t2xu4kVA0UyWtK2kjYDtgOnALsE81dh/gRtvzgUWStpY0\nCtiz2sctwJ6SRknaAhhle07h+0uSJElGSOkKZQNJz7R9f/V6IgMrjeH28T3gG5J+UY37IPBn4OuV\n0/0O4HLb/ZJOB24CRhFO+8erKscXSLqRiA47sNrvYURgwFrAdY1ormrcrdU+jih8b0mSJEkHKFUo\nnwZ+K+kWolDki4GjJH0G+MlQQrYXAG9dzr9etpyx5wLnDtq2kKhwPHjsr4mIsMHbjweOH+Z9JEmS\nJF2iSKHYvkzS9cBuhNnqUNsPSfpFmpWSJEkSaKFQqkTB5fGvkhorgiRJkiRp6ZQfVT12Bt5IZLc/\nTmSjP6+7p5YkSZKsSgy7QrH9WQBJNwO7VD4RJJ0K/G/3Ty9JkiRZVSgNG55AVcerYh0iLyVJkiRJ\ngPIor3OI/JGrCCX0GiAbbCVJkiRLKa3l9UUi7+P9RCmUM2yf2c0TS5IkSVYtSjs2fg7YHribWJm8\nQdIp3TyxJEmSZNWi1IeyJ/AO4DHbjxAFHvfu2lklSZIkqxylCmVJ9dxwzD+taVuSJEmSFCuUy4Bv\nA+MkfQi4gfCpJEmSJAlQXnrl85L2BO4CtgA+bfuKrp5ZkiRJskpRGjaM7WuJ7ohJkiRJ8hRKTV5J\nkiRJMiypUJIkSZKOkAolSZIk6QipUJIkSZKOkAolSZIk6QipUJIkSZKOkAolSZIk6QipUJIkSZKO\nkAolSZIk6QipUJIkSZKOkAolSZIk6QipUJIkSZKOkAolSZIk6QipUJIkSZKOkAolSZIk6QipUJIk\nSZKOUNxgq10krQ2cB2wFrAucCPwJOJ/oRz/d9hHV2EOAQ4EngBNtXynp6cDFwERgHvAu27MlvRQ4\ntRr7E9vHV/v4FLBvtf1o27d1670lSZIkT6WbK5S3Aw/ZngbsBfwP8CXgGNu7A2tJ2k/SJOBIYJdq\n3MmS1gEOB26v5C8Cjqv2exawv+3dgJ0l7SDphcA02zsDBwBndPF9JUmSJMuhmwrlMgaUwGjgSeBF\ntm+stl0N7AHsBNxk+0nb84A7gR2AqcA1TWNfKWkssK7tvmr7tdU+pgLXAdi+BxgtaXwX31uSJEky\niK4pFNsLbP+zUgLfAT4JjGoaMh/YEBgLPNK0/VFgo0Hb5zdtmzdoH4PHNu8jSZIk6RFd86EASNoc\n+B7wP7YvlfSFpn+PBR4mFMSGg7bPrbaPHTR2/hBjH28a2zx+WDbeeH3WXnt0O28pSZKkJXPnjmEB\nC9uSGTduDACzeKAtmQkTxjJ37hgeavNYDbnZNeSGoptO+UmESeoI2/9bbf6dpGm2bwD2Bq4HbgNO\nlLQusB6wHTAduAXYB/hN9Xyj7fmSFknaGugD9gQ+AywGPi/pFGBzYJTtOa3Oce7cBZ16u0mSJEuZ\nM+fRnsnMmjW/bdmRyg2lVLq5QvlP4BnAcVUEVj9wFPCVyul+B3C57X5JpwM3ESaxY2w/Luks4AJJ\nNwKLgAOr/R4GXEKY665rRHNV426t9nFEF99XkiRJshy6plBsfwj40HL+9bLljD0XOHfQtoXAW5Yz\n9tdERNjg7ccDx9c83SRJkmSEZGJjkiRJ0hFSoSRJkiQdIRVKkiRJ0hFSoSRJkiQdIRVKkiRJ0hFS\noSRJkiQdIRVKkiRJ0hFSoSRJkiQdIRVKkiRJ0hFSoSRJkiQdIRVKkiRJ0hFSoSRJkiQdIRVKkiRJ\n0hFSoSRJkiQdoasdG5MkSVZlFi9eTF/fzLZkttpqmy6dzcpPKpQkSZIh6Oubya+/cyeTN9miaPy9\nD90Nb+7ySa3EpEJJkiQZhsmbbMGWz5yyok9jlSAVSpIkqz1puuoNqVCSJFnt6eubyU9/9FcmTdiy\naPwDs+7iVa/r8kmthqRCSZJkjWDShC3ZbHKarrpJhg0nSZIkHSEVSpIkSdIRUqEkSZIkHSEVSpIk\nSdIRUqEkSZIkHSEVSpIkSdIRUqEkSZIkHSEVSpIkSdIRUqEkSZIkHaHrmfKSdgY+Z/vlkqYA5wNL\ngOm2j6jGHAIcCjwBnGj7SklPBy4GJgLzgHfZni3ppcCp1dif2D6+2sengH2r7Ufbvq3b7y1JkiQZ\noKsrFEkfA84BnlZt+hJwjO3dgbUk7SdpEnAksAuwF3CypHWAw4HbbU8DLgKOq/ZxFrC/7d2AnSXt\nIOmFwDTbOwMHAGd0830lSZIkT6XbK5S/Am8gFALAjrZvrP6+Gng1sVq5yfaTwDxJdwI7AFOBzzeN\nPVbSWGBd233V9muBPYBFwHUAtu+RNFrSeNuzu/rukiTpKVk1eOWmqwrF9vclNZf3HNX093xgQ2As\n8EjT9keBjQZtn9+0bd6gfWwDLARmL2cfqVCSZDWir28ml155J5tMKmt49dADd7P/vl0+qWQpva42\nvKTp77HAw4SC2HDQ9rnV9rGDxs4fYuzjTWObxw/Lxhuvz9prj27vHSRJsgyLFy9mxowZxeOnTJnC\n6NGja8nNnTuGTSZtwTPbqBo8btyY6q+5xTLNcn9nUS25BSysJTeLB9qSmTBhLHPnjuGhNo/VkGtn\n1t2QG4peK5T/kzTN9g3A3sD1wG3AiZLWBdYDtgOmA7cA+wC/qZ5vtD1f0iJJWwN9wJ7AZ4DFwOcl\nnQJsDoyyPafVycydu6DDby9J1jxmzLiTj155CxtMfFbLsf988B/89767MmXKtsyYcScnX/UnNpy0\n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\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 }