# 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)")