Pergunta

Eu estou tentando obter alguns resultados de UniProt, que é um banco de dados de proteínas (detalhes não são importantes). Estou tentando usar algum script que traduz de um tipo de ID para outro. Eu era capaz de fazer isso manualmente no navegador, mas não pôde fazê-lo em Python.

Na http://www.uniprot.org/faq/28 há alguns amostra scripts. Eu tentei o Perl e parece funcionar, então o problema é minhas tentativas Python. A (trabalho) script é:

## 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";

As minhas perguntas são:

1) Como você fazer isso em Python?

2) Será que vou ser capaz de maciçamente "escala" que (ou seja, usar um monte de entradas no campo de consulta)?

Foi útil?

Solução

Pergunta # 1:

Isto pode ser feito usando python urllib:

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()

Outras dicas

Você é provavelmente melhor fora de usar a proteína serviço Identificador de Referência Cruzada do EBI para converter um conjunto de IDs para outro. Ele tem uma muito boa interface REST.

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

Eu também deveria mencionar que UniProt tem muito boas webservices disponíveis. Embora se você está amarrado a usando solicitações HTTP simples, por algum motivo, então o seu provavelmente não é útil.

Vamos supor que você está usando Python 2.5. Podemos usar httplib para chamar diretamente o site :

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

Você pode então fazer uma função em torno de criar a string de consulta e você deve estar longe.

verificar isso bioservices. eles interagem um monte de bancos de dados através de Python. https://pythonhosted.org/bioservices/_modules/bioservices/uniprot.html

conda install bioservices --yes

em complemento à resposta O.rka:

Pergunta 1:

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

Isso retorna uma trama de dados com todas as informações sobre cada entrada.

Pergunta 2: mesma resposta. Isso deve ampliar.

Aviso : Eu sou o autor de Bioservices

Há um pacote de python em pip que faz exatamente o que você quer

pip install uniprot-mapper
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top