从Jupyter Notebook切换到Script的5个理由

2020-12-14 15:23:12 浏览数 (1)

使用脚本可以帮助我实现Jupyter Notebook的缺点

动机

与大多数人一样,我开始学习数据科学时使用的第一个工具是Jupyter Notebook。大多数在线数据科学课程都使用Jupyter Notebook作为教学手段。这是有道理的,因为对于初学者来说,在Jupyter Notebook的单元格中开始编写代码比编写具有类和函数的脚本要容易得多。

Jupyter Notebook之所以成为数据科学中如此普遍的工具的另一个原因是,Jupyter Notebook使其易于浏览和绘制数据。当我们输入“ Shift Enter”时,我们将立即看到代码的结果,这使我们很容易确定我们的代码是否有效。

但是,当我处理更多数据科学项目时,我意识到了Jupyter Notebook的一些后备功能:

  • 杂乱无章:随着我的代码变得更大,对我而言,跟踪自己的编写变得越来越困难。无论我使用了多少降价促销将笔记本分为不同的部分,断开的单元格都使我很难专注于代码的作用。
  • 难以进行实验:您 可能想用不同的数据处理方法进行测试,为机器学习算法选择不同的参数以查看准确性是否提高。但是,每次尝试新方法时,都需要重新运行整个笔记本。这很耗时,尤其是在处理过程或培训需要很长时间才能运行时。
  • 对于重现性而言并不理想:如果要使用结构略有不同的新数据,则很难在笔记本中识别错误源。
  • 难以调试:当您 的代码中出现错误时,很难知道错误的原因是代码还是数据更改。如果错误出在代码中,则代码的哪一部分导致了问题?
  • 对于生产而言并不理想: Jupyter Notebook在与其他工具配合使用时效果不佳。使用其他工具时,从Jupyter Notebook运行代码并不容易。

我知道必须有一种更好的方式来处理我的代码,所以我决定尝试一下脚本。这些是我在使用脚本时发现的好处:

有组织的

Jupyter Notebook中的单元格使得很难将代码组织成不同的部分。使用脚本,我们可以创建几个小函数,每个函数指定代码的功能,如下所示

更好的是,如果可以将这些函数归为同一类,例如处理数据的函数,我们可以将它们归为同一类!

每当我们要处理数据时,我们都知道该类中的函数Preprocess可用于此目的。

鼓励实验

当我们想尝试另一种预处理数据的方法时,我们可以通过注释掉这样的方式来添加或删除函数,而不必担心破坏代码!即使我们碰巧破坏了代码,我们也知道在哪里修复它。

我们还可以通过更改函数的输入来试验不同的参数。例如,如果我们想看看对Pandas系列重新采样的不同方法如何影响我的结果,我们可以从切换method_of_resample='sum’method_of_resample= 'average'。多么整洁!

重现性的理想选择

使用类和函数,我们可以使代码足够通用,以便能够与其他数据一起使用。

例如,如果我们想在新数据中删除不同的列,我们只需要更改columns_to_drop为要删除的列的列表,代码就可以平稳运行!

代码语言:javascript复制
columns_to_drop = config.columns.to_drop

datetime_column = config.columns.datetime.sentiment

dropna_columns = config.columns.drop_na

processor = Preprocess(columns_to_drop, datetime_column, dropna_columns)

易于调试

使用函数,可以更轻松地测试该函数是否产生我们期望的输出。我们可以快速找出应该在代码中更改的位置以产生所需的输出。

代码语言:javascript复制
def extract_date_hour_minute(string: str):
'''Extract data hour and minute from datetime string'''
try:
return string[:16]
except TypeError:
return np.nan

def test_extract_date_hour_minute():
'''Test whether the function extract date, hour, and minute '''

    string = '2020-07-30T23:25:31.036 03:00'
assert extract_date_hour_minute(string) == '2020-07-30T23:25'

或添加配置文件以控制变量的值。这样可以避免我们浪费时间跟踪代码中的特定变量以更改其值。

代码语言:javascript复制
from preprocess import preprocess
from model import run_model
from predict import predict


def main(config):
    df = preprocess(config)

    df = run_model(config)

    df, df_scale, min_day, max_day, accuracy = predict(df, config)

我们还可以很容易地添加工具来跟踪实验。

那么如何从Jupyter Notebook切换到脚本?

如果您刚刚从Jupyter Notebook切换到脚本,那么用脚本编写代码可能并不直观,但是请相信我,您最终会习惯使用脚本。

一旦发生这种情况,相对于凌乱的Jupyter Notebook,您将开始认识到脚本的许多优点,并希望在脚本中编写大部分代码。

话虽如此,Jupyter Notebook仍可用于探索和可视化数据。您可以在脚本中创建类和函数,然后将其导入笔记本中,以使笔记本不那么混乱。但是请注意不要过度使用笔记本,尤其是当您要将代码投入生产时。

如果您对较大的变化不满意,请从小做起。

大变化始于小步。

0 人点赞