Spaces:
Running
Running
""" | |
# Caching Example | |
See https://awesome-panel.org/resources/caching_example | |
""" | |
import time | |
import hvplot.pandas # pylint: disable=unused-import | |
import numpy as np | |
import pandas as pd | |
import panel as pn | |
pn.extension(design="material") | |
ACCENT_COLOR = "#1f77b4" | |
np.random.seed([3, 1415]) | |
PERIODS = 1 * 24 * 60 # minutes. I.e. 1 days | |
DATA = pd.DataFrame( | |
{ | |
"time": pd.date_range("2020-01-01", periods=PERIODS, freq="T"), | |
"price": np.random.randn(PERIODS) + 98, | |
} | |
) | |
def _load_data(frac=0.1): | |
time.sleep(0.5 + frac * 0.5) | |
return DATA.sample(frac=frac) | |
def _plot_data(frac=0.1): | |
time.sleep(0.5) | |
data = _load_data(frac) | |
return data.hvplot(x="time", y="price") | |
def _plot_data_cached(frac): | |
return _plot_data(frac) | |
# Create Widgets | |
fraction = pn.widgets.FloatSlider(value=0.1, start=0.1, end=1.0, step=0.1, name="Fraction of data") | |
duration = pn.widgets.StaticText(value="", name="Time to create plot") | |
use_cache = pn.widgets.Checkbox(value=False, name="Use Cache") | |
preload_cache = pn.widgets.Button(name="Preload Cache", button_type="primary", disabled=True) | |
clear_cache = pn.widgets.Button(name="Clear Cache", disabled=True) | |
preload_progress = pn.widgets.Progress( | |
name="Progress", active=False, value=0, max=100, sizing_mode="stretch_width", disabled=True | |
) | |
plot_panel = pn.pane.HoloViews(min_height=500, sizing_mode="stretch_both") | |
# Setup interactivity | |
def _clear_cache(*_): | |
_plot_data_cached.clear() | |
clear_cache.on_click(_clear_cache) | |
def _preload_cache(*_): | |
for index in range(0, 11, 1): | |
frac_ = round(index / 10, 1) | |
preload_progress.value = int(frac_ * 100) | |
_plot_data_cached(frac_) | |
preload_progress.value = 0 | |
preload_cache.on_click(_preload_cache) | |
def _update_plot(frac): | |
start_counter = time.perf_counter() | |
frac = round(frac, 1) | |
if use_cache.value: | |
plot = _plot_data_cached(frac) | |
else: | |
plot = _plot_data(frac) | |
end_counter = time.perf_counter() | |
duration.value = str(round(end_counter - start_counter, 4)) + " seconds" | |
# Please note DiskCache does not cache the options | |
plot.opts(color=ACCENT_COLOR, responsive=True) | |
plot_panel.object = plot | |
def _update_cache_widgets(use_cache): # pylint: disable=redefined-outer-name | |
disabled = not use_cache | |
preload_cache.disabled = disabled | |
clear_cache.disabled = disabled | |
preload_progress.disabled = disabled | |
# Layout the app | |
pn.Column( | |
pn.pane.Markdown( | |
"# Speed up slow functions with caching", sizing_mode="stretch_width" | |
), | |
fraction, | |
duration, | |
use_cache, | |
plot_panel, | |
pn.Row(preload_cache, clear_cache,), | |
preload_progress, | |
).servable() | |
pn.state.onload(lambda: fraction.param.trigger("value")) | |