Skip to content

Instantly share code, notes, and snippets.

@AnnthomyGILLES
Created February 10, 2018 20:34
Show Gist options
  • Save AnnthomyGILLES/388182490f48161318ae0c2297c1b982 to your computer and use it in GitHub Desktop.
Save AnnthomyGILLES/388182490f48161318ae0c2297c1b982 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"MongoDB et Python\n",
"================="
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from pymongo import MongoClient\n",
"import pandas as pd\n",
"\n",
"import datetime\n",
"import pprint\n",
"\n",
"from bioservices import QuickGO\n",
"\n",
"from datetime import datetime\n",
"from bson.objectid import ObjectId\n",
"from collections import defaultdict"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"s = QuickGO(verbose=False)\n",
"\n",
"res = s.Annotation(geneProductId=\"P04637,P51587\",includeFields=\"goName,taxonName,name,synonyms\")"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"res=res[\"results\"]\n",
"for d in res:\n",
" d.update((k, datetime.strptime(v,\"%Y%m%d\")) for k, v in d.items() if k == \"date\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Un apercu des données."
]
},
{
"cell_type": "code",
"execution_count": 97,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"[{'_id': ObjectId('5a66e40979f75dd082aa61bb'),\n",
" 'assignedBy': 'BHF-UCL',\n",
" 'date': datetime.datetime(2009, 6, 17, 0, 0),\n",
" 'evidenceCode': 'ECO:0000314',\n",
" 'extensions': None,\n",
" 'geneProductId': 'UniProtKB:P04637',\n",
" 'goAspect': 'cellular_component',\n",
" 'goEvidence': 'IDA',\n",
" 'goId': 'GO:0005669',\n",
" 'goName': 'transcription factor TFIID complex',\n",
" 'id': 'UniProtKB:P04637!415151352',\n",
" 'interactingTaxonId': 0,\n",
" 'name': 'Cellular tumor antigen p53',\n",
" 'qualifier': 'colocalizes_with',\n",
" 'reference': 'PMID:15053879',\n",
" 'symbol': 'TP53',\n",
" 'synonyms': 'P53_HUMAN,TP53,P53',\n",
" 'targetSets': ['BHF-UCL', 'KRUK'],\n",
" 'taxonId': 9606,\n",
" 'taxonName': 'Homo sapiens',\n",
" 'withFrom': None},\n",
" {'_id': ObjectId('5a66e40979f75dd082aa61bc'),\n",
" 'assignedBy': 'BHF-UCL',\n",
" 'date': datetime.datetime(2009, 12, 11, 0, 0),\n",
" 'evidenceCode': 'ECO:0000314',\n",
" 'extensions': None,\n",
" 'geneProductId': 'UniProtKB:P04637',\n",
" 'goAspect': 'cellular_component',\n",
" 'goEvidence': 'IDA',\n",
" 'goId': 'GO:0016604',\n",
" 'goName': 'nuclear body',\n",
" 'id': 'UniProtKB:P04637!415151353',\n",
" 'interactingTaxonId': 0,\n",
" 'name': 'Cellular tumor antigen p53',\n",
" 'qualifier': 'colocalizes_with',\n",
" 'reference': 'PMID:10360174',\n",
" 'symbol': 'TP53',\n",
" 'synonyms': 'P53_HUMAN,TP53,P53',\n",
" 'targetSets': ['BHF-UCL', 'KRUK'],\n",
" 'taxonId': 9606,\n",
" 'taxonName': 'Homo sapiens',\n",
" 'withFrom': None}]"
]
},
"execution_count": 97,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"res[:2]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### MongoDB [1](http://api.mongodb.com/python/current/tutorial.html),[2](http://api.mongodb.com/python/current/examples/index.html)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Connexion au serveur\n",
"\n",
"Tout d'abord, exécuter le client mongo depuis votre terminal. Par défaut, il se connecte au serveur mongod en localhost sur le port 27017."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True)"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"client = MongoClient('localhost:27017')\n",
"client"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Création d'une base de donnée\n",
"\n",
"Une fois connecté au serveur, il est possible d'accéder aux bases de données. MongoDB crée des bases et des collections automatiquement si elles n'existent pas déjà. Une seule instance MongoDB peut gérer de multiples bases de données indépendantes. En utilisant PyMongo, on accède ou accède au bases de données de la façon suivante:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'GoTerm_database')"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"db = client['GoTerm_database']\n",
"db"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Il est possible de connaitre les bases de données disponibles en utilisant la méthode *database_names()*.NB: les bases de données sans collections ou contenant des collections vides ne seront aps affichées. "
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"['GoTerm_database', 'admin', 'config', 'local']"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"client.database_names()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Les collections\n",
"\n",
"Une collection est un ensemble de document et peut être vu comme une table dans une base de données relationnelle. Les collections et les bases sont créées de façon \"lazy\" c'est-à-dire quand le premier document est inséré. Enfin, MongoDB intègre des index notés _id unique pour chaque document."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"['ontology']"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"collection = db['ontology']\n",
"db.collection_names()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Insertion de documents\n",
"Afin d'insérer un document dans une collection, nous pouvons utiliser la méthode *insert_one()*:"
]
},
{
"cell_type": "code",
"execution_count": 99,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"post = res[0]\n",
"collection.insert_one(post)\n",
"collection"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"De plus, afin d'insérer une série de document il est possible d'utiliser la méthode *insert_many()* qui prend en argument une liste. Cela insérera chaque document contenu dans la liste."
]
},
{
"cell_type": "code",
"execution_count": 179,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<pymongo.results.InsertManyResult at 0xb2ab308>"
]
},
"execution_count": 179,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"collection.insert_many(res)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Requêter les données\n",
"#### Lecture\n",
"\n",
"L'une des principales opérations qu'il est nécessaire de connaitre est de retrouver les données contenues dans les bases. L'objet connection fourni alors 2 méthodes *find_one()* et *find()*:\n",
"- La méthode find_one() extrait et retourner un unique document de la collection. Elle est utile quand nous souhaitons n'extraire qu'un résultat, ou le premier résultat matchant al condition passée en argument:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'_id': ObjectId('5a66e40979f75dd082aa61bb'),\n",
" 'assignedBy': 'BHF-UCL',\n",
" 'date': datetime.datetime(2009, 6, 17, 0, 0),\n",
" 'evidenceCode': 'ECO:0000314',\n",
" 'extensions': None,\n",
" 'geneProductId': 'UniProtKB:P04637',\n",
" 'goAspect': 'cellular_component',\n",
" 'goEvidence': 'IDA',\n",
" 'goId': 'GO:0005669',\n",
" 'goName': 'transcription factor TFIID complex',\n",
" 'id': 'UniProtKB:P04637!415151352',\n",
" 'interactingTaxonId': 0,\n",
" 'name': 'Cellular tumor antigen p53',\n",
" 'qualifier': 'colocalizes_with',\n",
" 'reference': 'PMID:15053879',\n",
" 'symbol': 'TP53',\n",
" 'synonyms': 'P53_HUMAN,TP53,P53',\n",
" 'targetSets': ['BHF-UCL', 'KRUK'],\n",
" 'taxonId': 9606,\n",
" 'taxonName': 'Homo sapiens',\n",
" 'withFrom': None}\n"
]
}
],
"source": [
"pprint.pprint(collection.find_one())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- La méthode find() fonctionne comme la mééthode find_one() tandis qu'elle retourner tous les documents matchant la condition passée en argument. La commande ci-dessous renverrait tous les documents (et itérerait sur chacun d'entre-eux) si nous n'avions pas commandé l'extraction des deux premiers."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'_id': ObjectId('5a66e40979f75dd082aa61bb'),\n",
" 'assignedBy': 'BHF-UCL',\n",
" 'date': datetime.datetime(2009, 6, 17, 0, 0),\n",
" 'evidenceCode': 'ECO:0000314',\n",
" 'extensions': None,\n",
" 'geneProductId': 'UniProtKB:P04637',\n",
" 'goAspect': 'cellular_component',\n",
" 'goEvidence': 'IDA',\n",
" 'goId': 'GO:0005669',\n",
" 'goName': 'transcription factor TFIID complex',\n",
" 'id': 'UniProtKB:P04637!415151352',\n",
" 'interactingTaxonId': 0,\n",
" 'name': 'Cellular tumor antigen p53',\n",
" 'qualifier': 'colocalizes_with',\n",
" 'reference': 'PMID:15053879',\n",
" 'symbol': 'TP53',\n",
" 'synonyms': 'P53_HUMAN,TP53,P53',\n",
" 'targetSets': ['BHF-UCL', 'KRUK'],\n",
" 'taxonId': 9606,\n",
" 'taxonName': 'Homo sapiens',\n",
" 'withFrom': None}\n",
"{'_id': ObjectId('5a66e40979f75dd082aa61bc'),\n",
" 'assignedBy': 'BHF-UCL',\n",
" 'date': datetime.datetime(2009, 12, 11, 0, 0),\n",
" 'evidenceCode': 'ECO:0000314',\n",
" 'extensions': None,\n",
" 'geneProductId': 'UniProtKB:P04637',\n",
" 'goAspect': 'cellular_component',\n",
" 'goEvidence': 'IDA',\n",
" 'goId': 'GO:0016604',\n",
" 'goName': 'nuclear body',\n",
" 'id': 'UniProtKB:P04637!415151353',\n",
" 'interactingTaxonId': 0,\n",
" 'name': 'Cellular tumor antigen p53',\n",
" 'qualifier': 'colocalizes_with',\n",
" 'reference': 'PMID:10360174',\n",
" 'symbol': 'TP53',\n",
" 'synonyms': 'P53_HUMAN,TP53,P53',\n",
" 'targetSets': ['BHF-UCL', 'KRUK'],\n",
" 'taxonId': 9606,\n",
" 'taxonName': 'Homo sapiens',\n",
" 'withFrom': None}\n"
]
}
],
"source": [
"for post in collection.find()[:2]:\n",
" pprint.pprint(post)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Comptage\n",
"\n",
"Combien de document il y a-t-il dans la collection? Combiend de document correspondent à al requête? La méthode *count()* réponds à ces questions.\n",
"Nous comptons ci-dessous combien de documents contient la collection."
]
},
{
"cell_type": "code",
"execution_count": 188,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"100"
]
},
"execution_count": 188,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"collection.count()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Conditions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Les requêtes MongoDB sont représentées comme une structure JSON. Pour construire une requête, il suffit juste de spécifier un dictionnaire contenant les propriétés que nous souhaitons retrouver. "
]
},
{
"cell_type": "code",
"execution_count": 194,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" Il y a 98 GO term annotés Molecular Function, 2 Cellular Component et 0 Biological Process\n"
]
}
],
"source": [
"mf=collection.find({\"goAspect\": \"molecular_function\"}).count()\n",
"cc=collection.find({\"goAspect\": \"cellular_component\"}).count()\n",
"bp=collection.find({\"goAspect\": \"biological_process\"}).count()\n",
"print(\" Il y a {} GO term annotés Molecular Function, {} Cellular Component et {} Biological Process\".format(mf,cc,bp))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Les opérateurs de requêtes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Les requêtes peuvent également faire appel aux opérateurs. Ces opérateurs sont notamment gt, gte, lt, lte, ne, nin, regex, exists, not, or, et <a href=\"https://docs.mongodb.com/manual/reference/operator/query/\" title=\"Documentation MongoDB\">bien d'autres</a> . La requête suivante ira extraire tous les GO term antérieur au 11 Juillet 2007.\n",
"\n",
"*NB: Nous avons converti les éléments dates du json afin d'en faire des objets datetime, aisément manipulable en python*"
]
},
{
"cell_type": "code",
"execution_count": 197,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Il y a 16 GO term antérieurs au 11 Juillet 2007\n"
]
}
],
"source": [
"date = datetime.strptime(\"11/07/2007\", \"%d/%m/%Y\")\n",
"_=collection.find({\"date\": {\"$lt\":date}}).count()\n",
"print(\"Il y a {} GO term antérieurs au 11 Juillet 2007\".format(_))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Extraction des GO term dont le \"qualifier\" n'est pas \"enables\""
]
},
{
"cell_type": "code",
"execution_count": 200,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'_id': ObjectId('5a6618bd79f75da856687485'),\n",
" 'assignedBy': 'BHF-UCL',\n",
" 'date': datetime.datetime(2009, 6, 17, 0, 0),\n",
" 'evidenceCode': 'ECO:0000314',\n",
" 'extensions': None,\n",
" 'geneProductId': 'UniProtKB:P04637',\n",
" 'goAspect': 'cellular_component',\n",
" 'goEvidence': 'IDA',\n",
" 'goId': 'GO:0005669',\n",
" 'goName': 'transcription factor TFIID complex',\n",
" 'id': 'UniProtKB:P04637!415151352',\n",
" 'interactingTaxonId': 0,\n",
" 'name': 'Cellular tumor antigen p53',\n",
" 'qualifier': 'colocalizes_with',\n",
" 'reference': 'PMID:15053879',\n",
" 'symbol': 'TP53',\n",
" 'synonyms': 'P53_HUMAN,TP53,P53',\n",
" 'targetSets': ['BHF-UCL', 'KRUK'],\n",
" 'taxonId': 9606,\n",
" 'taxonName': 'Homo sapiens',\n",
" 'withFrom': None}\n",
"{'_id': ObjectId('5a6618bd79f75da856687486'),\n",
" 'assignedBy': 'BHF-UCL',\n",
" 'date': datetime.datetime(2009, 12, 11, 0, 0),\n",
" 'evidenceCode': 'ECO:0000314',\n",
" 'extensions': None,\n",
" 'geneProductId': 'UniProtKB:P04637',\n",
" 'goAspect': 'cellular_component',\n",
" 'goEvidence': 'IDA',\n",
" 'goId': 'GO:0016604',\n",
" 'goName': 'nuclear body',\n",
" 'id': 'UniProtKB:P04637!415151353',\n",
" 'interactingTaxonId': 0,\n",
" 'name': 'Cellular tumor antigen p53',\n",
" 'qualifier': 'colocalizes_with',\n",
" 'reference': 'PMID:10360174',\n",
" 'symbol': 'TP53',\n",
" 'synonyms': 'P53_HUMAN,TP53,P53',\n",
" 'targetSets': ['BHF-UCL', 'KRUK'],\n",
" 'taxonId': 9606,\n",
" 'taxonName': 'Homo sapiens',\n",
" 'withFrom': None}\n"
]
}
],
"source": [
"for post in collection.find({\"qualifier\":{\"$nin\":[\"enables\"]}}):\n",
" pprint.pprint(post)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Aggregation [1](http://api.mongodb.com/python/current/examples/aggregation.html),[2](https://www.compose.com/articles/aggregations-in-mongodb-by-example/),[3](https://gist.github.com/alain-andre/8150256)\n",
"\n",
"Les opérations d'aggrégations s'exécutent directement sur les données et retourne un résultat de type collection. Ces opérations \"regroupent\" ensembles les valeurs de multiples documents, et peuvent également procéder à une large variété d'opérations. Les plus pertinentes sont présentées ici.\n",
"#### $group\n",
"Permet de faire un group by SQL et ainsi de retrouver le nombre de X disponibles pour chaque Y."
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[{'_id': 'molecular_function', 'count': 98},\n",
" {'_id': 'cellular_component', 'count': 2}]\n"
]
}
],
"source": [
"pipeline = [{\"$group\": {\"_id\": \"$goAspect\", \"count\": {\"$sum\": 1}}}]\n",
"pprint.pprint(list(collection.aggregate(pipeline)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### $match\n",
"Recherche dans la collection. Dans ce cas nous extrayons les GO term \"Molecular Function\" puis nous les regroupons par goName afin de procéder à un comptage. "
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[{'_id': 'protein binding', 'count': 69},\n",
" {'_id': \"mRNA 3'-UTR binding\", 'count': 1},\n",
" {'_id': 'DNA binding transcription factor activity', 'count': 4},\n",
" {'_id': 'chromatin binding', 'count': 2},\n",
" {'_id': 'transcriptional activator activity, RNA polymerase II transcription '\n",
" 'regulatory region sequence-specific DNA binding',\n",
" 'count': 1},\n",
" {'_id': 'transcription factor activity, TFIID-class binding', 'count': 1},\n",
" {'_id': 'core promoter sequence-specific DNA binding', 'count': 2},\n",
" {'_id': 'TFIID-class transcription factor binding', 'count': 1},\n",
" {'_id': 'transcription cofactor binding', 'count': 1},\n",
" {'_id': 'RNA polymerase II transcription factor activity, sequence-specific '\n",
" 'DNA binding',\n",
" 'count': 2},\n",
" {'_id': 'p53 binding', 'count': 2},\n",
" {'_id': 'damaged DNA binding', 'count': 1},\n",
" {'_id': 'copper ion binding', 'count': 1},\n",
" {'_id': 'RNA polymerase II transcription factor binding', 'count': 1},\n",
" {'_id': 'transcription factor activity, core RNA polymerase binding',\n",
" 'count': 1},\n",
" {'_id': 'RNA polymerase II regulatory region sequence-specific DNA binding',\n",
" 'count': 1},\n",
" {'_id': 'DNA binding', 'count': 5},\n",
" {'_id': 'transcription factor activity, RNA polymerase II proximal promoter '\n",
" 'sequence-specific DNA binding involved in preinitiation complex '\n",
" 'assembly',\n",
" 'count': 1},\n",
" {'_id': 'protease binding', 'count': 1}]\n"
]
}
],
"source": [
"pipeline = [{ \n",
" \"$match\": {\n",
" \"goAspect\": \"molecular_function\"\n",
" }\n",
" },{\"$group\": {\"_id\": \"$goName\", \"count\": {\"$sum\": 1}}}]\n",
"pprint.pprint(list(collection.aggregate(pipeline)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### $project\n",
"Permet de remodeler une collection. Dans le cas ci-dessous nous nous contentons de mettre en majuscule tous les identifiants \"qualifier\" dont le goAspect est *cellular_component*, mais n'importe qu'elle fonction peut être appliquée sur les données."
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[{'_id': 'cellular_component', 'qualifier': 'COLOCALIZES_WITH'},\n",
" {'_id': 'cellular_component', 'qualifier': 'COLOCALIZES_WITH'}]\n"
]
}
],
"source": [
"pipeline=[\n",
" { \n",
" \"$match\": {\n",
" \"goAspect\": \"cellular_component\"\n",
" }\n",
" },\n",
" { \"$project\":\n",
" { \n",
" \"_id\": \"$goAspect\",\n",
" \"qualifier\": {\"$toUpper\": \"$qualifier\" },\n",
" }\n",
" }\n",
"]\n",
"pprint.pprint(list(collection.aggregate(pipeline)))"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"100"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"collection.find().count()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Tri\n",
"MongoDB peut trier les requêtes. "
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'_id': ObjectId('5a6618bd79f75da8566874a4'), 'id': 'UniProtKB:P04637!415151383', 'geneProductId': 'UniProtKB:P04637', 'qualifier': 'enables', 'goId': 'GO:0005515', 'goName': 'protein binding', 'goEvidence': 'IPI', 'goAspect': 'molecular_function', 'evidenceCode': 'ECO:0000353', 'reference': 'PMID:10196247', 'withFrom': [{'connectedXrefs': [{'db': 'UniProtKB', 'id': 'Q00987'}]}], 'taxonId': 9606, 'taxonName': 'Homo sapiens', 'assignedBy': 'IntAct', 'extensions': [{'connectedXrefs': [{'db': 'GO', 'id': '0005634', 'qualifier': 'occurs_in'}]}], 'targetSets': ['BHF-UCL', 'KRUK'], 'symbol': 'TP53', 'date': datetime.datetime(2018, 1, 15, 0, 0), 'interactingTaxonId': 0, 'synonyms': 'P53_HUMAN,TP53,P53', 'name': 'Cellular tumor antigen p53'}\n",
"\n",
"{'_id': ObjectId('5a6618bd79f75da8566874a5'), 'id': 'UniProtKB:P04637!415151384', 'geneProductId': 'UniProtKB:P04637', 'qualifier': 'enables', 'goId': 'GO:0005515', 'goName': 'protein binding', 'goEvidence': 'IPI', 'goAspect': 'molecular_function', 'evidenceCode': 'ECO:0000353', 'reference': 'PMID:10196247', 'withFrom': [{'connectedXrefs': [{'db': 'UniProtKB', 'id': 'Q92793'}]}], 'taxonId': 9606, 'taxonName': 'Homo sapiens', 'assignedBy': 'IntAct', 'extensions': None, 'targetSets': ['BHF-UCL', 'KRUK'], 'symbol': 'TP53', 'date': datetime.datetime(2018, 1, 15, 0, 0), 'interactingTaxonId': 0, 'synonyms': 'P53_HUMAN,TP53,P53', 'name': 'Cellular tumor antigen p53'}\n",
"\n"
]
}
],
"source": [
"results=collection.find().sort([(\"date\", -1)])\n",
"for post in results[:2]:\n",
" print(post,end=\"\\n\\n\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Mise à jour "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Mettre à jour un document d'une collection\n",
"PyMongo peut mettre à jour les documents d'une collection.\n",
"Pour voir le nombre de documents qui ont matché la condition, l'attribut *matched_count* peut être utilisé sur l'objet.\n",
"En revanche pour voir le nombre de document *mis à jour* par l'opération, l'attribut *modified_count* peut être utilisé.\n"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'_id': ObjectId('5a6618bd79f75da856687486'), 'id': 'UniProtKB:P04637!415151353', 'geneProductId': 'UniProtKB:P04637', 'qualifier': 'colocalizes_with', 'goId': 'GO:0016604', 'goName': 'Changement de GoName', 'goEvidence': 'IDA', 'goAspect': 'cellular_component', 'evidenceCode': 'ECO:0000314', 'reference': 'PMID:10360174', 'withFrom': None, 'taxonId': 9606, 'taxonName': 'Homo sapiens', 'assignedBy': 'BHF-UCL', 'extensions': None, 'targetSets': ['BHF-UCL', 'KRUK'], 'symbol': 'TP53', 'date': datetime.datetime(2009, 12, 11, 0, 0), 'interactingTaxonId': 0, 'synonyms': 'P53_HUMAN,TP53,P53', 'name': 'Cellular tumor antigen p53'}\n"
]
}
],
"source": [
"result=collection.update_one({'id': 'UniProtKB:P04637!415151353'},\n",
" {\n",
" \"$set\":{\n",
" 'goName': 'Changement de GoName'\n",
" }\n",
" \n",
" })\n",
"result.matched_count\n",
"result.modified_count\n",
"\n",
"for post in collection.find({'id': 'UniProtKB:P04637!415151353'}):\n",
" print(post)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Mettre à jour plusieurs documents d'une collection"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Matched count 2\n",
"Modified count 0\n",
"{'_id': ObjectId('5a6618bd79f75da856687485'), 'id': 'UniProtKB:P04637!415151352', 'geneProductId': 'UniProtKB:P04637', 'qualifier': 'colocalizes_with', 'goId': 'GO:0005669', 'goName': 'transcription factor TFIID complex', 'goEvidence': 'IDA', 'goAspect': 'cellular_component', 'evidenceCode': 'ECO:0000314', 'reference': 'PMID:15053879', 'withFrom': None, 'taxonId': 9606, 'taxonName': 'Homo erectus', 'assignedBy': 'BHF-UCL', 'extensions': None, 'targetSets': ['BHF-UCL', 'KRUK'], 'symbol': 'TP53', 'date': datetime.datetime(2009, 6, 17, 0, 0), 'interactingTaxonId': 0, 'synonyms': 'P53_HUMAN,TP53,P53', 'name': 'Cellular tumor antigen p53'}\n",
"{'_id': ObjectId('5a6618bd79f75da856687486'), 'id': 'UniProtKB:P04637!415151353', 'geneProductId': 'UniProtKB:P04637', 'qualifier': 'colocalizes_with', 'goId': 'GO:0016604', 'goName': 'Changement de GoName', 'goEvidence': 'IDA', 'goAspect': 'cellular_component', 'evidenceCode': 'ECO:0000314', 'reference': 'PMID:10360174', 'withFrom': None, 'taxonId': 9606, 'taxonName': 'Homo erectus', 'assignedBy': 'BHF-UCL', 'extensions': None, 'targetSets': ['BHF-UCL', 'KRUK'], 'symbol': 'TP53', 'date': datetime.datetime(2009, 12, 11, 0, 0), 'interactingTaxonId': 0, 'synonyms': 'P53_HUMAN,TP53,P53', 'name': 'Cellular tumor antigen p53'}\n"
]
}
],
"source": [
"result=collection.update_many({'goAspect': 'cellular_component'},\n",
" {\n",
" \"$set\":{\n",
" 'taxonName': 'Homo erectus'\n",
" }\n",
" \n",
" })\n",
"print(\"Matched count {}\".format(result.matched_count))\n",
"print(\"Modified count {}\".format(result.modified_count))\n",
"\n",
"for post in collection.find({'goAspect': 'cellular_component'})[:10]:\n",
" print(post)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Remplacer un document d'une collection"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Matched count 1\n",
"Modified count 1\n"
]
}
],
"source": [
"result = collection.replace_one(\n",
" {\"id\": \"UniProtKB:P04637!415151353\"},\n",
" {\n",
" \"nom\": \"Master BIMS\",\n",
" \"addresse\": {\n",
" \"coord\": [-73.9557413, 40.7720266],\n",
" \"street\": \"Place Emile Blondel\",\n",
" \"zipcode\": \"76\"\n",
" }\n",
" }\n",
")\n",
"print(\"Matched count {}\".format(result.matched_count))\n",
"print(\"Modified count {}\".format(result.modified_count))"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'_id': ObjectId('5a66e40979f75dd082aa61bb'), 'nom': 'Master BIMS', 'addresse': {'coord': [-73.9557413, 40.7720266], 'street': 'Place Emile Blondel', 'zipcode': '76'}}\n"
]
}
],
"source": [
"for post in collection.find({\"_id\":ObjectId('5a66e40979f75dd082aa61bb')}):\n",
" print(post)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Indexation\n",
"Comme dans MySQL, les index permettent d’accélérer les requêtes en évitant au moteur de base de données de devoir scanner tous les documents de la collection afin de trouver ceux correspondant à la requête.\n"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"Collection(Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'GoTerm_database'), 'ontology.index')"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"collection.create_index([('goId','text')], name='goId_index')\n",
"collection.index"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Suppression"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Supprimer tous les documents matchant une condition"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"result = collection.delete_many({'goAspect': 'cellular_component'})\n",
"result.deleted_count"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Supprimer tous les documents"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"100"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"result = collection.delete_many({})\n",
"result.deleted_count"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"100"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"collection.find().count()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Supprimer une collection"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"collection.drop()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Représentations de la collection\n",
"La possibilité d'exploiter MongoDB avec Python nous permet également de directement manipuler les bases de données puis de les analyser (analyses statistiques, visualisation,etc). Par exemple, nous pouvons explorer notre collection en utilisant le module pandas."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Et voir les GO les plus représentés dans la base de données."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0xaef5cc0>"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0xaef9908>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df = pd.DataFrame(list(collection.find()))\n",
"df[\"goName\"].value_counts()[:15].plot(kind=\"barh\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ou visualiser rapidement la répartition des GO Aspect."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0xb579e80>"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAckAAAD8CAYAAAAc/1/bAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAD/hJREFUeJzt3XuQX2V9x/H3B4IgUCO3OhTQdZQBgWjAgHgtAlO1cQQL\nFuoNaK2jZQTbYo138NJm0ArMWGEYCkFldIqmmsGpSolQixVNRAhXtRAvFEVGG63WKPDtH79n62/W\nfbIbssmP3X2/Znb2nOc85znf8+zk99lzSZKqQpIk/bbtRl2AJEmPVIakJEkdhqQkSR2GpCRJHYak\nJEkdhqQkSR2GpCRJHYakJEkdhqQkSR0LRl2Atsyee+5ZY2Njoy5DkmaVtWvX3l9Ve03Vz5Cc5cbG\nxlizZs2oy5CkWSXJd6bTz9utkiR1GJKSJHUYkpIkdRiSkiR1GJKSJHUYkpIkdRiSkiR1GJKSJHUY\nkpIkdRiSkiR1GJKSJHUYkpIkdRiSkiR1GJKSJHUYkpIkdRiSkiR1GJKSJHUYkpIkdRiSkiR1GJKS\nJHUYkpIkdRiSkiR1GJKSJHUYkpIkdRiSkiR1GJKSJHUsGHUB2jLr7tnA2LLPTrpt/fKl27gaSZpb\nvJKUJKnDkJQkqcOQlCSpw5CUJKnDkJQkqcOQlCSpw5CUJKnDkJQkqcOQlCSpw5CUJKnDkJQkqcOQ\nlCSpw5CUJKnDkJQkqcOQlCSpw5CUJKnDkJQkqcOQlCSpw5CUJKnDkJQkqcOQlCSpw5CUJKnDkJQk\nqWNGQzLJqUk+1JbPTnLWFP2PSnLVTNYwVyR566hrkKT5blZdSSZZMOoatiFDUpJGbFohmeTVSW5O\nclOSjybZK8mnknytfT17iv2vTbKkLe+ZZP0kfY5I8h9Jbkzy5SQHtPZTk6xKshq4ZhPHeHOSda3G\n5a1tcZKvtNr/OcluQ/Wcl2RNktuTHJ5kZZJvJXlv6zOW5I4kV7Q+n0yyc9t2TKtzXZJLk+zY2tcn\nOSfJ19u2A1v7Lq3fV9t+xw2d28okn2vHPre1LwceneQbSa6Yzs9IkjTzpgzJJAcDbweOrqqnAWcC\nFwDnVdXhwAnAJTNQyx3Ac6vqUOCdwN8ObTsMOLGqfr9T44uA44BntBrPbZs+Ary5qp4KrAPeNbTb\nr6pqCXAR8BngdOAQ4NQke7Q+BwAfrqqnAD8F/iLJTsAK4KSqWgQsAF4/NO79VXUYcCEwfrv5bcDq\nqjoCeD7w/iS7tG2LgZOARcBJSfarqmXA/1bV4qp6xSTn+9oW8Gse/MWGyaZEkjQDpnMleTRwZVXd\nD1BVPwaOBT6U5BvAKuAxSXbdwloWAlcmuQU4Dzh4aNvV7bg9xwKXVdUvxmtMshB4bFVd1/pcDjxv\naJ9V7fs64NaqureqNgJ3Afu1bd+rquvb8seA5zAIzrur6pudcVe272uBsbb8B8CyNl/XAjsBj2/b\nrqmqDVX1S+A24AmbOE/a+V1cVUuqasn2Oy+cqrsk6WF6uM/4tgOObB/s/y9Jr/8D/CaQd+r0eQ/w\nxap6aZIxBmEy7ucPs85N2di+PzS0PL4+Pi81YZ+J65sa98GhcQKcUFV3DndM8owJxx7eR5I0YtO5\nklwNvGz8FmSS3YEvAG8Y75Bk8RRjrAee3pZP7PRZCNzTlk+dRl3DrgZOG3pmuHtVbQB+kuS5rc+r\ngOt6A3Q8Pskz2/LLgX8H7gTGkjx5M8b9PPCGtN8ikhw6jWP/OskOm1mvJGkGTRmSVXUr8D7guiQ3\nAR8EzgCWtBdibgNeN8UwHwBen+RGYM9On3OBv2t9Nutqqqo+x+D26Zp2S3P8WeApDJ7/3czg2d+7\nN2dcBoF4epLbgd2AC9vV82kMbg2vY3DledEU47wH2AG4OcmtbX0qF7f+vrgjSSOSquncQZx/2i3f\nq6rqkBGXskk77r1/7X3K+ZNuW7986TauRpJmhyRr28ubmzSr/p6kJEnb0qx6SSTJIuCjE5o3VtUz\nZvpYVbWewV8JkSTNU7MqJKtqHYNni5IkbXXebpUkqcOQlCSpw5CUJKnDkJQkqcOQlCSpw5CUJKnD\nkJQkqcOQlCSpw5CUJKnDkJQkqcOQlCSpw5CUJKnDkJQkqcOQlCSpw5CUJKnDkJQkqcOQlCSpw5CU\nJKljwagL0JZZtM9C1ixfOuoyJGlO8kpSkqQOQ1KSpA5DUpKkDkNSkqQOQ1KSpA5DUpKkDkNSkqQO\nQ1KSpA5DUpKkDkNSkqQOQ1KSpA5DUpKkDkNSkqQOQ1KSpA5DUpKkDkNSkqQOQ1KSpA5DUpKkDkNS\nkqQOQ1KSpA5DUpKkDkNSkqQOQ1KSpA5DUpKkDkNSkqQOQ1KSpA5DUpKkDkNSkqQOQ1KSpA5DUpKk\nDkNSkqQOQ1KSpA5DUpKkDkNSkqQOQ1KSpA5DUpKkDkNSkqQOQ1KSpA5DUpKkDkNSkqQOQ1KSpA5D\nUpKkDkNSkqQOQ1KSpA5DUpKkDkNSkqQOQ1KSpA5DUpKkDkNSkqQOQ1KSpA5DUpKkDkNSkqQOQ1KS\npI4Foy5AW2bdPRsYW/bZUZchSdvU+uVLt8lxvJKUJKnDkJQkqcOQlCSpw5CUJKnDkJQkqcOQlCSp\nw5CUJKnDkJQkqcOQlCSpw5CUJKnDkJQkqcOQlCSpw5CUJKnDkJQkqcOQlCSpw5CUJKnDkJQkqcOQ\nlCSpw5CUJKnDkJQkqcOQlCSpw5CUJKnDkJQkqcOQlCSpY5uEZJJTk3xohsc8O8lZMzDOjkn+Nck3\nkpw0E7W1cY9PctDQ+ruTHDtT40uStr4Foy5gW0myoKoemGTToQBVtXiGD3k8cBVwWxv/nTM8viRp\nK5v2lWSSsSR3JFmR5JtJrkhybJLrk3wryRFJdk/y6SQ3J/lKkqdOMs5eST6V5Gvt69mtfdcklyVZ\n1/Y/obX/z9C+JyZZMcmYf97GuqmNvXNrX5HkoiQ3AOdOst/vAh8DDm9Xkk9Ksj7Jnm37kiTXtuWz\nk1ya5NokdyU5Y2icV7eab0ry0STPAl4CvH9o3BVJTmz9j0lyYzvXS5Ps2NrXJzknydfbtgM7P4vX\nJlmTZM2Dv9gwrZ+fJGnzbe7t1icDfw8c2L5eDjwHOAt4K3AOcGNVPbWtf2SSMS4Azquqw4ETgEta\n+zuADVW1qO2/ejPqWllVh1fV04DbgT8b2rYv8Kyq+quJO1XVfcBrgC9V1eKq+s8pjnMg8ALgCOBd\nSXZIcjDwduDodvwzq+rLwCrgTRPHTbITsAI4qaoWMbiaf/3QMe6vqsOACxnM62+pqouraklVLdl+\n54VTlCxJerg293br3VW1DiDJrcA1VVVJ1gFjwBMYBB9VtTrJHkkeM2GMY4GDkoyvPybJrq395PHG\nqvrJZtR1SJL3Ao8FdgU+P7Ttyqp6cDPG2pTPVtVGYGOS+4DHAUe3Y9zf6v7xFGMcwGAev9nWLwdO\nB85v6yvb97XAH81Q3ZKkh2FzQ3Lj0PJDQ+sPtbF+PY0xtgOOrKpfDjcOheZENbS8U6fPCuD4qrop\nyanAUUPbfj6NmoY9wG+usCceb/j8H2TrPNMdP8bWGl+SNE0z/Xbrl4BXACQ5isGtw59O6PMF4A3j\nK0nGX5i5msEV1Xj7bm3xh0mekmQ74KWd4/4OcG+SHcaPvwXWA09vyydMo/9q4GVJ9gBIsntr/1mr\na6I7gbEkT27rrwKue9jVSpK2mpkOybOBpye5GVgOnDJJnzOAJe1Fl9uA17X29wK7JbklyU3A81v7\nMgZviX4ZuLdz3HcANwDXA3ds4TmcA1yQZA2Dq7lNqqpbgfcB17W6P9g2fQJ4U3tB50lD/X8JnAZc\n2W5TPwRctIU1S5K2glTV1L30iLXj3vvX3qecP3VHSZpD1i9fukX7J1lbVUum6ue/uCNJUse8eTEk\nyWnAmROar6+q0yfrL0nSvAnJqroMuGzUdUiSZg9vt0qS1GFISpLUYUhKktRhSEqS1GFISpLUYUhK\nktRhSEqS1GFISpLUYUhKktRhSEqS1GFISpLUYUhKktRhSEqS1GFISpLUYUhKktRhSEqS1GFISpLU\nYUhKktSxYNQFaMss2mcha5YvHXUZkjQneSUpSVKHISlJUochKUlShyEpSVKHISlJUochKUlShyEp\nSVKHISlJUochKUlShyEpSVKHISlJUochKUlShyEpSVKHISlJUochKUlShyEpSVKHISlJUochKUlS\nhyEpSVKHISlJUochKUlShyEpSVKHISlJUochKUlShyEpSVKHISlJUkeqatQ1aAsk+Rlw56jrGLE9\ngftHXcSIOQfOATgH46YzD0+oqr2mGmjBzNSjEbqzqpaMuohRSrLGOXAOnAPnYNxMzoO3WyVJ6jAk\nJUnqMCRnv4tHXcAjgHPgHIBzAM7BuBmbB1/ckSSpwytJSZI6DMlZLMkLk9yZ5NtJlo26nm0hyX5J\nvpjktiS3Jjmzte+e5Ook32rfdxt1rVtTku2T3JjkqrY+r84fIMljk3wyyR1Jbk/yzPk2D0n+sv05\nuCXJx5PsNNfnIMmlSe5LcstQW/eck7ylfUbemeQFm3s8Q3KWSrI98A/Ai4CDgD9JctBoq9omHgD+\nuqoOAo4ETm/nvQy4pqr2B65p63PZmcDtQ+vz7fwBLgA+V1UHAk9jMB/zZh6S7AOcASypqkOA7YGT\nmftzsAJ44YS2Sc+5fTacDBzc9vlw++ycNkNy9joC+HZV3VVVvwI+ARw34pq2uqq6t6q+3pZ/xuCD\ncR8G535563Y5cPxoKtz6kuwLLAUuGWqeN+cPkGQh8DzgHwGq6ldV9d/Ms3lg8HfdH51kAbAz8F/M\n8Tmoqn8DfjyhuXfOxwGfqKqNVXU38G0Gn53TZkjOXvsA3xta/35rmzeSjAGHAjcAj6uqe9umHwCP\nG1FZ28L5wN8ADw21zafzB3gi8CPgsnbb+ZIkuzCP5qGq7gE+AHwXuBfYUFVfYB7NwZDeOW/x56Qh\nqVkpya7Ap4A3VtVPh7fV4JXtOfnadpIXA/dV1dpen7l8/kMWAIcBF1bVocDPmXBbca7PQ3vudhyD\nXxh+D9glySuH+8z1OZjMTJ+zITl73QPsN7S+b2ub85LswCAgr6iqla35h0n2btv3Bu4bVX1b2bOB\nlyRZz+AW+9FJPsb8Of9x3we+X1U3tPVPMgjN+TQPxwJ3V9WPqurXwErgWcyvORjXO+ct/pw0JGev\nrwH7J3likkcxeDi9asQ1bXVJwuA51O1V9cGhTauAU9ryKcBntnVt20JVvaWq9q2qMQY/89VV9Urm\nyfmPq6ofAN9LckBrOga4jfk1D98Fjkyyc/tzcQyDZ/TzaQ7G9c55FXBykh2TPBHYH/jq5gzsPyYw\niyX5QwbPp7YHLq2q9424pK0uyXOALwHr+M0zubcyeC75T8Djge8Af1xVEx/uzylJjgLOqqoXJ9mD\n+Xf+ixm8vPQo4C7gNAa/+M+beUhyDnASg7e+bwReA+zKHJ6DJB8HjmLwP338EHgX8Gk655zkbcCf\nMpijN1bVv2zW8QxJSZIm5+1WSZI6DElJkjoMSUmSOgxJSZI6DElJkjoMSUmSOgxJSZI6DElJkjr+\nD9x/Cly2kRG1AAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x518bd30>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df[\"goAspect\"].value_counts().plot(kind=\"barh\")"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>_id</th>\n",
" <th>assignedBy</th>\n",
" <th>date</th>\n",
" <th>evidenceCode</th>\n",
" <th>extensions</th>\n",
" <th>geneProductId</th>\n",
" <th>goAspect</th>\n",
" <th>goEvidence</th>\n",
" <th>goId</th>\n",
" <th>goName</th>\n",
" <th>...</th>\n",
" <th>interactingTaxonId</th>\n",
" <th>name</th>\n",
" <th>qualifier</th>\n",
" <th>reference</th>\n",
" <th>symbol</th>\n",
" <th>synonyms</th>\n",
" <th>targetSets</th>\n",
" <th>taxonId</th>\n",
" <th>taxonName</th>\n",
" <th>withFrom</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>5a66e40979f75dd082aa61bb</td>\n",
" <td>BHF-UCL</td>\n",
" <td>2009-06-17</td>\n",
" <td>ECO:0000314</td>\n",
" <td>None</td>\n",
" <td>UniProtKB:P04637</td>\n",
" <td>cellular_component</td>\n",
" <td>IDA</td>\n",
" <td>GO:0005669</td>\n",
" <td>transcription factor TFIID complex</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>Cellular tumor antigen p53</td>\n",
" <td>colocalizes_with</td>\n",
" <td>PMID:15053879</td>\n",
" <td>TP53</td>\n",
" <td>P53_HUMAN,TP53,P53</td>\n",
" <td>[BHF-UCL, KRUK]</td>\n",
" <td>9606</td>\n",
" <td>Homo sapiens</td>\n",
" <td>None</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1 rows × 21 columns</p>\n",
"</div>"
],
"text/plain": [
" _id assignedBy date evidenceCode extensions \\\n",
"0 5a66e40979f75dd082aa61bb BHF-UCL 2009-06-17 ECO:0000314 None \n",
"\n",
" geneProductId goAspect goEvidence goId \\\n",
"0 UniProtKB:P04637 cellular_component IDA GO:0005669 \n",
"\n",
" goName ... interactingTaxonId \\\n",
"0 transcription factor TFIID complex ... 0 \n",
"\n",
" name qualifier reference symbol \\\n",
"0 Cellular tumor antigen p53 colocalizes_with PMID:15053879 TP53 \n",
"\n",
" synonyms targetSets taxonId taxonName withFrom \n",
"0 P53_HUMAN,TP53,P53 [BHF-UCL, KRUK] 9606 Homo sapiens None \n",
"\n",
"[1 rows x 21 columns]"
]
},
"execution_count": 73,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head(1)"
]
}
],
"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.6.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment