Streamlit error "UnboundLocalError: local variable 'dados' referenced before assignment"

Streamlit error "UnboundLocalError: local variable 'dados' referenced before assignment"

我正在尝试使用 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()

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

st.line_chart(dados)

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