简介

Notebooks 是数据科学家、机器学习工程师和研究人员必不可少的工具,因为它们可以进行快速实验,并且可以更轻松地共享代码和结果。但是使用笔记本存在最大的挑战之一,版本控制很困难,或者就像某些人所说的那样,笔记本一团糟。以防万一术语版本控制对您来说是新的,它基本上是跟踪和记录所有代码(或您想要版本控制的任何内容)的过程,以防万一发生不好或可怕的事情,例如某人错误地删除了您的代码库(您保存它们的所有代码),您可以在某个地方回滚到您保存的最后一个版本,而无需再次重写它们。这就像在开发过程中的每个阶段都对您的代码进行影印,这样您就可以随时回滚一些东西。你会同意我的观点,这是数据科学家也需要采用的一个很好的工具。

回到笔记本上,git 或 subversion(取决于您的选择)等版本控制工具主要是为人类可读的文本设计的。然而,笔记本包含一个包含代码、降价、HTML 和其他组合在一起的大型嵌套 JSON(JavaScript 对象表示法)文件,这意味着使用 git 或 subversion 很难阅读普通笔记本(因此很难使用这么多功能嵌入在 git 中,例如允许您查看自上次保存代码以来对代码的修改)

JSON(JavaScript 对象表示法)文件是一种特殊的文件格式,其中包含用于存储和传输数据的字典列表。虽然最初是为 JavaScript 设计的,但它们现在是一种普遍存在的文件格式,通常在网络上用于传输和存储数据。

除了版本控制之外,notebooks 还面临一些挑战,使其不如仅使用 python 脚本,这包括代码的可重复性。笔记本中的代码可能会乱序运行,所有者在运行后将其编辑掉。这意味着尝试按照他们的步骤进行操作的人将不会因为此编辑部分而获得与他们相同的结果,这会阻碍可重复性。托管在笔记本中的代码也不能被外部位置的代码调用,这使得它们无法被测试。

这些以及许多其他问题是笔记本电脑面临的一些挑战,也是笔记本电脑不用于生产环境的原因。然而,选择是在笔记本中进行试验,然后手动传输代码或将它们重写为脚本。正如我们所见,这个过程非常低效且耗时,在本教程中,我将向您展示如何使用 jupytext 自动将您的笔记本转换为脚本。

https://media.giphy.com/media/OBJfJhIr9E7Jq3ffNV/giphy.gif

工具

  • jupytext

  • jupyter-notebook 或 jupyter-lab

安装

所以我们需要做的第一件事就是下载jupytext。 Jupytext 是一个自动将你的 notebook 转换成 python 脚本的工具。要下载 jupytext,您需要使用 python (pip) 的包安装程序。

    pip install jupytext

或使用 conda;

    conda install jupytext

设置 Jupytext

下载后,现在我们准备使用 jupytext 将 notebook 自动转换为脚本。有很多方法可以从这里设置/jupytext,但是,我将向您展示 3 种使用 jupytext 的方法。但在我们继续之前,让我简要介绍一下我们的项目文件夹结构;

image.png

我们的项目有一个文件夹“notebooks”,我们将在其中保存所有笔记本和另一个文件夹 src,其中包含不同的子文件夹,我们将在其中保存脚本。这很重要,因为我们需要告诉 jupytext 在哪里可以找到我们的笔记本以及完成后在哪里保存我们的脚本。现在,让我们开始吧。

使用笔记本的元数据

我们将用于配置 jupytext 的第一种方法是编辑笔记本的元数据。为此,请打开您的 jupyter 笔记本。

2022-07-10 23-19-16.png 截图

接下来,我们将创建一个新笔记本[在笔记本文件夹内],并将其命名为 Tryout。

image.png

之后,我们将点击菜单栏上的编辑,选择“编辑元数据”;

截图 2022-07-10 at 23-23-51 Tryout - Jupyter Notebook.png

您应该像我一样打开编辑笔记本元数据。

