Progress bar in a cached function

I see this was asked here but never answered.

I’m trying to run a progress bar in a cached function. The function hits an API, downloading the dataset, then returning a df.

If I put a progress bar in here, it will not show properly. I tried something like this but did not work:

@st.cache_data()
def load_data(data_id, row_count):
    offset = 0
    data_rows = []

    progress_bar = st.progress(offset, "Loading data...")

    while True:
        uri = f'https://data.cityofnewyork.us/resource/{data_id}.json?$offset={offset}'
        r = requests.get(uri).json()
        if r:
            data_rows += r
            offset += 1000
            progress_bar.progress(offset/row_count, "Loading data...")
        else:
            break
        if offset > 100000:
            break

any ideas?

To resolve this issue, simply deactivate the default loading spinner associated with the cache function @st.cache_data(show_spinner=False).

import requests
import streamlit as st

@st.cache_data(show_spinner=False)
def load_data(data_id, row_count):
    offset = 0
    data_rows = []

    progress_bar = st.progress(offset/row_count, "Loading data...")

    while offset <= 100000:
        uri = f'https://data.cityofnewyork.us/resource/{data_id}.json?$offset={offset}'
        r = requests.get(uri).json()
        if not r:
            break

        data_rows += r
        offset += 1000
        progress_bar.progress(min(offset/row_count, 1), "Loading data...")

    return data_rows

# Load data
data_id = 'nc67-uf89'
row_count = 100000
data = load_data(data_id, row_count)
st.write(data)

I have code very similar to @Encrypt, but it is not working as expected. When the function return value is already cached but on button press the cached function gets called again, for a second or two the progress bar shows up. It is moving very fast to 100% and then disappears. This happens even though I confirmed via print() statements that the function body is not run again. This looks annoying. How to prevent this?

Could you please share your code snippet? I suspect there might be a bug causing the progress value to become 0. I have provided a sample code below where progress bar shouldn’t disappear after data loading.

import streamlit as st
import time

@st.cache_data(show_spinner=False)
def load_data(data_id):
    progress = 0
    progress_bar = st.progress(progress, "Loading data...")

    for progress in range(0, 101):
        time.sleep(0.1)
        progress_bar.progress(progress, "Loading data...")

    return "Some data"

# Load data
data_id = "1"
data = load_data(data_id)
st.write(data)