成为 BigQuery 超级用户
帮助你让这种野兽工作的 5 个技巧
BigQuery 是 Google 的分析数据库,它查询大型数据集的速度快得惊人,并且可以让你免费使用。在编写本报告时,处理的前 1TB 数据是空闲的,存储的前 10GB 数据是空闲的。在这篇文章中,我将向你展示一些技巧,告诉你如何充分利用这个神奇的系统。
BigQuery 是一个分布式系统,它将分布式存储与一个计算集群结合在一起,该集群(通常)会向您的查询并行抛出 2000 个或更多的插槽(vCPUs)。使用这些提示来很好地利用这种力量。
提示#1:使用 Unnest 动态生成测试数据
你会在文档中经常看到这种情况,但可能会让新读者感到困惑。
UNNEST函数让您可以像查询一个表一样查询一个数组字段。数组的每个元素都成为表中的一行。如果数组包含基元类型,结果表将有一列。在下面的示例中,每个数组元素都是一个 STRUCT 字段,它转换为表中的列。
作者图片
提示 2:一次使用 CTE 和多个语句
不要打开多个 BigQuery 控制台窗口,每个窗口都有自己的查询,而是在同一个控制台窗口中编写多个语句,并用分号分隔。您可以通过选择一个或多个查询并点击RUN
来单独执行,或者不选择任何内容,然后一次性运行。
作者图片
公共表表达式(cte)对于充分利用 BigQuery 强大的多级聚合分析能力也非常有用。这涉及到 SQL WITH
关键字来定义层内存中的临时表,这些表可以随意连接和选择。
提示 3:使用变量
变量可以帮助您将文字分布在多个语句中,并使查询更容易重用。这对于在多个查询或公共表表达式(cte)之间保持日期范围过滤器非常有用。
提示#4:用户定义的函数
除了已经嵌入 BigQuery 的许多函数之外,您还可以定义自己的临时或持久函数。函数可以用 SQL 或 Javascript 编写。后者对于从解析 JSON 到解码 URL 的任何事情都非常方便。让这些计算节点与您的自定义函数一起工作!
请记住,您不能导入模块,但可以引用存储在您的 Google 云存储桶中的库文件。
下面是两个 JS UDF 的例子,一个是利用存储在 GCS 中的库的持久函数,另一个是对数组进行集合操作的临时函数。
JS UDF 示例
提示 5:存储过程
存储过程为您提供了脚本功能,允许您使用 if 和 while 语句控制执行流。
结果如下。很明显,这种能力对于数据转换和重构非常有用。
作者图片
结论
BigQuery 是一个非常强大的数据仓库和分析工具。
- 使用 BigQuery 来利用 SQL 强大的数组和结构类型
- 使用 UNNEST 将数组和结构转换成表
- 将 CTE 用于多级聚合,或者代替高度嵌套的查询,并将多条语句组合在一起执行
- 使用变量来参数化查询或在连续查询之间传递数据
- 使用用户定义函数(UDF)使您的查询片段可重用,或者在查询中利用 JavaScript 的强大功能
- 存储过程可以使常见任务易于重复,并避免代码重复。
它会变得越来越好,所以请关注这个空间,获取更多有用的提示。
2020 年成为数据科学家
改变职业的一步一步指南。
2020 年是学习数据科学并以此为职业的大好时机。无论你的背景如何,这篇文章都是关于成为一名数据科学家需要做的一些实际的事情。开始吧!
2020 年成为数据科学家
这需要一些时间,但你会成功的。
当我刚开始时,我读了所有关于这个主题的书,但我很快意识到其中许多都过时了。
我现在更喜欢接触真实的数据。
如果你想开始数据科学家的职业生涯,是时候开始收集数据了。
现在有比以往更多的信息和工具可以帮助你收集数据——首先是 Kaggle 的公共数据库,GitHub 的开源代码,Reddit 的许多链接和文章,你可以抓取和重复使用。
获得数据科学的实习机会
当然你不一定要创业才能成为数据科学家。另一个自然的方法是找实习。有很多方法可以获得实习机会,但第一种方法是直接联系招聘公司——在 LinkedIn 上搜索你所在地区的招聘人员,然后给他们写信。他们通常愿意帮助你。
第二种方法是寻找那些想雇佣实习生的公司,并与他们接触,看看你是否能得到实习机会。如果你能展示你的作品,电话推销真的有用(再次 GitHub!).查看公司网站,看看他们是否在寻找数据科学家,或者问问已经在数据科学团队工作的人。
你越主动越好。开始在 LinkedIn 上写你的数据科学项目,并在 Medium 上发布帖子,以获得更多的关注。最理想的情况是当招聘人员找上你,而你是他们要选择的人。唯一的方法是将工作投入到你的开源数据科学项目中,并推广你正在做的事情。
如果这不适合你——因为你对如此公开感到不舒服,这很好——那就开始在许多求职网站和团体上寻找实习机会。这是一个员工市场,如果你能展示出你的参与度和热情,你应该能够得到潜在雇主的初次电话或会面。
GitHub 项目组合
首先,你应该在 GitHub 上建立一个开源项目组合。我建议创建三个项目:
- 这是一个分类项目,你可以使用图像/文本的公共数据库(你可以从 Kaggle 下载一个——在下一段中有更多的介绍)对它们进行分类,并通过监督/非监督学习(从 PCA 到神经网络,通过 DBScan,KNN 等)磨练你的技能。).
- 一个 NLP 项目,将分析来自特定主题的推文的情绪,并相应地将它们分类为积极/中性/消极。这是一个经典的问题——选择一个你感兴趣的话题,这样你就有一个好故事来讲述它。
- 一个搜集项目,你从不同的来源搜集信息——如果你是体育迷,可以搜集体育新闻;如果你对金融或数据科学感兴趣,可以搜集金融波动。最终目标可能是创建一个自动化的网站,提供抓取和提取的内容。很容易在面试中表现出来。
如果你更高级,那么你肯定应该尝试最新的机器学习算法。例如,您可以尝试:
- GANs(生成敌对网络)并生成了一些脸或猫。
- 用更简单的游戏强化学习。
- GPT 新协议和文本生成。
你在这里有无限的机会。你一定要展示你精通神经网络和它们的基本原理,比如 Keras,PyTorch,TensorFlow。
一个很棒的资源是 代码为 的论文,它链接了机器学习论文和 Github 代码。这是在机器学习中找到最新发现的非常有效的方法。
知道自己知道什么,不知道什么
即使这听起来显而易见,你也应该能够回答关于你的知识,特别是技术细节或问题的问题。
实际上,你会被问到的最重要的问题是在一个给定的项目中什么是最难的。如果你遇到了一个特殊的技术问题,为什么和它是什么。你是怎么克服的?这些是你应该准备回答的基本问题。
准备好更详细地谈论算法,你过去用过的不同方法。开诚布公地分享你遇到的问题。这只能在求职面试时有所帮助。
润色你的 LinkedIn 个人资料
数据科学家经常忽略的最后一件事是建立一个连贯的 LinkedIn 个人资料,解释你过去做了什么以及你现在在哪里。如果你在职业生涯中有任何空白,确保你会被问到——在巴厘岛冲浪 6 个月没什么错,你应该诚实地说出当时的动机和你想要实现的目标。我认为一个好的理由是你想离开屏幕休息一下,想重新开始,想成为一名数字流浪者——有很多理由可以解释为什么这个选择对你的职业生涯也是最好的。
你还应该向你以前的雇主征求推荐信。他们可以直接在 LinkedIn 上写——只要几句话就够了。如果你的上一次离职不是真的计划好的,你对此感到痛苦,试着解释为什么,以及你对下一任雇主有什么期望。
你应该能够准确地说出你为什么想换工作。是因为你在寻找新的挑战吗?如果有,为什么你现在的工作不能拥有它们?清晰地讲述你以前的工作经历是一笔巨大的财富。
闪耀!
总结起来,要真正掌握数据科学家职位的面试,你应该做 3 件事:
- 构建 GitHub 项目组合;
- 知道每个项目中最难的部分是什么,以及你是如何克服的;
- 润色你的 LinkedIn 个人资料。
我非常喜欢构建自己的开源 GitHub 项目组合,作为一名数据科学家成长的一种方式。在下一章中,我将讨论一系列项目,如果你对实用数据科学感兴趣,你可以自己尝试。
这些肯定会让你被录用!
数据科学工作
这篇文章摘自我的书数据科学工作:如何成为一名数据科学家,它将从头到尾指导你成为一名数据科学家,无论你的背景如何。
*免责声明:以上链接是我的书的附属链接。
成为抒情天才
使用 Spotify 和 Genius APIs 抓取您的 Spotify 播放列表歌词。
照片来源:马尔特·温根(https://unsplash.com/photos/PDX_a_82obo
不幸的是,我不会说唱或写歌,因此我不能教你如何成为那种抒情天才。我擅长的是向你展示如何使用 Spotify 和 Genius APIs 从你最喜欢的 Spotify 播放列表中获取歌词,并从一些网络抓取中获得一点帮助。除了我在这里概述的方法之外,还有很多其他的方法,但是这是我发现的为数不多的免费且可靠的方法之一。代码的一些部分受到了 Will Soares 在 DEV Community 上写的一篇文章的启发,所以如果你觉得这很有用,请点击这里的并表示赞赏。
下面是我创建的 Python 类,GetLyrics
,已经准备好了,可以让你自己试用。只需插入 Spotify 和 Genius APIs 的个人凭据,以及 Spotify 用户和播放列表 id(本文下一节将介绍如何获取所有这些信息),就可以开始了。
从上面的代码片段中可以看到,我们可以在一个列表中得到整个播放列表的歌词,song_lyrics
,只需要两行代码。很好。
获取我们的类参数
我们需要做的第一件事是收集我们所有的输入(GetLyrics
类参数)。为了初始化这个类,我们需要 5 样东西:
- Spotify 客户端 ID
- Spotify 客户端机密
- Spotify 用户 ID
- Spotify 播放列表 ID
- Genius 授权密钥
Spotify 客户端凭据
如果你还没有注册,那么你需要在 Spotify 上注册一个开发者账户。假设你有一个个人 Spotify 账户,你所需要做的就是导航到 Spotify 开发者仪表盘并使用你的 Spotify 账户详细信息登录。
登录仪表板后,您需要创建一个应用程序。即使你没有真正地创建一个应用程序,为了获得你的 API 证书,这也是必需的。给应用程序一个令人兴奋的名字和描述,并勾选所有适用于“你在构建什么?”问题。
应用程序现在应该在您的仪表板上,所以让我们导航到它的页面,并注意客户端 ID 和客户端密码。这些是我们发出请求时需要的 API 凭证。
Spotify 用户和播放列表 id
我们还需要一些与 Spotify 相关的东西。为了告诉 Spotify API 我们对哪个播放列表感兴趣,我们需要为创建播放列表的用户获取一个 Spotify URI,为播放列表本身获取一个。这是通过导航到用户主页和到播放列表,点击三个点,然后点击“分享”——从那里你可以将 Spotify URI 复制到你的剪贴板。
Genius 授权密钥
我们还需要在 Genius API 文档页面点击“授权 Genius ”,创建一个 Genius 帐户。登录后,页面右侧应该会有一个授权代码。
分解类
现在我们已经得到了所有的输入,希望您已经能够自己尝试使用GetLyrics
类,我将提供该类中每个方法的分解,这样您就可以放心地使用这段代码,并修改/改进它以适合您的特定用例。
初始化类属性
和 Python 中的大多数类一样,我们从一个构造函数方法开始初始化我们的类属性,这样它们就可以在下面的方法中使用。
获取播放列表信息
上面的方法使用 Spotipy 库连接到 Spotify API,并返回一个 JSON 对象,该对象包含我们感兴趣的 Spotify 播放列表的大量信息。
获取曲目名称和艺术家
在这两个方法中,我们遍历 JSON 对象来查找播放列表中每首歌曲的名称和艺术家。然后将它们存储并返回到两个列表中,供后面的方法使用。
连接到 Genius API
这个方法使用Requests
库通过我们的授权密钥连接 Genius API。然后,它检查 API 中是否有与给定曲目名称和艺术家相匹配的内容。它返回一个包含与这些匹配相关的所有信息的响应对象。
筛选匹配项并获得歌曲的网址
在这里,我们对前面方法中返回的 JSON 对象进行解码,然后检查哪个“hit”与艺术家姓名完全匹配。如果找到匹配,则意味着该歌曲存在于 Genius API 中,并且该曲目的信息现在存储在remote_song_info
对象中。Genius API 不包含每首歌曲的歌词,但是它包含一个 URL,该 URL 会路由到包含歌词的网页。在下面的代码片段中,我们解析remote_song_info
对象来查找每首歌曲的 URL。
网络抓取歌词
最后,我们现在可以得到一些歌词了!这个方法再次使用Requests
库来请求在前面的方法中获得的歌曲 URL。然后我们使用BeautifulSoup
来解析 HTML。我们两次调用.find()
函数的原因是因为我发现 Genius 网页的结构有时会有不同的格式。大多数情况下,歌词包含在带有class="lyrics”
的div
元素中,但有时会变成class="Lyrics__Container..."
。我加入了一个最终的elif
条件,如果两个歌词对象都是NoneTypes
,那么lyrics
对象将被设置为None
。这种情况很少发生,但这是由于在请求一首歌曲的 URL 时出现 404 错误,可能是因为该 URL 不再存在,但尚未从 API 中删除。
将所有东西包装在一起
最后,这个方法通过依次执行每个方法将所有内容联系在一起,这意味着我们只需两行代码就可以得到我们的歌词。它还有一系列的打印语句来使方法变得冗长,这样您就可以在它执行时跟踪它的进度。
我希望这篇文章对你有用。请在您自己的工作中随意使用这些代码,如果您有任何改进的建议,我很乐意在下面听到它们。感谢您的阅读!
成为一名机器学习工程师(从你的 Jupyter 笔记本里面)
实践教程
管理基础架构,培训您的模型并部署它们。
如果这听起来像是你的梦想,让我告诉你,这听起来也像是产品开发人员的梦想。结果:Azure ML SDK。
今天,我们将探讨如何处理云中的基础架构、环境和部署。我们将深入挖掘概念以及掌握这些技能所需的基础结构。
我知道概念本身可能感觉像空中楼阁。不过不用担心,会有足够多的代码让你觉得城堡其实就在地面上。
请给我上下文
如果我们谈论云提供商,有三个主要的参与者:AWS、GCP 和 Azure。谈到云计算,不难发现他们的主要客户之一是数据科学家。也许不是直接的他们,但是,惊喜!公司仍然是由人组成的。
所以,他们的策略很简单:让数据科学家的生活更轻松。
他们对此都有自己的方法,但今天我们将讨论 Azure。他们开发了 Azure Machine Learning,用它自己的话说就是,“一个基于云的环境,你可以用来训练、部署、自动化、管理和跟踪 ML 模型。
成为一名机器学习工程师
自动化、配置、管理和部署机器学习模型可能是数据科学家的噩梦。正因为如此,对能够填补这一缺口的人的需求增加了。
如果除了模型训练技能之外,你还能处理基础设施,你就离成为机器学习工程师更近了一步。如果你有兴趣跳到这个新角色,与 Azure 机器学习合作可以促进你的转变。
你与所有云基础设施的交互都可以通过 Python SDK 来完成,在你的 Jupyter 笔记本中编写代码会给你第一次做探索性数据分析时的感觉。
妮可·沃尔夫在 Unsplash 上的照片
Azure ML 概述
这听起来很棒,但是它是如何工作的呢?大致来说,有三种方式可以让你与 Azure 机器学习互动:使用浏览器、Azure CLI 和 Python SDK。正如你可能已经预料到的那样,我们将使用后者。
Azureml 包的功能被分成不同的模块。如果您想要执行一个动作,您只需要调用正确的模块并添加您的输入(这将非常直观)。一次非常美妙的经历。
注意:如果你想在你的 Azure Machine Learning 工作空间中设置一个实例并打开一个 Jupyter 笔记本,请访问下面的帖子。
读完这篇文章后,你会明白 Azure ML 是如何处理数据的,MLOps 是如何关联的,并学习如何通过…
towardsdatascience.com](/data-versioning-in-azure-machine-learning-service-acca44a3b3a1)
资源是 Azure 内部结构的一部分。例如,如果您要创建一个工作空间,您只需要使用 Workspace.create() 函数导入工作空间模块,并设置参数。
注意:我知道脚本不在。ipynb 格式。但是我认为。py 格式看起来更干净。我希望这个细节不会让您远离真实的体验:您应该在您的 Jupyter 笔记本中编写代码。
实验意味着封装你的 ML 任务。这是一个很好的方法来分离你不同的假设并测试它们。那么,需要创建一个实验吗?同样,如果你试着猜怎么调用这个模块,我相信你会猜对的。
这两个例子只是让你看看用 Azure 对话有多简单。但是今天,我们将谈论基础设施。在第一部分,我们将创建我们的基础。理解评估者是什么以及他们如何与脚本、环境和计算集群交互,将为我们到达山顶做好准备:部署。
为了探索这个主题,我们将首先访问最常见的部署类型。获得这些知识将教会我们如何为我们的需求选择正确的 Azure 服务。最后,您会惊讶地发现部署您的模型是如此简单。
评估者
评估者是计算目标的抽象。您有许多选项来管理评估者内部的环境。要使用它们,您必须设置不同的参数,但最重要的参数如下:
- 脚本:可以直接指向存放所有模型训练代码的文件。
- 计算目标:这些人将处理您为工作负载定义的工作。
- 环境配置:您可以用不同的方式定义环境参数。因此,所有不同方法的共同点是,您需要选择哪种框架是处理您的工作负载所必需的。
图片作者。Flaticon 引用: 1 、 2 、 3 & 4 。
这三个人为我们提供了多种选择。如果你学会如何将它们结合起来,你将成为一名全能的机器学习专家。
这在现实生活中是如何实现的?
假设您领导一个预测客户流失的项目。该团队使用随机森林分类器基于 scikit-learn 构建了一个完整的项目。由于您的模型不是深度学习模型,因此您选择了 CPU 计算目标。
您的计算目标配置应该如下所示:
这一次,我们选择了一台针对数据库工作负载进行优化的虚拟机。如果您的项目需要其他规格,在这里您可以找到可用的选项。
Azure 计算集群的一个很酷的特性是,默认情况下,它们会根据提交的作业数量进行伸缩。这将导致不可思议的成本优化!。
对我们的随机森林来说足够好了,你不觉得吗?但是不要忘了我们的估算师!
注意:您必须确保数据和脚本在给定的目录中。
SKLearn 是一个预定义的估计器,配备了您最可能需要的标准软件包(pandas、numpy 和 scikit-learn 等)。正如您所看到的,您的模型将在特定的条件下进行训练,您可以在任何您认为合适的时候重新训练它,而不用担心再现性条件。
让自己适应变化
如你所知,生活就是改变。机器学习也是关于改变的。有时您的模型会过时,您将没有其他选择,只能调整您的基础设施以适应这些新的需求。
如果你的团队决定使用 Tensorflow 尝试一种新的深度学习模型会怎样?如果这变得更加真实会怎样:经过一些测试,他们已经意识到,事实上,新的模型比你的旧随机森林更好。不要惊慌失措。如你所见,你的工作可以简化为改变一些参数。
托尼克在 Unsplash 上拍摄的照片
您需要一个新的环境,您必须指向一个不同的脚本,并且您必须为一个 GPU 计算目标更改 CPU。不要生气。你需要对你的剧本做些小改动。
您只需更改虚拟机大小,就可以调配更好地满足您需求的新集群。很棒吧?别担心,我不会忘记评估部分。
如您所见,我们可以使用 TensorFlow 估计器来训练该模型,它也可用于快速设置。此外,我们可以指定框架版本,这对于避免兼容性版本错误非常有用。
此外,我们引用新的 GPU 计算目标,并将引用更改为新的脚本。太棒了。你完了!我甚至不愿去想这样的改变在过去意味着多少工作量。但是现在,它只是几行代码。
最后一个评估示例
在上一节中,我们通过指定 Azure 为我们提供的预配置选项来更改框架。但是,如果我需要的软件包在这些预配置的环境中不可用,会发生什么情况呢?
轻松点。您可以使用 Conda 或 PiPy 规范创建和注册环境。如果你想更深入地了解环境,请点击这里:
甚至不知道如何创建 docker 文件
towardsdatascience.com](/reproducible-environments-by-azure-machine-learning-34a74772c38b)
在下面的代码中,您可以看到一个更加定制化的环境是如何工作的。在这个场景中,我们还需要两个包,Boruta 和一个新版本的 scikit-learn。剩下的代码片段对您来说应该很熟悉。
难以置信!现在,您知道了如何创建自己的定制环境,以及如何自动扩展计算目标。但是,我们不会就此止步。投产是我们的下一站。
部署
在这一部分,我们将达到我们一直期待的戏剧性的高潮:模型部署。如你所知,如果一个东西不能发射,它也不能使用。学习这些概念会为你打开新的视野。管理您认为是 Linux 或 Kubernetes 专家专有的服务,现在对您来说已经变得更加容易了。
蒂姆·莫斯霍尔德在 Unsplash 上的照片
异步实时与同步批量评分
如果您正在考虑项目的需求,第一个区别是至关重要的。实时 web 服务是这样一种类型,它期望相对较小的批量有较快的响应时间。另一方面,批量评分期望较大的批量和较慢的响应时间。
第一个例子可能是 Uber Eats 为您的递送进行的到达时间估计。他们不知道你何时何地会向他们要食物,所以他们无法做好准备。他们一收到订单就必须处理你的信息。
对于后者,可以考虑邮寄定向优惠。他们不需要期待某个特定事件的发生来决定是否给你折扣。他们可以处理大量的信息,并随时向你发送报价。
为什么这种区别如此重要?
因为,根据微软文档,根据用例,你应该选择一个或另一个 Azure 服务进行部署。Azure 机器学习可以用四种不同的方式处理部署:
- **本地 web 服务:**如果您正在调试或者对您的模型进行一些基本的测试,您可以选择在一个计算实例中部署您的模型。
- Azure Container Instance(ACI):当您只想测试您的模型是否持续地抛出合理的值时,这个服务非常适合。它适用于需要不到 48gb RAM 的基于 CPU 的低规模工作负载。如果您的概念验证场景得到了足够的控制,那么这是测试服务是否响应良好的一个好选择。
- Azure Kubernetes 服务(AKS) :如果你正在为一个实时服务构建一个应用,你应该明确地使用这个服务。Kubernetes 的名声不是免费的:GPU 支持、灵活性和可伸缩性是他们的一些主要优势。但是你知道,灵活性总是要付出代价的。AKS 比其他服务需要更多的维护。
- Azure Machine Learning Compute(AML):如果您要进行批量部署,解决方案是使用您用于模型训练的相同计算资源。
图片作者。微软& Flaitcon 参考资料: 1 、 2 、 3 、 4 、 5 & 6 。
够概念!我想现在就部署我的模型!
好吧,如果你现在这么兴奋,你应该得到一个好的结局。
训练完模型后,注册它是非常重要的。注册模型是一个很好的实践的原因有很多:旧模型的可再现性,跟踪您过去的模型度量,或者简单地通过它的版本调用模型。
但我现在提出这个问题是有原因的。我们将用来部署模型的方法使用注册的模型作为输入。我将向您展示“无代码部署”选项,它支持特定的框架。对我们来说,好消息是 scikit-learn 模型得到了支持。
是啊!就这么简单。
使用带有几个参数的 Model.deploy() 是配置部署的最简单方法。在这种情况下,模型将在 Azure 容器注册中心注册。您可以使用 *service.run(),*调用您的服务,如果您更喜欢分类器的整数输出,那么会提供一个参数。否则, predict_proba 输出将是默认选项。
正如我之前向您解释的那样,还有其他方式来部署您的服务,使用这些方式(AKS、AML 计算)将需要提供一些额外的配置。
但我很确定最后一个要点让你大吃一惊,所以我们今天不会讨论其他选项,以便给你时间恢复(如果你支持,我们可以这样做)。
最棒的是,你可以在 Jupyter 笔记本上做任何事情!。
回头见!
今天够了。如果你到了这一步,我希望这能帮助你在你的云游戏中前进。如果你想处理端到端的机器学习项目,这样做是必不可少的。希望很快见到你!
参考
[1]由于这项技术是由 Azure 开发的,我将代码片段基于它们的文档,你可以在这里找到。
[2]这本书掌握 Azure 机器学习对一些细节的结构化澄清很有启发。我真的依赖那本书来创造这些内容。我要感谢 Christoph krner 授权我发表这篇博客,并为此付出了时间。如果你想更好地理解 Azure 机器学习,我真的鼓励你去读那本书。
如今数据量的增长需要分布式系统、强大的算法和可扩展的云…
www.packtpub.com](https://www.packtpub.com/product/mastering-azure-machine-learning/9781789807554)
我也在 Linkedin 和 Twitter 上。我很乐意与你交谈!如果你想多读一点,看看我最近的一些帖子:
[## 想成为 Azure 数据科学家助理(DP-100)吗?让我们
读完本文后,您将对云认证和 DP-100 有更深刻的理解
towardsdatascience.com](/thinking-about-becoming-an-azure-data-scientist-associate-dp-100-lets-32f8766df21e) [## 具有两个以上特征的聚类?尝试用这个来解释你的发现
使用 Plotly 的 line_polar 将向我们展示一种令人兴奋的聚类解释方法。此外,我们将看到…
towardsdatascience.com](/clustering-with-more-than-two-features-try-this-to-explain-your-findings-b053007d680a)
为熊猫超级用户显示自定义
熊猫展示定制是熊猫经常被忽视的一部分。许多用户不知道他们可以自定义与显示相关的选项。
pandas 有一个选项系统,可以让你定制它行为的某些方面,与显示相关的选项是用户最有可能调整的。
熊猫展示定制是熊猫经常被忽视的一部分。对于大多数用户来说,缺省值已经足够好了,但是许多用户不知道显示定制,他们会找到一些替代的麻烦方法来克服它们。要成为熊猫专家,你至少应该知道显示器定制选项。
这里有几个你可能会感兴趣的链接:
- [Labeling and Data Engineering for Conversational AI and Analytics](https://www.humanfirst.ai/)- [Data Science for Business Leaders](https://imp.i115008.net/c/2402645/880006/11298) [Course]- [Intro to Machine Learning with PyTorch](https://imp.i115008.net/c/2402645/788201/11298) [Course]- [Become a Growth Product Manager](https://imp.i115008.net/c/2402645/803127/11298) [Course]- [Deep Learning (Adaptive Computation and ML series)](https://amzn.to/3ncTG7D) [Ebook]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)
上面的一些链接是附属链接,如果你通过它们进行购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。
要升级你的熊猫游戏,请阅读:
从提示和技巧,如何不指南到与大数据分析相关的提示,熊猫文章的精选列表。
medium.com](https://medium.com/@romanorac/pandas-data-analysis-series-b8cec5b38b22)
设置
import os
import platform
from platform import python_versionimport jupyterlab
import pandas **as** pd
import random**print**("System")
**print**("os name: %s" **%** os**.**name)
**print**("system: %s" **%** platform**.**system())
**print**("release: %s" **%** platform**.**release())
**print**()
**print**("Python")
**print**("version: %s" **%** python_version())
**print**()
**print**("Python Packages")
**print**("jupterlab==%s" **%** jupyterlab**.**__version__)
**print**("pandas==%s" **%** pd**.**__version__)seed **=** 42
random**.**seed(seed)
pd**.**np**.**random**.**seed(seed)
让我们定义数据集。它有 100 行和 2 列:
- col1 具有 0 和 1 之间的随机数,
- col2 有由 200 个字符组成的随机句子。
**def** **generate_sentence**(n_chars**=**200):
**return** ''**.**join(random**.**choice('abcdefg ') **for** _ **in** range(n_chars))n **=** 100
df **=** pd**.**DataFrame(
{
"col1": pd**.**np**.**random**.**random_sample(n),
"text": [generate_sentence() **for** _ **in** range(n)]
}
)
df**.**shape(100, 2)
压制科学符号
默认情况下,pandas 用科学(指数)记数法显示小数字和大数字。如果科学记数法不是您的首选格式,您可以用一个命令禁用它。
让我们用一个小数字替换 col1 中的第一个值。熊猫被迫用科学记数法显示 col1,因为数字很小。
df**.**iloc[0, 0] **=** 1e-10df**.**head()
使用 float_format,我们可以设置想要显示的小数位数(在下面的例子中是 10)。
pd**.**options**.**display**.**float_format **=** '{:,.10f}'**.**formatdf**.**head()
使用 reset_option 命令,我们将其重置回科学记数法。
pd**.**reset_option('display.float_format')
要显示的最大列数/行数
当处理更大的数据集时,我们注意到 pandas 并不显示所有的列或行。显然,这是出于性能原因。虽然我不介意隐藏行,但是看不到所有的列(默认限制是 20 列)会令人沮丧。
让我们将行转换为列,以便直观地了解问题。
df**.**T
现在,让我们将最大列数设置为 100。
pd**.**set_option("display.max_columns", 100)df**.**T
要重置最大列数显示,我们可以将其设置回 20。
pd**.**set_option("display.max_columns", 20)
Pandas 还有一个 get 选项可以查看,这个值是当前设置的。
pd**.**get_option('display.max_columns')20
对于行,我们可以用 display.max_rows 做同样的事情。
扩展列宽
通常,在处理文本数据时,由于字符串的长度,字符串只能部分可见。Pandas 使我们能够用 max_colwidth 选项增加列宽。
pd**.**set_option('max_colwidth', 500)
数据帧信息
我相信您熟悉 describe 函数,它输出数据帧中每一列的汇总统计数据。info 选项类似于 meta describe 函数,因为它输出数据帧的元数据,如数据类型、非空对象和内存使用情况。
这在处理大型数据集时非常有用。
pd**.**set_option('large_repr', 'info')df
pd**.**reset_option('large_repr') # reset it
结论
这些是最常用的熊猫显示定制。如果你想了解更多关于显示定制的信息,请阅读 pandas 文档的选项和设置部分。
在你走之前
在推特上关注我,在那里我定期发关于数据科学和机器学习的推特。
照片由Courtney hedge在 Unsplash 上拍摄
通过机器学习成为神奇宝贝大师
能否借助机器学习预测口袋妖怪之战的赢家?
如果你是 90 年代的孩子,你一定看过口袋妖怪。你喜欢强大的口袋妖怪战斗吗?好吧,我做到了。
作为一名人工智能开发者和口袋妖怪粉丝,我想到了建立一个可以预测口袋妖怪战斗获胜者的机器学习模型。
这个故事也将引导你:
1。构建机器学习模型
2。构建 ML 模型时需要的基本步骤。
参考消息:神奇宝贝是日本原版口袋妖怪的简称
下面是我找到并用来建立机器学习模型的口袋妖怪数据集。
https://www.kaggle.com/terminus7/pokemon-challenge
采取以下步骤来建立机器学习模型。
- 数据探索
- 数据预处理
- 模型选择和培训
- 预言;预测;预告
我已经添加了所有代码和各自的输出截图。也可以参考下面的 jupyter 笔记本。
https://github . com/kartikeya-Rana/pokemon _ battle/blob/master/pokemon . ipynb
# Import Librariesimport pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_extraction import FeatureHasher
from sklearn.metrics import classification_report# Load the datasetspokemon = pd.read_csv("pokemon.csv") # Pokemon Dataset
combats = pd.read_csv("combats.csv") # Combats Dataset
数据探索
先来看看口袋妖怪和格斗数据集的前五个词条。
print(pokemon.head())
print(combats.head())
口袋妖怪数据集是由不同的口袋妖怪和他们的能力组成的。
战斗数据集由两只口袋妖怪之间的战斗组成。
“#”号用于口袋妖怪数据集和战斗数据集之间的映射。
# Plot the number of pokemon present in each category of "type 1"ax = pokemon['Type 1'].value_counts().plot(kind='bar',
figsize=(14,8),
title="Number of pokemons based on their type 1")
ax.set_xlabel("Pokemon Type 1")
ax.set_ylabel("Frequency")
# Plot the number of pokemon present in each generation.generation = dict(pokemon['Generation'].value_counts())
gen_counts = generation.values() # No of pokemon in each generation
gen = generation.keys() # Type of generationfig = plt.figure(figsize=(8, 6))
fig.suptitle("Percentage of generation based distribution of pokemon")
ax = fig.add_axes([0,0,1,1])
explode = (0.1, 0, 0, 0, 0, 0) # explode 1st slice
ax.axis('equal')plt.pie(gen_counts, labels = gen,autopct='%1.2f%%', shadow=True, explode=explode)
plt.show()
# Plot the number of legendary and non-legendary pokemongeneration = dict(pokemon['Legendary'].value_counts())
gen_counts = generation.values()
gen = generation.keys()fig = plt.figure(figsize=(8, 6))
fig.suptitle("Percentage of lengendary pokemons in dataset (False: Not Lengendary, True: Legendary)")
ax = fig.add_axes([0,0,1,1])
explode = (0.2, 0) # explode 1st slice
ax.axis('equal')plt.pie(gen_counts, labels = gen,autopct='%1.2f%%', shadow=True, explode=explode)
plt.show()
数据预处理
1。处理丢失的数据:在一个数据集中可能有几个点的值丢失。我们不能让这些地方空着。此外,我不想删除这些样本,因为这会减少我的数据集。
数值可填写该栏中的平均值、中值或最大值。
口袋妖怪数据集的列“类型 2”包含空点。这是一个分类列,因此,我可以用该列中最常见的值来填充缺少的值。
但我选择创建另一个名为 NA 的类别(不适用)。它就像“类型 2”专栏的任何其他类别一样。
pokemon["Type 2"] = pokemon["Type 2"].fillna("NA")
2。分类值到数值:机器学习模型对数字起作用。我们不能给它输入字符串或单词,因此我们必须将每个分类值转换成数值。
有几种方法可以做到这一点,如标签编码器,一个热编码器,功能哈希。
# Convert "Legendary" column, False is converted to 0 and True is converted to 1.pokemon["Legendary"] = pokemon["Legendary"].astype(int)
我使用 FeatureHasher 将列“Type 1”和“Type 2”转换成数值。FeatureHasher 还解决了由于 one-hot 编码而创建的大量列的问题(如果类别的数量非常大)。
h1 = FeatureHasher(n_features=5, input_type='string')
h2 = FeatureHasher(n_features=5, input_type='string')
d1 = h1.fit_transform(pokemon["Type 1"])
d2 = h2.fit_transform(pokemon["Type 2"])# Convert to dataframed1 = pd.DataFrame(data=d1.toarray())
d2 = pd.DataFrame(data=d2.toarray())# Drop Type 1 and Type 2 column from Pokemon dataset and concatenate the above two dataframes.pokemon = pokemon.drop(columns = ["Type 1", "Type 2"])
pokemon = pd.concat([pokemon, d1, d2], axis=1)
我们的口袋妖怪数据集被转换成一个新的数据集。
我将战斗数据集的数据与口袋妖怪数据集进行了映射,并创建了一个新的训练数据集。
新训练数据集的格式将为:
For each row in combat dataset:
concatenate (data of First_pokemon, data of second_pokemon, winner)Winner = 0, if first pokemon wins, else, Winner = 1Data of each pokemon will have following columns (All columns except # and Name):
[HP, Attack, Defense, Sp. Atk, Sp. Def, Speed, Generation, Legendary, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4] = 18 columns.
比如:
战斗的第[0]排是:
first_pokemon = 266,Second_pokemon=298,Winner = 298。
因此,根据上述算法,新数据行将是:
First_pokemon = [50, 64, 50, 45, 50, 41, 2, 0, 0.0, -1.0, -1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0]Second_pokemon = [70, 70, 40, 60, 40, 60, 3, 0, 2.0, 0.0, 0.0, 0.0, -1.0, 2.0, 0.0, 0.0, 0.0, 0.0]Winner = 1concatenate(first_pokemon, second_pokemon, winner) = [50, 64, 50, 45, 50, 41, 2, 0, 0.0, -1.0, -1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 70, 70, 40, 60, 40, 60, 3, 0, 2.0, 0.0, 0.0, 0.0, -1.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1]Code:data = []
for t in combats.itertuples():
first_pokemon = t[1]
second_pokemon = t[2]
winner = t[3]
x = pokemon.loc[pokemon["#"]==first_pokemon].values[:, 2:][0]
y = pokemon.loc[pokemon["#"]==second_pokemon].values[:, 2:][0]
diff = (x-y)[:6]
z = np.concatenate((x,y))
if winner == first_pokemon:
z = np.append(z, [0])
else:
z = np.append(z, [1])
data.append(z)# Convert list to numpy array
data = np.asarray(data)
**3。将数据拆分成训练和测试:**将数据集拆分成训练和测试数据集。我们将使用一些数据来训练模型,并使用剩余的数据来测试模型。
X = data[:, :-1].astype(int) # Input features
y = data[:, -1].astype(int) # Output label (Winner column)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
模型选择、训练和预测
我选择了随机森林分类算法来构建我的模型。
clf = RandomForestClassifier(n_estimators=500)
model = clf.fit(X_train,y_train)
pred = model.predict(X_test)
print('Accuracy of {}:'.format(name), accuracy_score(pred, y_test))
print(classification_report(y_test, pred))
准确率 94.76%。相当不错!
接下来我们可以做什么来提高我们的准确性?
- 调整随机森林的“n 估计量”超参数。
- 尝试不同的机器学习算法,如 SVM 的 AdaBoost。
- 试着建立一个神经网络。
- 做特征工程,即在现有数据的基础上创建新的数据点(列),比如增加攻防比例,特殊攻击和特殊防御。
准备好一些口袋妖怪战斗了吗?
我看了口袋妖怪,用我的模型预测了战斗的赢家。
感谢您的阅读!继续学习!
免责声明:口袋妖怪公司保留所有口袋妖怪角色。我不是在为口袋妖怪或口袋妖怪公司的内容做广告。
成为 Python“一行程序”专家
终极指南
少写代码,多成就!
你只需要一句台词!
图片由 Hitesh Choudary 在 Unsplash 上拍摄
由于其简单的语法,Python 是一种初学者友好的语言。与其他需要特定使用花括号和分号的语言不同,Python 只关心缩进。到这一点,已经显得 Python 关心用户了,不是吗?然而它并没有就此停止,Python 通过其编写单行代码片段的能力给了我们更多的便利。虽然很短,但这些单行代码可以像用 Python 或任何其他语言编写的冗长乏味的程序一样强大。
你为什么关心这个?
通过使用 Python 一行程序,您将能够编写更少的代码并实现更多,这直接转化为生产力的提高。最重要的是,一行代码读起来更有趣,并且可以展示你对 Python 语言的熟练程度。
我们开始吧
1.交换两个变量的值
你们大多数人可能会这样做。
a = 1
b = 2
temp = a
a = b
b = temp
这样就可以了,a 的值现在是 2,b 的值是 1。但是,考虑一下这个!
a, b = b, a
它甚至适用于任何数量的变量!
a, b, c, d = b, c, d, a
2.列表理解
列表理解可以用来代替制作列表所需的 for 循环。
ls = []
for i in range(5):
ls.append(i)
你可以这样做,而不是使用 for 循环。
ls = [i for i in range(5)]
您还可以添加 use list comprehension 来迭代现有的列表,并提供元素需要满足的一些标准。
ls = [-1, 2, -3, 6, -5]ls = [i for i in ls if i > 0] #ls = [2, 6], positive integers only
3.地图方法
Python 中的 map 方法为列表中的每个元素执行特定的函数。
ls = list(map(int, ["1", "2", "3"])) #ls = [1, 2, 3]
这里,我们将列表中的元素类型转换为整数类型。您不再需要使用循环函数遍历每个元素并逐个转换,map 会为您完成这些工作。
4.过滤方法
Python 中的 filter 方法检查 iterables,例如,列表的元素,并删除返回 False(不符合标准)的元素。在这个例子中,我们将利用 filter 方法来查找两个列表中的公共元素。
ls1 = [1, 3, 5, 7, 9]
ls2 = [0, 1, 2, 3, 4]
common = list(filter(lambda x: x in ls1, ls2)) #common = [1, 3]
与 map 方法一样,您不再需要遍历每个元素。
5.还原方法
Python 中的 Reduce 方法用于对每个元素应用一个函数,直到只剩下一个元素。顾名思义,该方法将数组简化为单个元素。
Reduce 函数是在“functools”模块中定义的,所以不要忘记预先导入它!
from functools import reduceprint(reduce(lambda x, y: x*y, [1, 2, 3])) #print 6
6.λ函数
def fullName(first, last):
return f"{first} {last}"name = fullName("Tom", "Walker") #name = Tom Walker
Lambda function 是一个小型匿名(单行)函数,它能够替换用 def 关键字声明的常规函数。上面的片段和这个类似。
fullName = lambda first, last: f"{first} {last}"name = fullName("Tom", "Walker") #name = Tom Walker
当我们把 lambda 作为高阶函数使用时,它的威力会更加明显。高阶函数是将其他函数作为自变量或返回其他函数的函数。
highOrder = lambda x, func: x + func(x)result1 = highOrder(5, lambda x: x*x) #result1 = 30
result2 = highOrder(3, lambda x : x*2) #result2 = 9
注意,通过使用 lambda 函数,我们可以很容易地使用不同的 lambda 函数作为 func(x)的参数。它不是给了我们很大的自由吗?
7.使用 reverse 方法反转列表
也许你们都非常熟悉我下面介绍的列表切片方法:
ls = [1, 2, 3]
ls = ls[::-1] #ls = [3, 2, 1]
但是,这种方法会使用更多的内存,所以可以考虑使用相反的方法。
ls = [1, 2, 3]
ls.reverse() #ls = [3, 2, 1]
8.使用*多次打印同一元素
而不是像这样使用 for 循环
for i in range(5):
print("x", end = "") #print xxxxx
你可以这样做
print("x"*5) #print xxxxx
例子
既然我们已经研究了用 Python 中的一行代码能做些什么,现在是实现它的时候了。这里有一些例子,你可以应用到目前为止你所学到的东西。
- 求一个数的阶乘
一个数的阶乘,用 n 表示!是所有小于或等于 n 的正整数的乘积。也许你们大多数人会考虑使用这样的递归函数。
def fact(n):
if n == 1:
return 1
else:
return n*fact(n-1)
相反,我们可以这样做:
from functools import reducereduce(lambda x, y: x*y, range(1, n+1)) #n factorial
2.寻找斐波那契数
斐波那契数列是一个数字序列,从 0 开始作为第 0 个数字,1 作为第 1 个数字。序列从一个数字开始,该数字是前面两个数字的和。斐波那契数列的前 8 项是 0,1,1,2,3,5,8,13。直觉上,你可以像这样使用递归。
def fib(n):
if n == 0 or n == 1:
return n
else:
return fib(n-1) + fib(n-2)print(fib(n)) #prints the nth Fibonacci number
或者,您可以这样做:
fib = lambda x: x if x<=1 else fib(x-1) + fib(x-2)print(fib(n)) #prints the nth Fibonacci number
3.检查一个字符串是否是回文
回文是一个单词、短语或序列,前后读起来是一样的。这段代码没有错:
def is_palindrome(string):
if string == string[::-1]:
return True
else:
return Falseprint(is_palindrome("abcba")) #prints True
然而,这样做不是更优雅吗?
string = "abcba" #a palindromeprint(string == string[::-1]) #prints True
4.展平二维数组
我们希望给定的二维数组是一维数组。这可以通过用 for 循环遍历每个元素来实现。
ls = [[1, 2], [3, 4], [5, 6]]
ls2 = []for i in ls:
for j in i:
ls2.append(j)print(ls2) #prints [1, 2, 3, 4, 5, 6]
然而,我们可以用这个一行程序实现同样的事情:
ls = [[1, 2], [3, 4], [5, 6]]print([i for j in ls for i in j]) #prints [1, 2, 3, 4, 5, 6]
结束语
学习这种一行程序 Python 技巧不会让你成为编程奇才。然而,这将是一件有趣的事情,它将帮助你变得更有效率(更少的代码行→更少的时间需要)。除此之外,在你的代码中加入这些技巧会很酷。嘘…你也许可以用这个打动某人。
我希望你能在你的代码中直接应用这些很酷的技巧。也许这些技术中的一些在你第一次使用时不会下沉。放心吧!随着你使用它的次数越来越多,它会变得越来越自然。
问候,
弧度克里斯诺
成为技术试听专家—第二部分
本周,我深入探讨了在面试准备中实施刻意练习的细节
照片由来自 Pexels 的 Kulik Stepan 拍摄
在本博客系列的第一部分中,我讨论了将现场技术面试视为试听而非面试的想法,我们可以利用专业音乐人采用的练习技巧来确保我们的准备更高效,更有利于成功。
其中一种练习技巧是一种叫做刻意练习的方法,我将在这篇博客中深入探讨。请务必查看第三部分,该部分概述了一个实施刻意练习的学习计划。
刻意练习
在第一部分,我提到了刻意练习的概念,这是安德斯·埃里克森博士创造的一个术语,被认为是许多人用来超越自己成为专家的一种方法。在这篇文章中,我将深入探讨什么是刻意练习,并建议你如何将刻意练习应用到你的技术试听准备中。
举例来说,我将把这个计划组织成一个软件工程面试(/audition),并组织这个计划来解决 Gayle McDowell 的《破解代码面试书》中的主要话题。我在书中确定了 20 个主要话题,并将它们分为 3 个主要研究领域——你可以根据自己的需要调整列表。这 20 个主题的列表将在本文后面显示。
我还想先说一句,这个计划是一个“完美世界”计划——请记住,我们并不是生活在一个完美的世界里,你不可能总是完美地遵循一个计划——做好灵活的准备,并根据需要进行调整。
好吧,我同意——那么什么是刻意练习呢?
刻意练习是两件事的结合:
刻意练习=有目的的练习+专家指导
所以,为了知道什么是刻意练习,我们需要理解这两个组成部分。让我们进一步细分这两个领域:
有目的的实践
有目的的练习由 4 个部分组成:
- 具体,目标目标
- 对特定时间段和任务的高度关注
- 反馈
- 频繁的操作在你能力的边缘
让我们深入探讨一下:
有目的的练习:
- 具体、客观的目标:
你会注意到我会在整篇文章中频繁使用“目标”这个词。这可以说是设定目标最重要的部分。你知道自己是否在进步的唯一方法是制定可衡量的目标。他们可能以二元方式来衡量:“正确”或“错误”,或者以评分系统来衡量:“1/10”为例。
为了能够设定你的目标,你需要了解你目前所处的位置——你的基线——以及你正在努力达到的位置——你的最终目标。
你的最终目标既大又广,因此我们需要将它分解为子目标,并对它们进行分类,使它们尽可能具体和客观。
比如说—
最终目标:
自信地成功完成现场面试。
哇哦。很宽泛,不太具体。
让我们思考一下如何在这里衡量成功,并得到更具体的。
要成功完成面试,你需要在你知道可以测试的 20 个话题上有能力。这 20 个话题可以分为 3 类(耶,现在我们开始具体了!).
因此,我们的最终目标现在变得更加具体,例如:
在测试的 20 个主题中获得能力。
这仍然不够具体——我们可以做得更好。比如,我们如何定义‘能力’?
基线:
为了确定从哪里开始以及如何构建我们的目标和学习计划,我们首先需要弄清楚我们现在对所有这些主题的立场。
请记住,我们正努力做到客观和可衡量。为了建立一个基线,请花些时间浏览每个主题,并在 1-3 的范围内对每个主题进行评分:
1 =我对此知之甚少,只能回答不到 20%的问题
2 =我对此有些熟悉,可以回答大约 50%的问题
3 =我对此非常有信心,可以回答至少 80%的问题
在这项任务中不要掺杂任何情绪。记住——这是客观存在的!
如果你的回答大多是 1,这个任务应该不会让你不知所措——这完全在意料之中!我们只需要建立一个基线。
保持客观!
我可能会这样组织:
主题:
将主题分类,并按 3 分制评分。(图片由作者提供)
创建一个表格,将 20 个主题按照它们的 3 个类别组织起来,并留出空间输入您的基线评分。请注意,我还在主题标题旁边放置了答案行——这是一个好主意,可以评定您对哪些类别最有信心/最没有信心。
通过我们的评级系统,我们现在已经找到了一种方法来使我们的目标更加具体和客观。
这样,我们的目标是在所有科目上都达到 3 级,因此,我们现在将“能力”定义为“达到 3 级”。每周,我们将对每个主题重新评分,以跟踪我们的进展。
太好了!我们现在已经建立了一个 目标 最终目标:
每个主题都达到 3 级。
接下来我们发现有目的的练习…
2。强烈聚焦
当我说面试准备中最困难的事情是不要被太多的话题淹没时,我是发自内心的。这就是为什么专注是一项需要磨练的关键技能。
照片由 SplitShire 从 Pexel。
高度集中包括对一个话题的隧道式关注,同时模拟“真实的面试环境”。
隧道视野焦点:
隧道视野焦点包括确保当你在研究一个话题时,它是你在学习期间头脑中唯一的事情。如果你在链表上工作,你只在专用时间内考虑链表(更具体地说,你只关注链表中已识别的问题区域——稍后会详细介绍)。试着忘记任何其他存在的话题。
模拟真实的面试体验:
模拟真实面试的真实环境是培训重点的一个重要部分。
在 COVID times,这实际上对我们来说更容易做到,因为你的面试地点几乎肯定是你学习的地方。
在音乐界,专业音乐人可能会预订他们试听的场地,用同样的房间、椅子和音响等来练习。作为真实的事件,或者至少,在练习的时候观想处在这个环境中。
除了模拟面试的物理环境,我们还需要训练大脑限制在面试时间间隔内。
如果你知道你的现场面试将持续 50 分钟,你应该以 50 分钟为间隔进行学习。这可以让你的大脑适应回答问题的时间框架和时间长度。不仅如此,大脑在更短的时间内更好地处理信息,让你始终保持专注。
我建议设置计时器,强迫自己在两次休息之间休息 10 分钟。我还建议为每次学习/练习设定小目标,因为这也有助于你每次坐在办公桌前时保持专注。
3.反馈
他。大多数。危急关头。部分。
对我们进展的反馈是我们决定下一步工作的方式。它驱动着我们的目标设定和每次学习的焦点。
反馈需要针对特定的。
例如,如果你对比特操作的理解很弱,你不知道的具体是什么?你有什么问题?路障在哪里?
如果你自己在识别困难的具体方面有困难,这就是你的“专家教练”的用武之地。
最有可能的是,你在 disposal⁴没有“技术教练”,所以我们需要在如何获得定期反馈方面更有创意一些。您的反馈将来自:
你自己-
将会有许多话题,你将能够自己确定你的不足之处,你将能够指出“啊,如果我知道之类的,我就能够克服这些”,因此你将接着去做之类的事情。
解决方案-
这将是你在学习期间的主要反馈来源。对于你做的每一道题,详细研究解答。突出显示解决方案中您弄错的部分,并深入探究为什么这是解决方案。
出于这个原因,我强烈建议不要做没有解决方案的问题——当然你可以尝试,但你将无法获得反馈(除非你有教练)。
很多人经常不做的事情其实很重要:研究你答对的题的解答!
如你所知,解决问题通常有很多方法,所以我们总能找到更好的方法。因此,检查一下你的解决方案是否是最佳方案(考虑时间和空间的复杂性),如果是,把它储存在你的大脑里并记下来。如果解决方案与你的不同,并解释了为什么它可能更好,耶!你刚刚学会了一种新的做事方法,并对这个话题有了更深的理解。
希望不言而喻,以确保你得到你的解决方案从一个有点声誉的来源。你应该能够信任来自 LeetCode、HackerRank、破解代码书等平台的解决方案。如果你正在阅读论坛讨论的解决方案,请注意这些可能是非常固执己见的,并不是每个参与讨论的人都有资格发表评论,所以一定要核实论坛的建议和解决方案。
最后,理想情况下,找到详细说明“如何做”和“为什么”的完整解决方案。如果没有可用的解决方案,你可能需要用谷歌搜索来研究解决方案,并把事情拼凑在一起。这是一个更耗时的过程,但这通常会让你在这个过程中学到更多。
专家蔻驰-
这是刻意练习公式的第二部分,所以我将在下面的“专家蔻驰”部分谈论它!
4.经常在你能力的边缘操作:
把这想象成一种向前一步,向后两步的方法。
致力于在你已经知道的和你不知道的边缘工作。这意味着研究你不理解的领域,并利用你所知道的知识来获得新的理解。
这在我们的理解中创造了凝聚力,意味着我们永远不会盲目地一个接一个地学习新的话题。做一些新的事情,同时重温前面的 2 个步骤/构建模块。
这个过程与反馈回路紧密相连。
我可以这样做:
记录下你所做的所有问题,并确保你将它们归类在相关的标题下。对于每个主题标题,有一列你答对的问题和一列你答错的问题。这里的目标是不断重新测试“错误”的问题,以便最终所有的问题都在“正确”的一堆。
但是,不要重考题,除非你已经研究了的解答,并进一步研究了那个问题区域→这是‘能力边缘的操作’部分。
一个切实可行的方法是一次做 3 个问题——1 个新问题和 2 个“错误”的旧问题。
最后,也是最重要的一点,为了持续了解你的能力优势在哪里,你需要按照我们之前提到的 3 分制对你的主题重新打分。我建议在每个周末做这件事。
即使你“知道”你没有取得任何进步,因为那一周你没有做太多的学习,重新评估仍然是重要的,因为很容易忘记你取得的一些小进步。也许只有一个题目改变分数, 但那仍然是有形的,客观的进步。
专家指导
专家指导比有目的的实践更能说明问题,然而在技术面试的背景下,这一点并不明确。要成为一名专业教练,
- 一个人必须是他们领域的专家,并且在你的知识水平之上,
- 他们需要能够发现需要改进的地方,并提供有效的、客观的反馈
- 他们需要能够帮助培养心理表征
专家教练的主要作用是提供反馈。
不像运动员,舞蹈家,音乐家,软件工程师很少有 1:1 的教练!这就是我们必须在上面提到的反馈方法上有所创新的地方。把这些结合起来,充当你的“教练”。
寻找科技蔻驰:
如果你已经是这个领域的专业人士,并且和一群专家一起工作/社交,那么这就太棒了!找出你周围的人,他们在各自的领域表现出色,或者是你想去的地方(或者得到了你想要的工作)。
理想情况下,你需要一个善于沟通的人,当你要求反馈时,他不会拒绝你。这些人将会是你要与之进行模拟面试、阅读你的代码或讨论概念的人。如果有一个概念你不明白,让他们帮你指出题目的哪一部分是最大的空白。
如果你是这个行业的新手,你有两个选择:付费教练和有机教练。
有机教练可以通过加入社区团体和定期参加聚会找到。这需要多一点时间(和信心),但是不要害羞——问问团队中一个你认为“不错”的资深成员,他们是否愿意帮你检查一些代码或者进行一次模拟面试。人们比你想象的更乐于助人。
接收“建议”的注意事项:
我强烈建议你对选择谁做你的教练和听取谁的建议要挑剔。这适用于日常生活,不仅仅是科技!
当收到建议时,确保该人勾选以下三个***😗**
- 这个人必须是他们给出建议的领域的专家。
- 这个人必须熟悉你的个人情况。
- 你必须尊重这个人。
就我个人而言,我是按照这些标准生活的,每当有人抛出 advice⁵.时,我都会评估这三点这并不意味着如果某人没有勾选其中一个选项,你就无视他的观点,这只是意味着你会对他的建议有所保留。
但是我强烈建议你在评估谁会受到影响时记住这一点。尤其是在当今世界,每个人都有自己的观点⁶…
既然我们已经理解了刻意练习的方法,是时候把它们整合到学习计划中了!
查看这个博客系列的第三部分,看看我是如何将所有这些整合到一个针对软件工程面试者的具体学习计划中的!
脚注
这里有一个很棒的视频(壮举。Ericsson)很好地总结了有意的实践。
我已经确定了 20 个与软件工程能力相关的主要话题,但是请根据你的需要调整、增加和减少话题!当然,如果你在为数据科学面试而学习,话题会有所不同。
不要误解我的意思,这说起来容易做起来难,一开始可能会是一项艰巨的任务——我自己也在为此奋斗!
⁴Although:这些越来越受欢迎,也越来越容易租到
⁵Don’t 担心,讽刺我给建议给建议对我没有失去
⁶What:是他们说的关于的意见吗?
成为技术面试专家——第一部分
改变我们思考和准备技术面试的方式。
照片由来自佩克斯的埃伯哈德·格罗斯加斯泰格拍摄
这是一个由三部分组成的博客系列,我希望就我们如何对待技术面试展开讨论。
在第一部分,我将谈到为什么我认为这是必要的和相关的。
在第二部分中,我会更具体地讲述刻意练习的概念,以及如何在技术面试的背景下思考这个问题。
最后,在第三部分中,我非常具体地为准备面试的软件工程师制定了一个学习计划!我也给出一些关于数据科学面试的注意事项!
可怕的技术面试
如果你正在读这篇文章,那么你很可能正在为技术面试(软件工程师、数据科学家等)做准备。
现在你应该知道科技面试不像常规的“老派”面试——我们不能仅仅用我们的魅力吸引招聘经理,说些废话——我们实际上必须表现!
虽然这些工作需求量很大,但申请人的拒绝率很高,而且这还是在你能通过最初的筛选步骤进入现场面试的情况下。
问题是,如果你能参加现场面试,这意味着这家公司真的想雇用你——你现在只需要让他们的决定合理。那么,如果招聘经理希望你成功,为什么会有这么多应聘者在最后一轮现场面试中失败呢?
我相信很多去现场的人确实知道他们的东西,可能会成为优秀的员工,他们只是没有为现场面试的表现做好准备(这是我第二次使用这个词了……)。
还有哪个行业的招聘过程需要多次预先筛选和艰苦的“现场”表现?
音乐!
更确切地说,是专业管弦乐行业。
科技公司和管弦乐队在招聘过程中的主要区别在于,管弦乐队的职位竞争更加激烈,通常会有数十名极具天赋和资质的乐器手争夺管弦乐队中的一个职位(T2)。
在技术领域,有如此多的职位可供竞争,招聘经理迫切希望这些职位有人填补。他们不会浪费时间给不合格的人提供现场面试机会,也不会勾选最低标准——所以如果你得到了现场面试机会,他们现在只想看看你在工作中表现如何。
这是一个也被称为试音的过程。
我认为技术候选人需要开始把技术现场当成试听,而不是面试。
考虑到这一点,我将分享一些专业音乐家在准备试演和演出时使用的实践原则,我相信我们也可以用同样的精神来对待我们的技术试演。
当前的方法
有一件事让准备这些面试变得特别艰难,那就是👏🏻许多👏🏻主题👏🏻覆盖👏🏻。退一步说,这可能会让人不知所措。
照片由energepic.com从像素拍摄
这个问题已经得到了一定程度的确认和解决,优秀的资源包括 LeetCode 、 HackerRank 、 Interview Query 以及许多其他在线编码网站和书籍。这很好,确实有助于解决“学什么”的问题。然而,你怎么知道你的学习计划是有效的,并且实际上会得到你想要的结果呢?
准备这些面试不仅仅是“擅长你的工作”。我见过经验丰富的专业人士(他们确实擅长自己的工作)在现场面试后被拒绝。
技术面试是一个完整的游戏,需要不同于工作本身的技能。
当我看到过多的科技 YouTubers 和博客分享他们的科技面试经验时,我意识到需要一种更结构化的研究方法来进行这些面试。我反复听到的最大的收获是
这很难,在你得到一份工作之前,你会遭到大约 20 次拒绝,但只要坚持练习就好。
这让我很不舒服。
如果你一次又一次地被拒绝,这意味着你一遍又一遍地做着同样的事情,期待着不同的结果(也就是精神错乱的定义)。
我注意到许多“技术大师”的建议是
尽可能多地做问题,全部做,做真正难的问题,如果你总是做错,那就做简单的,这样你会保持自信,但每天都要做新的问题!!!你最终会明白的!要有信心!”
还有一些人试图用他们难以置信的智慧(呕吐)压倒你,让一切看起来比实际复杂 100 倍,只是为了让自己看起来更聪明…
总而言之,我意识到除了*【练习】*之外,对于如何应对技术面试准备,没有任何结构化的建议或提议。
准备技术试镜
在成为数据科学家之前,我曾是一名成功的职业钢琴家和音乐教育家。在专业音乐界,人们非常关注对 T4 的精通。没有人想仅仅是“好”,他们想掌握他们的乐器。因此,音乐家花费大量的时间来完善他们的练习习惯,以尽可能高效地获得他们领域的专业知识。
在我的音乐生涯中,我迷上了教育学,并理解了专家是如何成为专家的。关于这一点有大量的文献,但是我不会在这里用细节来烦你!
我制定的学习计划是为了实施一个叫做“刻意练习”的过程。这是我在音乐生涯中学到的技巧,并在我自己的实践和我的学生的日常练习中运用。
将这一研究领域正式化的人是安德斯·ericsson⁴博士,他在他的书《巅峰》中详细介绍了他的大部分工作(这是我最喜欢的书之一,强烈推荐)。
但只是面试而已,不可能那么严重吧?
我想指出的是,这整个想法是基于‘精通’和成为某方面的专家。这通常适用于职业,如职业运动员、音乐家、战斗机飞行员、棋手等。他们希望在各自的领域出类拔萃,成为大师。
但是,这实际上可以适用于任何你想变得更好的背景——你可以运用这些原则成为制作一杯完美咖啡、叠衣服、挖鼻孔的专家
在这种情况下,我们的目标是成为技术面试的专家。然而,默认情况下,你也会在你的工作中表现出色,这是由过程的性质决定的。
敬请关注
在这个博客系列的第二部分中,我将深入探究刻意练习的细节,在第三部分中,我将提供一些如何为技术试听构建学习计划的想法。
脚注:
当然,总有例外——一个主要的例外是,并不是每个候选人都符合良好的文化,这是许多公司非常重视的。让我补充一下,虽然你也可以通过有意识的练习来准备你的文化契合度面试,但我确实认为这应该由想要为公司工作的真正动机和对公司价值观的信念来支持。
也许应该…
我在这里假设你能胜任这项工作。我说的不是被一份不具备最低学历或经验要求的工作拒绝。
⁴You 可能对马尔科姆·格拉德威尔著名的“一万小时规则”很熟悉。嗯,安德烈斯·爱立信实际上是一个谁产生了神奇的 10,000 小时的专业知识的研究,但格拉德威尔通过把它变成一个时髦的短语来赚钱,并且没有承认爱立信的发现的重要性。爱立信强调,精通或专业知识是在特定领域经过 10,000 小时的刻意练习后获得的。这一点怎么强调都不为过。事实上,爱立信称格拉德威尔对他的工作的结论为“……对我们工作的一种大众化但简单化的观点……这表明,任何人只要在某个领域积累了足够多的实践时间,就会自动成为专家和冠军。”
成为一名数据科学家是一场马拉松,而不是短跑。
一路上有很多障碍。
自从数据科学成为“21 世纪最性感的工作”以来,人们对这一领域的兴趣大增。有了它,就有了获取必要知识的课程。尽管这很好,但不利的一面是,这个领域被宣传成可以在几周内掌握的东西,你会从中受益。是的,它可以学得很快,但这不是结束,数据科学是一个你将永远继续学习并面临大量挑战的领域。考虑到这一点,我开始认为数据科学类似于运动员,你训练(练习),赢或输,并重复一遍。我开始在我的职业生涯和研究生院中应用体育职业道德,我的好/坏时刻发生了巨大的变化。
注意:这不是一个简单的复制别人的惯例并强迫自己遵循的指南。相反,我想提供一个对我有帮助的实用列表,任何人都可以自己应用和修改。
练习,练习,我说练习了吗?
这也是我一直需要的提醒。我相信您已经了解了我们需要如何练习(插入主题)来提高(插入适用内容)。作为一名有抱负的数据科学家,我开始认为练习不仅仅是一项不方便的任务,而是像运动员一样是过程的一部分。每场比赛都有多次练习。目标是让练习尽可能成为常规,以建立一个坚实的基础并达到期望的水平。
作为数据科学家,我们需要开始将实践视为帮助我们实现预期目标和达到下一个水平的一部分。练习是我们技能发展的地方,我们需要像运动员一样对待它,从不错过练习。
以下是我最喜欢的一些练习资源:
对于 Python 和 R: Dataquest(免费)课程
Udemy Python 课程(这个是要收费的,但是要找优惠码!)
失败是过程的一部分。
失败和成功一样都是过程的一部分。我开始把失败视为走向全面胜利的必要一步。一旦我开始把这种心态应用到我的求职中,处理拒绝就变得可以忍受了,花在犹豫上的时间也少了。
我们需要开始思考,在一个“是”之前,我会被拒绝 10 次。如果第五次回答是,你的情况会更好。如果没有,你的动力不会随着每一个而减少。被拒绝只是这个过程的一部分,每一次拒绝,你都会学到一些新的东西,可以应用到下一次。需要的时候休息,继续。被拒绝并不断尝试总比总是想知道结果会怎样要好。
有时我们甚至没有注意到我们让失败的恐惧吞噬了我们所做的工作。当我第一次开始学习 Python 时,我会编写代码,并在运行它之前确保一切正常,因为我害怕不能得到正确的结果。尽管它只是运行程序来看看目前为止进展如何,我还是担心第一次尝试没有得到正确的结果,尽管这并不重要。但是看到我因为做错而“失败”会导致更多的时间浪费,因为我没有注意到我应该做的事情。
失败是过程的一部分,它和我们什么时候做对了一样重要。它让你越来越接近你想要达到的目标,不管我们喜不喜欢,它都会发生。
多功能性
我们有这样一个观念,只有有才华的人才能在他们的职业生涯中扮演多重角色。但这种想法并不适用于我们不断发展的社会,尤其是在我们当前的疫情世界。
重要的是发展多种技能,开始探索新的兴趣,看看这些道路通向哪里。只坚持你知道的一件事会很快走向灭亡。科技让人们可以身兼数职,在我们的大多数服务中寻找一站式服务。此外,人们已经对多个领域感兴趣,珍惜它们,并应用它们。甚至迈克尔·乔丹也对棒球有所涉猎,他是他那个时代最伟大的篮球运动员。
在不断变化的数据科学领域,具备多方面的知识是关键,因为只专注于一个主题是不可持续的。例如,我对环境产生了兴趣,并利用编程和讲故事来展示我在不经常讨论的话题上的技能,例如我们当前的废物管理系统。我们的大部分兴趣可以应用在大多数领域,让我们扩展到新的领域。
我希望这些职业应用程序能够帮助您作为数据科学家和在您的职业生涯中学习和成长。如果你有其他职业/工作申请,请联系我。记住,明智地运用你自己!
成为数据科学家:走哪条路?
你成为数据科学家有哪些选择?
无论您是已经进入数据科学领域还是刚刚进入,我相信您将在许多方面从这篇文章中受益匪浅。我们首先概述了数据科学领域的重要性,然后讨论了不同类型的组织,强调了数据驱动的重要性。然后我们讨论数据科学家的需求,以及他们的技能;强调领域的动态性和持续学习的需要。然后,我们深入探讨可供您成为数据科学家或让您的技能更上一层楼的不同途径。
你一定听说过数据科学是 21 世纪最性感的工作这一事实,并且可能想知道为什么它会被过度宣传?为什么每个人都在谈论它?甚至在疫情之后,人们开始更多地谈论它,并使用数据科学技术来分析数据。有的做对了,有的做错了;这超出了我们在这里讨论的范围。
毫无疑问,数据和人工智能是发展最快的行业,具有数十亿美元的潜力。因此,每个组织都试图充分利用它。有三种类型的组织。
- 1) 他们拥有数据,并且希望从中获得洞察力,
- 2) 拥有技能、能够获得洞察力并帮助企业成为数据驱动型企业的人。提供数据科学技能、专家和咨询服务的公司,
- 3) 提供专业平台以支持组织实现其数据相关目标的人员。
您可能会看到一些组织将这些技能混合在一起。然而,这些是企业成为数据驱动型企业所需的能力。考虑到成本和相关的起伏,一些公司可能会开发自己的能力或外包。
注意:关于成为数据驱动型企业的更多细节,你可以关注我的数据驱动型企业系列,如下所示
- 什么是数据驱动的业务?
- 成为数据驱动的组织:挑战和阻碍
- 成为数据驱动型企业需要实施的变革
- 对数据驱动型企业的启示:他们获得了什么?
上述不同类型的组织及其成为数据驱动的迫切愿望决定了对数据科学家和机器学习工程师的高度和迫切需求。他们最终会处理这些数字,理解它们,并为企业揭示数据中隐藏的洞察力。
数据科学家面临着各种令人兴奋的机会,让自己掌握技能并熟悉数据科学是展示您的竞争优势和证明您对企业的价值的绝佳方式。数据科学是一个非常复杂、动态且不断发展的领域,这使得它既充满挑战又令人兴奋。所需的技能、你可以用来构建数据科学和机器学习管道的语言、库、框架、工具都在不断变化和成熟——这要求的不外乎持续学习。
让我们讨论一下您成为数据科学家的不同选择和途径,以及(如果您已经是数据科学家)要达到下一个专业水平还需要做些什么。
1。学位
有几所大学以不同的名称提供数据科学学位(硕士水平)或研究生水平的课程,如数据分析、机器学习、数据科学、商业分析等。还有各种在线(远程)替代方案。人们必须根据他们的情况、适合性和支付能力来评估他们。你可以选择大学或在线学习,在在线学习的情况下,你不必搬迁,但费用可能仍然很高,这取决于你选择的项目。
2。数据科学奖学金项目
有许多研究所、公司或初创公司提供为期几个月的实践奖学金,这让你有可能为研究所/奖学金的合作伙伴(或赞助商)之一解决商业问题。从长远来看,这对企业和员工来说都是一个很好的机会,看看他们是否适合对方;从短期来看,公司解决了他们的问题,而你作为毕业生获得了实际项目的实践经验。
3。通过在线平台学习
许多在线网站都提供课程,你可以通过这些课程成为数据科学领域的专家。我称之为艺术和科学,因为它涉及到这两者;解决商业问题是一门艺术,用数据科学来解决,顾名思义,就是科学。而你两者都需要;在今天的就业市场上,只有一个是不够的。
有许多在线平台提供数据科学方面的课程;一些提供商包括 Coursera、Edx、DataCamp、Udacity、Udemy 等等。此外,许多大学通过这些平台提供在线课程和专业。这些项目对几乎每个人来说都是经济可行的,你可以按照自己的进度来进行,这有助于学生掌握概念并完成整个课程。这是由你来决定个人课程,微硕士或纳米学位课程
此外,还有一些实践项目,帮助您逐步了解如何针对业务问题构建项目。
4。做动手项目
这围绕着你自己掌握它,把控制权掌握在你自己手中,并自己驾驶它。虽然这适用于所有其他情况,但在这种情况下更是如此。你必须从一个动手项目开始,然后针对应用场景、算法等进行扩展。
5。看书
尤其是对于爱读书的人来说,要学习一个概念,然后去实施或者掌握它。对许多人来说,这也是一个很好的方法,但也许不是对所有人;这需要时间,在动手实践的时候,你可能会迷失方向。只有当你有了必要的实践经验并了解基本原理后,我才会推荐你这么做。在当今敏捷和快速发展的世界中,我想强调的是从你喜欢的任何资源开始,并在你前进的过程中将其与其他资源结合起来。没有一种灵丹妙药。
6。中等
媒体上几乎每一个主题都有大量的文章。它们通常不会很长,这在很多方面有助于保持你的注意力,获得有价值和有用的知识,并付诸实施,把它变成坚持的东西。为了能够使用这个平台,你可以创建一个免费帐户或付费/会员帐户。然后下一步是寻找顶级出版物中的文章,如对数据科学和对 sAI 。我通常在这些刊物上发表我的文章。几篇示例性文章是关于一个 特征库 和 对数据驱动业务 的影响。
照片由 Isaac Owens 在 Unsplash 上拍摄
学习机器学习(当然还有其他任何东西)的一个好方法是写下你所学到的东西。你也可以在 Medium 上成为一名作家,把你关于数据和 AI 的故事提交到这个这里。
7.Kaggle 等比赛
许多人通过参加像 Kaggle 和其他人的竞赛来确定技术概念。这也是一个很好的方法,让你把自己放入一个纪律的框架中,遵守截止日期,接受挑战,并取得一些成就,除了掌握概念,还能给你带来金钱上的好处,让你得到认可,你可以为自己的名声索赔。当然,这不会在一夜之间发生,需要时间,任何事情都是如此,所以无论你做什么都要有耐心和毅力。
8。Youtube 视频
你也可以通过关注 YouTube 来学习数据科学。有许多课程或特定主题的短片和长视频,你可以快速搜索和浏览。
总的来说,你是最了解自己的人,知道什么适合你,什么不适合你。你知道你可能不愿意与他人分享的事情,但这将帮助你决定哪个选项(或它们的组合)最适合你。让我在这里提出一些问题,这些问题可能有助于您思考、规划和执行成为数据科学家的旅程。
- 我应该考虑在线还是面对面的计划?
- 考虑到我的具体情况、生活状况、经济状况和其他方面,他们各自的优缺点是什么?
- 我可以将它们与我目前的工作结合起来吗,或者我应该休息一下,加入一个现场伙伴关系?
- 有哪些我很了解的概念,需要掌握哪些,还是应该从零开始?
- 有什么先决条件吗?例如,我需要先学习一门编程语言吗?
- 需要投入多少时间?
- 我需要支付多少费用?
思考这些问题和其他问题,并尝试自己回答它们,以评估您学习和掌握数据科学的最佳方式。
成为统计推断的大师
推论的意义是什么?
推断是通过一些观察数据的样本得出关于更大人群的结论。例如,你有一些国家对总统的看法的样本,你想对大众做出一些结论。显然,你不会询问每一个公民,而是使用样本数据对潜在人群进行推断。
概率从何而来?
虽然推理是关键,但我们只能通过一些模型生成的数据进行推理;队列概率…概率用于从给定模型生成数据的过程。
为了以简单的方式将所有这些放在一起,请考虑以下内容:
观察/样本数据->模型->概率/数据生成->推理
经典的抛硬币和二项分布
是时候打破二项分布的魔力了。
掷硬币是帮助分解二项分布的经典例子。
就像我们刚才建立的一样,我们将创建一个模型,允许我们基于简单的抛硬币的想法来生成随机数据。
突击测验!任何给定的掷回正面或反面的可能性有多大??你成功了!😉 50/50.
所以让我们跳到 R 来生成这种类型的实验。为此,R 中有一个很棒的函数叫做rbinom
。我们将用它来模拟抛硬币。
在 R 中抛出下面的命令,看看会得到什么?第一个参数是“拉动”或运行的次数。想运行多少次就运行多少次,您会看到大约 50%的时间该函数返回 1,另外 50%返回 0。
把所有等于或大于 0.5 的都称为“正面”,我们第一次掷硬币是正面。我们再来一次,但是要 10 次。
rbinom(10,1,.5)
这次我们 80%的时候都是正面
如果你一遍又一遍地这样做,你会有 50%的机会接近头部。你也应该做越来越多的翻转。
查看给定翻转发生的时间百分比的好方法…
flips = rbinom(10000, 1, .5) mean(flips == 1)
几乎有一半的时间是正面。
现在让我们稍微改变一下。我们将在实验中抽取 100 万次,但这次每个实验将包括 10 次翻转,有 50%的可能性翻转 5 个头。
flips = rbinom(1000000, 10, .5)
当我们将flips
传递给一个hist()
函数时,我们得到如下结果:
大约 25%的时间里,你看到的是 5 次翻转。这个度量被称为该点的二项式密度。
模拟帮助我们回答关于分布及其行为的问题
累积密度
下一个概念是所谓的累积密度。类似于我们如何查看该点的二项式密度,我们可以查看该点及其上下的密度,代表累积计算。
让我们像前面一样分解同一个例子…通过声明翻转必须小于或等于 5 而不是等于 5,我们的代码对大约 50%的人群评估为真。
flips = rbinom(100000, 10, .5)
mean(flips <= 5)
结论
干得好!这里面有很多需要理解的东西,但我希望这已经被证明是有用的,可以作为二项式分布的入门&如何考虑为了推断而抽样。
如果您觉得这很有用,请随时查看我在 datasciencelessons.com 的所有其他帖子&一如既往,祝您数据科学愉快!
成为一名定量 UX 研究人员是一件棘手的事情
不要期望轻易获得冠军,见鬼,甚至不要去争取冠军
奇怪的物体在花园中间。就像 qUXR 一样。(摄影:兰迪·欧)
出于某种原因,在过去的几个月里,我多次被问到成为量化 UXR 的问题,显然是因为我一年前写的关于我如何成为量化 UXR 的帖子。由于这个职位在野外成长非常缓慢,我想我应该为那些对如何成为一个好奇的人写下这个世界的现状。
Quant UXR 只是一个一直存在的工作的新标签
现在的 UX 分析师本质上是一种通才形式的数据科学家,他们更喜欢专注于理解用户行为,而不是建立其他类型的模型。因此,他们可以被视为数据科学家的一种形式(这意味着他们融合了分析师、研究员和工程技术)。通才部分可能就在那里,因为这个角色相当新,专业化还没有必要。
但是这个角色的功能早于数据科学。
总有一些人(调查专家,有市场研究背景的人,等等)致力于理解用户。分析师(以及将成为数据科学家的分析师),以及用户研究人员。这些人将与产品团队紧密合作,以确定产品应该何去何从。所有的角色都有自己的半独特的工具箱,但最终这些人是他们主类的一个以产品为中心的子类。
因此,在建立了 UX 研究部门(传统上是一个更定性的领域)的大型组织中,出现了处理大量数据的需求。数据科学家拥有处理数据的技能,但他们的任务通常是为用户创建工具和产品。高级分析师也可以做这项工作,但是他们经常被业务目标所束缚。于是这种需求出现了,拥有相关技能和对用户感兴趣的人去填补了这个空缺。
忘记标题,瞄准角色
当人们问我“我如何找到一个 Quant UXR 角色?”我告诉他们,不要找那个特定的标题。只有少数公司甚至有这样的角色,大 FAANGs,如果没有数据科学/分析/研究领域的经验,很难进入。在竞争如此激烈的公司,技能几乎成了赌注,领域知识和经验成了一个与众不同的点。
因此,与其在这些条件下竞争,希望进入该领域的人最好去看看旨在帮助产品团队更好工作的研究员、分析师和数据科学职位。这些角色是存在的,但是没有以容易搜索的方式进行区分。这是一种痛苦,但每个基于产品的公司都会需要这些人,不管他们是否明确表达出来。
你需要寻找与产品团队紧密合作的团队。
- 你会直接与工程师、设计师和产品经理一起工作吗?
- 你能接触到数据吗?
- 团队是否有助于产品战略的制定?
- 你能运行实验或做出改变来收集数据吗?
- 是否有其他数据团队(分析师、科学、工程)可以合作?
- 互动模式是什么?顾问、嵌入式团队成员等。
你接触这些东西越多,你就越能做定量的 UX 工作。有些东西比其他东西更重要,但很少什么都有。期望做大量的宣传,建设基础设施,建立信任和同盟来完成任务。
这不是 2020 年的入门级职位。期望爬上这个角色
就像早期的数据科学家一样,Quant UXRs 倾向于成为多面手,因为这个角色是新的和不明确的。这种模糊性可能就是为什么有这么多奇怪的全才数据科学家/研究员类型的原因。非常需要足够的灵活性来做必要的事情来完成研究,即使这意味着为你编写的调查系统建立你自己的数据收集和分析基础设施。
这也意味着定量分析师必须更多地使用“软”技能。你的经理可能不是量化分析师,没有人可能不知道量化分析师应该做什么。你将会接到与用户研究工作无关的工作请求,并且有一个不可能的截止日期。你将需要管理期望、推后、建立跨职能和团队的关系、请求资源、展示工作以及展示价值和影响的技能。这些都是很难的东西。
如果您还不知道如何实现这些软功能,那么您肯定不希望在学习硬技能的同时被迫学习软技能。一下子学太多了。学习所有这些东西最有效的方法是找到一个你可以用你的有生力量发挥作用的位置,然后学习所有其他的东西。
你需要一个团队
做一个孤独的定量分析师压力非常大,因为你必须兼顾我上面提到的所有事情。我已经在初创公司里做了 5 年多的单干分析师/定量分析师,这仍然是一项艰苦的工作。但是在这 5 年之前,我花了将近 6 年的时间在一个好的经理和团队的指导下学习。没有那些年的学习,我不会有今天。
所以你肯定不想成为一家公司里第一个处理数据的人,除非你有一个对使用数据略知一二的直接经理的大力支持。那是给那些有多年经验的人准备的。
你可能想要较小/中等尺寸的东西
较小的组织(无论是公司还是产品团队都是<150 people) are more likely to have roles that let you drift into a product supporting role by virtue that they’ll let people wear more hats. The company itself doesn’t have to be small, there are often subdivisions/groups within larger organizations that more or less act autonomously.
The goal is to find a place that has a certain degree of role-ambiguity. That’s your opportunity to take on stretch goals and grow into a quant role.
Don’t expect this to be a full career ladder, it’s just a role
Just like with data science, the field is too young to have an actual career ladder. At best there may eventually be junior, and senior distinctions. No one has any idea what a Quant UXR with 15 years experience is going to look like. You can of course just keep doing the work indefinitely, but there’s not much available in terms of taking on “more”.
Moving up beyond being a researcher would involve either leading a team of quants, or branching out to leading entire research programs, both quantitative and qualitative. Transferring into other roles like UX leader, project management and product leads, is also possible with all the cross-functional skills and domain knowledge at your disposal. All of those require you to expand your skill set even beyond what they are now.
Good luck out there
It’s confusing out there. Do your best. People can always feel free to ping me on twitter ( @Randy_Au )有问题,我总是可以根据这些问题写一篇后续文章。
本帖原载于 兰迪的计数玩意儿简讯 。这是一份致力于数据科学和技术的重要、平凡部分的时事通讯。免费注册,在你的收件箱里获得类似的文章。
成为 AWS 认证数据分析专家—2020 年 4 月全新
该认证面向设计、构建、保护和维护分析解决方案的个人。我们将介绍如何准备考试、练习测试和之前推荐的知识。
我刚刚通过了 AWS 认证数据分析专业考试(DAS-C01),获得了我的第二个 AWS 认证。如您所知,该认证是最新的 AWS 版本(2020 年 4 月)之一,将取代 AWS 认证的大数据专业。该认证面向设计、构建、保护和维护分析解决方案的个人。
您有 3 个小时的时间来回答 65 个基于场景的问题。
由 Bradyn Trollip 在 Unsplash 上拍摄的照片
如果你想了解更多,请访问oscargarciaramos.com
或者
之前推荐的 AWS 知识
- AWS 认证数据分析专业(DAS-C01)考试分为及格或不及格。您有 170 分钟的时间来完成考试。它由大约 65 个问题组成。
- 和往常一样,考试中有两种类型的问题:选择题和多选题。
- 未回答的问题被视为不正确;猜测是没有惩罚的
- 您的考试可能包括未评分的项目,这些项目被放在测试中以收集统计信息。这些项目在表格上没有标明,不影响你的分数。
- 考试结果以 100-1,000 分报告,最低及格分数为 750 分。考试采用补偿评分模式,这意味着您不需要“通过”个别部分,只需通过整体考试(新)
- 除了 2 年的 AWS 实践经验外,现在建议至少 5 年的通用数据分析技术经验才能获得该认证。(新)
内容大纲
让我先来并列比较一下考试形式的变化:
数据分析—专业
大数据—专业
正如您所看到的,分析和可视化领域从 29%增加到 18%,更加重视处理(+ 8%)和存储及数据管理(+ 5%)领域。
就其本身而言,集合域的总权重增加了 1%,而安全性减少了-2%。
主要提示
主要服务是 EMR,红移,Kinesis 和 S3+胶水+雅典娜。这使得大约 80%的考试,而且如果你有 准水平认证 它将更容易通过其余的概念。
如果我不得不从头开始,我会建议花更多的时间学习最重要的概念、细节、选项和主要数据分析技术的组件,而不是练习那些肯定不同于真实考试的模拟测试。此外,截至目前,该认证的考试并不多。
我强烈建议先做 解决方案架构师助理 ,原因如下:
- 作为进入 AWS 云世界的第一步,它要简单得多,也有用得多。
- 帮助您熟悉测试方法和节奏,以及 AWS 堆栈中的其他服务,让您真正专注于本次考试的主要数据分析技术。
- 你目前在下一次考试中获得 50%的折扣。因此,如果您选择较便宜的联营公司(150 美元),您将获得较贵的联营公司(300 美元)的 50%。
如何备考
这些是我通过考试所依赖的资源:
- 在线课程
毫无疑问,最优秀的课程是由 Sundog Education 的弗兰克·凯恩创建的 Udemy 的 AWS 认证数据分析专业 2020 (ex Big Data) ,夏羽·马雷克| AWS 认证解决方案架构师&开发助理弗兰克·凯恩
凭借其超过 12 小时的点播视频、全面的测试考试以及对其资源的无限访问,它是本次考试的最佳指南和最佳资源之一。
从我的角度来看,我认为有必要看两遍视频。我以 2 倍速收听,并通过浏览参考资料部分的链接白皮书和文档来复习每一堂课。
可选: 您还可以报名参加云专家的 AWS 大数据专业课程,以获得所有产品和重要概念的高级概述,作为起点。目前,他们还没有推出数据分析认证的具体课程。
- AWS 白皮书
亚马逊有无数引用数据分析产品的文档。但是,我推荐数据分析学习路径中的这两篇文章,它们可以帮助您更好地理解现有的服务。就我而言,我决定阅读 Kinesis 白皮书,因为它是一种需要记住许多细节和不同实现选项的技术,例如它的生产者、消费者、加密和安全性,以及这些服务的输入和输出。
—采用亚马逊 Kinesis 的 AWS 上的流数据解决方案(29 页)
本白皮书讨论了分析从批处理到实时的演变。它描述了如何使用 Amazon Kinesis Streams、Amazon Kinesis Firehose 和 Amazon Kinesis Analytics 等服务来实现实时应用程序,并提供了使用这些服务的通用设计模式。
—AWS 上的大数据分析选项(56 页)
本白皮书通过提供服务概述,以及以下信息,帮助架构师、数据科学家和开发人员了解 AWS 云中可用的大数据分析选项:理想使用模式、成本模型、性能、耐用性和可用性、可扩展性和弹性、接口和反模式。
- AWS 培训
—考试准备:AWS 认证数据分析—专业(免费课程,3 小时)
这门课程通过探索考试的主题领域,让你熟悉问题风格和考试方法,帮助你准备考试。
它以一种非常直观的方式,让你了解考试中最重要的组成部分、需要记住的最重要的细节以及考试中可能出现的问题示例。此外,它们还包括指向这些技术中通常出现的主要主题或问题的参考链接。
这次培训,在我看来,必不可少。因为这是一个如此短而有用的课程,我可以很容易地从头到尾复习 2-3 遍。
- 模拟考试
正如我之前提到的,浏览官方 AWS 培训和认证网站上的免费样题和考试准备问题。这些问题帮助你想象考试会是什么样子,并让你评估你正在获取的知识。
我的情况,另外,我买了whiz labs练习测试。这些问题不遵循模型,也与官方考试问题不一致。然而,它们帮助你探索新的知识领域,这些领域你以前可能没有见过,被认为是重要的,或者在以前的材料中没有如此详细地涉及。关于 Whizlabs 的好处是,它用新的信息链接和支持材料来证明答案是正确的。
本次考试中您应该熟悉的流行分析服务的快速快照:
- 用于流数据的 Kinesis 数据流、Kinesis 消防软管和 Kinesis 分析。
- 亚马逊为卡夫卡(MSK)管理流媒体
- 用于消息排队的简单队列服务(SQS)
- 物联网
- AWS 数据库迁移服务(DMS)
- 简单存储服务(S3)
- 优化事务查询的 dynamo db
- 自动气象站λ
- AWS 胶水
- 使用 Elastic MapReduce 处理无限规模的数据,包括 Apache Spark、Hive、HBase、Presto、Zeppelin、Splunk 和 Flume
- ****亚马逊弹性搜索服务,用于搜索和分析 Pb 级数据和 Kibana
- 雅典娜用于查询 S3 数据湖
- 红移和红移光谱
- 关系数据库服务(RDS)和极光
- Quicksight 用于交互式可视化您的数据
- 用加密保护你的数据安全, KMS , HSM , IAM , Cognito , STS 等等。
如何回答问题
采取这种方式回答问题:
- 在阅读答案选项之前阅读并理解问题(假装答案选项一开始根本不存在)。
- 找出问题中的关键短语和限定词。
- 试着在看答案选项之前回答问题,然后看看这些答案选项是否与你的原始答案相符。
- 根据你对问题的了解,排除答案选项,包括你之前强调的关键短语和限定词。
- 如果你仍然不知道答案,考虑标记这个问题,然后继续问更简单的问题。但是请记住在考试时间结束前回答所有问题,因为猜错是没有惩罚的。
有用的链接
-
edu reka 提供的 AWS 架构师认证培训掌握使用 Amazon Web Services 设计基于云的应用程序的技能。了解更多!
-
https://AWS . Amazon . com/certificate/certified-data-analytics-specialty/?nc1=h_ls
-
https://d0 . AWS static . com/white papers/Big _ Data _ Analytics _ Options _ on _ AWS . pdf
那都是乡亲。希望这篇文章对你有用。
欢迎发表评论或分享这篇文章。关注 me 未来岗位。😉
祝你考试顺利!
记住,如果你想了解更多,你可以在oscargarciaramos.com找到我
与+1K 人一起加入我的电子邮件列表,获取更多独家内容
**** [## AWS 认证数据分析-专业是由亚马逊网络服务培训和…
获得这一认证的人对如何使用 AWS 服务进行数据收集、存储…
www.youracclaim.com](https://www.youracclaim.com/badges/0b507f03-8d5d-40bf-b950-eedcfa763480/public_url)****
在 2 个月内获得 AWS 大数据专业认证
AWS 考试学习指南&忙碌的专业人士的小贴士
斯蒂芬·道森在 Unsplash 上拍摄的照片
我最近通过了 AWS 大数据专业考试,获得了我的第二个 AWS 认证。去年我参加了 Google Cloud 的同等学力考试,分享了我用来通过考试的学习资料集。在这篇文章中,我分享了我的学习指南和我用来在短时间内获得认证的计划。在这次考试之前,我已经完成了助理解决方案架构师考试,并且拥有不到一年的 AWS 大数据产品工作经验。
学习计划
这个学习计划是为繁忙的专业人士在紧张的时间表成为 AWS 认证而设计的。为了真正深入了解 AWS 大数据解决方案和设计最佳实践,我会将研究计划扩展到实验室工作,获得实践经验,并通读公开的案例研究。
在线课程
由于我并不熟悉所有的 AWS 大数据产品,我首先报名参加了云专家的 AWS 大数据专业课程,以获得所有产品和重要概念的高级概述。我以 2 倍速收听,并通过浏览参考资料部分的链接白皮书和文档来复习每一堂课。
Youtube re:发明视频或白皮书
AWS 有大量关于每个大数据产品的在线文档,但观看云专家或其他博客( Simon 的帖子、Ashwin 的帖子)推荐的 re:Invent 视频或精选白皮书节省了时间,并专注于重要的设计考虑事项,而不是考试中未测试的低级细节。请仔细注意图表和比较图,以及对每个产品的限制。
重要链接:
- AWS re:Invent 2019:Amazon dynamo db deep dive—高级设计模式
- AWS re:Invent 2019:用亚马逊 Kinesis 搭建流媒体数据平台
- AWS re:Invent 2019:亚马逊红移的深度探索和最佳实践
- AWS re:Invent 2019:深入研究在亚马逊 EMR 上运行 Apache Spark
- 【2018 年创新大会上的 AWS 大数据和分析会议
安全性和 Hadoop 工具集开发人员指南
您仍然需要通读每个 AWS 产品的开发人员指南中的安全部分,以记住加密选项、备份机制和跨区域复制。除非您有针对各种加密约束进行设计的实践经验,或者在工作中使用跨区域备份构建全局表,否则这一部分主要是记忆。Hadoop 生态系统也是如此。了解何时使用 Presto vs. Hive 以及流行的 Hadoop 产品的高级描述。
重要链接:
- (Skim) 亚马逊 EMR 迁移指南
- 红移安全
- DynamoDB 安全
模拟考试
浏览 AWS 官方培训和认证网站上的免费样题和考试准备问题。我发现这些测试不太关注大数据,但仍然很好地代表了 AWS 风格的问题。我还从 Whizlabs 买了练习题。考试形式与正式考试不一致,因此如果您在模拟考试中得分较低,也不要气馁(例如,在真正的考试中,没有多项选择题,您必须从 6 个选项中选择 4 个正确答案)。最重要的是找出不同产品或概念的知识差距。
学习指南
我整理了一份学习指南来复习关于 Kinesis、EMR、数据管道、DynamoDB、QuickSight、Glue、Redshift、Athena 和 AWS 机器学习服务的大量测试主题。在实际考试中,我发现 EMR、红移和 DynamoDB 依次是重点。对于每种产品,关注以下主题:
- Kinesis :数据流、消防水管、视频流和数据分析的区别。KPL(聚集/收集)、KCL 和 Kinesis 代理收集数据的概念和最佳实践。
- DynamoDB :表格设计(WCU/RCU,GSI/LSI),加密和安全,使用最佳实践提高性能
- EMR: Hadoop 生态系统,加密&安全选项,选择最佳格式以提高性能
- 红移:加载、复制、更新和删除数据的最佳实践。访问控制、加密、安全和复制选项。
- 其他:对每种产品及其如何适应大数据的高层次理解(例如,使用 Lambda 过滤数据或将数据路由到 S3/红移)
最后,AWS 将在 4 月份更新大数据考试,并将头衔更名为数据分析专业。然而,根据网上的考试描述,似乎涵盖的主题保持不变,但我们将看到测试人员的结果何时开始出来。
祝你考试好运!
(你可以看看我的徽章)
获得 AWS 认证—准备参加 2020 年 AWS 认证考试
根据角色和专业从各种认证考试中进行选择,旨在帮助个人和团队实现您的独特目标。
如果您想要验证您的技术技能和云专业知识,以促进您的职业和业务发展…
祝贺你,今天是你的大日子!
将工作负载迁移到公共云是一项持续的艰巨任务,以前这是公司内部的一项技能,现在它已经成为任何业务团队的核心能力。
凭借 33%的市场份额,亚马逊 AWS 继续引领 2020 年 Q2 公共云的采用,目前提供 12 项认证,其次是微软 Azure 和谷歌云平台,分别占 18%和 9%。
凭借超过 175 种不同的服务,AWS 提供了大约 40 种其他云提供商不提供的服务。
照片由 Cookie 在 Unsplash 上的 Pom 拍摄
或者
与+1K 人一起加入我的电子邮件列表,获取更多独家内容
成为 AWS 认证需要多长时间?
我会告诉你,根据我的经验,在全职工作的情况下,需要投入 2 到 3 个月的时间。也就是说,总共投入 80 到 120 个小时来准备所有的认证。
随着您知识的增长,许多认证共享高级概念、服务和其他细节,您将在学习过程中不断强化这些内容。从基础知识开始,然后进入解决方案架构师—助理学习路径。
我从哪里开始?哪个云认证最好?
AWS 目前总共提供 12 种不同的认证:
- 一项基础认证: AWS 认证云从业者
- 三项助理级认证:
AWS 认证开发人员助理
AWS 认证系统运行管理员助理
AWS 认证解决方案架构师助理 - 两项专业级认证:
AWS 认证 DevOps 工程师-专业
AWS 认证解决方案架构师-专业 - 六大专业认证: S 认证数据分析-专业(旧大数据-专业)
如果你想了解更多,去查一下 成为 AWS 认证数据分析-2020 年 4 月新
AWS 认证高级联网-专业
AWS 认证安全-专业
AWS 认证机器学习-专业
AWS 认证数据库-专业
AWS 认证 Alexa 技能构建器-专业
您可以在此找到所有学习途径的完整概述。
获取 AWS 认证解决方案架构师学习指南
我如何获得 AWS 认证?
嗯,每个人都有一套窍门。虽然没有单一的方法来准备每一项认证,但至少以我的经验来看,我确实使用特定的方法来参加和通过认证。
- 下载考试指南和样题。
我想说,这是开始任何认证工作之前要做的第一件事。重要的是要知道从哪里开始,每个认证涵盖的材料,并能够选择哪一个适合您的需求或关注。例如,准备 AWS 认证数据库—专业与准备 AWS 认证数据分析不同。虽然他们可能会分享知识和服务,但你应该提前知道你想专注于哪里。
2。探索 AWS 学习途径
每种认证都提供了不同的学习途径,详细介绍了成功通过认证的建议步骤。
在每条学习路径中,都推荐了不同的入门或免费培训课程、要阅读或至少要考虑的 AWS 白皮书,以及用户在参加最终考试之前必须具备的其他要求或知识。
此外,每个步骤都根据其复杂程度(基础、中级或高级)进行分类,如有必要,还包括为保证当前认证成功而必须获得的推荐的先前认证。
3。阅读 AWS 白皮书
这似乎是不必要的,当然,在许多情况下我们忽略了这一步,但我告诉你这是值得的。
这些文章中涉及的所有细节对于深入理解考试中涉及的每项服务的内容至关重要。
事实上,许多问题都是从这些白皮书中摘录的,因此,如果我是您,我会花时间阅读这些白皮书,并查看您的认证中的一些常见问题或主题。
4。参加考试准备培训
我在上一次认证中发现了这一步骤,并取得了成功。
这些免费的 AWS 培训允许用户学习如何解释考试问题,并为考试中的每个部分分配必要的时间。
根据认证的不同,我们会以面对面课程、在线和其他网络研讨会的形式提供不同的培训,在这些培训中,我们会复习每个领域中的试题示例,以及如何解释不同的可能答案,以便更轻松地消除错误答案。全力推荐!
5。练习考试
练习,练习,练习。如果你想确保你控制了考试的所有环节,你想在考试中减轻任何担心或压力,那就练习吧!
而且不止一次,很多次。直到你差不多把问题和答案都背熟了。开始的几次可能是一场灾难,然后就值得了。
我建议在你以至少 80–85%的分数通过所有考试或测试之前,不要参加考试。
你的口袋会很感激!
获得 AWS 认证需要多少钱?
根据您考试的认证级别,价格如下:
- 从业者 = 100 美元
- 关联 = 150 美元
- 专业 = 300 美元
- 特产 = 300 美元
记住,一旦你通过了一门考试,你在下一门考试中会得到 50%的折扣。因此,如果您选择较便宜的联营公司(150 美元),您将获得较贵的联营公司(300 美元)的 50%。
让我用一个表格来分享这 12 项认证的详细信息:
耶,我有了我的第一个认证!现在怎么办?…
重新认证和保持最新状态
恭喜!这是第一步,但还没有全部完成。AWS 每年提供的新功能和服务的数量,我甚至可以说每个月都在增加。为了证明这不是巧合,并且您继续拥有更新 AWS 服务所需的经验和知识,认证持有者需要每两年重新认证一次。
**您有两种选择:**要么通过同一认证的专业水平重新认证,要么通过当前认证的重新认证考试。考试持续 80 分钟,费用 75 美元。
我可以在线获得 AWS 认证吗?
**全力推荐。**我上一次认证是 100%在线。
现在,您可以在线参加 AWS 认证,也可以在自己舒适的家中参加。但是,有些方面您可能需要考虑:
- 你必须能够与说英语的监考人交流。考试可以用不同的语言进行,但会有一个“控制者”在考试前问你一系列问题,并帮助你解决任何问题。总是用英语。您可以用英语、日语、韩语或简体中文参加考试,但与监考人的交流将使用英语。
- 在参加考试之前,您必须确保您的计算机符合系统要求(浏览器、麦克风、摄像头,以及工作区)。您必须拍摄工作空间的照片,以验证它是一个有效的房间。
- 考试期间不能被打扰,考场必须在一个私密安静的地方。
- 与面对面考试不同,考试期间你不允许离开房间或离开摄像头的范围(准备坐 3 个小时😉)
- 目前,在线监考仅适用于与我们的考试供应商皮尔逊 VUE 安排的 AWS 认证考试。
最后,让我来帮你!
关于不同 AWS 认证的所有信息可以在这里找到。
不过,让我来帮你让这次冒险更加愉快:
- edu reka 的 AWS 架构师认证培训 掌握使用亚马逊 Web 服务设计基于云的应用的技巧。了解更多!
- 以 50%的折扣获得为期 1 年的所有 Whizlabs 课程—立即订阅
- 成为 AWS 认证专家|使用优惠券— WHIZAWS20 并享受八折优惠|立即购买
那都是乡亲。希望这篇文章对你有用。
欢迎发表评论或分享这篇文章。跟随 me *进行未来岗位。*😉
祝你考试顺利!
与+1K 人一起加入我的电子邮件列表,获取更多独家内容
【oscargarciaramos.com】记住,如果你想了解更多,可以在 找我
[## AWS 认证数据分析-专业是由亚马逊网络服务培训和…
获得该认证的人员对如何使用 AWS 服务进行数据收集、存储…
www.youracclaim.com](https://www.youracclaim.com/badges/0b507f03-8d5d-40bf-b950-eedcfa763480/public_url) [## AWS 认证解决方案架构师助理由亚马逊网络服务培训和…
获得该认证的人员对 AWS 服务和技术有全面的了解。他们展示了…
www.youracclaim.com](https://www.youracclaim.com/badges/36a66d5e-c27d-4ca6-bd65-80b64fec61a4/public_url)
啤酒分析——从网络数据中分析啤酒价格的指南
使用散景在交货地点寻找价格最优惠的啤酒
几周前,我和女朋友在酒吧喝酒,开始争论菜单上最便宜的啤酒是什么。挑战本身是 20 种左右的啤酒有多种尺寸和酒精含量,这使得简单的比较成为一个挑战。赌注下好了,我们开始做手机数学(我发誓我们一直都这么兴奋),用一个基本公式来标准化它们:
奥兹。每$’ =((‘总盎司。’* ‘酒精%’) / 100) /价格
这表明,高 ABV 的 IPAs 是你的钱的最大价值!现在我又输给了我的女朋友,我很好奇这是一个当地的选择(也许酒吧很难出售这种饮料)还是这种定价在规模上是一致的?这似乎是一个有趣的数据科学问题,所以我开始头脑风暴来回答这个问题。
10 年前,如果没有专有数据集或走访每家商店并记下所有价格,这可能是不可能的(我肯定店主喜欢这样)。相反,我们现在有过多的送货服务,如 Drizly 和 Minibar,它们通过当地商店提供啤酒送货服务。
本文的其余部分将介绍如何使用 Python Requests 库从网站中提取数据的方法、基于所提取数据类型的图表和库选择,以及使用 Bokeh 库的中级到高级可视化技术。下面解释的最终文件和代码可以在这里找到并分支。
数据争论
正如我在介绍中所说的,第一个挑战是捕获数据,以便我可以对其进行分析。两者都没有 API,所以我开始研究他们的网站和网络调用的结构,看看哪一个/哪一个是可行的。Drizly 有一种非常奇怪的方式将数据直接注入 react 组件,这样在网络调用中就不会有简单的 JSON 有效载荷(也许是为了混淆的目的?),显然要花很多时间才能把它变成可用的形式。将焦点转移到 Minibar 上,我很快发现他们不仅有一个容易抓取的标准 JSON 有效载荷,而且还有一堆元数据,耶!
XHR 的 JSON 来电
一旦我发现了这一点,就可以使用 Requests 库来拉 JSON 了…或者我是这样认为的。创建一个简单的请求后,我遇到了一条错误消息:
告诉我你的秘密
嗯,这有点尴尬。运行item_count.status_code
还确认了一个 401 未授权错误,这意味着我们的响应正确地到达了服务器,但是由于请求中缺少某种凭证而被拒绝。由于令牌不是凭空创建的,并且站点不需要登录,唯一合乎逻辑的结论是,一旦用户访问站点,就必须为会话创建令牌。这促使我检查上面提到的 XHR 请求的请求头部分,瞧,我发现了一个不记名令牌:
啊,缺失的拼图
一旦我添加了头参数,我就能够确认这个工作并返回数据了!下一个挑战是弄清楚如何以编程方式获取不记名令牌并将其添加到请求中,因为令牌可能会在一定时间内自动过期。我的计划大致变成了:
- 首先向https://minibardelivery.com/发出请求,因为它不需要特殊授权就可以访问并获取它给我的不记名令牌
- 使用头有效负载中的载体向我的目标 JSON 目标发出请求
- 循环遍历并将数据展平到一个数据帧中
在主页上很难找到持有人,因为它不在任何 XHR 请求中,而是作为一个元名称标签包含在内:
偷偷摸摸
那么如果它不在 json 中,我们如何获取它呢?简单,我们就当普通网页用美汤!这可以通过编写一个非常简单的函数来实现:
def get_token():
url = '[https://minibardelivery.com'](https://minibardelivery.com')
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
bearer_token = soup.findAll(attrs={"name":"access-token"})[0]['content']
return bearer_token
如您所见,我们所做的只是向 Beautiful Soup 指定文本应该像 HTML 一样处理,然后告诉它返回 access-token 属性的内容。这使我们不用做任何复杂或容易出错的正则表达式来寻找令牌。既然我们可以随时动态获取数据,那么只需将它展平到一个数据帧中。
查看 JSON,许多啤酒都有“变种”(不同的价格取决于包装尺寸/特定商店的销售额/容器类型等。)我也想捕捉和对比。使用下面的代码,我能够根据初始调用中的 count 变量遍历所有的 beers,将每个变量添加为单独的行项目,然后将其输出到单个数据帧中
import requests
import pandas as pd
import numpy as np
import time
from bs4 import BeautifulSoupdef get_token():
url = '[https://minibardelivery.com'](https://minibardelivery.com')
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
bearer_token = soup.findAll(attrs={"name":"access-token"})[0]['content']
return bearer_tokenurl = '<the json url>'
bearer_token = get_token()
header = {'Authorization': 'bearer {}'.format(bearer_token)}
item_count = round(requests.get(url+str(1), headers=header).json()['count']/20)def alc_pct(x):
if x is None:
x = np.nan
else:
x = x['value']
return xbeer_df = pd.DataFrame([])
for x in range(1,item_count+1):
time.sleep(3)
data = requests.get(url+str(x), headers=header).json()
for i in range(0, len(data['product_groupings'])):
core_data = {key: data['product_groupings'][i][key] for key in data['product_groupings'][0].keys() & {'name','type','brand'}}
core_data['hierarchy_type'] = data['product_groupings'][i]['hierarchy_type']['name']
core_data['hierarchy_subtype'] = data['product_groupings'][i]['hierarchy_subtype']['name']
core_data['alcohol_pct'] = alc_pct(next((item for item in data['product_groupings'][i]['properties'] if item["name"] == "Alcohol %"), None))
variant_df = pd.DataFrame([])
for v in range(0, len(data['product_groupings'][i]['variants'])):
variant_data = {key: data['product_groupings'][i]['variants'][v][key] for key in data['product_groupings'][i]['variants'][v].keys()
& {'price','short_pack_size','short_volume','container_type','supplier_id'}}
core_data.update(variant_data)
variant_df = variant_df.append(core_data, ignore_index=True)
beer_df = beer_df.append(variant_df)beer_df.to_csv('beer_data.csv')
一旦我的数据框中有了大约 2000 瓶啤酒,我就使用 missingno 库来了解这些数据有多完整:
哎呀,酒精百分比
结果是,酒精百分比,我整个实验的关键,在很多啤酒中都找不到,大约是数据集的 3/5。固执和热情蒙蔽了我的双眼,我做了任何一个理性的人在这种情况下都会做的事情——我从商店里拿了一罐 6 罐装啤酒,然后花了几个小时手动输入我在搜索 https://untappd.com/等网站时找到的数值。最终,我完成了啤酒和数据输入,并准备进入下一阶段。
选择正确的可视化
现在我们有了一个好的数据集,我们需要考虑如何有效地可视化数据。数据有定量和分类两个维度,我们想要比较诸如啤酒类型、容器类型等。针对不同的属性。考虑到任何给定点的潜在数据点的数量,散点图是一个很好的选择,因为它们能够轻松地显示模式和相关性趋势。我还知道我想用可视化来执行一些不同的高级交互:
- 我希望它是高度互动的,因为“最好”的啤酒可能是我再也不想喝的(看着你眼镜王蛇)。我还想过滤和理解复杂的情况,如“价格最好的 IPA 6 包装,ABV 至少为 6%”
- 我希望能够将颜色映射到显示中的定量点和分类点。这将使得在查看不同度量时更容易识别模式成为可能。由于一些数据也是高度基数的,我想分配独特的颜色,而不是一遍又一遍地重新映射 10 或 20 种颜色。
在尝试了一些熟悉的简单图形库之后,我意识到如果没有一个高度灵活和可定制的库,这是行不通的。我最终选择了散景,它不仅有一个巨大的预制图表库,还提供了一些很棒的例子——尤其是这个移动评级一。我决定这一个将适合我的需要,只有小的调整,所以它是全速前进!
被散景弄得又脏又脏
我现在警告你,如果你想用散景做基本图形之外的事情,阅读文档。一开始我很抗拒,结果我像一个迷路的孩子一样在 Stack Overflow 和 Google 上过滤了几个小时。理解在哪里访问和更新像字形这样的对象的结构以及ColumnDataSource
如何更新数据是你应该尝试和理解的关键概念,而不要深入太多。
我的第二个免责声明是,这些代码中的一些可能效率不高,但如果我试图调整/理解它,我就永远不会发表这些。
脚手架
在浏览了他们网站上的一些例子后,大部分散景都很容易理解,而且我基本上是用电影的例子。要点中的想法是:
- 导入库和数据,创建所需的自定义指标,对数据集应用任何格式化/清理:
import os
import pandas as pd
from bokeh.io import curdoc
from bokeh.layouts import column, layout
from bokeh.models import ColumnDataSource, Div, Select, Slider, LinearColorMapper, ColorBar, CategoricalColorMapper, Legend, LegendItem, CustomJS
from bokeh.plotting import figure
from bokeh.transform import jitter
from bokeh.palettes import Reds9, Turbo256, d3
from bokeh.models.widgets import CheckboxButtonGroup, DataTable, TableColumndf = pd.read_csv('beer_data.csv')
df['brand'] = ['uncat' if str(x) == 'nan' else x for x in df['brand']]
df['hierarchy_type'] = ['uncat' if str(x) == 'nan' else x for x in df['hierarchy_type']]
df['hierarchy_subtype'] = ['uncat' if str(x) == 'nan' else x for x in df['hierarchy_subtype']]
df['total_oz'] = df['short_pack_size_num'] * df['standard vol']
df['cost_per_oz'] = round(df['price'] / df['total_oz'], 2)
df['oz_of_alcohol_per_dollar'] = round(((df['total_oz'] * df['alcohol_pct']) / 100) / df['price'], 2)
- 为轴和颜色选择创建字典。用户可以选择 x/y 轴以及颜色所基于的尺寸/度量:
axis_map = {
"Oz of Alcohol per $": "oz_of_alcohol_per_dollar",
"Cost per Oz": "cost_per_oz",
"ABV": "alcohol_pct",
"Pack Size": "short_pack_size_num",
"Volume (Oz)": "standard vol",
"Price": "price"}color_axis_map = {
"ABV": "alcohol_pct",
"Brand": "brand",
"Container Type": "container_type",
"Category": "hierarchy_type",
"Sub-Category": "hierarchy_subtype",
"Price": "price",
"Pack Size": "short_pack_size",
"Volume": "short_volume",
"Supplier": "supplier_id",
"Type": "type",
"Oz of Alcohol per $": "oz_of_alcohol_per_dollar",
"Cost per Oz": "cost_per_oz"}
- 创建工具提示格式,一个解释图表的描述部分,然后我们将在边上使用的小部件过滤器。然后,我们将为图形和表格创建一个 ColumnDataSource:
tooltips = [
("Name", "[@name](http://twitter.com/name)"),
("Brand", "[@brand](http://twitter.com/brand)"),
("Price $", "[@price](http://twitter.com/price)"),
("ABV", "[@alcohol_pct](http://twitter.com/alcohol_pct)"),
("Category", "[@hierarchy_type](http://twitter.com/hierarchy_type)"),
("Category Sub-type", "[@hierarchy_subtype](http://twitter.com/hierarchy_subtype)")]# Create description at top of webpage
desc = Div(text=open("description.html").read(), sizing_mode="stretch_width")# Create unique option lists for some of the widget filters
container_options = list(df['container_type'].unique())
pack_size_options = sorted(list(df['short_pack_size'].unique()))
hierarchy_options = sorted(list(df['hierarchy_type'].unique()))
sub_hierarchy_options = sorted(list(df['hierarchy_subtype'].unique()))
brand_options = sorted(list(df['brand'].unique()))for i in [pack_size_options, hierarchy_options, sub_hierarchy_options, brand_options]:
i.insert(0, "All")# Create widget filters
min_abv = Slider(title="ABV", start=0, end=20, value=1, step=1)
jitter_amt = Slider(title="Jitter", start=0, end=1.0, value=0.1, step=0.1)
container_check = CheckboxButtonGroup(labels=container_options, active=[0, 2])
brand = Select(title="Brand of Beer", value="All", options=brand_options)
pack_size = Select(title="Pack Size", value="All", options=pack_size_options)
hierarchy = Select(title='Category', value="All", options=hierarchy_options)
sub_hierarchy = Select(title='Sub-Category', value="All",
options=sorted(sub_hierarchy_options))
y_axis = Select(title="Y Axis", options=sorted(axis_map.keys()),
value="Oz of Alcohol per $")
x_axis = Select(title="X Axis", options=sorted(axis_map.keys()), value="ABV")
circle_color = Select(title="Circle Color",
options=sorted(color_axis_map.keys()), value="Price")# Create Column Data Sources that will be used by the plot and table
source = ColumnDataSource(data=dict(df))
table_source = ColumnDataSource(data=dict(df))
这看起来有很多代码,但主要是为过滤器创建唯一的列列表,将这些列表分配给小部件,并为过滤器设置默认值。
我们还将添加一个部分来创建图形、字形和最终图表所需的所有样式。我们在这里有一个条形图和图例,因为我们需要切换它们的可见性,以便在定量和分类选择之间切换:
p = figure(background_fill_color='black', background_fill_alpha=0.5,
border_fill_color='gray', border_fill_alpha=0.25,
plot_height=250, plot_width=500, toolbar_location='below', tooltips=tooltips, tools="pan,box_select,wheel_zoom,reset,help",
active_drag="box_select", active_scroll='wheel_zoom'))c = p.circle(x=jitter('x', width=jitter_amt.value, range=p.x_range),
y=jitter('y', width=jitter_amt.value, range=p.y_range),
source=source, size='price', line_color=None,
fill_color={"field": color_axis_map[circle_color.value], "transform": cmap})bar = ColorBar(background_fill_color='gray', background_fill_alpha=0, color_mapper=cmap, location=(0, 0), visible=True)legend = Legend(items=[LegendItem(label=dict(field="x"), renderers=[c])],location=(10, -30), background_fill_alpha=0, visible=False)columns = [
TableColumn(field="name", title='Name'),
TableColumn(field="type", title='Type'),
TableColumn(field="container_type", title='Container Type'),
TableColumn(field="short_pack_size", title='Pack Size'),
TableColumn(field="short_volume", title='Volume'),
TableColumn(field="price", title='Price'),
TableColumn(field="alcohol_pct", title='ABV'),
TableColumn(field="cost_per_oz", title='Cost per Oz'),
TableColumn(field="oz_of_alcohol_per_dollar", title='Oz of Alcohol per $')]data_table = DataTable(source=table_source, columns=columns, selectable=False)p.add_layout(bar, "right")
p.add_layout(legend, 'right')
完美!既然基础知识已经完成,我们可以进入更高级的概念了。
挑战 1 —色彩映射
我想做的事情之一是将分类数据或定量数据映射到图上的点。我希望颜色条也能根据定量数据进行调整,否则异常值(比如小桶的价格)会扰乱过滤数据的颜色分布。在没有深入基本问题的情况下,我的逻辑最终是这样的:
- 基于默认变量定义初始颜色映射。我选择了 price,所以我默认使用 Bokeh 的
LinearColorMapper
,但是如果我默认使用一个分类值的话,我会把它变成一个CategoricalColorMapper
- 创建一个
rescale_color
函数,在更新时将线性颜色映射重新调整到新的最小/最大过滤值 - 创建一个
categorical_color_scale
函数,将分类色标映射到提供的任何分类列表。我还添加了一个特殊的色标,用来更好地映射高度基数的数据(比如品牌) - 创建一个
cat_linear_color_toggle
函数,在更新时确定颜色窗口小部件过滤器中的当前活动值是分类的还是定量的 - 创建一个
show_hide_legend
函数来切换颜色条(定量图例)和图例(分类图例)的可见性
def rescale_color(cmap, df):
"""Rescale the linearcolormapper based on the dataframe provided"""
cmap.low = min(df[color_axis_map[circle_color.value]])
cmap.high = max(df[color_axis_map[circle_color.value]])
return cmapdef categorical_color_scale(color_list):
"""Returns a different size color scale based on color list size"""
if len(color_list) < 30:
colors = d3['Category20'][20]+d3['Category20b'][10]
else:
colors = Turbo256
return colorsdef cat_linear_color_toggle(color_col, df):
"""Changes color scale based on whether color is displaying a quantitative
or categorical value upon a transformation"""
if df[color_col].dtype == 'float64' or df[color_col].dtype == 'int64':
color_mapper = rescale_color(cmap, df)
else:
cat_list = list(df[color_col].astype(str).unique())
color_mapper = CategoricalColorMapper(
factors=cat_list, palette=categorical_color_scale(cat_list))
return color_mapperdef show_hide_legend(attr, old, new):
"""Used for switching to and from categorical scale"""
color_val = color_axis_map[circle_color.value]
if df[color_val].dtype in (float, int):
p.legend.visible = False
bar.visible = True
else:
p.legend.visible = True
bar.visible = False
现在我们已经有了更新色标/图例的框架,我们可以继续讨论一旦用户与我们的小部件过滤器交互,如何更新所有内容。
挑战 2 —更新图表和过滤数据
为此,我们将在很大程度上反映电影图表示例,但我将简要介绍一下这些概念。我们希望创建一个名为select_beer()
的函数,它将为我们的小部件过滤器找到所有当前值,然后根据这些选择过滤数据集:
def select_beers():
"""Filter data source based on widget filter input"""
container_check_val = container_check.active
abv_val = min_abv.value
brand_val = brand.value
pack_size_val = pack_size.value
hierarchy_val = hierarchy.value
sub_hierarchy_val = sub_hierarchy.valueselected = df[df['alcohol_pct'] > abv_val]
if (container_check_val != 4):
container_name_list = [container_check.labels[i] for i in container_check_val]
if len(container_name_list) == 0:
container_name_list = container_options
selected = selected[selected.container_type.isin(container_name_list)==True]
if (brand_val != "All"):
selected = selected[selected.brand.str.contains(brand_val)==True]
if (pack_size_val != "All"):
selected = selected[selected.short_pack_size.str.contains(pack_size_val)==True]
if (hierarchy_val != "All"):
selected = selected[selected.hierarchy_type.str.contains(hierarchy_val)==True]
if (sub_hierarchy_val != "All"):
selected = selected[selected.hierarchy_subtype.str.contains(sub_hierarchy_val)==True]
return selected
我们要写的下一件事是一个update()
函数,它将更新图形元素(例如轴的名称和所选啤酒的总数),以及更新ColumnDataSource
,这是图形上的数据是如何更新的。它将通过调用cat_linear_toggle
并更新图例,最终强制更新图例/色标。最后一点适用于新过滤数据的抖动:
def update():
"""Updates graph elements and source.data based on filtering"""
filtered_df = select_beers()
x_name = axis_map[x_axis.value]
y_name = axis_map[y_axis.value]
p.xaxis.axis_label = x_axis.value
p.yaxis.axis_label = y_axis.value
p.title.text = "%d beers selected" % len(filtered_df)
color_select = color_axis_map[circle_color.value]source.data = dict(
x=filtered_df[x_name],
y=filtered_df[y_name],
name=filtered_df["name"],
brand=filtered_df["brand"],
price=filtered_df["price"],
container_type=filtered_df["container_type"],
hierarchy_type=filtered_df["hierarchy_type"],
hierarchy_subtype=filtered_df["hierarchy_subtype"],
short_pack_size=filtered_df["short_pack_size"],
alcohol_pct=filtered_df["alcohol_pct"],
short_volume=filtered_df["short_volume"],
supplier_id=filtered_df["supplier_id"],
type=filtered_df["type"],
oz_of_alcohol_per_dollar=filtered_df["oz_of_alcohol_per_dollar"],
cost_per_oz=filtered_df["cost_per_oz"])
table_source.data = source.datatransform_scale = cat_linear_color_toggle(color_select, filtered_df)
c.glyph.fill_color = {"field": color_select, "transform": transform_scale}
p.legend.items[0].label = {'field': color_select}
if filtered_df[color_select].dtype in (float, int):
bar.color_mapper = rescale_color(cmap, filtered_df)
c.glyph.x = jitter('x', width=jitter_amt.value, range=p.x_range)
c.glyph.y = jitter('y', width=jitter_amt.value, range=p.y_range)
在这之后,我们需要做的就是为我们所有的控件设置回调。最终输出与电影示例中的普通散景非常相似。我在末尾添加了一个os.system(...)
,以便于在本地运行:
# Determine if legend type needs to change
circle_color.on_change('value', show_hide_legend)controls = [min_abv, jitter_amt, container_check, brand, pack_size, hierarchy,
sub_hierarchy, x_axis, y_axis, circle_color]for control in controls:
if (control == container_check):
container_check.on_change('active', lambda attr, old, new: update())
else:
control.on_change('value', lambda attr, old, new: update())inputs = column(*controls, width=320, height=500)
inputs.sizing_mode = "fixed"
l = layout([[desc], [inputs, p], [data_table]], sizing_mode="scale_both")update() # initial load of the datacurdoc().add_root(l)
curdoc().title = "Beer Plot"os.system("bokeh serve --show bokeh_scatter.py")
运行这一切让我第一次看到了我们放在一起的东西,不错!
最终的图形,过滤器,色标和数据表!
最终挑战—基于图形选择的过滤
在这一点上,我对输出感到非常满意,并认为我已经完成了,但是一旦我开始检查数据,我就试图突出显示图表上的点区域来过滤数据表。许多数据点相互重叠,如果没有办法看到底层的选择区域,就很难进行检查。散景图自然地通过它们的默认工具如box_select
来处理图表上的数据选择,但是没有默认的方法来在数据表上反映这一点。
在阅读和搜索了更多相关信息后,我得出了一个不幸的结论,那就是使用默认库无法做到这一点……ughhhhh。幸运的是,Bokeh 允许通过 CustomJS 模型使用 JavaScript,我需要完成的事情只需要很少的 JS 知识。我们想要做的如下:
- 当源数据上的选择发生变化时,创建一个执行定制 javascript 的回调
- 获取所选点的指数
- 如果 selection > 1,则创建一个空字典,然后用 source.data 中索引与索引匹配的数据填充
- 用新字典更新表格
# Use custom JS so that filtering on the graph affects the data table as well
source.selected.js_on_change('indices', CustomJS(args=dict(source=source, table_source=table_source), code="""
var inds = cb_obj.indices;
var d1 = source.data;if(inds.length == 0){
table_source.data = d1
}
else{
d2 = {'name': [], 'type': [], 'container_type': [],
'short_pack_size': [], 'short_volume': [], 'price': [],
'alcohol_pct': [], 'cost_per_oz': [], 'oz_of_alcohol_per_dollar': []}for (var i = 0; i < inds.length; i++) {
d2['name'].push(d1['name'][inds[i]])
d2['type'].push(d1['type'][inds[i]])
d2['container_type'].push(d1['container_type'][inds[i]])
d2['short_pack_size'].push(d1['short_pack_size'][inds[i]])
d2['short_volume'].push(d1['short_volume'][inds[i]])
d2['price'].push(d1['price'][inds[i]])
d2['alcohol_pct'].push(d1['alcohol_pct'][inds[i]])
d2['cost_per_oz'].push(d1['cost_per_oz'][inds[i]])
d2['oz_of_alcohol_per_dollar'].push(d1['oz_of_alcohol_per_dollar'][inds[i]])
}
table_source.data = d2
}
"""))
我们做到了!最终结果应该只显示数据表中反映的选定点,类似于我在图表上选择几个数据点时看到的内容:
选择被突出显示,表格被动态过滤
结论
我知道你可能在想什么——那真正的啤酒呢?!结果很少有惊喜,麦芽饮料品牌 4Loko(又名罐装电池酸)是我所在地区最便宜的,每盎司酒精 0.72 美元,比第二名挑战者每盎司便宜 0.10 美元。“酒精%”(ABV)被证明是价值的最佳基线预测值,您可以通过探索性数据分析或其他方式进行确认。
最终,您可能会做更多的事情,例如将额外的邮政编码区域或站点包括在此分析中,但是过多的丢失数据肯定会影响您在没有一些手动数据清理的情况下所能做的事情。使用散景也很有趣,但我不确定将来我会不会把它作为图形的首选。也许如果我正在做数据可视化的工作,我会考虑它,但是对于人们需要用图表显示的大多数东西来说,学习曲线是相当陡峭的。
希望这对任何人都有帮助,并随时联系或在下面评论问题/评论。感谢阅读!