【问题标题】:Streamlit error "UnboundLocalError: local variable 'dados' referenced before assignment"Streamlit 错误“UnboundLocalError:分配前引用的局部变量 'dados'”
【发布时间】:2021-10-25 01:59:55
【问题描述】:

我正在尝试使用 streamlit 绘制一些股票数据。我有一个带有两个选项的选择框:主页、图表。

主页是默认页面,负责从用户那里收集数据,数据作为股票代码,开始日期和结束日期。

Charts 负责用这些数据绘制折线图。

我的问题出现在图表屏幕中,因为我无法读取数据,但我可以在主页中读取它。

错误信息是:

UnboundLocalError: local variable 'dados' referenced before assignment

我的代码如下:

# Importando o framework
import streamlit as st

# Libs de coleta, processamento e manipulação de dados
import numpy as np
import pandas as pd
import yfinance as yf
yf.pdr_override()
import pandas_datareader.data as web

# Libs de visualização de gráficos
import matplotlib.pyplot as plts

# TODO: conhecer mais sobre esta biblioteca. Referências: https://docs.bokeh.org/en/latest/docs/reference/plotting.html,
# TODO: https://docs.streamlit.io/en/stable/api.html
#from bokeh.plotting import figure


# Título da página
st.title('Minerathon')

"""
    - Home: página inicial, aqui que o usuário insere os tickers e a data de início e fim.
    - Charts: página que retorna o gráfico das ações informadas na página Home.
"""
menu = ['Home', 'Charts']
# Utilizando um selectbox para identificar o que o usuário quer ver.
# choice - str
choice = st.sidebar.selectbox("Menu", menu)

"""
    - carteira: DataFrame inicialmente vazio, mas que depois guardará os Adj Close dos tickers que usuário inserir
    - ativos: lista inicialmente vazia, que armazenará o ticker (nome da ação + .SA) e que será iterada para compor a 
              carteira.
"""
carteira = pd.DataFrame()
ativos = []

"""
    - df: DataFrame
    - tickers: é uma lista que deve ser populada com os tickers
    - start: data de início, i.e, a partir de quando desejo analisar?!
    - end: data de fim, i.e, qual o útlimo dia que quero analisar?!
"""
def baixa_dados(df, tickers, start, end):
    for t in tickers:
        # web.get_data_yahoo - API que nos permite consultar os tickers e baixar os dados
        df[t] = web.get_data_yahoo(t, start=start, end=end)['Adj Close']
    return df


def main():
    if choice == 'Home':
        with st.form(key='main_form'):

            start = st.date_input('Data de início AAAA-MM-DD')
            end = st.date_input('Data de fim AAAA-MM-DD')

            for i in range(2):
                ativos.append(st.text_input('Cód. do ativo + .SA: ', key=str(i)))

            submit = st.form_submit_button(label='Enviar')
        # Baixando os dados do Yahoo
        if submit:
            dados = baixa_dados(df=carteira, tickers=ativos, start=start, end=end)
            st.line_chart(dados.head())

        # TODO: Redirecionar esse st.write(carteira) pra outra tela do menu intitulada 'Charts'.
        #st.line_chart(dados)

    if choice == 'Charts':
        """
            O problema está aqui.
            
            Eu gostaria de retornar um gráfico de linhas dos tickers recebidos na opção Home, mas não consigo.

        """
        st.line_chart(dados)


if __name__ == '__main__':
    main()

【问题讨论】:

  • 回溯有助于定位故障线。考虑行if submit:。假设没有提交,所以没有设置dados。无论如何,您都尝试使用它。

标签: python pandas streamlit


【解决方案1】:

dados 变量在 choice == 'Home' 块内定义。
因此,当您尝试在 choice == 'Charts': 块中使用它时,

st.line_chart(dados)

那里没有定义代码行。
为了在两个块中使用它,您应该将它定义为一个全局变量/在包含这两种方法的范围内。

【讨论】:

  • 我确实在选择之外使用了dados == 'Home',但出现以下错误:UnboundLocalError: local variable 'submit' referenced before assignment。我也用提交按钮尝试了一些东西,但没有任何效果。
  • 您正在尝试在那里使用它,但它应该在此之前定义/初始化。
  • 我解决了使用st.session_state.dados 而不是dados = baixa_dados(...)。感谢您的帮助!
猜你喜欢
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
  • 2017-08-10
  • 2020-01-16
  • 2019-12-05
  • 2017-09-19
  • 2020-09-26
相关资源
最近更新 更多