
图片由 Hannah Wei 在 Unsplash 上提供。
赞助内容
我,一名数据科学家,与 Jupyter 笔记本。我们之间的关系始于我开始学习 Python 之时。当我想确保我的代码能够正常工作时,Jupyter 笔记本是我的避风港。如今,我教授编码并进行多项数据科学项目,笔记本仍然是交互式编码和实验的最佳工具。不幸的是,当尝试在数据科学项目中使用笔记本时,事情很快就会失控。由于实验的原因,出现了庞大的笔记本,这些笔记本难以维护和修改。是的,两次工作非常耗时:实验,然后将代码转换为 Python 脚本。更不用说,测试这样的代码很痛苦,版本控制也是一个问题。这是你必须思考的时候,一定有更好的方法!幸运的是,答案并不是要避开我心爱的 Jupyter 笔记本。
请关注我,了解 Eduardo Blancas 及其名为 Ploomber 的项目的一些绝妙想法,关于如何更好地进行数据科学项目,以及如何在生产环境中明智地使用和创建 Jupyter 笔记本。
流行的 Jupyter 笔记本
Jupyter 是一个免费的开源网络工具,用户可以在其中以单元格形式编写代码,然后将其发送到后端“内核”,并立即获得结果。我的一位同事说它就像一个带有代码的老式即时通讯应用程序。 过去几年,Jupyter 笔记本的普及度飙升,这得益于它能够将软件代码、计算输出、解释性文本和多媒体资源整合到单个文档中 [1]。除其他外,笔记本可用于科学计算、数据探索、教程和交互式手册。更重要的是,笔记本可以支持数十种语言(它的名字来源于 Julia、Python 和 R)。 一项分析显示,代码共享网站 GitHub 在 2022 年 1 月统计了超过 750 万个公共 Jupyter 笔记本。作为一名数据科学家,我主要使用 Jupyter 笔记本进行 Python 和 R 的数据整理,我还通过 Jupyter 笔记本教授学生 Python 基础知识。
笔记本有什么问题?
尽管 Jupyter 笔记本很受欢迎,但许多数据科学家(包括我)都面临着它的问题 [2]。我无法总结得更好,所以我引用 Joel Grus 的话,他解释了笔记本的一些问题 [1]。
“我曾看到程序员在笔记本行为异常时感到沮丧,通常是因为他们无意中以错误的顺序运行了代码单元。Jupyter 笔记本还通过使代码难以逻辑组织、分解为可重用模块以及开发测试以确保代码正常工作,从而助长了不良的编码习惯。”
笔记本难以调试和测试,我职业生涯中也花了很多时间将代码重构为一些可以在生产中使用的脚本和函数。版本控制也存在问题,因为笔记本是 JSON 文件,而 git 输出的版本比较难以阅读,使得跟踪所做的更改变得困难 [2]。在这里您可以找到有关 Jupyter 笔记本问题的更详细的总结和解释。
模块化的探索
上述问题足以让我找到 Ploomber,但我是通过寻求模块化才发现这个出色项目的。我需要一个工具,能够轻松创建并按照定义的顺序运行任务或代码片段,而无需向我的数据工程师同事寻求帮助。我需要的就是所谓的管道。通过管道,可以将任务分解为更小的组件并实现自动化。管道可以有多种形状和大小。甚至可以在 sklearn 和 pandas 中创建管道 [3]。
Ploomber 是 Eduardo Blancas 发起的一个开源项目,旨在创建 Python 管道。我发现它是一个易于使用的工具,通过它我可以快速定义我的任务以及执行顺序,并将我的分析分解为模块化部分。Ploomber 提供了几个 示例项目,您可以在其中找到该工具的出色示例。我还在 这个仓库中分享了我的 Ploomber 实验。我特别喜欢 Ploomber 的 博客和 Slack 社区,在那里我可以咨询关于这个项目的任何问题。
Eduardo Blancas 的生活妙招
好吧,我找到了一个很棒的项目来模块化我的数据科学项目,但它如何帮助我解决笔记本的持续困境呢?
Ploomber 附带了 Jupytext,这是一个允许我们将笔记本保存为 py 文件但仍像笔记本一样进行交互的包。版本控制问题得到了解决。
接下来是重构和模块化问题。不必放弃笔记本,因为 Ploomber 可以将笔记本作为管道单元处理。这样,我只需清理我的笔记本,节省时间将其转换为完全不同的代码结构和架构。在管道任务中混合使用笔记本和脚本也是可能的。有一系列 博客文章专门介绍如何将庞大的笔记本分解为更小的部分。我总是告诉学生,Eduardo 也建议,编写笔记本时,要始终能够重新启动内核并从头到尾运行所有代码。有时,处理大量数据的笔记本需要很长时间才能运行,这时只需设置一个样本参数以获取子集来测试您的代码是否运行正常即可。
除了模块化生活小技巧,我在 Ploomber 的博客上读到并应用于工作中的另一个非常重要的收获是锁定项目依赖项并将其打包,以便能够从其他笔记本导入代码。到目前为止,我已经在几个项目中遇到过包版本问题,所以我可以向你保证,这可以为你节省几个小时。
一个由多个更短、更整洁的笔记本组成的项目,而不是少数庞大的笔记本,可以使代码更容易重现、理解和修改。此外,它还可以设计一种 测试策略来测试机器学习代码。关于机器学习项目失败原因的几篇文章都提到了 更新代码的难度以及耗时的维护问题。通过更短、更整洁的代码、锁定的依赖项和适当的版本控制,维护和协作变得更容易、更快捷。
总结
上述想法只是我在 Ploomber 博客上发现的一些有用的主要思想。从那时起,我拥有了一个工具箱,知道如何在小型项目中将笔记本分解为模块化部分,以及如何使用它们并将其转换为管道。我喜欢分享和教授如何更好地使用笔记本和编写代码的想法,这些编码实践值得考虑。
如果您对 Ploomber 的更多细节以及如何更有效地使用笔记本感兴趣,请务必查看 Eduardo Blancas 在今年三月的 Reinforce AI 大会上关于他项目的演讲!谁能比 Ploomber 的首席执行官兼联合创始人本人告诉我们更多呢?
参考文献
[1] Jeffrey M. Perkel (2018)。为什么 Jupyter 是数据科学家首选的计算笔记本。Nature 563, 145-146。
[2] Eduardo Blancas (2021)。为什么(以及如何)将笔记本投入生产。Ploomber.io 博客。
[3] Anouk Dutrée (2021)。数据管道:是什么,为什么以及有哪些。Towards Data Science 博客。
感谢这篇内容丰富的博客,坦白说,Jupyter 笔记本这本书对任何类型的问题都非常有帮助。
谢谢 Elina 的反馈!