File size: 2,901 Bytes
e3c43cd
 
 
040ad50
e3c43cd
 
 
040ad50
49158f8
e3c43cd
 
040ad50
49158f8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
040ad50
49158f8
 
 
 
 
040ad50
49158f8
 
040ad50
49158f8
 
040ad50
 
49158f8
 
040ad50
49158f8
 
 
 
 
 
 
040ad50
 
49158f8
 
 
 
 
 
 
040ad50
49158f8
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# import io
# import random
# from typing import List, Tuple


# from PIL import Image
# from transformers import CLIPModel, CLIPProcessor

# imports we will use
# import warnings
# warnings.simplefilter(action='ignore', category=FutureWarning)

import altair as alt
import pandas as pd
from vega_datasets import data as vega_data
import panel as pn
import datetime as dt

#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'})

# Enable Panel extensions
pn.extension(design ='bootstrap')
pn.extension('vega')

# Define a function to create and return a plot
df2 = df2[df2['choice'] =='approve']
def create_plot(subgroup, date_range, moving_av_window):

    # Apply any required transformations to the data in pandas
    filtered = df2[df2['subgroup'] == subgroup]
    filtered = filtered[(filtered['timestamp'].dt.date >= date_range[0]) & (filtered['timestamp'].dt.date <= date_range[1])]
    filtered['smoothed'] = filtered['rate'].rolling(window=moving_av_window, min_periods=1).mean().shift(-1)

    # Line chart
    line = alt.Chart(filtered).mark_line(color='red').encode(
        x=alt.X('timestamp:T'),
        y = alt.Y('smoothed').scale(domain=(30, 60))
    )

    # Scatter plot with individual polls
    scatter = alt.Chart(filtered).mark_point(filled=True, color='gray', size = 6).encode(
        x = alt.X('timestamp:T'),
        y = alt.Y('rate').scale(domain=(30, 60)),
    )

    # Put them together
    plot = line + scatter

    # 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
# Reference https://panel.holoviz.org/reference/widgets/DateRangeSlider.html
date_range_slider = pn.widgets.DateRangeSlider(
    name='Date Range Slider',
    start=dt.datetime(2021, 1, 26).date(), end=dt.datetime(2023, 2, 14).date(),
    value=(dt.datetime(2021, 1, 26).date(), dt.datetime(2023, 2, 14).date()),
    step=2
)

# Create the slider for the moving average window
# Reference Int Slider: https://panel.holoviz.org/reference/widgets/IntSlider.html
win_slider = pn.widgets.IntSlider(name='Moving Average Window', start=1, end=80, step=1, value=20)

# Bind the widgets to the create_plot function
bplot = pn.bind(create_plot, subgroup=select, 
                date_range=date_range_slider,moving_av_window = win_slider )

# Combine everything in a Panel Column to create an app
# Reference: https://panel.holoviz.org/how_to/streamlit_migration/interactivity.html
viz4 = pn.Column(bplot,select,date_range_slider,win_slider)
# set the app to be servable
viz4.show()