高效动态曲线更新的概念证明?

2024-09-30 06:24:57 发布

您现在位置:Python中文网/ 问答频道 /正文

为了证明概念,我制作了一个由四支OHLC蜡烛组成的Bokeh图。在

我想扩展演示动画的情节,使目前的烛台将移动和更新,以回应其OHLC数据的变化。重要的一点是,只有组件(glyphs?)最后的蜡烛应该更新,而不是整个情节。在

其目的是演示一种计算量很轻的方法,可以放大到一个更大的图表中,其中包含许多蜡烛,并且非常频繁地更新“live”蜡烛。在

有没有人能在代码中概述或演示如何实现这一点?在

谢谢你。在

Jupyter笔记本电脑Python代码(包括39秒的合成滴答数据,以便于4 x 10秒烛台动画):

from ipywidgets import interact
import numpy as np
from bokeh.plotting import figure, output_notebook, show
import datetime as dt
import pandas as pd
from math import pi

datum = dt.datetime.now()
time_delta = dt.timedelta(seconds=1)

tick_data = [(datum + (time_delta*1), 20),
 (datum + (time_delta*2), 19.67603177022472),
 (datum + (time_delta*3), 20.431878609290592),
 (datum + (time_delta*4), 20.20576131687243),
 (datum + (time_delta*5), 20.715609070433032),
 (datum + (time_delta*6), 20.722416975732024),
 (datum + (time_delta*7), 20.722027468712426),
 (datum + (time_delta*8), 20.728022489796615),
 (datum + (time_delta*9), 20.70996968619282),
 (datum + (time_delta*10), 20.70096021947874),
 (datum + (time_delta*11), 20.729546647699372),
 (datum + (time_delta*12), 20.759081440837274),
 (datum + (time_delta*13), 20.823807346441097),
 (datum + (time_delta*14), 20.610018797947472),
 (datum + (time_delta*15), 20.591932124168064),
 (datum + (time_delta*16), 20.584175853951805),
 (datum + (time_delta*17), 20.563650527527987),
 (datum + (time_delta*18), 20.617504106758794),
 (datum + (time_delta*19), 20.42010872326373),
 (datum + (time_delta*20), 20.391860996799267),
 (datum + (time_delta*21), 20.3913190739894),
 (datum + (time_delta*22), 20.34308794391099),
 (datum + (time_delta*23), 20.2225778590662),
 (datum + (time_delta*24), 20.47050754458162),
 (datum + (time_delta*25), 20.83193618858914),
 (datum + (time_delta*26), 20.80978509373571),
 (datum + (time_delta*27), 20.80917543057461),
 (datum + (time_delta*28), 20.859506511541262),
 (datum + (time_delta*29), 20.596402987349492),
 (datum + (time_delta*30), 20.644024454266795),
 (datum + (time_delta*31), 20.58183881183424),
 (datum + (time_delta*32), 20.59023861538722),
 (datum + (time_delta*33), 20.454961133973477),
 (datum + (time_delta*34), 20.495334383308776),
 (datum + (time_delta*35), 20.483818523599044),
 (datum + (time_delta*36), 20.593964334705078),
 (datum + (time_delta*37), 20.91518908025538),
 (datum + (time_delta*38), 20.87942217480398),
 (datum + (time_delta*39), 20.772392419854697)]


#Prepare to convert fractal tick data into candlesticks
candle_delta = dt.timedelta(seconds=10)
candle_close_time = datum + candle_delta
candle_data = []   

#Initialise
op, hi, lo, cl = 0, 0, 0, 0

#Convert ticks to candlesticks
for (dtval, val) in tick_data:
    if candle_close_time < dtval:
        #store the completed candle
        candle_data.append((candle_close_time, op, hi, lo, cl))        
        #increment to the next candle
        candle_close_time += candle_delta
        #Reset
        op, hi, lo, cl = 0, 0, 0, 0

    if dtval <= candle_close_time and op==0:
        #set initial values
        op, hi, lo, cl = val, val, val, val
    elif dtval <= candle_close_time and op!=0:
        #update values as appropriate
        hi = val if val > hi else hi
        lo = val if val < lo else lo
        cl = val

    #final tick
    if dtval == tick_data[-1][0]:
        #store the completed candle
        candle_data.append((candle_close_time, op, hi, lo, cl))

#print(str(candle_data))

df = pd.DataFrame(candle_data, columns=list('dohlc'))

#For rectangle positioning
mids = (df.o + df.c)/2
#Rectangle height
spans = abs(df.c-df.o)
#Detect up / down candle body
inc = df.c > df.o
dec = df.o > df.c
#Candle width
w = 10 * 500

TOOLS = "pan,wheel_zoom,box_zoom,reset,save"
p = figure(x_axis_type="datetime", tools=TOOLS, plot_width=500, title = "Four Candles")

p.xaxis.major_label_orientation = pi/4
p.grid.grid_line_alpha=0.3

#Wick
p.segment(df.d, df.h, df.d, df.l, color="#000000")
#Up body
p.rect(df.d[inc], mids[inc], w, spans[inc], fill_color="#09ff00", line_color="#09ff00")
#Down body
p.rect(df.d[dec], mids[dec], w, spans[dec], fill_color="#ff0000", line_color="#ff0000")


output_notebook()
show(p)

Four Candles


Tags: importlodfclosedatatimeclval

热门问题