更好的Jupyter笔记本命名约定

时间:2016-07-11 10:58:52

标签: jupyter jupyter-notebook

在命名Jupyter笔记本时,如果使用空格,即

This is my notebook.ipynb

然后在使用Web浏览器打开时渲染效果非常好。但是,命令行环境中的空格是邪恶的。但如果相反:

This_is_my_notebook.ipynb

This-is-my-notebook.ipynb

然后呈现的标题看起来不错。对替代惯例的任何建议,但看起来仍然有点好看?

2 个答案:

答案 0 :(得分:2)

这实际上取决于您的个人喜好和用例。这是我使用的方法:

我的方法

[#]_[2-4 word description]_[DS-initials]_[ISO 8601 date].ipynb

例如

- jupyter-notebooks
  + 1_exploratory_analysis_ag_2019-02-16.ipynb
  + 1_exploratory_analysis_jw_2019-02-19.ipynb
  + 1_exploratory_analysis.ipynb
  + 1_exploratory_analysis.py
  + 1_exploratory_analysis.html
  + 2_topic_modeling_ag_2019-02-20.ipynb
  + 2_topic_modeling.ipynb
  + 2_topic_modeling.py
  + 2_topic_modeling.html
  + dev_2019-02-15.ipynb
  + dev_2019-02-18.ipynb
  + dev.ipynb
  + dev.py
  + dev.html
  • 在这里,我将所有笔记本放在名为jupyter-notebooks的文件夹中。文件和脚本输出通常位于此文件夹之外。

  • 如果适用,则笔记本计算机按逻辑顺序编号,例如首次创建的日期。在许多情况下,给文件编号(例如this repo of mine)是没有意义的。

  • 笔记本使用时间戳和最新作者的姓名缩写(可选)进行版本控制。这可以通过保存后的挂钩自动完成(请参见下文)。

  • 笔记本的非时间戳版本具有.py.html版本。通过将.py文件提交到git,可以获得版本控制的一些好处。这些文件也可以使用后保存挂钩生成。

  • 其他开发工作可以放在dev...文件中。

我设置了一个后保存钩子来自动执行此操作。在我的配置文件(~/.jupyter/jupyter_notebook_config.py中,我得到了:

import os
from subprocess import check_call
import glob
import datetime
import re

def timestamped_file(fname):
    return bool(re.match('.*\d{4}-\d{2}-\d{2}\.ipynb', fname))

def post_save(model, os_path, contents_manager):
    if model['type'] != 'notebook':
        return # only do this for notebooks

    # Post-save hook for converting notebooks to .py scripts
    d, fname = os.path.split(os_path)
    if not timestamped_file(fname):
        check_call(['jupyter', 'nbconvert', '--to', 'script', fname], cwd=d)
        check_call(['jupyter', 'nbconvert', '--to', 'html', fname], cwd=d)

    # Post-save hook for saving datestamped versions of the notebook
    notebooks = glob.glob('*.ipynb') + glob.glob('jupyter-notebooks/*.ipynb')
    if notebooks:
        latest_mod_file = max(notebooks, key=os.path.getctime)
        # Don't do this for datestamped notebooks
        if not timestamped_file(latest_mod_file):
            date = datetime.datetime.now().strftime('%Y-%m-%d')
            fname_timestamped = '{}_{}.ipynb'.format(os.path.splitext(latest_mod_file)[0], date)
            check_call(['cp', latest_mod_file, fname_timestamped])


c.FileContentsManager.post_save_hook = post_save

如果保存未添加时间戳的文件,它将自动转换为.py.html,并创建带有时间戳的版本。

另一种方法

我的约定受到this blog post的极大启发。他们描述了我几年前开始采用的惯例,然后才采用自己的变体形式。

这是其中包括的示例:

- develop
  + [ISO 8601 date]-[DS-initials]-[2-4 word description].ipynb
  + 2015-06-28-jw-initial-data-clean.html
  + 2015-06-28-jw-initial-data-clean.ipynb
  + 2015-06-28-jw-initial-data-clean.py
  + 2015-07-02-jw-coal-productivity-factors.html
  + 2015-07-02-jw-coal-productivity-factors.ipynb
  + 2015-07-02-jw-coal-productivity-factors.py
- deliver
  + Coal-mine-productivity.ipynb
  + Coal-mine-productivity.html
  + Coal-mine-productivity.py

如您所见,开发笔记本和交付笔记本有单独的文件夹(和命名约定)。

答案 1 :(得分:0)

我发现自己也在寻找这个答案......

我搜索了一些流行的GitHub存储库,这些存储库涉及.ipynb文件,假装工作声名狼借。我发现利用短划线和下划线之间没有标准;但是,我没有看到任何使用空格的笔记本 - 所以不要这样做。

来源:

https://github.com/IRkernel/IRkernel/tree/master/example-notebooks

https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/tree/master/Supporting_Notebooks