Vamos começar criando um novo projeto em Python e instalando as bibliotecas pra pandas e jupyter.
Pra começar, faça assim:
import pandas as pd
df = pd.DataFrame()
print(df)
O dataframe é uma maneira que temos de armazenar os dados, como um banco mesmo. Por ser uma classe, ele tem vários atributos e métodos.
PS: Apesar de trabalharmos com Python, o back-end do Pandas é escrito em C.
Para passarmos os dados, podemos fazer assim:
import pandas as pd
df = pd.DataFrame(((1, "Jorge", 0.4), (177, 8, ("João"))))
print(df)
Como observado, podemos armazenar vários tipo de conteúdos, como string, int e float.
Pra exibir as colunas e índices, fazemos assim:
print(df.columns)
print(df.index)
Podemos mudar os nomes dos índices, assim:
import pandas as pd
df = pd.DataFrame(((1, "Jorge", 0.4), (177, 8, ("João"))), index = (45, "Maria"))
print(df)
E das colunas também:
df = pd.DataFrame(((1, "Jorge", 0.4), (177, 8, ("João"))), index = (45, "Maria"), columns = ("Brasil", "US", "Laranja"))
E pra ver o tamanho dos índices e colunas:
print(df.shape)
E pra ver os tipos das variáveis das colunas:
print(df.dtypes)
Vamos pegar esse repositório como exemplo pras próximas lições: https://github.com/CSSEGISandData/COVID-19/blob/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv
E deixe o código assim:
import pandas as pd
# Base de dados - Covid global
link = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"
dfNotif = pd.read_csv(link)
print(dfNotif)
Podemos fazer o mesmo com esse link aqui:
link = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/refs/heads/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv"
dfNotif = pd.read_csv(link)
print(dfNotif)
Podemos remover alguns campos dos dados recebidos pelo Pandas, como no caso acima, a latitude e longitude, que não são necessários no momento. Podemos filtrar assim:
print(dfNotif.drop(["Lat", "Long"], axis = 1))
PS: Isso não altera o dataframe original, apenas exibe sem as colunas especificadas. Para criar uma nova atribuição, faça assim:
dfNotif = dfNotif.drop(["Lat", "Long"], axis = 1)
Ou, de forma mais inteligente, assim:
dfNotif.drop(["Lat", "Long"], axis = 1, inplace = True)
Para localizar determinadas coisas dentro de um dataframe, podemos usar o comando loc, veja como encontramos o índice 0 de um dataframe:
print(dfNotif.loc[0])
Pra filtrar por uma coluna, fazemos assim:
print(dfNotif.loc[0, "Country/Region"])
Podemos pegar a coluna por número também, apenas trocando loc por iloc, assim:
print(dfNotif.iloc[0, 1])
Pra pegar todas as ocorrências, mas filtrando apenas por uma coluna:
print(dfNotif.loc[:, "Country/Region"])
Pra pegar determinadas linhas e colunas:
print(dfNotif.loc[(54, 66, 87), ("Country/Region", "12/14/21")])
Com mais uma coluna:
print(dfNotif.loc[(54, 66, 87), ("Province/State", "Country/Region", "12/14/21")])
Pra pegar um intervalo de ocorrências:
print(dfNotif.loc[54:66, ("Province/State", "Country/Region", "12/14/21")])
Podemos mostrar o objeto com um fatiamento de lista, como por exemplo, exibindo apenas dados de uma só coluna:
print(dfNotif["Country/Region"])
print(dfNotif.loc[:, "Country/Region"]) # Basicamente faz a mesma coisa do print acima
Podemos filtrar as colunas assim também:
print(dfNotif[["Province/State", "Country/Region", "12/14/21"]])
Podemos verificar conteúdos assim:
print(dfNotif["Country/Region"] == "Brazil")
E podemos fazer assim também:
print(dfNotif.loc[dfNotif["Country/Region"] == "Brazil"])
Da mesma forma:
print(dfNotif["Country/Region"] == "US")
E pra escolhe entre um ou outro:
print(dfNotif.loc[(dfNotif["Country/Region"] == "Brazil") | (dfNotif["Country/Region"] == "US")])
O Pandas não utiliza os mesmos operadores lógicos do Python, como o and e or literais. E sim esses aqui:
| Operador | Operação |
|---|---|
& |
AND |
| |
OR |
~ |
NOT |
Lembrando que as condições devem usar parênteses, como exemplificado acima.
Podemos fazer essa filtragem:
print(dfNotif.loc[dfNotif["12/24/21"] < 1e06]) # Experimente trocar o "<" pelo ">", o 1e06 significa 1 milhão
Podemos também filtrar os dados, de forma que não pegue dados faltantes.
Como a base de dados é muito grande, podemos usar o método isna pra ver se o dataframe tem dados considerados NaN
(not a number):
print(dfNotif.isna())
E pra ver se tem algo em uma linha considerado falso:
print(dfNotif.isna().any(axis = 0))
Pra pegar todas as linhas e as colunas que obedeçam à condição especificada:
print(dfNotif.loc[:, dfNotif.isna().any(axis = 0)])
E pra transformar os dados em booleanos e somar os dados true:
print(dfNotif.loc[:, dfNotif.isna().any(axis = 0)].isna().sum())
E para ver a quantidade de dados faltantes:
print(100 * dfNotif.loc[:, dfNotif.isna().any(axis = 0)].isna().sum() / dfNotif.shape[0])
Podemos também organizar nossos registros no dataframe.
Para pegar o último registro da nossa base de dados, fazemos assim:
print(dfNotif.columns[-1])
E pra ordenar de forma reversa:
lastDay = dfNotif.columns[-1]
print(dfNotif.sort_values(by = lastDay, ascending = False))
E pra ler somente 10 registros:
print(dfNotif.sort_values(by = lastDay, ascending = False).head(10))
Esse comando serve pra agrupar os registros na base de dados usando uma coluna de referência. Veja um exemplo:
print(dfNotif.groupby(by = ["Country/Region"]))
Só que isso mostrará apenas a chamada do objeto, para mostrar os registros, devemos fazer assim, com uma operação:
print(dfNotif.groupby(by = ["Country/Region"]).sum())
Nesse caso, as colunas repetidas não aparecem, como a Province/State, até porque ele não soma strings (NaN é considerada uma string, no caso).
O comando stack reorganiza (ou empilha
) as colunas de um DataFrame dentro do índice das linhas, criando uma estrutura mais compacta. Veja um exemplo simples de uso:
dfNotif.drop(["Province/State", "Lat", "Long"], axis = 1, inplace = True)
dfNotif = dfNotif.groupby(by = ["Country/Region"]).sum()
print(dfNotif.stack())
Pra salvar o empilhamento (não apague nada além dos prints anteriores):
dfNotif = dfNotif.stack()
print(dfNotif)
Pra colocar nomes personalizados nas colunas (não apague nada além dos prints anteriores):
dfNotif = dfNotif.stack()
dfNotif.index.set_names(("País/Região", "Datas"), inplace = True)
print(dfNotif)
E pra colocar um nome para o frame (mesma regra, só apague os prints anteriores):
dfNotif = dfNotif.stack()
dfNotif.index.set_names(("País/Região", "Datas"), inplace = True)
dfNotif = dfNotif.to_frame(name = "Notificações")
print(dfNotif)