Pandas (estilizado como pandas) é uma biblioteca de software escrita para a linguagem de programação Python, destinada à manipulação e análise de dados. Em particular, oferece estruturas de dados e operações para manipular tabelas numéricas e séries temporais. É um software livre distribuído sob a licença BSD de três cláusulas. O nome deriva do termo "panel data", um termo econométrico para conjuntos de dados que incluem observações ao longo de múltiplos períodos de tempo para os mesmos indivíduos, além de ser um trocadilho com a frase "Python data analysis". Wes McKinney começou a construir o que se tornaria o Pandas na AQR Capital, enquanto trabalhava lá como pesquisador de 2007 a 2010.
O desenvolvimento do Pandas introduziu no Python muitos recursos comparáveis de trabalho com DataFrames que foram estabelecidos na linguagem de programação R. A biblioteca é construída sobre outra biblioteca, o NumPy.
História
O desenvolvedor Wes McKinney começou a trabalhar no Pandas em 2008, enquanto estava na AQR Capital Management, devido à necessidade de uma ferramenta de alto desempenho e flexível para realizar análises quantitativas em dados financeiros. Antes de deixar a AQR, ele conseguiu convencer a administração a permitir que ele disponibilizasse a biblioteca como código aberto em 2009. Outro funcionário da AQR, Chang She, juntou-se ao esforço em 2012 como o segundo grande contribuidor da biblioteca. Em 2015, o Pandas se tornou um projeto patrocinado fiscalmente pela NumFOCUS, uma organização sem fins lucrativos 501(c)(3) nos Estados Unidos.
Modelo de dados
O Pandas é construído em torno de estruturas de dados chamadas Series e DataFrames. Os dados para essas coleções podem ser importados de vários formatos de arquivo, como valores separados por vírgula, JSON, Parquet, tabelas ou consultas de banco de dados SQL e Microsoft Excel.
Series
Uma Series é um objeto unidimensional semelhante a um array que armazena uma sequência de valores juntamente com um conjunto associado de rótulos, chamado de índice. Ela é construída sobre o array do NumPy e oferece muitas funcionalidades semelhantes, mas, em vez de usar posições inteiras implícitas, uma Series permite rótulos de índice explícitos de muitos tipos de dados. Uma Series pode ser criada a partir de listas, dicionários ou arrays do NumPy em Python. Se nenhum índice for fornecido, o pandas atribui automaticamente um índice inteiro padrão variando de 0 a n-1, onde n é o número de itens na Series.
Para acessar um valor ou uma lista de valores de uma Series, use seu índice ou lista de índices. As Series podem ser usadas aritmeticamente, como na declaração series_3 = series_1 + series_2. Isso alinhará os pontos de dados com os valores de índice correspondentes em series_1 e series_2 (semelhante a uma junção em álgebra relacional) e, em seguida, os somará para produzir novos valores em series_3. Uma Series possui vários atributos, como name (nome da Series), dtype (tipo de dados dos valores), shape (número de linhas), values e index. Elas podem ser usadas em muitas das mesmas operações que os arrays do NumPy, com métodos adicionais para reindexação, seleção baseada em rótulos e tratamento de dados ausentes.
DataFrame
Um DataFrame é uma estrutura de dados bidimensional e tabular com linhas e colunas rotuladas. Cada coluna é armazenada internamente como uma Series e pode conter um tipo de dados diferente (numérico, string, booleano, etc.). Os DataFrames podem ser criados por diversos meios, incluindo dicionários de listas, arrays do NumPy e arquivos externos, como planilhas CSV ou Excel. Para recuperar uma coluna de um DataFrame como uma Series, use o índice (notação semelhante a dicionário) ou o nome da coluna, se o nome for um identificador Python válido (acesso semelhante a atributo). Os DataFrames suportam operações como atribuição de colunas, exclusão de linhas e colunas, indexação baseada em rótulos com loc, indexação baseada em posição com iloc, reformatação, agrupamento e junção. As operações de mesclagem implementam um subconjunto da álgebra relacional e permitem junções um-para-um, muitos-para-um e muitos-para-muitos.
Alguns atributos comuns de um DataFrame incluem dtypes (tipo de dados de cada coluna), shape (dimensões do DataFrame retornadas como uma tupla com a forma (número de linhas, número de colunas)), index/columns (rótulos das linhas/colunas do DataFrame, respectivamente, retornados como um objeto Index), values (dados no DataFrame retornados como um array 2D) e empty (retorna True se o DataFrame estiver vazio).
Índice
Os objetos Index armazenam metadados para objetos Series e DataFrame, como rótulos e nomes de eixos, e são criados automaticamente a partir dos dados de entrada. Por padrão, um índice do pandas é uma série de inteiros ascendentes a partir de 0, semelhante aos índices de arrays em Python. No entanto, os índices também podem usar qualquer tipo de dados do NumPy, incluindo ponto flutuante, carimbos de data/hora ou strings. Os índices também são imutáveis, o que permite que sejam compartilhados com segurança entre múltiplos objetos.
A sintaxe do pandas para mapear valores de índice aos dados relevantes é a mesma sintaxe que o Python usa para mapear chaves de dicionário a valores. Por exemplo, se s é uma Series, s['a'] retornará o ponto de dados no índice a. Ao contrário das chaves de dicionário, os valores de índice não são garantidos como únicos. Se uma Series usar o valor de índice a para múltiplos pontos de dados, então s['a'] retornará, em vez disso, uma nova Series contendo todos os valores correspondentes. Os nomes de colunas de um DataFrame são armazenados e implementados de forma idêntica a um índice. Como tal, um DataFrame pode ser considerado como tendo dois índices: um baseado em colunas e outro baseado em linhas. Como os nomes de colunas são armazenados como um índice, eles não precisam ser únicos.
Se data é uma Series, então data['a'] retorna todos os valores com o valor de índice a. No entanto, se data é um DataFrame, então data['a'] retorna todos os valores na(s) coluna(s) chamada(s) a. Para evitar essa ambiguidade, o Pandas suporta a sintaxe data.loc['a'] como uma forma alternativa de filtrar usando o índice. O Pandas também suporta a sintaxe data.iloc[n], que sempre recebe um inteiro n e retorna o enésimo valor, contando a partir de 0. Isso permite que o usuário atue como se o índice fosse uma sequência de inteiros semelhante a um array, independentemente de como ele está realmente definido.
O pandas também suporta índices hierárquicos com múltiplos valores por ponto de dados por meio da classe "MultiIndex". Os objetos MultiIndex permitem que um único DataFrame represente múltiplas dimensões, semelhante a uma tabela dinâmica no Microsoft Excel, onde cada nível pode opcionalmente ter seu próprio nome exclusivo. Na prática, dados com mais de 2 dimensões são frequentemente representados usando DataFrames com índices hierárquicos, em vez das estruturas de dados de dimensão superior Panel e Panel4D.
Funcionalidade
O pandas suporta uma variedade de técnicas de indexação e subconjunto, permitindo que os dados sejam selecionados por rótulo, índice ou condições booleanas. Por exemplo, df[df['col1'] > 5] retornará todas as linhas no DataFrame df para as quais o valor da coluna col1 excede 5. A biblioteca também implementa operações de agrupamento baseadas na abordagem dividir-aplicar-combinar, permitindo que os usuários agreguem, transformem ou reestruturem dados de acordo com valores de colunas ou funções aplicadas a rótulos de índice. Por exemplo, df['col1'].groupby(df['col2']) agrupa os dados em 'col1' por seus valores em 'col2', enquanto df.groupby(lambda i: i % 2) agrupa todos os dados no DataFrame inteiro por se o índice é par.
A biblioteca também fornece ferramentas para lidar com dados ausentes, mesclar e unir conjuntos de dados, reformatar dados (por exemplo, pivotagem e fusão), funcionalidade de séries temporais e entrada/saída para muitos formatos de arquivo. Esses recursos tornam o pandas uma pedra angular do ecossistema de ciência de dados em Python, frequentemente usado em conjunto com bibliotecas de Machine learning e fluxos de trabalho de Artificial intelligence. Sua integração com arrays NumPy e compatibilidade com estruturas de Deep learning consolidaram seu papel em pipelines de pré-processamento de dados em todas as indústrias, desde finanças até análises em nuvem Amazon Web Services.