Desafio 1
import pandas as pd
vendas = pd.read_csv("https://raw.githubusercontent.com/alura-cursos/dataviz-graficos/master/dados/relatorio_vendas.csv")
vendas['data_pedido'] = pd.to_datetime(vendas['data_pedido'], format = '%Y-%m-%d')
vendas['data_envio'] = pd.to_datetime(vendas['data_envio'], format = '%Y-%m-%d')
vendas
vendas.info()
df_lucro_ano = vendas.copy()
df_lucro_ano = df_lucro_ano[['data_pedido', 'lucro']]
df_lucro_ano['ano'] = df_lucro_ano['data_pedido'].dt.year
df_lucro_ano.drop(labels = 'data_pedido', axis = 1, inplace = True)
df_lucro_ano = df_lucro_ano.groupby(['ano']).agg('sum').sort_values('lucro', ascending =True)
import matplotlib.pyplot as plt
import seaborn as sns
fig, ax = plt.subplots(figsize = (10,4))
sns.set_theme(style = 'white')
cores = []
for ano in df_lucro_ano.index:
if df_lucro_ano.loc[ano, 'lucro'] == df_lucro_ano.lucro.max():
cores.append(CINZA1)
else:
cores.append(AZUL5)
ax = sns.barplot(data = df_lucro_ano, x = df_lucro_ano.index, y = 'lucro', palette = cores)
ax.set_title('Lucro das lojas de Departamento de \n 2016 a 2019 ', loc = 'left', fontsize = 18, color = CINZA1)
ax.set_xlabel('')
ax.set_ylabel('')
ax.xaxis.set_tick_params(labelsize = 14, labelcolor = CINZA2)
sns.despine(left = True, bottom = True )
ax.set_yticklabels([])
for i , valor in enumerate(df_lucro_ano['lucro']):
qtn = f'R${valor:,.0f}'.replace(',', '.')
offset = 1e4
ax.text(i, valor + offset, qtn, color = CINZA2, fontsize = 12, ha = 'center', va = 'center', fontweight='bold')
ax.text(3.5, 1e5,
'O lucro registrado do ano $\\bf{2019}$\n'
'subiu aproximadamente $\\bf{14,04}$%\n'
'em comparação com 2018.\n',
fontsize=14, linespacing=1.45, color=CINZA2)
plt.show()
Desafio 2
top_vendas = vendas.copy()
top_vendas = top_vendas[['tipo_produto', 'vendas']]
top_10 = top_vendas.groupby(['tipo_produto']).agg('sum').sort_values('vendas', ascending = False)
top_10 = top_10[:11]
top_10
import matplotlib.pyplot as plt
import seaborn as sns
fig, ax = plt.subplots(figsize = (10,4))
fig.subplots_adjust(right = 0.7)
sns.set_theme(style = 'white')
cores = [CINZA3 if i > 2 else VERDE1 for i in range(11)]
ax = sns.barplot(data = top_10, x = 'vendas', y = top_10.index, palette = cores)
ax.set_title('Top 10 produtos mais vendidos do catálogo (2016-2019)\n', fontsize=18, color=CINZA1, loc='left')
ax.set_xlabel('')
ax.set_ylabel('')
ax.set_xticklabels([])
ax.yaxis.set_tick_params(labelsize=10, labelcolor = CINZA2)
sns.despine(left = True, bottom = True)
for i, valor in enumerate(top_10['vendas']):
qtd = f'R$ {valor:,.0f}'.replace(',','.')
offset = 1e3 # offset de 1.000
ax.text(valor - offset, i, qtd, color= CINZA5, fontsize=10, fontweight='bold', ha='right', va='center')
from matplotlib import transforms
def texto_colorido(x, y, texto, cores, esp=20, ax=None, **kw):
cores = list(reversed(cores))
t = ax.transData
canvas = ax.figure.canvas
for i, linha in enumerate(reversed(texto.split('\n'))):
frases = linha.split('||')
for s, cor in zip(frases, cores[i]):
texto = ax.text(x, y, s, color=cor, transform=t, **kw)
texto.draw(canvas.get_renderer())
ex = texto.get_window_extent()
t = transforms.offset_copy(texto._transform, x=ex.width,
units='dots')
t = transforms.offset_copy(ax.transData, x=0, y=(i + 1) * esp, units='dots')
texto_colorido(
1.1e6, 5, # coordenadas
'Os dados indicam que os 3 produtos || $\\bf{mais \ vendidos}$\n' # texto
' foram: || $\\bf{pneus,\ ferramentas\ e\ vasos}$.\n'
'\n'
'Podemos notar no período mencionado também que as\n'
'os itens do departamento de Materiais de Construção\n'
'possuem uma boa saída e vários itens entre os ||$\\bf{Top\ 10}$.',
[[CINZA2, CINZA1], # linha 1 # cores
[CINZA2, VERDE1], # linha 2
[CINZA2], # linha 3
[CINZA2], # linha 4
[CINZA2], # linha 6
[CINZA2, CINZA1]
],
esp=22, # espaçamento
ax=ax, # figura onde desenhar o texto
fontsize=10)
plt.show()