Pregunta

Estoy tratando de conseguir algunos resultados de UniProt, que es una base de datos de proteínas (los detalles no son importantes). Estoy tratando de utilizar una secuencia de comandos que se traduce de un tipo de ID a otro. Yo era capaz de hacer esto manualmente en el navegador, pero no podía hacerlo en Python.

http://www.uniprot.org/faq/28 hay algunas muestras guiones. Probé el Perl y parece que funciona, por lo que el problema son mis intentos de Python. El guión (trabajo) es:

## tool_example.pl ##
use strict;
use warnings;
use LWP::UserAgent;

my $base = 'http://www.uniprot.org';
my $tool = 'mapping';
my $params = {
  from => 'ACC', to => 'P_REFSEQ_AC', format => 'tab',
  query => 'P13368 P20806 Q9UM73 P97793 Q17192'
};

my $agent = LWP::UserAgent->new;
push @{$agent->requests_redirectable}, 'POST';
print STDERR "Submitting...\n";
my $response = $agent->post("$base/$tool/", $params);

while (my $wait = $response->header('Retry-After')) {
  print STDERR "Waiting ($wait)...\n";
  sleep $wait;
  print STDERR "Checking...\n";
  $response = $agent->get($response->base);
}

$response->is_success ?
  print $response->content :
  die 'Failed, got ' . $response->status_line . 
    ' for ' . $response->request->uri . "\n";

Mis preguntas son:

1) ¿Cómo hacer eso en Python?

2) ¿Voy a ser capaz de forma masiva "escala" que (es decir, utilizan una gran cantidad de entradas en el campo de consulta)?

¿Fue útil?

Solución

Pregunta # 1:

Esto se puede hacer usando urllib pitón:

import urllib, urllib2
import time
import sys

query = ' '.join(sys.argv)   

# encode params as a list of 2-tuples
params = ( ('from','ACC'), ('to', 'P_REFSEQ_AC'), ('format','tab'), ('query', query))
# url encode them
data = urllib.urlencode(params)    
url = 'http://www.uniprot.org/mapping/'

# fetch the data
try:
    foo = urllib2.urlopen(url, data)
except urllib2.HttpError, e:
    if e.code == 503:
        # blah blah get the value of the header...
        wait_time = int(e.hdrs.get('Retry-after', 0))
        print 'Sleeping %i seconds...' % (wait_time,)
        time.sleep(wait_time)
        foo = urllib2.urlopen(url, data)


# foo is a file-like object, do with it what you will.
foo.read()

Otros consejos

Usted es probablemente mejor usar la proteína Identificador Cruz Servicio de referencia de la EBI para convertir un conjunto de ID a otro. Tiene una muy buena interfaz REST.

http://www.ebi.ac.uk/Tools/picr/

También debería mencionar que UniProt tiene muy buenos servicios web disponibles. Aunque si están vinculados a la utilización de simples peticiones HTTP por alguna razón, entonces es probable que no es útil.

Vamos a suponer que está utilizando Python 2.5. Podemos usar httplib para llamar directamente al sitio web :

import httplib, urllib
querystring = {}
#Build the query string here from the following keys (query, format, columns, compress, limit, offset)
querystring["query"] = "" 
querystring["format"] = "" # one of html | tab | fasta | gff | txt | xml | rdf | rss | list
querystring["columns"] = "" # the columns you want comma seperated
querystring["compress"] = "" # yes or no
## These may be optional
querystring["limit"] = "" # I guess if you only want a few rows
querystring["offset"] = "" # bring on paging 

##From the examples - query=organism:9606+AND+antigen&format=xml&compress=no
##Delete the following and replace with your query
querystring = {}
querystring["query"] =  "organism:9606 AND antigen" 
querystring["format"] = "xml" #make it human readable
querystring["compress"] = "no" #I don't want to have to unzip

conn = httplib.HTTPConnection("www.uniprot.org")
conn.request("GET", "/uniprot/?"+ urllib.urlencode(querystring))
r1 = conn.getresponse()
if r1.status == 200:
   data1 = r1.read()
   print data1  #or do something with it

A continuación, podría hacer una función en torno a la creación de la cadena de consulta y que debe estar lejos.

mira esto bioservices. que la interfaz una gran cantidad de bases de datos a través de Python. https://pythonhosted.org/bioservices/_modules/bioservices/uniprot.html

conda install bioservices --yes

como complemento a la respuesta O.rka:

Pregunta 1:

from bioservices import UniProt
u = UniProt()
res = u.get_df("P13368 P20806 Q9UM73 P97793 Q17192".split())

Esto devuelve una trama de datos con toda la información acerca de cada entrada.

Pregunta 2: misma respuesta. Esto debería aumentar de escala.

Aviso Legal : Soy el autor de bioservicios

Hay un paquete python en la pipa que hace exactamente lo que quiere

pip install uniprot-mapper
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top