Introdução ao R
Introdução ao Python
Visualização de dados
Python é uma linguagem de programação multiparadigma, que através de uma sintaxe simples, permite a seus utilizadores focar na solução de problemas, não os impedindo com complexidades além do necessário.
A declaração de variáveis no Python é feita com o sinal =
variavel = valor da variável
Os valores das variáveis podem ser de diferentes tipos:
inteiro = 123 flutuante = 1.1234 booleano = True lista = [1, 2, 3, 4, 5] dicionario = {'chave': 'valor'} string = 'Um texto legal'
inteiro + 2 # 125 inteiro * 2 # 246 flutuante / 2 # 0.5617
lista[0] # 1 (Primeiro valor) lista[0:3] # Do valor `0` à `2` lista[-1] # Último valor
dicionario['chave'] # 'valor'
As estruturas de controle de decisão são utilizadas para determinar quais ações/códigos serão executados com base na verificação de testes lógicos.
if
if (2 > 1): print("Dois é maior que um!")## Dois é maior que um!
else
if (2 < 1): print('Dois é menor que um')else: print('Dois é maior que um')## Dois é maior que um
elif
if (1 > 1): print('Um é maior que um')elif(1 > 0.5): print('Um é maior que meio')## Um é maior que meio
Estruturas de repetição permitem que um determinado bloco de código seja executado por diversas vezes.
Iterando com testes lógicos (while)
i = 0 while i < 5: print(i) i += 1 ## 0 ## 1 ## 2 ## 3 ## 4
Iterando em elementos (for-each)
Iterando em uma lista de valores:
for i in [11, 22]: print(i) # 1° Iteração (i = 11) # 2° Iteração (i = 22)
Iterando em um intervalo de valores:
for i in range(0, 9, 3): # range(inicio, fim, passo) print(i) # 1° Iteração (i = 0) # 2° Iteração (i = 3) # 3° Iteração (i = 6)
Pandas é uma biblioteca para a linguagem de programação Python, que fornece recursos rápidos, poderosos, flexíveis e fáceis de usar para a manipulação e análise de dados.
Para importar a biblioteca, utilize:
import pandas as pd
Para instalar a biblioteca, utilize o comando
pip install pandas
Qual tipo de dado é possível manipular com Pandas
?
As funcionalidades do Pandas
ajudam na exploração, limpeza e processamento de dados tabulares, como os armazenados em planilhas Excel, CSV ou bancos de dados tabulares.
Series são estruturas de dados unidimensionais que permitem o armazenamento de sequências de valores.
Cada uma das linhas são associadas a nomes (ou índices), que podem ser utilizados para a busca e recuperação dos dados.
Diferentes tipos de dados podem ser armazenados (e.g. Inteiro, String, Float) e utilizados para a criação dos índices de uma Series
.
Diferentes tipos de dados podem ser armazenados (e.g. Inteiro, String, Float) e utilizados para a criação dos índices de uma Series
.
Diferentes tipos de dados podem ser armazenados (e.g. Inteiro, String, Float) e utilizados para a criação dos índices de uma Series
.
Exemplos de manipulação das Series
Series
series = pd.Series([1, 2]) print(series) ## 0 1 ## 1 2 ## dtype: int64
Series
com índice series = pd.Series([1, 2, 3], index = [9, 'ultimo', 'tres']) print(series) ## 9 1 ## ultimo 2 ## tres 3 ## dtype: int64
Pode-se recuperar os dados com o operador []
serie[nome da linha]
Recuperação de uma linha única:
series[9] ## 1
Intervalos de valores também são permitidos:
series[9: 'tres'] ## 9 1 ## ultimo 2 ## tres 3 ## dtype: int64
Trajetória: Variação temporal de classes de LULC de uma coleção de dados em uma determinada localização no espaço geográfico.
Series
trajectory = pd.Series([ "Pastagem", "Pastagem", "Outras Lavouras Temporárias", "Soja", "Soja" ], index = [2014, 2015, 2016, 2017, 2018]) trajectory ## 2014 Pastagem ## 2015 Pastagem ## 2016 Outras Lavouras Temporárias ## 2017 Soja ## 2018 Soja ## dtype: object
Trajetória extraída da localização (-10.710, -55.612) com o serviço WLTS (Coleção MapBiomas 5).
Recuperando os primeiros valores com head
trajectory.head(n = 2) # padrão (n = 5) ## 2014 Pastagem ## 2015 Pastagem ## dtype: object
Recuperando os últimos valores com tail
trajectory.tail(n = 2) ## 2017 Soja ## 2018 Soja ## dtype: object
Questão: Como tratar os casos em que há mais colunas ?
Questão: Como tratar os casos em que há mais colunas ?
DataFrames são estruturas de dados bidimensionais, representando tabelas, formadas por conjuntos de Series. É a estrutura de dados principal do Pandas.
Exemplo de manipulação dos DataFrames
df = pd.DataFrame([[1, 2, 3, 4], [11, 12, 13, 14]]) print(df) ## 0 1 2 3 ## 0 1 2 3 4 ## 1 11 12 13 14
df = pd.DataFrame([[1, 2, 3, 4], [11, 12, 13, 14]], index = ['um', 'dois']) print(df) ## 0 1 2 3 ## um 1 2 3 4 ## dois 11 12 13 14
df = pd.DataFrame([[1, 2, 3, 4], [11, 12, 13, 14]], index = ['um', 'dois'], columns = ['a', 'b', 'c', 'd']) print(df) ## a b c d ## um 1 2 3 4 ## dois 11 12 13 14
Exemplo de manipulação dos DataFrames
Como as Series
, nos DataFrames
a recuperação básica de dados ocorre com o operador [].
dataframe[nome da coluna]
df = pd.DataFrame([[1, 2, 3, 4], [11, 12, 13, 14]], index = ['um', 'dois'], columns = ['a', 'b', 'c', 'd']) print(df) ## a b c d ## um 1 2 3 4 ## dois 11 12 13 14
df['a'] # <class 'pandas.core.series.Series'> ## um 1 ## dois 11 ## Name: a, dtype: int64
df[['a', 'b']] # <class 'pandas.core.frame.DataFrame'> ## a b ## um 1 2 ## dois 11 12
SITS: Variação temporal de valores de bandas espectrais em uma determinada localização no espaço geográfico.
DataFrame
com SITS de vários pontos
sits = pd.DataFrame({ "P1_NDVI": [0.578, 0.653, 0.691, 0.451], # Ponto 1 "P2_NDVI": [0.592, 0.617, 0.580, 0.578], # Ponto 2 "P3_NDVI": [0.574, 0.591, 0.570, 0.385] # Ponto 3 }, index = ["2017-01-01", "2017-01-17", "2017-02-02", "2017-02-18"]) sits ## P1_NDVI P2_NDVI P3_NDVI ## 2017-01-01 0.578 0.592 0.574 ## 2017-01-17 0.653 0.617 0.591 ## 2017-02-02 0.691 0.580 0.570 ## 2017-02-18 0.451 0.578 0.385
SITS extraídas com o serviço WTSS (Coverage CBERS-4/AWFI).
Visão geral dos dados com describe
sits.describe() # Informações estatísticas ## P1_NDVI P2_NDVI P3_NDVI ## count 4.000000 4.000000 4.000000 ## mean 0.593250 0.591750 0.530000 ## std 0.105819 0.017933 0.097094 ## min 0.451000 0.578000 0.385000 ## 25% 0.546250 0.579500 0.523750 ## 50% 0.615500 0.586000 0.572000 ## 75% 0.662500 0.598250 0.578250 ## max 0.691000 0.617000 0.591000
Durante o processo de análise, faz-se necessário a realização de seleção e filtro dos dados para a captura de comportamentos específicos. O Pandas fornece diferentes métodos para essas operações.
Durante o processo de análise, faz-se necessário a realização de seleção e filtro dos dados para a captura de comportamentos específicos. O Pandas fornece diferentes métodos para essas operações.
Dentre os métodos disponíveis, tem-se o loc e o iloc que permitem a seleção e filtro de dados armazenados em Series
e DataFrames
.
Series | DataFrames |
---|---|
.loc[Nome da linha] | .loc[Nome da linha, Nome da coluna] |
.iloc[Posição da linha] | .iloc[posição da linha, posição da coluna] |
Exemplo de utilização do loc
df = pd.DataFrame({ 'nome': ['Joana', 'Maria', 'Josefa'], 'idade': [15, 18, 21], 'nota': [8, 9, 10] }, index = [7, 8, 9]) df ## nome idade nota ## 7 Joana 15 8 ## 8 Maria 18 9 ## 9 Josefa 21 10
nome
das linhas e colunas Recuperando a linha de nome
"9"
print(df.loc[9]) ## nome Josefa ## idade 21 ## nota 10 ## Name: 9, dtype: object
Recuperando a linha de nome
"9" e a coluna de nome
"idade"
print(df.loc[9, 'idade']) ## 21
Exemplo de utilização do iloc
df = pd.DataFrame({ 'nome': ['Joana', 'Maria', 'Josefa'], 'idade': [15, 18, 21], 'nota': [8, 9, 10] }, index = [7, 8, 9]) df ## nome idade nota ## 7 Joana 15 8 ## 8 Maria 18 9 ## 9 Josefa 21 10
posição
das linhas e colunas Recuperando a linha de posição
"2"
print(df.iloc[2]) ## nome Josefa ## idade 21 ## nota 10 ## Name: 9, dtype: object
Recuperando a linha de posição
"2" e a coluna de posição
"1"
print(df.iloc[2, 1]) ## 21
Comparação entre loc e iloc
df = pd.DataFrame({ 'nome': ['Joana', 'Maria', 'Josefa'], 'idade': [15, 18, 21], 'nota': [8, 9, 10] }, index = [7, 8, 9]) df ## nome idade nota ## 7 Joana 15 8 ## 8 Maria 18 9 ## 9 Josefa 21 10
posição
e nome
Recuperando a linha de nome
"9" com loc
print(df.loc[9]) ## nome Josefa ## idade 21 ## nota 10 ## Name: 9, dtype: object
Recuperando a linha de posição
"2" com iloc
print(df.iloc[2]) ## nome Josefa ## idade 21 ## nota 10 ## Name: 9, dtype: object
Comparação entre loc e iloc
DataFrame
com SITS de vários pontos print(sits) ## P1_NDVI P2_NDVI P3_NDVI ## 2017-01-01 0.578 0.592 0.574 ## 2017-01-17 0.653 0.617 0.591 ## 2017-02-02 0.691 0.580 0.570 ## 2017-02-18 0.451 0.578 0.385
Recuperando intervalo de nomes das linhas
print(sits.loc["2017-01-01":"2017-01-17", "P2_NDVI"]) ## 2017-01-01 0.592 ## 2017-01-17 0.617 ## Name: P2_NDVI, dtype: float64
Recuperando intervalo de posições das linhas
print(sits.iloc[0:2, 1]) ## 2017-01-01 0.592 ## 2017-01-17 0.617 ## Name: P2_NDVI, dtype: float64
Filtro de dados
É possível fazer o filtro de dados com um índice booleano
df = pd.DataFrame({ 'nome': ['A1', 'A2', 'A3', 'A4'], 'valor': [5, 12, 8, 30] }) df ## nome valor ## 0 A1 5 ## 1 A2 12 ## 2 A3 8 ## 3 A4 30
O filtro dos dados pode ser feito com loc e iloc
df.loc[[False, True, False, True]] ## nome valor ## 1 A2 12 ## 3 A4 30
df.iloc[[False, True, False, True]] ## nome valor ## 1 A2 12 ## 3 A4 30
Filtro de dados
Testes lógicos podem ser adicionados no filtro para a geração das listas booleanas
dataframe.loc[(teste 1)]
Filtrando valores maiores que "5"
df.loc[df['valor'] > 5] ## nome valor ## 1 A2 12 ## 2 A3 8 ## 3 A4 30
A expressão retorna os valores booleanos do teste feito
df['valor'] > 5 ## 0 False ## 1 True ## 2 True ## 3 True ## Name: valor, dtype: bool
Filtro de dados
complexas
Mais testes lógicos podem ser adicionados ao filtro. Cada teste é separado por um operador lógico e parênteses.
dataframe.loc[(teste 1) operador (teste 2)]
Os operadores lógicos são:
&
);|
).Filtrando valores maiores ou igual a 5 e menores que 12
df.loc[(df['valor'] >= 5) & (df['valor'] < 12)] ## nome valor ## 0 A1 5 ## 2 A3 8
O método query
pode ser mais amigável
df.query('valor >= 5 & valor < 12') ## nome valor ## 0 A1 5 ## 2 A3 8
Agrupar e agregar são técnicas que facilitam a análise de dados. Em etapas exploratórias, essas operações podem ser essenciais para a identificação e entendimento de padrões nos dados.
Agregações são operações aplicadas sobre os dados que resultam em conjuntos de valores. Esses valores podem variar em seu tipo de acordo com a estrutura de dados em que é aplicado.
Algumas funções de agregação
Agregação de dados
Series
s = pd.Series([1, 2, 3])
Calculando o somatório com sum
s.sum() ## 6
Valor mínimo com min
s.min() ## 1
DataFrames
df = pd.DataFrame([[1, 2, 3], [4, 5, 6]])
Calculando o valor médio com mean
df.mean() ## 0 2.5 ## 1 3.5 ## 2 4.5 ## dtype: float64
Valor máximo com max
.
df.max() ## 0 4 ## 1 5 ## 2 6 ## dtype: int64
Agrupamento de dados
groupby
É possível agrupar instâncias do conjunto de dados com base na igualdade de seus atributos.
df = pd.DataFrame({ 'nome': ['Tel1', 'Tel2', 'Tel3'], 'tipo': ['antigo', 'novo', 'novo'] }) df ## nome tipo ## 0 Tel1 antigo ## 1 Tel2 novo ## 2 Tel3 novo
Agrupando pela coluna/atributo tipo
telefones_agrupados = df.groupby('tipo')
Recuperando os grupos gerados
telefones_agrupados.groups ## {'antigo': [0], 'novo': [1, 2]}
df = pd.DataFrame({ 'nome': ['ana', 'maria', 'felipe', 'joão'], 'idade': [19, 19, 20, 20], 'dinheiro': [150, 150, 100, 100] }) df ## nome idade dinheiro ## 0 ana 19 150 ## 1 maria 19 150 ## 2 felipe 20 100 ## 3 joão 20 100
Agrupando pela idade
agrupado = df.groupby('idade')
Agregando com count
(Contando elementos)
print(agrupado.count()) ## nome dinheiro ## idade ## 19 2 2 ## 20 2 2
Agregando com mean
(Média salarial por idade)
agrupado['dinheiro'].mean() ## idade ## 19 150 ## 20 100 ## Name: dinheiro, dtype: int64
Além das estruturas de dados e funcionalidades para a manipulação e processamento dos dados, o Pandas fornece ainda um conjunto de opções para a leitura e escrita de dados.
Lista de formatos e operações de leitura/escrita do Pandas
CSV
data = pd.read_csv("data/titanic.csv", sep = ',') data.head(n = 3) ## PassengerId Pclass Name ... Fare Cabin Embarked ## 0 892 3 Kelly, Mr. James ... 7.8292 NaN Q ## 1 893 3 Wilkes, Mrs. James (Ellen Needs) ... 7.0000 NaN S ## 2 894 2 Myles, Mr. Thomas Francis ... 9.6875 NaN Q ## ## [3 rows x 11 columns]
Os dados carregados são representados por Series
e DataFrames
.
type(data)
## "<class 'pandas.core.frame.DataFrame'>"
Verificando a quantidade de dados carregados com shape
data.shape # (linhas, colunas) ## (418, 11)
Escrevendo os dados em um arquivo CSV
data.to_csv('data/resultados.csv')
Exemplo de análise de dados utilizando o conjunto de dados Meteorite Landings, disponibilizado no Kaggle pela NASA. O conjunto de dados é composto por mais de 45 mil registros, contendo diferentes informações sobre meteoritos que cairam na Terra.
import pandas as pd data = pd.read_csv("data/meteorite-landings.csv") type(data)
## "<class 'pandas.core.frame.DataFrame'>"
data.columns ## Index(['name', 'id', 'nametype', 'recclass', 'mass', 'fall', 'year', 'reclat', ## 'reclong', 'GeoLocation'], ## dtype='object')
df_valid = data.loc[data['nametype'] == 'Valid'] df_relict = data.loc[data['nametype'] == 'Relict']
print(df_valid.shape) ## (45641, 10)
print(df_relict.shape) ## (75, 10)
df_groupby_nametype = data.groupby('nametype') df_groupby_nametype['mass'].mean() ## nametype ## Relict 0.121269 ## Valid 13285.656127 ## Name: mass, dtype: float64
df_groupedby_recclass = data.groupby('recclass') df_groupedby_recclass['recclass'].count().head(n = 3) ## recclass ## Acapulcoite 54 ## Acapulcoite/Lodranite 6 ## Acapulcoite/lodranite 3 ## Name: recclass, dtype: int64
mass
(Gramas) df_gt_mass_500 = data.loc[data['mass'] > 500] df_gt_mass_500.shape ## (7036, 10)
df_gt_mass_500.to_csv('data/meteorite_gt_500_mass.csv')
ggplot2
e plotnine
são baseadas na obra The Grammar of Graphics, a qual apresenta uma grámatica para elaboração de gráficos. Tal gramática é composta por camadas, as quais descrevem os componentes do gráfico.Camadas de componentes gráficos
ggplot2
e plotnine
são baseadas na obra The Grammar of Graphics, a qual apresenta uma grámatica para elaboração de gráficos. Tal gramática é composta por camadas, as quais descrevem os componentes do gráfico.Camadas de componentes gráficos
Sintaxe do ggplot/plotnine
ggplot(data = <DATA>, aes(<MAPPINGS>)) + <GEOM_FUNCTION>( mapping = aes(<MAPPINGS>), stat = <STAT>, position = <POSITION>) + <COORDINATE_FUNCTION> + <FACET_FUNCTION>
position
) por um valor x e y, mas outros sistemas de coordenadas são possíveis. É possível alterar a forma (shape
), tamanho (size
) e cor (size
) dos elementos.
Fundamentals of Data Visualization - Claus O. Wilke
Fundamentals of Data Visualization - Claus O. Wilke
from plotnine import * # funçõesfrom plotnine.data import mtcars # dados de exemploprint(mtcars.head(n = 3))## name mpg cyl disp hp drat wt qsec vs am gear carb## 0 Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4## 1 Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4## 2 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
mtcars.columns## Index(['name', 'mpg', 'cyl', 'disp', 'hp', 'drat', 'wt', 'qsec', 'vs', 'am',## 'gear', 'carb'],## dtype='object')
from plotnine import * # funçõesfrom plotnine.data import mtcars # dados de exemploprint(mtcars.head(n = 3))## name mpg cyl disp hp drat wt qsec vs am gear carb## 0 Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4## 1 Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4## 2 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
mtcars.columns## Index(['name', 'mpg', 'cyl', 'disp', 'hp', 'drat', 'wt', 'qsec', 'vs', 'am',## 'gear', 'carb'],## dtype='object')
ggplot(mtcars)
from plotnine import * # funçõesfrom plotnine.data import mtcars # dados de exemploprint(mtcars.head(n = 3))## name mpg cyl disp hp drat wt qsec vs am gear carb## 0 Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4## 1 Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4## 2 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
mtcars.columns## Index(['name', 'mpg', 'cyl', 'disp', 'hp', 'drat', 'wt', 'qsec', 'vs', 'am',## 'gear', 'carb'],## dtype='object')
ggplot(mtcars, aes(x = 'mpg', y = 'disp'))
from plotnine import * # funçõesfrom plotnine.data import mtcars # dados de exemploprint(mtcars.head(n = 3))## name mpg cyl disp hp drat wt qsec vs am gear carb## 0 Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4## 1 Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4## 2 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
mtcars.columns## Index(['name', 'mpg', 'cyl', 'disp', 'hp', 'drat', 'wt', 'qsec', 'vs', 'am',## 'gear', 'carb'],## dtype='object')
( ggplot(mtcars, aes(x = 'mpg', y = 'disp')) + geom_point())
( ggplot(mtcars, aes(x = 'mpg', y = 'disp', color = 'factor(cyl)')) + geom_point())
( ggplot(mtcars, aes(x = 'mpg', y = 'disp', color = 'factor(cyl)')) + geom_point() + geom_line())
Introdução ao R
Introdução ao Python
Visualização de dados
Keyboard shortcuts
↑, ←, Pg Up, k | Go to previous slide |
↓, →, Pg Dn, Space, j | Go to next slide |
Home | Go to first slide |
End | Go to last slide |
Number + Return | Go to specific slide |
b / m / f | Toggle blackout / mirrored / fullscreen mode |
c | Clone slideshow |
p | Toggle presenter mode |
t | Restart the presentation timer |
?, h | Toggle this help |
Esc | Back to slideshow |