如何创建数据科学作品集网站
从头开始构建和部署您自己的数据科学组合网站
照片由阿毛里·梅希亚在 Unsplash 上拍摄
如果你像我一样是一名有抱负的数据科学家,你已经知道拥有一个突出的数据科学组合的重要性。
您参加了在线课程,获得了一些技能,并参与了数据科学项目。你也偶尔写博客,展示你在 Medium 上的工作。
所有这些都会让你的简历看起来很棒。然而,在你的简历上放多个链接是很麻烦的,可能会让招聘人员很难找到并正确理解你的工作。
我强烈建议建立一个数据科学作品集网站,展示你所做的所有工作。当潜在的雇主正在寻找雇员时,他们所要做的就是点击你的网站链接来了解你的一切!
拥有自己的网站肯定会让你在找工作时更有优势,也是讲述自己故事的好方法。
本·科尔德在 Unsplash 上的照片
我一直在考虑为自己创建一个数据科学网站,几天前终于开始着手做了。以下是给你的一些建议:
从头开始构建
当决定创建一个数据科学组合网站时,我不确定是否要从头开始构建它。
作为数据科学家,我们的重点不是网页设计,而是开发模型。我们也不太熟悉 HTML 之类的标记语言,使用 Wix 之类的网站构建器要快很多。
但是,我决定以此为契机,学习一些网页设计,并决定使用 HTML,CSS 和 Jquery 从头开始构建。
从头开始构建也给了我很大的自由来定制我的网站,使它看起来完全像我想要的那样。如果你有时间,我建议你也从头开始。
学习新东西总是很有趣的!
此外,从头开始构建并不一定意味着你必须自己绘制出整个设计并写出 HTML 的每一行。我强烈推荐使用 Bootstrap ,一个开源的 HTML CSS 框架用于你的布局。
这将给你的网站一个响应性的设计和结构,你可以很容易地使用它。
以下是我发现的一些有用的教程:
- 如何用 HTML 和 CSS 制作网站
- 如何创建作品集画廊
- 用 HTML 和 CSS 编写一个时尚的作品集设计
您也可以使用具有漂亮、响应性设计的模板。HTML、CSS 和 Jquery 都为您提供了。你所要做的就是调整代码来满足你的需求。
一些我认为不错的模板:
一些参考网站获取灵感:
- 朱莉娅·尼库尔斯基的数据科学作品集
- 大卫·文丘里的数据科学作品集
- 我的数据科学作品集(我仍在调整和添加新的部分,并在此过程中学习新的东西)。
然而,比你的布局更重要的是你的内容。如果你只有一次机会给潜在雇主留下深刻印象,你会展示什么?
所有让你脱颖而出的地方都要突出出来。你最热衷于什么?为什么是数据科学?你拥有的最重要的技能是什么?你做过什么重要的项目吗?
这里有一个关于如何构建你的网站的建议:
- 首页:这是人们访问你的网站时看到的第一页。确保它能吸引人们的注意力,并提供一些关于网站内容的信息。例如:
作者图片
作者图片
作者图片
这是一个有三个页面的响应滑块,我用 Bootstrap 为我的主页创建的。
2.**关于:**这是你讲述自己故事的部分。简要描述你的技能、兴趣以及你能带来什么。保持简洁明了!
3.**项目:**这可能是最重要的一个板块。作为一名有抱负的数据科学家,我们中的许多人可能没有在大公司展示技能的工作经验。
这就是项目发挥作用的地方。它们是展示您作为数据科学家所获得的技能的绝佳方式。这样,你不仅是在告诉人们你有技能,而且是在展示给他们看。
我建议在这部分只展示有有趣发现的独特项目。不要把你刚开始做的简单项目,没有故事可讲的项目,或者其他人都在做的项目放在上面。
一些你不应该添加到你的投资组合中的项目的例子:泰坦尼克号卡格尔竞赛,鸢尾花数据集,MNIST 数字分类与张量流。
这些不会帮助你的简历脱颖而出,这正是你应该避免的。
此外,试着增加一些能帮助你展示各种技能的项目。例如,包括展示您在以下方面技能的项目:
- 数据收集
- 数据预处理
- 数据可视化
- 数据分析
- ETL 管道
- 机器学习
展示你在所有这些领域的能力将让招聘人员了解你能完成的各种任务。
例如:
作者图片
以上是我添加到我的作品集网站的一个项目的例子。我在媒体上发表了一篇关于我的项目的博文,并将代码放在 Github 中。
我把它们都链接到了我的网站上,并附上了我的项目简介。
4.**认证:**如果你是一名有抱负的数据科学家,但没有扎实的教育背景(比如数据科学的硕士或博士),那么你必须自学。
在你的作品集上添加任何在线课程、MOOC 或证书。这将显示你对学习这门学科的奉献精神。
5.技能:这是你告诉潜在雇主你能做什么的部分。添加您在此过程中获得的所有技能,如数据辩论、分析和可视化。
您可以用您在前面部分展示的项目来支持这些技能,以进一步突出您带来的东西。
6.**联系:**让潜在雇主尽可能容易地与你联系。在网站底部添加您的联系方式。
最后,在你的简历上添加你想添加的所有内容的链接。提供你的 Kaggle、LinkedIn、Github 或 Medium 个人资料的链接,以便于访问。
部署您的网站
托管网站的传统方式是首先购买一个域名。然后,你需要选择一个主机提供商,并上传你的网站。
一些受欢迎的虚拟主机提供商包括 Bluehost 和 T2 host gator,你可以查看他们的价格计划。
对于我的作品集网站,我决定使用 Github 页面作为主机。它是完全免费的。你不需要购买域名,它会为你生成一个网址。我的是:https://natassha.github.io/natasshaselvaraj/。
如果你选择在 Github 页面上托管你的站点,你会发现 这个 教程很有用。你所需要做的就是创建一个新的存储库,并将你的代码添加到其中。
Github pages 将直接从您的存储库中获取文件,通过构建过程运行它,然后发布它。
还有…就是这样!
现在,您已经了解了如何创建和部署自己的数据科学产品组合。如果你有时间并且有兴趣学习新的东西,你一定要试一试。
从头开始创建自己的网站(即使只是一个简单、静态的网站)可能是一个令人沮丧且耗时的过程。
但是,我觉得满足感是值得的。另外,你现在有了一个展示你技能的新的很酷的方式,这很棒。
如何使用 Fastai-v2 为多光谱卫星图像分割创建数据块
通过简单的编码和 Fastai 的深度学习 API,在您的地球观测任务中享受最先进的结果。
Jirau 水库(巴西)水域像素分割示例,使用 U-Net 架构和 Fastai-v2。
更新
关于课程科学家 Python 入门 ( 可在 YouTube ) 和其他类似文章的信息,请访问我的网站cordmaur.carrd.co。
介绍
Fastai 是一个开源的深度学习库,它为 PyTorch 添加了更高级别的功能,并且更容易通过少量编码实现最先进的结果。
当我们需要快速创建图像数据集、应用数据扩充、调整大小、裁剪甚至覆盖分割蒙版时,视觉模块非常方便(图 1)。然而,所有这些简化都是有代价的。这些用于计算机视觉的高级 API 大多针对 RGB 图像进行了优化,这些图像库不支持多光谱或多通道图像。
图 1- Fastai 在分割任务上叠加遮罩的例子(来源:https://www.fast.ai/images/fastai_paper/show_batch_seg.png
近年来,由于数据可访问性的增加,地球观测研究人员一直非常关注深度学习技术,如图像识别、图像分割、物体检测等。[1].问题是卫星图像通常由许多不同的光谱带(波长)组成,不适合深度学习社区使用的大多数视觉库。出于这个原因,我直接与 PyTorch 一起工作来创建数据集(这里)并训练“自制”的 U-Net 架构(这里)。
随着 Fastai-v2(承诺在下周发布)[2]的即将到来,我想测试一下是否有可能使用它的数据块结构来创建一个多光谱图像数据集来训练 U-Net 模型。这比我以前的故事更高级,因为我们必须创建一些自定义子类,但我试图尽可能简单。包含所有代码的笔记本在 GitHub 项目中可用(笔记本此处)。
在我们开始之前,有必要按照 https://dev.fast.ai 上的安装指南安装 fastai2 库。
步骤 1 —准备数据
为了继续,我们将需要一些多光谱图像的训练补丁。这可能是一个 Kaggle 数据集,就像这个故事中使用的 38 云数据集一样,或者是一个全新的数据集。在故事使用谷歌地球引擎(GEE)为卫星(Sentinel 2)图像的深度学习图像分割创建训练补丁中,我展示了如何从谷歌地球引擎创建训练补丁,并将它们作为 NumPy 数组使用。
对于本教程,我在 GitHub 资源库(https://github.com/cordmaur/Fastai2-Medium),/data
文件夹下的中提供了一些来自巴西 Orós 水库的示例补丁。数据被保存为 NumPy 的数组,并被分为两个文件夹/data/images
用于多光谱补丁和/data/labels
用于目标遮罩。
Checking number of files - images:40 masks:40
Checking shapes - image: (13, 366, 366) mask: (366, 366)
正如我们从输出中看到的,图像被裁剪为 366x366 像素,训练面片有 13 个通道。这是按顺序排列的 12 个 Sentinel-2 波段,我添加了一个额外的波段来表示“无数据”标志。通道被放在第一个轴上,因为这是 PyTorch 和 Fastai 的标准,与其他图像库不同。遮罩值为 0-无水,1-水和 2-水阴影。我们将使用 Matplotlib 检查一个图像样本。为此,我们需要使用 Numpy.transpose 将通道轴移动到最后一个位置,并选择相应的红色、绿色和蓝色轴。
代码输出
步骤 2——子类化TensorImage
类
现在我们已经检查了我们的图像,我们需要一种在 Fastai 中打开它们的方法。由于 Fastai 使用的是 Python 图像库(PIL ),它无法处理这样的多光谱图像。然后,我们将从原来的TensorImage
继承一个名为MSTensorImage
的新类,它能够打开.npy
扩展并可视化地显示它。让我们来看看代码。
首先,我们定义一个打开 Numpy 数组并将其作为给定类返回的函数(open_npy
函数)。
然后,我们用一个create
方法定义了MSTensorImage
类,该方法接收文件名(或 numpy 数组,或张量)、所需的通道(如果我们不想加载所有 13 个通道的话)和一个指示通道是否在第一轴的标志。
最后,我们定义了一个显示方法来正确显示该图像。我们可以向 show 方法传递不同的通道来创建假彩色合成和 Matplotlib 轴,以便进行多重显示。在下面的例子中,我们可以看到图像被正确加载和显示。
代码输出
步骤 3 —张量掩码类
为了处理掩码,我们将使用已经在 Fastai2 中定义的TensorMask
类,而不是像以前那样创建一个新类。在这种情况下,唯一的区别是TensorMask
不知道如何打开.npy
扩展。在这种情况下,我们将通过新定义的open_npy
函数的结果来创建它,就像这样。
代码输出
步骤 4-创建数据块
DataBlock
是一个抽象,为您的源数据提供转换以适应您的模型。记住,为了训练神经网络,我们必须为模型提供一组输入(x)和相应的目标(y)。成本和优化函数会处理剩下的事情。更复杂的架构可能有多个 x 作为输入,甚至多个目标,所以DataBlock
接受多个管道(图 2)。
图 2:数据块简化示意图。在本例中,我们获取第四个项目(项目 4)。
在我们的例子中,这是最常见的,我们需要创建一个DataBlock
,它只提供两个块,Xs 和 Ys。对于每个块,我们可以创建一个TransformBlock
(就像一个处理管道)来操作每个组(Xs 或 Ys),直到它们达到加载到模型中所需的格式。
为了创建一个DataBlock
,除了TransformBlocks
之外,我们还必须提供一个函数负责获取给定来源的项目。在我们的例子中,由于文件已经保存在磁盘中,get_items
函数将只读取目录并返回文件名。文件列表将是我们转换管道的起点。
如果遮罩是从同一原始文件创建的(例如,如果遮罩是第 14 通道),则 X 变换管道将负责排除该通道,而 Y 变换管道将负责从原始图像中提取该信息。由于我们将文件分开保存,我们将提供一个名为get_lbl_fn
的新函数,它将接收图像文件的名称,然后返回相应目标文件的名称。现在我们对数据块有了一些了解,让我们来看看代码。
最后一个命令DataBlock.summary
,将检查是否一切正常,并给我们一个数据样本:
Setting-up type transforms pipelines
Collecting items from Data\images
Found 40 items
2 datasets of sizes 36,4
Setting up Pipeline: partial
Setting up Pipeline: get_lbl_fn -> partial
Building one sample
Pipeline: partial
starting from
Data\images\Oros_1_19.npy
applying partial gives
MSTensorImage of size 13x366x366
Pipeline: get_lbl_fn -> partial
starting from
Data\images\Oros_1_19.npy
applying get_lbl_fn gives
Data\labels\Oros_1_19.npy
applying partial gives
TensorMask of size 366x366
Final sample: (MSTensorImage: torch.Size([13, 366, 366]), TensorMask([[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]))
Setting up after_item: Pipeline: AddMaskCodes -> ToTensor
Setting up before_batch: Pipeline:
Setting up after_batch: Pipeline:
Building one batch
Applying item_tfms to the first sample:
Pipeline: AddMaskCodes -> ToTensor
starting from
(MSTensorImage of size 13x366x366, TensorMask of size 366x366)
applying AddMaskCodes gives
(MSTensorImage of size 13x366x366, TensorMask of size 366x366)
applying ToTensor gives
(MSTensorImage of size 13x366x366, TensorMask of size 366x366)
Adding the next 3 samples
No before_batch transform to apply
Collating items in a batch
No batch_tfms to apply
正如我们在结果中看到的,在处理完所有转换后,最终的样本由一个包含两个项目(X,Y)的元组组成。在我们的例子中(MSTensorImage
,TensorMask
)。
最终-数据集和数据加载器
一旦我们完成了DataBlock
的创建,那么DataSet
或DataLoader
的创建就非常简单了。考虑到拆分器功能(在我们的例子中,随机拆分器有 10%用于验证),数据集将被拆分为训练和验证数据集,并且可以通过订阅直接访问数据:
代码输出
同样适用于DataLoaders
。此外,show_batch
方法自动理解我们正在执行分割任务(因为 TensorMask 类),并覆盖 Xs 和 ys:
代码输出
结论
在今天的故事中,我们看到了基本概念以及如何使用 Fastai 2 的DataBlock
来准备多光谱卫星数据,以适应深度学习模型。TensorImage
类的子类化和open_npy
函数的使用足以处理多个通道。可以注意到,Fastai 创建数据加载器和显示批处理样本的基本功能被成功地保留了下来。
使用 Fastai 2 执行这些地球观测任务非常方便,与 Fastai 1 和其他高级 API 不同,Fastai 2 的内置视觉架构接受输入通道作为参数。但这是下一个故事的主题。
GitHub 资源库https://github.com/cordmaur/Fastai2-Medium提供了遵循该“操作方法”的笔记本和示例数据。
下一个故事再见。
参考
[1]t .赫泽,库恩泽,c .,2020 年。利用对地观测数据的深度学习进行目标探测和图像分割:综述-第一部分:发展和最近趋势。遥感 121667。https://doi.org/10.3390/rs12101667
[2]霍华德,j .,古格,s .,2020 年。fastai:深度学习的分层 API。信息 11108。【https://doi.org/10.3390/info11020108
如何通过云计算从 Twitter 中提取数据
通过使用 Python 和 Tweepy 库。
对于有抱负的数据分析师和数据科学家来说,Twitter 是一个很好的信息来源。它也是辩论和争论的场所。此外,Twitter 可以成为文本数据的良好资源;它有一个 API,凭证很容易获得,并且有许多 Python 库可以帮助调用 Twitter 的 API。
建立投资组合的一种方式是获得自己的自然语言处理项目,但就像每个项目一样,第一步是获得数据,然后通过使用亚马逊网络服务(AWS)将这些数据保存在本地计算机或云上。
总的来说,建立这个管道的资源是很棒的,但是它们有一些很容易让人头疼的怪癖。在本文中,我将向您展示如何建立一个简单的管道流程,并帮助您浏览该流程,避免那些令人头痛的问题。考虑这篇文章你的赛前泰诺!
这很好,对吗?所以,坚持住。
通过四个步骤,我将演示如何建立下面的管道。第一步包括使用来自 Twitter 的 API 收集数据,然后向您展示如何启动 EC2 实例,将其连接到 kinesis,最后使用 Python 脚本将数据传输到 AWS 上的 S3(数据湖)。
从 Twitter 到 S3 的管道
你准备好掌握所有这些了吗?
第一步:在 Twitter 上建立你的开发者账户,并获得你的证书
**给自己弄一个账号:**一个 Twitter 用户账号是拥有一个“开发者”账号的要求,所以要么注册一个新账号,要么登录一个现有账号,简直易如反掌。
创建 app: 在https://developer.twitter.com/en/apps注册 app。设置好之后,转到“令牌和密钥”来生成访问令牌和秘密令牌。连同消费者 API 密钥(已经生成),这些是我们将用来与 Twitter API 通信的凭证。我也将这些凭证用于 Python 脚本。我建议将凭证保存在文本文件中,因为我们将在后面的阶段使用这些凭证。
步骤 2:创建一个 AWS 帐户
在这个项目中,你需要使用来自亚马逊的三个不同的服务: EC2 实例、 Kinesis (数据流)和 S3 (数据湖)来建立管道。您需要创建一个帐户,并在此帐户下注册您的信用卡;亚马逊根据你对服务的使用情况收费。关于费用,不用担心。你在这个项目中使用的服务并不昂贵;在我的项目中,我每月花费不到5-6 加元。如果你需要使用其他服务,我建议你事先检查一下费用。请注意,偶尔查看一下您的账单总是一个好习惯,以确保您不会对此感到惊讶,并且如果您不再需要它,不要忘记终止服务或实例。
首先,在 EC2 管理控制台中,创建一个私钥对,您将使用它来设置 EC2 实例。此外,在接下来的步骤中,正确设置“安全组”以允许您的 IP 进行 SSH 访问。
接下来,通过 7 个步骤启动一个 EC2 实例。在我的项目中,我使用了一个简单的 t2.micro,它足以提取 tweets,你可以只使用一个实例,大小为 8gb。如果你想知道更多关于如何建立 EC2 的细节,我建议你看看下面 Connor Leech 的这篇好文章。请注意,您的第一年 EC2 t2.micro 实例将是免费的,直到达到某个阈值。
在这篇文章中,我们将在 Amazon Web Services 托管的云中创建一个 Linux 虚拟机。我们打算…
medium.com](https://medium.com/employbl/how-to-launch-an-ec2-instance-de568295205d)
EC2 实例是一个处理器或 CPU,在这个项目中,我们通过使用 python 脚本来收集数据(我将在下面解释)。
EC2 实例是一个处理器或 CPU,在这个项目中,您的实例通过使用 Python 脚本从 Twitter 中提取数据来收集数据(我将在下面解释)。
S3 是一个数据湖,对于阅读本文的新手来说,这是存储由 EC2 实例收集的原始数据的服务。在我的项目中,我决定让我的 S3 公开,以便连接其他软件,比如 Apache Spark,并减少访问问题。我知道这不是最好的做法,因为其他人可以访问你的数据,但在这个项目中,这是可以的,我不处理敏感数据。
亚马逊 Kinesis 数据流 (KDS)是一个极具扩展性和可持续性的实时数据交付服务。该服务是 EC2 实例和 S3 之间的“管道”。因此,在设置此服务的过程中,您需要将其链接到您的 S3,方法是指明存储桶(即文件夹)的名称,并指明您希望如何保存收集的数据。
一旦所有的服务都准备好并链接起来,我们就可以进入下一步了。
第三步:了解 API 和 Tweepy
Twitter 上关于 API 的文档相当不错,但是对于该领域的初学者来说可能有点混乱。我有几个问题要理解 API 是如何工作的,我希望您在阅读完这一部分后会清楚。
您可以在下面的链接中找到开展这个项目的大部分信息:
本文档概述了开发者对已经到位的 Tweets 的更改的指导,以允许人们…
developer.twitter.com](https://developer.twitter.com/en/docs/tweets/tweet-updates)
Twitter 的 API 允许你提取不同的数据字段,包含每个用户的推文内容、用户名、位置、日期和关注者数量。在这个项目中,我将提取所有这些字段。
为了提取推文,你需要我们使用 Tweepy 包。这是一个 Python 库,可以方便地使用 Twitter API。首先,您需要使用之前创建并存储在文本文件中的身份验证凭证来设置 API 对象。这是一个带有数据和一些帮助方法的 Tweepy 模型类实例。
[## API 参考- tweepy 3.5.0 文档
本页包含 Tweepy 模块的一些基本文档。模块中直接提供了例外情况…
docs.tweepy.org](http://docs.tweepy.org/en/v3.6.0/api.html#tweepy-api-twitter-api-wrapper)
脚本的第一步包括加载您想要使用的不同 Python 库,它们是 tweepy 、 json 、 boto3 和 time 。然后,您输入来自 Twitter 的凭证。
接下来,输入代码来解析 tweets 并将其导出到 json/text 文件中。该脚本分为两个主要部分。
第一部分叫做听众。正是在这个块中,我们从 API 中提取数据并打印出来。以下是脚本将为此项目记录的信息:
- 用户名
- 用户屏幕名称
- 推特内容
- 用户关注者计数
- 用户位置
- 地理定位
- 推特时间
根据您进行的项目,我鼓励您根据自己的方便来修改这一部分(例如,删除不需要的字段)。
我在这个项目中了解到的一个奇怪的方面是,Twitter 最初限制其用户只能发 140 个字符的推文,2017 年 11 月,Twitter 开始允许其用户发最多 240 个字符的推文。
为了使 API 适应这一新变化,Twitter 创建了另一个新的字段,称为“extended tweet ”,其中显示了长 tweet 的所有内容。因此,如果一条 tweet 超过 180 个字符,并且您想要提取整个 tweet,您需要提取这个字段,而如果 tweet 少于 180 个字符,您需要提取最初的 tweet 字段,名为“text”。不完全是本能,对吧?
现在让我们回到剧本上。为了容纳和提取扩展的 tweet,我创建了一个 if/elif 条件。如果 API 有一个“extended tweet”字段(这意味着 tweet 超过 180 个字符),提取它;否则,提取“文本”字段。
第一部分是身份验证和与 Twitter 流媒体 API 的连接,然后在下面输入您的 AWS 凭据(请注意,这不是推荐的),并输入您在上一步中设置的 kinesis 的名称。
然后,你需要输入你想要追踪和收集的关键词,用哪种语言。在我的项目中,我决定用英语和法语关注包含#giletsJaunes 的推文。你可以追踪多个标签。
这里是完整脚本的链接。
步骤 4:使用 screen 在 AWS 上运行代码
现在,管道和 Python 脚本已经准备好了,您可以使用之前在步骤 2 中创建的 EC2 实例开始运行脚本。
首先使用下面的命令登录到 EC2:
然后,在你的 EC2 上安装几个包: python3 和 tweepy ,以便顺利运行你的 python 脚本。然后,通过在终端上使用以下命令,将位于本地机器上的 Python 脚本上传到 EC2:
因为您需要长时间运行脚本,所以您可能希望在 EC2 上打开一个“屏幕”,在后台运行作业。这允许您关闭 EC2 的终端并运行它而不进行检查。
以下是使用屏幕的主要命令:
因此,一旦您的“屏幕”设置完毕,您只需通过输入以下命令来运行您的脚本:
python3 my_script.py
一旦您输入它,您应该看到 EC2 实例收集的所有 tweetss,这些 tweet 将保存在您的 S3 中。
第五步:监控你的渠道
通过登录 AWS,您将能够看到您的管道活动。一个很酷的功能是 kinesis 中的“监控”标签。
Kinesis 消防水管输送流中的输入记录
在该图中,您可以看到一段时间内收集的推文活动。在我的项目中,看起来#giletsjaunes 标签在周六和周日比平时更活跃。你也可以查看在你的 S3 数据湖中创建的文件,把文件下载到你的本地机器上,然后查看保存的推文。
现在,您已经准备好进入下一步,通过使用另一个 AWS 服务或 Apache Spark 来分析本地机器中的数据。
如何为你最喜欢的可视化工具创建下拉菜单和滑动条
使用 Python Widget,您可以用 3 行代码升级可视化
动机
想象一下,我们正在分析世界各国从 1960 年到 2018 年的趋势人口,以预测未来几年的人口。
为了可视化国家的趋势,我们选择 Plotly,因为它简单而美丽的可视化。从“越南”开始
import pandas as pd
import datapane as dp
import plotly.express as pxdata = pd.read_csv('population.csv')fig = px.line(data.set_index('Countries').loc['Vietnam'],
labels={'index': 'Year', 'value': 'Population'},
title='Population Over Time',
)
fig.show()
然后是美国
fig = px.line(data.set_index('Countries').loc['United States'],
labels={'index': 'Year', 'value': 'Population'},
title='Population Over Time',
)
fig.show()
看起来曲线是线性增长的,但我们不确定曲线是否对每个国家都是线性的,所以我们想继续可视化更多的国家。有没有更快的方法来可视化这些国家,而不是在df.loc['location']?
中更改国家的名称,如果有一个下拉菜单来选择您想要可视化的国家不是很好吗?
这可以通过一个小插件 Jupyter 小部件轻松完成。
Jupyter 小工具
Widgets 是多事件的 python 对象,可以提供像滑块、文本框等控件。我们可以使用小部件为我们的笔记本电脑构建交互式图形用户界面。
从安装开始
带 pip
pip install ipywidgets
jupyter nbextension enable --py widgetsnbextension
带康达
conda install -c conda-forge ipywidgets
查看此链接以获取关于安装的更多信息。
使用 Interact
导入有用的库
from ipywidgets import interact, interactive, fixed, interact_manual
import ipywidgets as widgets
探索我们可以用interact
做的基本事情。首先,定义一个您想要探索的函数。当参数 x 改变时,下面的函数返回 x。
def f(x):
return x
通过向x
传递一个元组(min, max)
来创建一个滑动条
interact(f, x=(0.0,10.0))
通过传递字符串列表创建下拉菜单
interact(f, x=['love','hate'])
基于此,也许我们可以为我们的情节创建一个基于国家变化的函数?
def f(country):
df.loc[country].iplot(
xTitle='Year',
yTitle='Population of {}'.format(country),
title='Population Over Time'
)
用df.index
代表国家
df.index
用一个简单的代码创建交互。
interact(f, country=df.index)
厉害!似乎有些国家的人口曲线是线性的。但是我们也很好奇每年世界上人口的分布是如何变化的,我们能创造另一个函数作为参数吗?绝对的!
对我们之前的图表进行转置,将country
改为year.
def f(year):
fig = px.line(data.set_index('Countries').T.loc[str(year)],
labels={'value':'Population in {}'.format(str(year))},
title= 'Population over time')
fig.show()
interact(f, year=list(data.T.index)[1:] )
如果我们喜欢滑动条,我们可以简单地将年份列表转换成元组(min year, max year)
interact(f, year=(1960, 2018))
就是这样!现在,我们可以有效地检查每年的分布,看看分布是否随时间而改变。
结论
恭喜你!您已经学习了如何利用 Python 小部件来创建滑动条和下拉菜单,以实现高效的可视化。我鼓励你用你最喜欢的可视化工具来尝试一下,比如 Matplotlib,Seaborn。只需在代码中做一点小小的改动,就可以为您节省大量时间,让您可以投入到数据科学项目的其他重要任务中。
在 this Github repo 中,您可以随意使用本文的代码。
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以通过 LinkedIn 和 Twitter 与我联系。
如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:
[## 如何用 Ngrok 用 3 行代码分享你的 Jupyter 笔记本
想象一下,让你的朋友在远程机器上使用你的本地 Jupyter 笔记本
towardsdatascience.com](/how-to-share-your-jupyter-notebook-in-3-lines-of-code-with-ngrok-bfe1495a9c0c) [## 恐龙和圆圈的数据集可以有相同的统计数据吗?
它们有相同的中位数和标准差,但它们是两个明显不同的数据集!
towardsdatascience.com](/how-to-turn-a-dinosaur-dataset-into-a-circle-dataset-with-the-same-statistics-64136c2e2ca0) [## 如何使用 HyperDash 远程监控和记录您的机器学习实验
培训需要很长时间才能完成,但你需要去洗手间休息一下…
towardsdatascience.com](/how-to-monitor-and-log-your-machine-learning-experiment-remotely-with-hyperdash-aa7106b15509) [## 如何用 Faker 创建假数据
您可以收集数据或创建自己的数据
towardsdatascience.com](/how-to-create-fake-data-with-faker-a835e5b7a9d9) [## 如何在 10 分钟内为您的数据科学产品组合创建一个优雅的网站
你需要做的就是编辑
towardsdatascience.com](/how-to-create-an-elegant-website-for-your-data-science-portfolio-in-10-minutes-577f77d1f693)
如何创建以太坊定义实时仪表板
使用图形和谷歌电子表格来存储数据,并使用谷歌数据工作室创建一个实时仪表板
获取区块链数据越来越容易,速度也越来越快。在本帖中,我们将看到如何从 DeFi(分散金融)协议中提取数据,用 Google 电子表格创建数据集。有了它,我们将创建一个仪表板,实时显示这些数据,为我们提供 Aave 协议中请求的贷款信息。
获取数据
为了获得数据,我们将使用图形的 Api,如这篇文章中所解释的。
我们要提取的是与所请求的贷款相关的数据,所有的历史记录,以便能够在以后进行分析。为此,我们必须创建如下所示的查询:
{
borrows (first: 1000) {
id,
amount,
reserve {
id,
symbol
},
borrowRate,
borrowRateMode,
timestamp
}
}
通过这个查询,我们获得了前 1000 个结果,这是图形在一个数据块中允许的最大值,然后我们将继续迭代以获得以下结果,直到我们恢复所有结果。
如果我们在这个游乐场测试这个查询,我们看到它返回:
之后,我们将获得所有贷款的数据,包括请求的加密资产、金额、利息和利率。通过将这些数据直接导入到 Google Sheets 的文档中,我们将拥有一个实时数据集来构建我们的分析模型。
创建数据集
为了将数据保存在 Google excel 表中,我们将在其中创建一个脚本,选项为:
在这个脚本中,我们包含了以下代码:
让我们来看看每一行的细节:
- **第 4–22 行:**将被调用来填充数据集的函数。在这个函数中定义了要调用的端点以及用来获取数据和查询的查询。用这些,提取它的函数被调用,然后它们被写在 excel 中。
- **第 30–37 行:**函数构建将在 API 调用中传递的选项,每次迭代都调用一个动态参数“skip ”,用这个新参数创建选项。
- **第 44–49 行:**将数据写入 excel 表格的函数。接收数组形式的数据作为参数,并将其写入执行脚本的 excel。
- **第 57–86 行:**函数迭代历史中存在的所有数据块。创建一个从 api 请求数据的循环,在有数据时将 skip 参数增加 1,000 个单位。一旦接收到数据,它就将数据存储为一个数组,从 api 返回的 json 中检索该数组。
一旦创建了脚本,就必须执行它以便加载数据。我们以下列方式执行它:
我们可以看到 excel 是如何填充数据的
分析数据
使用填充的数据集,我们可以分析我们的数据。最快和最简单的方法是使用谷歌数据工作室仪表板。
我们创建一个新的报告,并指出数据源将是一个电子表格。
通过选择我们已经创建的表,我们可以使用 Google Data Studio 中存在的模板,并立即创建一个仪表板,以一种简单而非常有吸引力的方式向我们显示数据
通过这个简单的脚本,我们可以实时获得来自协议定义的数据,并分析来自整个贷款历史的数据,这是一个非常重要的信息,能够以完全可访问的方式创建模型。
此外,这些信息可以非常容易地共享。创建的仪表盘可以在这里查阅。
如何在 AWS 上创建免费的 VPN 服务器
一步一步的教程建立自己的免费 VPN 服务器
如果你想更安全地浏览网页,并且想创建对 VPC(虚拟专用云)的访问,VPN(虚拟专用网络)是很重要的。有时获得 VPN 会很困难,尤其是当你不得不付费使用服务的时候。在本文中,我将向您展示如何在 AWS 上建立一个有效的 VPN 服务器,并且您不必为使用它支付任何费用。让我们开始吧。
托马斯·詹森在 Unsplash 上的照片
要求
要开始学习本教程,您需要一个免费的 AWS 帐户,这样您就不会因为在 AWS 上运行 VPN 而被收费。如果您没有 AWS 帐户,不用担心,您可以在这里创建一个,它附带 12 个月的免费等级资格。
步骤 1:设置 OpenVPN 服务器
登录到您的 AWS 帐户,导航到 EC2 服务,然后单击启动实例。
作者图片
然后在页面上点击“AWS Marketplace ”,输入“openvpn ”,选择“OpenVPN Access Server ”,即带有“Free tier eligible”选项的服务器,然后点击“select”。
作者图片
OpenVPN 是一个开源 VPN 服务器,在这种情况下,我们使用 Ubuntu AMI(Amazon 机器映像)来运行 VPN,有时 AWS marketplace 会更好,如果你不想自己配置 OpenVPN 服务器的话。
点击“选择”后,您将进入以下页面。请记住,正如我之前所说,OpenVPN 是一个免费的开源 VPN,但它是一项商业服务,尽管我们可以使用自带许可证(BYOL)选项免费开设两个 VPN 帐户,这也是此处显示的页面的本质。之后,向下滚动并单击选择。
作者图片
然后,您将被定向到此页面,这是服务将运行的地方,选择包含“Free tier eligible”标记的 t2.micro,然后单击“Review and Launch”
作者图片
单击 Review and Launch 后,您会看到对您将要创建的实例的审查。如果你通读一遍,你会发现运行这项服务的成本是每小时 0.00 美元。点击启动
作者图片
然后您会看到一个弹出窗口,要求您创建或使用一个现有的密钥对,这一部分非常重要,因为您将需要它来 SSH 到您的服务器。如果您还没有密钥对,您可以创建一个新的密钥对,并将其下载到您的计算机上。然后单击启动实例。几秒钟后,您的实例将开始运行,您可以开始工作了。
作者图片
步骤 2:服务器配置
实例成功启动后。以 root 用户身份打开您的终端并通过 SSH 连接到您的服务器,以便配置 VPN 的管理端,为此使用以下命令:
ssh -i "<your-key-pair>" [root@](mailto:root@ec2-34-228-81-236.compute-1.amazonaws.com)<your-public-instance-domain>
您的密钥对是您最近下载的或者您的计算机上已有的密钥对,如果它在不同的目录中,也要确保您指定了密钥对的路径以使它工作。您的公共实例域可以在 EC2 仪表板上找到。如果输入正确,您应该会看到许可协议条款,键入 yes 并输入。
作者图片
接下来,你会被提示如何配置你的 VPN,保持默认设置,只需继续按下回车键,它会为你启动配置过程。完成后,您将看到一条指令,不再以 root 用户身份登录,而是以默认创建的用户“openvpnas”身份登录。
作者图片
现在,使用下面的命令再次对实例进行 SSH,但不是以 root 用户身份,而是以用户“openvpnas”身份:
ssh -i "<your-key-pair>" openvpnas[@](mailto:root@ec2-34-228-81-236.compute-1.amazonaws.com)<your-public-instance-domain>
当您成功登录后,为用户“openvpnas”创建一个密码,这将是访问 VPN 门户的管理员和客户端密码,您可以使用以下命令完成此操作:
sudo passwd openvpn
您将看到创建新密码的提示。就这样,您已经成功地配置了服务器。
步骤 3:使用 VPN 服务
祝贺您完成了本教程的这一部分,但是在我们开始使用它之前,我们只需要在我们的 VPN 中启用一个小功能。
复制您的实例的公共 DNS 或 IP 地址,并将以下内容粘贴到您的浏览器上:
http://<your-instance-public-DNS or IP address>:943/admin
您应该会看到以下页面:
作者图片
如果您看不到此页面,请尝试使用匿名浏览器打开该网页。对于用户名,输入“openvpnas ”,密码是您在前面的步骤 2 中创建的。如果成功,您将被要求接受许可协议条款,然后您将看到以下页面:
作者图片
现在在左边的页面,进入配置,点击“VPN 设置”
作者图片
然后向下滚动到路由并启用“客户端互联网流量应该通过 VPN 路由吗?”选项:
作者图片
向下滚动并点击保存设置。
作者图片
当你改变设置时,你需要更新服务器,所以点击“更新运行的服务器”就完成了!!!
现在让我们连接到 VPN…
转到 URL 并删除管理路径,它应该是这样的:
http://<your-instance-public-DNS or IP address>:943/
您应该看到用户登录页面,输入您用于登录管理员的相同凭证
作者图片
现在选择你想要使用 VPN 的操作系统,按照提示操作,你就可以开始了!!!
作者图片
仅此而已。感谢阅读,并保持安全😃。
如何在 5 分钟内创建一个谷歌数据工作室仪表板
数据科学家的专家可视化方法。
G oogle Data Studio 是一款简单易用的工具,任何拥有互联网连接和计算机的人都可以使用,但对业务分析师、数据分析师和数据科学家尤其有用。本文的目标是向您介绍如何创建 Google Data Studio 仪表板。该工具有利于通过交互式图表和表格直观地描述数据。商业中的很多问题都源于不恰当的沟通,包括从工程师到产品经理再到数据科学家。发现和结果很难传达给其他人。该工具可以通过以易于查看的格式呈现数据来帮助解决这些问题。下面,我将讨论一些简单的步骤来帮助您创建一个简单而有效的仪表板。
连接您的数据
第一步是获取你的数据。如果您想继续,但还没有数据,您可以通过命名一些列并在行中分配一些值,在 Google Sheets 中快速创建一些虚拟数据,然后连接到这些数据(我将使用虚拟数据)。下面提供的截图显示了如何连接到 18 个数据源,但我选择显示 Google Sheets,因为它是一个流行而简单的数据编辑工具。
连接您的数据源。作者截图。
然后,您很可能会看到您的编辑版本的仪表板,它会自动显示您的数据表。我有几个字段,包括一些数字字段和一些文本字段(分别用 a 123 和 ABC 表示的和)。
你的第一次想象
您将会看到一个数据表,但是我在这里将我的数据表改为一个“带有热图的表”。它为您选择在图表中显示的指标着色。这个附加组件不仅可以用数字,还可以用颜色来显示列值的数量级。几分钟后,甚至几秒钟后,你就有了一张令人印象深刻的彩色图表。
选择了“带热图的表格”选项的可能图表。作者截图。
给你的观众(或你自己)留下深刻印象
让我们更进一步,用一个更独特的图表来可视化同样的数据。你可以从上面看到地图选项。我要用的是“地理图”。选择此图表意味着您必须确保您的数据具有地理要素组件,或者手动将其更改为地理要素组件。例如,您可以看到我的数据有一个名为“地区”的字段。您将希望确保图表知道地区的缩写实际上是正确的地区,在本例中是美国的州。现在,您已经创建了一个有意义的地图,可用于会议、演示、电子邮件等。
状态数据的“地理图”,用数量密度进行颜色编码。作者截图。
把所有的放在一起
完成两张图表后,您可以点击“查看”按钮,退出编辑模式,进入仪表板的查看模式。现在,您可以与他人共享您的仪表板,就像使用 Google Sheet 或 Doc 一样。下面的屏幕截图显示了带有热图的原始表格,按“已确认 _ 恢复”降序排列(虚构字段,用于示例目的—您也可以执行升序排列)。另一个简洁的功能是,一旦进入仪表板视图,您就可以将鼠标悬停在图表上,并获得有关数据的更详细的信息。例如,您可以看到我的鼠标悬停在 CA — California 上,它显示了“ Confirmed_Recovery ”指标的数量。地图还显示了显示数量范围的键(最小到最大,也用颜色编码)。此外,您可以移动图表并轻松更改其大小,以实现完美的仪表板布局。有几个*“主题和布局*”。左边的这个主题是默认的,右边的主题是星座模式(类似于黑暗模式)。
带有默认和黑暗模式主题版本的最终仪表板。作者截图。
这个仪表板很容易创建,而且是免费的。你不必下载任何工具或平台,只需使用一个谷歌账户——所以你可以看到这个工具是多么有益。虽然这个仪表板创建得很快,但您可以创建一个更加令人印象深刻的仪表板,更加注重时间,以及一些您想要突出显示的与您的业务相关的特定目标和指标。
这里的是 Google 自己做的一个更复杂的例子,突出了按国家进行广告数据会话的用例。它被标记为[样本]谷歌分析营销网站。
Google Data Studio 的仪表板示例——Google Analytics 营销网站。
最后的想法
创建一个仪表板可能看起来令人生畏,但是通过一些努力和指导,像这样,你可以很好地为无数目的创建一个强大而令人印象深刻的仪表板。作为一名数据科学家,我已经习惯于用 Python 编程语言创建可视化或图表,但是使用 Google Data Studio 更容易、更快,并且可以产生更令人印象深刻的交互式仪表板。可视化复杂的机器学习算法指标也可能是暗示,但使用这样的工具,数据科学家或类似角色的人可以以容易理解的格式显示分析。
感谢您的阅读!我希望你喜欢这篇来自数据科学家的文章。如果您在执行可视化时使用相似或不同的概念和代码,请在下面评论。
我不隶属于本文中提到的任何公司。
参考
谷歌, 谷歌数据工作室 ,【2020】
谷歌, 谷歌分析营销网站 ,【2020】
M.Przybyla,截图和仪表板,(2020 年)
如何使用 AWS AppSync 创建 GraphQL API
什么是 GraphQL 以及如何使用 AWS AppSync 创建我们自己的 GraphQL API
什么是 GraphQL
如今,每当我们谈论或考虑创建/设计一个 API 时,首先浮现在脑海中的是 REST 。REST(REpresentationalSstateTtransfer)一直是开发 API 平台的首选标准。即使 REST 成为了标准,它也有自己的缺点。一个主要的缺点是对于将要消费它们的客户来说缺乏灵活性。因此,即使在开始时,我们根据客户需求创建 REST API,当客户需求快速变化时,该 API 的选项也很少。为了支持这些快速的变化,客户需要发送多个调用,并获得多个不必要的数据。
图片由 GraphQL 提供
GraphQL 的开发主要着眼于为客户提供这种灵活性。它最初是脸书内部的一个项目,但是后来他们把它变成了开源项目。主要概念是让客户端能够选择要查询的数据和需要返回的数据,而无需进行多次 API 调用。是的,正如你在 GraphQL 中读到的,它没有多个端点,而是只有一个端点。为了说明 GraphQL 是如何工作的,让我们尝试使用 node.js 和 express framework 实现一个简单的 GraphQL API。我们的 GraphQL 的数据模型将是一个用户。
下面的 npm 包将在我们的代码中使用。
express, express-graphql, graphql
一个 GraphQL API 主要由四个组件组成。
- (计划或理论的)纲要
- 问题
- 突变
- 下决心者
(计划或理论的)纲要
GraphQL 模式是我们定义客户端连接到 API 后可以执行的功能的核心元素。模式上的主要构建块是类型。
如上图所示,使用积木类型,我们创建了三个积木。类型类型查询、类型、突变、类型用户。下面将描述查询和突变。对于类型用户,如您所见,我们已经定义了属性字段,当查询用户时,这些字段将对客户端可用。
询问
查询类型用于定义什么类型的查询将可用于要被访问的客户端。用 REST 术语查询类型可以映射到 GET 请求。在上面的模式中,我们定义了三个查询,它们接受的参数以及返回值的类型。(!代表必需的)
变化
任何导致数据变化的函数都应该作为 GraphQL 的变种来完成。对 REST 的 POST 、 **PUT、**和 DELETE 请求可以映射为 GraphQL 上的突变。正如我们定义查询一样,变异也是用参数和返回值类型定义的。
下决心者
在解析器中,我们定义了我们在模式中定义的查询和突变的功能。解析器将模式定义的方法映射到我们正在执行的功能方法。
在上面你可以看到,对于我们定义的每个查询和变异,我们已经映射了一个 Javascript 函数来执行功能逻辑。(getUser、getUserByName、getUserByStatus 和 updateUser 是 Javascript 函数)
好了,现在我们已经介绍了代码中的主要概念,下面是简单的 GraphQL API 的完整代码。如上所述,您需要安装提到的 npm 包,以便运行应用程序。
现在,您可以启动 node.js 服务器,并向我们的 API 发出查询,我们可以使用 graphql 工具,它将在http://localhost:4000/graph QL上运行
现在,如上所示,我们可以为我们创建的 API 执行查询。上面我们得到了 id 为 1 的用户,我们只请求返回姓名和年龄字段。
与查询一样,我们也可以发送变异来更新用户。上面我们已经将用户的年龄改为 25 岁。
AWS AppSync
图片来源 AWS AppSync
WS AppSync 是由 Amazon Web Services 提供的一项服务,它通过让开发人员在其基础设施上创建安全、灵活的 GraphQL API 来简化 API 应用程序开发。使用 AWS AppSync 的好处是,它还提供了额外的功能,如 Cognito、IAM permissions、API key 和许多其他 AWS 服务,以便与我们的 API 集成。
对于 AppSync,GraphQL 的主要概念基本保持不变,只是增加了一个类型、订阅。订阅被调用到一个通过 API 完成的变异,因此它可以用来创建实时的 GrapgQL APIs。此外,在我们开始在 AWS AppSync 中创建自己的 GraphQL 之前,我们需要讨论 AWS AppSync 中的另外两个组件。
- 数据源 —数据源可以是持久存储(关系数据库或 NoSQL 数据库)或触发器(AWS Lambda 函数或其他 HTTP API)
- 解析器 —与 GrapQL 中的解析器有相同的概念,但是这里我们将请求负载映射到我们的数据源或触发器。这些解析器主要与包含执行逻辑的映射模板妥协。
在 AppSync 上创建 GraphQL API
让我们开始实现我们的 API。首先转到 AppSync 服务,如果您还没有创建 API,您将看到下面的屏幕。
点击创建 API ,这将把我们带到 API 创建页面。这里 AWS 将为我们提供几种选择。我们可以从已经创建的模板中选择一个,也可以从头开始。对于这篇文章,让我们选择从头开始构建,这样我们将能够了解场景背后的一切是如何连接的。
接下来,提供一个名称并创建我们的 API。然后,我们将转到一个屏幕,在这里我们可以选择编辑我们的模式并根据我们的 API 运行查询。
因为我们的 API 上还没有任何东西,所以让我们首先定义我们的模式。在本文中,我将讨论 AppSync 支持的两种类型的数据源。一个是 DynamoDB 另一个将是 AWS Lambda functions 。由于上面创建了简单的 GraphQL API,让我们假设我们的用户数据模型。
DynamoDB 作为数据源
假设我们需要将用户保存在 DynamoDB 表中。因此,对类型用户进行的所有查询和变更都将直接发生在我们的 DynamoDB 表上。所以首先让我们在模式中定义我们的用户类型。
在模式页面上,单击创建资源,我们将在其中定义我们的用户模式。
我们定义了用户的新类型,然后它将要求 DynamoDB 表的详细信息。在这里,我们可以提供表的名称,还可以配置我们需要创建的不同类型的索引。最后,它将显示为我们的类型 用户自动生成的模式块,这些模式块将被合并到我们的模式中。点击创建,它将创建 DynamoDB 表以及解析器。
现在让我们更深入地看看我们的模式。我们可以看到 AppSync 已经为我们自动生成了查询类型和突变,并且已经将这些查询和突变映射到解析器。
让我们看一个解析器,以确定解析器如何在 AppSync 上工作。
点击创建用户突变。在这里,我们可以看到 AppSync 用于此突变的模板。在请求映射模板中,我们可以看到它将 id 作为我们的用户表的键,并在表中创建一个用户集合。 $ctx.args.input 是我们将传递给变异的参数。
响应映射定义了我们将发送回客户端的响应。在这里,它将直接发送来自 DynamoDb 的输出,这将是新创建的用户。
我们可以使用提供的查询工具测试我们的 API。让我们首先添加一个用户,并尝试使用 id 查询该用户。
AWS Lambda 用作数据源
到目前为止,我们创建的 API 可以直接在 DynamoDB 数据库上执行所有 CRUD 操作。但是 API 不仅仅包含 CRUD 操作。可以有不同种类的功能逻辑,如通过向队列发送消息来启动流程,或者我们可能需要使用不同的 AWS 资源,如 ElasticSearch,而不是在数据库上进行 CRUD 操作。为了迎合这种情况,我们可以使用 AWS lambda 函数作为数据源。
对于本文,让我们假设我们想从 AWS lambda 函数获取用户数据,而不是从 DynamoDb 获取。首先,让我们创建 lambda 函数。我们要映射为解析器的查询是
getUser(id: Int!): User
创建一个新的 lambda 函数,并为该函数添加以下代码。在这里,我们检查将通过解析器发送的 event.field 参数。因此,如果字段参数是 getUsers ,那么我们将返回过滤后的用户。
现在让我们为这个函数配置一个解析器。在此之前,我们需要在我们的 API 中将这个函数注册为一个数据源。为此,转到数据源选项卡,点击创建数据源。
接下来,为数据源提供一个名称,选择 DataStorageType 作为 Lambda ,然后选择 region ,最后选择我们创建的 Lambda 函数。
下一步是在我们的模式中分配这个数据源。首先,当我们将模式映射到 DynamoDB 表时,删除已经映射到 getUser()解析器。
删除后,点击连接。然后选择数据源作为我们为 lambda 函数创建的数据源。接下来将为请求映射和响应映射添加模板。
{
"version": "2017-02-28",
"operation": "Invoke",
"payload": {
"field": "getUser",
"arguments": $utils.toJson($context.arguments)
}
}
将上述内容添加为请求映射模板。这里我们将字段指定为 getUser ,我们在 lambda 函数中使用它作为事件。对于响应映射,我们可以让它保持原样。
现在让我们试着从我们的 GraphQL API 中查询这个。
就是这样。尽管这里 lambda 函数只是用来返回一个用户,但我想你可能会发现 lambda 函数能做的任何事情都可以映射到我们的 GraphQL,这确实创建了一个无服务器 API。
我想你已经了解了更多关于什么是 GraphQL 以及如何使用 AWS AppSync 为我们创建一个 GraphQL。还有许多概念没有在本文中介绍。因此,如果你热衷于此,请确保遵循官方文档以及其他可用的精彩文章。谢谢你。
在本系列文章中了解 GraphQL,它是如何工作的,以及如何使用它。寻找关于如何…
graphql.org](https://graphql.org/learn/) [## 欢迎
欢迎使用 AWS AppSync 开发人员指南。AWS AppSync 是一个企业级的完全托管的 GraphQL 服务,具有…
docs.aws.amazon.com](https://docs.aws.amazon.com/appsync/latest/devguide/welcome.html)
如何用 Python 中的 Plotly Express 创建分组条形图
Python melt 函数将数据帧从宽到长格式化
作者图片
**Table of Contents**[**Introduction**](#7b7f)1\. [Data](#4f79)
2\. [Preparing data](#010c)
3\. [Pandas melt function](#0bb4)
4\. [A grouped bar chart](#9c7d)
5\. [Bonus tip](#de73)[**Conclusion**](#b4e3)
介绍
创建分组条形图时,需要使用[plotly.graph_objects](https://plotly.com/python-api-reference/plotly.graph_objects.html#graph-objects)
。在本文中,您将学习如何使用 Plotly.express 创建一个分组条形图。Plotly Express 是一个用于数据可视化的高级接口。
Plotly Express 提供了 30 多种功能来创建不同类型的图形。这些函数的 API 一致且易于使用。
你可以在这里找到如何安装 plot ly。
本文假设您已经熟悉 JupyterLab/Jupyter 笔记本的基本操作。
数据
我们使用美国人口普查局的数据。本页提供 2018 年以来的教育程度数据。在这篇文章中,我们主要关注种族和性别。你可以在这里找到下载的数据。
准备数据
import pandas as pd
import plotly.express as px
url='https://gist.githubusercontent.com/shinokada/f2ebf82eaa3cfa02106ae93c7fe9efbe/raw/3494b1e2ba9b1c0d8991e71483123f63b4bce559/educational+attainment.csv'
df = pd.read_csv(url)
display(df)
我们导入 Pandas 并创建一个变量url
,它包含一个到逗号分隔文件(csv)的链接。
我们使用read_csv
来读取 csv 文件并创建一个熊猫数据帧。
csv 文件有 70 行× 16 列。图片由作者提供。(图 1)
cols = [2,10,14]
rows = [33,36,39,42,45,48,51,57]
df =df.iloc[rows,cols].reset_index(drop=True)
df.columns=['race','Male','Female']
for col in ['Male', 'Female']:
df[col]=pd.to_numeric(df[col].str.replace('%',''))
display(df)
print(df.dtypes)
- csv 文件有 70 行 x 16 列。我们需要
2, 10, 14
的列号,其中包含种族名称、男性的估计百分比和女性的估计百分比。我们还使用行号33, 36, 36, 42, 45, 48, 51, 57
,它包含不同种族的学士学位或更高学位的数据。 - 我们将该列重命名为种族、男性和女性。
- 我们使用 for 循环,使用
pd.to_numeric
函数将男性和女性列转换为数字,并使用str.replace
方法删除%符号。
显示(df)和打印(df.dtypes)的输出。图片由作者提供。(图 2)
[## 如何在 Docker 上运行 Jupyter 笔记本
不再有 Python 环境和包更新
towardsdatascience.com](/how-to-run-jupyter-notebook-on-docker-7c9748ed209f) [## 如何用不到 15 行代码创建一个动画的 Choropleth 地图
在 Jupyter 上使用 Python 中的 Plotly Express
towardsdatascience.com](/how-to-create-an-animated-choropleth-map-with-less-than-15-lines-of-code-2ff04921c60b) [## 如何在 Jupyter 中创建动画条形图
使用 Plotly Python 显示最新美国失业率的数据可视化
towardsdatascience.com](/how-to-create-an-animated-bar-chart-in-jupyter-9ee1de8d0e80)
熊猫融化功能
上面的图像图 2 被称为宽格式。要使用 Plotly Express 分组条形图,我们需要将数据帧重新调整为长格式。
熊猫的[melt](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.melt.html)
功能可以将一个数据帧从宽格式重塑为长格式。
df=pd.melt(df,id_vars=['race'],var_name='gender', value_name='value')
df
我们使用以下 pandas.melt 参数。
id_vars
:用作标识符变量的列var_name
:用于变量的名称。默认为variable
。value_name
:要取消透视的列。如果未指定,则使用未设置为id_vars
的所有列。我们用value
。
一种长格式数据帧。图片由作者提供。(图 3)
分组条形图
fig = px.bar(df, x="race", color="gender",
y='value',
title="A Grouped Bar Chart With Plotly Express in Python",
barmode='group',
height=600
)
fig.show()
我们使用px.bar
实例化一个plotly.graph_objects.Figure
对象并定义参数。
data_frame
:我们使用df
数据帧。你可以像上面一样使用或不使用data_frame
或data_frame=df
。x
:用于 x 轴的data_frame
中的一列的名称。我们使用列race
。
-color
:data_frame
中一列的名称,用于给列分配颜色。y
:用于 y 轴的data_frame
中的一列的名称。我们使用列value
。title
:一个图标题。barmode
:为group
、overlay
或relative
中的一种。在relative
模式下,棒被堆叠。在overlay
模式下,条形被绘制在彼此的顶部。在'group'
模式下,条块并排放置。默认值为relative
。
因为我们正在创建一个分组条形图,所以我们使用group
。
barmode='overlay '。图片由作者提供。
barmode='relative '。图片由作者提供。
height
:以像素为单位的图形高度。
额外小费
当你有一个像我们这样的宽格式数据帧时,你可以使用facet_col
或facet_row
来创建支线剧情。
fig = px.bar(df, x="race", color="gender",
y='value',
title="A Grouped Bar Chart With Plotly Express in Python",
barmode='group',
height=700,
facet_row="gender"
)
fig.show()
facet_row="gender "的输出图。图片由作者提供。
fig = px.bar(df, x="race", color="gender",
y='value',
title="A Grouped Bar Chart With Plotly Express in Python",
barmode='group',
height=700,
facet_col="gender"
)
fig.show()
facet_col="gender "的输出图。图片由作者提供。
结论
我们可以使用 Plotly Express 创建一个分组条形图。Plotly Express API 提供了我们可以利用的各种高级特性。barmode
参数有不同的值可供您使用。
Pandas melt
函数是将宽格式转换为长格式数据帧的最简单方法。
通过 成为 会员,获得媒体上所有故事的访问权限。
Plotly 统一悬停模式,按钮和更多
towardsdatascience.com](/line-chart-animation-with-plotly-on-jupyter-e19c738dc882) [## 如何在 Jupyter 中创建交互式下拉列表
用下拉菜单更新图表
towardsdatascience.com](/how-to-create-an-interactive-dropdown-in-jupyter-322277f58a68) [## 如何在 Jupyter 中创建一个有吸引力的气泡图
从 Github repo 抓取数据的分步指南
towardsdatascience.com](/how-to-create-an-attractive-bubble-map-5cf452c244e9)
如何使用 Plotly 创建轴辐式绘图
用连接位置的线在地图上绘制纬度/经度数据
不久前,我需要在地图上绘制连接某些位置的纬度(lat)和经度(long)坐标的线。我需要画的是众所周知的“轴辐式图。知道 Plotly 已经有了一些样品,比如这里的,我能够很容易地完成它。但是现实生活中的数据并不总是完美地适用于 Plotly 的例子,而且可能还有其他开箱即用的例子不能满足的要求。
在这篇博客中,我将向你展示如何自己构建这些图表。特别是,我们将假设:
-
数据并不总是来自同一个地区(如美国)。我们的地理空间数据可以是北美、南美或欧洲的。
-
该图需要保存为 HTML 文件。
-
图形应该是脱机的*。
-
这实际上是在 Plotly 版本 4 之前需要更多努力的事情,特别是因为他们的文档强调在线模式,正如你在这里看到的**。但是版本 4 只离线。你可以在这里* 阅读更多关于在线特性 的迁移。*
一些关于神秘人物的背景
*Plotly 中有多种表示图形的方法。两种最常见的方法是使用(a)字典或使用(b) *图形对象。虽然各有利弊,Plotly 推荐后者的额外好处,你可以在这里查看。
为了创建一个图形,我们需要两个主要组件:数据和布局*。来自文档😗
您可以通过将跟踪和布局规范传递给
plotly.graph_objects.Figure
构造函数来构建一个完整的图形。这些跟踪和布局规范可以是字典或图形对象。
**布局字典指定图形布局的属性,而数据是一个跟踪字典列表,带有各个跟踪的配置选项(跟踪是 Plotly 用来描述图形的一个词)。
既然我们知道了图形是如何构成的,我们就可以准备数据并把它们标绘在地图上。虽然下面的代码是针对 Plotly 版本 4 的,但是你可以在这个 Jupyter 笔记本中找到版本 3 和版本 4 的实现。
数据准备
数据(如您在此示例中所见。csv 文件)包含每个出发地和目的地的信息(即城市、州、国家、纬度和经度)。为了画出这个情节,我们只关心:
- 始发地和目的地的纬度/经度。
- 地图上的位置属性,例如大小、颜色和形状。
- 以及任何其他关于某个位置的信息,或者我们希望在地图上显示的位置之间的路径。例如,当用户的鼠标悬停在每条路径上时,您可能想要显示每个位置的名称,或者每条路径的长度(以英里为单位)(这里我们只显示前者。)
首先,让我们加载数据:
***import** pandas **as** pd
**import** plotly.graph_objects **as** godata = pd.read_csv(**'sample_us.csv'**)*
接下来,使用所有需要的属性创建位置数据框架:
之后,我们可以将每个位置及其属性添加到图形中:
之后,我们可以将每条路径添加到图形中:
最后,让我们指定地图的布局:
因为我们希望将地图显示为 HTML 文件,所以我们还需要一行代码:
*fig.write_html(file=**f'{**title**}.html'**, auto_open=**True**)*
就是这样!这正如预期的那样起作用,但是只有当纬度/经度数据局限于美国时。为了让它对不同种类的底层数据(比如欧洲的位置)有更好的响应,我们需要做一个小小的改变。
一般数据
如果你仔细观察上面的代码,你会发现在layout
字典中,我们指定了scope='usa'
。根据 Plotly 的文档 , scope
接受以下值之一:
**"world" | "usa" | "europe" | "asia" | "africa" | "north america" | "south america".**
为了决定使用什么范围,我们应该查看数据中纬度和经度的范围。
然后,我们可以将我们的范围与每个范围的大致范围进行比较,以决定使用哪一个(我通过在线搜索找到了它们——它们应该很好地服务于我们的目的。)
剩下要做的就是改变layout
的scope=scope
,我们就完成了。
瞧啊。我们完了。让我们在两个不同的数据集上测试这个方法。
这是一张用户数据的地图:
这是一张来自欧洲的照片:
注意,这个博客的样本数据和更详细的代码可以在 GitHub 上找到。
我希望这篇博客对你有用。可以通过Twitter和LinkedIn联系到我,我欢迎任何反馈。
如何创建文件、文件夹和子文件夹的列表,然后导出为 Excel
一个生产力工具玛丽近藤你的文件夹
照片由 Pranav Madhu 在 Unsplash 上拍摄
你能为我们的项目文件夹创建一个文件、文件夹和子文件夹的列表吗?
这个请求看起来似乎很简单,但是你已经可以想象一旦这个列表的第一个版本完成,可能会出现的其他修改。
你还能列出文件类型并给文件添加超链接吗?或许还可以增加文件的大小?
根据文件夹的大小、文件数量及其嵌套程度,您可以选择手动完成此任务,因为添加新字段可能很简单。现在,让我们考虑另一个请求:
我重新整理了一些文件夹,重命名了一些文件,你能更新一下列表吗?
别担心,蟒蛇来救你了!
os.walk()
是主函数,我们将使用它来创建一个脚本来遍历主文件夹并列出所有子文件夹和文件。python 文档的链接是这里是。下面是代码的主要部分:
df = pd.DataFrame(columns=['File','File Type',
'Folder Location','Link', 'Path'])for root, dir, files in os.walk(path):
files = [f for f in files if not f.startswith('~') and f!='Thumbs.db']
paths = [os.path.join(root, f) for f in files]
exts = [os.path.splitext(f)[1][1:] for f in files]
filetypes = [ext_desc(ext) for ext in exts]
file_links = ['=HYPERLINK("{}","link")'.format(p) if len(p) < 256 else '' for p in paths]
folders = [os.path.dirname(p) for p in paths]
df1 = pd.DataFrame({'File': files,
'File Type': filetypes,
'Folder Location': folders,
'Link': file_links,
'Path': paths})
df = df.append(df1)
完整的代码可在故事的结尾。
代码解释:
1.创建一个空的数据框架,其中所需的列按所需的顺序排列:
df = pd.DataFrame(columns=['File','File Type',
'Folder Location','Link', 'Path'])
2.启动for
循环:
for root, dir, files in os.walk(path):
path
是指我们感兴趣的主文件夹路径。os.walk
返回一个元组root
、dir
和files
。为此我们只需要root
和files
。
3.用列表理解来构建每个专栏
# 'Files' columns
files = [f for f in files if not f.startswith('~') and f!='Thumbs.db']
临时文件以波浪号~
开始,包含这些可能没有意义,因此 list comprehension 有一个if
条件来排除这样的文件。类似地,Thumbs.db
只是一个缩略图文件,并被明确排除。
# 'Path' column
paths = [os.path.join(root, f) for f in files]
paths
是指向每个子文件夹中特定文件的路径列表。
文档推荐使用os.path.join
而不是字符串连接,这里有一个 stackoverflow 回答为什么推荐这样做。
# 'File Type' column
exts = [os.path.splitext(f)[1][1:].lower() for f in files]
filetypes = [ext_desc(ext) for ext in exts]
exts
是通过使用os.path.splitext()
形成的扩展名列表,它返回一个没有扩展名和扩展名的文件名元组。**
>>> os.path.split('some_filename.pdf')
('some_filename', '.pdf')
[编辑]以前,我通过右分裂rsplit
文件名得到扩展名。exts = [f.rsplit('.',1)[-1].lower() for f in files]
这不是一个好的做法。
filetypes
是文件类型列表,ext_desc
是将每个扩展名映射到适当名称的函数。
def ext_desc(ext):
d_ext_desc = {'xlsx':'Microsoft Excel File',
'docx':'Microsoft Word Doc'}
# additional extensions and descriptions can be added to d_ext_desc try:
desc = d_ext_desc[ext]
except KeyError:
desc = '' # Any file extensions not mapped will be empty.
else:
pass
return desc
添加文件链接的方式略有不同。
file_links = ['=HYPERLINK("{}","link")'.format(p) if len(p) < 256 else '' for p in paths]
=HYPERLINK()
是一个 Excel 公式,在给定链接位置(可以是网页或文件位置)时创建超链接。第二个参数link
是可选的,用于缩短显示的文本。if
条件len(p)<256
是 Excel 中的一个限制,超过 255 个字符的链接无效。
# Folder column
folders = [os.path.dirname(p) for p in paths]
folders
是一个文件夹列表,告诉我们每个文件的位置。这是通过使用os.path.dirname()
方法获取路径的目录名获得的。
[已编辑]之前,我使用folders = [p.rsplit('\\',1)[0] for path in paths]
来获取文件夹。同样,这不是一个好的做法。
4.附加到原始数据帧
df1 = pd.DataFrame({'File': files,
'File Type': filetypes,
'Folder Location': folders,
'Link': file_links,
'Path': paths})
df = df.append(df1)
由于每个列表理解都是一列,剩下的工作就是构建一个数据帧并附加到原始数据帧上。使用df.to_excel('some_filename.xlsx')
可以将最终的数据帧写入 Excel
5.将其推广以备将来使用
- 如果文件夹包含大量文件,生成完整的文件索引需要时间,因此当记录数量超过 500 时,我在
for
循环中添加了一个关键字参数。这在添加新列或修改最终输出的外观时特别有用,因为您不会希望遍历成千上万个文件才意识到最后几行代码中存在输入错误。 - 在脚本中修改路径可能会很麻烦,因此我添加了一个
tkinter.filedialog
方法,如果没有提供路径,它会提示用户选择文件夹。
如何创建专业的 Github 数据科学库
存储库结构、记录 jupyter 笔记本和编写信息丰富的自述文件方面的良好实践
马库斯·温克勒在 Unsplash 上的照片
作为一名数据科学家,你将利用许多不同的工具和技术来完成一个项目。Github 是一个出色而重要的工具,它让我们能够管理自己的代码、版本控制,并与其他人合作。不仅是数据科学家,任何为个人或工作项目编程的人都会使用 Github(或另一个 Git 存储库托管服务)。
除了使用存储库来推动您的工作之外,Github 还可以作为您的技术项目的一个很好的投资组合,或者作为您的同事在工作场所阅读您的代码和报告的一个很好的媒介。作为申请数据科学职位的候选人,展示你有项目经验的一个很好的方式是拥有一个到 Github 的链接,潜在的雇主可以在那里看到项目简介、你的代码和你参与的项目的成果。另一种情况是在你工作的公司里,你对一个项目的贡献可能会被一个非技术人员、一个高级技术人员或者一个比你级别低的人看到。对于所有这些不同的人群,你的知识库应该容易理解。
我想从编码实践、有效地使用 jupyter 笔记本以及详细的自述文件等方面来回顾一下如何创建一个优秀的 Github 资源库的技巧和提示。我将在希尔顿酒店 NLP 项目中使用 Github 存储库中的图片。这里有一个链接可以看到完整的知识库:【https://github.com/awesomeahi95/Hotel_Review_NLP
Jupyter 笔记本
Python 是数据科学中主要使用的语言,有许多不同的 ide 可以用来编写 Python 代码,但是要用干净的代码和注释创建一个结构化的报告,Jupyter 笔记本是前进的方向。以下是让您的笔记本更易于访问的一些提示:
使用标记:如果你的代码很长或者很复杂,对你正在编写的代码的标题、副标题和描述进行标记会非常有用。通过这样做,一个非技术人员或者像你一样不擅长编码的人可以理解为什么要采取这样的步骤,以及一些细胞在做什么。
将所有的导入放在顶部:如果有人需要知道什么库、python 脚本或数据集被导入到笔记本中,将它们放在顶部。这使得阅读你的笔记本的人在运行它之前,更容易知道该笔记本运行所需的库或回购文件。
用于导入的单元格
在 Seaborn 海报背景中使用可视化:在数据科学报告中,可视化是必不可少的——还有什么更好的方式来传达你的发现。但是我们可以用 seaborn 的上下文“海报”来改进这些可视化,这使得可视化更加大胆,文字更加清晰。这也使得 matplotlib 可视化看起来更好。
用于更好可视化的代码
使其易于理解和浏览:使用数字如 1.4.2 的副标题可以更容易地遵循笔记本上的步骤。对于给定的笔记本,您可能会对您的数据执行某些任务,如果有一系列单元格完成一项任务,将它们放在一个编号的小标题下有助于在笔记本中上下导航,并准确了解接下来的几个单元格致力于实现什么。
可消化代码的示例
一份报告使用多个笔记本:这可能并不适用于所有项目,因为一些公司可能有特定的编码规则,并且只选择使用一个笔记本,但在其他情况下,这可能非常有用。在构建数据科学项目时,通常有明确的阶段,如 EDA 和建模。对于所有这些阶段,你可以为每个阶段都写一个笔记本。这不仅使它更容易理解,而且其他人可以为特定阶段运行一个笔记本,而不是运行一个单独的长笔记本。
我还建议最后将每个数据框架/数据集或模型保存在笔记本中,并将其保存在 repo 中的数据或模型文件夹中,然后将其导入笔记本中,用于下一阶段。这有助于回到旧版本的操作数据和模型。
项目使用的笔记本列表
为函数和类创建 python 脚本:试着让你的笔记本更有目标性,更多地记录所采取的步骤和原因,因为这些部分是你快速浏览时想要看到的。将函数和类保存在脚本中,这些脚本可以导入到您的笔记本中使用。这并不意味着函数和类不重要,对于评估代码质量的技术人员来说,它们非常重要。所以要确保你的 python 脚本写得很好,并且有详细的文档。
带文档的类
自述文件
就简化和总结项目存储库中正在进行的一切而言,READMEs 是实现这一点的最佳方式。一旦有人打开你的存储库,在文件下,你首先看到的是你的自述文件。这对潜在的雇主,你的非技术同事和你的技术同事来说都是很好的参考。这是你解释你对这个项目的意图的地方,你可以包括为什么要做这个项目的背景。你可以详细说明你的文件的结构,采取的步骤,并添加一些可视化。
陈述你的商业案例:在继续讲述你的所作所为之前,给出一些背景会对任何读者都非常有益。这一部分使结果看起来更令人印象深刻,因为你可以在故事中讲述“过去是什么”,然后项目应该显示“可以做什么”和“如何做”。
商业案例
带导航链接的目录:目录很有用,尤其是当你的自述文件包含大量信息的时候。给读者一个在自述文件中可以阅读的内容的摘要,并且能够跳转到特定的部分,这是一个很大的方便。
目录示例
带有导航链接的文件描述:为每个文件添加一个小的描述也可以极大地帮助读者理解存储库的每个组件做什么或者包含什么。同样,添加链接来简化导航。
文件描述示例
使用下拉框 : Markdowns 可以使用下拉框,当有人想浏览你的自述文件时,这有助于缩短它的长度。您可以选择隐藏一些部分,并选择显示部分,反之亦然。
两种下拉状态的示例
执行摘要:这是自述文件的大部分内容,你可以在其中回顾项目的各个步骤,简要描述你在每个阶段做了什么和发现了什么,并附有可视化效果(图片格式)。确保描述不要太专业,因为自述文件是非技术人员查看您的项目的最佳地方,并且您不希望他们阅读函数中使用的代码细节。
执行摘要的开头
未来的改进:在结果之后,以一部分专用于这个项目的未来工作/改进,和/或关于项目或数据科学的主题,你将来可能计划做的其他事情来结束。
结束自述文件的好方法示例
我希望这能帮助你在 Github 上创建一个好的数据科学项目库。请评论您认为对创建一个好的资源库有用的任何其他技巧和技术。
如何在一行代码中创建一个种族栏动画
也许这不是最优雅的方式,但为了吸引人的标题,这是值得的
长管道 R 命令…有些人喜欢它,有些人不喜欢!
当你想要拍摄一个令人印象深刻的复杂的多米诺骨牌视频时,你是要冒险在完成之前意外地翻转一个立方体,并毁掉整个东西,还是更喜欢将它分成独立的单元,更好地隔离,这也将允许你探索和测试它的功能,而不伤害其他部分?
https://pix abay . com/photos/domino-hand-stop-corruption-665547/
在 R 的情况下,管道操作符,最初来自包马格里特,允许你传递一个对象到下一个函数。所以从技术上来说,你可以在不中断链的情况下,或者通过避免可读性较差的嵌套函数,将对象传递给其他函数。
就像上面的多米诺类比一样,我不认为有一个规则,它应该基于您对使用管道的舒适程度以及您可能具有的其他限制(如连接到数据框的外部源(或其他输入参数)、计算内存等)来自我指导。
建议打破链主要是为了可读性和文档,但就性能而言,可能不需要。这就像在一个长句子中阅读一长串步骤(功能),而没有停下来喘口气。
在下面的例子中,为了便于演示,我创建了一个很长的 R 管道代码行,可以一次性运行。同样,这可能不是最推荐的风格,但为了吸引人的标题和{}中嵌套管道的使用,这种风格值得一试。
JSON_object %>% {setNames(data.frame(.$data), .$columns)}
我使用了新冠肺炎开放数据项目中美国各州的新冠肺炎累计死亡人数。
library(robservable)
library(jsonlite)
library(tidyverse)robservable::robservable(
"[https://observablehq.com/@juba/bar-chart-race](https://observablehq.com/@juba/bar-chart-race)",
include = c("viewof date", "chart", "draw", "styles"),
hide = "draw",
input = list(
data =
fromJSON('[https://storage.googleapis.com/covid19-open-data/v2/epidemiology.json'](https://storage.googleapis.com/covid19-open-data/v2/epidemiology.json')) %>%
{setNames(data.frame(.$data), .$columns)} %>% as_tibble %>%
filter(key %in% c("US", "US_AK", "US_AL", "US_AR", "US_AS", "US_AZ", "US_CA",
"US_CA", "US_CO", "US_CT", "US_DC", "US_DE", "US_FL", "US_GA",
"US_GA", "US_GU", "US_HI", "US_IA", "US_ID", "US_IL", "US_IN",
"US_KS", "US_KY", "US_LA", "US_MA", "US_MD", "US_ME", "US_MI",
"US_MN", "US_MO", "US_MP", "US_MS", "US_MT", "US_NC", "US_ND",
"US_NE", "US_NH", "US_NJ", "US_NM", "US_NV", "US_NY", "US_NY",
"US_OH", "US_OK", "US_OR", "US_PA", "US_PR", "US_RI", "US_SC",
"US_SD", "US_TN", "US_TX", "US_UT", "US_VA", "US_VI", "US_VT",
"US_WA", "US_WI", "US_WV", "US_WY")) %>%
separate(key, c('US', 'state'), sep = '_') %>%
mutate(month = month(date)) %>%
arrange(date, state) %>%
select(id = state, date = date, value = total_deceased) %>%
filter(!is.na(value), value != 0),
title = "COVID-19 deaths count",
subtitle = "Cumulative number of COVID-19 deaths by US state",
source = "Source : Johns Hopkins University"
),
width = 700,
height = 710
)
上面的代码将创建动画,以 HTML 文件格式保存。
HTML 动画文件可以在我的 GitHub repo 找到。下面是从我的屏幕上录制的视频,因此质量下降。
https://share.getcloudapp.com/6quPGBbN作者
这篇博文与我前一天发表的标题与新冠肺炎相关的博文非常相似。虽然侧重点不同,但发布类似帖子的原因是为了测试每个帖子会吸引多少“观众注意力”(掌声和观看次数)。当然,每篇文章都有不同的推广方式:在聚合出版物下发布,LinkedIn,脸书,Twitter,R-bloggers,发布日效应,等等。我很乐意稍后分享我的发现。
如何创建代表性的测试集
使用有代表性的测试数据集**,满怀信心地评估您的模型的性能。**
将数据集分割成训练和测试集通常是机器学习流水线中的第一个处理步骤之一。在这一点上,只有一个不可侵犯的规则:搁置测试数据分割,只有当您的模型准备好进行最终评估时才再次引用它。但是,有没有一种方法可以让我们确信我们所做的拆分是正确的呢?我们如何确定测试集代表我们的总体?
我们必须确保测试集非常接近我们人口的复杂性。我们的验证集也是如此。
在这个故事中,我们讨论两种分裂方法:随机抽样和分层抽样。我们考虑它们的优点,并讨论在特定情况下使用哪一种。这个故事实际上是我发表的关于优秀的实践机器学习的笔记,作者是 Aurélien Géron,作者是 Scikit-Learn、Keras 和 TensorFlow:构建智能系统的概念、工具和技术。
学习率是我每周给那些对 AI 和 MLOps 世界好奇的人发的简讯。你会在每周五收到我关于最新人工智能新闻、研究、回购和书籍的更新和想法。在这里订阅!
数据集
对于这个例子,我们使用 加州房价 数据集。这个数据集对于入门教程来说是极好的,因为它熟悉的性质、很少丢失的值、适度的大小和明确的目标。
该数据集基于 1990 年加州人口普查的数据。任务是在给定一组特征(如房龄、总房间数等)的情况下,预测特定地区房屋的中值。).目标变量或因变量(即中值房价)是一个数值。因此,我们有一个回归任务要处理。
数据集的特性是不言自明的,但是让我们使用pandas
加载 CSV 文件并查看前五行。
我们可以执行更多的方法来获得对数据的感觉,如df.info()
或df.describe()
,而每个数值实例的简单直方图——使用df.hist()
方法——会给我们手中的信息提供更好的图片。但是,由于这不是本文的范围,让我们进入下一步,即将数据集分成训练集和测试集。
随意采样
理论上,创建一个测试集确实很容易;只需随机选择几行——通常是整个数据集的 10%或 20%——并将它们保存在一个新的单独的数据帧中。此外,为了可再现性,我们可以设置一个random_state
数,这样每次我们运行一个实验,都会得到相同的测试集。这也有助于直接比较不同的方法,因为我们选择的每个算法都是在同一个测试集上评估的。
接下来,我们使用由 Scikit 提供的一个方便的方法——Learn命名为train_test_split()
。该方法接受列表、numpy 数组、scipy 稀疏矩阵或 pandas 数据帧。我们还应该提供默认的分割百分比None
和一个random_state
数字。
我们可以看到该方法返回了一个tuple
,我们可以将它直接解包成一个训练和一个测试集。因为我们将一个数据帧传递给该方法,所以得到的训练集和测试集也是数据帧。请记住,默认情况下,该方法首先打乱数据集,然后将其拆分。为了避免这种行为,我们可以将shuffle
属性设置为False
。
通常,如果数据集足够大(特别是相对于属性的数量),随机分割就足够了。但如果不是这样,随机分裂可能会引入显著的采样偏差。
train_set, test_set = train_test_split(df, test_size=.2, random_state=42, shuffle=False)
我们现在有一个随机生成的测试集来评估我们的模型。但是这有什么好处吗?是否代表总体? 嗯,看情况。通常,如果数据集足够大(特别是相对于属性的数量),随机分割就足够了。但如果不是这样,随机分裂可能会引入显著的采样偏差。因此,让我们来看看如何解决这个问题。
分层抽样
假设我们正在美国进行一项调查,记录一个特定州的教育水平和收入中位数。如果我们只询问生活在昂贵地区的人,我们肯定会在样本中引入明显的偏见。因此,我们需要一种方法来选择任何经济地位的人,粗略地接近相应的人口分布。
在我们的例子中,让我们首先检查是否有一个变量与我们的目标变量高度相关。使用pandas.corr()
方法很容易做到这一点。
我们将因变量的结果按降序排列,我们得到median_income
与median_house_value
有很强的正相关性。这肯定是意料之中的事情。
似乎以分层的方式分割数据集,使用median_income
作为类别标签是一个好主意。首先,让我们创建一个新的变量,为这个属性创建类标签。
pd.cut
将根据我们指定的分类创建五个类别,并将它们保存在一个新变量中,我们将其命名为income_cat
用于收入类别。我们现在准备以分层的方式分割我们的数据集。
唯一的变化是我们现在用一个类似数组的对象设置了train_test_split()
方法的stratify
参数,该对象设置了标签类。还有另一种更复杂的方法,在下面的代码示例中指定,用于遗留目的。
无论如何,让我们看看我们做得怎么样。我们将在完整的数据集以及测试样本中检查每个收入类别的比率。
让我们并排比较两个结果。
可以看出我们很亲近。微小的差异真的微不足道。我们现在有了一个测试集,它遵循人口中收入类别的分布!
结论
创建测试集并不总是那么简单。我们必须确保测试集非常接近我们人口的复杂性。我们的验证集也是如此。例如,检查 Scikit-Learn 提供的[StratifiedKFold()](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html#sklearn.model_selection.StratifiedKFold)
方法。
在这个故事中,我们看到了如何以分层的方式将数据集随机分为训练集和测试集。我们使用 Scikit-Learn 库在 Python 中实现了相应的解决方案。最后,我们提供了每种方法的细节和优点,以及何时使用每种方法的简单实用规则。
学习率是我每周给那些对 AI 和 MLOps 世界好奇的人发的简讯。你会在每周五收到我关于最新人工智能新闻、研究、回购和书籍的更新和想法。订阅这里!
我叫 Dimitris Poulopoulos,是希腊比雷埃夫斯大学的机器学习研究员BigDataStack和博士©。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲中央银行、经合组织和宜家等主要客户设计和实施人工智能和软件解决方案。如果你有兴趣阅读更多关于机器学习、深度学习和数据科学的帖子,请在 twitter 上关注我的 中 ,LinkedIn或@ james2pl******
如何在 Azure 函数中创建 Selenium web scraper
了解如何使用自定义 docker 图像创建 Azure 函数,并将其作为 Python 中的 lenium web scraper
A.介绍
Selenium 是自动化 web 浏览器测试的标准工具。最重要的是,Selenium 是一个流行的网页抓取工具。在 Azure 中创建 web scraper 时,Azure Functions 是运行代码的理想选择。然而,默认的 Azure Functions 映像不包含 Selenium 所需的依赖项。在这篇博客中,Azure Functions 中的 web scraper 创建如下:
- 使用 Selenium 创建并部署 docker 映像作为 Azure 函数
- 定期抓取网站并存储结果
更新 2022–08–13:使用最新版本的 Azure Functions,Python 3.10 成功部署代码。Git 回购和博客是最新的。
web scraper 的架构如下所示。
A.构建 Selenium web scaper 的架构(图片由作者提供)
在剩下的部分,我们将讨论在 Azure Functions 中部署和运行 web scraper 的步骤。关于如何保护你的 Azure 功能的详细信息,请看这个博客。有关如何在 Azure 函数中使用 OpenCV 创建自定义 docker 映像的详细信息,请参见此处的和此处的 DockerFile 。
B0。用 Selenium 作为 Azure 函数部署 Azure 函数
基础 Azure 函数映像不包含运行 selenium webdriver 所需的 chromium 包。这个项目创建了一个定制的 docker 图像和所需的库,这样它就可以作为 Azure 函数运行。执行以下步骤:
- B01。安装必备组件
- B02。从 GIT 克隆项目
- B03。使用 docker 桌面创建 docker 图像
- B04。创建 Azure 函数并部署 docker 映像
另请参见下面的架构。
B0。运行 Selenium 的 Azure 函数(图片由作者提供)
B01。安装依赖项
需要安装以下先决条件:
- Docker 桌面
- Azure CLI
- Azure 核心工具版本 2.x
- (可选)Visual Studio 代码
- (可选) Azure 容器注册中心(也可以使用 docker hub)
B02。使用 docker 桌面创建 docker 图像
运行下面的命令从 git 克隆项目。如果您没有安装 git,也可以下载并解压缩 zip 文件。
git clone [https://github.com/rebremer/azure-function-selenium.git](https://github.com/rebremer/azure-function-selenium.git)
在此项目中,可以找到以下文件:
- TimeTrigger/init。py: Python 文件,包含抓取网站的所有代码。这个 Azure 函数是时间触发的
- HttpTrigger/init。py:与前面的项目符号相同,但是,这是 HTTP 触发的函数,可以从浏览器运行…
- DockerFile:包含所有命令的文件,用于创建将在下一步中使用的 Docker 映像
B03。使用 docker 桌面创建 docker 图像
运行以下命令,在 Azure 函数基础映像上安装 chrome、chrome 驱动程序和 selenium。命令可以在 Visual Studio 终端或 PowerShell 终端中运行。对于<>、<>,您需要获取可以在访问键选项卡中找到的容器注册中心的凭证。
# Variables
$acr_id = "<<your acr>>.azurecr.io"# Create docker image using docker desktop
docker login $acr_id -u <<your username>> -p <<your password>>
docker build --tag $acr_id/selenium .# Push docker image to Azure Container Registry
docker push $acr_id/selenium:latest
B04。创建 Azure 函数并部署 docker 映像
运行以下命令创建一个 Azure 函数,并从 Azure Container Registry 部署 docker 映像。
# Variables
$rg = "<<your resource group name>>"
$loc = "<<your location>>"
$plan = "<<your azure function plan P1v2>>"
$stor = "<<your storage account adhering to function>>"
$fun = "<<your azure function name>>"
$acr_id = "<<your acr>>.azurecr.io"# Create resource group, storage account and app service plan
az group create -n $rg -l $loc
az storage account create -n $stor -g $rg --sku Standard_LRS
az appservice plan create --name $plan --resource-group $rg --sku P1v2 --is-linux# Create Azure Function using docker image
az functionapp create --resource-group $rg --os-type Linux --plan $plan --deployment-container-image-name $acr_id/selenium:latest --name $fun --storage-account $stor --docker-registry-server-user <<your acr user>> --docker-registry-server-password <<your acr password>>
B1。抓取网站并存储结果
上一步部署的 Azure 函数包含一个时间触发函数和一个 HTTP 触发器函数。在这一部分,该功能将被触发,刮网站和存储结果到一个数据湖帐户。执行以下步骤:
- B11。创建数据湖帐户
- B12。运行 HTTP 触发器功能
另请参见下面的架构。
B1_1。抓取网站(作者图片)
B11。创建数据湖帐户和更新功能
执行以下命令在 Azure 中创建一个数据湖帐户,并更新函数的设置。
# Variables
$rg = "<<your resource group name>>"
$fun = "<<your azure function name>>"
$adls = "<<your storage account>>"
$sub_id = "<<your subscription id>>"
$container_name = "scraperesults"# Create adlsgen2
az storage account create --name $adls --resource-group $rg --location $loc --sku Standard_RAGRS --kind StorageV2 --enable-hierarchical-namespace true
az storage container create --account-name $adls -n $container_name# Assign identity to function and set params
az webapp identity assign --name $fun --resource-group $rg
az functionapp config appsettings set --name $fun --resource-group $rg --settings par_storage_account_name=$adls par_storage_container_name=$container_name# Give fun MI RBAC role to ADLS gen 2 account
$fun_object_id = az functionapp identity show --name $fun --resource-group $rg --query 'principalId' -o tsv
New-AzRoleAssignment -ObjectId $fun_object_id -RoleDefinitionName "Storage Blob Data Contributor" -Scope "/subscriptions/$sub_id/resourceGroups/$rg/providers/Microsoft.Storage/storageAccounts/$adls/blobServices/default"
B12。运行功能
时间触发功能将定期运行,以抓取网站。但是,还有一个 HTTP 触发的功能。获取 URL 后,可以在浏览器中复制并运行它,另请参见下文。
B12_1。运行 HTTP 触发功能(图片由作者提供)
运行该函数后,结果将存储在 data lake 帐户中,另见下文。
B12_2。存储在 ADLSgen2 帐户中的抓取结果(图片由作者提供)
C.结论
Selenium 是一个流行的网络抓取工具。然而,默认的 Azure Functions 映像不包含 Selenium 所需的依赖关系。在这篇博客中,Azure Functions 中创建了一个 web scraper 来安装这些依赖项,如下所示:
- 使用 Selenium 创建并部署 docker 映像作为 Azure 函数
- 定期抓取网站并存储结果
web scraper 的架构如下所示。
C.构建 Selenium web scaper 的架构(图片由作者提供)
如何创建一个简单的冠状病毒仪表板具体到您的国家在 R
了解如何在有限的时间内用 R 构建自己的冠状病毒仪表板。
介绍
新型新冠肺炎冠状病毒是目前最热门的话题。每天,媒体和报纸都在分享几个国家的新增病例和死亡人数,试图衡量病毒对公民的影响,并提醒我们呆在家里以保持安全。每个人都在谈论冠状病毒。
除了政府、媒体和公司在讨论这个问题之外,数据科学家和数据专业人员也在用他们的知识和时间为病毒服务。这导致应用程序、仪表盘、博客帖子、视频、数据集和代码的激增,以这样或那样的方式分析新冠肺炎的扩张及其如何在人群中传播。
冠状病毒的顶级资源
作为一名数据爱好者,我发现了大量关于冠状病毒的资源。然而,这些资源遍布互联网,并且通常被另一种类型的大量信息所隐藏(例如,令人担忧的头条新闻、受感染名人的姓名、炫耀他们如何帮助卫生保健机构的公司等)。).为了解决这个问题,我在之前的一篇文章中收集并分享了我遇到的关于冠状病毒的最佳资源。
注意,本文只分享 R 上的资源,因为 R 是我最喜欢的统计程序,也是我最熟悉的程序。事实上,我几乎每天都使用这个程序,这让我更容易意识到资源背后的复杂性和时间,并欣赏它的质量和潜力。我确信网上还有其他非常有趣的资源(例如约翰·霍普金斯冠状病毒资源中心的最受欢迎的仪表板)。尽管如此,许多人比我更有资格来评判用我不擅长的编程语言制作的资源的质量。
这篇文章让我发现了这么多关于冠状病毒的伟大资源,我不断收到来自世界各地科学家的数据可视化和数据分析,因此我将它们纳入了收集范围。正因如此,它不断提高了系列的质量和完整性。
除了接收 R 资源,读者经常问的一个问题是“我怎样才能自己创建一个仪表板?”或者“我如何构建一个特定于我所在国家的仪表板?”。因此,我认为,如果我创建一个针对我的国家(比利时)的仪表板,并详细说明如何创建它的步骤,会对一些人有所帮助。
关于如何开发这样的仪表板的问题大多来自 R 初学者,因为高级 R 用户很可能知道如何做,或者至少可以很容易地使用我在这里收集的资源作为他们自己工作的灵感来源。此外,为了应对对冠状病毒的狂热,感兴趣的用户非常着急,希望尽快拥有自己的仪表盘。
这些问题让我产生了创建一个简单的仪表盘的想法,而不是一个闪亮的应用。闪亮的应用程序的优势在于它们是交互式的,用户可以通过以用户友好的方式简单地改变一些输入来编辑输出和可视化,而仪表板是静态的,最终用户不能修改。另一方面,仪表板相对于闪亮应用的优势在于它更容易编码,尤其是如果你已经精通 R Markdown 的话。
冠状病毒仪表板:比利时的案例
在我到目前为止看到的所有可视化中,有一个因其简单性而突出,同时也因其完整性和可视化的质量而突出。因此,我决定在 Rami Krispin 已经存在的仪表板的基础上创建一个冠状病毒仪表板(它带有一个允许自由修改和共享的许可证),并对其进行修改,使其适用于比利时。请注意,我还从最初的仪表板中删除了一些可视化和表格,以保持其简单明了。
在进一步阅读之前,这里是我的冠状病毒仪表板适应比利时和以下主要部分的预览:
仪表板分为几个部分,可以在顶部选择:
- 摘要部分提供了关于冠状病毒的关键指标(总病例数、活跃病例数和死亡数),以及一个显示从 2020 年 1 月 22 日到最近可用日期的活跃病例数和死亡数的图表。
- “比较”部分显示了与其他欧洲国家(您也可以通过在代码中替换它们来更改这些国家)的每日新病例数(左图)和病例类型分布(右图)的比较。
- 地图部分显示了确诊病例和死亡病例的世界地图。您可以取消选中一种或多种类型的案例(右上角)并放大或缩小(左上角)以使地图适应您的需求。
- “关于”部分提供了有关数据、仪表板总体情况以及更新频率的更多信息。
我相信这个简单的仪表板很容易适应任何国家(以及从初学者到专家的任何人),并且仍然可以通过一些可视化来传达关于病毒的关键措施。值得一提的是,所有的图都是用{plotly}
包生成的。这个软件包允许通过显示额外的相关信息来增强情节。).
如何创建自己的冠状病毒仪表板
如果您想构建自己的特定于某个国家的仪表板,请遵循以下步骤:
- 打开仪表板这里
- 通过位于仪表盘右上角的“源代码”按钮查看完整代码,或者查看 GitHub 上的代码。复制代码。
- 打开一个新的 R Markdown 文件(
.Rmd
),输入任何标题和作者(反正在下一步都会被替换),选择 HTML 作为输出格式,点击 OK:
4.删除已经存在的所有模板代码,并粘贴您在步骤 1 中复制的代码。
5.确保安装了所需的软件包:
install.packages(c("devtools", "flexdashboard", "leaflet", "leafpop"))
devtools::install_github("RamiKrispin/coronavirus", force = TRUE)
如果 R 问你想更新哪个包,应该没有必要更新它们:键入 3 表示“无”。
6.在代码中,将Belgium
替换为您的国家。以下是数据集中所有可用国家的列表:
阿富汗,阿尔巴尼亚,阿尔及利亚,安道尔,安哥拉,安提瓜和巴布达,阿根廷,亚美尼亚,奥地利,阿塞拜疆,巴哈马,巴林,孟加拉 波黑,巴西,文莱,保加利亚,布基纳法索,Cabo,柬埔寨,喀麦隆,佛得角,中非共和国,乍得,智利【T61 克罗地亚,古巴,塞浦路斯,捷克,吉布提,多米尼加,多米尼加,东帝汶,厄瓜多尔,埃及,萨尔瓦多【T93 冈比亚,格鲁吉亚,德国,加纳,希腊,格林纳达,危地马拉,几内亚,圭亚那,海地, 以色列,意大利,牙买加,日本,约旦,哈萨克斯坦,肯尼亚,韩国,科索沃,科威特,吉尔吉斯斯坦 马耳他,马提尼克,毛里塔尼亚,毛里求斯,墨西哥,摩尔多瓦,摩纳哥,蒙古,黑山,摩洛哥,莫桑比克 阿曼,巴基斯坦,巴拿马,巴布亚新几内亚,巴拉圭,秘鲁,菲律宾,波兰,葡萄牙,卡塔尔, 塞尔维亚,塞舌尔,新加坡,斯洛伐克,斯洛文尼亚,索马里,南非,西班牙,斯里兰卡,苏丹, 突尼斯,土耳其,乌干达,乌克兰,阿联酋,乌拉圭,乌兹别克斯坦,委内瑞拉,越南,赞比亚,
请注意,如果您的国家/地区由两个或更多单词组成,您需要用反勾号将其括起来(但只能在代码中的一个特定行上,请参见英国的示例):
#----------------------------------------
# Plotting the datadaily_confirmed %>%
plotly::plot_ly() %>%
plotly::add_trace(
x = ~date,
y = ~`United Kingdom`,
type = "scatter",
mode = "lines+markers",
name = "United Kingdom"
) %>%
不要在代码的其余部分添加反勾号,因为其他地方的国名都用双引号""
括起来。
不要忘记更改文档顶部的标题和作者,并编辑文档底部的“关于”部分。最后但同样重要的是,正如你在摘要部分的图上看到的,箭头指向比利时不同的(sad)“里程碑”(即首例、首例死亡和新的遏制措施)。您需要为您的国家修改这些里程碑(如果您不想在图上显示任何里程碑,则删除它们)。在plotly::add_annotations()
函数之后的代码中对此进行更改。
7.编织文档(如果您不熟悉 R Markdown,请参见此文章)。您的仪表板应该以 HTML 格式出现。
按照这 7 个步骤,您应该已经有了一个针对您所在国家的简单仪表板。我有意让它保持简单,这样每个人都可以在有限的时间内复制它并拥有自己的仪表板。
如果您熟悉用于仪表板界面和可视化的[{flexdashboard}](https://rmarkdown.rstudio.com/flexdashboard/)
、[{plotly}](https://plot.ly/r/)
和[{leaflet}](https://rstudio.github.io/leaflet/)
包,以及用于数据操作的[{dplyr}](https://dplyr.tidyverse.org/)
和[{tidyr}](https://tidyr.tidyverse.org/)
包,请根据您的需要随意编辑代码并改进您的仪表板。
附加注释
数据
这个仪表板的输入数据是从[{coronavirus}](https://github.com/RamiKrispin/coronavirus)
R 包中获得的数据集。确保下载软件包的开发版本,以获得最新数据:
install.packages("devtools")
devtools::install_github("RamiKrispin/coronavirus")
要用最新的数据更新您的仪表板,您必须通过用devtools::install_github("RamiKrispin/coronavirus", force = TRUE)
重新安装{coronavirus}
包来手动更新数据。同样,如果 R 问你是否想更新其他包,输入 3 表示“无”。
这个问题经常被提出,所以我重复一遍,你的仪表盘不会每天自动更新,你需要手动更新。更新数据后,您可能还需要重新启动 R 会话,以便获得最新的可用数据。
原始数据来自约翰·霍普金斯大学系统科学与工程中心(JHU·CCSE)的冠状病毒库。
开放源码
这个仪表盘和 GitHub 上的代码都是开源的,所以你可以随意复制、改编和分享。
准确(性)
请注意,该仪表板主要用于教育目的。我尽可能频繁地更新仪表板,以保持其准确性。然而,关于新冠肺炎病例数存在一些不确定性,并且检测方法因国家而异,因此该仪表板上的数字与其他来源相比可能略有不同。目前,数据集的维护者每天都会更新它,但是将来更新的频率可能会降低。
发布您的仪表板
如果您想要共享您的仪表板,您可以:
- 如果你有,把它上传到你的网站上(如果你还没有,我强烈建议你创建一个)
- 通过 RPubs 发布(直接从 RStudio 发布你的作品是免费且容易的)
感谢阅读。我希望这篇文章能帮助你在 R 中建立你的第一个冠状病毒仪表板。如果你需要灵感来进一步增强你的仪表板,请查看这些关于冠状病毒的顶级 R 资源。
和往常一样,如果您有与本文主题相关的问题或建议,请将其添加为评论,以便其他读者可以从讨论中受益。
相关文章:
- 比利时的新冠肺炎
- 关于新型新冠肺炎冠状病毒的前 25 个 R 资源
- 如何手工进行单样本 t 检验,并对一个均值进行 R:检验
- 每个数据科学家都应该知道的概率中的 9 个概念和公式
- 学生的 R 和手工 t 检验:如何在不同场景下比较两组
原载于 2020 年 3 月 23 日 https://statsandr.com。
如何在简历中创建一个时间线
简历时间线说明了你的教育、工作和额外活动的关键信息。
照片由hello queue拍摄
介绍
在这篇文章中,我将展示如何在简历中创建一份简历时间表。简历时间表展示了你的教育、工作经历和额外活动等关键信息。与普通简历相比,简历时间线的主要优势在于,它们通过视觉上的吸引力和更容易浏览,让你立刻脱颖而出。它还可以让你更好地展示你的“故事”,展示你的工作和活动的年表,从而解释你是如何走到今天的。(它也可以是你作品集的一部分,展示你的 R 技能。)
下面我们用一个最小的可重复的例子来展示如何在 R 中创建这样的 CV。请随意使用代码,并根据您的需要进行调整。更完整的例子(连同代码)你可以在这里查看我自己的 CV 时间轴。
请注意,我是在阅读了 Bernardo Lares 的这篇原帖之后写的这篇文章,特别是他的包,即[{lares}](https://github.com/laresbernardo/lares)
包。特别感谢他的惊人工作,他的工作被用来创建一个稍微修改过的版本的[plot_timeline()](https://github.com/laresbernardo/lares/blob/master/R/other_plots.R#L19)
函数!
最小可重复示例
下面是一个最小可重现示例的代码和结果:
如何个性化它
如果你想用你自己的学术、额外和工作经验来编辑这个例子,你基本上只需要编辑上面代码中名为cv
的数据框架。数据集cv
的每一行都是不同的学术项目、工作或活动。各行应包括:
- 学术项目、职称或活动的名称
- 大学、学校、公司或工作场所的名称
- 类别:学术、工作经验或额外
- 开始日期(日期必须采用
yyyy-mm-dd
的格式) - 结束日期。如果角色尚未结束,请键入
today
而不是日期。通过使用today
,您的简历时间线将自动适应今天的日期
如果要添加或删除角色,请在数据框架中添加或删除一行。如果您不想指定任何工作场所,请注明NA
(如同对Extra3
所做的那样)。最后,不要忘记在代码末尾的时间线副标题中用你的名字替换我的名字。
有经验的 R 用户不妨根据自己的需求编辑plot_timeline2
功能。然而,如果你对这个例子的模板和设计感到满意,你只需要改变上面提到的东西。
附加说明
除了直接在脚本中根据您的角色编辑代码,您还可以创建一个包含所需数据(职位、工作场所、类型、开始日期、结束日期)的 Excel 文件,然后将其导入 R 。编辑 Excel 文件更容易,也不容易出现编码错误。此外,如果您的职业生涯很长,代码可能会变得很长,而如果您导入 Excel 文件,它将始终保持简短和简洁。
感谢阅读。我希望这篇文章能帮助你在简历中建立一个时间表。如果你想看一个更完整和生动的例子,请看我的时间表简历。
和往常一样,如果您有与本文主题相关的问题或建议,请将其添加为评论,以便其他读者可以从讨论中受益。
特别感谢 Job N Nmadu 教授关于创建保存数据的文件的建议。
相关文章:
- 安装和加载 R 包的有效方法
- 我的数据符合正态分布吗?关于最广泛使用的分布以及如何检验 R 中的正态性的注释
- R 中的 Fisher 精确检验:小样本的独立性检验
- R 中独立性的卡方检验
原载于 2020 年 1 月 26 日 https://statsandr.com。
如何用 Python 创建天气警报系统
根据预测的天气数据发送电子邮件通知
Johannes Plenio 在 Unsplash 上拍摄的照片
通过阅读这篇文章,您将学会用 Python 创建一个天气警报系统,当它预测未来几小时内天空将下雨/下雪时,将向多个收件人发送电子邮件通知。电子邮件通知包含其他信息,如预测的温度和湿度。
本教程有 4 个部分:
- 设置
- 履行
- 结果
- 结论
让我们进行下一部分。
1.设置
天气 API
我将使用 ClimaCell 的 天气 API 来获取天气预报数据。它提供了相当多的有用和准确的数据,取决于你的需要。
在撰写本文时,它涵盖了过去 4 周的历史气象站数据以及未来 15 天的每日预报数据。此外,您可以轻松地实现它,因为官方文档提供了 4 种不同计算机语言的参考:
- Java Script 语言
- 红宝石
- 结节
- 计算机编程语言
一旦你注册了,你将被置于免费层,允许你每天打 1000 个电话,每小时 100 个。对于我们的用例来说,这应该足够了。
去注册一个新账户。完成后,您应该会看到下面的仪表板,其中概述了计划详情和您的通话活动。
作者图片
记下 API 键,因为我们将在后面的代码中使用它。
电子邮件配置
我将使用个人Gmail
账户通过SMTP
给自己发送电子邮件。为了使用它,您需要在帐户设置中更改配置,并打开Less secure app access
。
转到帐户设置,点击安全菜单。
作者图片
按如下方式打开Less secure app access
作者图片
完成后,在项目的根目录下创建一个名为config.ini
的新文件。它将被用作我们项目的配置文件。将以下代码追加到其中。
[email]
email=your_email@gmail.com
host=smtp.gmail.com
port=587
password=your_password
email
—您的电子邮件帐户名称host
—SMTP 服务器的主机名。根据电子邮件的 smtp 服务器对此进行修改port
—SMTP 服务器的端口。根据电子邮件的 smtp 服务器对此进行修改password
—您的电子邮件帐户的密码。确保不要将此文件或信息透露给其他人。
Python 模块
对于这个项目,强烈建议创建一个虚拟环境。在终端运行以下命令安装configparser
模块。这对于从文件中加载配置设置非常有用。
pip install configparser
让我们转到小节部分,开始编写 Python 代码。
2.履行
在与config.ini
相同的目录下创建一个名为weather_email.py
的新文件。这个文件作为我们应用程序的电子邮件模块。
导入
在文件顶部添加以下导入声明
try:
import configparser
except:
from six.moves import configparserimport smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import requests
接下来,创建一个字典,代表下雨或下雪时我们将要发送的消息。您可以基于您的用例创建您自己的映射或定制消息。
weather_dict = {'freezing_rain_heavy': 'Heavy rain and snow', 'freezing_rain': 'Rain and snow', 'freezing_rain_light': 'Light rain and snow', 'freezing_drizzle': 'Light drizzle and snow', 'ice_pellets_heavy': 'Heavy ice pellets', 'ice_pellets': 'Normal ice pellets', 'ice_pellets_light': 'Light ice pellets', 'snow_heavy': 'Heavy snow', 'snow': 'Normal snow', 'snow_light': 'Light snow', 'tstorm': 'Thunder storm', 'rain_heavy': 'Heavy rain', 'rain': 'Normal rain', 'rain_light': 'Light rain'}
天气 API 的设置
初始化以下变量,这些变量是我们调用天气 API 时所需要的。
url = "[https://api.climacell.co/v3/weather/nowcast](https://api.climacell.co/v3/weather/nowcast)"querystring = {"lat":"1.29027","lon":"103.851959","unit_system":"si","timestep":"60","start_time":"now","fields":"temp,humidity,weather_code","apikey":"xxxx"}
我们将调用 nowcast API ,它有以下可以修改的参数:
作者图片
lat
—纬度,-87°至 89°lot
—经度,-180°至 180°unit_system
—单位制,“国际单位制”或“美国单位制”timestep
—以分钟为单位的时间步长,1 到 60。将start_time
设置为 now,将timestep
设置为 60 将返回 7 个数据点。(现在,60 分钟后,120 分钟后,…)start_time
—您可以设置自己的时间或将其初始化为现在end_time
—限制结束时间的可选参数。默认情况下,它将返回自当前时间戳起 6 小时内的数据。fields
—从提供的数据层中选择的字段(如“降水”或“阵风”)。我在本教程中使用temp
、humidity
和weather_code
。apikey
—来自 Climacell 气象 API 仪表盘的 API 键。
EmailSender 类
我们将创建一个名为EmailSender
的新类,并将其初始化如下。我们利用configparser
模块从config.ini
读取数据,并将其分配给相应的变量。
def __init__(self):
self.cf = configparser.ConfigParser()
self.cf.read('./config.ini')
self.sec = 'email'
self.email = self.cf.get(self.sec, 'email')
self.host = self.cf.get(self.sec, 'host')
self.port = self.cf.get(self.sec, 'port')
self.password = self.cf.get(self.sec, 'password')
在名为SendEmail
的类中创建另一个函数,它接受一个接受者参数。它接受列表而不是字符串。这允许我们向多个电子邮件地址发送相同的电子邮件通知。
def SendEmail(self, recipient):
在函数内部,用下面的代码初始化一个新的MIMEMultipart
对象
title = "Home Sweet Home"msg = MIMEMultipart()
msg['Subject'] = '[Weather Notification]'
msg['From'] = self.email
msg['To'] = ', '.join(recipient)
打电话给气象 API
下一步是通过请求模块调用 API,该模块将以 json 的形式返回结果。
response = requests.request("GET", url, params=querystring)
result = ""json_data = response.json()
您可以充分利用结果并将其映射到我们在上面指定的字典,以便创建所需的通知消息。然后,用它初始化一个MIMEText
对象,并将它附加到MIMEMultipart
对象上。最后,调用smtplib.SMTP
上下文管理器发送电子邮件。
msgText = MIMEText('<b>%s</b><p>%s</p>' % (title, result), 'html')
msg.attach(msgText)with smtplib.SMTP(self.host, self.port) as smtpObj:
smtpObj.ehlo()
smtpObj.starttls()
smtpObj.login(self.email, self.password)
smtpObj.sendmail(self.email, recipient, msg.as_string())
查看以下要点获取完整代码。
您的根目录中应该有以下文件。
- config.ini
- 天气 _ 电子邮件. py
您可以在任何 Python 应用程序中轻松触发电子邮件提醒功能,只要这两个文件与您调用的 Python 文件位于同一个目录中。只需根据您的用例修改导入语句。以下示例概述了在未来 6 小时内下雨或下雪时向两个收件人发送电子邮件通知的代码。
import weather_emailemail_obj = weather_email.EmailSender()
email_obj.SendEmail(["email@gmail.com", "email2@gmail.com"])
结果
让我们看看我运行测试时的结果。我收到一个通知,告诉我我家正在下小雨。
作者图片
雨一停,我就运行同样的代码,它预测 6 小时后还会下雨。也许我应该回去,在下雨之前把我所有的衣服从晾衣架上拿走。
作者图片
结论
让我们回顾一下今天所学的内容。
我们从注册获取访问天气数据的apikey
开始,并更改Gmail
中的安全设置以允许Less secure app access
用于我们的教程。此外,我们还创建了一个简单的配置文件来存储电子邮件认证数据。
接下来,我们实现了一个 Python 模块,该模块将调用天气 API,并在未来 6 个小时内无论何时有雪或雨时发送电子邮件通知。
到目前为止,您应该能够基于您拥有的用例创建自己的天气警报系统。感谢您阅读这篇文章,希望在下一篇文章中再次见到您!
参考
如何创建天气聊天机器人
集成 Rasa 堆栈的 React 天气聊天机器人
达拉斯·里德在 Unsplash 上拍摄的照片
通过阅读这篇文章,你将学会创建和部署你自己的天气聊天机器人。在本教程结束时,你应该有一个基本的聊天机器人,可以在用户询问时对当前的天气、温度和湿度做出适当的响应。
本教程有 4 个部分:
- 天气 API
- 罗砂
- 基于 React 的聊天室组件
- 结论
让我们进入下一部分
1.天气 API
为了获取天气数据,我将使用 ClimaCell 的天气 API 。它有一个免费层,每天最多可以打 1000 个电话,每小时 100 个电话,这对我们的使用案例来说绰绰有余。
前往登录页面并注册。登录到主页后,您应该会看到下面的仪表板。
作者图片
记住 API 键,因为我们稍后会用到它。
让我们继续下一部分,开始使用Rasa
stack,这是一个开源的机器学习框架,用于自动化基于文本和语音的对话。
2.罗砂
装置
强烈建议您在继续安装软件包之前创建一个虚拟环境。通过以下命令安装Rasa
。
pip install rasa
通过运行以下命令,验证您已经安装了该模块
pip show rasa
初始化
确保终端位于项目目录的根目录下。通过运行以下命令初始化示例数据集:
rasa init
当它提示训练时,选择No (n)
,因为我们稍后需要再次训练它。目录中应该有以下文件。
作者图片
端点
取消对endpoints.yml
中 action_endpoint 代码的注释
action_endpoint:
url: "[http://localhost:5055/webhook](http://localhost:5055/webhook)"
NLU
在nlu.md
中添加一个名为ask_weather
的新意图。提供几个里面的例子
## intent:ask_weather
- what is the weather now
- may i know the weather
- is it sunny outside
- is it raining now
领域
完成后,将domain.yml
中的内容更改为以下内容。你可以在下面的要点中找到完整的代码。
故事
在stories.md
中追加以下代码。
## weather
* ask_weather
- action_ask_weather
行动
如下更新actions.py
中的代码。你可以在下面的要点中找到完整的代码。
您需要根据您的用例为querystring
修改一些参数。我使用了当前位置的纬度和经度。我还指定了额外的字段,如temp
和humidity
。请随意相应地修改它。
lat
—纬度,-59.9 至 59.9lot
—经度,-180°至 180°unit_system
—单位制,“国际单位制”或“美国单位制”fields
—从提供的数据层中选择的字段(如“降水”或“阵风”)apikey
—来自 Climacell 气象 API 仪表盘的 API 键。
训练 Rasa 模型
接下来,我们将通过以下命令来训练它
rasa train
它可能需要一些时间来训练,您应该会看到一个名为 models 的新文件夹,其中包含一个以tar.gz
结尾的文件。
运行 Rasa 和操作服务器
下一步是运行Rasa Server
和Action server
。让我们从Action Server
开始。在现有终端中,运行以下命令启动操作服务器。它将默认为端口 5055。
rasa run actions
您应该在终端看到以下输出
作者图片
打开一个新的终端,激活同一个虚拟环境。将目录更改为与上一个终端相同的目录。运行以下命令启动服务器。默认端口是 5005。
rasa run --enable-api --cors "*"
需要cors
以允许安全的数据传输,并防止您获得跨源资源共享错误。终端将显示以下输出。对于 Windows 用户,需要使用双引号来确保CORS
注册正确。
作者图片
让我们继续下一部分,实现天气聊天机器人的 UI。
3.基于 React 的聊天室组件
对于本教程,我将使用一个由Scalableminds
团队开发的现成的 UI 框架。前往下面的 github 库并将其克隆/下载到您的机器中。将其解压缩,并将所有文件放在与Rasa
文件不同的目录中。
github 官方页面提供的说明是基于yarn
的,但我将在本教程中使用npm
。
确保你已经在你的机器上安装了Node.js
。打开一个新的终端,更改到package.json
所在的chatroom-master
根目录。修改package.json
中第 35 行的代码
"prepare": "yarn build",
到
"prepare": "npm build",
当且仅当您使用npm
来安装软件包时,才需要此修改。
装置
接下来,运行以下命令来安装必要的模块。
npm install //for npm user
yarn install //for yarn user
它将创建一个名为node_modules
的新文件夹,并在其中安装所有列出的包。
在chatroom-master
中应该有以下文件和文件夹
作者图片
建设
在构建文件之前,确保 Rasa 服务器使用端口 5005。如果您正在使用其他端口,您需要更改index.html
中的第 18 行。
host: "[http://localhost:5005](http://localhost:5005)",
通过运行以下命令来构建文件。
npm run build //for npm user
yarn build //for yarn user
服务
它将创建一个名为 dist 的新文件夹,并在其中创建所需文件的缩小版本。之后,你可以简单地通过跑步来发球
npm run serve //for npm user
yarn serve //for yarn user
您应该在控制台上看到以下输出
作者图片
打开浏览器并转到以下 url
[http://localhost:8080/index.html](http://localhost:8080/index.html)
它应该加载 chatbot 界面供您测试。目前,它只能回答基本的问题,并为您提供天气信息。
作者图片
4.结论
祝贺您完成教程。让我们回顾一下今天所学的内容。
我们从注册获取访问天气数据的apikey
开始。
然后,我们继续安装必要的包,比如Rasa
。我们修改了数据集,增加了额外的意图和天气故事。一旦我们完成培训,我们就开始Action Server
和Rasa Server
。
对于聊天机器人 UI,我们使用了一个基于 React 的组件,并通过npm run serve
正常提供服务。您可以根据自己的偏好和用例轻松扩展和修改它。
感谢你阅读这篇文章。希望在下一个教程中再见到你!