第7周 数据可视化与交互 (初级)
🔙 返回教学大纲
任务目标
编程的目标是实现 自动化,但是就像我们需要经过 调试 一步一步写出代码那样,我们也需要 可视化 与 交互 工具来查看、检查、监控、探索、分析、理解数据,在 “手动” 的基础上实现 “自动”。终端 (TUI) 是自动化的利器,但在可视化与交互方面,终端确实不太擅长。图形用户界面 (GUI) 比较擅长可视化与交互,但不够跨平台 (指在不同操作系统上获得相似的体验),也不够开放 (指不容易定制和扩展功能)。基于浏览器 (Browser, 比如 Chrome、Edge、Firefox、Safari 等等) 的 Web 技术 (比如网页版 App),不但擅长可视化与交互,而且跨平台和足够开放,是特别理想的选择,但缺点是技术栈 (HTML + CSS + Javascript) 门槛较高,不适合初学者。
本周将通过案例 (新股 IPO) 介绍两个 Python 生态 (PyPI) 下适合初学者使用的可视化与交互工具 (全部是基于 Web 技术),分别是 JupyterLab 和 Perspective。案例使用的数据将通过 Tushare 获取。
-
Fork 第07周打卡 仓库至你的名下,然后将你名下的这个仓库 Clone 到你的本地计算机
-
用 VS Code 打开项目目录,新建一个
environment.yml文件,指定安装 Python 3.12 和jupyterlab,然后运行conda env create命令创建 Conda 环境 -
在项目目录下,运行
jupyter lab命令,启动 后端 (Backend) 服务,在浏览器里粘贴地址访问 前端 (Frontend) 页面 -
在 JupyterLab 页面里,新建一个 Notebook,改名为
trial-jupyterlab.ipynb,在里面实践掌握以下功能:- 在单元格 (Cell) 里编写 Python 代码,按
Shift+Enter运行 Cell 并下移 - 在单元格 (Cell) 上按
ESC切换到 命令模式 (command mode),按Enter切换到 编写模式 (edit mode) - 在单元格 (Cell) 的命令模式下,按
j选择下一个,按k选择上一个,按a在上方添加,按b在下方添加,按dd删除,按住Shift多选,按x剪切,按c复制,按v粘贴,按Shift+M合并,按z撤销,按Shift+Z重做,按Shift+L显示/隐藏代码行号 - 在单元格 (Cell) 的编写模式下,按
Ctrl+Shift+-切分单元格 - 按按钮显示/隐藏 Minimap
- 运行单元格 (Cell) 注意序号单调递增
- 单元格最后一行如果是 表达式 (expression) 且运行后返回的对象不是
None,则计输出 (Out),否则只计输入 (In),序号为i的输出,可以用_i变量来引用 - 单元格 (Cell) 序号为
*表示代码运行中,尚未返回,按ii可以打断 (KeyboardInterrupt) (类似于终端的Ctrl+C) - 在单元格 (Cell) 的命令模式下,按
00重启后端 Python 解释器 (被 Jupyter 称为 Kernel),重启后需要从上至下重新运行一遍代码 (Shift+Enter),运行前建议先在菜单里选择 “Edit / Clear Outputs of All Cells” 清空全部页面显示的输出 - 在单元格 (Cell) 的命令模式下,按
m切换至 Markdown 模式,按y切换至 Python 模式 - 用豆包 (或 DeepSeek 等任何大模型) 生成一段示例 Markdown 代码,复制粘贴进 Markdown 单元格,运行以呈现 (Render)
- 用豆包 (或 DeepSeek 等任何大模型) 生成一段示例 HTML 代码,复制粘贴进 Markdown 单元格,运行以呈现 (Render);注意不支持 CSS
- 用豆包 (或 DeepSeek 等任何大模型) 生成一段示例 LaTeX 数学公式代码,复制粘贴进 Markdown 单元格,运行以呈现 (Render);注意要用
$(行内模式) 或$$(整行模式) 包围 - 关闭前端页面,在后端按
Ctrl+C打断运行中的服务,回到 Bash 提示符
- 在单元格 (Cell) 里编写 Python 代码,按
-
通过
tushare软件包下载保存一些数据:-
在 Tushare 网站上 注册 并登陆,完善修改个人资料,浏览阅读 平台介绍 和 数据接口
通过定制的推荐链接
https://tushare.pro/register?reg=gls完成注册,将可获赠 2000 平台积分 (有效期一年)。积分达到门槛才有数据接口的使用权限,否则需要 付费购买积分 (约 200~1000 元/年) 才有权限使用数据接口。本课程的量化投资实战案例,将主要将通过 Tushare 平台获取数据,请确保拥有足够积分进行实践。 -
修改
environment.yml文件,添加pip: tushare(注意,conda-forge没有收录tushare,只能从PyPI安装,参考) 依赖项,运行conda env update更新 Conda 环境 -
在终端 (Terminal) 激活
week07Conda 环境,运行ipython命令启动 IPython 交互界面 (IPython 是 Jupyter 项目的一部份,ipython是jupyterlab的依赖项之一) -
在 IPython 提示符下,运行下面的 Python 代码设置 Tushare Token
import tushare as ts ts.set_token("***") # 将 *** 修改成你自己的 Token 字符串其中
***要替换成你在 Tushare 平台上的 接口TOKEN —— 复制粘贴即可。运行set_token函数会把 Token 字符串保存在~/tk.csv文件里,今后每次使用tushare软件包请求数据时都会自动读取并发送 Token,不需要反复设置。 -
按
Ctrl+D结束前面的 IPython 进程,再重新启动一个新的 IPython 进程,运行下面的 Python 代码向 Tushare 服务器请求 IPO新股列表 数据,并保存在本地import tushare as ts pro = ts.pro_api() df = pro.new_share() df.to_parquet("new_share.parquet")其中请求数据函数返回的对象
df是pandas.DataFrame类型,调用其to_parquet方法能够将内存 (memory) 中的DataFrame数据按照 Parquet 格式 (Parquet 是大数据领域的首选格式,已经成为业界标准) 序列化 (serialize) 为字节串 (bytes) 保存到磁盘 (disk)。 -
询问豆包 (或 DeepSeek 等任何大模型),初步了解 Parquet 格式和 CSV 格式的特点和适用领域
-
new_share接口只需要 120 积分,如果你有 2000 积分,可以采用与上面类似的方法访问stock_basic接口,并将数据保存为stock_basic.parquet文件 (注意,需要指定fields参数获取全部字段)。如果积分暂时不够,可以在终端运行下面的命令,从我们开源的 课程仓库 下载数据文件到你的本地curl -O https://raw.gitcode.com/cueb-fintech/courses/blobs/8fc08f7bc4dbbf17d356234472795e59c7b9ce2f/stock_basic.parquet
-
-
通过
perspective-python软件包查看polars.DataFrame数据,实践交互式可视化:-
修改
environment.yml文件,添加perspective-python和polars依赖项,运行conda env update更新 Conda 环境 -
启动 JupyterLab,新建一个 Notebook,改名为
trial-perspective.ipynb -
调用
polars.read_parquet函数,分别读取磁盘 (disk) 中的new_share.parquet文件和stock_basic.parquet文件,得到内存 (memory) 中的polars.DataFrame对象,命名为d1和d2 -
进行适当的列变换,尤其是要把实际上是日期类型的列,从
polars.String()类型转换为polars.Date()类型 -
把
d1或d2作为参数传递给perspective.widget.PerspectiveWidget类型进行初始化,返回的对象会呈现在 NoteBook 的 Output 里 -
在
PerspectiveWidget默认的Datagrid视图下,尝试实践:- 修改各种列数据类型 (文本、数值、日期) 的显示风格 (style)
- 设置
Group By选项,选择某些列作为分组依据 (纵向排列),选择其他某些列进行汇总 (注意汇总方式有多种函数选项) - 设置
Split By选项,选择某些列作为拆分依据 (横向排列) - 设置
Order By选项,选择某些列作为排序依据 (注意可以切换 升序/降序) - 设置
Where选项,选择某些列,进一步设置条件,进行数据行 (观测) 方向的过滤 - 设置
Columns选项,选择要显示的数据列 (变量),及其显示的先后顺序 - 在
All Columns部分,是能够显示但没有显示的数据列 (变量),可以点击NEW COLUMN添加衍生计算出的新列,需要用 ExprTK 语言书写表达式代码,变量名用双引号 (") 包围,字符串用单引号 (') 包围
-
在
PerspectiveWidget图形界面依靠鼠标 (手动) 所做的设置 (configure),可以导出代码,根据导出的代码,可以修改我们的代码,使得我们运行代码直接就能得到我们所需要的视图 (自动化)- 在
PerspectiveWidget的右上方有按钮,可以把图形界面的数据或设置 (configure) 导出 (export) 为文件,或复制 (copy) 到剪贴板 - 把设置 (
config.json) 复制到剪贴板,粘贴进 Notebook Cell,保存成字符串 (str) - 也可以把设置 (
config.json) 导出为文件,用pathlib.Path.read_text方法从文件读取出字符串 (str) - 可以用
json.loads函数将无结构的 (unstructured) 字符串 (str) 解析为有结构的 (structured) Python 字典 (dict),这样就容易在 Notebook 里美化呈现,也容易进一步通过 Python 代码访问内部的具体设置 - 也可以把复制到剪贴板的 JSON 字符串,粘贴进某个在线的 JSON 工具网站 (比如 链接) 进行美化
- 根据导出的设置代码,在初始化 (init)
PerspectiveWidget类型时,传入适当的参数进行设置,运行代码,观察是否符合我们的期望
- 在
-
把
PerspectiveWidget切换为Treemap视图,尝试设置各种选项 (configure),观察数据可视化的实际效果 -
把
PerspectiveWidget切换为Y Bar视图,尝试设置各种选项 (configure),观察数据可视化的实际效果Y Bar(条形图/柱状图) 的横轴 (不同的条形) 是第一个维度,用Group By控制,纵轴 (条形的高度) 是第二个维度,用Y Axis控制 (支持多变量并列显示),还可以把每个条形进一步拆分为多个颜色,用Split By控制- 点击 链接1 或 链接2 学习了解更多
Bar Chart的概念、适用情形以及实现代码 Y Bar视图还可以用来实现一类很重要的统计制图 —— 直方图 (histogram)。对于数据表中的某一列连续型数值变量 (比如新股发行的市盈率pe),我们经常希望观察其 分布 (distribution)。可以用bucket函数对连续变量进行 “分桶” (比如表达式bucket("pe", 10)),生成一个新的离散变量 (比如命名为bucket_pe),然后把离散变量设置为Y Bar的横轴 (Group By),把任意其他一列变量用count(计数) 函数汇总,设置为纵轴 (Y Axis)。这样看到的就是直方图。“分桶” 在有的地方也叫 “分箱” (bin),其粒度大小需要根据数据适当调节。
-
把
PerspectiveWidget切换为Y Line视图,尝试设置各种选项 (configure),观察数据可视化的实际效果Y Line(折线图) 常用来绘制时间序列,横轴通常是时间,用Group By控制,纵轴 (折线的 Y 坐标) 通常是连续型数值变量 (经过汇总),用Y Axis控制 (支持多序列同时显示),还可以进一步拆分为多条序列,用Split By控制- 点击 链接1 或 链接2 学习了解更多
Line Chart的概念、适用情形以及实现代码 - 使用我们的示例数据,可以尝试观察最近几年 A 股 IPO 市场的 融资额 (
funds) 与 市盈率 (pe) 变化情况。为了加深对数据的 理解 和 验证,可以询问豆包 (或 DeepSeek 等任何大模型),在某个时间段内发生了哪些影响 A 股 (或 IPO) 的重大国内外财经事件,由此加强我们对现实背景的理解 - 也可以使用示例数据,观察对比最近几年不同交易所 (
exchange) 或市场 (market) 的平均 中签率 (ballot) 情况
-
把
PerspectiveWidget切换为X/Y Scatter视图,尝试设置各种选项 (cinfigure),观察数据可视化的实际效果X/Y Scatter(散点图) 常用来观察两个数值型连续变量之间的相关关系 (correlation)。数据首先可以进行分组汇总,每一个组对应一个散点,用Group By控制。然后把两个连续型数值变量分别设置为X Axis和Y Axis,其汇总数值将作为每个散点的坐标- 点击 链接1 或 链接2 学习了解更多
Scatter Plot的概念、适用情形以及实现代码 - 散点的分布如果特别不均匀,则意味着变量单位可能有问题,或者需要经过变换 (比如取对数)
- 散点的分布如果杂乱无规律,则意味着 X 与 Y 没有相关性
- 散点的分布如果看起来能够拟合成一条直线 (即回归线,regression),则意味着 X 与 Y 具有正的或负的相关性,意味着可能存在某些规律
- 散点图上可以进一步体现更多的变量维度,比如可以把更多变量映射为散点的不同颜色 (
Color)、大小 (Size)、符号 (Symbol)、标签 (Label)、提示框 (Tooltip) 等 - 我们经常还可以把用于分类的类别变量 (类别不宜太多) 设置为
Split By,从而把一个散点图拆分为多个小散点图 (small multiple),从而更细致地观察是否存在规律 - 在我们的示例数据中,融资额 (
funds)、市盈率 (pe)、中签率 (ballot) 是数值型连续变量,适合用散点图观察他们的规律,散点可以以个股为单位 (不汇总),也可以按 行业 (industry) 汇总,或者按 上市时间 (ipo_date) 汇总 (每月分桶),都可以大胆尝试探索
-
注意事项
- 数据可视化与交互是非常庞大的话题,在本周的初级教程里,我们专注于低代码探索 (low-code exploration),所以只介绍了 JupyterLab 和 Perspective。要制作更专业、更精美的可视化解决方案,必然要进一步学习更多的软件框架,甚至更多的计算机语言,以及其他语言的更多的软件框架。总之,还是免不了需要编程的。图形用户界面的其他许多商业软件我们都不推荐,因为不够开放,迟早会限制我们的创新。
操作演示
| 浏览器观看 | 手机扫码观看 |
|---|---|
| Part 1 数据可视化与交互的概述 讨论了数据可视化与交互的技术问题,包括自动化处理、图形用户界面(GUI)和基于浏览器的Web技术的应用。讲者介绍了两种技术:GUI擅长可视化和交互,但跨平台性差;而基于浏览器的Web技术具有跨平台性和开放性。同时,还提到了两个重要的可视化软件JupyterLab和Perspective,以及如何通过编程方式提高工作效率,如量化投资的特点和Tushare数据平台的利用。此外,还对第七周的学习内容进行了详细讲解,包括fork、clone、修改环境名称、安装JupyterLab等操作,并介绍了JupyterLab软件的发展历程和如何使用。最后,讲解了如何在JupyterLab中新建一个notebook,并进行命名和保存。(智能总结由机器自动生成,仅供参考) |
![]() |
| Part 2 JupyterLab 和 Markdown 主要介绍了JupyterLab界面的运行方式,包括编写模式和命令模式的切换,以及快捷键的使用。同时,详细讲解了JupyterLab的一些快捷键功能,如删除、多选、剪切复制粘贴等,并介绍了合并单元格、撤销、重做、显示和隐藏行号、拆分单元格等功能。此外,还讲述了在Python终端中使用键盘快捷键的技巧,如键盘打断功能、语法高亮和自动缩进等。在Jupyter笔记本中,用户可以享受到清空全部页面输出、命令模式下的cell操作、markdown模式和python模式的切换等功能。最后,讲解了如何在Python中使用Markdown进行代码块和无序、有序列表的创建,以及如何插入图片、超链接等,并展示了大模型在毕业论文写作中的应用。(智能总结由机器自动生成,仅供参考) |
![]() |
| Part 3 Jupyter 里嵌入 LaTeX 讨论了Jupyter软件的应用,包括其与HTML、Python、Markdown、LaTeX等技术的集成,以及如何使用这些技术进行复杂表格和数学公式的展示。首先,通过示例展示了如何在jupyter中生成不使用任何CSS的HTML示例。其次,介绍了在Jupyter中编写和展示复杂数学公式的方法,包括段内公式和display equation,并强调了使用latex语法和特定分隔符的重要性。此外,还讲解了如何在markdown文件中插入数学公式,并展示了其与命令混合使用的效果。最后,强调了Jupyter作为Python生态体系下的可视化环境,可以用于Web技术加持下的Python开发,并指出其为一个强大的混合代码后端。(智能总结由机器自动生成,仅供参考) |
![]() |
| Part 4 用 Tushare 获取股票数据 讨论了数据存储格式、日志记录、数据临时交换、数据查看等方面的内容。提到了两种格式,一种是parquet文件,大小在几百兆到几到若干个GB之间,适合存储大量 data。另一种是Tushare的使用,需要下载准备两个data。接下来将进行可视化操作。(智能总结由机器自动生成,仅供参考) |
![]() |
| Part 5 Perspective 呈现数据 主要讲解了如何安装和使用Perspective软件,以及其与Python的关系。Perspective是一个混合代码的语言,提供JavaScript、Python和R的接口。在安装过程中,需要安装依赖项,如polars和ipywidget。在数据处理方面,建议先将数据请求到本地,避免频繁从服务器请求。同时,也介绍了如何使用Polars软件读取和处理数据,包括日期时间类型的列转换为字符串类型,以及IPO日期等信息的提取。在股票打新方面,虽然中签率低,但只要参与都能赚钱。最后,讲解了如何解决软件包之间的相互依赖关系,以及在JupyterLab中安装和运行Python开源软件的方法。(智能总结由机器自动生成,仅供参考) |
![]() |
| Part 6 列显示风格与新股 IPO 讨论了股票市场中新股发售的情况,以及如何修改列的显示风格。通过调整数值的单位、小数位数、颜色、排序、背景色等设置,可以使得数据更加清晰易懂。同时,还可以选择不同的日期显示方式,如短日期、中日期等,并设置前景色和背景色。(智能总结由机器自动生成,仅供参考) |
![]() |
| Part 7 DataGrid 选项设置及导出 讨论了如何在数据网格视图下修改列的显示风格和分组,以及如何进行数据分析。首先,通过group by、split by和orderby可以对数据进行分层、横向拆分和排序,帮助用户更直观地观察和分析市场和行业的股票特点。其次,使用图形界面和Perspective软件,可以通过设置过滤条件、添加新计算列等方式,快速筛选和分析数据。此外,还可以通过代码设置和阅读文档来了解和掌握数据网格的设置,实现自动化定制界面。最后,讨论了如何将配置信息复制到剪切板,并将其粘贴到单元格中运行JSON代码,以及使用在线JSON工具进行网页设置。(智能总结由机器自动生成,仅供参考) |
![]() |
| Part 8 Treemap YBar 直方图 讨论了如何使用柱形图和直方图来展示数据。首先,通过生成新的变量“分”来实现对连续变量的分桶,然后使用直方图来展示这些变量的分布情况。通过调整桶的宽度,可以更细致地观察变量在不同区间内的分布频率。此外,还可以根据不同的过滤条件,如市场、PE等,来生成新的变量,以便更好地理解数据分布情况。直方图在统计学中具有重要意义,可以帮助我们更好地理解数据的分布情况。(智能总结由机器自动生成,仅供参考) |
![]() |
| Part 9 折线图散点图案例演示 讨论了柱状图、折线图、散点图等图表在数据可视化中的应用,以及如何处理不同单位的数据和观察市盈率与融资额之间的关系。讲者强调了在绘制时间序列数据时,可以通过group by和split by来控制横轴和纵轴,并使用分桶技巧提高图表的可读性。同时,通过调整变量单位,使得市盈率和融资额的时间序列数据能够清晰展示出来。此外,讲者还提到了大模型在分析财经事件和理解财经现象方面的重要性,并强调了使用低代码工具进行数据可视化的便捷性。最后,讲者鼓励大家自行尝试操作绘图软件,以提高数据分析和展示的能力。(智能总结由机器自动生成,仅供参考) |
![]() |
参考资料
- Perspective, Fintech Open Source Foundation
- JupyterLab Documentation
- Markdown Guide
- HTML Tutorial, W3Schools.com
- LaTeX, Wikibooks
- KaTeX Supported Functions, KaTeX
- IPython Documentation
- The Data Visualisation Catalogue
- From Data to Viz
🔙 返回教学大纲








