Introdução ao BioPython (parte I): manipulando dados de sequências

Frederico Schmitt Kremer
omixdata
Published in
5 min readNov 25, 2020

Olá pessoal! Hoje iniciaremos uma nova série de posts com foco no BioPython, uma biblioteca para leitura, escrita, manipulação e visualização de dados biológicos disponível para a linguagem Python, sendo similar a outros biopackages, como o BioPerl para a linguagem Perl e o Bioconductor para linguagem R. Atividades como “extrair os genes identificados em um arquivo no formato GenBank”, “executar o BLAST e processar seu resultado no formato XML” e “recuperar todas as sequências do GenBank que pertençam a um determinado organismo” podem ser executadas com poucas linhas de código através destes biopackages, permitindo que eles sejam utilizados tanto para a construção de pequenos scripts até grandes aplicações de bioinformática.

Neste primeiro post abordaremos a instalação e a utilização do BioPython para a manipulação de sequências de DNA e proteínas e suas anotações, bem como a leitura e escrita destes dados em diferentes formatos de arquivo.

Instalando o BioPython

O BioPython, assim como outros pacotes do Python, pode ser instalado com uso de gerenciador de pacotes pip, como o seguinte comando:

$ pip install biopython

Caso estejas utilizando o gerenciador de ambiente conda (com o miniconda ou anaconda) é possível também instalar pelo seguinte comando:

$ conda install biopython

Já no caso de sistemas operacionais baseados no Debian Linux, como o Ubuntu, é possível também instalar com o uso do comando apt ou apt-get:

$ sudo apt install biopython

O módulo Seq

O módulo Bio.Seq disponibiliza a classe Seq, que pode ser utilizada para a construção de objetos que representem sequências de DNA, RNA ou proteínas. Esta classe disponibiliza uma série de métodos interessantes para a manipulação destas sequências, como transcribe (converte uma sequência de DNA em RNA), translate (converte uma sequência de DNA ou RNA em uma de proteína) e reverse_complement (retorna a sequência complementar de uma sequência de interesse).

Ao executarmos este código teremos o seguinte resultado:

Sequence      (DNA):   ATGGCAAAAGAGTGA
Transcription (RNA): AUGGCAAAAGAGUGA
Translation (Protein): MAKE*

Os módulos SeqRecord e SeqFeature

O módulo Seq permite a criação de objetos que representam sequências biológicas, mas estes objetos não são capazes de armazenar metadados sobre estas sequências (ex: localização de genes, sítios de restrição, nome do organismo, código de acesso). Para que possamos armazenar este tipo de informação é necessária a criação de um objeto do tipo SeqRecord, que utilizará como base o objeto Seq para representar a sequência e outros objetos para representar os metadados.

Geralmente os identificadores de uma sequência básicos são o código de acesso (id ou “accession”) e a descrição (description), sendo também comum a adição de um nome canônico para a sequência em certos casos (name ou “symbol”). Estas informações podem ser informadas durante a criação do objeto SeqRecord, devendo as demais serem adicionadas a partir de objetos do tipo SeqFeature.

Chamamos de features as anotações que são adicionadas sobre uma sequência, geralmente indicando regiões desta que possuem uma determinada função ou característica estrutural. Exemplos de features incluem os genes e suas regiões codificantes de DNA (coding DNA sequences ou CDS), sítios de restrição em sequências de DNA, peptídeo sinal em sequências de proteínas, dentre outras. É possível indicar informações sobre a origem da própria sequência, como o organismo da qual ela foi obtida.

As features geralmente são identificadas a partir de “tipos” (ex: gene, CDS) padronizados pelo International Nucleotide Sequence Database Collaboration (INSDC), uma organização composta por representantes dos NCBI, EMBL e DDBJ que fornece diretrizes a disponibilidade de sequências de nucleotídeos e seus derivados em bancos de dados biológicos. Estas diretrizes permitem que os dados submetidos para uma fonte sejam facilmente replicados para as demais. Além dos tipos, podemos também especificar qualificadores, que são anotações adicionadas em uma feature para representar algumas características de interesse. Os qualificadores, incluindo quais devem ser obrigatoriamente informados, também são padronizados pelo INSDC.

