[SOLVED] Plot data into different selectbox

Hi, everybody!

I have a selectbox with two options: Home, Charts.

In my first option - the initial page - the user submit stocks names, start data and end data. Code is below:

menu = ['Home', 'Gráficos']
choice = st.sidebar.selectbox("Menu", menu)

carteira = pd.DataFrame()
ativos = []


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:
            for ticker in ativos:
                carteira[ticker] = web.get_data_yahoo(ticker, start=start, end=end)['Adj Close']

        # TODO: Redirecionar esse st.write(carteira) pra outra tela do menu intitulada 'Gráficos'.
        st.line_chart(carteira)

But I want that the option named ‘Charts’ plot data that user required, but I have no success.

Can anyone help me? Full code is below.

# 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')

# Carregando um objeto DataFrame e a lista vazia de ativos
# TODO: isso deve estar interno a uma função?

menu = ['Home', 'Gráficos']
choice = st.sidebar.selectbox("Menu", menu)

carteira = pd.DataFrame()
ativos = []


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:
            for ticker in ativos:
                carteira[ticker] = web.get_data_yahoo(ticker, start=start, end=end)['Adj Close']

        # TODO: Redirecionar esse st.write(carteira) pra outra tela do menu intitulada 'Gráficos'.
        st.line_chart(carteira)

    if choice == 'Gráficos':
        st.line_chart(carteira)




if __name__ == '__main__':
    main()

I appreciate any kind of help.

People, I tried other code but it doesn’t fix my problem :frowning: code below!

enu = ['Home', 'Charts']
choice = st.sidebar.selectbox("Menu", menu)

carteira = pd.DataFrame()
ativos = []

def baixa_dados(df, tickers, start, end):
    for t in tickers:
        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':
        st.line_chart(dados)


if __name__ == '__main__':
    main()

Hi @biangomes,

You could try storing the output of baixa_dados(df=carteira, tickers=ativos, start=start, end=end) as a session state variable so that its value persists across both the pages :grinning_face_with_smiling_eyes:

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')

menu = ['Home', 'Charts']
choice = st.sidebar.selectbox("Menu", menu)

carteira = pd.DataFrame()
ativos = []

def baixa_dados(df, tickers, start, end):
    for t in tickers:
        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:
            st.session_state.dados = baixa_dados(df=carteira, tickers=ativos, start=start, end=end)
            st.line_chart(st.session_state.dados.head())

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

    if choice == 'Charts':
        st.line_chart(st.session_state.dados)

if __name__ == '__main__':
    main()

Output:

plot-multipage

Happy Streamlit’ing! :balloon:
Snehan

Thank you so much!!!

1 Like