编写一个watchdog.sh脚本_五大原因!为何要将Jupyter Notebook转换为python脚本?

a1124bbc92c7325805a9acf466f18edf.png
全文共3360字,预计学习时长9分钟

3bc2f9dff36266c49dbcac71a9654b69.png
图源:unsplash

大多数数据科学在线课程都把Jupyter Notebook作为教学媒介,这是因为初学者在Jupyter Notebook的单元格中编写代码,比编写包含类和函数的脚本更容易。

另一个原因在于它使浏览和绘制数据变得容易。键入"Shift + Enter"时,你可以立即看到代码的结果,这使我们能够轻松地确定代码是否有效。

然而,当处理更多数据科学项目时,Jupyter Notebook也存在几个缺点:

· 缺乏条理性:随着代码变大,我们所编写的东西越来越难以跟踪。无论使用多少标记将Notebook分隔成不同的部分,断开连接的单元格都使用户难以专注于代码功能。

· 难以试验:你需要使用不同的数据处理方法进行测试,为机器学习算法选择不同的参数,查看准确性是否提高。但每次试验新方法时,都需要查找和重新运行相关单元格,这耗神耗时,尤其是处理或培训过程需要很长时间才能运行时。

· 可重复性低:如果你想要使用结构略有不同的新数据,识别其中的错误源很难。

· 难以调试:当你在代码中收到错误时,无法准确判断出错的原因,是代码还是数据更改?如果是代码出错,具体是哪个部分?

· 不适合生产:Jupyter Notebook与其他工具配合使用效果不佳。使用其他工具时,从Jupyter Notebook运行代码并不容易。

64b80ec0684e2fd9aabbb09c04cb1423.png
图源:unsplash

一定有更好的方法来处理代码,所以我决定尝试一下脚本。为了减少混淆,引用.py文件时,在本文中使用单词"脚本"。

组织

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

94834173a57b01e59eed029b257090fe.png

更妙的是,如果这些函数可以分类在同类别,如处理数据的函数时,可以将它们放在同一个类中。

ad961a2aefa438e9aa7dda4a23939b6d.png

每当我们想要处理数据时,就可以利用类预处理中的函数。

鼓励实验

当我们想要尝试对预处理数据的不同方法时,只需添加或删除函数,这样注释不用害怕破坏代码。即使碰巧破坏了代码,也能确切地知道在哪里修复。

c6b2d5ad393ffc66ef2685308c571036.png

提高重复性

使用类和函数,可以使代码足够通用,以便能够和其他数据一起使用。例如,如果我们想在新数据中删除不同的列,只需将columns_to_drop更改为列的列表,若是删除,代码也将顺利运行。

columns_to_drop =config.columns.to_dropdatetime_column =config.columns.datetime.sentimentdropna_columns =config.columns.drop_naprocessor =Preprocess(columns_to_drop,datetime_column, dropna_columns)

还可以创建一个管道来指定处理和训练数据的步骤。一旦拥有管道,我们所需要做的就是使用它对列车和测试数据应用相同的处理。

pipline.fit_transform(data)

易于调试

使用函数可以更容易地测试该函数是否产生期望的输出,我们可以快速地指出代码中的哪些地方需要更改以生成想要的输出。

defextract_date_hour_minute(string: str):'''Extract datahour and minute from datetime string'''try:return string[:16]exceptTypeError:                                             return np.nandeftest_extract_date_hour_minute():                                     '''Test whether the function extractdate, hour, and minute '''string ='2020-07-30T23:25:31.036+03:00'assertextract_date_hour_minute(string) =='2020-07-30T23:25'

如果所有测试都通过了,但是在运行代码时仍然存在错误,那么我们就知道接下来应该查看这些数据。例如,在通过上面的测试后,在运行脚本时仍然有一个类型错误,这使数据中有空值。那就只需要处理这个问题,就可以平稳运行代码。

适于生产

在多个脚本中使用不同的函数:

from preprocess import preprocessfrom model import run_modelfrom predict import predictdefmain(config):              df =preprocess(config)                 df =run_model(config)                 df, df_scale, min_day, max_day, accuracy =predict(df, config)

或者添加配置文件来控制变量的值。这可以让我们不必浪费时间去跟踪代码中的特定变量来更改其值。

columns:to_drop:#- keywords            #- entities            - code            - error            - warnings          binary_columns:- sentiment            - Diff          datetime:time: Datesentiment: crawleddrop_na:- sentiment            - usage            - crawled            - emotion          to_predict: sentiment

你还可以轻松地添加工具来跟踪实验,比如MLFlow,或者添加工具来处理配置,比如http://Hydra.cc。

eee9bfb25887e4f3fef6bce460fab144.png
图源:unsplash

不喜欢Jupyter Notebook,直到迫使自己做出调整