Toda feature deve ter uma localização definida, e para isso utilizamos o objeto FeatureLocation. Isso permite identificar o ponto de início, fim e a fita na qual a feature deve ser analisada (forward ou reverse). Este objeto também está acessível através do módulo SeqFeature.

Seguindo o exemplo da sequência anterior, vamos criar um SeqRecord e identificar a sua porção codificante, bem como a tradução desta como uma qualificador.

Note que neste caso criamos uma lista de features, e nesta colocamos um objeto do tipo SeqFeature, que serve para representa uma feature do tipo gene. Esta feature por sua vez recebe um outro objeto da classe FeatureLocation, que recebe a posição de início (no Python, começamos a contagem do zero), fim e também o fica (1 é fita forward e -1 é reverse). Também definimos alguns qualifiers com uso de um dicionário.

Para criamos um record utilizamos um objeto do tipo Seq, indicamos os campos id, name edescription, definimos o tipo de molécula com uso do campo annotations e por fim passamos a lista de features. O campo annotations não é necessário para a criação do objeto, mas é obrigatório para que possamos fazer a conversão do record para o formato do GenBank de acordo com as diretrizes do INSDC.

Por fim, utilizamos o método format para produzir uma representação em string no formato GenBank a partir do objeto record.

O seguinte resultado será produzido:

LOCUS       omX            15 bp    DNA              UNK 01-JAN-1980
DEFINITION omixicin.
ACCESSION OD00001
VERSION OD00001.1
KEYWORDS .
SOURCE .
ORGANISM .
.
FEATURES Location/Qualifiers
gene 1..15
/locus_tag="omx_0001"
/gene="omX"
ORIGIN
1 atggcaaaag agtga
//

O módulo SeqIO

O módulo SeqIO permite que façamos a leitura e escrita de diferentes formatos de arquivo de sequência, como FASTA, GenBank e EMBL. Para escrevermos um arquivo em algum desses formatos é necessário utilizarmos a função write, para a qual passamos uma lista de records que queremos escrever. Já para lermos os records de um arquivo utilizamos a funçãoparse.

Tanto a leitura quanto a escrita depende da criação de objetos de manipulação de arquivos (handler) que deve ser definido com o uso da função open. Para leitura de arquivos utilizamos o modo r, enquanto que para escrita utilizamos o modo w.

Vamos modificar o exemplo anterior para que o script salve o record produzido no formato EMBL.

Neste caso criamos um handler de arquivo no modo de escrita (w) e então passamos ele para a função write do SeqIO, junto da lista de records e do formato de arquivo que queremos produzir. O resultado será um arquivo chamado omixin.embl que deverá ter o seguinte conteúdo:

ID   OD00001; SV 1; ; DNA; ; UNC; 15 BP.
XX
AC OD00001;
XX
DE omixicin
XX
OS .
OC .
XX
FH Key Location/Qualifiers
FH
FT gene 1..15
FT /locus_tag="omx_0001"
FT /gene="omX"
XX
SQ Sequence 15 BP; 7 A; 1 C; 5 G; 2 T; 0 other;
atggcaaaag agtga
15
//

Para ler o conteúdo deste arquivo utilizamos a função parse do módulo SeqIO, que recebe como argumentos o handler do arquivo e o formato.

Ao executarmos este código devemos ter o seguinte resultado:

ID: OD00001.1
Name: OD00001
Description: omixicin
Number of features: 1
/accessions=['OD00001']
/sequence_version=1
/molecule_type=DNA
/data_file_division=UNC
/organism=.
/taxonomy=[]
Seq('ATGGCAAAAGAGTGA')

Próximos passos

No próximo tutorial vamos abordar como utilizar o BioPython para acessar diretamente os bancos de dados do NCBI para obtermos os records dos genomas completos disponíveis para um organismo de interesse.

--

--