Se inscrever para assistir a aula:
[Link]
Aula 3 - Plotly PX
Nosso objetivo é entender como funciona o Plotly EXPRESS
Objetivo Final:
Fazer uma análise exploratória com dados de combustíveis.
O que é o Plotly Express?
O Plotly Express (px) é uma biblioteca de visualização de dados de alto nível, desenvolvida pelo Plotly, que facilita a criação de gráficos
interativos de forma rápida e simples. É uma camada de abstração sobre a biblioteca Plotly, que permite criar visualizações complexas com
menos código e menos detalhes técnicos.
O Plotly Express foi projetado para ser uma alternativa mais fácil e direta ao uso direto da biblioteca Plotly.
Ele oferece uma interface mais intuitiva e simplificada para a criação de gráficos, especialmente para usuários que desejam criar
visualizações de dados de maneira rápida e sem necessidade de conhecimentos avançados em plotagem de gráficos.
Nosso case
Vamos utlizar dados do [Link] para nosso case de uso.
Codando !
Vamos explorar:
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
px.density_mapbox
update_traces
update_layout
add_annotation
# Libs
import pandas as pd
import numpy as np
# Modulos do Plotly
import [Link] as px
import warnings
[Link]('ignore')
# Configurar o número de casas decimais para 2
[Link].float_format = '{:.2f}'.format
# Lendo a base de dados
Base_Dados = pd.read_csv('[Link]', sep=';')
Base_Dados.head()
Regiao Estado
CNPJ da Nome da Numero
- - Municipio Revenda Complemento Bairro
Revenda Rua Rua
Sigla Sigla
SAO
FRANCISCO DE PRACA
08.519.545/0001- 29
0 SE ES COLATINA ASSIS FIDELIS 35 NaN LACE
10
COMERCIO DE FERRARI
# Analisa base de dados COMBUSTIVEI...
def Verificar_DataSet(Base_Dados ):
SAO
# Verificando dimensão FRANCISCO DE PRACA
08.519.545/0001- 29
1
Dimensao = SE ES COLATINA
Base_Dados.shape ASSIS FIDELIS 35 NaN LACE
10
COMERCIO}DE
print(f'Base de dados possui { Dimensao[0] Linhas e {Dimensao[1] FERRARI
} Colunas')
COMBUSTIVEI...
print('-' * 50 )
POSTO PRACA
# Tipo 04.814.652/0001- 29
2 das SE
Colunas ES COLATINA MOTOCAP ALMIRANTE 52 LETRA A LACE
10
Tipos_Colunas = Base_Dados.dtypes.value_counts()
LTDA BARROSO
print(f'Tipo das colunas')
POSTO
print( [Link]( Tipos_Colunas, columns=['Quantidade_Colunas'] ) PRACA
)
04.814.652/0001- 29
3 SE ES COLATINA MOTOCAP ALMIRANTE 52 LETRA A LACE
print('-' * 50 ) 10
LTDA BARROSO
# Campos únicos POSTO PRACA
Campos_Unicos = Base_Dados.nunique()
print(f'Campos únicos')
print( [Link]( Campos_Unicos, columns=['Quantidade_Campos'] ) )
print('-' * 50 )
# Campos nulos
Campos_Nulus = Base_Dados.isnull().sum()
print(f'Campos Nulos')
print( [Link]( Campos_Nulus, columns=['Quantidade_Campos'] ) )
print('-' * 50 )
Verificar_DataSet( Base_Dados )
Base de dados possui 378078 Linhas e 16 Colunas
--------------------------------------------------
Tipo das colunas
Quantidade_Colunas
object 15
float64 1
--------------------------------------------------
Campos únicos
Quantidade_Campos
Regiao - Sigla 5
Estado - Sigla 27
Municipio 460
Revenda 11640
CNPJ da Revenda 13467
Nome da Rua 8122
Numero Rua 4282
Complemento 2137
Bairro 5429
Cep 9902
Produto 6
Data da Coleta 126
Valor de Venda 1033
Valor de Compra 0
Unidade de Medida 2
Bandeira 59
--------------------------------------------------
Campos Nulos
Quantidade_Campos
Regiao - Sigla 0
Estado - Sigla 0
Municipio 0
Revenda 0
CNPJ da Revenda 0
Nome da Rua 0
Numero Rua 176
Complemento 296814
Bairro 901
Cep 0
Produto 0
Data da Coleta 0
Valor de Venda 0
Valor de Compra 378078
Unidade de Medida 0
Bandeira 0
--------------------------------------------------
# Verificando
Base_Dados.head()
Regiao Estado
CNPJ da Nome da Numero
- - Municipio Revenda Complemento B
Revenda Rua Rua
Sigla Sigla
SAO
FRANCISCO DE PRACA
08.519.545/0001-
0 SE ES COLATINA ASSIS FIDELIS 35 NaN
10
COMERCIO DE FERRARI
COMBUSTIVEI...
SAO
FRANCISCO DE PRACA
08.519.545/0001-
1 SE ES COLATINA ASSIS FIDELIS 35 NaN
10
COMERCIO DE FERRARI
COMBUSTIVEI...
POSTO PRACA
04.814.652/0001-
2 SE ES COLATINA MOTOCAP ALMIRANTE 52 LETRA A
10
LTDA BARROSO
# Ajuste Nome_Colunas
Base_Dados.columns = [ [Link]().replace('-',
POSTO '').replace(' ', '_') for Coluna in Base_Dados.columns ]
PRACA
04.814.652/0001-
3 SE ES COLATINA MOTOCAP ALMIRANTE 52 LETRA A
Base_Dados.columns 10
LTDA BARROSO
Index(['regiao__sigla', 'estado__sigla', 'municipio', 'revenda',
'cnpj_da_revenda', 'nome_da_rua', 'numero_rua', 'complemento', 'bairro',
'cep', 'produto', 'data_da_coleta', 'valor_de_venda', 'valor_de_compra',
'unidade_de_medida', 'bandeira'],
dtype='object')
# Ajuste coluna valor
Base_Dados.valor_de_venda = Base_Dados.valor_de_venda.apply( lambda valor: [Link](',' , '.') )
Base_Dados.valor_de_venda = pd.to_numeric( Base_Dados.valor_de_venda )
Base_Dados.valor_de_venda.dtypes
dtype('float64')
# Convertendo as datas
Base_Dados.data_da_coleta = pd.to_datetime( Base_Dados.data_da_coleta, format='%d/%m/%Y' )
Base_Dados['Mes'] = Base_Dados.data_da_coleta.[Link]
Base_Dados['Ano'] = Base_Dados.data_da_coleta.[Link]
Base_Dados.head()
regiao__sigla estado__sigla municipio revenda cnpj_da_revenda nome_da_rua numero
SAO
FRANCISCO DE PRACA
08.519.545/0001-
0 SE ES COLATINA ASSIS FIDELIS
10
COMERCIO DE FERRARI
COMBUSTIVEI...
SAO
FRANCISCO DE PRACA
08.519.545/0001-
1 SE ES COLATINA ASSIS FIDELIS
10
COMERCIO DE FERRARI
COMBUSTIVEI...
POSTO PRACA
04.814.652/0001-
2 SE ES COLATINA MOTOCAP ALMIRANTE
10
LTDA BARROSO
POSTO PRACA
04.814.652/0001-
3 SE ES COLATINA MOTOCAP ALMIRANTE
10
LTDA BARROSO
POSTO PRACA
04.814.652/0001-
4 SE ES COLATINA MOTOCAP ALMIRANTE
10
LTDA BARROSO
Base_Dados['regiao__sigla'].unique()
array(['SE', 'CO', 'NE', 'S', 'N'], dtype=object)
Base_Dados['estado__sigla'].unique()
array(['ES', 'GO', 'PI', 'RJ', 'SP', 'SC', 'PR', 'AL', 'AM', 'AP', 'BA',
'CE', 'MA', 'MG', 'MS', 'PA', 'PB', 'PE', 'RN', 'RO', 'RS', 'SE',
'TO', 'AC', 'MT', 'RR', 'DF'], dtype=object)
Base_Dados['produto'].unique()
array(['GASOLINA ADITIVADA', 'GASOLINA', 'DIESEL S10', 'ETANOL', 'DIESEL',
'GNV'], dtype=object)
# Filtrar o estado de SP
Filtro_SP = Base_Dados[
( Base_Dados['estado__sigla'] == 'SP' ) &
( Base_Dados['produto']=='GASOLINA' )
]
Filtro_SP.head()
regiao__sigla estado__sigla municipio revenda cnpj_da_revenda nome_da_rua nu
CENTRO
RODOVIA
AUTOMOTIVO 56.967.045/0001-
63 SE SP VALINHOS FLAVIO DE
DE VALINHOS 94
CARVALHO
LTDA
RODOVIA
AUTO POSTO 02.438.769/0001-
68 SE SP VALINHOS FLAVIO DE
APEX LTDA 11
CARVALHO
CENTRO AVENIDA
AUTOMOTIVO 03.203.934/0001- ENGENHEIRO
81 SE SP BARUERI
JOAO COTIA 19 OSCAR
LTDA KESSELRING
AUTO POSTO
RODOVIA
100% 13.917.317/0001-
89 SE SP VALINHOS FLAVIO DE
VALINHOS 39
CARVALHO
LTDA.
AUTO POSTO 07.060.206/0001- RUA CASTRO
1510 SE SP ARARAQUARA
RUA 16 LTDA 56 ALVES
# Analise da Média
Anl_Media = Filtro_SP.groupby( by=['Mes'] ).agg(
Media = ('valor_de_venda', 'mean'),
Mediana = ('valor_de_venda', 'median')
).reset_index()
# Gráfico de Linhas
Figura_Linhas = [Link](
Anl_Media, x='Mes', y='Media', title='Preço médio Gasolina estado de SP', text='Media',
markers=True, height=500, width=1000, labels={'Mes': '2º Semestre de 2022', 'Media': 'Preço médio de venda'}
)
# Definindo o formato dos valores ao pairar o mouse sobre os pontos do gráfico
Figura_Linhas.update_traces(
hovertemplate='Mes: %{x} <br>Preço Médio: R$ %{y:.2f}',
texttemplate='R$ %{y:.2f}', textposition='top center',
fill='tozeroy',
fillcolor='rgba(198, 213, 245, 0.5)',
textfont=dict(size=13, color='blue', family='Arial')
)
# Ajustando a cor de fundo do gráfico
Figura_Linhas.update_layout(
plot_bgcolor='#f2f5fa',
xaxis_range=[6.8, 12.2],
yaxis_range=[0, Anl_Media.[Link]() + ( Anl_Media.[Link]() * 0.25 ) ],
xaxis_showgrid=False,
)
Figura_Linhas.show()
Anl_Media.columns
Preço médio Gasolina estado de SP
Index(['Mes', 'Media', 'Mediana'], dtype='object')
7
# Gráfico de Barras
Figura_Barras = [Link]( Anl_Media, x='Mes', y='Mediana', title='Gráfico de Barras' )
Figura_Barras.show()
6 R$ 5.83
R$ 5.28
Preço médio de venda
R$ 4.88 R$ 4.79 R$ 4.91
5
Gráfico de Barras
4
6
3
2
5
1
4
0
7 8 9 10 11
Mediana
3 2º Semestre de 2022
0
7 8 9 10 11 12
Mes
'''Base_Dados[
(Base_Dados.produto == 'GASOLINA') &
(Base_Dados.estado__sigla == 'SP') &
(Base_Dados.Mes == 7) ]'''
'Base_Dados[\n (Base_Dados.produto == 'GASOLINA') &\n (Base_Dados.estado__sigla == 'SP') &\n (Base
[Link] == 7) ]'
Base_Dados.head(1)
regiao__sigla estado__sigla municipio revenda cnpj_da_revenda nome_da_rua numero_rua co
SAO
FRANCISCO DE PRACA
08.519.545/0001-
0 SE ES COLATINA ASSIS FIDELIS 35
10
COMERCIO DE FERRARI
COMBUSTIVEI...
# Analise produto
Anl_Produto = Base_Dados[ Base_Dados.estado__sigla == 'SP' ].pivot_table( index=['estado__sigla', 'municipio'], columns='produto', values='valor_de_vend
Anl_Produto.head()
produto estado__sigla municipio DIESEL DIESEL S10 ETANOL GASOLINA GASOLINA ADITIVADA GNV
0 SP ADAMANTINA 7.08 7.23 3.60 5.54 5.84 NaN
1 SP AMERICANA 6.83 6.98 3.65 5.05 5.42 5.39
2 SP AMPARO 7.02 7.13 4.01 5.37 5.67 NaN
3 SP ARACATUBA 6.90 7.10 3.52 5.27 5.40 5.89
4 SP ARARAQUARA 6.99 7.17 3.78 5.32 5.65 5.62
0# Gráfico de Dispersao
Figura_Scatter = [Link]( Anl_Produto, x='GASOLINA', y='ETANOL', title='Comparação Gasolina x Etanol',
trendline='ols', trendline_color_override='darkred',
height=600, width=1000 )
Figura_Scatter.show()
Comparação Gasolina x Etanol
4.3
4.2
4.1
3.9
ETANOL
3.8
3.7
3.6
3.5
Anl_Produto.corr()
3.4
4.8 5 5.2 5.4 5.6
produto DIESEL DIESEL S10 ETANOL GASOLINA GASOLINA ADITIVADA GNV
GASOLINA
produto
DIESEL 1.00 0.85 0.23 0.63 0.56 0.11
DIESEL S10 0.85 1.00 0.35 0.74 0.69 0.25
ETANOL 0.23 0.35 1.00 0.53 0.55 0.05
GASOLINA 0.63 0.74 0.53 1.00 0.92 0.27
GASOLINA ADITIVADA 0.56 0.69 0.55 0.92 1.00 0.13
GNV 0.11 0.25 0.05 0.27 0.13 1.00
Figura_Calor = [Link]( Anl_Produto.corr(), title='Correlação entre os combustíveis', text_auto=True, aspect="auto" )
Figura_Calor.update_xaxes(side="top")
produto
GA
Correlação entre os combustíveis SO
LIN
DI A
E GA AD
DI SE ET SO IT
ES LS AN LIN IV
10 OL AD GN
EL A A V
1
DIESEL 1 0.8533673 0.2299015 0.6309974 0.5551739 0.1138396
0.8
DIESEL S10 0.8533673 1 0.3476578 0.7378647 0.6938883 0.2529642
ETANOL 0.2299015 0.3476578 1 0.5342299 0.5505143 0.05376108
0.6
produto
GASOLINA 0.6309974 0.7378647 0.5342299 1 0.916396 0.265593
0.4
GASOLINA ADITIVADA 0.5551739 0.6938883 0.5505143 0.916396 1 0.1310431
0.2
GNV 0.1138396 0.2529642 0.05376108 0.265593 0.1310431 1
Base_Dados.columns
Index(['regiao__sigla', 'estado__sigla', 'municipio', 'revenda',
'cnpj_da_revenda', 'nome_da_rua', 'numero_rua', 'complemento', 'bairro',
'cep', 'produto', 'data_da_coleta', 'valor_de_venda', 'valor_de_compra',
'unidade_de_medida', 'bandeira', 'Mes', 'Ano'],
dtype='object')
# BoxPlot
[Link](Base_Dados,
x='regiao__sigla', y='valor_de_venda', color='produto',
title='Distribuição combustíveis por Região')
Distribuição combustíveis por Região
10
8
valor_de_venda
SE CO NE
regiao__sigla
Anl_Represetnacao = Base_Dados.produto.value_counts( normalize=True ).reset_index()
Figura_Pizza = [Link](
Anl_Represetnacao,
names='index', values='produto',
title='Gráfico de Pizza',
hole=0.6,
#color_discrete_sequence=[Link]
)
Figura_Pizza.update_traces(
hoverinfo='label+percent', textinfo='percent+label', textfont_size=12,
textposition='inside',
marker=dict( line=dict(color='#ffffff', width=2) ) )
Figura_Pizza.add_annotation(
x=0.5, y=0.5,
showarrow=False,
text=f'{ round(Base_Dados.shape[0] / 1000) } mi',
font=dict(
#family='Courier New, monospace',
size=22,
color='#000000'
),
)
Figura_Pizza.update( layout_showlegend=True )
Figura_Pizza
Gráfico de Pizza
GASOLINA
ETANOL
DIESEL S10
ETANOL
G
AS 5.5
22.4% GASOLINA ADITIVADA
O %
2
LI
DIESEL
N
A
GNV
378 mi GNV
2.05%
DI
ES 7%
19
EL
DIESEL
.
11%
S1
0
A
ADITIVAD
GASOLINA
19.3%
Anl_Produto.columns
Index(['estado__sigla', 'municipio', 'DIESEL', 'DIESEL S10', 'ETANOL',
'GASOLINA', 'GASOLINA ADITIVADA', 'GNV'],
dtype='object', name='produto')
Figura_Histograma = [Link]( Anl_Produto, x='GASOLINA', title='Gráfico de Histograma')
Figura_Histograma.show()
Gráfico de Histograma
25
20
15
count
10
0
4.8 5 5.2 5.4 5.6 5.8
GASOLINA
Base_Dados.head()
regiao__sigla estado__sigla municipio revenda cnpj_da_revenda nome_da_rua numero
SAO
FRANCISCO DE PRACA
08.519.545/0001-
0 SE ES COLATINA ASSIS FIDELIS
10
COMERCIO DE FERRARI
COMBUSTIVEI...
SAO
FRANCISCO DE PRACA
08.519.545/0001-
1 SE ES COLATINA ASSIS FIDELIS
10
COMERCIO DE FERRARI
COMBUSTIVEI...
POSTO PRACA
04.814.652/0001-
2 SE ES COLATINA MOTOCAP ALMIRANTE
10
LTDA BARROSO
POSTO PRACA
04.814.652/0001-
3 SE ES COLATINA MOTOCAP ALMIRANTE
10
LTDA BARROSO
POSTO PRACA
04.814.652/0001-
4 SE ES COLATINA MOTOCAP ALMIRANTE
10
LTDA BARROSO
# Analise dos estados
Anl_Estados = Base_Dados.groupby( by=['estado__sigla'] ).agg(
Media = ('valor_de_venda', 'mean')
).reset_index()
Anl_Estados.head()
estado__sigla Media
0 AC 6.69
1 AL 5.80
2 AM 5.89
3 AP 5.83
4 BA 6.00
# Adicionar as coordenadas geográficas (latitude e longitude) dos estados ao DataFrame
estados_coords = {
'Acre': (-9.0238, -70.8120),
'Alagoas': (-9.5713, -36.7819),
'Amazonas': (-3.4168, -65.8561),
'Amapá': (1.4315, -51.7717),
'Bahia': (-12.5797, -41.7007),
'Ceará': (-5.4984, -39.3206),
'Distrito Federal': (-15.7998, -47.8645),
'Espírito Santo': (-19.1834, -40.3089),
'Goiás': (-16.6410, -49.3659),
'Maranhão': (-4.9609, -45.2744),
'Mato Grosso': (-12.6819, -56.9211),
'Mato Grosso do Sul': (-20.7722, -54.7852),
'Minas Gerais': (-18.5122, -44.5550),
'Pará': (-3.4168, -52.1013),
'Paraíba': (-7.24, -36.7819),
'Paraná': (-24.89, -51.1557),
'Pernambuco': (-8.8137, -36.9541),
'Piaui': (-6.6033, -42.2796),
'Rio de Janeiro': (-22.9068, -43.1729),
'Rio Grande do Norte': (-5.4026, -36.9541),
'Rio Grande do Sul': (-30.0346, -51.2177),
'Rondonia': (-11.5057, -63.5806),
'Roraima': (2.7376, -62.0751),
'Santa Catarina': (-27.2423, -50.2189),
'São Paulo': (-23.5505, -46.6333),
'Sergipe': (-10.5741, -37.3857),
'Tocantins': (-10.1753, -48.2982)
}
# Criar um dicionário para mapear as siglas dos estados para os códigos
sigla_codigo_map = {
'AC': 'Acre',
'AL': 'Alagoas',
'AM': 'Amazonas',
'AP': 'Amapá',
'BA': 'Bahia',
'CE': 'Ceará',
'DF': 'Distrito Federal',
'ES': 'Espírito Santo',
'GO': 'Goiás',
'MA': 'Maranhão',
'MT': 'Mato Grosso',
'MS': 'Mato Grosso do Sul',
'MG': 'Minas Gerais',
'PA': 'Pará',
'PB': 'Paraíba',
'PR': 'Paraná',
'PE': 'Pernambuco',
'PI': 'Piaui',
'RJ': 'Rio de Janeiro',
'RN': 'Rio Grande do Norte',
'RS': 'Rio Grande do Sul',
'RO': 'Rondonia',
'RR': 'Roraima',
'SC': 'Santa Catarina',
'SP': 'São Paulo',
'SE': 'Sergipe',
'TO': 'Tocantins'
}
# Mapear as siglas dos estados para os códigos
Anl_Estados['Estado'] = Anl_Estados['estado__sigla'].map(sigla_codigo_map)
# Adicionar as coordenadas geográficas (latitude e longitude) dos estados ao DataFrame
Anl_Estados['Latitude'] = Anl_Estados['Estado'].map(lambda estado: estados_coords[estado][0])
Anl_Estados['Longitude'] = Anl_Estados['Estado'].map(lambda estado: estados_coords[estado][1])
# Verificando
Anl_Estados.head()
estado__sigla Media Estado Latitude Longitude
0 AC 6.69 Acre -9.02 -70.81
1 AL 5.80 Alagoas -9.57 -36.78
2 AM 5.89 Amazonas -3.42 -65.86
3 AP 5.83 Amapá 1.43 -51.77
4 BA 6.00 Bahia -12.58 -41.70
Grafico_Mapa = px.density_mapbox(
Anl_Estados, lat='Latitude', lon='Longitude', z='Media',
hover_data=['Estado', 'Media'],
radius=20, center=dict(lat=-15.80, lon=-47.86), zoom=3,
mapbox_style='open-street-map' )
Grafico_Mapa.update_layout(
margin={'r':0,'t':0,'l':0,'b':0},
coloraxis_showscale=False )
Desafio!
1. Escolha um estado e busque a Geo Localização de cada cidade
2. Faça um mapa de calor
3. Marque o Data Viking, Odemir Depieri e Ronisson Lucas
import requests
def get_coordinates(city, state):
'''
Função para buscar a Geo Localizacao
'''
# Site para buscar a Geo localização
Url = f'[Link]
# Parametros para enviar os dados na API
Parametros = {
'q': f'{city}, {state}',
'format': 'json',
}
# Fazendo a requisição
Resposta = [Link]( Url, params=Parametros )
# Retorno
Dados_Retorno = [Link]()
# Validando se há valor na resposta
if Dados_Retorno and len(Dados_Retorno) > 0:
# Extraindo os valores
latitude = float(Dados_Retorno[0]['lat'])
longitude = float(Dados_Retorno[0]['lon'])
# Retorno
return latitude, longitude
else:
return None
# Exemplo
Cidade = 'Curitiba'
Estado = 'Parana'
# Chamando a API
Coordenadas = get_coordinates(Cidade, Estado)
print('-' * 50 )
print('RETORNO')
print('-' * 50 )
print( f'Buscamos os dados da cidade {Cidade}/{Estado}:' )
print('Latitude:', Coordenadas[0] )
print('Latitude:', Coordenadas[1] )
--------------------------------------------------
RETORNO
--------------------------------------------------
Buscamos os dados da cidade Curitiba/Parana:
Latitude: -25.4295963
Latitude: -49.2712724