我以前一直使用Jupyter Notebook。当一些数据科学家建议将Notebook笔记本换成脚本从而避免上述一些问题时,我不理解也不愿意这么做,因为我不喜欢运行单元格时无法看到这种不确定性。

但是,当我在新公司开始第一个真正的数据科学项目时,Jupyter Notebook的缺点越来越大,所以我决定踏出舒适区,用脚本进行实验。

起初,我很不习惯,但也注意到了使用脚本的好处。当代码被组织成不同的函数、类和等多个脚本(每个脚本都用于不同的目的,如预处理、培训和测试)时,我开始感到工作更有条理性。

我在建议读者不要用Jupyter Notebook?

并不是。如果代码比较小,且不打算将代码投入生产,仍然可以使用Jupyter Notebook。当想要分析、可视化数据时,也可以使用Jupyter Notebook。还可以用它来解释如何使用一些python库。例如,Khuyen Tran主要使用这个存储库中的Jupyter Notebook作为媒介来解释他所有文章中提到的代码。

如果你不习惯在脚本中编写所有内容,那么你可以将脚本和Jupyter Notebook用于不同的目的。例如,可以在脚本中创建类和函数,然后将它们导入到Notebook中,这样就不那么凌乱了。

另一种方法是在写完笔记本后把它变成脚本,但组织笔记本中的代码(比如把它们放到函数和类中以及编写测试函数)通常要花费更长的时间。你可以先写一个小的函数,再写一个小的测试函数,可以更快更安全。如果正好想用新的Python库加速代码,可以使用已经编写的测试函数来确保它如期望中那样工作。

bf6f4d95049b30e7a7bc6b92f48b860c.png
图源:unsplash

除了本文中提到的方法,一定有更多的方法可以解决Jupyter Notebook的缺点。

每个人都有自己提高工作利率的方法。刚从Jupyter Notebook切换到脚本可能不太习惯,因为用脚本编写代码不太直观,但你最终会习惯的。你会开始意识到脚本在凌乱的Jupyter Notebook上有着许多好处,并且会希望用脚本编写大部分代码。

不积跬步无以至千里,从细微处开始改变自己吧。

312ce01a2e9ebccd7062827555bbeca7.png

留言点赞关注

我们一起分享AI学习与发展的干货

编译组:符馨元、何婧璇

相关链接:https://towardsdatascience.com/5-reasons-why-you-should-switch-from-jupyter-notebook-to-scripts-cb3535ba9c95

如转载,请私信小芯,遵守转载规范

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

how2java_HOW-TO:在Spring 4和Java 7中使用@PropertySource批注

how2java今天,我将我当前正在从事的项目之一迁移到了Spring 4.0。 由于它是我用来学习和演示Spring功能的非常简单的Web应用程序,因此只需要更新项目的POM文件并更改Spring版本。 我将项目部署到Tomcat 7服务器,显然该应用程序未启动。 我在I…

掌握java_如何才算掌握Java,大家都掌握到什么程度

如何才算掌握Java SEjava SE基础课程在朗沃算是学完了,但真正的掌握了么?如何才算掌握了呢?目前已经进入了JavaWEB阶段的项目阶段,把这个问题提出来,是很好的一个时间,那么有没有一些参照觉得学Java基础部分…

IBM将收购Red Hat:面向Java的初衷

甲骨文公司近九年前完成了收购Sun Microsystems的过程。 那是当时的大新闻,今天也宣布了类似的大新闻: IBM和Red Hat已同意IBM收购Red Hat 。 IBM主页面宣布“ IBM收购Red Hat”。 然后它说:“这将改变一切。” 这项宣布的收购很可能会使许多…

java 多线程 总结_Java 多线程总结

昨天熬了个通宵,看了一晚上的视频,把java 的多线程相关技术重新复习了一遍,下面对学习过程中遇到的知识点进行下总结。首先我们先来了解一下进程、线程、并发执行的概念:进程是指:一个内存中运行的应用程序&#xff0c…

python存文件的模块_python模块之StringIO/cStringIO(内存文件)

1. StringIO/cStringIO是什么这个模块提供了一个类,这个类的实例就像是一个文件一样可以读写,实际上读写的是一个字符串缓存,也可以称之为内存文件。StringIO和文件对象拥有共同的父类IOBase,因此方法基本上都是一致的&#xff0c…

性能测试脚本的编写和调试_编写自动调试器以在测试执行期间捕获异常

性能测试脚本的编写和调试以前,我曾说过, 您总是想保留一些调试器断点作为例外 。 这有助于防止代码在不注意的情况下腐烂掉,有时掩盖了另一个问题。 如果您认真对待这一点,那么最好将此想法扩展到自动化测试中。 但是想出一个全…

