Bokeh项目实战:使用CustomJSTransform实现股票价格归一化可视化

Bokeh项目实战:使用CustomJSTransform实现股票价格归一化可视化

bokeh bokeh/bokeh: 是一个用于创建交互式图形和数据的 Python 库。适合用于数据可视化、数据分析和呈现,以及创建动态的 Web 应用。特点是提供了一种简洁、直观的 API 来描述和处理数据,并生成交互式的可视化效果。 bokeh 项目地址: https://gitcode.com/gh_mirrors/bo/bokeh

概述

本文将深入讲解如何利用Bokeh可视化库中的CustomJSTransform功能,实现股票收盘价的归一化处理与可视化展示。通过这个案例,您将掌握Bokeh中自定义JavaScript转换的核心技术。

核心概念解析

1. 数据归一化

归一化是数据分析中常用的预处理技术,它将不同量纲的数据转换到同一尺度。在本例中,我们将股票价格归一化为相对于首日收盘价的比值,这样可以更直观地比较不同股票的价格变化趋势。

2. CustomJSTransform

CustomJSTransform是Bokeh提供的一个强大功能,允许开发者使用JavaScript代码自定义数据转换逻辑。这种转换在浏览器端执行,能够实现高效的数据处理。

代码实现详解

1. 数据准备

首先导入必要的库并加载示例数据:

import numpy as np
from bokeh.models import ColumnDataSource, CustomJSTransform
from bokeh.plotting import figure, show
from bokeh.sampledata.stocks import AAPL, GOOG
from bokeh.transform import transform

2. 创建绘图对象

设置一个带时间轴的绘图区域:

plot = figure(x_axis_type="datetime", title="Normalized Stock Closing Prices",
              width=800, height=350)

3. 数据源配置

使用ColumnDataSource组织数据,这是Bokeh高效渲染的关键:

aapl_source = ColumnDataSource(data=dict(
    aapl_date=datetime(AAPL['date']),
    aapl_close=AAPL['adj_close'],
))

goog_source = ColumnDataSource(data=dict(
    goog_date=datetime(GOOG['date']),
    goog_close=GOOG['adj_close'],
))

4. 自定义JavaScript转换

核心部分:定义归一化转换逻辑:

v_func = """
    const first = xs[0]
    const norm = new Float64Array(xs.length)
    for (let i = 0; i < xs.length; i++) {
        norm[i] = xs[i] / first
    }
    return norm
"""
normalize = CustomJSTransform(v_func=v_func)

这段JavaScript代码实现了:

  1. 获取数组第一个元素作为基准值
  2. 创建新的Float64Array存储结果
  3. 遍历数组,计算每个元素与基准值的比值

5. 绘制归一化曲线

应用自定义转换绘制归一化后的股票价格曲线:

plot.line(x='aapl_date', y=transform('aapl_close', normalize), line_width=2,
        color='#cf3c4d', alpha=0.6, legend_label="Apple", source=aapl_source)
plot.line(x='goog_date', y=transform('goog_close', normalize), line_width=2,
        color='#2f7bce', alpha=0.6, legend_label="Google", source=goog_source)

6. 图表美化

添加各种视觉元素提升图表可读性:

plot.background_fill_color = "#f0f0f0"
plot.xgrid.grid_line_color = None
plot.ygrid.grid_line_color = "black"
plot.ygrid.grid_line_alpha = 0.1
plot.xaxis.axis_label = 'Date'
plot.yaxis.axis_label = 'Normalized Price'
plot.legend.location='top_left'

技术要点总结

  1. 客户端计算优势:CustomJSTransform在浏览器端执行,减轻服务器负担,特别适合大数据量场景。

  2. 数据类型处理:示例中使用Float64Array确保数值精度,避免JavaScript常见的浮点数精度问题。

  3. 数据绑定机制:Bokeh的transform函数将数据源字段与转换逻辑无缝连接,实现声明式编程。

  4. 可视化最佳实践:通过alpha通道设置透明度,避免曲线重叠导致的视觉混淆。

扩展应用

这种技术可以应用于多种场景:

  • 多指标对比分析
  • 时间序列数据的标准化处理
  • 实时数据的动态转换

通过掌握CustomJSTransform,您可以灵活实现各种复杂的数据可视化需求,充分发挥Bokeh作为交互式可视化工具的强大能力。

bokeh bokeh/bokeh: 是一个用于创建交互式图形和数据的 Python 库。适合用于数据可视化、数据分析和呈现,以及创建动态的 Web 应用。特点是提供了一种简洁、直观的 API 来描述和处理数据,并生成交互式的可视化效果。 bokeh 项目地址: https://gitcode.com/gh_mirrors/bo/bokeh

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

章瑗笛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值