5
respostas

[Dúvida] Não estou conseguindo gerar o gráfico de barras

Esse é o erro que estou recebendo

5 respostas

Oii, Reinaldo! Tudo certo contigo?

Você pode checar se a parte do código pd.to_datetime está deste modo:

dados = pd.DataFrame.from_dict(response.json())

dados['Data da Compra'] = pd.to_datetime(dados['Data da Compra'], format = '%d/%m/%Y')

Pois pela sua imagem a função dados.set_index() parece estar certinha, então é capaz que algum erro na conversão da coluna aconteceu antes.

Se a dúvida persistir, estamos aqui! :)

Abraços!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Boa noite Maria, tudo em paz e contigo?

Meu código estpa exatamente assim como você digitou.

import streamlit as st
import requests
import pandas as pd
import plotly.express as px

st.set_page_config(layout= 'wide')

def formata_numero(valor, prefixo= ''):
    for unidade in ['', 'mil']:
        if valor <1000:
            return f'{prefixo} {valor:.2f} {unidade}'
        valor /=1000
    return f'{prefixo} {valor:.2f} milhões'

st.title("DASHBOARD DE VENDAS :shopping_trolley:")

url = 'https://labdados.com/produtos'
response = requests.get(url)
dados = pd.DataFrame.from_dict(response.json())
dados['Dados da Compra'] = pd.to_datetime(dados['Data da Compra'], format = '%d/%m/%Y')


## Tabelas

receita_estados = dados.groupby('Local da compra')[['Preço']].sum()
receita_estados = dados.drop_duplicates(subset= 'Local da compra')[['Local da compra', 'lat', 'lon']].merge(receita_estados, 
left_on='Local da compra', right_index = True).sort_values('Preço', ascending=False)

receita_mensal = dados.set_index('Data da Compra').groupby(pd.Grouper(freq = 'M'))['Preço'].sum().reset_index()
receita_mensal['Ano'] = receita_mensal['Data da Compra'].dt.year
receita_mensal['Mes'] = receita_mensal['Data da Compra'].dt.month_name()

##Gráficos

fig_mapa_receita = px.scatter_geo(receita_estados,
                                    lat = 'lat',
                                    lon = 'lon',
                                    scope= 'south america',
                                    size = 'Preço',
                                    template = 'seaborn',
                                    hover_name = 'Local da compra',
                                    hover_data = {'lat':False, 'lon': False},
                                    title = 'Reiceita por estado')


fig_receita_mensal = px.line(receita_mensal,
                            x = 'Mes',
                            y = 'Preço',
                            markers=True,
                            range_y=(0, receita_mensal.max()),
                            color = 'Ano',
                            line_dash = 'Ano',
                            title= 'Receita mensal')

fig_receita_mensal.update_layout(yaxis_title = 'Receita')                            

## Visualização no Streamlit
col1, col2 = st.columns(2)
with col1:
    st.metric('Receita', formata_numero(dados['Preço'].sum(), 'R$'))
    st.plotly_chart(fig_mapa_receita, use_container_width=True)

with col2:
    st.metric('Quantidade de vendas', formata_numero(dados.shape[0]))
    st.plotly_chart(fig_receita_mensal, use_container_width=True)



st.dataframe(dados)

Reinaldo, desculpe a demora!

Depois do trecho de código

dados['Dados da Compra'] = pd.to_datetime(dados['Data da Compra'], format = '%d/%m/%Y')

Você pode adicionar o seguinte código, por favor?

dados.set_index('Data da Compra', inplace=True)

Ele define a coluna Data da Compra como o índice para o df dados.

Se a dúvida persistir, estamos aqui! :)

Abraços!

Obrigado pela ajuda Maria mas continuo com o mesmo erro depois da adcionar essa linha

Olá Reinaldo, tudo bem? Espero que sim!

O problema ocorreu porque você criou uma coluna como nome Dados da compra nesse código:

dados['Dados da Compra'] = pd.to_datetime(dados['Data da Compra'], format = '%d/%m/%Y')

Depois disso, tentou setar o índice Data da compra, e esse não é o mesmo nome de coluna que está em formato de data. A confusão foi feita pelo nome da coluna apenas.

receita_mensal = dados.set_index('Data da Compra').groupby(pd.Grouper(freq = 'M'))['Preço'].sum().reset_index()

Coloque o mesmo nome da coluna na transformação para datetime e também no momento de setar o índice:

dados['Data da Compra'] = pd.to_datetime(dados['Data da Compra'], format = '%d/%m/%Y')

...

receita_mensal = pd.DataFrame(dados.set_index('Data da Compra').groupby(pd.Grouper(freq = 'M'))['Preço'].sum()).reset_index()

Bons estudos!