kill47bill/build_dashboard
0
1import panel as pn2import pandas as pd3import hvplot.pandas4 5pn.extension("tabulator")6 7ACCENT="teal"8 9styles = {10 "box-shadow": "rgba(50, 50, 93, 0.25) 0px 6px 12px -2px, rgba(0, 0, 0, 0.3) 0px 3px 7px -3px",11 "border-radius": "4px",12 "padding": "10px",13}14 15image = pn.pane.JPG("https://assets.holoviz.org/panel/tutorials/wind_turbines_sunset.png")16 17# Extract Data18 19@pn.cache() # only download data once20def get_data():21 return pd.read_csv("https://assets.holoviz.org/panel/tutorials/turbines.csv.gz")22 23# Transform Data24 25source_data = get_data()26min_year = int(source_data["p_year"].min())27max_year = int(source_data["p_year"].max())28top_manufacturers = (29 source_data.groupby("t_manu").p_cap.sum().sort_values().iloc[-10:].index.to_list()30)31 32def filter_data(t_manu, year):33 data = source_data[(source_data.t_manu == t_manu) & (source_data.p_year <= year)]34 return data35 36# Filters37 38t_manu = pn.widgets.Select(39 name="Manufacturer",40 value="Vestas",41 options=sorted(top_manufacturers),42 description="The name of the manufacturer",43)44p_year = pn.widgets.IntSlider(name="Year", value=max_year, start=min_year, end=max_year)45 46# Transform Data 247 48df = pn.rx(filter_data)(t_manu=t_manu, year=p_year)49count = df.rx.len()50total_capacity = df.t_cap.sum()51avg_capacity = df.t_cap.mean()52avg_rotor_diameter = df.t_rd.mean()53 54# Plot Data55 56fig = (57 df[["p_year", "t_cap"]].groupby("p_year").sum() / 10**658).hvplot.bar(59 title="Capacity Change",60 rot=90,61 ylabel="Capacity (GW)",62 xlabel="Year",63 xlim=(min_year, max_year),64 color=ACCENT, 65)66 67# Display Data68 69indicators = pn.FlexBox(70 pn.indicators.Number(71 value=count, name="Count", format="{value:,.0f}", styles=styles72 ),73 pn.indicators.Number(74 value=total_capacity / 1e6,75 name="Total Capacity (GW)",76 format="{value:,.1f}",77 styles=styles,78 ),79 pn.indicators.Number(80 value=avg_capacity/1e3,81 name="Avg. Capacity (MW)",82 format="{value:,.1f}",83 styles=styles,84 ),85 pn.indicators.Number(86 value=avg_rotor_diameter,87 name="Avg. Rotor Diameter (m)",88 format="{value:,.1f}",89 styles=styles,90 ),91)92 93plot = pn.pane.HoloViews(fig, sizing_mode="stretch_both", name="Plot")94table = pn.widgets.Tabulator(df, sizing_mode="stretch_both", name="Table")95 96# Layout Data97 98tabs = pn.Tabs(99 plot, table, styles=styles, sizing_mode="stretch_width", height=500, margin=10100)101 102pn.template.FastListTemplate(103 title="Wind Turbine Dashboard",104 sidebar=[image, t_manu, p_year],105 main=[pn.Column(indicators, tabs, sizing_mode="stretch_both")],106 main_layout=None,107 accent=ACCENT,108).servable()