将Observable笔记本连接到Jupyter内核,实现双向交互
项目描述
observable-jupyter-widget
在Jupyter中运行Observable笔记本,在Python和JavaScript之间发送值
Observable相当不错。但有时你需要Python!或者更常见的是,你已经有了Jupyter。如果你能在Jupyter中使用(或他人的)Observable笔记本,来回传递值会怎么样呢?
- 允许Jupyter笔记本的查看者使用强大的Observable输入,如FIPS县代码笔刷,以交互式方式指定Python值(参见示例Colab笔记本)
- 在交互式D3图表上显示Jupyter中计算出的数据(查看画廊)
- 在observablehq.com上快速迭代数据可视化:发布Observable笔记本的更新,等待几秒钟,然后刷新Jupyter网页。没错,无需重启内核!
- 或者创建强大的交互式小部件,无需构建web应用即可从Python请求更多数据。显示一个地图,当用户从具有大量RAM的服务端Jupyter内核平移地图时,请求更多客户端数据。
这个库与observable-jupyter类似,允许将Python值一次性输入到一个Observable笔记本中。与该库不同,此小部件版本允许发送新的输入,并将Observable单元格的输出返回到Python。它还与Jupyter小部件生态系统集成,例如,回调可以在嵌入中每次产生新值时运行。
用法
安装包并导入模块。
!pip install observable_jupyter_widget
import observable_jupyter_widget
实例化一个小部件对象,并在没有分号的单元格的最后一行写入变量名来显示它。
传入您想要渲染的Observable笔记本,可选地包括要显示的单元格,用于Observable笔记本中的替换输入的Python值,以及要报告输出值的Observable单元格。
w = observable_jupyter_widget.ObservableWidget(
'@ballingt/embedding-example',
cells=['vegaPetalsWidget', 'viewof minSepalLength', 'viewof minSepalWidth', 'extraCell'], # optional
inputs={'extraCell': 123}, # optional
outputs=['minSepalLength', 'extraCell'] # optional
)
w
小部件有一个.value
属性,它是一个从Observable单元格中获取值的字典。
print(w.value)
使用redefine
方法可以重新定义Observable输入为新值
w.redefine(extraCell=10000)
请参见示例Colab笔记本
限制
ObservableWidgets仅在屏幕上运行#2
出于安全考虑(防止嵌入的笔记本运行不受信任的Python代码),嵌入的Observable笔记本在一个iframe中运行。Observable运行时在
嵌入输出可能在下一个Jupyter单元格运行时未准备好#1
Observable笔记本需要时间来运行并解决其.value
值(任何时间,取决于笔记本),但Jupyter内核会一直运行。当在Jupyter中使用“重启并运行所有”菜单项,或手动快速连续执行带有选项-enter的单元格时,.value
属性可能仍然是None(初始值)而不是将单元格名称映射到输出值的字典。
为了解决这个问题,使用ipython_blocking单元格魔法的%block以及一个评估为True的函数,表示值已准备好,或者根本不要一次性运行所有单元格!
import ipython_blocking
w = ObservableWidget(...)
observable_output_ready = lambda: w.value != None
---
%block observable_output_ready
---
print(w.value)
嵌入在非交互式笔记本执行环境中(如Papermill)不会执行
ObservableWidget非常适合在Jupyter笔记本中嵌入的交互式体验。尽管JavaScript交互的结果通过.value
属性暴露,但它需要由用户查看才能运行。如果您正在使用Jupyter笔记本运行ETL等计划任务,请尝试使用使用node运行的Juypyter内核来运行JavaScript。
安装
您可以使用pip
安装
pip install observable_jupyter_widget
如果您使用的是Jupyter Notebook 5.2或更早版本,您可能还需要启用nbextension
jupyter nbextension enable --py [--sys-prefix|--user|--system] observable_jupyter_widget
开发安装
TODO这是从cookiecutter模板中来的。它没有错误,但不是我所用的。
创建开发环境
conda create -n observable_jupyter_widget-dev -c conda-forge nodejs yarn python jupyterlab
conda activate observable_jupyter_widget-dev
安装Python代码。这将还会构建TS包。
pip install -e ".[test, examples]"
在开发您的扩展时,您需要手动通过笔记本/实验室前端启用您的扩展。对于实验室,这是通过以下命令完成的
jupyter labextension develop --overwrite .
yarn run build
对于经典笔记本,您需要运行
jupyter nbextension install --sys-prefix --symlink --overwrite --py observable_jupyter_widget
jupyter nbextension enable --sys-prefix --py observable_jupyter_widget
请注意,--symlink
标志在Windows上不起作用,因此您将需要每次重建扩展时都运行install
命令。对于某些安装,您可能还需要另一个标志代替--sys-prefix
,但这里不会介绍这些标志的含义。
如何查看您的更改
Typescript
如果您使用JupyterLab进行开发,则可以监视源目录,并在不同的终端中同时运行JupyterLab来监视扩展源的变化,并自动重建小部件。
# Watch the source directory in one terminal, automatically rebuilding when needed
yarn run watch
# Run JupyterLab in another terminal
jupyter lab
更改后,等待构建完成,然后刷新浏览器,更改应生效。
Python
如果您更改了Python代码,则需要重新启动笔记本内核才能使其生效。
项目详情
observable_jupyter_widget-0.1.8.dev0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c46bedc60697948b752c30c7e042df3d10c1444107e1246dc6bb4c9cd9e875c7 |
|
MD5 | 42d08fb5c8918ffb9ddb1f6929b5fe94 |
|
BLAKE2b-256 | 23b592288a3e72896b8ea551592512e10f72814c8d7d4dad7a1284036564ef39 |
observable_jupyter_widget-0.1.8.dev0-py2.py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b823c7e0271192f2e461aea4b9cb8597af41cb8f06dc46db4d154c8114294880 |
|
MD5 | 7afeee2c861fd8b09ad60c581e23b068 |
|
BLAKE2b-256 | ff8238616f502c4ec87d8a31f88896cbf4ad3c84bff15bf387d96ccf3fdc42de |