-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathdemo.py
81 lines (63 loc) · 2.73 KB
/
demo.py
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
81
import pandas as pd, numpy as np
import matplotlib.pyplot as plt
from bokeh.embed import server_document
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure
import param
import panel as pn
from bokeh.server.server import Server
from tornado.ioloop import IOLoop
df = pd.read_csv("data/avocado.csv.zip").drop(columns = ["Unnamed: 0"])
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date')
class Test(param.Parameterized):
offset = param.Number(default=0.0, bounds=(-5.0, 5.0))
N = param.Integer(default=200, bounds=(0, None))
amplitude = param.Number(default=1.0, bounds=(-5.0, 5.0))
phase = param.Number(default=0.0, bounds=(0.0, 2 * np.pi))
frequency = param.Number(default=1.0, bounds=(0.1, 5.1))
def sine(self):
x = np.linspace(0, 4 * np.pi, self.N)
y = self.amplitude * np.sin(self.frequency * x + self.phase) + self.offset
return x, y
@param.depends('N', 'frequency', 'amplitude', 'offset', 'phase')
def plot(self):
x, y = self.sine()
self.df = pd.DataFrame(dict(x = x, y = y))
# Plot
fig = plt.figure(figsize = (15, 6))
ax = fig.add_subplot(121);
self.df.plot(x = "x", y = "y", ax = ax)
fig.tight_layout();
plt.close()
return fig;
def panel(self):
return pn.Column(self.param, self.plot)
class Avocado(param.Parameterized):
column = param.ObjectSelector(objects = df.select_dtypes(exclude = ["object", "datetime64[ns]"]).columns.tolist())
date = param.DateRange(bounds = [df.index.min(), df.index.max()])
@param.depends('column', 'date')
def plot(self):
if self.column:
fig, ax = plt.subplots(nrows = 1, ncols = 1, figsize = (10, 5))
if self.date:
date_range = (df.index > self.date[0]) & (df.index < self.date[1])
date_range_str = f"- {self.date[0].strftime('%Y-%m-%d')} - {self.date[1].strftime('%Y-%m-%d')}"
df_filtered = df[date_range][self.column]
else:
date_range_str = ""
df_filtered = df[self.column]
df_filtered.plot(ax = ax, title = f"Column - {self.column} {date_range_str}")
plt.close()
return fig
def panel(self):
return pn.Row(self.param, self.plot)
test = Test()
avocdo = Avocado()
# Server Config
routes = {
# route/url : panel application / layout
'avocado': avocdo.panel,
'test': test.panel
}
pn.serve(routes, port = 8080, show = False, websocket_origin = "127.0.0.1:8080")