Introdução ao Pandas com Spotify

Como aprender ferramentas introdutórias do Pandas a partir das 50 músicas mais escutadas no Spotify em 2019 ?

Wander Buraslan
6 min readMar 1, 2021
www.tudocelular.com/spotify/

Este artigo explica as ferramentas introdutórias da Biblioteca Pandas. O Pandas foi projetado para trabalhar com dados tabulares e heterogêneos, na qual Wes McKinney encontrou a finalidade de flexibilizar as análises quantitativas enquanto trabalhava na AQR Capital Management, que logo após sua saída da instituição, tornou-a open-source.

Diante desse contexto, iremos utilizar um dataset sobre as cinquenta músicas mais escutadas do Spotify em 2019 e também plotaremos um gráfico de barras simples, que apresenta os gêneros musicais contidos nesse top cinquenta. Ademais, iremos entender de maneira intuitiva algumas funcionalidades e métodos básicos para quem deseja conhecer o Pandas, o objetivo dessa publicação é demonstrar os conceitos teóricos num modelo de dataset que seja prático e de fácil compreensão.

Mãos à obra:

Na célula abaixo, importaremos a biblioteca necessária para nosso estudo, o Pandas, e logo após utilizamos a leitura de arquivo .csv .

import pandas as pd
df_dados = pd.read_csv('nome do arquivo.csv')

Estrutura de dados do Pandas

As estruturas de dados do Pandas que você precisa conhecer são as Series e o DataFrame, na qual são responsáveis por preencher todo conteúdo introdutório de limpeza, tratamento e agrupamento de dados, que não iremos ver nesse artigo, mas cabe salientar sua importância nesse aspecto.

Series

As Series consistem em objetos unidimensionais, na qual, no lado esquerdo apresenta uma array denominada de índice e à direita, sequência de valores. Podemos chamar uma Series a partir do nosso DataFrame.

arquivo csv possui
df_dados[['genre']].head(10)

Por quê eu chamei apenas uma coluna de tantas outras que temos em nossa tabela ? Justamente para demonstrar que uma Series é uma array unidimensional que contém uma sequência de valores, onde também está vinculada à rótulos, denominadas de labels ou índices.

DataFrame

Um DataFrame é um pouco diferente das Series, são conhecidos por possuir várias colunas, ou seja, demasiadas Series reunidas, também definido como tabela de dados retangular vinculados a um índice, veja o exemplo a seguir :

df_dados.head()

A função .head() faz com que possamos visualizar as primeiras cinco camadas de linhas(índices) de nossa tabela. Dessa forma, compreenderemos total dimensão que nosso DataFrame porta.

Index

O Index é responsável por armazenar os rótulos dos eixos envolvidos ao DataFrame. No caso de nosso arquivo baixado, podemos verificar esse objeto e entender quantas linhas e passagens possui a partir da célula a seguir:

df_dados.index

Reindexação

Costumo atribuir uma alusão relacionada à organização de índices na reindexação, desse modo, consigo entender a dinâmica por trás de reorganizar dados através de um novo método, mas cuidado, quando colocamos um novo índice que não estava presente antes, o valor apresentará como ausente.

A primeira observação será sobre essa funcionalidade, criarei a seguir um exemplo à parte de nosso arquivo baixado, por motivos de não necessitar mudar lugares de índices na tabela correspondente aos dados do Spotify.

#Criarei um DataFrame a partir de um dicionário de preços de objetos:
exemplo1 = {'Nome':['Bola', 'Algodão', 'Notebook'],
'Preço':[34.00, 12.00, 5500.00]}
#Vinculando o dicionário à um DataFrame
df_exemplo1 = pd.DataFrame(exemplo1)
#Reindexando por ordem de minha preferência, no caso, quero que na primeira linha seja o nome do produto do Algodão
df_exemplo1.reindex([0, 1, 2])

Sabe-se que, você reindexar com um índice inexistente, seu valor será um dado ausente, conhecido como Not a Number (NaN).

Processo de seleção e filtragem

Imagine que você precisa selecionar alguns subconjuntos de dados do seu DataFrame, pegaremos o nosso arquivo baixado e selecionaremos a coluna ‘artist’ e veremos o que acontece:

