Introdução Ao Pandas Parte 4
Introdução Ao Pandas Parte 4
DADOS EM PANDAS
Vanessa Cadan Scheffer
Fonte: Shutterstock.
DESAFIO
Como parte das informações técnicas sobre o arquivo, foi lhe informado que se trata de
um arquivo delimitado CSV, cujo separador de campos é ponto-e-vírgula e a
codificação do arquivo está em ISO-8859-1. Como podemos obter o arquivo? Como
podemos extrair essas informações usando a linguagem Python? Serão necessários
transformações nos dados para obtermos as informações solicitadas?
RESOLUÇÃO
In [28]:
import pandas as pd
df_etanol = pd.read_csv('exportacao-etanol-hidratado-2012-2020-
bep.csv', sep=';', encoding="ISO-8859-1")
print(df_etanol.info())
df_etanol.head(2)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9 entries, 0 to 8
Data columns (total 17 columns):
ANO 9 non-null int64
PRODUTO 9 non-null object
MOVIMENTO COMERCIAL 9 non-null object
UNIDADE 9 non-null object
JAN 9 non-null object
FEV 9 non-null object
MAR 9 non-null object
ABR 9 non-null object
MAI 8 non-null object
JUN 8 non-null object
JUL 8 non-null object
AGO 8 non-null object
SET 8 non-null object
OUT 8 non-null object
NOV 8 non-null object
DEZ 8 non-null object
TOTAL 9 non-null object
dtypes: int64(1), object(16)
memory usage: 1.3+ KB
None
Out[28]:
MO
VI
ME U
PR NT NI T
A M A A O N
OD O D JA FE M JU JU SE D O
N A B G U O
UT CO A N V AI N L T EZ TA
O R R O T V
O ME D L
RC E
IA
L
ET
AN
OL
EX 87 14 12 98 15 14 38 24 70 73 46 80 40
2 HI
PO 23 15 21 00 32 43 47 48 22 17 59 20 78
0 DR be
0 RT 1,4 13, 57, 4,4 86, 73, 43, 61, 67, 00, 57, 60, 15
1 AT p
AC 11 51 33 29 60 68 61 02 57 02 05 82 7,1
2 AD
AO 32 86 85 26 78 94 42 89 98 32 4 58 21
O
(be
p)
1 2 ET EX be 67 38 96 54 11 38 33 35 43 60 45 26 41
0 AN PO p 34 73 92 39 50 74 91 43 47 58 84 12 68
1 OL RT 19, 31, 9,5 0,0 92, 98, 62, 43, 99, 70, 74, 31, 54
3 HI AC 97 64 92 50 48 37 21 28 85 15 38 16 3,1
DR AO 67 87 01 46 2 92 58 85 53 42 84 91
AT
AD
O
(be
MO
VI
ME U
PR NT NI T
A M A A O N
OD O D JA FE M JU JU SE D O
N A B G U O
UT CO A N V AI N L T EZ TA
O R R O T V
O ME D L
RC E
IA
L
p)
Agora que temos os dados, vamos dividir nossa solução em duas etapas: a de
transformação dos dados e a de extração de informações.
ETAPA DE TRANSFORMAÇÕES
Vamos começar removendo as colunas que sabemos que não serão utilizadas, afinal,
quanto menos dados na memória RAM, melhor. Veja no código a seguir a remoção de
três colunas, com o parâmetro inplace=True, fazendo com que a transformação seja
salva no próprio objeto.
In [29]:
df_etanol.drop(columns=['PRODUTO', 'MOVIMENTO COMERCIAL',
'UNIDADE'], inplace=True)
df_etanol.head(2)
Out[29]:
A TO
MA AB MA AG OU NO DE
N JAN FEV JUN JUL SET TA
R R I O T V Z
O L
2
8723 1415 1221 9800 1532 1443 3847 2448 7022 7317 4659 8020 4078
0
0 1,41 13,5 57,3 4,42 86,6 73,6 43,6 61,0 67,5 00,0 57,0 60,8 157,
1
132 186 385 926 078 894 142 289 798 232 54 258 121
2
2
6734 3873 9692 5439 1150 3874 3391 3543 4347 6058 4584 2612 4168
0
1 19,9 31,6 9,59 0,05 92,4 98,3 62,2 43,2 99,8 70,1 74,3 31,1 543,
1
767 487 201 046 82 792 1 858 585 553 842 684 191
3
Agora vamos redefinir os índices do DF, usando a coluna ANO. Esse passo será
importante para a fase de extração de informações. Veja que também optamos em
remover a coluna do DF (drop=True).
In [30]:
df_etanol.set_index(keys='ANO', drop=True, inplace=True)
df_etanol.head(2)
Out[30]:
MA AG OU NO TOT
JAN FEV ABR MAI JUN JUL SET DEZ
R O T V AL
A
N
O
2
8723 1415 1221 9800 1532 1443 3847 2448 7022 7317 4659 8020 4078
0
1,41 13,5 57,3 4,42 86,6 73,6 43,6 61,0 67,5 00,0 57,0 60,8 157,
1
132 186 385 926 078 894 142 289 798 232 54 258 121
2
2
6734 3873 9692 5439 1150 3874 3391 3543 4347 6058 4584 2612 4168
0
19,9 31,6 9,59 0,05 92,4 98,3 62,2 43,2 99,8 70,1 74,3 31,1 543,
1
767 487 201 046 82 792 1 858 585 553 842 684 191
3
Como os dados são de origem brasileira, a vírgula é usada como separador decimal, o
que não condiz com o padrão da biblioteca pandas. Precisamos converter todas as
vírgulas em ponto. Para isso vamos utilizar uma estrutura de repetição que filtra cada
coluna, criando uma Series, o que nos habilita a utilizar a funcionalidade str.replace(',',
'.') para a substituição.
In [31]:
for mes in 'JAN FEV MAR ABR MAI JUN JUL AGO SET OUT NOV DEZ
TOTAL'.split():
df_etanol[mes] = df_etanol[mes].str.replace(',', '.')
print(df_etanol.dtypes)
df_etanol.head(2)
JAN object
FEV object
MAR object
ABR object
MAI object
JUN object
JUL object
AGO object
SET object
OUT object
NOV object
DEZ object
TOTAL object
dtype: object
Out[31]:
MA AG OU NO TOT
JAN FEV ABR MAI JUN JUL SET DEZ
R O T V AL
A
N
O
2
8723 1415 1221 9800 1532 1443 3847 2448 7022 7317 4659 8020 4078
0
1.41 13.5 57.3 4.42 86.6 73.6 43.6 61.0 67.5 00.0 57.0 60.8 157.
1
132 186 385 926 078 894 142 289 798 232 54 258 121
2
2
6734 3873 9692 5439 1150 3874 3391 3543 4347 6058 4584 2612 4168
0
19.9 31.6 9.59 0.05 92.4 98.3 62.2 43.2 99.8 70.1 74.3 31.1 543.
1
767 487 201 046 82 792 1 858 585 553 842 684 191
3
Mesmo trocando a vírgula por ponto, a biblioteca ainda não conseguiu identificar como
ponto flutuante. Portanto, vamos fazer a conversão usando o método astype(float).
In [32]:
df_etanol = df_etanol.astype(float)
print(df_etanol.dtypes)
df_etanol.head(2)
JAN float64
FEV float64
MAR float64
ABR float64
MAI float64
JUN float64
JUL float64
AGO float64
SET float64
OUT float64
NOV float64
DEZ float64
TOTAL float64
dtype: object
Out[32]:
MA AB AG OU NO TO
JAN FEV MAI JUN JUL SET DEZ
R R O T V TAL
A
N
O
2
8723 1415 1221 9800 1532 1443 3847 2448 7022 7317 4659 8020 4078
0
1.411 13.5 57.33 4.42 86.6 73.6 43.6 61.0 67.5 00.0 57.0 60.8 157.
1
32 186 850 926 078 894 142 289 798 232 540 258 121
2
2
6734 3873 9692 5439 1150 3874 3391 3543 4347 6058 4584 2612 4168
0
19.97 31.6 9.592 0.05 92.4 98.3 62.2 43.2 99.8 70.1 74.3 31.1 543.
1
670 487 01 046 820 792 100 858 585 553 842 684 191
3
PESQUISE MAIS
Poderíamos ter usado a biblioteca locale para fazer parte desse trabalho, que tal se
aprofundar e pesquisar mais?!
Agora que preparamos os dados, podemos começar a etapa de extração das informações
solicitadas. Vamos começar extraindo o menor e maior valor arrecadado em cada ano.
Como nosso índice é o próprio ano, podemos usar a função loc para filtrar e então os
métodos min() e max(). Para que a extração seja feita para todos os anos, usamos uma
estrutura de repetição.
In [33]:
# Em cada ano, qual o menor e o maior valor arrecadado da
exportação?
In [34]:
# Considerando o período de 2012 a 2019, qual a média mensal de
arrecadamento com a exportação
print("Média mensal de rendimentos:")
for mes in 'JAN FEV MAR ABR MAI JUN JUL AGO SET OUT NOV
DEZ'.split():
media = df_etanol.loc[2012:2019, mes].mean()
print(f"{mes} = {media:,.0f}".replace(',', '.'))
Média mensal de rendimentos:
JAN = 248.380
FEV = 210.858
MAR = 135.155
ABR = 58.929
MAI = 106.013
JUN = 244.645
JUL = 295.802
AGO = 276.539
SET = 354.454
OUT = 376.826
NOV = 266.748
DEZ = 319.588
Agora precisamos descobrir qual ano teve a menor e a maior quantia em exportação,
considerando o período de 2012 a 2019. Para isso vamos usar o método idxmin() para
descobrir o mínimo e idxmax() para o máximo.
In [35]:
# Considerando o período de 2012 a 2019, qual ano teve o menor
arrecadamento? E o menor?
ano_menor_arrecadacao = df_etanol.loc[2012:2019,
'TOTAL'].idxmin()
ano_maior_arrecadacao = df_etanol.loc[2012:2019,
'TOTAL'].idxmax()
Agora é com você, que tal agora organizar as códigos em funções e deixar a solução
pronta para ser usada pela equipe?!
DESAFIO DA INTERNET