Update app.py
Browse files
app.py
CHANGED
|
@@ -101,26 +101,40 @@ moving_avg_slider = pn.widgets.IntSlider(name='Moving Average Window', start=1,
|
|
| 101 |
def create_plot(subgroup, date_range, moving_av_window):
|
| 102 |
start_date, end_date = date_range[0].date(), date_range[1].date() # Convert to date
|
| 103 |
data = df2[(df2['subgroup'] == subgroup) & (df2['choice'] == "approve") & (df2['timestamp'].dt.date.between(start_date, end_date))]
|
| 104 |
-
|
|
|
|
|
|
|
|
|
|
| 105 |
data = data.sort_values('timestamp')
|
| 106 |
data['moving_avg'] = data['rate'].rolling(window=moving_av_window, min_periods=1).mean()
|
| 107 |
|
| 108 |
-
chart
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
)
|
| 114 |
|
| 115 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 116 |
|
| 117 |
# Main layout
|
| 118 |
main_layout = pn.Column(
|
| 119 |
"# Polling Data Interactive Visualization",
|
|
|
|
| 120 |
subgroup_select,
|
| 121 |
date_slider,
|
| 122 |
moving_avg_slider,
|
| 123 |
-
pn.panel(create_plot, reactive=True)
|
| 124 |
)
|
| 125 |
|
| 126 |
# Create a basic template
|
|
|
|
| 101 |
def create_plot(subgroup, date_range, moving_av_window):
|
| 102 |
start_date, end_date = date_range[0].date(), date_range[1].date() # Convert to date
|
| 103 |
data = df2[(df2['subgroup'] == subgroup) & (df2['choice'] == "approve") & (df2['timestamp'].dt.date.between(start_date, end_date))]
|
| 104 |
+
|
| 105 |
+
min_rate = df2['rate'].min()
|
| 106 |
+
max_rate = df2['rate'].max()
|
| 107 |
+
|
| 108 |
data = data.sort_values('timestamp')
|
| 109 |
data['moving_avg'] = data['rate'].rolling(window=moving_av_window, min_periods=1).mean()
|
| 110 |
|
| 111 |
+
# Line chart for moving average
|
| 112 |
+
line = alt.Chart(data).mark_line(interpolate='natural').encode(
|
| 113 |
+
x=alt.X('timestamp:T', axis=alt.Axis(title='', format='%b %d, %Y')),
|
| 114 |
+
y=alt.Y('moving_avg:Q', axis=alt.Axis(title='approve,mov_avg'), scale=alt.Scale(domain=[min_rate, max_rate])),
|
| 115 |
+
color=alt.value('red')
|
| 116 |
+
)
|
| 117 |
|
| 118 |
+
# Scatter plot for individual data points
|
| 119 |
+
points = alt.Chart(data).mark_point().encode(
|
| 120 |
+
x=alt.X('timestamp:T'),
|
| 121 |
+
y=alt.Y('rate:Q', axis=alt.Axis(title='approve,mov_avg'), scale=alt.Scale(domain=[min_rate, max_rate])),
|
| 122 |
+
color=alt.value('gray'),
|
| 123 |
+
tooltip=['timestamp:T', 'rate:Q']
|
| 124 |
+
)
|
| 125 |
+
|
| 126 |
+
# Combine line chart and scatter plot
|
| 127 |
+
plot = alt.layer(points, line).resolve_scale(y='shared')
|
| 128 |
+
|
| 129 |
+
return plot
|
| 130 |
|
| 131 |
# Main layout
|
| 132 |
main_layout = pn.Column(
|
| 133 |
"# Polling Data Interactive Visualization",
|
| 134 |
+
pn.panel(create_plot, reactive=True)
|
| 135 |
subgroup_select,
|
| 136 |
date_slider,
|
| 137 |
moving_avg_slider,
|
|
|
|
| 138 |
)
|
| 139 |
|
| 140 |
# Create a basic template
|