In [ ]:
import collections
import datetime
import time

In [ ]:
import numpy as np

In [ ]:
from bokeh.plotting import *

To run these examples you must execute the command python bokeh-server in the top-level Bokeh source directory first.


In [ ]:
output_notebook(url="default")

In [ ]:
TS_MULT_us = 1e6
UNIX_EPOCH = datetime.datetime(1970, 1, 1, 0, 0) #offset-naive datetime

def int2dt(ts, ts_mult=TS_MULT_us):
    """Convert timestamp (integer) to datetime"""
    return(datetime.datetime.utcfromtimestamp(float(ts)/ts_mult))
        
def td2int(td, ts_mult=TS_MULT_us):
    """Convert timedelta to integer"""
    return(int(td.total_seconds()*ts_mult))
        
def dt2int(dt, ts_mult=TS_MULT_us):
    """Convert datetime to integer"""
    delta = dt - UNIX_EPOCH
    return(int(delta.total_seconds()*ts_mult))
        
def int_from_last_sample(dt, td):
    return(dt2int(dt) - dt2int(dt) % td2int(td))

In [ ]:
TS_MULT = 1e3
td_delay = datetime.timedelta(seconds=0.5)
delay_s = td_delay.total_seconds()
delay_int = td2int(td_delay, TS_MULT)

value = 1000 # initial value
N = 100 # number of elements into circular buffer

buff = collections.deque([value]*N, maxlen=N)

In [ ]:
t_now = datetime.datetime.utcnow()
ts_now = dt2int(t_now, TS_MULT)
t = collections.deque(np.arange(ts_now-N*delay_int, ts_now, delay_int), maxlen=N)

In [ ]:
p = figure(x_axis_type="datetime")
p.line(list(t), list(buff), color="#0000FF", name="line_example")

In [ ]:
renderer = p.select(dict(name="line_example"))[0]
ds = renderer.data_source
show(p)
while True:
    ts_now = dt2int(datetime.datetime.utcnow(), 1e3)
    t.append(ts_now)
    ds.data['x'] = list(t)

    value += np.random.uniform(-1, 1)
    buff.append(value)
    ds.data['y'] = list(buff)
    
    cursession().store_objects(ds)
    time.sleep(delay_s)

In [ ]: