PubMed representa más de 28 millones de citas (resúmenes y títulos) de literatura biomédica de revistas de ciencias de la vida, libros en línea y MEDLINE. También la cita puede incluir el texto completo de los artículos. Consulta típica en pubmed -
compuesto natural de diabetes tipo 2Pubchem : una base de datos de más de 100 millones de compuestos químicos y 236 millones de sustancias. La base de datos también muestra la bioactividad de 1,25 millones de compuestos (por ejemplo, la actividad de compuestos contra el cáncer o la inhibición de un gen específico). Por el momento, se conocen unos 9 millones de compuestos químicos orgánicos (sustancias complejas). Los productos químicos inorgánicos pueden ser una gran cantidad: de 10 ** 18
En este artículo, daré ejemplos de compilación de una lista de
genes responsables del mal pronóstico para la supervivencia al cáncer y
el código de búsqueda de compuestos orgánicos y sus números entre todas las moléculas químicas de la base PubChem. No habrá aprendizaje automático en este artículo (se necesitará aprendizaje automático en el próximo artículo sobre biomarcadores de diabetes, determinar la edad de una persona por expresión de ARN, detección de sustancias anticancerígenas).
Para continuar, instalaremos los paquetes de Python necesarios Biopython y pubchempy.
sudo conda install biopython pip install pubchempy
PubMed
Extraeremos los genes por su sobreexpresión y subexpresión en combinación con un mal pronóstico del cáncer: así es como se ve un título típico, una solicitud de pubmed y el gen objetivo:
('La alta expresión de DEK predice un mal pronóstico del adenocarcinoma gástrico', 'DEK mal pronóstico', 'DEK', 277, 15)
Por qué esto es necesario: el efecto farmacológico de las moléculas y sus combinaciones en los objetivos asociados con un mal pronóstico del cáncer se puede calcular a partir de los genes. (Por ejemplo, basado en pubchem o LINCS).
Subimos archivos con nombres de genes (aproximadamente 12000):
Github import csv genes=[]; with open('/Users/andrejeremcuk/Downloads/genes.txt', 'r') as fp : reader = csv.reader(fp, delimiter='\t') for i in range(20000): genes.append(reader.next()) import time import numpy as np genesq=np.genfromtxt('/Users/andrejeremcuk/Downloads/genesq.txt',dtype='str')
Para una solicitud al pubmed, debe indicar su correo electrónico:
from Bio import Entrez from Bio import Medline MAX_COUNT = 100 Entrez.email = '*@yandex.ru' articles=[];genes_cancer_poor=[];genes_cancer_poor1=[];
Consultas y procesamiento de resultados:
for u in range(0,len(genesq)): print u if u%100==0: np.savetxt('/Users/andrejeremcuk/Downloads/genes_cancer_poor.txt', genes_cancer_poor,fmt='%s'); np.savetxt('/Users/andrejeremcuk/Downloads/genes_cancer_poor1.txt', genes_cancer_poor1, fmt='%s') gene=genesq[u];genefullname=genes[u][2] TERM=gene+' '+'poor prognosis' try: h=Entrez.esearch(db='pubmed', retmax=MAX_COUNT, term=TERM) except: time.sleep(5);h=Entrez.esearch(db='pubmed', retmax=MAX_COUNT, term=TERM) result = Entrez.read(h) ids = result['IdList'] h = Entrez.efetch(db='pubmed', id=ids, rettype='medline', retmode='text') ret = Medline.parse(h) fer=[]; for re in ret: try: tr=re['TI']; except: tr='0'; fer.append(tr);
Encontrar palabras clave en el texto del título:
for i in range(len(fer)): gene1=fer[i].find(gene) gene2=fer[i].find(genefullname)
que verificamos el orden en el título y la presencia de las frases más comunes.
if (gene1!=-1)or(gene2!=-1):
Como resultado, obtenemos varias listas: genes con baja y alta expresión con un mal pronóstico del cáncer.
En total, hubo 913 artículos con la entrada de palabras clave y frases objetivo.
PubChem
Esta base de datos proporciona dos formas de acceder a su información: a
través de la API REST en formato json donde la solicitud se ve así:
https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/2516/description/jsonEs importante que las solicitudes a través de esta ruta no puedan ser más de 5 por segundo, pero hasta ahora no he verificado los límites, deberían guardar los proxies.
Y a través de la biblioteca pubchempy:
import pubchempy as pcp c = pcp.Compound.from_cid(5090) c.canonical_smiles
Importe los paquetes de API PUG REST necesarios:
import re import urllib, json, time import numpy as np
Función que borra el texto de las etiquetas HTML:
def cleanhtml(raw_html): cleanr = re.compile('<.*?>') cleantext = re.sub(cleanr, '', raw_html) return cleantext
En el siguiente código, abriremos una descripción en inglés de moléculas de 1 a 100,000 números en pubchem y buscaremos indicios de que esta molécula es de naturaleza orgánica (de una planta animal o como parte de una bebida), mientras que no es tóxica ni cancerígena.
natural=[]; for i in range(1,100000): url = "https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/"+str(i)+"/description/json" time.sleep(0.2) try: response = urllib.urlopen(url) except: time.sleep(12);response = urllib.urlopen(url) data = json.loads(response.read()) op=0;ol=0;ot=0; try: for u in range(1,len(data['InformationList']['Information'])): soup=str(data['InformationList']['Information'][u]['Description']) soup1=cleanhtml(soup) if (soup1.find('carcinogen')!=-1)or(soup1.find('death')!=-1)or(soup1.find('damage')!=-1): break; if (soup1.find('toxic')!=-1): break; if (soup1.find(' plant')!=-1)and(op!=9)and(soup1.find('planting')==-1): natural.append((i,'plant',str(data['InformationList']['Information'][0]['Title'])));op=9; if (soup1.find(' beverages')!=-1)and(ot!=9): natural.append((i,'beverages',str(data['InformationList']['Information'][0]['Title'])));ot=9; if (soup1.find(' animal')!=-1)and(ol!=9): natural.append((i,'animal',str(data['InformationList']['Information'][0]['Title'])));ol=9; except: ii=0; if i%100==0: print i;np.savetxt('/Users/andrejeremcuk/Downloads/natural.txt', natural,fmt='%s', delimiter='<')
Para buscar referencias en el texto de la planta, use .find ('planta'). Al final, guarde el archivo con los compuestos orgánicos resultantes y sus números en PubChem.
→
Github