df_dados['artist']

Após selecionar uma única coluna e perceber como o processo de seleção funciona, que tal selecionar mais uma junto?

df_dados[['artist','energy']]

Com apenas a coluna ‘energy’, filtraremos apenas as linhas que estejam acima da média que a coluna apresenta. Diante disso, você já sabe como selecionar a coluna, agora podemos também tirar a média para poder realizar a filtragem.

#Saber a média da coluna selecionada
df_dados[['energy']].mean()
#Processo de filtragem em relação a média
df_dados[df_dados['energy'] > df_dados['energy'].mean()]

Além dessa ferramenta de seleção e filtragem, temos duas outras muito importantes que preciso citar nesse post, são os operadores de indexação loc e iloc, na qual são responsáveis por selecionar subconjuntos de linhas e colunas do nosso DataFrame.

#Chamarei uma linha de índice 1 e duas colunas específicas:
df_dados.loc[1, ['artist','energy']]
#Chamarei apenas a linha 1 e as respectivas colunas 1, 2 e 3:
df_dados.iloc[1, [1,2,3]]

Descarte de eixos

O descarte de colunas sempre é bem-vindo quando levantamos quais hipóteses desejamos trabalhar e geralmente, nem todas as colunas são necessárias para responder nossas questões. Logo, dentro do dataset que estamos trabalhando, irei descartar as colunas ‘Unnamed: 0’ e ‘track_id’, veja como ocorre o descarte:

#Utilizo a função .drop() para descartar colunas indesejáveis:
df_dados.drop(['Unnamed: 0','track_id'], axis='columns')

No exemplo acima, descartamos duas colunas do nosso dataset, mas ainda devemos incrementar na nossa variável ‘df_dados’ para o nosso descarte ser concretizado. No entanto, podemos manipular in-place sem precisar devolver para nossa variável existente.

#1° maneira para devolver
df_dados = df_dados.drop(['Unnamed: 0','track_id'], axis='columns')
#2° maneira com in-place
df_dados.drop(['Unnamed: 0','track_id'], axis='columns', inplace=True)

Analisando dados faltantes

A análise dos valores faltantes, conhecidos como Not a Number (NaN) é crucial para não poluir futuras respostas, mas como podemos identificar os valores faltantes com pandas ? A verificação é realizada pela função .isnull(), na qual é responsável por devolver valores booleanos em nosso DataFrame, veja abaixo como podemos executar :

df_dados.isnull().head()

Como podemos visualizar, não existe dados NaN e isso é proposital, esse dataset não possui dados ausentes como encontramos em muitos outros arquivos. Porém, como uma forma de validação, vamos utilizar uma função para que possamos ter completa certeza se existe ou não valores faltantes.

df_dados.isnull().sum()

Plotagem de gêneros musicais

E que tal apresentarmos uma plotagem simples dos gêneros musicais contidos no top 50 do Spotify em 2019 para encerrar esse post ? Dessa forma, utilizaremos duas bibliotecas diferentes para fazer a plotagem do gráfico de barras, como também funções diferentes.

O primeiro passo é importar nossas duas novas bibliotecas:

import matplotlib.pyplot as plt
import seaborn as sns

O segundo é abrir uma célula para organizar alguns dados que ajudarão na construção gráfica:

#Criação de uma figure
fig, ax = plt.subplots()
#Gráfico de barras
sns.barplot(x=df_dados.index, y=df_dados['genre'],ax = ax, data =df_dados)

Claro, que ainda é muito cru esse gráfico e existe possibilidades de melhoria, contudo, não compõe no escopo ou objetivo desse post, que é apenas mostrar algumas ferramentas básicas de uma biblioteca muito utilizada na análise de dados. Diante desse contexto, nem todos os tópicos desse artigo integram totalmente as ferramentas disponíveis que o Pandas oferece. Ainda mais, o principal propósito principal dessa postagem é apresentar como uma dinâmica entre teoria e prática com um dataset qualquer nos faz aprender de maneira mais didática as funcionalidades de uma abstração.

--

--

Wander Buraslan

Estudante de Engenharia de Software em busca de desenvolvimento profissional, com o objetivo de analisar dados e compartilhar resultado com as pessoas.