python自由职业可以做什么_我想成为自由职业者,但不知道做什么?

我想成为自由职业者,但不知道做什么?这其实是就是个人定位的问题,自由职业的第一步,就得先解决这个问题。下面我从3个维度,通过5个步骤,说一下如何成为一名自由职业者,你看完就知道马上该怎么去…

基本服务-使用大使网关

这是我对Knative服务进行实验的延续,这次是围绕在Knative服务应用程序之上构建网关。 这是基于我之前的两篇文章- 使用Knative部署Spring Boot App以及在Knative中进行服务到服务的调用 。 为什么在Knative应用程序之上使用网关 为了解释这一点,让我谈谈…

mysql function 表名作为参数_mysql 常用的分组聚合函数

mysql 常用的分组聚合函数1.聚合运算一般情况下,需要的聚合数据(和,平均值,最大,最小等)并不总是存储在表中,但是可以执行存储数据的计算来获取它.根据定义,聚合函数对一组值执行计算并返回单个值.MySQL提供了许多聚合函数,包括AVG,COUNT,SUM,MIN,MAX等.除COUNT函数外,其它聚合…

java加减乘除运算顺序_java 实现加减乘除混合运算

初衷:解决小学一年级到四年级 基本加减乘除混合运算基本思路:表达式:10032-200(10000/5(100/2))此类表达式我们称之为中缀表达式(运算符在数字的中间),如果我们稍加转换,转化为100, 3, , 2, , 200, -, 10000, 5, /, 100, 2, /, , …

java integer valueof_对 Java Integer.valueOf() 的一些了解

从一道选择题开始分析选项A选项A中比较的是i01和i02,Integer i0159这里涉及到自动装箱过程,59是整型常量,经包装使其产生一个引用并存在栈中指向这个整型常量所占的内存,这时i01就是Integer 的引用。而int i0259由于int是基本类型…

python统计文件大小_python工具--01.统计当前目录下的文件的大小

环境os: centos7python : 3.7实现功能统计当目录下的文件夹有文件的大小,单位KB/MB/B;代码实现#!/usr/bin/env python# _*_ coding:utf-8 _*_import os,mathsummary0def size_file(str2):global summarysummarysummaryos.path.getsize(str2)def size_dir…

java web 伪静态_【Java Web】使用URLRewrite实现网站伪静态

大部分搜索引擎都会优先考虑收录静态的HTML页面,而不是动态的*.jsp、*.php页面。但实际上绝大部分网站都是动态的,不可能全部是静态的HTML页面,因此互联网上大部分网站都会考虑伪静态——就是将*.jsp、*.php这种动态URL伪装成静态的HTML页面。…

idea创建maven程序_使用Maven程序集创建漏洞评估工件

idea创建maven程序本文将讨论如何使用Maven程序集创建可提供给第三方漏洞评估站点(例如Veracode )进行审查的工件。 错误的静态分析与漏洞评估 在这一点上,每个人都知道findbug并认真使用它,对吗? 对? F…

python装饰器的顺序_python中多个装饰器的执行顺序详解

装饰器是程序开发中经常会用到的一个功能,也是python语言开发的基础知识,如果能够在程序中合理的使用装饰器,不仅可以提高开发效率,而且可以让写的代码看上去显的高大上^_^使用场景可以用到装饰器的地方有很多,简单的举…

使用Spring WebFlux从Corda节点流式传输数据

自上次发布以来已经有一段时间了,但我终于回来了! 由于我仍在我的项目中,因此我将再次撰写有关使用Corda的文章。 这次,我们将不再关注Corda,而是将Spring与Corda结合使用。 更具体地说,Spring WebFlux。 为…

mysql 批量加索引_mysql优化:按期删数据 + 批量insert + 字符串加索引为何很傻

嗯,犯了一个很低级的错误,最近暴露出来了。html背景:mysql1. 内部平台,接口间断性无返回,查询日志注意到失败时,接口耗时达到4000(正常状态:100ms)git2. 增长日志打点,在关键步骤插入…

python王者归来 pdf_OpenStack开源云:王者归来 PDF 下载

资料目录:第1篇 基 础 篇第1章 OpenStack概述1.1 云计算简介1.1.1 什么是云计算1.1.2 什么是云存储1.1.3 私有云与公有云1.2 为什么使用云计算1.2.1 方案1:简单的服务部署1.2.2 方案2:分布式服务部署1.2.3 方案3:基于虚拟化的服务…

MySQL中引入存储引擎意义是_mysql学习九:存储引擎、存储过程和函数的引入

存储引擎:存储引擎是mysql特有的,共有7种,常用的有myisam、memory、innodb查看表的存储引擎:show create table 表名;修改表的存储引擎:alter table 表名 engine存储引擎名称;1.myisam存储引擎:可转换为压缩…