lab7 / app.py
jchoo's picture
Update app.py
5653dda verified
raw
history blame
2.52 kB
# Import panel and vega datasets
import panel as pn
import vega_datasets
df2=pd.read_csv("https://raw.githubusercontent.com/dallascard/SI649_public/main/altair_hw3/approval_topline.csv")
df2_approve = df2[df2['choice'] == 'approve']
# Enable Panel extensions
pn.extension()
# pn.extension('vega', 'tabulator')
# pn.extension(design='bootstrap')
# pn.extension('vega')
template = pn.template.BootstrapTemplate(
title='SI649 Altair3',
)
# Define a function to create and return a plot
def create_plot(subgroup, date_range, moving_av_window):
# Apply any required transformations to the data in pandas)
filtered_df = df2_approve[df2_approve['subgroup'] == subgroup]
filtered_df = filtered_df[(filtered_df['timestamp'].dt.date >= date_range[0]) & (filtered_df['timestamp'].dt.date <= date_range[1])]
filtered_df['mov_avg'] = filtered_df['rate'].rolling(window=moving_av_window).mean().shift(moving_av_window//2)
# Line chart
line_chart = alt.Chart(filtered_df).mark_line(color='red', size=2).encode(
x='timestamp:T',
y='mov_avg:Q'
)
# Scatter plot with individual polls
scatter_plot = alt.Chart(filtered_df).mark_point(color='grey', size=2, opacity=0.7).encode(
x='timestamp:T',
y='rate:Q'
)
# Put them togetehr
plot = scatter_plot + line_chart
# Return the combined chart
return plot
# # Create the selection widget
select = pn.widgets.Select(name='Select', options=['All polls', 'Adults', 'Voters'])
# # Create the slider for the date range
date_range_slider = pn.widgets.DateRangeSlider(
name='Date Range Slider',
start=df2_approve['timestamp'].dt.date.min(), end=df2_approve['timestamp'].dt.date.max(),
value=(df2_approve['timestamp'].dt.date.min(), df2_approve['timestamp'].dt.date.max()),
step=1
)
# # Create the slider for the moving average window
moving_av_slider = pn.widgets.IntSlider(name='Moving Average Window', start=1, end=100, value=1)
# Bind the widgets to the create_plot function
final = pn.Row(pn.bind(create_plot,
subgroup=select,
date_range=date_range_slider,
moving_av_window=moving_av_slider))
# # Combine everything in a Panel Column to create an app
maincol=pn.Column()
maincol.append(final)
maincol.append(select)
maincol.append(date_range_slider)
maincol.append(moving_av_slider)
template.main.append(maincol)
# # set the app to be servable
template.serverable(title='SI649 Altair3')