lab7 / app.py
Tomatolinn's picture
Update app.py
40e3143 verified
# start with the setup
# supress warnings about future deprecations
import pandas as pd
import altair as alt
import numpy as np
import pprint
import datetime as dt
from vega_datasets import data
import panel as pn
import vega_datasets
# Solve a javascript error by explicitly setting the renderer
#load data
df2=pd.read_csv("https://raw.githubusercontent.com/dallascard/SI649_public/main/altair_hw3/approval_topline.csv")
df2['timestamp']=pd.to_datetime(df2['timestamp'])
df2=pd.melt(df2, id_vars=['president', 'subgroup', 'timestamp'], value_vars=['approve','disapprove']).rename(columns={'variable':'choice', 'value':'rate'})
# Import panel and vega datasets
import panel as pn
import vega_datasets
# Enable Panel extensions
pn.extension(design='bootstrap')
template = pn.template.BootstrapTemplate(
title='SI649 Lab7',
)
maincol = pn.Column()
# Define a function to create and return a plot
df2_approve = df2[df2['choice'] == 'approve']
def create_plot(subgroup, date_range, moving_av_window):
# Apply any required transformations to the data in pandas
filtered_data = df2_approve[df2_approve['subgroup'] == subgroup]
start_date, end_date = pd.to_datetime(date_range[0]), pd.to_datetime(date_range[1])
filtered_data = filtered_data[(filtered_data['timestamp'] >= start_date) & (filtered_data['timestamp'] <= end_date)]
filtered_data['rate_change'] = filtered_data['rate'].rolling(window=moving_av_window).mean()
# Line chart
base_line = alt.Chart(filtered_data).mark_line(color='red', size=2).encode(
x='timestamp:T',
y=alt.Y('rate_change:Q', scale=alt.Scale(domain=[30, 60]))
)
# Scatter plot with individual polls
base_scatter = alt.Chart(filtered_data).mark_point(size=2, opacity=0.7, color="gray").encode(
x='timestamp:T',
y=alt.Y('rate:Q'),
)
# Put them togetehr
plot = (base_scatter + base_line)
# Return the combined chart
return plot
# Create the selection widget
subgroup_widget = pn.widgets.Select(name="Select", options=['Adults', 'All polls', 'Voters'])
# Create the slider for the date range
date_slider = pn.widgets.DateRangeSlider(
name='Date Range Slider',
start = pd.to_datetime('2021-01-26'),
end = pd.to_datetime('2023-02-14'),
value = (pd.to_datetime('2021-01-26'), pd.to_datetime('2023-02-14'))
)
# Create the slider for the moving average window
window_widget = pn.widgets.IntSlider(name="Moving average window", value=1, start=1, end=100, step=1)
# Bind the widgets to the create_plot function
bound_plot=pn.bind(create_plot, subgroup=subgroup_widget, date_range=date_slider, moving_av_window=window_widget)
# Combine everything in a Panel Column to create an app
maincol.append(subgroup_widget)
maincol.append(date_slider)
maincol.append(window_widget)
maincol.append(bound_plot)
template.main.append(maincol)
# set the app to be servable
template.servable(title="SI649 Lab7")