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)
那里没有定义代码行。
为了在这两个块中使用它,您应该将它定义为全局变量/在包含这两种方法的范围内。
我正在尝试使用 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)
那里没有定义代码行。
为了在这两个块中使用它,您应该将它定义为全局变量/在包含这两种方法的范围内。