Spaces:
Runtime error
Runtime error
# start with the setup | |
# supress warnings about future deprecations | |
# import warnings | |
# warnings.simplefilter(action='ignore', category=FutureWarning) | |
import panel as pn | |
import vega_datasets | |
import pandas as pd | |
import altair as alt | |
# import numpy as np | |
# import pprint | |
import datetime as dt | |
from vega_datasets import data | |
# import matplotlib.pyplot as plt | |
# Solve a javascript error by explicitly setting the renderer | |
# alt.renderers.enable('jupyterlab') | |
#load data | |
# df1=pd.read_csv("https://raw.githubusercontent.com/dallascard/SI649_public/main/altair_hw3/approval_polllist.csv") | |
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'}) | |
## Viz 4 | |
# Import panel and vega datasets | |
# import panel as pn | |
# import vega_datasets | |
# Enable Panel extensions | |
pn.extension(design='bootstrap') | |
pn.extension('vega') | |
template = pn.template.BootstrapTemplate( | |
title='SI649 Altair Assignment 3 (ritaycw)', | |
) | |
# 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 | |
approve_data = df2[df2['choice']=='approve'] | |
filtered_data = approve_data[approve_data['subgroup'] == subgroup] | |
filtered_data = filtered_data[(filtered_data['timestamp'].dt.date >= date_range[0]) & \ | |
(filtered_data['timestamp'].dt.date <= date_range[1])] | |
filtered_data['mov_avg'] = filtered_data['rate'].rolling(window=moving_av_window).mean().shift(-moving_av_window//2) | |
# Line chart | |
smoothed_line = alt.Chart(filtered_data).mark_line(color='red', size=2).encode( | |
x='timestamp:T', | |
y='mov_avg:Q' | |
) | |
# Scatter plot with individual polls | |
scatter4 = alt.Chart(filtered_data).mark_point(size=2, opacity=0.7, color='grey').encode( | |
x='timestamp:T', | |
y=alt.Y('rate:Q', title='approve', scale=alt.Scale(domain=[30, 60])), | |
) | |
# Put them togetehr | |
plot = (scatter4+smoothed_line).encode( | |
y=alt.Y(axis=alt.Axis(title='approve, mov_avg')) | |
) | |
# Return the combined chart | |
return pn.pane.Vega(plot) | |
# Create the selection widget | |
dropdown = pn.widgets.Select(options=['All polls', 'Adults', 'Voters'], name='Select') | |
# Create the slider for the date range | |
date_range_slider = pn.widgets.DateRangeSlider(name='Date Range Slider', | |
start=df2['timestamp'].dt.date.min(), | |
end=df2['timestamp'].dt.date.max(), | |
value=(df2['timestamp'].dt.date.min(), df2['timestamp'].dt.date.max()), | |
step=1) | |
# Create the slider for the moving average window | |
window_size_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=dropdown, | |
date_range=date_range_slider, | |
moving_av_window=window_size_slider)) | |
# window_size_slider | |
# Combine everything in a Panel Column to create an app | |
maincol = pn.Column() | |
maincol.append("# Visualization 4: Interactive smoothing (hosted on Huggingface using Panel)") | |
maincol.append(final) | |
maincol.append(dropdown) | |
maincol.append(date_range_slider) | |
maincol.append(window_size_slider) | |
# set the app to be servable | |
template.main.append(maincol) | |
template.servable(title="SI649 Altair Assignment 3 (ritaycw)") |