1
resposta

Erro no Dashboard ao gerar gráfico de linhas

Quando fui colocar o gráfico na coluna 2 apareceu o erro

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Aqui o que está escrito no Traceback

File "C:\Users\henri\OneDrive\Documentos\Programação\Alura\Streamlit - construindo um dashboard interativo\venv\Lib\site-packages\streamlit\runtime\scriptrunner\exec_code.py", line 121, in exec_func_with_error_handling
    result = func()
             ^^^^^^
File "C:\Users\henri\OneDrive\Documentos\Programação\Alura\Streamlit - construindo um dashboard interativo\venv\Lib\site-packages\streamlit\runtime\scriptrunner\script_runner.py", line 591, in code_to_exec
    exec(code, module.__dict__)
File "C:\Users\henri\OneDrive\Documentos\Programação\Alura\Streamlit - construindo um dashboard interativo\Dashboard.py", line 17, in <module>
    dados = pd.DataFrame.from_dict(response.json())
                                   ^^^^^^^^^^^^^^^
File "C:\Users\henri\OneDrive\Documentos\Programação\Alura\Streamlit - construindo um dashboard interativo\venv\Lib\site-packages\requests\models.py", line 978, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)

Aqui o código que foi escrito

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

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['Data 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áfico
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 = 'Receita 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
coluna1, coluna2 = st.columns(2)
with coluna1:
    st.metric('Receita', formata_numero(dados['Preço'].sum(), 'R$'))
    st.plotly_chart(fig_mapa_receita)
with coluna2:
    st.metric('Quantidade de vendas', formata_numero(dados.shape[0]))
    st.plotly_chart(fig_receita_mensal)

st.dataframe(dados)
1 resposta

Oii, Henrique! Tudo bom?

O erro RequestsJSONDecodeError está ligado na falha da tentativa de converter a resposta da requisição HTTP para JSON. Isso geralmente acontece quando a resposta não é um JSON válido.

Como sugestão para resolver o problema, recomendo consultar este tópico no qual o monitor Rafael elaborou o passo a passo. Realize o teste e observe se funciona como esperado.

Bons estudos, Henrique!