Boas-vindas ao curso Praticando Python para Data Science! Meu nome é Allan Spadini e, ao longo desta jornada, vamos estudar operações que podem ser realizadas com dataframes.
Audiodescrição: Allan se descreve como um homem branco, de cabelos lisos castanho-escuros na altura das orelhas, e olhos castanho-escuros. Ele veste uma camisa preta com estampa da banda Iron Maiden, e está sentado no estúdio da Alura em frente a uma parede clara iluminada em gradiente azul e verde, com uma estante preta à esquerda do intrutor, contendo quadros, enfeites, plantas e pontos de iluminação amarela.
Realizando operações
Neste vídeo, vamos explorar o que conseguimos fazer com esses dataframes e quais métodos podemos utilizar sobre eles. Para isso, trouxemos um problema para analisarmos e também um dataset, isto é, um arquivo CSV, para relembrarmos como realizar essas operações nos dataframes.
Carregando o dataset no Google Colab
O arquivo superstore.csv será carregado no Google Colab. Feito isso, podemos realizar a leitura do arquivo. Primeiramente, vamos importar a biblioteca pandas como pd:
Na mesma célula, utilizaremos um comando para ler o arquivo:
import pandas as pd
Carregar o dataset
df = pd.read_csv(superstore.csv, encoding='ISO-8859-1')
Por fim, vamos exibir as cinco primeiras linhas do dataset para inspecionar:
import pandas as pd
Carregar o dataset
df = pd.read_csv(superstore.csv, encoding='ISO-8859-1')
Exibir as primeiras linhas do dataset para inspecionar
df.head()
Linha ID | Ordem ID | Data Ordem | Data Envio | Modo Envio | Cliente ID | Nome Cliente | Segmento | País | Cidade | … | Codigo Postal | Regiao | Produto ID | Categoria | Sub-Categoria | Nome Produto | Vendas | Quantidade | Desconto | Lucro |
|---|
| 1 | CA-2016-152156 | 11/8/2016 | 11/11/2016 | Second Class | CG-12520 | Claire Gute | Consumer | United States | Henderson | … | 42420 | South | FUR-BO-10001798 | Furniture | Bookcases | Bush Somerset Collection Bookcase | 261.9600 | 2 | 0.00 | 41.9136 |
| 2 | CA-2016-152156 | 11/8/2016 | 11/11/2016 | Second Class | CG-12520 | Claire Gute | Consumer | United States | Henderson | … | 42420 | South | FUR-CH-10000454 | Furniture | Chairs | Hon Deluxe Fabric Upholstered Stacking Chairs,... | 731.9400 | 3 | 0.00 | 219.5820 |
| 3 | CA-2016-138688 | 6/12/2016 | 6/16/2016 | Second Class | DV-13045 | Darrin Van Huff | Corporate | United States | Los Angeles | … | 90036 | West | OFF-LA-10000240 | Office Supplies | Labels | Self-Adhesive Address Labels for Typewriters b... | 14.6200 | 2 | 0.00 | 6.8714 |
| 4 | US-2015-108966 | 10/11/2015 | 10/18/2015 | Standard Class | SO-20335 | Sean O'Donnell | Consumer | United States | Fort Lauderdale | … | 33311 | South | FUR-TA-10000577 | Furniture | Tables | Bretford CR4500 Series Slim Rectangular Table | 957.5775 | 5 | 0.45 | -383.0310 |
| 5 | US-2015-108966 | 10/11/2015 | 10/18/2015 | Standard Class | SO-20335 | Sean O'Donnell | Consumer | United States | Fort Lauderdale | … | 33311 | South | OFF-ST-10000760 | Office Supplies | Storage | Eldon Fold 'N Roll Cart System | 22.3680 | 2 | 0.20 | 2.5164 |
Exibindo as colunas do dataset
O arquivo representa transações de uma loja, contendo informações como:
- ID da transação;
- ID da ordem;
- Data de envio;
- Nome do cliente;
- ID do produto;
- Vendas;
- Quantidades;
- Desconto;
- Lucro;
- Entre outras.
Nosso objetivo é resolver um problema relacionado às vendas e ao lucro da loja. Dito isso, podemos, por exemplo, imprimir e verificar o nome das colunas, utilizando o seguinte comando:
Retorno do comando:
Index(['Linha ID', 'Ordem ID', 'Data Ordem', 'Data Envio', 'Modo Envio',
'Cliente ID', 'Nome Cliente', 'Segmento', 'PaÃs', 'Cidade', 'Estado',
'Codigo Postal', 'Regiao', 'Produto ID', 'Categoria', 'Sub-Categoria',
'Nome Produto', 'Vendas', 'Quantidade', 'Desconto', 'Lucro'],
dtype='object')
Obtendo estatísticas descritivas
Também podemos usar o método describe() para obter informações específicas, como a média de vendas (mean), a quantidade de vendas (count), e assim em diante.
| # | Linha ID | Codigo Postal | Vendas | Quantidade | Desconto | Lucro |
|---|
count | 9994.000000 | 9994.000000 | 9994.000000 | 9994.000000 | 9994.000000 | 9994.000000 |
mean | 4997.500000 | 55190.379428 | 229.858001 | 3.789574 | 0.156203 | 28.656896 |
std | 2885.163629 | 32063.693350 | 623.245101 | 2.225110 | 0.206452 | 234.260108 |
min | 1.000000 | 1040.000000 | 0.444000 | 1.000000 | 0.000000 | -6599.978000 |
25% | 2499.250000 | 23223.000000 | 17.280000 | 2.000000 | 0.000000 | 1.728750 |
50% | 4997.500000 | 56430.500000 | 54.490000 | 3.000000 | 0.200000 | 8.666500 |
75% | 7495.750000 | 90008.000000 | 209.940000 | 5.000000 | 0.200000 | 29.364000 |
max | 9994.000000 | 99301.000000 | 22638.480000 | 14.000000 | 0.800000 | 8399.976000 |
Dividindo o dataframe em dois subconjuntos
Se quisermos comparar duas regiões diferentes onde ocorrem vendas, por exemplo, podemos observar que temos regiões como South (Sul) e West (Oeste) nos dados.
Para comparar essas regiões, criaremos dois dataframes diferentes:
df_west = df[df['Regiao'] == 'West']
df_south = df[df['Regiao'] == 'South']
Nesse caso, criamos df_west e df_south. A partir disso, podemos comparar o total de vendas em cada região para verificar onde há mais vendas. Utilizaremos o método sum() para calcular isso.
sales_west = df_west['Vendas'].sum()
sales_south = df_south['Vendas'].sum()
Feito isso, podemos chamar as variáveis sales_west e sales_south em novas células:
Retorno do comando:
Retorno do comando:
Com isso, verificamos que há mais vendas no Oeste do que no Sul.
Criando colunas derivadas com operações condicionais
Agora, vamos pensar em outro problema: verificar se estamos aplicando um desconto substancial em determinada região. Podemos criar uma nova coluna para identificar se foi aplicado desconto.
Com isso, podemos imprimir e comparar as colunas Desconto_Aplicado e Desconto.
df['Desconto_Aplicado'] = df['Desconto'] > 0
Exibir as primeiras linhas com a nova coluna
print("\nNova coluna 'Desconto_aplicado':")
df[['Desconto', 'Desconto_Aplicado']].head()
Nova coluna Desconto_aplicado:
Desconto | Desconto_Aplicado |
|---|
| 0.00 | False |
| 0.00 | False |
| 0.00 | False |
| 0.45 | True |
| 0.20 | True |
Criando uma nova coluna para calcular o lucro por unidade
Além disso, podemos realizar operações matemáticas em uma coluna específica. Por exemplo: uma possibilidade seria calcular o lucro por unidade de produto. Para isso, executamos o seguinte:
df['Lucro por Unidade'] = df['Lucro'] / df['Quantidade']
df[['Lucro', 'Quantidade', 'Lucro por Unidade']].head()
Lucro | Quantidade | Lucro por Unidade |
|---|
| 41.9136 | 2 | 20.9568 |
| 219.5820 | 3 | 73.1940 |
| 6.8714 | 2 | 3.4357 |
| -383.0310 | 5 | -76.6062 |
| 2.5164 | 2 | 1.2582 |
Utilizando o método apply() para funções personalizadas
Uma forma mais interessante de realizar essas operações é utilizando o método apply(), que permite aplicar uma função sobre os valores de uma coluna. Agora, queremos criar uma coluna baseada no lucro para verificar se temos uma alta margem, margem positiva, ou prejuízo.
Para aplicar a função sobre uma coluna do dataframe, usaremos o método apply() recebendo a função categoriza_lucro. Por fim, vamos imprimir as cinco primeiras linhas da nova tabela.
def categoriza_lucro(lucro):
if lucro > 50:
return 'Alta margem'
elif lucro > 0:
return 'Margem positiva'
else:
return 'Prejuízo'
Aplicar a função
df['Categoria_Lucro'] = df['Lucro'].apply(categoriza_lucro)
Exibir as primeiras linhas com a nova coluna
df[['Lucro', 'Categoria_Lucro']].head()
Lucro | Categoria_Lucro |
|---|
| 41.9136 | Margem positiva |
| 219.5820 | Alta margem |
| 6.8714 | Margem positiva |
| -383.0310 | Prejuízo |
| 2.5164 | Margem positiva |
Utilizando funções lambda
Além disso, podemos utilizar funções lambda para operações mais diretas. Por exemplo: para calcular a margem de lucro como porcentagem, aplicamos a função lambda ao método apply().
df['Margem Lucro (%)'] = df.apply(lambda x: (x['Lucro'] / x['Vendas']) * 100, axis=1)
df['Margem Lucro (%)']
| # | Margem Lucro (%) |
|---|
| 0 | 16.00 |
| 1 | 30.00 |
| 2 | 47.00 |
| 3 | -40.00 |
| 4 | 11.25 |
| … | … |
| 9989 | 16.25 |
| 9990 | 17.00 |
| 9991 | 7.50 |
| 9992 | 45.00 |
| 9993 | 30.00 |
Além disso, podemos usar funções lambda com if e else para determinar o nível de vendas:
df['Nivel Vendas'] = df['Vendas'].apply(lambda x: 'Alta' if x > 500 else 'Baixa')
df['Nivel Vendas']
| # | Nivel Vendas |
|---|
| 0 | Baixa |
| 1 | Alta |
| 2 | Baixa |
| 3 | Alta |
| 4 | Baixa |
| … | … |
| 9989 | Baixa |
| 9990 | Baixa |
| 9991 | Baixa |
| 9992 | Baixa |
| 9993 | Baixa |
Por fim, podemos identificar se o desconto aplicado foi elevado:
df['Desconto Elevado'] = df['Desconto'].apply(lambda x: True if x > 0.2 else False)
df['Desconto Elevado']
| # | Desconto Elevado |
|---|
| 0 | False |
| 1 | False |
| 2 | False |
| 3 | True |
| 4 | False |
| … | … |
| 9989 | False |
| 9990 | False |
| 9991 | False |
| 9992 | False |
| 9993 | False |
Conclusão
Com essas análises e operações, temos os elementos necessários para realizar os exercícios seguintes. Em caso de dúvidas, lembre-se de postar no fórum, interagir com a Alura, ou com nossa comunidade no Discord. Nos encontramos em uma próxima oportunidade!