- InfinitePy Newsletter 🇧🇷
- Posts
- Analisando dados de vendas do Excel com Python Pandas e Seaborn - Parte II
Analisando dados de vendas do Excel com Python Pandas e Seaborn - Parte II
No mundo moderno, orientado por dados, analisar dados de vendas pode oferecer insights sobre o desempenho dos negócios, o comportamento do cliente e potenciais oportunidades de crescimento.
🕒 Tempo estimado de leitura: 8 minutos
A manipulação eficiente de dados é a pedra angular de qualquer processo de análise de dados, e dominar a habilidade de selecionar, filtrar e agregar dados é essencial para gerar insights.
Nesta série de várias partes, exploraremos algumas técnicas fundamentais para trabalhar com DataFrames em pandas, com foco na seleção e filtragem de dados, na junção de DataFrames e no cálculo de métricas agregadas.
Você aprenderá como filtrar linhas com base em condições específicas, unir múltiplos DataFrames para combinar dados, criar novas colunas calculadas e até mesmo visualizar os resultados usando um gráfico de barras horizontal. Seja você um profissional de dados experiente ou apenas iniciante, essas técnicas ajudarão a aprimorar suas habilidades de manipulação de dados e tornar suas análises mais robustas.
Agora, vamos mergulhar no mundo da análise de dados em Excel com alguns exemplos práticos que também estão disponíveis no Google Colab aqui 👨🔬.
Para acessar o primeiro artigo sobre Analisando Dados de Vendas em Excel com Python Pandas e Seaborn, por favor clique aqui.
Selecionando e Filtrando Dados
Selecionar e filtrar dados é uma parte fundamental ao trabalhar com conjuntos de dados. Vamos filtrar as linhas do DataFrame onde a coluna Produto contém a palavra Apple.
# Filtra o DataFrame de pedidos para incluir apenas pedidos para produtos que contêm "Apple" em seu nome. # O método str.contains() é usado para verificar se a coluna 'Produto' contém a string "Apple". pedidos_apple_df = pedidos_df[pedidos_df['Product'].str.contains("Apple")] # Exibe as primeiras linhas do DataFrame filtrado para verificar os resultados. # O método head() retorna as 5 primeiras linhas por padrão. pedidos_apple_df.head()
Pedidos de produtos que contenham "Apple" no nome.
Aqui está um resumo dos passos:
pedidos_df[pedidos_df['Product'].str.contains("Apple")]: Esta linha filtra pedidos_df com base na Série booleana criada por str.contains().
Apenas as linhas onde a coluna Product contém Apple são mantidas no novo DataFrame pedidos_apple_df.
Agora, vamos filtrar o DataFrame clientes_df para manter apenas as linhas onde a coluna Address inclui siglas de estado seguidas por um código postal de cinco dígitos, similar a um CEP dos EUA.
# Define um padrão regex que corresponde a: # - Um limite de palavra (\b) # - Duas letras maiúsculas ([A-Z]{2}) # - Um espaço # - Cinco dígitos (\d{5}) # - Outro limite de palavra (\b) pattern = r'\b[A-Z]{2} \d{5}\b' # Aplica um filtro na coluna 'Address' do DataFrame: # - str.contains(pattern, regex=True, na=False) usa o padrão regex para verificar cada elemento na coluna 'Address' # - na=False significa que excluímos quaisquer linhas onde o 'Address' é NaN (faltando) do resultado clientes_filtrados_df = clientes_df[clientes_df['Address'].str.contains(pattern, regex=True, na=False)] # Exibe as primeiras 5 linhas do DataFrame filtrado para ter uma visão dos dados clientes_filtrados_df.head()
Linhas onde a coluna Endereço inclui código postal, semelhante ao código postal dos EUA.
Aqui está um resumo do que cada parte do padrão regex faz:
\b: Corresponde a um limite de palavra, garantindo que o padrão esteja no início de uma palavra.
[A-Z]{2}: Corresponde exatamente a duas letras maiúsculas.
\d{5}: Corresponde exatamente a cinco dígitos.
\b: Corresponde a um limite de palavra, garantindo que o padrão esteja no final de uma palavra.
Unindo DataFrames
A união é semelhante às junções em SQL e permite combinar múltiplos DataFrames em um único, facilitando a integração e comparação de conjuntos de dados.
Sintaxe
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False)
Parâmetros:
left, right: DataFrames a serem unidos.
how: Tipo de junção a ser realizada (left, right, outer, inner). O padrão é inner.
on: Nomes da coluna ou nível do índice para unir. Deve ser encontrado em ambos os DataFrames.
left_on, right_on: Colunas ou níveis de índice dos DataFrames da esquerda e da direita a serem usados como chaves.
left_index, right_index: Usar o índice do DataFrame da esquerda ou da direita como chave(s) de junção.
sort: Ordenar o DataFrame resultante pelas chaves de junção.
suffixes: Sufixos a serem aplicados aos nomes das colunas sobrepostas.
indicator: Adiciona uma coluna ao DataFrame de saída chamada _merge com informações sobre a origem de cada linha.
# Une os dois DataFrames na coluna 'CustomerID' # A junção 'inner' significa que apenas linhas com 'CustomerID' correspondentes em ambos os DataFrames serão incluídas. # O resultado é um novo DataFrame que combina colunas de ambos os DataFrames originais. merged_df = pd.merge(pedidos_df, clientes_df, on='CustomerID', how='inner') # Exibe as primeiras 5 linhas do DataFrame unido # Isso é útil para inspecionar rapidamente o resultado da operação de junção. merged_df.head()
Mescla dos dois DataFrames na coluna 'CustomerID'.
Criando uma nova coluna Total no DataFrame merged_df que armazenará o resultado de multiplicar Quantity por Price para cada linha no DataFrame
# Suponha que 'merged_df' é um DataFrame que já foi criado. # 'Quantity' representa o número de unidades de um produto ou itens. # 'Price' é o custo de uma unidade do produto ou item. # Criação de uma nova coluna 'Total' no DataFrame 'merged_df'. # Esta nova coluna armazenará o resultado de multiplicar 'Quantity' por 'Price' para cada linha no DataFrame. merged_df['Total'] = merged_df['Quantity'] * merged_df['Price'] # Exibição das primeiras linhas do DataFrame 'merged_df' para verificar a nova coluna. merged_df.head()
Coluna 'Total' no DataFrame 'merged_df'.
Esta operação é vetorizada, o que significa que será realizada para cada linha no DataFrame sem a necessidade de laços explícitos (loops). Operações vetorizadas são eficientes e rápidas, aproveitando otimizações de baixo nível nas bibliotecas subjacentes (como NumPy) das quais o pandas depende.
Calculando a receita total para cada produto
Etapa 1: Agrupar os dados pela coluna Produto (Product).
Esta etapa criará um DataFrame com produtos únicos como linhas.
Cada linha representará um produto único.
Etapa 2: Agregar os dados somando o Preço (coluna Price) para cada produto.
A função sum() calcula a receita total para cada produto.
O resultado é um DataFrame onde a receita total de cada produto é calculada.
Etapa 3: Redefinir o índice (.reset_index()) para transformar o objeto agrupado de volta em um DataFrame normal.
Esta etapa torna a coluna Produto (Product) uma coluna regular novamente, em vez de ser o índice.
Etapa 4: Renomeia a coluna Preço (Price) para Receita para indicar claramente que representa a receita total para cada produto.
# Supondo que merged_df seja um DataFrame que já tenha sido criado e contenha os dados relevantes. receita_por_produto_df = merged_df.groupby('Product')['Total'].sum().reset_index().rename(columns= {'Total':'Receita'}) # Exiba o DataFrame resultante receita_por_produto_df
Receita total por produto
Selecionando os Top 10 Produtos com base na Receita
# Ordenar o DataFrame 'receita_por_produto_df' pela coluna 'Receita' em ordem decrescente. # A coluna 'Receita' contém os valores de receita para determinar os produtos mais vendidos. produtos_ordenados_df = receita_por_produto_df.sort_values(by='Receita', ascending=False) # Selecionando as 10 primeiras linhas do DataFrame ordenado para identificar os 10 principais produtos por receita. top_10_produtos = produtos_ordenados_df.head(10) # Exibindo o DataFrame resultante com os 10 principais produtos com base na Receita. top_10_produtos
Gráfico de barras horizontal exibindo os 10 principais produtos por Receita
# Cria uma figura e um conjunto de subplots com um tamanho específico plt.figure(figsize=(12, 8)) # O tamanho da figura é 12x8 polegadas # Cria um gráfico de barras horizontal usando a função barplot do seaborn. # y='Product': Especifica que o eixo y deve representar a coluna 'Produto' do DataFrame. # x='Receita': Especifica que o eixo x deve representar a coluna 'Receita' do DataFrame. # data=top_10_produtos: Usa o DataFrame 'top_10_produtos' como fonte de dados. # hue='Product': Diferentes cores para diferentes produtos. # dodge=False: Garante que as barras não sejam separadas se 'hue' for especificado (mas aqui é redundante). # palette='viridis': Define o mapa de cores para 'viridis' para as barras. bar_plot = sns.barplot( y='Product', x='Receita', data=top_10_produtos, hue='Product', dodge=False, palette='viridis' ) # Loop pelos 10 principais produtos para adicionar rótulos em cada barra. # Este loop usa o índice (i) e o DataFrame (top_10_produtos) for i in range(len(top_10_produtos)): # Extraia o valor da 'Receita' para o produto atual total_receita = top_10_produtos.iloc[i]['Receita'] # Adiciona rótulos de texto ao gráfico de barras. # total_receita: coordenada x para o rótulo de texto. # i: coordenada y para o rótulo de texto. # f'${total_revenue:,.2f}': Formata a 'Receita' como moeda com vírgulas e 2 casas decimais. # color='white': Cor do rótulo de texto. # ha="right": Alinhamento horizontal do texto centrado na barra. bar_plot.text( total_receita, i, f'R${total_receita:,.2f}', color='white', ha="right" ) # Define o título do gráfico plt.title('Top 10 Produtos pela Receita Total') # Define o rótulo para o eixo x plt.xlabel('Receita Total') # Define o rótulo para o eixo y plt.ylabel('Produto') # Exibe o gráfico na tela plt.show()
Os 10 principais produtos por receita total
Conclusão
Dominar as técnicas de selecionar, filtrar, unir e agregar dados em pandas fornece um conjunto de ferramentas poderoso para análise de dados. Agora você pode filtrar dados com confiança para focar em subconjuntos específicos, unir DataFrames para combinar conjuntos de dados relacionados e calcular métricas significativas, como a receita total para cada produto.
Além disso, visualizar os resultados com um gráfico claro e informativo pode tornar sua análise ainda mais convincente. Essas habilidades não apenas tornam sua manipulação de dados mais eficiente, mas também adicionam profundidade às suas capacidades analíticas, capacitando-o a descobrir e apresentar insights baseados em dados de maneira mais eficaz.
Sinta-se à vontade para responder a este boletim com qualquer dúvida ou tópicos que você gostaria que abordássemos no futuro.
Se você gostou deste boletim, não se esqueça de se inscrever para receber atualizações regularmente. Compartilhe com seus amigos e colegas interessados em Python e vamos crescer juntos em nossa comunidade de programadores!
Lembre-se, a chave para a maestria é prática e persistência. Feliz codificação! Até a próxima edição, continue programando! 👨💻
InfinitePy Newsletter - Sua fonte para aprendizado e inspiração em Python.