![截图 2022-07-10 at 23-24-29

然后您应该将其插入框中并选择回车

  "jupytext": {
    "formats": "notebooks///ipynb,src/data///py"
  },

截图 2022-07-11 at 00-24-40 试用 - Jupyter Notebook.png

在这里,我们告诉 jupytext(在后台运行),选择此文件夹中的所有笔记本(以 ipynb 结尾),将它们转换为“.../src/data”(或任何子文件夹)中的“py”脚本在我们的 src 文件夹中)。

现在我们可以使用我们的 notebook,并且每当 jupyter 保存我们的 notebook 时,都会自动生成一个 python 脚本,其中包含我们 notebook 的确切名称和相同的内容。

截图 2022-07-11 at 00-32-41 试用 - Jupyter Notebook.png

image.png

2022-07-11 00-33-54.png 截图

使用jupytext配置文件

使用 jupyter notebook 设置 jupytext 的另一种方法是为其创建配置文件。 jupytext 接受以 .jupytext 或 .jupytext.toml 或只是 jupytext.toml 结尾的配置文件。创建文件后,我们将其输入文件并保存。

formats = "notebooks///ipynb,src/data///py"

image.png

或者

[formats]
"notebooks/" = "ipynb"
"src/data" = "py"

image.png

他们都做同样的事情,告诉 jupytext 在哪里可以找到我们的笔记本以及在哪里保存我们的脚本,每次 jupyter 保存我们的笔记本时,我们也会自动获取我们的脚本。

使用预提交钩子

我将要解释的最后一个设置 jupytext 的方法是将它与预提交挂钩一起使用。对于那些不熟悉 pre-commit 的人来说,pre-commit 是一种工具,可确保在您向 git 提交(添加和保存)任何内容之前,在某些条件下,例如确保代码格式正确,每行后面没有尾随空格,是否使用了每个导入的模块等,如果没有,则不应接受提交。因此,您可以使用预提交来强制代码的一致性。您还可以将 jupytext 与我们要为代码设置的其他挂钩一起使用。

要为您的笔记本使用 pre-commit 挂钩,您需要下载 pre-commit,因此我们将下载 pre-commit。

   pip install pre-commit

或使用;

   conda install jupytext -c conda-forge

之后,我们需要创建一个 .pre-commit-config.yaml 文件,这个文件将包含我们所有的 pre-commit 钩子的配置。要将 jupytext 添加到 .pre-commit-config.yaml 文件,请添加;

repos:
-   repo: https://github.com/mwouts/jupytext
    rev: v1.14.0  # CURRENT_TAG/COMMIT_HASH
    hooks:
    - id: jupytext
      args: [--sync]

在这里,我们告诉 pre-commit 我们要添加 jupytext 钩子,repo 代表钩子的 GitHub 存储库(jupytext),rev 代表我们正在使用的标签(jupytext 的版本),在钩子下,我们具有钩子(名称)的 id,它是 jupytext 和一个参数,用于将我们的笔记本与脚本同步。

Screenshot 2022-07-11 at 01-07-12 mwouts_jupytext Jupyter Notebooks as Markdown Documents Julia Python or R scripts.png

Jupytext 与其他一些预提交钩子结合使用时,我的看起来像这样,(你也应该这样)。

2022-07-11 01-04-02.png 截图

然后在终端上运行;

   pre-commit install

这将下载并设置预提交。每次之后,我们都会添加要提交到 git 的笔记本,为我们生成一个同步脚本。您可以了解有关预提交的更多信息,或者注意我的下一篇关于您应该作为数据科学家使用的重要预提交钩子以及如何设置它的文章

https://media.giphy.com/media/l0ExjbToOj4n23OmY/giphy.gif

这是一个使用 jupytext 的简单设置,如何自动和实时地将您的笔记本转换为脚本。如果您喜欢或发现这篇文章有帮助,请喜欢、订阅、放弃反馈并与您认为可能需要它的其他人分享。直到下一次,再见。

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