Jenkins 事件、日志和指标
如何收集关于 Jenkins 的信息以进行分析和数据可视化
如果您支持一个相当大的 Jenkins 实例,或者您支持大量的实例,您可能已经面临一个性能问题。像许多持续集成(CI)应用程序一样,Jenkins 在小范围内工作得很好,但如果没有适当的照顾和喂养,可能会严重退化。本文将展示几个例子,说明如何导出 Jenkins 事件、日志和指标,以帮助发现改进的机会。
Jenkins 应用指标
Jenkins Prometheus 插件在 Jenkins 中公开了一个 Prometheus 端点,允许 Prometheus 收集 Jenkins 应用程序指标。该插件实际上只是对指标插件的包装,通过 REST 端点公开 JVM 指标,该端点以 Prometheus 可以理解的格式返回数据。除了 JVM 信息之外,该插件还公开了关于作业队列、执行器数量的信息,以及其他特定于 Jenkins 的信息。指标插件提供了一个通过端点公开的指标列表。
一旦 Prometheus 插件安装在 Jenkins 中,它所公开的数据可以通过“管理 Jenkins”页面进行配置:
Manage Jenkins -> Configure System -> Prometheus plugin
Prometheus 插件优于大多数其他 metrics 插件,因为它比许多其他插件返回更多的系统信息。如果你需要将数据发送到不同的目的地,你可以使用其中一个普罗米修斯导出器。如果普罗米修斯绝对不是一个选项,但是,有几个替代方案。一个替代方案是Jenkins Metrics Graphite Reporting插件。这个插件导出的数据远比 Prometheus 插件有限,但它允许您获得关于执行程序计数和 HTTP 响应统计的基本信息。
与 Prometheus pull 模型不同,Graphite 插件将数据推送到任何能够接受 Graphite 消息的服务器。例如,您可以配置 InfluxDB Graphite 插件并将指标直接发送到 InfluxDB。或者您可以配置 Logstash Graphite 输入插件并将指标发送到 Logstash 支持的任何输出位置。
如果您管理大量的 Jenkins 实例,通过 UI 配置这些设置可能会很繁琐。在这种情况下,可以使用 Jenkins REST API 向每个实例提交一个 Groovy 脚本:
curl -v -d "script=$(cat /tmp/script.groovy)" --user username:ApiToken [http://jenkins01.yourcompany.com:8080/scriptText](http://jenkins01.yourcompany.com:8080/scriptText)
下面显示的 Groovy 代码提供了一个如何配置 Jenkins Metrics Graphite 插件向外部系统发送数据的例子。
import jenkins.metrics.impl.graphite.GraphiteServer;
import jenkins.metrics.impl.graphite.PluginImpl;
import jenkins.model.*;
import org.codehaus.groovy.runtime.InvokerHelper;// Construct an object to represent the Graphite server
String prefix = "jenkins";
String hostname = "graphite.yourcompany.com";
int port = 2003;
GraphiteServer server = new GraphiteServer(hostname, port, prefix);
List<GraphiteServer> servers = new ArrayList<GraphiteServer>();
servers.add(server);
GraphiteServer.DescriptorImpl descriptor =
Jenkins.getInstance().getDescriptorByType(GraphiteServer.DescriptorImpl.class);
descriptor.setServers(servers);
詹金斯事件
Jenkins Statistics Gatherer 插件可用于将每个事件的 JSON 消息发送到外部 REST 端点。其中一个应用是将消息发送到 Elasticsearch,以便在 Kibana web 界面中可视化。Jenkins 事件对应于 Jenkins 主服务器上发生的操作,例如:
- 项目创建(创建、删除或更新作业时)
- 作业执行(当构建开始和完成时)
- 作业步骤执行(当作业中的每个步骤开始和结束时)
- 作业队列(当作业进入或改变作业队列中的状态时)
- SCM 签出(当作业从源代码管理中签出文件时)
有很多方法可以将事件发布到 Elasticsearch。一些受欢迎的选项包括:
- Logstash HTTP 输入插件
->
log stash elastic search 输出插件 - FluentD HTTP 输入插件
->
FluentD Elasticsearch 输出插件 - 汇合休息代理
->
卡夫卡->
Logstash 卡夫卡输入插件->
Logstash Elasticsearch 输出插件
为了简单起见,本文将坚持使用 Elasticsearch 产品,并假设使用 Logstash 作为将事件接收到 Elasticsearch 中的方法。无论您选择哪种解决方案,过程本质上都是一样的。
一旦在 Jenkins 中安装了 Statistics Gatherer 插件,就可以将其配置为通过 Jenkins UI 发送消息:
Manage Jenkins -> Configure System -> Statistics Gatherer
上面的屏幕截图显示了如何配置 Statistics Gatherer 插件,以将 HTTP 消息发送到在[http://logstash.yourcompany.com/](http://logstash.yourcompany.com/)
监听的 Logstash HTTP 输入插件。
重要提示:
- 启用 HTTP 发布?为了发送消息,必须选择”选项。此选项仅在点击此配置部分中的“高级… ”按钮时可见。
- 末尾的
/jenkins-<msg>/
路径是可选的,但是可以通过允许在request_path
信息上定义 Logstash 过滤器来帮助提供关于哪个 Jenkins 事件类型被提交的一些附加信息。 - 发布工件的构建可以为每个工件生成唯一的 JSON 字段,这可能超过 Elasticsearch 索引所允许的字段数量。要避免这种情况,请使用 Logstash 过滤器去除任何不需要的字段:
filter {
mutate {
remove_field => [ "[build][artifacts]" ]
}
}
如前所述,Jenkins 脚本控制台或 REST 端点可用于自动化插件的配置。Groovy 脚本的内容如下所示:
import org.jenkins.plugins.statistics.gatherer.StatisticsConfiguration;
import jenkins.model.*;String baseUrl = "http://logstash.yourcompany.com";StatisticsConfiguration descriptor = Jenkins.getInstance()
.getDescriptorByType(StatisticsConfiguration.class);descriptor.setQueueUrl("[${baseUrl}/jenkins-queue/](http://logstash.yourcompany.com/jenkins-queue/)");
descriptor.setBuildUrl("[${baseUrl}](http://logstash.yourcompany.com/jenkins-queue/)[/jenkins-build/](http://logstash.yourcompany.com/jenkins-build/)");
descriptor.setProjectUrl("[${baseUrl}](http://logstash.yourcompany.com/jenkins-queue/)[/jenkins-project/](http://logstash.yourcompany.com/jenkins-project/)");
descriptor.setBuildStepUrl("[${baseUrl}](http://logstash.yourcompany.com/jenkins-queue/)[/jenkins-step/](http://logstash.yourcompany.com/jenkins-step/)");
descriptor.setScmCheckoutUrl("[${baseUrl}](http://logstash.yourcompany.com/jenkins-queue/)[/jenkins-scm/](http://logstash.yourcompany.com/jenkins-scm/)");descriptor.setQueueInfo(Boolean.TRUE);
descriptor.setBuildInfo(Boolean.TRUE);
descriptor.setProjectInfo(Boolean.TRUE);
descriptor.setBuildStepInfo(Boolean.TRUE);
descriptor.setScmCheckoutInfo(Boolean.TRUE);descriptor.setShouldSendApiHttpRequests(Boolean.TRUE);
在这个过程的最后,您应该在 Elasticsearch 中拥有一个 Jenkins 事件消息的集合,然后可以在 Kibana 可视化和仪表板中使用它来做出关于构建性能、失败率或各种其他问题的明智决策。
Kibana Search = type: build AND jobName: rest_open AND result: SUCCESS
Jenkins 应用程序日志
Jenkins 主进程和从进程在文件系统上生成应用程序日志。这些日志包含有关 Jenkins 流程的信息,有助于识别通过用户界面不易识别的问题。通过将这些日志发送到 Elasticsearch,可以使用 Kibana web 界面对信息进行索引和模式搜索。日志的每一行都成为 Elasticsearch 中的一条 JSON 记录。
将应用程序日志内容传送到 Elasticsearch 的最简单方法是使用 Filebeat,这是一个由 Elastic 提供的日志传送程序。Filebeat 可以配置为使用任意数量的日志,并将它们发送到 Elasticsearch、Logstash 或其他几个输出通道。我建议将日志发送到 Logstash,这样就可以应用适当的 Logstash 过滤器将这些行解析成 JSON 字段。这对于 HTTP 访问日志特别有用,因为它使用可预测的日志记录格式。例如,Logstash 中的COMBINEDAPACHELOG
grok 过滤器可用于将访问日志条目解析成结构化的 JSON 数据。
下图显示了 Kibana 的“Discover”界面,该界面对于搜索日志条目非常有用。示例演示了如何过滤主机名与cdptestjml01
匹配并且日志行包含单词docker
的所有 Jenkins 日志:
filebeat.host.name: cdptestjml01
AND filebeat.source: jenkins
AND message: docker
Kibana Discover Screen
在最新的 Kibana 6.5.x 版本中,增加了一个“日志”视图,它允许你有一个类似于你在命令提示符下运行tail -f
命令得到的视图的日志流视图:
Kibana Logs Screen
Jenkins 构建日志
与应用程序日志类似,每个 Jenkins 作业都会生成一个控制台日志。这些也可以运到 Elasticsearch。这可以在 Jenkins master 上使用 Filebeat 来完成,或者根据你的需要使用 Logstash Jenkins 插件来完成。使用 Filebeat 类似于上面所描述的,所以为了便于说明,我将在这里介绍 Logstash Jenkins 插件。
一旦安装,插件必须配置为指向中央服务器。有几种“索引器类型”可供选择。此示例显示了 SYSLOG 索引器类型的使用。这还需要 Logstash 服务器启用一个 syslog 输入插件,这样它就可以接收 syslog 消息,如此处所示。
Manage Jenkins -> Configure System -> Logstash
如前所述,如果您管理多个 Jenkins 实例,使用 Groovy 脚本来配置插件可能会更容易:
import jenkins.plugins.logstash.LogstashInstallation;
import jenkins.plugins.logstash.LogstashInstallation.Descriptor;
import jenkins.plugins.logstash.persistence.LogstashIndexerDao.IndexerType;
import jenkins.model.*;Descriptor descriptor = (Descriptor)
Jenkins.getInstance().getDescriptor(LogstashInstallation.class);
descriptor.type = IndexerType.SYSLOG;
descriptor.host = "logstash.yourcompany.com";
descriptor.port = 5045;
descriptor.key = "JenkinsTestEnv";
descriptor.save();
以下示例显示了如何在单个作业配置页面上启用 Logstash 插件:
Job Configuration -> Job Notifications
重要提示:
- Logstash 插件可以为所有作业全局启用,也可以为每个单独的作业启用。考虑到可能生成的数据量,最好只收集特定作业的日志(尤其是当开发人员碰巧在他们的构建脚本中启用了调试日志记录时)。
摘要
有许多插件可以让你发送或检索 Jenkins 的数据。第一步是确定你需要什么数据以及你将如何存储它。如果您希望定期从 Jenkins 收集时间序列数据,那么可以考虑使用时间序列数据库,并使用 Grafana 可视化结果。流行的数据库选项包括:
对于事件或日志等其他数据, Elastic 产品是目前最受欢迎的选择。Elasticsearch 数据库是存储事件消息的绝佳解决方案,而 Kibana 是一个用户友好的界面,用于创建仪表板来呈现数据。尽管 Elastic 试图将时间序列功能集成到他们的产品中,但与 Grafana 结合的专用时间序列数据库可能更易于使用和管理。一旦您从任何或所有这些来源获得了历史数据,您就可以开始对您的 Jenkins 环境的状态做出明智和理性的决策。
如何在编码领域取得成功
数据驱动的方法:使用 2017 年堆栈溢出调查数据的成功咒语
介绍
成功对不同的人可能有不同的意义。那么,怎样才能成为一名成功的开发者呢?简而言之,这因人而异。在本文的上下文中,成功意味着工作满意度和更高的薪水。
有太多的事情浮现在脑海中,可以通过做来获得成功,比如训练有素的方法、有规律的编码、解决现实世界的问题等等。不同的人基于他们的方法会有不同的建议。但是,我们能从真实世界的数据中收集到什么呢?在本文中,我使用了 2017 年的堆栈溢出调查数据,试图了解以下问题:
- 被调查者的人口统计是怎样的?
- 什么因素导致工作满意度?
- 什么因素会导致更高的薪水,工作满意度会转化为更多的钱吗,反之亦然?
问题 1-人口统计
性别
如下图所示,近 90%的受访者是男性。
就开发人员的男女比例而言,存在很大的不平衡。是因为女性开发人员普遍较少还是因为女性开发人员通常不使用堆栈溢出?更可能的原因似乎是第一个。
人种
超过 70%的受访者是白人或欧洲后裔。
看下面的位置部分,似乎是这样,因为大多数受访者来自美国和欧洲国家。
位置
大多数受访者来自美国,其次是印度,然后是英国。仅美国就有近 40%的受访者。排名第二的国家是印度,约为 14%。与其他国家相比,美国似乎更受欢迎。
问题 2——工作满意度因素
从下面的相关矩阵我们可以看出,工资越高,工作满意度越高。随着每周工作时间的增加,工作满意度也会下降。有趣的是,每周工作时间和薪水之间存在负相关关系。所以更多的工作并不能真正转化为更多的钱。
正如我们在下图中看到的,就工作时间而言,有一个众所周知的 36 小时的最佳时间点。太少和太多一样糟糕,有时甚至更糟。
还有哪些因素影响工作满意度?
从下面的图表中我们可以看到,爱好编码的人通常在编码工作中更快乐。正如马克·吐温所说——“找一份你喜欢做的工作,你这辈子就一天都不用工作了。”
尤其是那些为开源项目和业余爱好编码做贡献的人,看起来工作满意度最高。
另一个流行的观点是,为大型跨国公司工作会带来更多的工作满足感。然而,手头的数据却讲述了一个不同的故事。风险投资的初创公司似乎更受工作满意度的青睐。
位置也是工作满意度的一个因素吗?
为了避免因回复数量少而导致数据失真,我筛选出了少于 30 个回复者的国家进行分析。波斯尼亚和黑塞哥维那位于光谱的顶端,而日本位于底端。
学历如何影响未来的工作满意度?看下面的情节,教育结果喜忧参半。专业学位好像比硕士好,中专好歹比硕士好。但是,这种趋势被博士学位打破了,博士学位轻而易举地胜出。
奇怪的是,计算机科学专业的本科生并不会给开发人员带来最高的工作满意度。健康科学、数学和心理学。
但是在家工作呢?人们喜欢在华丽的办公室工作还是在舒适的家里工作。根据数据,在家工作会带来更高的工作满意度。
因此,为了保证开发人员的工作满意度,最好的机会是编码是你的爱好,并且你也为开源项目做贡献。你应该在波斯尼亚或立陶宛,你的本科专业是健康科学,你要么有博士学位,要么你只学到中学。你为一家风险投资的初创公司工作,每周工作 36 个小时,大部分时间在家。😃
问题 3——高工资因素
正如我们在文章前面看到的,工资与工作满意度正相关,与工作时间负相关。让我们更详细地看看。
每周工作 18 小时似乎是工资最高的。
不出所料,公司类型确实会带来更高的薪水。财力雄厚的上市公司是这里的赢家。风险投资的创业公司紧随其后。
正规教育在事情的发展过程中扮演了多大的角色。这个结果看起来非常有规律,直到硕士学位。博士学位仍然收入最高。
与工作满意度得分相似,对开源的贡献和作为爱好的编码会带来最高的薪水。
远程工作不会降低薪水,反而会带来更高的薪水和更高的工作满意度。双赢的提议。
对于一名开发人员来说,人们会认为计算机科学本科毕业会带来更高的薪水。但是,事实证明,来自不同学科、具有跨职能专业知识的人能拿到高薪。
最重要的是位置如何对人有利。从下面的图表中我们可以看到,这造成了很大的差异,美国和瑞士位于光谱的顶端,尼泊尔和孟加拉国位于底部。
最后但同样重要的是,态度在现实世界中有多重要?
作为调查一部分的 WorkPayCare 属性意味着—
“I don’t really care what I work on, so long as I’m paid well”
从下面的情节中我们可以看出,比起工作类型,那些更在乎钱的人实际上最终会赔钱。
不过,这种趋势可能还有另一个原因。那些收入已经很低的人,出于沮丧,可能会有这种态度去做任何工作,只要报酬更高。相反,收入已经很高的人不想适应这种工作。
C 结论
因此,作为一名成功的开发人员,有几件事情可以做。在你波斯尼亚舒适的家里,为一家美国的风险投资创业公司每周工作 36 小时,100%远程。这可能是梦寐以求的工作!
你怎么看?请在评论中告诉我。
为了检查更多关于这个分析,请看看我的 Github 链接这里。
约翰还是保罗?数据解决了古老的“谁是第一披头士”的问题
最近我有很多空闲时间;或者更确切地说,很多时候我手里都拿着一个新生儿。那么当你没有手的时候,你有很多时间做什么呢?听听甲壳虫乐队!对于一个婴儿来说,有什么比有史以来最伟大的乐队更好的音乐世界入门呢?
保罗和约翰:从好朋友到敌人
Youtube 的推荐系统很快锁定了我,向我展示了大量关于披头士的事实和八卦。没有什么故事比约翰和保罗之间错综复杂的关系更耐人寻味了。他们从十几岁的闺蜜开始,逃学到保罗爸爸的房子里演奏音乐。忠于他们的 BFF 誓言,他们决定分享他们创作的每一首歌的荣誉,因此大多数甲壳虫乐队的歌曲都由列侬/麦卡特尼正式命名。接下来,他们花数年时间睡在同一个房间里,从汉堡的破旧公寓,在德国夜总会玩摇滚翻唱,到披头士狂热,最后成为,嗯,比耶稣更有名的。从青少年时期的友谊开始,逐渐变成了一场激烈的自我驱动的竞争,最终在痛苦的离婚般的分手中破裂。金融纠纷,暗箭伤人的指控,所有的一切。看到这样的真爱死去令人心碎…
就像任何离婚一样,保罗不是圣人,但我发现自己特别反感约翰在分手后的最终公开评论。他几乎无处不在。一些亮点:说“保罗死于音乐”,把保罗的婚礼描述成葬礼,声称保罗的音乐对电梯有好处,在“等歌曲中嘲讽保罗,你晚上怎么睡得着?”。哎哟!80 年代对保罗的一次采访让他承认这有多伤人,尤其是因为知道约翰的批评会持续下去。如果约翰说他是甲壳虫乐队的真正天才,谁能反驳呢?并且坚持了下来——直到今天,许多粉丝认为约翰是甲壳虫乐队背后的艺术力量,而保罗只是一个庸俗的歌曲作者。需要为自己对有史以来无可争议的最伟大乐队的贡献辩护,尤其是面对你前闺蜜的指控,这一定是多么令人沮丧。
但是如果约翰是对的呢?如果约翰真的是迄今为止最伟大的披头士成员呢?乔治在这场竞争中处于什么位置?
我们来看数据!
甲壳虫乐队痛苦分手的一线希望是,约翰和保罗都觉得可以自由地为每首歌尽可能多地邀功,实质上解开了列侬/麦卡特尼的归属;我使用了这个数据源,它指定了主作曲家作为参考,即使是他们合作的歌曲(基本上是他们所有的歌曲)。我将林戈演唱的曲目分成了自己的类别,因为约翰和保罗通常都为林戈创作简单的歌曲,这些歌曲符合他的演唱能力和无忧无虑的的个性,但却不是他们最好的素材。
让我们先来看看歌曲数量:在甲壳虫乐队录制的 208 首歌曲中,71 首大多是约翰写的,68 首大多是保罗写的,22 首是乔治写的,21 首是他们早期的翻唱歌曲,16 首是约翰+保罗的歌曲(他们平均贡献的歌曲),10 首是林戈唱的,其中有两首是他自己写的(和 章鱼的花园约翰和保罗在歌曲创作方面几乎同样多产,远远领先于乔治,后者只是在他们后来的专辑中才开始做出重要贡献。
那么谁写的歌更好呢?
艺术的“缺点”之一是它不可客观测量。谁能说一首歌比另一首好呢?为了解决这个棘手的问题,让我们先从分析受欢迎程度的客观指标开始,然后再来分析最主观的量化我自己的偏好*!(作为博文作者的额外津贴……)*
Spotify 来拯救我们!
Spotify 很牛逼吧?以下分析依靠 Spotify 流计数挖掘人气。让我们深入了解一下:
Top left: most streamed Beatles songs. Bottom left: Log normal distribution of stream counts for all Beatles songs. Right: Median stream count per Beatle
在披头士流传最广的 10 首歌曲中,有 5 首是保罗写的,2 首是约翰写的,1 首是乔治写的。有趣的是,流计数的分布几乎是完美的对数正态分布*。这是为什么呢?对数正态分布出现在许多因素相互叠加产生倍增效应的情况下。造成这种情况的一个可能的假设是网络效应;如果你真的喜欢一首歌,你可能会比你只是稍微喜欢的那首歌多放很多次。这将使这首歌更有可能被推荐(无论是你还是 Spotify 的算法),从而导致一种指数现象。*
对歌曲计数中位数的分析显示了一些有趣的事实:
- 保罗是最受欢迎的甲壳虫乐队成员!他的中流数几乎是约翰的两倍。对我来说,这是一个相当出乎意料的结果。
- 乔治的歌远不如保罗或约翰的受欢迎。乔治的流数很有趣:他的平均*流数实际上高于约翰,但这主要是受他的前三首歌的影响:太阳来了、什么的和而我的吉他轻轻哭泣,这占了他的流的 80%,而《太阳来了》一曲就解释了超过 50%的 3.78 亿的流。那些都是很棒的歌,但是剩下的 19 首歌就没那么受欢迎了。他第四受欢迎的歌曲实际上在 208 首歌曲中只排在第 84 位。George 的案例很好地说明了为什么 中值比平均值更好,尤其是在对数正态分布等非对称分布中。*
- 林戈的歌曲是最不流畅的。他是个有趣的家伙。也是个很好的鼓手。我们爱你,林戈!作为一个人,但作为一个歌手/歌曲作者就不那么重要了。
为保罗欢呼!但是人气真的是质量最好的指标吗?如果 Spotify 流计数可以作为衡量质量的标准,德雷克和爱莉安娜·格兰德应该是流行音乐史上最优秀的音乐家。如果你听起来没有,那么你肯定是读错了博客文章…
超越流行:主观分析
我听了甲壳虫乐队的 208 首歌中的每一首(那是 14 个小时的播放时间,我已经提到我手上有一个新生儿的时间了吗?)并对每首歌进行了 0 到 10 分的评分。你可以在这里看到数据集。这明显是一个非常** 主观的评级!优美的旋律,有趣的和声和充满激情的歌词在我的书中获得了高分。让我们先来看看我自己的偏好与 Spotify 受欢迎程度的关系:**
歌曲的精彩程度(由我评定)和 Spotify 流计数之间存在 0.59 的强皮尔逊相关性。值得注意的是几首与这种相关性明显不同的歌曲:乔治的可爱的印第安灵感和约翰的 是的,它是 其扣人心弦的和声都表现过度,而约翰的无聊前卫 革命 9 ( 谢谢洋子!)是表现最差的。保罗太可爱Ob-la-di Ob-la-da和顺其自然都获得了相当高的分数,但远低于他们在 Spotify 上的受欢迎程度。
接下来,该吃主菜了。让我们来看看披头士的《牛逼》:
- 保罗和约翰很接近,保罗略微领先。
- 林戈的歌没那么好。 在朋友们的帮助下 是林戈评价最高的歌曲,但这绝对是一次性的:他其余所有的歌曲都在最好听的范围内。约翰和保罗努力做到兼容并蓄,确保林戈的影响超越了他的鼓点,这让我们非常尊重他们,但这些可爱的尝试几乎从未触及真正伟大的披头士歌曲的独创性。
- 乔治有一些好歌,但他不是保罗或约翰。虽然他有几首歌在纯粹的天才级别中排名很高(什么的、太阳来了),但他也有不少不那么令人印象深刻的歌曲。他是一个令人敬畏的吉他演奏者,他的吉他演奏在披头士的歌曲中起着至关重要的作用,但他很难跟上保罗和约翰的歌曲创作天才。
深入挖掘一下约翰和保罗的竞争,我们可以看到约翰实际上有更多真正令人敬畏的歌曲,但他也有更多 Meh-ish 歌曲。保罗则比较稳定,他的大部分歌曲都在《爱它!类别,但达到纯粹天才评级的歌曲略少。
结论:保罗是最伟大的甲壳虫乐队成员
根本没有明确的赢家,但如果追问的话,我会说这个分析显示保罗是比 T2 稍微好一点的歌曲作者。有一点可以有把握地说,约翰是而不是*甲壳虫乐队背后唯一的艺术驱动力,因为他有时试图将自己描绘成后甲壳虫乐队,保罗可以自信地宣称他是有史以来最优秀的两位歌曲作者之一。要记住的一件重要的事情是,他们从来没有真正自己创作过歌曲,几乎总是参加彼此歌曲的录制,即使是在他们分手前充满苦涩的日子里。约翰的 我要你(她好重) 如果没有保罗惊人的低音线*会是什么样?或者保罗的买不到我的爱没有约翰的和声和节奏吉他?或者这么多披头士的歌曲没有乔治美妙的吉他独奏?
John helping Paul with his song in a picture taken by Linda McCartney
另一方面,在听过他们所有的歌曲后,很明显每个人都有自己的天赋:保罗是一个纯粹意义上的音乐家,不断创造出美妙的旋律(仅举几个例子,昨天,米歇尔),甚至在他的旋律基础演奏中做到了这一点。另一方面,约翰是更完整的艺术家,他在某些方面只是偶然地用音乐来表达自己。他是一个伟大的音乐家,但人们可以说他的歌词和音乐一样伟大,如果不是更好的话(宇宙中的,无名之辈,B 因为)。他的情感谱要黑暗得多,这在某种程度上帮助他创作了更具冲击力的摇滚歌曲。
谢谢约翰和保罗!虽然他们对彼此的爱没有他们的音乐遗产持续得久,但如果没有这些千载难逢的天才之间的特殊关系,这个世界将不再是同一个地方。
奖励曲目:披头士专辑间的比较
让我们根据手动评分的歌曲“牛逼程度”的平均值来给披头士的所有专辑排名:
原来, Abbey Road 是甲壳虫乐队最好的专辑左轮手枪和佩珀中士紧随其后。这是一个特别惊人的壮举,因为在录制《艾比路》的时候,甲壳虫乐队已经很少说话了,他们的交流几乎只限于录音室里的音乐。我觉得这个分析对白色专辑不公平,因为它实际上有最多的歌曲被评为“天才”。这表明了这种双专辑的不一致性——如果甲壳虫乐队将白色专辑缩减为包含两张专辑中最佳歌曲的一张专辑,它的平均评级也会跃升至榜首。我也觉得橡胶灵魂在这里被稍微低估了;虽然它缺少许多天才级别的歌曲,但我觉得这是一个总和大于其部分的情况,这并没有反映在这首歌曲的统计数据中。****
那都是乡亲们!
联接数据源
Photo by Christopher Burns on Unsplash
现实世界中的大多数“数据科学”都涉及到创建一个数据集、一个可视化、一个需要从非常不同的来源提取和连接数据来讲述一个连贯故事的应用程序。
跳过玩具数据集,让我们来看一个将不同数据源连接成一个综合地图的完整应用程序。具体来说,我们将回答这个问题:
洛杉机县哪个邮政编码区的人均星巴克门店最多?
举例来说,如果你的工作是在洛杉矶县寻找新星巴克店的最佳地点,你可能会对这个问题的答案非常感兴趣。
定义最终目标
我们的最终目标是创建洛杉矶县的地图。我们的 choropleth 地图基本上满足以下要求:
-所有的 邮政编码边界 都要画出来
-每个邮政编码应根据人均星巴克门店数量以可变强度 着色
我们需要什么类型的数据?
好的,所以我们肯定需要某种地理数据来绘制邮政编码的形状。我们还需要洛杉矶县每家星巴克的位置信息。当然,我们需要一些邮政编码为的 LA 县的人口信息。总而言之,我们需要:
1。 洛杉矶县邮政编码边界的地理数据(最好是 GeoJSON 文件,是描述复杂形状的 JSON)
2。 洛杉机郡每家星巴克店的位置(最好是带有每家店邮政编码的电子表格)
3。* 洛杉矶县人口按邮政编码(最好是电子表格)*
我们可以在哪里找到数据?
厉害!我们已经确定了我们理想中需要的数据类型。现在,让我们考虑一下 在哪里 我们会得到这些数据集。
地理数据似乎很容易,在谷歌上搜索“ la county zipcode geojson ”最终让我找到了合适的 geojson,存储在我的 GitHub 这里。
事实证明,星巴克门店的位置数据要复杂得多。我发现的数据集要么是过时了,要么只是特定的州而不是特定的县。为了获得这些数据,我必须对官方的星巴克商店定位器做一些非常仔细的 API 查询。事实上,这个过程非常有趣,足以让我单独写一篇关于它的文章:
洛杉矶县有多少家星巴克?
towardsdatascience.com](/quick-and-dirty-data-gathering-with-python-9d3d4b8cba13)
对于人口数据集,我在网上找到了一些我想要的预制电子表格,但老实说,我不确定它们的有效性。我认为直接从美国人口普查局获得人口数据要安全得多。获取这些数据需要非常具体地调用人口普查局 API,我有一整篇文章专门介绍这个过程:
为您的项目收集人口数据的简明指南
towardsdatascience.com](/getting-census-data-in-5-easy-steps-a08eeb63995d)
您可以在我的 GitHub 上找到所有三个结果数据集:
我们将如何连接数据集?
好了,我们已经得到了想要的数据。现在,让我们想出一个策略,如何将所有这些结合在一起,制作出我们想要的地图。为了制作地图,我们需要洛杉矶县每个邮政编码的人均星巴克门店数量。目前,我们有创建该指标所需的两个部分,人口数据和商店数据,但需要将它们结合在一起。
因此,使用两阶段方法是有意义的。第一阶段将把人口数据与商店位置数据结合起来,第二阶段将把产生的人均商店数据集与地理数据结合起来。
大概是这样的:
第一阶段:加入人口和店铺位置数据
让我们看一下这两个电子表格的快照,以确定如何将它们连接起来。
人口数据
存储位置数据
看起来我们应该能够将邮政编码列上的两个数据集连接起来,但是有一个问题。商店位置数据包含洛杉矶县每家星巴克商店的一行,但我们真的希望每个邮政编码占一行,商店总数占另一列。让我们使用 python 来做一些快速和肮脏的数据转换!
一旦我们转换了商店位置数据集,它就包含邮政编码作为索引,邮政编码中的星巴克商店数量作为列。
现在,让我们将两个数据集连接在一起:
随后, joinedDf 看起来是这样的:
怎么有些词条是南? 好吧,如果某个邮政编码存在于人口数据集中,而不存在于商店数据集中,那么它的numStores**值就会缺失,反之亦然。我们马上会处理这个问题。**
现在,让我们通过将商店数量除以每个邮政编码的总人口来创建人均商店指标。我们还将删除所有人均商店为空或无穷大的邮政编码(如果邮政编码的人口为零)。
由此产生的 joinedDf 看起来像是:
不错!第一阶段已经完成。我们有一个数据框架,其中包含每个邮政编码的人均商店数。
阶段 2:使用地理数据绘制人均商店地图
现在我们有了包含人均商店的数据集,我们可以在洛杉矶县的地图上绘制这些值,其形状细节存储在我们的地理数据中。让我们创建我们的 choropleth 地图吧!
你生成的laChoropleth.html地图将是交互式的,当你打开它时,你将能够点击、拖动和缩放。我们来看看结果如何。
我们确实在地图上看到一些不同深浅的绿色,但是似乎没有太多的变化。这通常发生在 choropleth 图中,当所讨论的变量存在较大的异常值时。对于我们的例子,这意味着对于 商店人均 来说,有一些邮政编码的 值非常大,而大多数邮政编码的值相对较小。
我们将在这里做一个折衷,通过 storesPerCapita 删除邮政编码的前 10% 。 在生成的地图中会有更多缺失的邮政编码,但保留下来的邮政编码会显示出更好的色谱。我们还将缺失的邮政编码涂成灰色,这样我们就可以知道它们确实缺失了。这是我们最后的舞蹈。
正如我们所看到的,由于各种原因,有相当多的邮政编码缺失。这可能是因为缺少人口或商店数量的值,或者可能是因为人口为零,或者可能是因为我们在上一步中选择了将其删除。不管怎样,留下的邮政编码显示出比原来的 choropleth 更好的颜色渐变*。你绘制地图的确切方式完全取决于你!***
希望本指南演示了如何收集、连接并最终可视化不同的数据源,对您未来的数据工作有所帮助。感谢阅读!*
社交媒体时代的新闻业:探索新闻、记者、假货、分享行为和兴趣
在线新闻和社交媒体使用中的数据科学
Photo by Roman Kraft on Unsplash
如今,理解新闻业并非易事。首先,对于今天的记者,还没有一个共同的、可靠的定义。从某种意义上说,现在任何人都可以当记者。
一种可能的解释是,记者是新闻行业的专业人士,属于一个实践团体。
可以检测记者的分类器的现有实现可以达到 95%的精确度。
下一步是了解文章是否可靠和不可靠。存在能够自动检测和解释分类的方法。
最后,重要的一点是在线新闻媒体如何与社交媒体和新闻的社交分享联系起来。贝尔实验室( @BellLabs )对人们在新闻中看到的内容和他们分享的内容进行的一项研究显示,两者之间存在很大差异。
…但是获取新闻在很大程度上不是基于社交媒体。58%的新闻媒体推荐是自我推荐。只有 0.3%是通过推特。
跨社交媒体平台转载新闻是用户的典型行为,但每个平台都有自己的规范。我们可以定义一个递增的参与度:
不同的操作适用于不同的平台。此外,主题的受欢迎程度在不同的平台上是不同的:
所有这些都与我们最近关于社交媒体上新闻分享行为的工作(和开放资源)密切相关。具体来说,我们已经发布了关于该主题的开放资源,如:
- 一个数据收集和丰富管道,允许从一组新闻源开始,生成包括新闻内容和社会互动的自定义数据集。
- 该数据集包括来自美国主要新闻媒体的新闻文章和 Twitter 上的相关分享活动,涵盖了推文内容和作者简介。
您可以出于任何目的访问这些资源,因为它们分别在 GitHub 和 Harvard Dataverse 上公开提供。你可以在的幻灯片分享上找到简短的描述。
可在 AAAI 图书馆上直接获得描述性论文。
这篇报道是关于 2019 年 6 月 13 日新闻发布会期间在 ICWSM 2019 (国际网络和社交媒体 AAAI 会议)上展示的作品。论文全文可在 AAAI 图书馆在线查阅,第 13 卷,第 01 期。
Photo by Elijah O’Donnell on Unsplash
什么是云之旅?
您不能错过这趟列车,请加入云转型
时机成熟了,伙计们。过去几年我们看到的情况令人不安。云作为一个概念出现,十年后将改变我们的生活。想想你的照片,它们没有存储在云中,可以在任何地方访问。如今,从开发人员到首席执行官,每个人都知道有一个叫做云的机会。本文在简要介绍了云的优势之后,展示了如何移动您的本地应用程序。
云优势是什么?
在云时代之初,说服人们去云的关键词是“它很便宜”。嗯,经过十年的云计算,我们明白这不是成本的问题。在某些情况下,我们体验到云的成本高于本地解决方案。云的关键词是灵活性、效率和战略。
灵活性
IT 项目中最常见的需求是标记时间。如今,每个人都需要比竞争对手更快的解决方案。这种持续的匆忙与实施内部解决方案的常规时间安排相冲突。此外,你需要尝试很多解决方案才能有竞争力。这意味着,并不是所有你将要完成的项目都会结束,或者会有漫长而丰富的生命。但是硬件最终不能简单地转售,sysadmin 的时代一去不复返了。在这种情况下,云帮助了我们。它非常灵活,因此您可以根据自己的需求进行扩展和收缩。此外,你肯定,如果你有足够的钱买它,将有足够的资源给你。
效率
本地解决方案很难维护,需要付出大量努力来保持高效。你需要监控物理数据中心,监控基础设施,与 ISP 签订最好的合同,并为冗余硬件等无用资源付费。你还必须支付入侵测试、保险等安全方面的费用。基本上,云提供商比单个公司更有效率,因为这是他们的工作。他们充分利用成本,能够承担更好的安全检查。而且认为对 AI API 等最有价值的服务。有多少公司可以雇佣一个机器学习工程师请他解决一个图像分类问题?也许更快和更便宜的最终支付昂贵的即用服务。
战略价值
对于所有非 IT 公司来说,花时间在 IT 上是一个混乱的时代。技术是使公司获得(更多)业务的要素,但是……谁真正看到了它的战略性报酬?云提供了许多降低运营成本的机会,并允许公司管理层专注于主要的业务流程或流程。像更新你的 WordPress 网站或者你的 CRM 这样的傻事不再是问题。这种事情必须自动发生。
Foto di 200 Degrees da Pixabay
我如何迁移到云?
云对于那些从零开始的人来说很容易,比如创业公司。当你从白皮书开始,你没有限制,你的第一个约束是要快。你不需要让已经存在的东西活着。基本上,问题是:
如何将现有的应用程序迁移到云中?
有许多选项和方法,但我们可以将问题简化为三种不同的解决方案:
- 换档并抬起。
- 重构
- 重建
- 替换
将应用转移和提升到云
转移和提升的基础是尽可能少地将应用程序放到云上。这意味着完成迁移的时间更短,软件层的工作量更少。对此的支持通常是 PaaS(平台即服务),并解决与物理基础设施相关的问题。顺便说一句,软件上没有任何改变,所以应用程序可能会在伸缩性和性能上保持一些限制。
重构
为了获得比简单地将应用程序转移到云更多的优势,我们可以重构一些 pat 并获得一些最佳收益。这一选择的驱动力是找到最具影响力的变化,并有选择地应用。
例如,您可以将数据库移动到云数据库,但保持相同的接口。这可以使用云数据库服务来完成,它可以被看作是常规的 SQL 数据库,但基于云。这对于大多数应用程序来说是相当透明的,并且很容易带来性能的提高。解决这个问题的好方法是 Aurora DB 或者 Azure MySQL
重建
重构和再工程之间没有任何概念上的区别,两者都是对现有代码的工作,从云机会中获得更多的好处。实际的区别在于这种变化的范围。重构包括许多软件部分和细节的改变。这种实践有助于通过小的变化获得好处。但是在野生世界里,并不总是小变化就足够了。在某些情况下,您还需要对基础架构进行更改,这称为重新设计。
例如,按照前面的示例,您会发现简单地从本地 mysql 切换到云版本对您来说是不够的,还需要扩展和可用性,以及您需要移动到 NoSQL 解决方案的内容。你可以在 Azure 上使用 Cosmos DB,在 Google Cloud 上使用 Firebase,或者在 IBM Cloud 上使用 DashDB。
替换
实际上,这是最常用的解决方案。似乎很奇怪的是,简单地把你的价值几千美元的应用程序扔掉是最常见的解决方案。顺便说一下,福布斯给了我们一个有趣的统计。企业 SaaS 市场现在为软件供应商创造了 200 亿美元的季度收入。这一数字每年增长 32%。即使我们不知道新软件和移动软件之间的百分比,我们也可以假设这些数字中有很多是由本地软件完成的,而这些本地软件被 SaaS 的替代软件所取代。
- **得到标准溶液。**这也有助于标准化公司内部流程
- **降低维护成本:**无需维护基础设施或支付维护或更新费用。你得到了该产品的最新版本
- 重新设计一个旧的应用程序意味着重写它。公司实际使用的软件已经丢失了几十年,重新设计比重做更昂贵。即使在没有任何垂直替换的情况下,从头开始可能是更便宜的选择。
带什么回家
十年前,云是一个赌注,但现在是一个切实的机会。每家公司都应该已经引入并开始着手实施。这一举动不必是瞬间的。你可能需要时间来完全转向云,对于许多公司来说,这可能根本不可能。
第一步是承认搬迁不可能一蹴而就,而是一个漫长的旅程。
这一旅程进入了一种称为“混合云”的状态,在这种状态下,本地结构与云结构协同工作。使用 shift & lift 技术可以快速移动大多数应用程序,但是如果您保持数据中心在线以满足其他需求,这可能不会带来太多价值。在很多情况下,你可以通过对软件的小改动获得很多好处(重构和再造),但是大多数公司只是在他们的软件寿终正寝时才采用 SaaS 解决方案。
数据科学之旅
数据挖掘和机器学习导论
G 鉴于每秒钟数据量的增加,人们越来越倾向于数据科学和机器学习。要想擅长它们,就需要在Data Mining
领域有强大的基础。
U 对数据科学的理解来自于从概念上理解什么是数据,如何处理我们得到的数据(数据对于每个问题总是不同的),以及如何在将数据交给机器学习算法之前有效地预处理数据。我目前正在编写代码示例,完成后我会尽快添加它们。
请容忍我的概念性部分,我知道这可能有点无聊,但如果你有强大的基础,那么没有什么可以阻止你成为一名伟大的数据科学家或机器学习工程师。
Photo by Mika Baumeister on Unsplash
L 我们先问自己一个问题,什么是数据?
→简单来说,数据是一组对象及其属性的集合。数据对象的其他名称有记录、点、向量、模式、事件、事例、样本、观察或实体。
现在,我们必须知道什么是属性?
→它是一个物体的属性或特征。例如:一个人眼睛的颜色。这也称为其他名称,如变量、字段、特性、尺寸、特征等。
然而,为了讨论和更精确地分析物体的特征,我们给它们分配数字或符号。为了明确地做到这一点,我们需要一个测量标尺。那么,测量尺到底是什么?
→嗯,是把一个数值或符号值(属性值)和一个对象的属性关联起来的规则(函数)。例如,我们将某人分为男性或女性。
从上面的讨论中,很明显,用于表示属性的值可能具有不是属性本身的属性,反之亦然。这可以借助一个例子来理解:雇员年龄和 ID 号,这两个属性是用整数值定义的,但它们有不同的意义。谈论员工的平均年龄是有意义的,但不要谈论员工的平均 ID。
他要求根据属性的特征将属性分成不同的类型。数字的下列性质(运算)通常用于描述属性。
- 清晰度:=和≦
- 顺序:,且≥
- 加法:+和-
- 乘法:*和/
给定这些属性,我们可以定义四种类型的属性:标称、序数、区间、和比率。我在下面提供了两个表格来解释这些属性类型和它们的转换。
Table 1: Attribute Type Explanation, Table 2: Transformation that defines attribute levels
名义和序数属性统称为范畴或定性属性。顾名思义,定性属性,比如员工 ID,缺少数字的大部分属性。即使用数字表示,即整数,也应该更像符号一样对待。
剩下的两类属性,区间和比率,统称为数量或数值属性。数量属性用数字表示,具有数字的大部分性质。请注意,数量属性可以是整数值,也可以是连续的。
不同类型的属性符合上述不同的属性。标称符合区别。序号遵循区别和顺序。间隔遵循区别、顺序和有意义差异**。比率符合所有四个属性(区别、顺序、加法和乘法)。**
L 最后,在结束这篇帖子之前,我想说一下连续、离散和非对称属性。它们是理解真实数据的关键部分,因为大多数数据集都是由它们的组合组成的,所以区分变得相当重要。
什么是离散属性?
→它只有有限或可数无限的值集。示例:邮政编码
→这些通常表示为整数值。
什么是连续属性?
→它有实数作为属性值。例如:温度、高度等。
→这些值实际上只能用有限的数字来测量和表示。这意味着它们被表示为浮点变量。
什么是不对称属性?
→在这种情况下,只有非零值是重要的。
例如,考虑一个数据集,其中每个对象都是一名学生,每个属性都记录了一名学生是否在大学上过某门特定的课程。对于特定的学生,如果学生选择了与该属性相关联的课程,则该属性的值为 1,否则为 0。因为学生只选修了所有可用课程的一小部分,所以这种数据集中的大部分值都是 0。因此,关注非零值更有意义,效率也更高。这篇关于数据及其属性的文章到此结束。
这篇帖子的后续是这里。
以及它们的一般特征…
towardsdatascience.com](/types-of-data-sets-in-data-science-data-mining-machine-learning-eb47c80af7a)
我正在免费赠送一本关于一致性的电子书。在这里获得你的免费电子书。
如果你喜欢阅读这样的故事,那么你应该 在你的收件箱 中获取我的帖子,如果你想支持我成为一名作家,考虑注册成为一名媒体成员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你注册使用我的链接,我会赚一小笔佣金,不需要你额外付费。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
tarun-gupta.medium.com](https://tarun-gupta.medium.com/membership)
感谢阅读。如果你喜欢这篇文章,请访问我在这里的其他文章:
[## 标记故事列表的快速链接—感谢您的访问
我也有一份以快节奏出版为目标的出版物。读书成为作家。
tarun-gupta.medium.com](https://tarun-gupta.medium.com/thank-you-for-visiting-my-profile-9f708062c75e)
世界冠军之旅-2019 年微软创新杯
被微软视为“技术奥林匹克”的世界最大挑战之旅
这是一个基于真实事件的故事,讲述了来自印度韦洛尔理工学院的三名工程系学生参加由微软主办的由微软创意杯命名的世界最大工程挑战赛的旅程。
Microsoft Imagine Cup 2019
I magine Cup 是由微软公司赞助和主办的一年一度的比赛,它将全世界的学生开发者聚集在一起,帮助解决一些世界上最棘手的挑战。它被计算机科学和工程视为“技术奥林匹克”,被认为是与技术和软件设计相关的顶级竞赛和奖项之一。所有创新杯参赛者都创建了创新杯主题的项目:
microsoftimaginecup — 12 teams…each with a story to tell, each with an idea to share, an idea that could impact the world. Every single second felt like…a chance to grow,” shares Ansh on his team, Alpha-India’s #ImagineCup journey.
“想象一个科技帮助解决最棘手问题的世界”
每个人都来自不同的背景和文化。一个是充满激情的设计师(Ansh Mehra),第二个是用心的铁杆研究员(Hemant H Kumar),最后是我(Saransh Mittal),脑子里充满了意想不到的精彩想法,有着创新解决方案的愿景,这些解决方案具有巨大的社会影响,并有可能解决现实世界的问题。旅途中的每一天都让我们学到了新的有价值的东西。
我们是 28000 名学生中的一员,他们申请了来自亚洲地区 20 多个国家的 2019 年微软创新杯。结果已经公布,前 12 名团队有机会在世界面前展示他们的产品。我们一生只有一次机会代表印度参加亚洲锦标赛。
那么我们是怎么知道想象杯的呢?
微软学生技术社区
HackHarvard 2018 at Harvard University, Boston
我是大学技术社区的一员,这个社区是由各种非常勤奋的学生作为微软的学生伙伴为微软创立的。在社区招募我的那天,我的一个学长向我介绍了想象杯。即使我在参观哈佛大学之前就很清楚这个比赛,我总是低估我的批判性思维和能力,总是认为我没有足够的能力参加世界锦标赛。我会在未来的想象杯印度总决赛的审判日之后证明自己是错的。
在哈佛大学举办的 HackHarvard 2018
Saransh Mittal at Harvard University, Boston
这一切都要追溯到 2018 年 10 月,当时我们去哈佛大学参加 HackHarvard 2018。我们在黑客马拉松上开发了一个应用程序的原型,并向很多人推销。幸运的是,负责微软学生合作伙伴项目的创新杯团队成员 Susan Ibach 喜欢我们的想法,并看到了将其转化为大项目的潜力。她激励我们进一步研究这个想法,进一步改进原型,并为 2019 年微软创新杯提交一份新的提案。
我们尽了最大努力在评委面前推销这个想法,但很快意识到我们的应用程序太基础了,无法产生真正的影响。尽管我们没有赢得波士顿黑客大会,但我们相信我们必须在理念和产品上有很大的改进。我们刚刚开发了一个应用程序,可以检查一种食品是否含有某种成分。我们回来后开始开发我们的移动应用程序。我们集思广益,试图为我们现有的技术体系找到一个合适的想法,来解决我们产品中的某些缺陷,从而解决问题。
Prototype of the SPOT created at HackHarvard 2018 by team Alpha-India
“永远不要对自己或自己的想法失去信心”
关于我们的想法和概念
SPOT——将增强现实引入零售店
The project we presented at the Microsoft Imagine Cup 2019
考虑一个场景,杰克和他 7 岁的女儿艾伦去中国旅行。劳累了一天后,他们进入一家超市买东西,却发现所有的商品都有中文信息。由于对坚果过敏,艾伦已经住院两次。Spot 接受了 Ellen 的健康档案,并允许她的父亲选择适合他女儿健康的产品。Spot 允许您在增强现实中比较多个产品。只需使用您的手机,点击产品,选择基于您的健康档案推荐的过滤器,并在增强现实中查看过滤的选择。每年有 100 多万人受到过敏反应(如过敏症)的影响,他们食用的食物会导致有害反应和危及生命的医疗紧急情况。如果一个人选择了对他的消费有害的过滤器,Spot 会立即警告他的选择。这是因为产品和消费者之间的信息差距。我们的目标是消除这种信息鸿沟。我们大部分的日常采购都是在线下完成的。网上杂货店允许我们平行比较产品,这是线下杂货店购物所不具备的功能。我们期待与企业和食品市场合作,让他们的产品做好准备。通过使他们的产品准备就绪,食品制造商可以给顾客更大的激励去选择他们的产品,增加他们的销售。
这很简单,但非常有效,因为它促进了适合你健康的选择,并且离线工作。我们使用了 Azure 的 CustomVision AI 来构建图像识别模型。使用 Python App Service,产品的数据库托管在 Azure Cosmos DB 上。现实世界和虚拟世界之间的界限正在慢慢消失,我们的目标是为离线购物世界引入一个新的维度。这对消费者和制造商都有利。做好 AR 准备可以促进产品的销售,弥合信息差距可以促进用户做出更健康的选择。
结果日-2019 年微软印度创意杯
经过几个不眠之夜的提案和提交视频的工作,结果出来了。视频是我们申请成功的关键因素。午夜时分,我在班加罗尔的一家初创公司工作,正在发布产品,这时我的队友赫曼特打电话给我,告诉了我一生中最好的消息。
“兄弟,我们被选中参加创意杯”
**哇!我站在那里,高兴地尖叫,闭上眼睛,享受这一刻。**我们做到了。在 HackHarvard 2018 之后,这是一段艰难的旅程,但我们做到了。我们克服了从祖国远道而来美国却没有赢得哈佛的失望。我们从未对我的想法失去信心,继续前进。我立即在深夜打电话给我的父母,向他们表达我最大的幸福,并分享这一美好的时刻。这是我第一次为自己感到超级自豪,告诉他们 2019 年的想象杯。
第二天,我们立即收到了来自微软的电子邮件,祝贺我们在比赛中的出色表现。在确认我们参加在澳大利亚悉尼举行的亚洲区决赛之前,他们给了我们必须遵守的指导方针。我们开始为澳大利亚之旅做准备,因为离冠军赛只有一个月了。他们开始处理我们的申请,让我们的签证获准进入澳大利亚边境。
接下来的几周,我们不断与微软保持联系。我们接受了媒体和外展团队的采访,以分享我们对我们旅程的看法,与微软的开发人员召开了会议,与微软印度团队的工程师进行了会谈,以帮助我们了解我们的业务模式,并与微软的其他专家进行了交流,他们在那里指导我们并简要介绍了我们未来的旅程。
我们赢得了微软创新杯印度全国赛,现在我们必须代表印度参加亚洲区决赛。我们热切地等待这一天已经很久了。所有的资助,包括我们国际旅行的机票以及我们在达令港附近的诺富特酒店的住宿,都是由微软赞助的。我们没有从口袋里掏出一分钱。
为冠军做准备,向世界展示我们最好的能力
入选是我们能想到的最大成就之一。来自 17 个国家的数百个团队提交了参加亚洲区决赛的项目,我们的团队是入选的 12 个团队之一。微软将于 2 月 10 日至 14 日让我们的团队飞往澳大利亚悉尼,争夺超过 20,000 美元的奖金,以及 5 月份参加 2019 年创新杯世界锦标赛的机会。
对于我们来说,这是一个千载难逢的机会,我们可以加入一个学生开发人员的全球社区,用技术产生影响,我们很高兴看到其他团队将为地区决赛带来什么。
我们无法抑制我们的兴奋。这是地球上最大的科技赛事之一,我们即将成为其中的一部分,但我们还没有准备好作为一个强大的竞争对手与其他团队竞争。所有的团队要么是为他们的想法寻找投资的初创公司,要么是像我们这样的团队,他们有一个想法,有一个在世界上产生巨大影响的愿景。现在是时候确保我们尽最大努力制作一个完整的可出版的产品,以及我们在想象杯上推销所需的所有东西。
More about our product for the Microsoft Imagine Cup 2019
很明显,我们需要一个强大的产品来实现我们的想法,并需要一个令人兴奋的推介计划来与其他团队进行激烈的竞争,以产生强大的影响。我们意识到参加决赛的人都是初创公司,所以为了打造我们产品的品牌,我们付出了一点努力,尝试了一些从未有过的新东西,包括一些附加产品,以产生更大的影响。
我们更加努力地改造应用程序的用户界面,通过大量的动画和调整使它更加用户直观。广告词和海报是与人们交流的静态方式,但视频预告片向人们传达了强有力的信息,帮助他们更好地理解你的想法。我们为我们的品牌设计了标志、海报、贴纸甚至 t 恤,让我们在微软 Ignite 上被介绍的人面前看起来很专业。
“无论你走到哪里,你都会带着你的品牌和理念。”
在去班加罗尔之前
我们对冠军无比兴奋,并准备前往澳大利亚悉尼参加亚洲区决赛。就在我们应该从班加罗尔机场起飞的一周前,我早上从软技能课上回来,不小心把 iPhone 掉在了人行道上,屏幕摔碎了。我很难过,因为屏幕坏了,整个应用程序即将完成,将在决赛中展示。无论如何,我不可能开发这个应用程序,因为 AR 开发需要我的智能手机上的摄像头工作。韦洛尔是印度的一个半城市化城市,在那里我们没有足够的设施让任何授权或熟练的人来修理智能手机。
事情对我来说并不顺利。我非常关注我的免疫力和健康。在过去的一个月里,健康状况不是很好。我的皮肤免疫系统接受了一段时间的药物治疗,突然我的健康状况开始恶化,我被诊断为因食用腐烂的食物而腹泻,并患有食物中毒。锦标赛就要到了,我不确定我是否能在我们启程之前康复。我被立即送进了医院,因为这种疾病正在大范围传播,无法控制。医生给我开了一些有助于快速恢复的药物,但几乎花了一周时间才完全治愈。
“健康应该是一个人在任何工作之前的第一要务。没有健康的生活,你就无法高效地工作和享受生活。”
Team Alpha-India on the flight to Sydney, Australia via Malaysia
抵达澳大利亚悉尼达令港的第一天
这一天到来了,我们结束了每天的工程课,从韦洛尔乘出租车离开。当我们离开大学时,我们的朋友来送我们,并祝我们旅途好运。一个月很快过去了,我们从来没有意识到。很快,等待结束了,我们离遇见来自世界各地的优秀的人们更近了一步。我们到达了班加罗尔——印度的网络城市,坐了很长一段时间的车后,我们累极了,我们到达了赫曼特的家。夜深了,但赫曼特的家人还是迎接了我们,并为我和安什准备了晚餐。晚饭后我们打了个盹睡着了,因为第二天还有很多工作要做。太阳升起,晨光渐长。我们计划在 Hemant 的家里呆一整天,研究产品和业务模型,购买新的杂货,并在我们从当地超市购买的新食品上测试我们的应用程序。Ansh 爸爸从德里来接他,把他的护照交给他,所以他和他一起走了,留下来过夜。我和 Hemant 不知疲倦地工作了一整夜,完成了应用程序的前端和后端。漫漫长夜很快就结束了,我们一大早就去了机场。我们在机场遇到了 Ansh,但当我们一进入机场,马来西亚航空公司的工作人员就从我们的旅行预订中认出了我们,并帮助我们办理了登机手续。我们非常震惊,航空公司的工作人员是如何知道我们进入了创新杯决赛的。突然,我们意识到微软应该已经通知他们我们的到来了。工作人员告诉我们,来自班加罗尔地区的另一个团队也到达了机场,并完成了登机手续,因为他们与我们乘坐同一架飞机。甚至在见到他们之前,我们之间的竞争意识就已经增长,我们决定观察他们的每一个动作,并尽可能少地互动,以了解他们的产品。
我们的第一段旅程是乘坐马来西亚航空公司的飞机从班加罗尔出发的,我们的航班本应在马来西亚的吉隆坡着陆。在马来西亚机场停留 6 个小时后,我们登上了飞往澳大利亚的联运航班。根据马来西亚时区,当时是晚上。我们的航班从跑道上起飞。飞机上的那个晚上充满了兴奋,因为我将会见到来自世界各地的优秀的人。离参加国际比赛的梦想又近了一步。
我们的飞机飞越澳大利亚,在该国中部上空的大部分旅程中,我除了不毛之地什么也没看到。澳大利亚是一个岛国,人口约为 2300 万,其中大多数人居住在该国的主要城市。很快,我们在悉尼机场着陆,看到这个岛国令人惊叹的美景,我们兴奋不已。机场建在海边,跑道与之平行。悉尼是一座郁郁葱葱的绿色城市,美丽的建筑横跨全城。这是印度的冬季,但经历了炎热的太阳,能量开始流经我们的身体,让我们兴奋不已。澳大利亚位于地球的南半球,与北半球的气候季节相反。这个国家拥有丰富多样的遗产,有来自世界各地的人。这是我第一次在这个国家看到很多来自亚洲国家的人,比如中国、韩国、泰国等等。
我们离开机场,一名来自微软的向导正在外面等待所有团队和 MSP,他们由处理旅程后勤的旅行社安排在同一时间到达——橘子旅行。一辆巴士正等在到达门口,把我们带到目的地——诺富特酒店。我们由其他决赛队伍和来自其他县的 MSP 陪同。很快我们就到了旅馆,帕布罗和琼迎接了我们。他们在大楼的入口处等着我们,带我们去各自的房间。我们完成了注册过程,Pablo 给了我们各自的想象杯参赛标签和一张礼品卡,可以在酒店旁边的购物中心的美食广场消费。酒店套房还没有准备好,所以我们把行李留在酒店,离开这个地方去探索周围的城市。
The first day at Sydney, Australia
我们的酒店紧挨着太平洋,澳大利亚所有著名的银行都把总部设在港口旁边的大楼里。几乎所有的旅游景点都在达令港附近。我和 Ansh 共用一个房间,但是 Hemant 和一个来自斯里兰卡队的参与者共用一个不同的房间。我们决定白天一起呆在房间里,然后晚上各自回房间睡觉。
傍晚时分,我们离开了房间的四面墙,去欣赏海边的美景。我们预订了一艘游轮,它将带我们游览这座城市海边的各个地方,然后乘船去看日落。在接下来的两个小时里,我们乘风破浪,在城市的岸边巡游。我们体验了悉尼歌剧院和许多地方的美丽。这是我一生中第一次登上轮船。所以很明显我对此非常兴奋!我们点击了大量的照片,从不同的角度,姿势和邮轮周围的地方。夕阳西下,骑行结束。晚饭后,我们回到各自的房间,工作了一会儿,然后打瞌睡,一直睡到第二天早上。
Team Alpha India at Sydney, Australia
创业日——微软反应器
那是早上 8 点,大巴在酒店门口等着我们,带我们去市里的微软反应器办公室。微软反应器是微软的一项举措,旨在孵化初创公司,并与他们密切合作,开发一种创新产品。第二天从模拟投球开始。微软为我们计划了一个特别的训练营,教我们如何从一个简单的商业模式为你的产品建立一个创业公司,并将最简单的想法转化为最具创新性的产品。
The Imagine Cup family
在创业日,他们邀请了所有创新杯的参与者以及微软的学生合作伙伴。有很多专家从美国飞来分享他们在生活中的知识和经验,关于用一个想法创建一个公司。整整一天,我们被介绍了创建公司的新方法及其商业模式,以及如何在评委面前做一个好的推介。会议结束后,所有的团队都被召集到舞台上,一个接一个地测试我们的产品。许多来自不同非英语国家的人发现很难向评委表达他们的想法。所有球队都要做大量艰苦的工作和最后的润色来改进他们的投球策略。由于来自印度,我们没有遇到语言障碍,但其他团队开发的产品非常出色。我们决定,即使他们的产品会比我们的产品有更大的受众群,我们也会用我们最好的产品来推销我们的产品。在推销会议结束后,我们被分成三组,每组四个团队,与当天召集的专家进行私人咨询。
The one with our mentors Cecily Kovatch and Tom Katona
我们与汤姆·考托瑙先生签了名,他是这次旅行的导师之一,他耐心地听我们对商业模式的想法,并集思广益,为我们第二天的工作提出改进建议。晚上晚些时候,我们都聚集在一起,在悉尼的最高峰合影留念,一天就此结束。
microsoftimaginecup - Wonderful end to day 1 of the Imagine Cup Asia Regional Final and Microsoft Student Partner Summit! Tomorrow, the Imagine Cup Asia Regional Finalists will compete for the chance to win USD15,000 and a spot in the World Championship. 🏆 Stay tuned and follow the action right here.
我们回到房间准备最后一次投球。忙碌了一天后,我们非常累,并计划晚饭后见面,为第二天的最后陈述练习。
夜晚过得如此之快,以至于我们甚至没有意识到我们花了多少时间来练习推销和改进展示我们想法的方式。我们多次改变了 Hemant 和 Ansh 晚上要展示的方式,我会制作产品,这样当人们来看我们的产品时,它就不会出现任何问题。我们确保我们完全按照导师建议的改进措施去做,然后睡觉,希望明天会更好。我们用来训练食品的模型并没有给我们带来好的结果。我们尝试了几种技术来创建一个好的 CNN 模型,试图以各种可能的方式捕捉产品的图像,以便我们的应用程序可以识别食品包装。我们花了很大的力气整晚一遍又一遍地点击数百张图片,以使我们的模型足够好,足以向评委推销。
2019 年微软创新杯亚洲总决赛
Team Alpha-India on the stage presenting their ideas to the judges at the Microsoft Imagine Cup 2019
第三天开始充满了兴奋,因为这是审判日,我们必须在来自不同领域和行业的法官面前投球。他们是来自世界各地的专家,是各自领域的佼佼者。我们很早就起来练习投球,然后去了酒店旁边的 ICC。我们进入会场,意识到整个建筑正在被第二天在微软工作的志愿者为 Ignite 大会进行装饰。
锦标赛开始前,所有的参赛者都在为最后一次投球练习。我们是少数几个提前到达会场的队伍之一。尽管我们很紧张,但还是为最后的表演做好了准备。在最后一刻之前,我们开始打开系统包装测试产品。赫曼特和安什本应带着我们最大的热情,在微软邀请的经验丰富的评委面前推销我们的产品。在最后一轮之前,我们通过努力工作至少练习了 100 次,改进了推介产品的方式,为人们每一次可能的 QnAs 做准备,改变了推介脚本,训练深度学习模型识别产品的包装,以及在我们等待已久的最后时刻之前展示产品演示的方式,远离我们的祖国印度。
这是一个时刻,也是一个梦想,对于一个工程系学生来说,他一生都在等待创新,向世界展示对人们发展的深厚热情,这种热情可以对他们的生活产生巨大影响,解决复杂而具有挑战性的问题,帮助人类这一代过上更好、更舒适的生活。
It’s show time
“表演时间到了!一个想法开始了旅程。来自创新杯亚洲区半决赛的 12 名决赛选手带来了他们最具原创性的技术解决方案,我们现在离赢得 10 万美元的大奖又近了一步。”
推介会议以尴尬的沉默开始,大门紧闭。所有的队伍都准备好了他们的产品,评委们在各自的位置上就座。整个礼堂都为最后时刻做好了准备,灯光暗了下来,比赛开始了。摄像机转向各队,我们分成四组,在观众面前投球。所有的团队开始一个接一个地在世界面前展示他们最伟大的创新想法。
轮到硬件项目了,来自中国的 RailinNova 队、来自印度的 Caeli 队、来自斯里兰卡的草帽队和来自马来西亚的suvecs队被叫上台。
在最后的投球之前,所有的导师和观众都祝我们好运,当 Ansh 和 Hemant 开始投球的时候到了。虽然我们很紧张,但我们的投球在我们生命中最长的 3 分钟后结束了。那是我一生中最快乐、最自豪的时刻。投球会议结束,结果宣布。一些媒体在比赛前告诉我们,来自印度的一支球队应该赢得全球冠军,把想象杯带回家。在最后的颁奖仪式之前。会议暂停了一会儿,让评委们决定获胜者。仪式开始前,我们来到观众席外面,与其他队伍见面,祝贺他们取得的成绩,并祝他们好运。我们很幸运能与来自世界各地的创新思维分享世界舞台。休息时间结束了,有影响力的人作为特邀嘉宾被邀请上台宣布获胜者。
来自印度的卡利队在亚洲锦标赛中获得了第一名。他们为哮喘和慢性呼吸道疾病患者创造了一种智能自动抗污染和药物输送口罩。Caeli 实施了一项突破性技术,以改善生活在世界上污染最严重的印度和中国城市的呼吸系统患者的生活质量。
来自中国的 RailinNova 团队被宣布为亚军,因为他们创造了一种技术,通过多传感器融合自动定位和识别各种缺陷来取代工人,从而实现铁路检查过程的自动化,并创造了一种更安全的方法。
来自菲律宾的 AidUSC 队获得了第三极。他们开发了一款名为 Aqua Check 的产品,该产品利用微软 Azure 的定制视觉,通过显微镜拍照来绘制污染物位置,从而分析水样的污染程度。
比赛结束时,我获得了人生中一些最美好的经历,留下了无数珍贵的回忆,并为成为如此伟大的创新思想社区的一员而感到高兴。
The Microsoft Imagine Cup Asia Regional Final 2019 family
比赛评委
- 蕾切尔·邦迪— 营销&微软澳洲运营总监
- **凯特·卡鲁泽斯—**UNSW 首席数据官,物联网 MAus 创始人
- 贾斯汀·加勒特— 微软学术生态系统总监
- 马克·佩斯— 作者,发明家&未来学家
- Emily Rich — 微软澳大利亚/新西兰创业公司董事总经理
**”**最后输赢无所谓。是你旅途中无数宝贵的经历让你成长,成为一个更好的人”
我们离开了礼堂,微软给我们颁发了决赛入围者和赢得印度决赛的证书。他们向当时在场的每个成员分发了一个特别设计的微软礼包,里面装有 t 恤、笔和其他东西。在每个人都要离开之前,一些从新加坡飞来报道这次活动的媒体记者最后一次来到我们这里,向我的团队询问我们进一步推广这个想法的计划。虽然我们之前已经决定,一旦我们到达印度,我们将开始的第一件事是产品创意的专利申请,但最近这一过程仍处于文档阶段。很快,我们离开了国际会议中心大楼,到达酒店,享受这一令人骄傲的时刻。
晚上晚些时候,外面变暗了。我们太累了,从来没有意识到我们睡了这么久。已经是晚上 9 点了,我们已经错过了晚餐。在澳大利亚,大多数食品商店和餐馆 9 点以后就关门了。我打电话给赫曼特,我们离开酒店寻找食物,但在一次不成功的尝试后,我们最终从客房服务订购食物。
微软 Ignite-2019 年澳大利亚悉尼之旅
Saransh Mittal at the Microsoft Ignite Tour at Sydney, Australia
会议日开始了。虽然我对前一天我们被淘汰出在西雅图举行的世界锦标赛感到有点难过。我的父亲是我生命中最有影响力的人,他告诉我这本身就是我生命中最大的成就,是我的胜利,从而激励我重拾信心。他说服我买一部新的 iPhone,因为它以前坏过。我从未想过我会得到这么贵重的礼物作为对我努力工作的回报。由于想买一部新的 iPhone,我搜索了附近最好的商店,找到了 JB Hifi。我穿过分隔达令港和城市的大桥,到达了目的地。在柜台急切地等待机会,买了新手机。我感谢上帝赐予我如此美好的生活。
第四天,微软邀请我们向来自世界各地参加年度 Ignite 大会的 6000 多名企业家、天使投资人和大型 IT 专业人士展示我们的想法。在展览中心,每个创意杯团队都有一个单独的桌子来展示他们的产品,并在会议上展示他们的想法。中心的每个团队都在争夺人民选择奖。幸运的队伍将赢得 1000 美元的现金奖励。每位代表都获得了一张投票票,他们来到由创新杯团队装饰的桌子前,为他们最喜欢的最佳创意投票。
我们在旅途中遇到了很多人,并与他们建立了联系,每当我们的想法在会议上受到人们的赞赏时,我们都为自己的辛勤工作感到自豪。在整个旅程中,我度过的每一刻都让我为自己感到无比自豪,也很幸运有机会成为其中的一员。
The dinner at the Hard Rock Cafe in Sydney, Australia
ignite tour 以 2019 年想象杯的所有学生合作伙伴和决赛选手在晚宴上结束,这是一个特殊的场合,在晚上晚些时候,在达令港美丽的海边景色旁边的硬石咖啡馆庆祝最后一夜的精彩时刻。
所有的车队都聚集在一起庆祝这一时刻,Pablo 向每个人致意,感谢他们作为决赛选手取得的巨大成就,因为在这个星球上很少有人能够幸运地有机会成为顶级梦想家。幸运抽奖比赛的结果已经公布,大约 10 人获得了现金奖。赫曼特是少数赢得 250 美元作为礼物的幸运儿之一。Pablo 召集了我们所有人,并宣布了在 ignite tour 上举行的人民选择奖的获奖者,Suffex 团队赢得了冠军。
食物端上来了,每个人都高兴起来。我们开始讨论我们的经历、想法和其他话题。我们讨论了想象杯项目的团队负责人 Pablo Veramundi,并询问了他对自己所追随的激情的看法。Ansh 和我被他的工作打动了,他周游世界,结识新朋友,体验学生们对单一事业的想法,为团队保存最有价值的记忆,每天面对动态的挑战,并对作为一个人所做的事情保持热情。我希望追求像巴勃罗一样的职业生涯,因为他的激情每天都在激励着他。他是一个非常外向的人,微软的每个人都非常尊重他。
会场上的每个人都有自己独特的鼓舞人心的故事告诉我们,这些故事反映了他们在生活中为成为一个人而奋斗和努力的结果。
Joan Hoshino 是微软的第一批员工之一,当时这家科技巨头还只是一家车库创业公司,她与我们分享了她的故事。她已经为微软工作了 30 年,负责这个科技巨头的销售和市场部门。她曾与比尔·盖茨密切合作,并讲述了萨提亚给公司带来的巨大变化。她来自日本,定居在美国。她未婚,热爱自己的工作。她分享了自己的经历,讲述了“人们在知道她为微软工作后,如何问她关于如何修复某些 windows bug 的技术问题的愚蠢问题”,她来自销售项目。我们进行了一次长谈,她告诉我们她在生活中面临的困难。她给出的最有价值的建议是,永远追求让你对他们充满热情并感到快乐的职业。我们见到了想象杯家庭的整个组织团队,听到他们在生活中的经历,我们感到震惊。
Team Alpha-India and Team RailNova at the Hard Rock Cafe
那天晚上,每个人都互相告别,希望每个人都更加努力,成为更好的自己。在很短的时间内,这已经成为我们的一个小家庭。人们分享电话号码,并承诺彼此保持联系。这是我第一次结交来自世界其他地方的好朋友。
目睹了夜晚的美妙,我们冲出酒店,为无私的努力和真正的友谊庆祝这个夜晚(在房间的四面墙外)。整个晚上过去了,我们漫步在城市的街道上,享受着美丽大都市的夜生活,讨论着关于人、生活和事业的无尽话题,为印度的家人和朋友买了特别的礼物,还有只在这个岛国零售的特别巧克力。我们高兴地回来了,然后就去睡觉了。
宝贵的旅程已经结束,我们被 20 多个媒体网站报道,提到我们团队的成功,赞赏我们创造的产品,称其为一个时代定义的概念。这是我人生中第一次出现在新闻报道中。
Editorial News Publications featuring Team Alpha-India
“再见澳大利亚”——我们在悉尼的最后一天
旅程的最后一天,我们早早起床,计划游览美丽的悉尼和达令港周边地区。这一天从我们退房并把行李交给酒店工作人员开始。我们在酒店的自助餐厅吃了早餐。尽管天气多云,我们还是决定在达令港附近的主要景点逛逛。我们的短途旅行从参观动物园、海底水族馆和杜莎夫人蜡像馆开始。这是一个全国性的节日,每个人都出去和家人一起享受美好的一天。
夜深了,云消失了。我们回到酒店,Ansh 在长途旅行后非常累,决定在累人的飞行前呆在家里放松一下。为了见证这个岛国的真正美丽,我和赫曼特决定去参观我们一生中最美丽的地方——邦迪海滩!如果你去悉尼的话,这是网上最受欢迎的推荐之一。我们预订了一个优步,长途旅行的唯一原因是不要有一种旅行不完整的感觉,而没有经历人们游览澳大利亚的主要原因是因为它的美丽。在那里呆了一个小时左右,然后赶回酒店,因为我们要赶飞机,不得不登上去机场的巴士。
这是一次值得铭记一生的旅行。我们分享的记忆和舞台对我们来说意义重大。我们有过完全失去信心的时刻,但不是我们的想法。我们战斗,努力工作,整晚都被笑话逗笑,分享回忆,旅程最终以梦想成真而结束。
“这些是我生命中最美好的回忆,我们有着如此惊人的友谊!作为朋友和团队,我们已经走过了漫长的道路。”
Saransh Mittal and Hemant H Kumar at the Bondi beach in Sydney, Australia
“这是梦还是真实的现实。我很高兴我是其中的一部分”
朱莉娅盒子:朱莉娅谷歌实验室
Julia 是一门伟大的语言,正在统计计算领域崭露头角。朱莉娅实际上是非常常用的生物学家,医学家和化学家;然而,Julia for data-science 虽然还没有大规模使用,却是一个越来越可行的想法。与我们现在使用的主要统计和数据处理语言相比,Julia 当然有优势:
Python、R 和 Scala。
ulia 是一种函数式语言,具有近乎 Python 式的语法,运行速度几乎与 c 语言等通用低级语言一样快。虽然我不想说 Julia 很像 Python,但它确实相似。 Julia 在浮点和大数值计算方面也非常精确,这是 Scala 所欠缺的。R 可能有点复杂:一般来说,R 是伟大的,但在一些方面它落后了。基于 S,R 一直面临着一些有趣的问题,并不是不能解决。另外,R 不像 Python 那样通用。Python 也和 Scala、R 一样优秀,但是它有一个巨大的速度问题,这个问题甚至会导致远程服务器上的管理员终止工作。虽然这通常不是问题,但是 Python 性能是一个完全不同的难题,优化可能会非常繁琐。
这并不是说 Python、R 和 Scala 都不好,它们当然不是。但是很难忽视朱莉娅带来的所有好处。
所有这些将我们带入一个新的讨论:
远程计算
远程计算非常棒,它可以让那些在你的电脑上无法运行的计算完美运行。对于 Pythonic 数据科学家来说,Google Colab 绝对不是一个新概念或新产品。Google Colab 是一款全新的 IPython 笔记本,它有一个虚拟内核作为在 Google 服务器上进行计算的前端。Colab 也是免费的,这使它领先于同类服务。最重要的是,Colab 集成了谷歌,完全没有设置。只要去网站注册,就大功告成了!
Colab 对于 Python 来说太棒了,我发现自己经常使用它,而不是启动笔记本服务器。随着 Julia 用户数量的增长,以及每天发布的越来越多的数据科学包,如果 Julia 采用类似的东西会怎么样?
介绍:朱丽亚博克斯
uliabox 类似于 Colab,但它运行的不是 Python,而是 Julia。就像 Colab 一样,JuliaBox 是免费的。我认为谷歌可以做得更好的是可扩展性。如果只是为了方便起见,购买一个更高级别的 Colab 版本就好了。Juliabox 恰恰具备这一点,而且定价绝对超出公平。
资深数据科学家经常忽略远程笔记本的概念。我们可能会去我们古老的服务器,它配备了 RTX 图形处理器和 32 个核心中央处理器。或者甚至在我们的个人服务器上进行计算。
在我看来,像 Juliabox 或 Google Colab 这样的平台让数据科学变得更容易获得。我经常向我的朋友提问,不管他们是数据科学家还是渴望成为一名数据科学家。令我惊讶的是,几乎没有问题是关于编程的,而是更多的概念。其中一个我有很多疑问的概念是 Jupyter 。
朱庇特?!这相当于询问您的 IDE,而不是您的写作语言。当然,这没有什么错,但这表明这些设置概念对新用户来说相当困难。对于 R、Julia 和 Scala 来说,设置也可能相当漫长。从我的经验来看,Julia 最容易,R 居中,Scala 肯定最难。
因此,提前做好一切准备的远程选择肯定是可取的,而 Juliabox 肯定会为 Julia 带来更多的人。在我最初注意到它之后,我想告诉我所有的朋友,然后意识到我一个朋友也没有;所以我决定与你分享这个了不起的软件!
朱莉娅速度战:合成、递归和迭代循环
随着我为机器学习模块车床所做的所有写作,以及我在 0.0.4 中实现的新算法,我的思想一直集中在优化上,以真正为快速的机器学习设置标杆。几周前,在做一个时间敏感的项目时,我试图用 Python 从一个巨大的数据集构建一个算法,Jupyter 内核会因为试图读取它而崩溃。另一方面,我想到了我的 Julia 经验,甚至不需要使用 Scala,我就可以很好地读取超过 3500 万次观察的数据集,并且使用 Lathe 最多只需要几秒钟就可以做出预测。这是一个很难理解的概念,与其说我遇到了运行的硬件的限制,不如说我遇到了语言的限制。
这让我想到了低级算法以及它们在循环形式的计算速度中的位置。经过深思熟虑,我决定测试众所周知的关于处理和语言的计算机科学思想的有效性和严重性,特别是在 Julia 中。我们都知道朱莉娅不遵循任何人的规则,在这方面她确实是一种独特的语言。我有一篇文章在这里关于你在使用它之前应该知道的关于朱莉娅的事情,你可以查看更多信息。
假设
在早期的计算领域,迭代通常被认为是处理和个性化数组中的索引的最快的循环类型。考虑到这一点,由于明显的原因(mb 内存对 gb 内存),许多较老的系统使用递归传输的堆栈比现代计算机少,然而许多 80 年代的遗留语言仍然更适合于在语法循环和递归循环上进行迭代。还应该注意的是,递归经常不被接受,被认为是完成快速任务最慢的方式。至于语法表达式,通常结果完全取决于你的语言及其编译器。
在那个特别的音符上;我将向您介绍 Julia 的(股票)编译器:
提前(AOT)
考虑到 AOT,我们可以假设许多其他编译器和语言作为一个整体可能不会产生相同的结果,甚至可能产生完全不同的结果。我想指出这一点,因为我个人被这个测试的结果带了回来,它真的让我对他们如何能够操纵语言和编译器到如此程度以使 Julia 成为如此甜美的语言感兴趣。我想那是麻省理工学院给你的。
设置我们的测试
我们的数据集将是我在这个项目中使用的数据集,因为它非常大。数据清理后的形状是 864,863 行× 3 列,这对于一个像样的速度测试来说应该足够了。
我将使用线性回归函数作为控制来进行速度测试,唯一要做的更改是循环(最多一行)和循环本身所必需的部分。线性回归的公式为:
y^ = a+(b*x^)哪里
a =(∑y)(∑x)-(∑x)(∑xy))/(n(∑x)-(∑x))
和
b =(x(∑xy)—(∑x)(∑y))/n(∑x)—(∑x)
因此,让我们编写一个简单线性回归函数的迭代版本:
function pred_LinearRegression(x,y,xt)
# a = ((∑y)(∑x^2)-(∑x)(∑xy)) / (n(∑x^2) - (∑x)^2)
# b = (x(∑xy) - (∑x)(∑y)) / n(∑x^2) - (∑x)^2
# Get our Summatations:
Σx = sum(x)
Σy = sum(y)
# dot x and y
xy = x .* y
# ∑dot x and y
Σxy = sum(xy)
# dotsquare x
x2 = x .^ 2
# ∑ dotsquare x
Σx2 = sum(x2)
# n = sample size
n = length(x)
# Calculate a
a = (((Σy) * (Σx2)) - ((Σx * (Σxy)))) / ((n * (Σx2))-(Σx^2))
# Calculate b
b = ((n*(Σxy)) - (Σx * Σy)) / ((n * (Σx2)) - (Σx ^ 2))
# Empty array:
ypred = []
for i in xt
yp = a+(b*i)
append!(ypred,yp)
end
return(ypred)
end
我们将使用 Julia 的计时器来为我们的预测计时。我认为这将是理想的方式,因为我们可以消除任何中间件,因为我们可以在没有任何额外开销计时器的情况下计算值。
[@time](http://twitter.com/time) pred_LinearRegression(trainX,trainy,testX)
现在我们将对一个递归循环做同样的事情:
function pred_LinearRegression(m,xt)
# a = ((∑y)(∑x^2)-(∑x)(∑xy)) / (n(∑x^2) - (∑x)^2)
# b = (x(∑xy) - (∑x)(∑y)) / n(∑x^2) - (∑x)^2
# Get our Summatations:
x = m.x
y = m.y
Σx = sum(x)
Σy = sum(y)
# dot x and y
xy = x .* y
# ∑dot x and y
Σxy = sum(xy)
# dotsquare x
x2 = x .^ 2
# ∑ dotsquare x
Σx2 = sum(x2)
# n = sample size
n = length(x)
# Calculate a
a = (((Σy) * (Σx2)) - ((Σx * (Σxy)))) / ((n * (Σx2))-(Σx^2))
# Calculate b
b = ((n*(Σxy)) - (Σx * Σy)) / ((n * (Σx2)) - (Σx ^ 2))
[i = a+(b*i) for i in xt]
return(xt)
end
实际上:
function pred_LinearRegression(m,xt)
# a = ((∑y)(∑x^2)-(∑x)(∑xy)) / (n(∑x^2) - (∑x)^2)
# b = (x(∑xy) - (∑x)(∑y)) / n(∑x^2) - (∑x)^2
# Get our Summatations:
x = m.x
y = m.y
Σx = sum(x)
Σy = sum(y)
# dot x and y
xy = x .* y
# ∑dot x and y
Σxy = sum(xy)
# dotsquare x
x2 = x .^ 2
# ∑ dotsquare x
Σx2 = sum(x2)
# n = sample size
n = length(x)
# Calculate a
a = (((Σy) * (Σx2)) - ((Σx * (Σxy)))) / ((n * (Σx2))-(Σx^2))
# Calculate b
b = ((n*(Σxy)) - (Σx * Σy)) / ((n * (Σx2)) - (Σx ^ 2))
f(X) = a.+b.*X
ypred = f(xt)
return(ypred)
end
结果
这些结果可能会让你震惊:
- 平均值为 0.114379399999999999 秒的递归
- 平均为 0.1685546 秒
- 平均值为 0.4208722 秒的迭代(用于循环)
迭代是最后一次!?
最重要的是,我认为这确实说明了 Julia 非常适合作为函数式语言。递归是函数式编程的一个奇妙的构建块,并且是开创这一概念的基本算法之一。
有了这些结果,我想最小化任何不受控制的变量,所以我的第一个目标是内存,因为递归非常依赖内存。
如左边的系统监视器所示,我们当然没有处理器速度或内存不足的问题,资源远远没有被过度使用。
因此,我决定做的下一件事是拓宽频谱,看看较慢的运行时间是否对结果有显著影响,为此,我将处理单元的时钟频率降低到 1824 MHz,并将调节器设置为仅允许使用两个内核。这说起来容易做起来难,因为完成所有的数据计算需要相当长的时间(太慢了。)我最初选择单核,但那对我来说太远了,感觉像是在 90 年代等待二十分钟来切换窗口。
这产生了明显更高的速度,但趋势完全继续,这没有对结果产生影响…
- 速度为. 33 的递归
- 速度为 0.39 的合成事实
- 速度为 1.37 的迭代
概观
没错,差异实际上非常显著,考虑到这一点,从现在开始,我一定会尽可能地在 Julia 中使用递归!我不知道这种对速度的渴望来自哪里,但我对朱莉娅轻松处理如此大量数据的能力印象深刻。我真的很喜欢做这些测试,因为结果使我成为一个更好的程序员,可以更有效地操作语言和编译器。希望这对于在 Julia 工作的任何其他数据科学家来说也是非常有益的,我知道从现在开始我肯定会将这些结果应用到我的所有功能中。
七月版:自然语言处理
当我问你当我说“性感、未来的机器学习”时,你会想到什么,你可能会想到人工智能生成的人脸、机器制作的视频游戏,以及在《星际争霸 2》中击败人类的计算机。这些算法当然华而不实,令人印象深刻,但分析单词的机器呢?
来自社交媒体帖子、评论、电子邮件、文本、HTML 页面等的非结构化文本构成了世界数据的巨大块。与此同时,对其他人或对谷歌助手或 Alexa 或 Siri 说的话是我们传达思想、感情和意图的最自然的方式之一。因此,如果我们想建造真正多功能和智能的机器,我们必须让它们理解文本。
在这篇文章中,我们收集了一些我们最喜欢的关于自然语言处理的文章。它们涵盖了机器学习中一些最常见的基于语言的任务,如分类、实体提取和文本生成,以及最流行的 NLP 技术和最新的 ML 开发。尽情享受吧!
戴尔·马科维茨——谷歌的编辑助理/软件开发员
自然语言处理:从基础到使用 RNN 和 LSTM
通过 vibhor nigam — 11 分钟读取
对自然语言处理领域中流行的所有概念的详细介绍。
OpenAI GPT-2:通过可视化理解语言生成
由杰西·维格 — 9 分钟读完
超大的语言模型是如何完成你的想法的。
BERT 解释道:自然语言处理的最先进的语言模型
通过拉尼·霍雷夫 — 7 分钟读取
BERT(来自变压器的双向编码器表示)是谷歌 AI 语言的研究人员最近发表的一篇论文。
超越单词嵌入(第一部分、第二部分、第三部分、第四部分)
由亚伦(阿里)博恩施泰因 — 5 分钟阅读
本系列将回顾使用预训练单词嵌入的优点和缺点,并演示如何将更复杂的语义表示方案(如语义角色标记、抽象意义表示和语义依赖解析)整合到您的应用程序中。
使用自定义实体提取解析结构化文档
戴尔·马科维茨 — 6 分钟阅读
网上有很多很棒的教程,解释如何用机器学习对文本块进行分类。但是,如果你想对单个单词进行分类,而不仅仅是对文本进行分类,该怎么办呢?
评估 NLP: BLEU 中的文本输出,风险自负
雷切尔·塔曼 — 17 分钟阅读
刚进入 NLP 的人经常问我一个问题,当系统的输出是文本,而不是输入文本的某种分类时,如何评估系统。
经办人:图文并茂的注意事项
由莱米·卡里姆 — 12 分钟读完
gif 中的注意力,以及在谷歌翻译这样的机器翻译中是如何使用的。
在没有大数据的情况下应用深度学习进行自然语言处理的经验教训
由 yonatan hadar — 10 分钟阅读
作为一名数据科学家,你最重要的技能之一应该是为你的问题选择正确的建模技术和算法。几个月前,我试图解决一个文本分类问题,即对哪些新闻文章与我的客户相关进行分类。
我们也感谢最近加入我们的所有伟大的新作家,罗伯特·桑德尔,安蒂·普乌拉,威,斯文·巴尔诺扬,托马斯·尚邦,希拉里·西特,丹尼·詹兹,山姆·巴罗斯,凯瑟琳·伊莎贝尔·劳伦斯,索米亚·沙阿 迪奥戈·萨,卢卡·德·安杰利斯,伊桑·戴伊,彼得·巴贝尔,乔纳森·刘,阿扬·曲等等很多人。 我们邀请你看看他们的简介,看看他们的工作。
使用 nbconvert 跳出 Jupyter 笔记本
轻松将笔记本转换为 Python 脚本和可共享文件
如果你是一名数据科学家*,nbconvert* 是一个很好的工具,可以添加到你的工具箱中。使用 nbconvert,您可以从命令行轻松地将 Jupyter 笔记本转换为 Python 脚本。它还可以让你把你的 Jupyter 笔记本变成像。html and.pdf 文件。多酷啊。
Jumping Out of a Jupyter Notebook
nbconvert 是一个开源软件项目,与 Anaconda 捆绑在一起。引用 nbconvert docs 的话,它支持:
- 以熟悉的格式呈现信息,如 PDF。
- 发表使用 LaTeX 的研究,为在论文中嵌入笔记本打开了大门。
- 与工作中不使用笔记本的其他人合作。
- 使用 HTML 通过网络与许多人分享内容。
本指南自 nbconvert 版本 5.4 起生效。让我们深入研究如何使用它!
安装 nbconvert 和朋友
虽然 nbconvert 是随 Anaconda 一起安装的,但是它也可以与 pip 一起安装。您可以将 Jupyter 笔记本转换为一些文件格式,如 HTML,开箱即用。
然而,如果你想将笔记本转换成 LaTex、PDF、Ascii、reStructuredTExt 或 Markdown,你需要安装 Pandoc 和 LaTeX 。这些软件包的安装信息因您的机器而异,您可以在这里找到。
让我们看看如何从 shell 中运行 nbconvert。
从命令行运行 nbconvert
从您的终端 shell 中,运行jupyter nbconvert --to my_format my_notebook.ipynb
。
my_format
是转换选项之一。
my_notebook.ipynb
是要转换的笔记本文件路径的名称。
信息输出公式
超文本标记语言
用jupyter nbconvert --to html my_notebook.ipynb
把你的 Jupyter 笔记本变成漂亮的 HTML。
默认的输出格式是一个格式良好的 HTML 页面。如果你想要一个基本的 HTML 版本,可能对嵌入另一个 HTML 文档有用,那么把--template basic
作为参数传递。
让我们看看您可以将笔记本转换成的其他格式。
PDF、降价、重组文本、LaTeX 和 AsciiDoc
尝试这些格式之前,请先安装 LaTeX 和 Pandoc。这里的安装信息是。
分别是pdf
、markdown
、rst
、latex
、asciidoc
。
LaTeX 文件可以在此处描述的几种不同的报告和文章模板中导出。
选择 Markdown,reStructuredText,LaTeX,ASCII 输出创建一个文件夹。png 图像从您的笔记本电脑的图形。
我刚刚做了一个 PR 将 ASCII 转换添加到文档中,很快这个功能也将被记录下来。
运行一个或多个笔记本
当然,在 Jupyter 笔记本中,你可以通过菜单或者快捷键来运行它。我提到这个特性是因为它作为 Python 脚本的一部分可能很有用。就用--to notebook
作为你的论据吧。如果你想尝试这个功能,有几个选项,所以我建议你参考文档。
Reveal.js HTML 幻灯片
用--to slides
将笔记本转变成幻灯片听起来很有希望,但这还不是一个平稳的过程。您需要首先手动调整 Jupyter 笔记本电池。您还需要安装 Reveal.js 软件包,或者在放映幻灯片时访问互联网。此外,您需要设置一个服务器来使用幻灯片计时。
我个人现在不会使用幻灯片功能,但它值得在未来重新使用。如果你愿意,这方面还有开发工作要做。😄
接下来让我们看看在程序中运行 nbconvert。
可执行 Python 脚本
从 Jupyter 笔记本轻松转换到 Python 脚本的能力让我对尝试 nbconvert 感到兴奋。你猜怎么着?有用!
jupyter nbconvert --to script my_notebook.ipynb
在同一个文件夹中创建 my_notebook.py 。然后你就可以跑python my_notebook.py
笑了。😄
要使用这个脚本,您当然需要确保导入的包在您的环境中可用。另外,注意以%
、%%
或!
开头的 Jupyter 魔法命令会让你的脚本停下来,所以你需要删除它们。
将 nbconvert 作为库运行
你可以写一个 Python 程序把 nbconvert 当库用。文档中有一个例子。警告您不完全清楚您需要什么样的文件,如何使用导出器,或者如何编写文件。
我在一个开源项目中使用了 nbconvert,以便轻松地将 Jupyter 笔记本转换为 Python 可执行文件和 HTML 文件。下面是如何使用 NotebookToAll 包用两行代码创建这些文件。
pip install notebooktoall
from notebooktoall.transform import transform_notebooktransform_notebook(ipynb_file=”my_jupyter_notebook.ipynb”, export_list=[“html”, “py”])
我正在完成一个使用 nbconvert 制作 OSS 软件包的经验指南。在这篇文章中,我将向您展示如何用自动化测试和部署特性创建您自己的 Python 包。跟着我,保证你不会错过!
Jupyter 实验室/Jupyter 笔记本内部
如果你不想使用命令行或库或我的小软件包,并且你在 Jupyter 笔记本中,你可以通过查看菜单下载转换后的文件。见下图。
Time to hop
与命令行相比,您失去了一点控制,但它很快。😏
更新 2019 年 2 月 27 日笔记本也可以从 Jupyter 实验室导出。进入文件- >将笔记本导出为… 并选择您的导出格式。
Jump out of your Jupyter Notebook
包装
现在您已经看到了 nbconvert 的基础知识。我希望这篇文章能给你一些在工作中使用它的想法。
如果你觉得这篇文章很有趣,请在你最喜欢的社交媒体渠道上分享,这样其他人也可以找到它!👏
我撰写关于数据科学、Python、Docker 和其他技术主题的文章。如果你对此感兴趣,请点击查看。
感谢阅读!
在 R 中启动数据科学
The worn-out Sticker on the lid of my MacBook
像许多人一样,我在 4 年前开始了我的数据科学生涯,当时我的数据科学知识和编程经验都很有限。为了让自己跟上进度,我在网上搜索了一个自学专家在线课程。Coursera 上出现的一门课程是约翰霍普金斯大学的数据科学专业。我最终选择这个专业的几个原因是:
- 它有体面的在线评论和评级。
- 这是一门基于 R 的课程/专业。
- 它几乎涵盖了数据科学的所有方面。
老实说,完成这 10 门专业课的整个旅程并不那么简单。我在 2016 年初报名了整个专业,花了差不多两年时间才最终确定下来。主要原因是 Coursera 过去不需要每月订阅,课程可以在两年内慢慢完成,只需一次性预付费用。回想起来,我想如果我在目前的每月订阅计划下,我会更早完成它。反正我是 2018 年初定的全专。这是我的证件:
JHU Data Science Specialization Certificate
这个专业包括 10 门课程。在完成这个专精的旅途中,我尽力使用 Github。我所有的作业和项目代码都存储在这个库中。在这篇文章中,我将简要回顾每门课程,我希望你能从中获得一些见解。
课程 1:数据科学家工具箱
选择正确的工具集是至关重要的,这通常会使您的工作效率提高一倍甚至两倍。当我刚开始使用 R 时,我没有做太多的研究,在找到 Rstudio 之前,在 Linux 环境中使用了相当长一段时间的命令行 R。课程 1 涵盖了基于 R 的数据科学工作所需的大部分工具。他们是
- RStudio:R 最流行的 IDE。我应该说如果没有 R studio,R 不可能如此流行。Rstudio 不断集成函数,让 R 编程变得更加简单快捷。自动完成、热键、RStudio 项目等等。喜欢 Rstudio 的理由太多了。
- Git :最流行的版本控制程序。RStudio 为基本用途提供了非常好的 git 集成。不过最好了解更高级的 git 函数,比如 merge,rebase 等。
- Rmarkdown:r 中的一体化报表工具,可以使用 Rmarkdown 创建幻灯片、笔记本、学术论文、互动网站等。
课程 2: R 编程
了解 R 的工作原理非常重要。课程 2 涵盖了 R 编程的基础知识。除了数据结构、流程控制、函数等常规编程主题之外。,本课程中还有一些其他有趣的主题:
- 作用域规则 : R 使用词法作用域。用简单的语言来说,在定义函数的同一层或更高层创建的变量可以被该函数使用。当我第一次开始开发 R 包时,我想减少函数参数的数量,犯了一个错误,天真地假设在函数 A 中计算的一个变量对在 A 体内调用的函数 B 是可用的。
- Xapply 函数族 : R 如果尽可能多地使用向量运算,效率最高。其他语言使用循环可能仍然是最有效的。我不是 Xapply 函数家族的粉丝,也很少使用它们。在我个人看来,这看起来像是元素思维和矢量思维的折衷。它既不像循环那样灵活,也不像向量运算那样快速。
正如我说过的,这门课是 R 编程的一个很好的起点。如果你想学习更多关于 R 编程的知识,我强烈推荐 Hadley Wickham 的《高级 R 编程》一书。
课程 3:获取和清理数据
本课程基本分为两个部分:
- 获取数据:关于如何从文件、API 和数据库中本地和远程获取数据。很标准,没什么刺激的。
- 清理数据:是关于数据操作,也是一个重要的概念,叫做“整洁”的数据。
- 数据操作:本课程主要介绍操作数据的基本方法和
dplyr
方法,但是,我强烈推荐使用data.table
方法操作数据。操作数据要比前两种方式快得多。我也着迷于data.table
的语法是多么的简单和简洁。绝对值得一探究竟。 - 整齐的数据:整齐数据的思想被用在很多 R 包中,比如
ggplot2
,并且被用在数据库表设计中以获得可伸缩性。如果数据已经是一种整齐的格式,你会发现处理起来容易得多。一定要看看哈德利·韦翰的论文《整洁的数据》。我向你保证,花 30 分钟通读这篇文章将使你成为一名更好的数据科学家。
课程 4:探索性数据分析
这门课程是关于探索性数据分析,又名 EDA。对我来说,EDA 90%是关于数据可视化的。数据可视化对于发现异常值、偏斜度、相关性等非常有用。一般来说,做 EDA 之后,即使没有任何建模工作,你也应该能形成一些基本的假设。然而,在整个数据科学工作流程中,应该在 EDA 上投入多少精力是有争议的。根据我的个人经验,我并没有在 EDA 上投入太多精力,原因如下:
- EDA 不是模型构建的先决条件。即使你有一个完整的 EDA,有漂亮的图表,对每个特性的分布有一个基本的概念,以及多个特性是如何相互关联的,最终,你仍然需要建立一个基于数据的预测模型。如果预测模型工作正常,它应该证实 EDA 已经显示了什么。
- EDA 没有标准的程序。与模型构建不同,几乎没有人人都应该遵循的理论和标准程序,这是我最害怕的。
- 数据可视化有其自身的局限性。在单个图表上只能显示有限数量的要素。使用可视化不太可能同时发现多个特征之间的复杂关系,因此我们依赖复杂的建模技术来找出。
虽然我不是 EDA 的粉丝,但它仍然是商业智能、报告和仪表板等方面非常重要的工具。
课程 5:可重复的研究
个人认为这门课除了介绍 R markdown 之外,没有太大的价值。如题所示,这门课程可能是由学术研究活动激发的。对于行业中的大多数数据科学家来说,从本课程中学到的是,您应该将您的数据分析写在某种类型的报告中,然后其他人可以共享和复制这些报告。为此,R 中最好的方法之一是将您的数据分析、模型构建和思考过程简化为 Rmarkdown,而使用 Python 的对应方法是 Jupyter notebook。
目前,我使用 R notebook(仍然基于 R markdown)的次数比原来的 R markdown 多得多,因为 R notebook 总是被缓存起来以便快速预览。
课程 6:统计推断
这对我来说是最难的课程,在整个专业中,我的分数最低。我想大多数学生都会同意我的观点。老实说,到今天为止,我在统计推断方面仍然不太流利和舒服。在本课程中,您将会遇到一些重要而实用的概念
- P 值。当人们谈论统计显著性时,这是最重要的概念之一。我问几乎所有候选人 P 值的定义,如果他们申请的是数据科学或分析相关的职位。
- **假设检验。**我应该说测试是任何数据驱动型公司中最重要的概念之一。流行的 AB 测试就属于这一类。严格地说,在公司正式推出任何新产品之前,我们应该选择一个客户子集,进行假设检验,收集数据,并确认感兴趣的指标的改善,如转化率、流失、终身价值等。
课程 7:回归模型
线性回归很可能是每个机器学习或数据科学入门课程或书籍谈论的第一个回归模型。尽管线性回归看起来非常简单明了,但其中有相当多的技术细节。本课程致力于广义线性模型,并很好地涵盖了这些技术细节。以下几个概念值得多加关注。
- 回归系数的解释。当涉及到多元线性回归时,这一点尤为重要。自变量的系数是在其他因变量保持不变的情况下,因变量对自变量的敏感度。当一些独立变量以某种方式相关时,即相互依赖时,独立性假设被违反,它们的回归系数可能显示与直觉相反的值,这是所谓多重共线性的结果。
- 型号选择。本课程介绍了传统的模型选择方法,即基于 AIC 或 BIC 的向后、向前和两者。在实践中,我几乎总是使用带有 LASSO 的广义线性模型来执行带有 n 重交叉验证的模型选择。对我来说,它更直观,更容易理解。
- 逻辑回归。在实践中,我发现逻辑回归是我最常用的分类模型之一,尤其是在模型开发的早期阶段。逻辑回归作为一种广义线性模型,训练速度快,解释性强。
课程 8:实用机器学习
如果你对从事机器学习职业很认真的话,这门课是最重要的课程之一。这门课程涵盖了许多实用的技术和细节。我不知道在这门课程中哪个部分更重要,因为我认为每个主题都同等重要,你可能会在以后的机器学习生涯中遇到它们。
本课程介绍 caret 包,这是一个多合一的机器学习包。该软件包适用于数据量较小的问题。然而,caret 的执行速度相当慢,文档也很糟糕。我认为 caret 包有点过时,而且很少维护。实际上,我大部分时间都在使用 H2O R 软件包。我强烈推荐 H2O 套餐。你会惊讶于它的速度和出色的文档。
课程 9:开发数据产品
我认为成功的数据科学职业生涯的一个重要因素是对业务产生影响。你希望商业利益相关者同意你和他们的认同。要做到这一点,最好的方法之一就是做一个数据产品。它可以是一个 API、一个仪表板、一个自动报告或一个网站等。它们都是影响业务的可扩展产品。本课程介绍了一些你可以用 r。
在我的职业生涯中,最大的数据产品是一个闪亮的交互式仪表盘。与任何商业智能工具不同,Shiny dashboard 的优势在于它是完全交互式的,这意味着您可以通过它执行输入和输出任务。因此,我构建的仪表板可以作为用户的门户。我喜欢构建产品,我相信端到端数据科学家应该能够执行从 ETL 到数据产品的数据任务。
课程 10:数据科学顶点
好的,一旦你完成了这一步,这就是本专业的最后一门课程。老实说,顶点课程中的项目本身并不是那么直接,你需要学习和获取本课程之外的信息。由于学生可能有不同的方法来解决这个问题,所以没有唯一的答案,评分标准也相当宽松。
用线性规划解决难题
学习如何在类似数独的数字游戏中使用 Julia 语言制定和解决线性程序
Photo by Austin Neill on Unsplash
线性规划(LP)是一种解决优化问题的强大技术,您将经常看到它被应用于从航班调度、车辆路线到收入管理的问题。在这篇文章中,我想探索一个更异想天开的应用——如何使用线性编程来解决一个难题?
这个谜题类似于数独,所以我将为这个新的脑筋急转弯扩展众所周知的数独 LP 公式。我建议你在继续之前先理解数独解决方案,因为它会有一些类似的逻辑(这里有一个关于它的中型帖子)。
介绍谜题
这个谜题是一个朋友介绍给我的,他推测可以用 LP 解决。这个问题出现在简街拼图上,你可以在这里阅读描述。仅从约束条件来看,它似乎与数独非常相似——对出现次数有约束,但对首次/最后一次出现、值的总和等也有一些其他约束条件。能用 LP 解决吗?答案是肯定的,且看如何。
The first puzzle that I will use for my example
公式化问题
定义变量
在阅读了你的问题并对目标有了深刻的理解后,你应该从定义变量开始。决策会是什么样的?是连续的,整数的,二进制的?它有边界吗?从技术上来说,这是一个约束,但在开始时考虑这一点可能会有所帮助,这样你就不会忘记在以后添加它。
对于这个谜题,决定很简单:给定的单元格中应该放入什么数字?
我的变量名将是 x ,它将是二进制的,它将由三个值索引:
- v 是我们正在考虑的从 1 到 7 的数值
- r 是从 1 到 7 的行索引
- c 是从 1 到 7 的列索引
在数学符号中,这是
由此产生的解将告诉我们哪个数字应该进入哪个单元格。例如,如果解指定 x_{1,1,1}=1,那么这意味着数字 1 进入位置(1,1)的单元格。如果 x_{3,4,7}=0,那么这意味着数字 3 不会进入位置(4,7)的单元格。当我们知道每个数字和单元格组合的所有这些 1 和 0 时,我们就有了解决方案。
这将创建 777 = 343 个二进制变量。对于 LP 问题,二元变量总是比连续值变量更难解决。幸运的是,如今这只是很少的变量,而拥有成千上万个变量的更大的问题可以由如今的解算器来解决。在本地解决这个问题应该没有问题。
定义目标
这个问题很不寻常——没有客观性!将其设置为常数,如 0。我们的目标只是找到一个满足所有约束的解决方案;没有衡量一个解决方案比另一个更好的标准。只要结果可行,我们就已经达到了目标。因此我们不需要目标函数。
定义约束
这就是举重的切入点。让我们一次解决一个。
每个单元格只能包含一个数字,也可以为空。
对于一个给定的单元格,如果 v=1,2,…7 的二进制变量之和等于零,那么我会把它解释为单元格是空白的。我们应该在约束中使用一个不等式来允许这些空单元格,并将阈值上限设置为 1,因为我们不希望每个单元格有多个数字。
**每个值 v(不包括空值)出现的次数必须等于值 v。**这确保了整个网格中 5 的数量是 5,6 的数量是 6,等等。我们知道这个数的值,因为它等于索引 v ,所以这将是约束的右边。
**每行有 4 个数字。**同样,每列有 4 个数字。所以只需对所有列(行)和所有可能的值求和。这必须小于 4,因为必须有 4 个数字。
**每行数字之和应为 20。**此外,每列的总和应为 20。这类似于上面的约束,除了我们需要乘以数字的值, v.
**每个 2x2 子正方形必须包含至少一个空单元格。**因此,不是每个单元格都可以被填充,所以子正方形中应该有 3 个或更少的数字。
Need to check that each subsquare (yellow region) cannot have at most 3 numbers.
**结果应该有一个连通区域。**这也意味着一个数字不应该被空值包围。
The question mark should not contain a value if the surrounding cells are empty.
如果我们观察与给定位置相邻的单元格(想象在一个数字周围画一个方框),就可以实现这一点。如果该区域完全充满了空值,那么该边界的二进制变量之和将为零。在这种情况下,为了满足规则,我们要强制中心数也为空。如果边框中非空值的计数大于零,则允许中间有一个数字。
约束需要根据它们在网格中出现的位置来编写。对于我们可以在单元格周围绘制一个 3x3 框(见下图)的点,将应用以下等式
The equation above applies to these cells.
这个等式被修改以适应网格的剩余区域。例如,对于顶行中的单元格,将针对从 1 到 2 的行修改等式(因为没有 0 行)。
对于第一列和最后一列以及角落中的单元,可以类似地修改等式的其余部分。
行/列的开始应以特定的数字开始/结束。对于第 2 行需要从 3 开始的情况,这意味着第 2 行的第一列可以为空或 3。应用后,如果我们在第 2 行一个接一个地移动,那么一个单元格只能有一个数字,如果它左边的单元格有一个 3。
其余的开始/结束约束遵循类似的公式。
就是这样!这些都是定义问题所需的步骤。干得好,很高兴你还和我在一起。现在,下一步是编写代码。
使用跳转进行线性编程
我在研究生院学习了最优化,在那里 Julia 语言被热情地使用。你需要的软件包是 GLPK 和茱莉亚数学编程(跳转)——这就是本文的标题。这是一个了不起的包裹;编写 LP 问题非常快速、直观,在各种求解器之间切换也很简单。如果你不熟悉 Julia 和 JuMP,那么我强烈建议你去看看。即使不理解语言,代码也应该是可以理解的。我用的是茱莉亚 1.1.1,JuMP 0.19.2,GLPK 0.10.0
using GLPK
using JuMP# Set variable for number of rows/cols/numbers
N = 7function solve_puzzle(start_grid::Array{Int64,2}, edge_constraints::Array{Int64,2})
model = Model(with_optimizer(GLPK.Optimizer, Presolve=0, OutputFlag=0));
# Since we don't care about the objective just set it to something arbitrary
[@objective](http://twitter.com/objective)(model, Min, 0);# Define variables which will be 7x7x7 matrix
# Use integer instead of binary because I was having trouble fixing Binary values in step below
[@variable](http://twitter.com/variable)(model, 0 <= x[1:N, 1:N, 1:N] <= 1, integer=true);# Initialize values
for idx in 1:size(start_grid)[1]
v = start_grid[idx, 1]
r = start_grid[idx, 2]
c = start_grid[idx, 3]
# Fix value to 1
fix(x[v, r, c], 1, force=true)
end# Create the constraints
# At most one value per cell
for c in 1:N
for r in 1:N
[@constraint](http://twitter.com/constraint)(model, sum(x[v, r, c] for v in 1:N) <= 1)
end
end# The number of occurrences of a number should equal the value of that number
for v in 1:N
[@constraint](http://twitter.com/constraint)(model, sum(x[v, r, c] for r in 1:N for c in 1:N) == v)
end# Each row has 4 non-null numbers
for r in 1:N
[@constraint](http://twitter.com/constraint)(model, sum(x[v, r, c] for c in 1:N for v in 1:N) == 4)
end# Each column has 4 non-null numbers
for c in 1:N
[@constraint](http://twitter.com/constraint)(model, sum(x[v, r, c] for r in 1:N for v in 1:N) == 4)
end# Each row numbers sums to 20
for r in 1:N
[@constraint](http://twitter.com/constraint)(model, sum(v*x[v, r, c] for c in 1:N for v in 1:N) == 20)
end
# Each column numbers sums to 20
for c in 1:N
[@constraint](http://twitter.com/constraint)(model, sum(v*x[v, r, c] for r in 1:N for v in 1:N) == 20)
end# Every 2x2 subsquare must contain one or more empty square
for p in 1:(N-1)
for q in 1:(N-1)
[@constraint](http://twitter.com/constraint)(model, sum(x[v, r, c] for r in p:(p+1) for c in q:(q+1) for v in 1:N) <= 3)
end
end# Connected region = no islands
for c in 1:N
for r in 1:N
[@constraint](http://twitter.com/constraint)(model, 2*sum(x[v, r, c] for v in 1:N) <= sum(x[v, i, j] for v in 1:N for i in (r-1):(r+1) if i in 1:7 for j in (c-1):(c+1) if j in 1:7 ))
end
end# Edge constraints
val_set = Set(1:N) # define all possible values
for idx in 1:size(edge_constraints)[1]
v = edge_constraints[idx, 1] # value
k = edge_constraints[idx, 2] # affected row/col
is_col = Bool(edge_constraints[idx, 3]) # row/col
is_last = Bool(edge_constraints[idx, 4])v_prime = setdiff(Set(1:7), v)for j in 1:(N-1)
for not_v in v_prime
if is_col
if is_last
# last in column k must be v or null
fix(x[not_v, 7, k], 0; force=true)
# cell is non-null if the values after cell in column have number
[@constraint](http://twitter.com/constraint)(model, x[not_v, j, k] <= sum(x[v, r, k] for r in (j+1):N ))
else
# first in column k must be v or null
fix(x[not_v, 1, k], 0; force=true)
# cell is non-null if values before cell in column have number
[@constraint](http://twitter.com/constraint)(model, x[not_v, j+1, k] <= sum(x[v, r, k] for r in 1:j) )
end
else
if is_last
# last in row k must be v or null
fix(x[not_v, k, 7], 0; force=true)
# cell is non-null if values after cell in row have number
[@constraint](http://twitter.com/constraint)(model, x[not_v, k, j] <= sum(x[v, k, c] for c in (j+1):N ))
else
# first col in row k must be v or null
fix(x[not_v, k, 1], 0; force=true)
# cell is non-null if values before cell in row have number
[@constraint](http://twitter.com/constraint)(model, x[not_v, k, j+1] <= sum(x[v, k, c] for c in 1:j) )
end
end
end
end
endoptimize!(model)
# want to see the code 1
println(termination_status(model))
primal_status(model)# Create results
results = zeros(N,N)
for i in 1:N
vals = reshape(value.(x[i,:,:]), N, N)
multiplier = ones(N,N)*i
results += multiplier.*vals
end
return results
end
要运行它,只需指定边约束和起始网格值,并调用函数。
# Initialize starting values
# column 1 specifies number, column 2 is the row number, column 3 is the column number
values = [7 1 2;
6 1 3;
6 2 4;
6 2 5;
5 3 1;
6 4 2;
4 4 6;
6 5 7;
4 6 3;
7 6 4;
7 7 5;
7 7 6]
# Encode the first/end row/col constraints (counter-clockwise)
# column 1 specifies the number
# column 2 specifies the affected row/col
# column 3 has values 0 for row and 1 for col
# column 4 has values 0 for start and 1 for end
start_end_constraints = [3 2 0 0;
5 5 0 0;
1 7 0 0;
7 1 1 1;
2 2 1 1;
2 6 0 1;
4 3 0 1;
4 1 0 1;
7 7 1 0;
5 6 1 0];
results = solve_puzzle(values, start_end_constraints)
对于那些想要解决方案的人:
感谢阅读!我会试着关注评论中的问题。
六月版:概率、统计和机器学习
每个人都想进入数据科学和分析领域,因为它既有挑战性、迷人又有回报。你必须熟悉数据科学的核心领域,这取决于概率、统计、机器学习算法、可视化等概念。作为一名数据科学家,这些是您的数据科学之旅中必不可少的一部分,这就是为什么您必须学习它们…
有如此多的博客,如此多的视频,如此多的速成课程;很难知道从哪里开始。为了帮助我们的读者,我们为数据科学有志者以及已经在该学科并希望接触基础知识的人收集了七篇惊人的文章,涉及机器学习的各个角度。我们希望这些文章能进一步引导你朝着正确的方向前进。
swap nil Vijay—Scintel Technologies 的编辑助理/数据科学家
对匆忙人群的统计
由凯西·科济尔科夫 — 8 分钟阅读
曾经希望有人能告诉你统计学的意义是什么,术语用简单的英语表达是什么意思吗?让我试着帮你实现这个愿望吧!我将在 8 分钟内快速浏览统计学中所有最重要的观点!或者只有 1 分钟,如果你坚持使用大字体的话。
数据科学家需要了解的 5 个基本统计概念
由乔治·赛义夫 — 9 分钟读完
当执行数据科学(DS)的艺术时,统计学可以是一个强有力的工具。从高层次的角度来看,统计是使用数学对数据进行技术分析。
概率概念解释:最大似然估计
乔尼·布鲁克斯-巴特利特(Jonny Brooks-Bartlett)—8 分钟阅读
在这篇文章中,我将解释什么是参数估计的最大似然法,并通过一个简单的例子来演示这种方法。有些内容需要基本概率概念的知识,如联合概率的定义和事件的独立性。
用 Python 中的贝叶斯模型估计概率
由威尔·科尔森 — 12 分钟阅读
在本文中,我们将探讨在贝叶斯框架中从数据中估计概率的问题,同时学习概率分布、贝叶斯推理和使用 PyMC3 的基本概率编程。
统计学和机器学习的实际区别
马修·斯图尔特博士研究员——15 分钟阅读
不,它们不一样。如果机器学习只是美化了的统计学,那么建筑学只是美化了的沙堡建造。
机器学习算法通俗地说就是 ( 第一部分,第二部分)
由奥黛丽·洛伯菲尔德 — 14 分钟读完
作为熨斗学院数据科学训练营的一名应届毕业生,我收到了大量关于如何在技术面试中胜出的建议。一项不断涌现的软技能是向非技术人员解释复杂的机器学习算法的能力。
统计学是数据科学的语法 ( 第一部分、第二部分、第三部分)
通过 Semi Koen — 4 分钟读取。
统计复习,开启您的数据科学之旅
我们也感谢最近加入我们的所有伟大的新作家,姚洋,马特·赫戈特,本·曼,克莱尔·吉诺,佩里·约翰逊,尼古拉·奥斯卡尔科夫,维克拉姆·德瓦塔,豪尔赫·卡斯特尼翁博士,亚当·迪克,乔治 布兰登林、拉什米马尔加尼、扬恩弗恩滕、舒巴姆提瓦里、约翰·默里、萨利姆切拉尔、马丁米尔莫尔、贾科莫维亚内洛等众多。 我们邀请你看看他们的简介,看看他们的工作。
初级数据科学—选择您的第一份工作
当您选择第一份数据科学工作时,有几个陷阱可以很容易避免
虽然有许多人想成为数据科学家并在寻找他们的第一个职位,但初级数据科学职位很少。数据科学职位的范围从非常面向研究的公司职位(也在科学会议上发表论文,这种情况非常罕见)到更需要动手并涉及大量编码的职位。(初级)数据科学家也来自不同的背景:刚毕业的人(不同领域的 bsc、msc 和 PhD),有经验的开发人员,他们想学习新的技能,接受再培训等等。
虽然初级数据科学职位很少,但做出准确选择并避免常见陷阱很重要。该帖子是由 Ori Cohen 针对招聘方的帖子“T2 数据科学招聘-为什么你可能做错了”引发的。这篇文章是给正在寻找第一份工作的数据科学家的。这里有一些见解。
不要做公司里的第一个数据科学家
这听起来像是一个非常性感的职位——你刚从大学毕业,你的技能能够给一家小公司留下深刻印象。他们让你成为公司里的第一个数据科学家,嘣!您将能够以正确的方式塑造方法、流程和工具,就像您一直想象的那样!
״In 的理论、理论和实践都是一样的。实际上,他们是 not״ ( 本杰明·布鲁斯特)。
许多实际任务不像教科书或吴恩达的课程那样。您很可能需要一位经验丰富的数据科学家的指导和建议,她已经犯了错误,熟悉数据和产品的限制条件,而且经验丰富。你想学习的技能会随着时间的推移而变化,但总有人在你身边,你可以从中学习,这总是一个好主意。
另一个问题是,小公司通常只有很少的数据,通常不足以训练模型,数据质量也可能是一个问题。这将需要对产品进行变更,并对其进行定义和实施。作为一名初级数据科学家,要完成这种变化所需的技术和政治工作可能很复杂。
您如何知道您正在面试第一个数据科学职位:
- 您将被如此明确地告知——“您将成为我们的第一位数据科学家”
- 你的面试官都不是数据科学家,他们问的问题没有反映出对这个话题的深刻理解。
人们不会辞职——他们会辞掉老板
在辞职之前——人们为老板工作。
面试是双方面的。公司面试你,你也面试公司。产品让你兴奋吗?你认为这家公司有适合你的价值观和文化吗?你愿意为这位经理工作吗?
你很可能会与你的经理和队友密切合作。他们打动你了吗?你会重视他们的反馈吗?
为了学习和提高,需要大量的反馈和沟通,尤其是在初级职位的时候。有规律的 1:1 吗?有登机计划吗?他们是否参加会议\是否有教育预算?这家公司有你想要的工作生活平衡吗?
在面试中,面试官可能想取悦你,所以如果你直接问这些问题,他们可能会回答你希望听到的问题。与队友和公司的其他同事交谈可以让你对团队和公司有更多的了解。
工具和技术
如果你主要关注研究,你可能会发现这一点是次要的。然而,对于你的下一个职位,可能需要实践经验。一定要选择一个使用合理技术的地方,而不是一个利基,深奥的技术。例如使用汇编进行机器学习,在大型机环境下工作等。
数据科学家目前合理的技术栈包括:python(也许是 scala,也许是 R 取决于你的风险厌恶程度)和科学 python 包(pandas、numpy、scipy 等),云环境,某种数据库(postgres \ MySQL \ elastic search \ MongoDB)。
最后但同样重要的是——选择一些你热爱的事情,这样你会很高兴早上去上班,晚上梦见你的代码:)
Jupyter 是新的 Excel
为什么交易者和金融专业人士需要学习 Python
如果你是一名交易员或者在金融服务行业工作,Excel 就是你的面包和黄油。你可以分析价格和其他分笔成交点数据,评估你的交易组合,计算风险值,进行回溯测试,等等。你是数据透视表、公式、图表甚至 VBA 和 PowerQuery 的专家。你可以快速处理一个解决方案,但是在你意识到之前,你的电子表格会扩展成几十个标签、几千行和意大利面条 VBA——所以它的可读性和可维护性已经荡然无存。当你敢按 F9 键刷新结果时,你可以拿一杯茶,然后再等一会儿(如果你的电脑在这期间没有崩溃的话)!
👉🏻 听起来熟悉吗? 你大概正在狂热地点头。
尽管电子表格很有用,但它不能提供你所寻求的所有答案。让我们看看是什么让 Excel 如此受欢迎,它在哪些地方出了问题,但最重要的是,为什么𝕐𝕆𝕌应该开始使用 Jupyter 笔记本作为一种替代的强大的分析工具。
超越天堂
一些因素使得 Excel 如此有价值,最值得注意的是它简单而强大的反应式计算模型和内置函数。电子表格就像一块空白画布,“业余程序员”可以在上面使用 Excel 的专有语言(如公式和 VBA)编写代码。
银行部署了广泛的 IT 系统来运行业务关键流程,但是电子表格形式的影子 IT 出现了爆炸式增长,它们补充了这些核心系统,并作为新业务计划的默认工具。由于企业系统不像动态财务环境中所要求的那样灵活以适应快速上市,Excel 的出现填补了这一空白!虽然这种方法很方便,但它是正确的吗?
Excel 在企业中的角色需要重新定义!
Excel 地狱
试图使用电子表格对大量数据进行高级、快速的分析,是使用了错误的工具。
以下是 Excel 高级用户面临的一些问题:
- 级联错误 : Excel 臭名昭著的错误是沿着一列向下传播,然后穿过整个电子表格,形成一个雪球,变成雪崩式的麻烦。可怕的是,有些人看不见,直到为时已晚。已经有几个案例被公之于众,在这些案例中,事情出了差错,产生了巨大的成本影响。
- 可伸缩性 : Excel 对它可以容纳的行数和列数有一个限制,但是随着数据集以指数速度增长,电子表格很快就会耗尽内存或占用大部分 CPU。当这种情况发生时,数据损坏的风险就会大大增加。
- 性能:在复杂的工作簿中,改变一个数字会影响数百次重复计算,Excel 需要时间来解决每个问题。当达到一定大小时,它不仅会降低电子表格本身的速度,还会影响任何其他需要内存空间的应用程序的性能。
- 测试:测试一个电子表格的正确性,然后证明后续的修改没有破坏其他任何东西,这几乎是不可能的。
- 可追溯性/调试:通常一个很小的变化都会严重破坏您复杂的公式,使其极难识别和修复。
- 全包:数据和计算都包含在 Excel 文件中,从本地计算机运行。这意味着协作受到约束,使版本控制成为一场噩梦。此外,数据是基于最新刷新的静态数据,而不是随着条件的变化而实时更新。
所有这些问题在几十年前就已经被传统软件解决了。
最后但同样重要的是:
- 运营风险:所有电子表格都是从小型/快速修复计算开始,但有些会转变为永久性的企业级解决方案。它们为许多业务流程提供支持,但由于缺乏对整个环境谱系的了解,许多财务、运营和监管流程的完整性受到了威胁。这是我目前工作的热门话题。如果你想了解更多关于终端用户计算(EUC)风险的信息,这是一篇非常好的文章。
Courtesy: Pixabay
各位编码员好;再见交易者
传统上,银行将量化交易团队分为量化交易员和量化开发人员。前者想出交易的点子,后者把这些点子转化成可执行的代码。当作为一名交易员,你也是一名熟练的编码员,这种分离就不再需要了,这给了你一个竞争优势:不仅银行希望优化他们的成本,因此你可以在冗余中生存,而且你可以将你自己的交易模型付诸行动,利用这个时间优势为你谋利。能够自动化平凡的任务是如此的解放,事实上编码是如此的有创造性!
这也很大程度上是一代人的事情,因为越来越多的初级交易员已经具备了 uni 的编程技能,所以如果你想保持你的就业能力,你需要参与进来。
如何使用 Python 和 Jupyter 笔记本
*——看我做了什么?*😄
那么,对于那些发现 Excel 有局限性(如果不是过时的话)的交易员和金融专业人士,解决方案是什么呢?
学习 Python,使用 Jupyter 笔记本作为容器!
计算机编程语言
Python 相当容易学习,并且非常通用,因此在金融界越来越受欢迎。现在,除了 Excel,它还是许多定量角色的先决条件。它没有 C++(或 Java)那么复杂,这意味着:❶的学习曲线没有那么陡峭,❷完成一项任务所需的代码量也少了 1/5 或 1/10。
Python 越来越受欢迎,这从大量的库中可见一斑,这些库支持交易者需要的几乎所有东西:
◽读取、写入、清理、按摩、切片/切块数据
◽数学、统计和时间序列
◽金融分析:交易和量化金融、市场数据分析、股票/衍生品市场分析、彭博社数据访问、执行引擎、回溯测试、风险分析等
◽机器学习管道(例如预测市场价格)
◽绘图和漂亮/交互式可视化
◽ SQL 支持
◽发送电子邮件
◽网络抓取(例如在线获取市场价格)【T19
❗️ 在这里 (非附属)找到一个简明扼要的库 。
朱皮特
同样,Jupyter Notebook 是一个基于网络的计算环境,使您能够创作文档,包括:实时代码、图表、小部件、丰富的叙述性文本(包括链接、等式等)、图片等。更具体地说,您可以:
- 在浏览器中编辑代码,自动语法高亮、缩进和制表符补全/自检。
- 从浏览器运行代码,计算结果附在生成它们的代码上。
它们提供了一个全包、自包含的计算记录,因此它们可以代替 Excel 用作实时数据分析平台。
Courtesy: Python for Finance Tutorial
最佳地点
所以你可能会想:
👉🏻我还会使用 Excel 吗? 当然……
在以下用例中,电子表格仍然是您的最佳选择:
◽️的正确性和准确性并不重要
◽的数据不太大(即不需要可伸缩性)
◽不需要实时更新
◽使用 Excel 作为暂存板来快速组装原型
◽不需要长期维护。
你需要的是一些允许快速开发,验证正确性和可扩展性,同时保持与 Excel 相同的反应模型。而这正是 Jupyter 笔记本所提供的!
不,Excel 没有过时,但是 Jupyter 笔记本是更好的数据分析工具!
尽管我已经明确提到了使用 Python/Jupyter 组合优于 Excel 的一些实质性优势,或者在“Excel 地狱”一节中暗示了它们作为反例,但我还是在这里收集了它们的前 10 个(你看,我确实喜欢列表!):
✔️ 强大的数据操作——它毕竟是数据科学家的工具箱! ✔️ 高级可视化功能 — 不再有无聊的图表! ✔️ 更好的用户体验
✔️ 大数据集处理 — 不再死机! ✔️ 性能管理 — 利用多处理 ✔️ 测试驱动开发 — 思考质量! ✔️ 开源可访问性——“有它的 lib!” ✔️ 误差溯源
✔️ 更容易自动化
✔️ 自记录——不要低估这个的价值!
从哪里开始
我意识到进入这个领域可能会令人生畏,但是编程不是学习语言的语法,而是使用正确的语言和工具来解决问题:在我们的例子中,是 Python 和 Jupyter。
这里有两个很好的资源可以帮助你开始(非附属):
关键的一点是:
保持相关性!
最后的想法
很难想象没有电子表格的公司世界!
银行开始发现 Python 可以替代 Excel 来处理关键工作负载。巴克莱银行最近因努力教他们的交易员编码而成为头条新闻。我认为你也应该遵循这个范例,你不会失望的!
让 Excel 做 Excel 擅长的事情,把分析和自动化搬到 Python 和 Jupyter 笔记本里。
有一个动态和交互式分析的快乐世界在等着你!
感谢阅读!
我经常在媒体上写关于技术的&数据——如果你想阅读我未来的帖子,请‘关注’我 !
Jupyter 是新的 Excel(但不是为你的老板)
最近你可能已经看过 Semi Koen 写的一篇非常有见地的文章,名为 Jupyter 是新的 Excel 。她描述了许多专业人士在面临大量数据分析任务时会立即使用 Excel,但她认为,对于许多“大数据”挑战,使用 Jupyter 笔记本电脑更有意义。
如果你是一名精通 Jupyter 兼容语言的数据科学家,那么你会明白她的意思——你不会想到从 Excel 开始处理大型数据集。
但是你的老板呢?他仍然喜欢 Excel,如果你让他看你的 Jupyter 笔记本,而不是给他看 Excel 电子表格中的简单表格或图表,他会不高兴的。(好吧,你的顶头上司可能也是数据科学家,但产品经理或公司董事长呢?)西装革履的人喜欢把鼠标拖到一列数字上,看看它们在 Excel 的状态栏上加起来是多少。
这篇文章是关于与那些对代码不太熟悉的人分享你的 Jupyter 笔记本的结果。我们将探索可用的解决方案(包括我自己解决问题的尝试)并讨论仍然存在的挑战。
Photo by Campaign Creators on Unsplash
从哪里开始?
让我们说你的辛勤工作分析数据结果在表格中,如熊猫数据帧和图表选择。你和别人分享这些的选择是什么?
根据您的目标受众,有两条明显的主要途径可供您选择:
- 导出(例如,您可以通过电子邮件发送的单独的 PDF 或 Excel 电子表格)
- 托管(一些易于阅读的笔记本版本,可能已经消毒,但仍具有交互性)
许多选择立即归结于一个简单但令人沮丧的问题:隐藏代码单元的困难。您的管理团队肯定不想看到您用来生成与他们共享的表格和图表的 Python 代码。
隐藏您的代码
这被证明是非常困难的,而且似乎没有任何适用于所有场景的标准方法。
Jupyter 有一个扩展隐藏所有输入,它允许你在 Jupyter 中在可见和隐藏之间切换代码单元,但这不会影响到大多数导出/静态共享解决方案。
一个 StackOverflow 帖子包含了一个建议粘贴在你的笔记本顶部的代码片段,它可以进入 nbviewer(稍后讨论的“静态托管”共享解决方案之一)并导出 HTML,但没有很多导出选项…
当我们讨论共享笔记本的每种可能方式时,我们将回头讨论这个问题。
导出解决方案
首先,让我们看看从任何看起来像托管的 Jupyter 笔记本的东西中取出的最佳方法,并以一个我们可以附加到电子邮件的简单文件结束。
下载为
在你的 Jupyter 笔记本中,查看文件菜单,打开“下载为”查看一些可能的文件格式。
“HTML”选项是在独立文件中准确表示原始笔记本的最佳方式。这也可以通过上面提到的“StackOverflow”代码片段保持代码单元格的隐藏,但不会尊重大多数小部件。在任何情况下,HTML 都不是您的管理层习惯于通过电子邮件接收的格式,甚至可能被安全软件阻止。
PDF 听起来更像。但是这很难直接获得(你需要先安装某种形式的 LaTeX 软件,这可能很麻烦),而且它不会隐藏你的代码单元。事实上,生成 PDF 的最佳方式可能就是使用浏览器自带的打印功能,要求它输出一个 PDF,显示当前在浏览器中显示的笔记本。这将打包你当时在浏览器中看到的所有内容(所以如果代码单元格通过隐藏所有输入被隐藏,那么这也将反映在 PDF 中)。
心爱的 Excel 电子表格
大多数其他可用的格式是相当技术性的,并不真正适合我们在这里试图实现的。这让我开始了 nb2xls 项目——一个易于安装的额外导出选项,允许你根据笔记本的输出单元格(标准情况下不包括输入代码单元格)获得 Excel 电子表格文件。
最棒的是,表格仍然是电子表格中的表格——您的经理可以将鼠标拖到数字上,查看总数和平均值!图表等图形输出也会出现。我们不需要担心页面大小,因为如果笔记本是长或宽,我们有足够的行和列来填充。
nb2xls screenshot
要安装,只需运行pip install nb2xls
,这将在文件菜单中添加一个额外的“下载为”选项:“Excel 电子表格(。xlsx)'。
在编写的时候,这是一个实验性的包——代码仍然需要一些工作来为复杂的表或 markdown 产生最好的结果。请用您自己的笔记本尝试一下,如果有任何需要改进的地方,请联系(请尽可能发送 ipynb 文件示例)。
更多细节和例子在 GitHub 这里。
在命令行上转换
所有这些“下载为”选项实际上只是命令行实用程序nbconvert
的包装器,用默认选项调用转换过程。如果您确实需要指定任何转换选项,了解等效命令行可能会有所帮助。
例如, Hide Input All 扩展文档建议使用以下命令来获取一个移除了输入代码单元格的导出 HTML 文件:
jupyter nbconvert --template=nbextensions --to=html my_notebook.ipynb
自己存文件!
“下载为”选项为将笔记本的框架导出到单独的文件提供了一些有用的基础结构。但是值得记住的是,您已经处于自己熟悉的编码环境中,所以直接从代码单元生成一些文件可能是有意义的。
例如,如果你有一个大型熊猫数据帧,最好的办法是将其保存为 CSV 格式,这样你的收件人就可以完整地加载它。类似这样的:df.to_csv('./data.csv')
。在实践中,您可能想先将它导入 Excel,这样您就可以设置列的格式并给标题加下划线等。
当你无法逃离朱庇特时
虽然上面的导出选项几乎可以让你以独立的文件格式获得笔记本的关键内容,但有时(尤其是当小部件在你的笔记本中占很大比重时)你需要找到一种方法来坚持使用你现有的 Jupyter 格式。
但是您需要找到一种方法来与您的非开发人员共享它,以便它:
- 对他们有意义
- 很容易接近
- 是安全的,因此敏感数据不会在您的组织之外被看到
- 是安全的,因此非开发人员不能破坏任何东西或破坏任何数据
本文的其余部分揭示了一些可能的方法。
Jupyter 自己的项目
Jupyter 项目组织有一些辅助项目,如果您需要经常共享笔记本电脑,值得投资一些基础设施,可以考虑这些项目。
两个枢纽
JupyterHub 是一种在共享资源上集中创建 Jupyter 工作空间的方式,因此至少其他用户不需要运行他们自己的 Jupyter 服务器。除非您有一个可以在内部网络上运行 JupyterHub 的小型组织,否则您将需要考虑如何为适当的用户添加身份验证。这里有一些关于如何在不同用户的工作区内共享笔记本的建议。
Logo on the JupyterHub homepage
BinderHub 通过允许用户启动基于特定计算环境(Python 包等)的 Jupyter 工作空间,真正扩展了 JupyterHub,该工作空间是在 git 存储库中定义的,并带有与项目相关的数据文件和笔记本。用户可以通过直接访问单个 URL 来启动工作区。这为你的作品提供了一个更加正式和易于访问的展示平台。要查看名为mybinder.org的 BinderHub 公共实例的示例,请查看 GitHub 上 my nb2xls repo 的自述文件页面上的“启动活页夹”链接。
实际上,这两个项目都不适合我们开箱即用的任务——管理团队不希望必须通过笔记本输入他们的方式!将工作存储在 git repo 或 workspace 中,以便对非开发人员有意义,这是很大的管理开销。
nbviewer
nbviewer 是一个更合适的轻量级服务,可以通过一个 URL 轻松托管笔记本电脑。可以把它想象成上面讨论的 HTML 导出选项的托管网页版本:Javascript 可以工作,但它背后没有活动的内核,所以用户只能在最后一次运行笔记本时看到您的工作结果。
和 Binder 一样,nbviewer 也有一个免费托管版本供您试用。通常,你在 GitHub 上提供一个笔记本的 URL,但是它也可以使用 Dropbox 链接。例如,在 Dropbox 中的 ipynb 文件上“复制 Dropbox 链接”,然后将 URL 粘贴到https://nbviewer.jupyter.org/上的框中。您可以与同事共享生成的查看器页面的 URL,但当然要注意这是不安全的。
nbviewer.jupyter.org homepage
分享一个 URL 比通过电子邮件向你的管理团队发送一个 HTML 文件更自然,但实际上你不会从 nbviewer 中获得太多 HTML 导出无法获得的东西。
因此,到目前为止,Jupyter 项目的主要倡议似乎都没有对我们有多大帮助…
在那里!
Project Jupyter 最近的一项发展可能正是我们正在寻找的东西:瞧,允许你托管一个带有活动内核的笔记本,而不需要任何 shift-enter。默认情况下,代码单元格是隐藏的。默认情况下,来自前端的执行请求是不允许的,所以用户不能破坏任何东西,即使他们尝试!
Jupyter 的博客帖子宣布 voilà 在描述他们试图解决的问题方面做得很好(这正是我们正在讨论的问题!)并解释了一些特性。
voilà logo
在我们讨论的情况下,这可能成为分享您笔记本的一种奇妙方式,但它仍需要大量工作。在撰写本文时,您只能共享一个指向笔记本应用程序的单用户链接,如果多个用户的独立操作扰乱了您的笔记本中的数据流,他们可能会发生冲突。
已经有计划将 voilà与 JupyterHub(如上所述)集成,这将允许多用户访问您的 voilà托管的笔记本电脑。当然,您仍然需要确保每当您的同事选择查看您的笔记本电脑时,voilà服务器都在运行,因此这不是您通常会在本地计算机上运行的内容。
看得更远
Kyso 是一项第三方服务,允许你“记录你的数据科学”。他们的主页上列出了公共笔记本(以及文章、链接、数据集和图表),这应该会让你对如何在付费计划上共享笔记本有所了解,你可以将协作限制在你的团队内。默认情况下,代码输入单元格是隐藏的!
应该有可能包含实时的 Jupyter 窗口小部件,尽管现在我遇到了一些问题,因为 JupyterLab 还不完全稳定,而且许多 Jupyter 窗口小部件还不适合 JupyterLab。Kyso 目前似乎固定在 JupyterLab 0.35。
如果您认为像这样的第三方服务可能适合您,请联系他们的销售团队了解更多关于功能的详细信息。
Kyso homepage showing some public notebooks
另一项服务, Saturn Cloud 是一个完整的数据科学云托管环境,作为 Google Cloud 或 AWS 等的替代方案,内置了“发布”功能。虽然你的同事可以很容易地发布你的笔记本,但完全保密的发布似乎是不可能的。
我肯定还有其他人。如果您使用了第三方服务来解决这个问题,请在评论中告诉我们。
结论
事实证明,与非开发人员分享我们的 Jupyter 笔记本实验结果比我们希望的要困难得多!我们想要的功能是确保代码是隐藏的,结果是易于访问的,显示是交互式的,我们的数据是安全可靠的。
虽然现在有一些导出功能可用(HTML、pdf、Excel 电子表格),但在共享复杂数据的情况下,这些都存在挑战或限制。看看更实际的托管选项,我们要么需要实施我们自己的基础架构(例如运行我们自己的 nbviewer 或 voilà实例),要么将我们的数据科学工作流改造成新的第三方云托管服务。
因此,最佳解决方案将在很大程度上取决于您共享的数据,以及您需要提交类似报告的频率。值得注意的是,在你的整个组织中,各种演示都有一定的模式。对于大数据分析的临时共享,您可能仍然需要从仔细导出的 CSV 组装您自己的电子表格;但是如果这种情况经常发生,可能是时候投资一些可重用的基础设施来解决这个问题了。
朱庇特实验室:朱庇特笔记本的进化
JupyterLab 概述,Jupyter 笔记本的下一代。
为了给更好的东西让路,所有美好的事情都会结束。
数据显示,Github 上有超过 300 万台 Jupyter 笔记本可供公众使用。私立学校的数量也大致相同。即使没有这些数据,我们也很清楚笔记本电脑在数据科学领域的受欢迎程度。编写代码、检查结果、获得丰富输出的可能性是 Jupyter 笔记本非常受欢迎的一些特性。但是俗话说,天下没有不散的宴席,我们最喜欢的笔记本也是如此。 JupyterLab 最终将取代经典的 Jupyter 笔记本 但为好。
朱庇特实验室
不久前,我发表了一篇关于有效使用经典 Jupyter 笔记本的指南。但是正如我们将看到的, JupyterLab 是 Jupyter 项目的下一代用户界面,提供经典 Jupyter 笔记本的所有熟悉的构建模块(笔记本、终端、文本编辑器、文件浏览器、丰富输出等)。)中一个灵活而更强大的用户界面 。Jupyter 实验室的基本想法是将经典笔记本中的所有构建模块,加上一些新的东西,放在一个屋檐下。
目录
如果您对 Jupyter Lab 完全不熟悉,您可以从安装开始阅读这篇文章。但是如果您已经使用过它们,并且想要一个高级的概述,跳过前四个部分,直接跳到第 5 部分,确保您使用的是最新版本。
1.装置
JupyterLab 可以使用conda, pip
或 pipenv.
安装
**#conda**
conda install -c conda-forge jupyterlab**#pip** pip install jupyterlab**#pipenv**pipenv install jupyterlab
pipenv shell
查看官方安装文档了解更多详情。
启动 JupyterLab
您只需在控制台键入以下命令即可启动 Jupyter:
jupyter lab
JupyterLab 将在浏览器中自动打开,其界面类似于下图。这意味着一切就绪,你可以开始了。
因为我在 Jupyter 实验室同时使用了Python
和R
,所以我的工作表中有它们的图标。
2.连接
在使用它的各种功能之前,让我们先了解一下这个接口。
- 菜单栏
菜单栏有顶级菜单,显示 Jupyter Lab 中可用的各种操作。
- 左侧栏
这包括常用的选项卡。通过在查看菜单中选择Show Left Sidebar
或点击当前侧边栏标签,可以折叠或展开左侧侧边栏。
您可以从 Running
面板查看正在运行的会话,而Commands
面板允许您搜索所有可用的命令。
- 主要工作区域
这是实际活动发生的地方。它包括笔记本、文档、控制台、终端等。只需双击或拖动文件到此区域即可开始工作。工作区可以使用命名的工作区 URL 保存在服务器上。
此外,您可以通过将 JupyterLab 的 url 中的lab
更改为tree
来在经典的笔记本视图和 JupyterLab 视图之间切换。
3.创建和保存文件
在本节中,我们将快速了解如何在 Jupyter Lab 中处理文件。
创建文件
只需点击主菜单中的+
图标。这将在主工作区打开一个新的启动器选项卡,使我们能够创建笔记本、控制台、终端或文本编辑器。使用File
选项卡也可以实现相同的操作。一旦打开,文件可以被重命名,甚至下载。
打开现有文件
打开文件是一个非常简单的过程。双击它们或通过上方的 File
选项卡访问它们。
这些只是 Jupyter 实验室的基础,基本上是开始。现在让我们继续讨论它的真正功能,以及它优于传统笔记本的原因。
4.灵活的布局
经典的 Jupyter 笔记本也支持内置的文本编辑器和终端,但这些选项很少使用,因为它们大多隐藏在视线之外。另一个原因是,所有这些组件都是作为独立功能工作的,而不是集成的。
Different blocks in a classic Network which worked independently
Jupyter 实验室倾向于通过将所有功能集成到一个单一的交互和协作环境中来填补这一难题。
- 笔记本
JupyterLab 中使用的笔记本文档格式与经典 Jupyter 笔记本中的相同。现有的笔记本应该可以在 JupyterLab 中正确打开,我们可以在那里进行常规分析。
- 控制台
有些控制台是为习惯 QT 控制台类型环境的人准备的。这些控制台使我们能够在内核中交互式地运行代码。
- 文本编辑器
文本编辑器使编辑文件成为可能。文本编辑器包括语法高亮、可配置缩进(制表符或空格)、键映射和基本主题化。这些设置可以在设置菜单中找到。
- 端子
JupyterLab 终端提供对系统 shell(bash、tsch 等)的全面支持。)和 Windows 上的 PowerShell。我们可以用终端在我们的系统外壳中运行任何东西,包括像 vim 或 emacs 这样的程序。
现在,有人会说,所有这些功能在经典笔记本中都存在,那么是什么让 Jupyter Lab 与众不同呢?事实上,它给了我们一个非常灵活的布局系统,让我们可以选择这些标签,并排拖动它们,并以几乎无限的灵活性调整它们的大小,这是以前所没有的。
5.增强的笔记本功能
Jupyter lab 不是笔记本格式的重新实现,而是存在于所有现有架构之上的新前端。然而,这种新的前端实现使我们有可能纳入传统笔记本电脑中遗漏的功能。一些功能包括:
展开和折叠单元格
在笔记本中拖放单元格
编辑器中的制表符自动完成
文本编辑器现在具有代码自动完成特性。然而,到目前为止,只有当文本编辑器有一个附加的控制台时,它才被启用。
主题
整个 JupyterLab 和文本编辑器都有可用的主题。
6.支持的文件格式
Jupyter Lab 还支持其他格式,如:
- 图片:jpeg,png 等和 gif
- 杰奥森
- Vegalite 文件,geojson 文件,
- PDF 文档
- 高性能 CSV 查看器
Jupyter 实验室基本上可以渲染任意大的 CSV,而这些 CSV 在 Excel 中通常被渲染为无响应。它的交互性还不是很强,但预计很快会有一些改进。
7.交互式计算
Jupyter 的真正能力在于它支持交互式计算,这在数据科学中尤其有用。
为输出创建新视图
我将使用 Jupyter Github 官方页面上的洛伦兹微分方程笔记本。在运行了几个细胞后,我们得到了交互式洛伦兹吸引子作为输出。有时当我们有一个交互式输出时,不得不上下滚动到生成它的代码,这有点令人沮丧。作为这个问题的解决方案,Jupyter 实验室给了我们一个选项,将输出分成一个新的选项卡,我们有一种伪仪表板,在那里我们可以使用滑块并更改参数。
同一文件上的新视图
有时我们的笔记本太长,所以我们可以在一个实例中有相同(或不同)笔记本的两个视图。当我们想同时查看笔记本的顶部和底部时,这可能会很有用。
在笔记本之间拖放和编辑单元格
我们知道细胞可以在笔记本中拖动。然而,单元格也可以在不同的笔记本上拖动。此外,一个笔记本中的更改也会反映到另一个笔记本中。
简化代码文档过程
正确的说法是代码被读的次数比它被写的次数多。文档是编程的一个非常重要的方面,Jupyter Lab 会让它变得更容易。在 markdown 文件中编写文档时,我真正面临的一个问题是,我必须在不同的控制台中运行代码,以检查它是否运行正常,然后将它包含在文件中。一次又一次地切换标签是很烦人的。
Jupyter Labs 允许您将编辑器和控制台合并到一个视图中。因此,您可以检查代码和文档,同时预览整个文件。
8.扩展ˌ扩张
JupyterLab 被设计成一个本质上可扩展的环境。扩展是真正强大的工具,可以真正提高一个人的生产力。JupyterLab 扩展是 npm 包(Javascript 开发中的标准包格式)。GitHub 上有许多社区开发的扩展。你可以搜索 GitHub 主题 jupyterlab-extension 来查找扩展。
为了安装 JupyterLab 扩展,您需要安装 Node.js ,可以从他们的网站安装,或者如下所示。
conda install -c conda-forge nodejs
or
brew install node
安装扩展
可以使用以下命令安装新的扩展:
jupyter labextension install <my-extension>
其中,my-extension
是 npm 上有效的 JupyterLab 扩展 npm 包的名称。使用my-extension@version
语法安装特定版本的扩展,例如:
jupyter labextension install my-extension**@1**.2.3
更多详情,请参考关于扩展的官方文件。让我们来讨论几个我经常使用并且非常强大的扩展:
这个扩展在 JupyterLab 的左侧面板添加了一个 Google Drive 文件浏览器。当你登录到你的谷歌账户时,JupyterLab 就可以使用其中存储的文件。
安装
jupyter labextension install @jupyterlab/google-drive
除了安装扩展之外,您还必须向 Google 认证您的 JupyterLab 部署。通过设置文件或此处链接了解流程。您将获得一个客户端 ID,您必须手动输入。
用法
现在,如果有人分享一个笔记本或一个 markdown 文件,它会反映在 Jupyter 实验室的shared with me
文件夹中。我们可以在那里打开并编辑它。
这是一个用于访问 GitHub 库的 JupyterLab 扩展。这个扩展允许我们选择 GitHub 组织和用户,浏览他们的存储库,并打开这些存储库中的文件。如果这些文件是笔记本,我们可以像运行任何其他笔记本一样运行它们。
安装
jupyter labextension install @jupyterlab/github
安装后,我们需要从 GitHub 获取凭证。更多详情请阅读此处的说明。
用法
jupyterlab-git 是一个 jupyterlab 扩展,使用 git 进行版本控制。
安装
要安装,请执行以下步骤:
jupyter labextension install @jupyterlab/git
pip install jupyterlab-git
jupyter serverextension enable --py jupyterlab_git
用途
Drawio 插件是一个 Jupyterlab 扩展,用于将 drawio 独立集成到 JupyterLab 中。画。 io 是一款免费的在线图表软件,用于制作流程图、过程图、组织图、UML、ER 和网络图。
安装
jupyter labextension install jupyterlab-drawio
用法
这些扩展确实让 JupyterLab 脱颖而出。在一个工作场所拥有所有的工具非常有用,因为人们不必在不同的环境之间切换来完成工作。除了上面的扩展之外,还有很多其他的扩展,你也可以随意尝试。
结论
JupyterLab 是真正的下一代基于网络的用户界面。它装载了交互式计算工具和设计良好的界面,允许用户以新颖的方式组合它们。它非常强大,提供了各种强大的工具,使数据分析过程更加顺畅,效率也更高。
Jupyter 笔记本自动完成
数据科学家的最佳生产力工具,如果您还没有使用它,您应该使用它…
大多数程序员都非常熟悉不同的自动完成工具。然而,我注意到许多数据科学家不使用它,至少在他们的职业生涯或教育中不够早。如果你是他们中的一员,是时候开始使用这个生产力工具了
什么是自动完成?
它是由您的编程环境提供的功能,用于完成您正在编写的代码。对于大多数程序员来说,这是一件幸事,如果你现在开始使用它,你也一样。这些只是使用自动完成的几个优点:
- 节省时间 g .你再也不用输入这么长的变量了!
- 更少的虫子。那么你的代码因为变量输入错误而没有运行了多少次。然后当你改正它的时候,你发现同样的错别字在另一行。在调试代码时,只需要 30 分钟就能发现所有的小错别字。不再是了,欢迎自动完成。
- 快速查找对象方法和属性。您可以使用 autocomplete 来查看对象的方法和属性,而无需查看文档。
Jupyter 笔记本自动补全
如何使用 Jupyter 笔记本自动完成功能?好消息是:你不需要安装任何东西,因为它带有标准的 jupyter 笔记本设置。
要开始使用自动完成功能,你必须开始输入你的变量名,然后按下键盘上的 tab 键。当您这样做时,带有完整的建议变量名的框将会出现,就像下面的截图一样:
在上面的例子中,我输入了‘my _ va’并点击了 tab 键。自动完成功能建议有两个变量名以‘my _ va’开头,我可以使用 my_variable_1 和 *my variable_2。*如果我输入的前缀只有一个变量,而不是显示下拉选项,自动完成功能会为我输入完整的变量名。
类的自动完成
如果您想创建一个新对象,也可以使用自动完成功能。以下示例显示了“pd”的自动完成功能。Dat ':
使用 Jupyter 笔记本编辑器时,了解提高工作效率的最重要的快捷方式。
medium.com](https://medium.com/towards-artificial-intelligence/jupyter-notebook-keyboard-shortcuts-for-beginners-5eef2cb14ce8)
方法和对象属性的自动完成
如果您已经创建了一个对象并将其赋给了某个变量,那么您可以使用自动完成来访问带有类型化前缀的可用方法和参数的列表。正如您在这里看到的,数据帧有几个以字母 d 开头的方法和参数。
模块的自动完成
最后但同样重要的是,您可以使用自动完成功能来导入模块的名称。所以你几乎记得这个有很多很酷的算法的库是如何被调用的,但是不完全记得。您可以使用自动完成功能来帮助您。下面是导入以’ ma '开头的模块的建议列表。
结论
我已经在 jupyter notebook 中展示了自动完成的几种用法,我希望我已经说服您开始使用它(如果您还没有这样做的话)。所以从现在开始,没有借口了,你应该在你的代码编写程序中引入自动完成功能。
对于我在这里没有指出的任何事情,你使用自动完成吗?我敢肯定,数据科学家还有其他方式使用它。如果你有建议,请在下面分享。
原载于 about data blog . com:Jupyter 笔记本自动补全,2019 年 10 月 30 日。
PS:我正在 Medium 和aboutdatablog.com上写文章,深入浅出地解释基本的数据科学概念。你可以订阅我的 邮件列表 在我每次写新文章的时候得到通知。如果你还不是中等会员,你可以在这里加入。
下面还有一些你可能喜欢的帖子
改进笔记本电脑功能,提高您的工作效率
towardsdatascience.com](/top-9-jupyter-notebook-extensions-7a5d30269bc8) [## Jupyter 笔记本中的 8 大魔法命令
通过学习最有用的命令来提高您的生产力
towardsdatascience.com](/top-8-magic-commands-in-jupyter-notebook-c1582e813560) [## 当你开始与图书馆合作时,7 个实用的熊猫提示
解释一些乍一看不那么明显的东西…
towardsdatascience.com](/7-practical-pandas-tips-when-you-start-working-with-the-library-e4a9205eb443)*