Brincando com Pandas
por Pitágoras Alves

Quando o assunto é apresentação de dados, é muito comum fazer uso de tabelas, seja qual for o tema. Pacotes de software como Microsoft Office, Google Docs ou LibreOffice costumam incluir programas para visualizar e editar tais tabelas. Porém, há muitas limitações nestas opções, principalmente, quando o usuário precisa lidar com arquivos que contém milhares de linhas. Para processar e analisar grandes quantidades de dados científicos é necessário utilizar algo mais avançado, como uma linguagem de programação. No entanto, isso também traz novos desafios, como o fato de algumas linguagens terem sintaxes complexas e nem todos saberem como usá-las.

description

Uma alternativa para tornar a vida do usuário mais fácil, é optar por uma linguagem de programação feita para iniciantes e amplamente usada, como o Python. Há duas opções principais de bibliotecas para manipular dataframe (um tipo de estrutura de dados para dados tabulares) nesta linguagem: SFrame e Pandas. SFrame tem uma performance e uso de memória melhor, porém é pouco usada: há apenas 467 perguntas no stackoverflow sobre esta biblioteca. Já o Pandas, além de ser amplamente documentado, tem todos os tipos de possíveis dúvidas do usuário já respondidas, com 87.637 perguntas respondidas no stackoverflow. Assim, nesta breve apresentação, vou mostrar como utilizar Pandas para processar dados científicos.

As técnicas aqui descritas podem ser aplicadas para quaisquer tipos de dados, porém vamos focar em um dos tipos mais comuns na Bioinformática, que é o resultado do alinhamento de sequências. Para acompanhar na prática o passo a passo do uso da biblioteca, o download do dataset que estou usando pode ser feito aqui.

O Pandas pode ser instalado utilizando o ambiente Conda:

$ conda install pandas

Ou simplesmente através do Pip:

$ pip install pandas
Lendo o arquivo

Pandas pode ler e escrever diversos formatos como CSV, Excel, SQL, JSON e HTML. Independentemente do formato original, dentro do Pandas, um objeto dataframe sempre é criado. O dataframe que vamos carregar é um arquivo de texto com células separadas pelo caractere "\t" e não possui nomes de colunas na primeira linha, por isso vamos carregar o arquivo da seguinte forma:

import pandas as pd
dataframe = pd.read_csv("mini_blast.tsv", sep='\t')
print("Número de linhas: " + str(dataframe.shape[0]))
Número de linhas: 60000
            
Análise dos dados: procurar melhores 'hits'

Agora que temos os dados preparados, podemos aplicar filtros e ordenações para encontrar os melhores alinhamentos. Não precisamos de todas as colunas, então podemos deletar as desnecessárias para tornar a análise menos demorada.

for name in ['qstart', 'qend', 'sstart', 'send', 'mismatch', 'gapopen', 'bitscore']:
dataframe.drop(name, axis=1, inplace=True)
dataframe.head()
            

Agora vamos definir os valores de corte para algumas dessas colunas para filtrar os resultados mais relevantes.

dataframe = dataframe[dataframe['pident'] > 90]
dataframe = dataframe[dataframe['length'] > 50]
dataframe = dataframe[dataframe['evalue'] < 1.0e-15]
print("Número de linhas: " + str(dataframe.shape[0]))
Número de linhas: 7265

Agora que alinhamentos com pouca identidade ou muito curtos foram desconsiderados, vamos usar a ordenação para descobrir quais têm os melhores "evalue".

dataframe = dataframe.sort_values(by=['evalue'], ascending=True)
Salvando os resultados

Agora, temos um dataframe contendo menos colunas e apenas entradas que passaram por certos critérios. O próximo passo é salvar esses resultados em um novo arquivo.

dataframe.to_csv("blast_filtered.csv", index=False)
Dask

Como já mencionado anteriormente, Pandas não é a biblioteca com o uso de memória mais econômico. Quando o volume de dados for maior que a quantidade de memória RAM disponível na máquina, utilizar o Pandas se torna impossível. Além disso, não há implementação de paralelização para operações nos dataframes. Para ajudar o usuário nesses casos, existe a biblioteca Dask, que serve para elevar o desempenho do Pandas, Numpy e Scikit-Learn para serem usados em Big Data. A maior parte das operações disponíveis para Pandas, como as de carregar dataframes, também podem ser usadas da mesma forma no Dask:

import dask.dataframe as dd
df = dd.read_csv()
df.head()
Sugestões de Leitura