高亮显示 Plotly Choropleth 地图上的点击数据
作者图片
在最近的一个项目中,我做了一个英国房价 Plotly 应用程序。一个挑战是突出显示 choropleth 地图中被点击的部分。在撰写本文时,这样的功能还不容易获得,所以这里有一个方法来解决它。
为了便于说明,我将修改 plotly 文档中的 election-choropleth 示例。完整的代码可以在这里的谷歌可乐实验室笔记本上找到。
基本思想是添加第二个图层,其中仅包含相应 geojson 中的选定区域,并跟踪在状态变量中被单击或取消单击的区域。
GeoJSON 是一种开放标准地理空间数据交换格式。对于我们的 geojson 文件,我们希望选择包含所选地区的 geojson[‘features’]元素。为了加快查找过程,我们将首先获得一个 district_lookup 字典:
然后,我们编写一个函数来获取所选地区的 geojson 文件:
给定一个选择列表,现在我们可以在图的第二层使用函数 get_highlights() 来获得高亮效果,我们将选择的不透明度从 0.5 增加到 1.0。我们还可以用其他方式高亮显示被点击的区域——只需为第二层指定所需的格式。
现在我们准备运行应用程序。dash_core_components.graph 组件有一个属性“click data”——当地图上有点击时,事件会触发回调函数,更新集合“selections”和图。
作者图片
希望这个小技巧对你有所帮助,祝你的项目好运!
突出显示熊猫数据框架中的列
提高效率
如果处理数据是你的日常工作,你肯定用过,或者至少听说过熊猫。简而言之,Pandas 提供了您在 Python 中探索数据集所需的一切。
如果你试图通过向某人展示你的原始数据框架来解释数据,你会让他们感到困惑而不是理解。设计你的数据框架,突出重要的部分,将有助于你更清晰地传递信息。
如果您正在对一组列应用处理步骤,并来回检查数据帧的结果,那么您很可能是在浪费时间定位要查看的列。当然,切片和切块会有所帮助,直到你面对它们不起作用的某些情况。
风格模块熊猫就是你需要的。有条件地设置数据帧样式的功能允许许多自定义样式的可能性。突出显示列是您可以实现的一种自定义样式。
下面的函数提取了突出显示功能,并准备好复制/粘贴到您的笔记本上。
所有的奇迹都发生在第 5 行代码上。您访问 DataFrame 的 style 属性,并对指定要突出显示的每一列,将"*background-color:light green "*设置为它们的样式配置。该函数返回 Styler 对象,而不是 DataFrame。
Pandas 数据框架中的列突出显示示例
对于这个和其他造型选项,请看一下熊猫造型模块。
数据科学家希波克拉底誓言
意见
每个数据科学家都必须遵循的道德清单
数据和信息技术的合力正在推动人类企业几乎每个领域的创新。
经济统计很明确:根据 麦肯锡全球研究所 的数据,全球数据量每三年翻一番。这种指数级增长主要与数字平台、无线传感器和流通中的数十亿部智能手机的兴起有关。然而,在这样的数据流中,对道德和人的尊重可能受到威胁。
事实上,数据科学已经到了一个伦理承诺被认为是必要的地步。
证明关注 数据科学伦理 的必要性不仅仅是观察这些机遇和挑战,因为数据科学的实践挑战了我们对*“成为人类”的理解*
虽然大学迅速实施了专注于统计、机器学习和数据工程的数据科学项目,但很少有项目解决数据科学更广泛的社会问题。更少有人分析如何限制甚至鼓励负责任的数据实践。
虽然在过去四十年中,人们广泛讨论了信息技术对私营和公共企业组织的影响,但数据科学对企业管理的影响却很少受到关注。
通过关注数据科学,这些上下文关系揭示了他们自己的伦理考虑。如果数据从来都不是客观的,那么管理层需要在多大程度上理解数据收集、分析和传输的背景?
同样,随着算法变得越来越广泛和复杂,数据科学家应该在多大程度上理解他们自己的假设和限制?
“在医学领域,你从第一天开始就要学习伦理。在数据科学中,这并不常见。事实上,它必须从第一天起就存在,并且在你采取的每一步中都在你脑海的最前方。”
许多组织开始雇佣数据科学家,这些数据科学家对如何分析数据和获得最大的洞察力以根据算法做出决策有着深刻的理解。在分析这些数据时,数据科学家面临着道德挑战,如数据收集偏差、算法偏差、解释结果、保密性等。为了制定和产生道德上好的解决方案,他需要坚持一些道德准则来指导他
那么,我们如何才能让数据科学家变得更有道德,什么可以激励数据科学家从事道德工作,或者已经建立了什么道德法律或规则来激励道德环境?
迄今为止,还没有法律或规则来激励数据科学家的道德环境。然而,作为数据科学社区的一名成员和一名新的数据科学顾问,我试图建立几个道德原则,这些原则将指导我并告知良好的数据科学实践。我还写了一份关于数据科学希波克拉底誓言的草稿,我将在本文中与您分享。
基本原则:
对于每一个收集、存储、分析数据和设计算法的专业数据科学家来说,都有必要评估他的工作对个人和整个社会的影响。
这就是为什么他需要尊重以下三个原则:
1.责任和中立
每个数据科学家都必须在出现违规或利益冲突时承担自己的责任,如果发现任何与数据相关的非法行为,他必须发出警报。他还必须在职业活动中尊重人的各方面的隐私和尊严。
2.透明度
作为一名数据科学家,我有权以可理解和准确的方式向所有利益相关方告知我使用数据的目的、方式和潜在影响。
3.股权
我将始终确保个人或团体不会因为与我的数据工作直接或间接相关的非法或不合理的标准而受到歧视。
希波克拉底誓言:
在本节中,您将发现一些关于您的行为和行动的承诺,这些承诺将帮助您推进您的数据科学职业生涯。
我在一个面向“数据”的项目中工作
我承诺…
- 质疑项目的目的及其合法性。
- 尽最大努力确保我的工作条件,特别是分配给我的工作时间,允许我尽可能诚实地和科学地处理数据。
- 确保要优化的指标是相关的,并且不会导致项目产生负面的社会和环境影响。
我收集和储存数据
我承诺…
- 以尽可能清晰、明确和透明的方式,向相关人员传达或以其他方式提醒主管团队需要传达其数据的用途。
- 确保我收集的数据是在对其公平、明确和透明的条件下获得的。如果随后使用条件发生变化,确保这些变化也清楚有效地传达给他们。
- 确保我负责的数据得到安全管理和存储。
- 切勿收集或使用不必要的个人和/或敏感数据。
- 避免收集我有理由相信对项目需求无用的数据。
- 我收集或拥有的数据是正确的,并且我完全理解其含义。为此,我承诺尽可能多地追踪数据的来源和创建过程,以及对数据的任何修改。
我准备并探索数据
我承诺…
- 不创建等同于敏感个人数据的特征数据(“特征”),如果其使用可能导致非法或不正当的歧视性影响(例如:邮政编码、姓氏……)。
- 在消除或估算缺失值/异常值时,注意不要引入会导致部分或错误结果的额外偏差。
- 证明和记录我的清洁没有任何选择偏见。
我设计并应用算法模型
我承诺…
- 向相关人员解释算法模型的结果。
- 测量偏差和方差以控制结果的准确性和分散性,并记录所用的误差指标。
- 确定所有可用模型的性能和可解释性之间的最佳折衷,并尽可能选择对相关人员解释起来最简单的模型(高性能模型将降低错误风险,而可解释模型将更好地证明模型结果)。
- 预测并防止模型相对于数据的可能漂移,以避免额外偏差的出现。
- 设置并测试几个模型,不要停留在第一个看起来不错的模型和设置上。
我向利益相关者展示结果
我承诺…
- 如果我注意到对结果的欺诈、非法、不正当或歧视性使用,请发出警报。
- 通过确保尽可能准确的理解和选择最有意义的可视化和解释,向我的客户和我的团队传达我的方法和我的结果(或它们的缺失)。
- 详细说明对这些结果及其解释通常采取的预防措施。
我完成了这个项目
我承诺…
- 预见我的工作在长期内的用途,并尽我最大的努力保持审查的权利和行动的可能性。
- 确保数据的保存时间不会超过项目期间定义的应用程序所需的时间。
- 尽可能多地记录数据及其处理过程,以保证它们的可解释性和可再现性。
结论
道德无疑是重要的,在一个完美的世界里,它将成为任何教育的一部分。这一道德誓言将有助于创造一个道德环境,因为据说强大的权力伴随着巨大的责任。
数据科学家需要这样的誓言,就像医生发誓只为病人的最大利益行事一样。做一个有道德的数据从业者将有助于为安全的社会参与和整合铺平道路。
HireAttorney——为辩护律师带来更集中的市场
使用机器学习识别更有可能雇佣私人律师的被告。
作者图片
我最近为一家律师事务所提供咨询,以确定哪些被告更有可能使用他们的服务。
此前,他们试图向所有被告发送电子邮件,但回复率接近于零。他们还试图在运用另一种营销策略的同时,根据被告的经验来确定雇用他们的可能性较高的被告,但这有两个问题。一个是这很耗时,因为他们需要手动分析被告的所有信息。另一个原因是,即使他们利用自己的经验来指认被告,回应率仍然很低。他们要么向错误的人营销,浪费了大量的营销资金和时间,要么忽视了一个客户,错过了一笔潜在的财富。
那么,如何确定一个高质量的市场,使公司更好地利用他们的时间和金钱,同时,他们不会失去任何潜在的客户?
一种解决方案是使用机器学习预测被告聘请私人律师的概率,这为他们提供了一种快速准确的方法来识别潜在客户。
有哪些数据可用?
我掌握的数据是 35。包含 10 年历史犯罪记录的 txt 文件。将数据合并到。csv 文件,我有超过 3M 的行,超过 40 个混合数据类型的变量,包括文本,分类和数字数据。一些列是文件日期、案件编号、案件类型、逮捕日期、犯罪日期、法官、被告信息等。我还注意到数据集是未标记的。
创建标签
因为数据集是无标签的,所以第一步是根据律师的姓名创建标签。
图。1 作者图片
这是一种半自动的方法。我写了一个 python 函数来识别关键字。它选择了公共律师中最常见的词,如办公室,公共等。但随着它添加更多的关键字,它将一些私人律师归类为公共律师。在这种情况下,我必须从关键字集中删除这些单词。我反复进行这个过程,以尽量减少错误。然后使用精炼的关键词集来创建标签。如果该名称包含任何关键字,则它被分类为 public 否则就是隐私。
当我得到标签时,我意识到数据集是不平衡的。公设律师的观察次数大约是私人律师的 5 倍。
图。2 作者图片
EDA 和数据清理
创建标签后,我做了 EDA、数据清理和功能工程。我重复了这个过程来提炼特性。
数据集相当混乱。例如,日期采用不同的格式,同一类别可以有不同的名称、空格、空单元格等。以下是我如何清理数据的一些例子。
图。3 作者图片
我对所有日期进行了规范化,并将其转换为 datetime 类型。对于文本数据,我删除了所有的前导和尾随空格,并将小写转换为大写。至于名称不同但指向同一事物的类别,我将其合并为一个。
特征工程
特征工程是这个项目中最具挑战性的部分之一。虽然有超过 40 个变量,除了性别和种族,我不能直接使用任何变量。我与该公司密切合作,了解哪些因素会影响被告的决定。我选择了相关变量,并推导出可以反映被告行为的重要特征。
具体来说,在特征工程中,我关注三件事。首先,我删除了未来信息,以确保未来不会被用来预测过去。一些变量,如处置描述、监禁类型等,在被告决定是否聘请私人律师时是未知的,这些信息会导致数据泄露。
图。4 作者图片
第二,我降低了一些有太多层次的分类特征的类别。比如在特写逮捕机构,我有 160 个类别。但是只有三个类别是最常见的,所以我将其他类别归为一类,总共分为四类。
最后也是最重要的,我得出了反映被告行为的重要特征。这里有两个例子。
图。5 作者图片
地区收入中位数反映了被告的经济状况。我从被告的地址中提取了邮政编码,我从美国人口普查中收集了中等收入数据。我将这两者结合起来,得到我的数据集的地区中值收入。
图。6 作者图片
年龄是反映被告行为的另一个重要特征。为了估计被告的年龄,我把三个日期结合起来,取其一,然后减去被告的出生日期。
建模和性能
一个合适的算法应该能够处理混合的特征类型和不平衡的结果。它应该具有良好的预测性能,运行速度快且可解释。所以我选择了一个平衡随机森林作为我的最终模型。
标准随机森林从训练数据的引导样本(即,具有替换的样本)中归纳出每个单独的树。在学习不平衡数据时,很有可能引导样本包含很少或甚至不包含少数类,从而导致树在预测少数类时性能不佳。为了克服这个问题,平衡随机森林在每个类中使用分层引导样本,即,当构建每个单独的树时,它从每个类中抽取相同数量的案例,以便它从每个类中学习。
图。7 作者图片
从混淆矩阵来看,真阳性率和真阴性率都在 85%以上,表明我的模型对多数类和少数类都表现良好。
最低成本
当向被告营销时,我们遭受两种类型的错误。
该模型输出被告聘请私人律师的概率,并根据阈值做出决定。
那我们应该如何选择门槛呢?例如,如果我们将阈值设置为 0.2,我们会“忽略”更少,但我们会接触更多的“错误的人”。相反,如果我们将阈值设置为 0.9,来自“错误的人”的错误会更少,但我们会“忽略”更多。那么我们应该如何平衡这两类错误呢?
为了使我们在向被告营销时遭受的两类错误的成本最小化,我引入了一个有成本的模型。
图。8 作者图片
当我们将两种错误的估计成本代入模型时,我们会得到一个建议的阈值和最小成本。
让我们看看它是如何工作的。
图。9 作者图片
当我们将“错误的人”的估计成本(800 美元)和“忽视”的估计成本(1000 美元)输入到有成本的模型中时,模型将基于所有阈值计算不同的总体成本。然后,该模型选择给出最小成本的阈值。在这个例子中,最佳阈值是 0.533,最小成本是 83 美元。
图。10 作者图片
我还计算了遭受这两种错误的成本,即 416 美元,这表明当使用我的模型时,我们每例平均节省了 300 多美元。
数据伦理
由于数据的敏感性,我确实观察了不同人口统计群体的模型表现,如性别和种族,我的模型对每个群体都通用。
图。11 作者图片
两组中的律师分布是不同的。根据数据,白人的私人律师比其他种族的多。但是我的模型在向两个群体推荐私人律师方面有相似的比例,这意味着这个模型对每个群体都是通用的,它没有偏见。
图。12 作者图片
同样的事情也发生在性别上。我的模型对女性和男性推荐私人律师的比例相似,这意味着该模型对女性和男性都通用。
感谢阅读!享受你剩下的一天吧!
参考资料:
[1]陈超、安迪·廖和利奥·布雷曼,使用随机森林学习不平衡数据(2004) ,加州大学伯克利分校技术报告
雇佣数据科学顾问时避免陷阱。
咨询, Pixabay。
对需求、愿望和需要以及常见实践的洞察。
在过去的几年里,我有幸与几位顾问、学术专家、自由职业者或在各种情况下为每个项目工作的个人一起工作。以下是当您的组织实际需要它们或者当组织内的某个人认为他们需要它们时的具体用例。我希望通过描述这些用例,我可以澄清一些可能出现的问题,当需要顾问时,有助于做出正确的决策。
术语:数据科学、数据科学家(DS)、机器学习(ML)、人工智能(AI)
聘请顾问有各种理由,无论是学术专家还是行业资深人士;两者各有千秋,各有利弊。这些可以大致分为业务、技术和基于知识的期望。技术期望可能与数据或算法相关,知识期望可能是理论上的或实际的,而业务期望可能与整个公司或部分公司、个人以及业务或产品问题相关。一般来说,一些最常见的支持和反对理由如下:
雇佣理由
- (商业)在融资期间为投资者撰写研究战略计划,或证明一家公司作为人工智能公司的信息。(个人注释:不要再把 AI 作为一个术语,使用算法、ML 或 DL,甚至应用智能)。
- 作为顾问委员会成员的商业关系。
- (技术)设计初始算法管道和模型架构。
- (技术/知识)引进新技术。
- (技术/知识)审查当前技术,开发或建议替代方案或改进措施。
- (技术/知识)提供开箱即用的想法,以取代未能提供足够好结果的已知解决方案。
- (技术)以最小的投资构建 MVP,即基线模型。
- (技术)执行竞争对手正在做的类似研究项目。
- (技术/知识)作为兼职的额外团队成员。
- (知识)帮助从零开始建立或招募一个主管或一个决策支持团队。
- (知识)引入团队缺少的某个主题的知识。
不雇佣的理由
- (商业)当你在组织中的机构想要雇用一名顾问,但是你依赖于与另一个不想与顾问合作的机构的合作。
- (商业)当顾问与竞争公司有关系时。总是尽职尽责。
- (技术)当公司需要 ML 功能但不记录自己的数据时。
- (技术/业务)当公司不具备改变客户核心工作方法的技术或组织能力时。
- (技术/知识)在最初的咨询阶段,如果你由于某种原因无法定义目标变量,或者它可以通过非常简单的规则来定义,或者它有选择偏差。
- (技术)过于复杂的问题定义。通常,简单的事情在开始时效果最好,也就是说,从基线开始。
- (技术/知识)当您无法客观地定义想要优化的产品指标时。
- (知识)当你的学术专家的领域和你公司的不同时。
例子
我们可以把这些例子分成三组:1 .一个没有 DS 团队和早期数据产品部门的公司,2。一家公司带着一个初级\小型 DS 团队迈出了第一步,以及 3 .一家成熟的 ML 公司,拥有一支经验丰富的团队。让我们更详细地关注几种情况。
(1)雇佣一个顾问来帮助引导一个新的基于 DS 的特性,建立一个团队并定义角色,接受关于如何获得数据和标签的指导,建立一个雇佣过程,等等。这通常表明,一家小型创业公司正在考虑聘请第一位数据科学家,但对该领域一无所知,他们会咨询他们认识的人,这些人被推荐或有资格帮助他们迈出第一步。
(2 & 3)雇用一名顾问,以便在一段固定和预先确定的时间内加强公司的能力。例如,公司有一个由几个初级员工组成的 DS 团队,聘用顾问是为了领导这个团队,直到聘用了一个更有经验的领导或高级员工。另一个例子是,当顾问是某个特定领域的专家时,您希望迅速将该知识和经验传递给 DS 团队。在这种情况下,顾问将在早期为团队提供价值。
(2 和 3)聘请一名顾问每周指导一个 DS 团队。在这种情况下,团队通常会与顾问召开周会,描述他们上周的工作和下周的计划。在实践中,这意味着你允许非常短的工作间隔,这在我看来可能会损害中长期项目,而这些项目是任何 DS 的支柱。这将增加满足每周最后期限的压力,这将使团队区分任务的优先顺序,以便参加协商会议,而不是努力推进实际的优先顺序。
(2 & 3)聘请顾问审查公司的产品、研究项目,并提供详细的意见、建议想法和替代方案。在这种情况下,公司将分享他们的想法,顾问将在流程结束时提供详细的文档。审查项目的顾问可能看起来像是一个批评家,除非 DS 团队要求,否则他可能会被误解。这也会给计划增加额外的噪音,迫使你分配资源和时间来证明你的努力是有价值的。请记住,一次性顾问不一定知道你的数据,他们的投入可能是肤浅的。
(1 & 2)客户对“人工智能”的期望过高。一般来说,没有先验知识的客户可能不理解人工智能的能力,并认为“人工智能”可以做任何事情。他们可能没有意识到模型实际上是在学习由人产生的给定标签,因此它可能不会超过人类专家。换句话说,必须通过解释每个模型都是统计模型并且会出错来满足期望,也就是说,我们不能期望我们的模型给你 100%的准确性。事实上,我们应该提倡用其他指标而不是准确性来思考。
常见的工作实践
以下是可能适合任何软件顾问的常见工作实践。然而,DS 研究和软件开发之间有一些关键的区别。DS 顾问无法向您承诺具有预定准确性或其他指标的工作模型,在没有看到您的数据和进行初步概念验证的情况下,根本不可能提前知道这一点。此外,DS 顾问并不总是具备提供能够根据您的需求为您的模型提供服务的系统的技术能力,因此建议您尽早设定对此问题的预期,并相应地制定计划。
- 定义目标。
- 定义 KPI,无论是业务、产品还是与 ML 相关的指标。
- 定义可交付成果。请注意,您应该期望可交付成果与过程本身相关,而不是与工作解决方案相关,例如“95%的模型”。
- 定义会议间隔,将团队的计划考虑在内,以避免在他们的优先级之上增加噪音。分解任务。
- 创建项目计划,任务,到期日,截止日期;同时考虑会议间隔。即,在几个任务上工作,在每个间隔中关注一个新的任务。
结论
在本文中,我想介绍一些从 DS 顾问那里获得帮助的基本和最常见的原因。对于一个有意愿的团队来说,在正确的时间点雇佣正确的顾问,将具有重要的价值。然而,雇佣一个不合适的人实际上会损害你的公司。从花在研究上的时间,到支持生产模型的大量资源。
我意识到这些并不是所有可能的原因,在不同的成熟期,有些原因可能适合也可能不适合某些公司。然而,当您希望过渡到一家拥有 DS 能力的公司时,这些使用案例中的大多数都可以用作指南。
感谢纳塔内尔·大卫·多维茨、吉迪·施珀伯、柳文欢·拉松、利奥尔·施基尔、阿隆·奥林、阿隆·尼塞尔和塞缪尔·杰弗罗金的宝贵意见。
Ori Cohen 博士拥有计算机科学博士学位,主要研究机器学习和脑机接口(BCI)。他在一家智能城市初创公司领导了一个数据科学团队,主要利用机器和深度学习进行自然语言处理(NLP)和理解(NLU)研究。目前,他是 TLV 新遗迹公司在 AIOps 领域的首席数据科学家。他定期在 Medium.com 撰写关于管理、流程和所有数据科学的文章。
雇用数据科学家-职位描述
写一份能真实代表这份工作的工作描述。
这个行业不知道如何写一份数据科学职位描述。
数据科学角色对博客帖子和其他工作描述有不切实际的期望。如果你要复制一本,我希望你选择这本!
你可能不是数据科学方面的专家。没关系,事实上你正在阅读这使你在寻找数据科学家的公司中处于领先地位。
什么是数据科学家?
数据科学是一个深不可测的海洋。数据科学家能够:
- 交流他们的问题和决定。
- 程序。
- 可视化和调查数据。
- 塑造数据集并管理存储和转换。
- 使用数据集进行有意义的预测。
那份名单在我的优先次序中。机器学习是工业数据科学中最不重要的方面,尽管它仍然是基础。
以上是大问。数据科学家这一头衔目前代表着以下工作:
- 项目管理人
- 软件工程师
- 数据分析师
- 数据工程师
- 机器学习工程师
常见错误
在这里,我将回顾一些常见的危险信号,这些信号表明你不知道为什么要雇佣一名数据科学家。
仅博士
该行业目前分为作为产品的数据科学和作为研究的数据科学。很少有公司加入这些团队。
专注于研究和创造新的问题解决方案的团队需要拥有博士学位的人。
根据事实上,20%的数据科学家拥有博士学位,其中少数拥有与该领域相关的博士学位。让这些数据科学家有用的不是博士学位,而是他们的科学方法。通过要求博士学位,你对目前有经验的 80%的数据科学家说不。科学推理在数据科学中占有一席之地。每次我都会选择行业经验而不是博士学位。
专注于机器学习
机器学习是数据科学的基础。没有良好的沟通,机器学习永远不会产生价值。如果不能将模型部署到生产环境中,您就是在为开发运维团队创造工作。
除非数据科学是你公司的核心产品,否则你会发现应用第三方产品的价值。谷歌、亚马逊和脸书都提供需要安装技巧的工具。没有必要重新发明轮子。机器学习能力对于回答关于模型有效性的问题是有用的。
缺失软件工程
一些公司不允许数据科学成为其业务的技术部门的一部分。数据科学是一个技术角色。良好的软件工程实践将使您的数据科学家的产品成为集成的乐趣。
低工资
在数据科学领域,公司和候选人都有很高的期望。机器学习是一个热门的梦想行业。我们没有雇佣机器学习专家,我们雇佣的是数据科学家。
如上所述,数据科学家是做很多工作的人。我的数据科学研究生工资是 25,000 英镑,和任何软件工程师研究生的工资一样。如果你想要一个像数据科学家一样多面的人,你需要把钱用在你所说的地方。如果你希望获得博士学位,那就更是如此。
对于你的第一个雇员,你需要一个顶尖的数据科学家来建立业务功能。对于这种类型的人,你在曼彻斯特看到的是 6 万左右。这位数据科学家还将承担业务转型的角色。他们的工作是改变对企业如何使用数据的看法。
我经常建议雇佣一个高年级学生或两个低年级学生,填补彼此技能的空白。
未能支持数据科学家
当您建立一个前端开发人员团队时,他们由以下人员提供支持:
- 项目管理人
- 商业分析员
- 产品所有者
- DevOps
当数据科学家进来时,他们有时被视为营销团队的成员。他们无法访问 IT 资源,并承担大量孤立的责任。数据科学家可能需要管理自己的部署和长期存储。确保你已经准备好支持你公司的新职能。
年龄歧视预期
常见的是工作描述要求在特定工具方面有多年的经验。软件工程和数据科学尤其喜欢新的开发工具。现在一些最好的解决方案并不是你在写工作描述时所需要的。每个数据科学家都有自己的偏好,除非有架构上的原因,否则强制使用一个工具是不合适的。你应该能够在面试过程中看出一个人的技能。如果你做不到,你应该付钱给能做到的人。
要求在某个行业有一定年限的经验就是歧视。
职位描述的目的
- 提供业务背景
- 展示预期技能
- 展示所需的技能
首先,我们需要定义我们希望数据科学家能够帮助我们解决的问题。
根据贵公司当前面临的问题,我希望申请人具备以下技能:
- 问题解决
- 沟通
- 软件工程
- 数学
- 数据分析
- 数据工程
- 机器学习
我最近签约为一家当地公司的一个职位进行数据科学健康检查并撰写职位描述。如果你对此感兴趣,请通过 LinkedIn 与我联系。以下是我想到的,上下文编辑。
我将工作描述分为五个部分:
薪水——坦率地说出对薪水的期望可以让我们避免在没有一致期望的候选人身上浪费时间。这里的重点是不要放任何你不愿意支付的东西。显示为薪水的小范围让人们把他们的期望放在你的范围内。
背景 —对该公司数据科学现状的真实描述。它有多重要,我们雇佣一名数据科学家能得到什么。
职责 —候选人将承担的职责。
基础知识——这些是这个职位所必需的技能,你会在工作的第一周用到。
期望的技能——这些额外的技能虽然不是必需的,但会让你从其他应聘者中脱颖而出。
注意,机器学习是这家公司的核心产品,因此机器学习对这个角色很重要。这通常是个例外。
性别解码链接——工作说明书中的男性代码会让一份工作看起来对女性更没有吸引力。
职位描述—数据科学家
薪水
3 万到 4.5 万根据经验。
语境
⬛⬛⬛⬛⬛⬛⬛⬛⬛由工程师和科学家组成。我们开发了以机器学习为核心的⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛ 。
该公司要求员工出差到全球客户所在地。
责任
- 给定我们当前的硬件,训练和测试精确的密度模型。
- 设计和自动化实验,以验证算法和硬件的性能。
- 数据的存取和存储。
- 从我们的数据中分析、可视化和交流见解。
- 维护收集质量培训数据的流程。
- 机器学习模型的验证。
- 协助解决模型漂移和诊断问题。
- 作为核心 R&D 团队的一员,探索和开发新技术
基础
- 能够使用 SQL、Python、R 或 equal 查询数据。
- 具备 Python 或 R 技能者优先。
- 有深度学习和 Tensorflow 使用知识者优先。
- 很强的解决问题的能力。
- 很强的沟通技巧,能够用简单的术语描述复杂的话题。
- 与工程师和客户协商和合作解决问题。
渴望的
- STEM 学位或技术工作经验。
- 良好的软件工程实践,如版本控制(GitHub 或类似软件)、软件模式、CLI。
- 欢迎业余爱好者技能或对 Raspberry Pi/Arduino(或类似)感兴趣的专业水平。
- 欢迎任何云平台的经验。
- 欢迎物理教育或经验。
这是我写的关于我整个招聘过程的系列文章的一部分。关注更多。
雇用数据科学家—流程
我是如何雇佣数据科学家的。
这个行业不知道如何雇佣数据科学家,以下是我的做法。
数据科学角色对博客帖子和其他工作描述有不切实际的期望。如果你要复制一本,我希望你选择这本!
你可能不是数据科学方面的专家。没关系,事实上你正在阅读这使你在寻找数据科学家的公司中处于领先地位。
什么是数据科学家?
数据科学是一个深不可测的海洋。数据科学家能够:
- 交流他们的问题和决定。
- 程序。
- 可视化和调查数据。
- 塑造数据集并管理存储和转换。
- 使用数据集进行有意义的预测。
那份名单在我的优先次序中。机器学习是工业数据科学中最不重要的方面,尽管它仍然是基础。
以上是大问。数据科学家这一头衔目前代表着以下工作:
- 项目管理人
- 软件工程师
- 数据分析师
- 数据工程师
- 机器学习工程师
常见错误
在这里,我将回顾一些常见的危险信号,这些信号表明你不知道为什么要雇佣一名数据科学家。
仅博士学位
该行业目前分为作为产品的数据科学和作为研究的数据科学。很少有公司加入这些团队。
专注于研究和创造新的问题解决方案的团队需要拥有博士学位的人。
根据事实上,20%的数据科学家拥有博士学位,其中少数拥有相关领域的博士学位。让这些数据科学家有用的不是博士学位,而是他们的科学方法。通过要求博士学位,你对目前有经验的 80%的数据科学家说不。科学推理在数据科学中占有一席之地。每次我都会选择行业经验而不是博士学位。
专注于机器学习
机器学习是数据科学的基础。没有良好的沟通,机器学习永远不会产生价值。如果不能将模型部署到生产环境中,您就是在为开发运维团队创造工作。
除非数据科学是你公司的核心产品,否则你会发现应用第三方产品的价值。谷歌、亚马逊和脸书都提供需要安装技巧的工具。没有必要重新发明轮子。机器学习能力对于回答关于模型有效性的问题是有用的。
缺失软件工程
一些公司不允许数据科学成为其业务的技术部门的一部分。数据科学是一个技术角色。良好的软件工程实践将使您的数据科学家的产品成为集成的乐趣。
低工资
在数据科学领域,公司和候选人都有很高的期望。机器学习是一个热门的梦想行业。我们没有雇佣机器学习专家,我们雇佣的是数据科学家。
如上所述,数据科学家是做很多工作的人。我的数据科学研究生工资是 25,000 英镑,和任何软件工程师研究生的工资一样。如果你想要一个像数据科学家一样多面的人,你需要把钱用在你所说的地方。如果你希望获得博士学位,那就更是如此。
对于你的第一个雇员,你需要一个顶尖的数据科学家来建立业务功能。对于这种类型的人,你在曼彻斯特看到的是 6 万左右。这位数据科学家还将承担业务转型的角色。他们的工作是改变对企业如何使用数据的看法。
我经常建议雇佣一个高年级学生或两个低年级学生,填补彼此技能的空白。
未能支持数据科学家
当您建立一个前端开发人员团队时,他们由以下人员提供支持:
- 项目管理人
- 商业分析员
- 产品所有者
- DevOps
当数据科学家进来时,他们有时被视为营销团队的成员。他们无法访问 IT 资源,并承担大量孤立的责任。数据科学家可能需要管理自己的部署和长期存储。确保你已经准备好支持你公司的新职能。
年龄歧视预期
常见的是工作描述要求在特定工具方面有多年的经验。特别是软件工程和数据科学,喜欢新的开发工具。现在一些最好的解决方案并不是你在写工作描述时所需要的。每个数据科学家都有自己的偏好,除非有架构上的原因,否则强制使用一个工具是不合适的。你应该能够在面试过程中看出一个人的技能。如果你做不到,你应该付钱给能做到的人。
要求在某个行业有一定年限的经验就是歧视。
职位描述的目的
- 提供业务背景
- 展示预期技能
- 展示所需的技能
首先,我们需要定义我们希望数据科学家能够帮助我们解决的问题。
根据贵公司当前面临的问题,我希望申请人具备以下技能:
- 问题解决
- 沟通
- 软件工程
- 数学
- 数据分析
- 数据工程
- 机器学习
我最近签约为一家当地公司的一个职位进行数据科学健康检查并撰写职位描述。如果你对此感兴趣,请通过 LinkedIn 与我联系。以下是我想到的,上下文编辑。
我将工作描述分为五个部分:
薪水——坦率地说出对薪水的期望可以让我们避免在没有一致期望的候选人身上浪费时间。这里的重点是不要放任何你不愿意支付的东西。显示为薪水的小范围让人们把他们的期望放在你的范围内。
背景 —对该公司数据科学现状的真实描述。它有多重要,我们雇佣一名数据科学家能得到什么。
职责 —候选人将承担的职责。
基础知识——这些是这个职位所必需的技能,你会在工作的第一周用到。
期望的技能——这些额外的技能虽然不是必需的,但会让你从其他应聘者中脱颖而出。
注意,机器学习是这家公司的核心产品,因此机器学习对这个角色很重要。这通常是个例外。
性别解码链接——工作说明书中的男性代码会让一份工作看起来对女性更没有吸引力。
职位描述—数据科学家
薪水
3 万到 4.5 万根据经验。
语境
⬛⬛⬛⬛⬛⬛⬛⬛⬛由工程师和科学家组成。我们开发了以机器学习为核心的⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛ 。
该公司要求员工出差到全球客户所在地。
责任
- 给定我们当前的硬件,训练和测试精确的密度模型。
- 设计和自动化实验,以验证算法和硬件的性能。
- 数据的存取和存储。
- 从我们的数据中分析、可视化和交流见解。
- 维护收集质量培训数据的流程。
- 机器学习模型的验证。
- 协助解决模型漂移和诊断问题。
- 作为核心 R&D 团队的一员,探索和开发新技术
基础
- 能够使用 SQL、Python、R 或 equal 查询数据。
- 具备 Python 或 R 技能者优先。
- 有深度学习和 Tensorflow 使用知识者优先。
- 很强的解决问题的能力。
- 很强的沟通技巧,能够用简单的术语描述复杂的话题。
- 与工程师和客户协商和合作解决问题。
渴望的
- STEM 学位或技术工作经验。
- 良好的软件工程实践,如版本控制(GitHub 或类似软件)、软件模式、CLI。
- 欢迎业余爱好者技能或对 Raspberry Pi/Arduino(或类似)感兴趣的专业水平。
- 欢迎任何云平台的经验。
- 欢迎物理教育或经验。
这是我写的关于我整个招聘过程的系列文章的一部分。关注更多。
直方图匹配
如何为一幅图像生成直方图,如何均衡化直方图,最后如何修改你的图像直方图,使其与另一幅直方图相似。
这里的代码可以在 Github 上找到。
如果你喜欢这个帖子,请鼓掌。
什么是图像直方图?
在开始定义直方图之前,为了简单起见,我们使用灰度图像。然后,我解释了彩色图像的过程。
图像直方图表示图像的强度分布。换句话说,图像直方图显示了图像中具有特定强度值的像素数量。例如,假设像素强度从 0 到 255 变化的正常图像。为了生成直方图,我们只需要计算亮度值为 0 的像素的数量,然后是 1,直到 255。在图 1 中,我们有一个样本 5*5 的图像,像素差异从 0 到 4。在生成直方图的第一步中,我们通过计算每个像素强度的数量来创建直方图表格。然后,我们可以通过基于直方图表创建条形图来轻松生成直方图。
图 1 :生成图像直方图的过程
如何生成图像直方图?
在 python 中,我们可以使用以下两个函数来创建并显示图像的直方图。
代码 1 :生成直方图
大多数情况下,当我们创建直方图时,我们通过将每个亮度值的像素数除以归一化因子来归一化直方图,归一化因子是图像宽度和图像高度的乘积。为了便于使用,如果 generate_histogram 函数的输入图像是一幅彩色图像,我们首先转换成一幅灰度图像(见第 6 行)。
如何均衡一个图像直方图?
直方图均衡化通常用于增强图像的对比度。因此,这种技术不能保证总是提高图像质量。计算 CDF(累积分布函数)是均衡图像直方图的常用方法。在图 2 中,我们已经计算了我们在图 1 中创建的样本图像的 CDF。此外,在图 3 中,我们显示了先前样本的均衡直方图。
图 2: 计算 CDF。
图 3: 均衡直方图。
为了用 python 计算均衡直方图,我创建了以下代码:
代码 2: 均衡直方图
这是我拍摄的三张不同的照片,作为例子。如图 4 所示,对于第一幅图像,直方图显示低强度像素的数量多于较亮像素。第二幅图像的情况完全相反,较亮像素的密度比较暗像素的密度大得多。第三个图像似乎有一个半正态直方图。
图 4 :三种不同类型的图像及其直方图以及均衡直方图。
使用均衡直方图增强图像
如上所述,我们可以使用图像的均衡直方图来修改图像的对比度。如 Code.2 第 12 行所示,对于输入图像中的每个像素,我们可以使用其均衡值。结果可能比原始图像更好,但不能保证。在图 5 中,我们描绘了 3 个图像的修改版本。如图所示,使用图像的均衡直方图修改图像会产生具有更高对比度的图像。这一特性在许多计算机视觉任务中非常有用。
图 5: 使用均衡直方图的对比度修改。最左边一列是原始图像。中间的列是对比度修改的结果。最右边的列是修改图像的直方图。
什么是直方图匹配?
假设我们有两幅图像,每幅图像都有其特定的直方图。所以我们想在更进一步之前回答这个问题,有没有可能根据一个图像的对比度来修改另一个图像?答案是肯定的。事实上,这就是直方图匹配的定义。换句话说,给定图像 A 和 B,可以根据 B 修改 A 的对比度级别。
当我们想要统一一组图像的对比度时,直方图匹配是有用的。事实上,直方图均衡化也可以看作是直方图匹配,因为我们将输入图像的直方图修改为类似于正态分布。
为了匹配图像 A 和 B 的直方图,我们需要首先均衡两个图像的直方图。然后,我们需要使用均衡直方图将 A 的每个像素映射到 B。然后我们基于 b 修改 A 的每个像素。
让我们用图 6 中的例子来阐明上面的段落
图 6: 直方图匹配
在图 6 中,我们将图像 A 作为输入图像,将图像 B 作为目标图像。我们希望根据 b 的分布修改 A 的直方图。在第一步中,我们计算 A 和 b 的直方图和均衡直方图。然后,我们需要根据均衡直方图的值将 A 的每个像素映射到 b 的值。因此,例如,对于 A 中亮度级别为 0 的像素,均衡直方图的对应值为 *4。*现在我们看一下 B 均衡直方图,找到 4 对应的强度值,也就是 0。因此,我们将 A 的 0 强度映射到 B 的 0 强度。我们继续对 A 的所有强度值进行映射。如果 A 到 B 的均衡直方图中没有映射,我们只需选取最接近的值。
我也用 Python 实现了上述过程
**代码 3:**Python 中的直方图匹配
图 7: 直方图匹配示例。我们修改了左边图像的直方图以匹配中间图像的直方图。
图 7 示出了直方图匹配的例子。如您所见,虽然最左边的图像是明亮的图像,但就对比度而言,中间的图像可以被认为是更好的图像。所以,我们决定使用中心图像的契约来修改最左边的。结果,也就是最右边的图像得到了改善。
结论
在这篇文章中,我解释了直方图匹配,这是一个有用的方法,当我们处理图像。我首先解释了如何生成图像直方图。然后如何均衡生成的直方图,最后如何根据另一张图片的对比度修改一张图片,称为直方图匹配。带有解释的代码也可以在 Github 上找到。
这里的代码可以在 Github 上找到。
如果你喜欢这个帖子,请鼓掌。
直方图与 kde 解释
用砖块和沙堆解释直方图和核密度估计器
2020 年朱利安·韦吉鲁克
在这篇博文中,我们将探索直方图和核密度估计器(kde)的基本属性,并展示如何使用它们从数据中获得洞察力。
直方图在数据科学界是众所周知的,并且经常是探索性数据分析的一部分。但是,我们将从头开始构建一个直方图,以了解它的基本属性。
核密度估计器(kde)不太受欢迎,而且起初看起来可能比直方图更复杂。但是生成直方图和 kde 的方法实际上非常相似。由于它们的灵活性,kde 值得再看一眼。基于直方图示例,我将解释如何构建 KDE,以及为什么应该将 KDEs 添加到您的数据科学工具箱中。
数据
为了说明这些概念,我将使用我在过去几个月中收集的一个小型数据集。大约两年前,我开始定期冥想,并且在某个时候,我开始记录每天冥想的持续时间。
如你所见,我通常每天冥想半小时,一些周末的户外活动会持续一小时左右。但是有时候我很累,我只冥想 15 到 20 分钟。当我觉得一个会话应该结束时,我就结束它,所以会话持续时间是一个相当随机的量。
冥想. csv 数据集包含以分钟为单位的会话持续时间。
直方图
我想知道更多关于这个数据和我的冥想倾向。例如,随机选择的会话持续 25 到 35 分钟的可能性有多大?
对于初学者来说,我们可以试着排序数据点并绘制数值。
这种可视化的问题是,许多值过于接近,无法分开并绘制在彼此之上:没有办法告诉我们在数据集中有多少个 30 分钟的时段。相反,我们需要使用图的垂直维度来区分具有不同数据密度的区域。这个想法把我们引向直方图。
让我们将数据范围分成几个区间:
[10, 20), [20, 30), [30, 40), [40, 50), [50, 60), [60, 70)
我们有 129 个数据点。对于第一个区间[10,20]中的每个数据点,我们放置一个面积为 1/129 的矩形(大约。0.007)和区间[10,20]上的宽度 10。就像在堆砖头。由于我们在区间[10,20]中有 13 个数据点,13 个堆叠的矩形的高度约为。0.01:
如果我们对所有剩余的音程重复这个过程会发生什么?
因为所有矩形的总面积是 1,所以标记堆叠矩形的上边界的曲线是概率密度函数。
密度很方便,因为它们可以用来计算概率。例如,要回答我最初的问题,随机选择的会话将持续 25 到 35 分钟的概率可以计算为区间[25,35]中密度函数(图)和 x 轴之间的面积。
这个面积等于 0.318。
请注意,只有在与底部宽度相结合时,条形的高度才有用。也就是说,我们不能直接从 y 轴上读出概率;概率只能作为曲线下的面积来访问。这不仅适用于直方图,也适用于所有密度函数。
然而,粗略的计算通常会产生令人满意的结果。例如,从直方图我们可以推断出[50,60]和[60,70]条的高度约为 0.005。这意味着会话持续时间在 50 到 70 分钟之间的概率大约等于 20*0.005 = 0.1。精确计算得出概率为 0.1085。
间隔(又名“仓”)的选择是任意的。我们还可以将数据范围划分为长度为 1 的区间,或者甚至使用不同长度的区间(这并不常见)。使用小的间隔长度会使直方图看起来更不规则,但也允许更精确地定位具有高观察密度的斑点。例如,持续时间在 30 到 31 分钟之间的会话出现的频率最高:
pandas 等流行的数据科学软件包中的直方图算法实现会自动尝试生成赏心悦目的直方图。
核密度估计量
密度估计值或密度估计值只是猜测的一个花哨词:我们试图猜测能够很好地描述数据随机性的密度函数 f 。
无论我们如何选择间隔长度,直方图看起来总是不规则的,因为它是一堆矩形(再想想砖块)。有时,我们对计算更平滑的估计感兴趣,这可能更接近现实。为此,我们可以稍微修改一下我们的方法。
直方图算法将每个数据点映射到一个具有固定面积的矩形,并将该矩形放置在该数据点的“附近”。如果我们不使用矩形,而是在每个数据点上倒“一堆沙子”,然后看看沙子是如何堆积的,会怎么样?
例如,数据集中的第一个观察值是 50.389。让我们在上面放一堆沙子:
我们为这堆沙子建立的模型叫做 Epanechnikov 核函数:
Epanechnikov 核是一个概率密度函数,这意味着它是正的或零,并且其图形下的面积等于 1。函数 K 以零为中心,但是我们可以通过从它的自变量 x 中减去一个常数来很容易地沿着 x 轴移动它。
上面的图显示了
接下来,我们还可以调整所用沙子的“粘性”。这是通过用正参数 h 缩放核函数 K 的自变量和值来实现的:
参数 h 通常被称为带宽。
上图显示了 K[1] 、 K[2] 和 K[3] 的图形。较高的值 h 使函数图变平( h 控制“反向粘性”),因此带宽 h 类似于直方图算法中的间隔宽度参数。函数 K[h] ,对于任何 h > 0 ,也是面积为 1 的概率密度——这是微积分替换规则的结果。
让我们使用我们的核函数 K[h] 来推广直方图算法。对于我们包含 129 个观察值的数据集中的每个数据点 x ,我们在 x 处放置一堆沙子。换句话说,根据观察结果
我们构造函数
请注意,每个沙堆
面积为 1/129,就像用于构建直方图的砖块一样。由此可见,函数 f 也是一个概率密度函数(其图形下的面积等于 1)。让我们来看看:
注意,这个图看起来像前面构建的直方图的平滑版本。
函数 f 是核密度估计器 (KDE)。
Epanechnikov 内核只是沙堆模型的一种可能选择。另一个流行的选择是高斯钟形曲线(标准正态分布的密度)。任何概率密度函数都可以起到核的作用来构造核密度估计量。这使得 KDEs 非常灵活。例如,让我们用下面的“箱式内核”替换 Epanechnikov 内核:
下图描绘了使用该盒核的冥想数据的 KDE。
选择正确的核函数是一个棘手的问题。在实践中,尝试几个内核并比较产生的 kde 通常是有意义的。核的选择也可能受到关于数据生成过程的一些先验知识的影响。例如,如果我们先验地知道真实密度是连续的,我们应该更喜欢使用连续的核。
熊猫
大多数流行的数据科学库都有直方图和 kde 的实现。例如,在熊猫中,对于给定的数据帧 df ,我们可以用 df.hist() 绘制数据的直方图。类似地, df.plot.density() 给出了具有高斯核的 KDE 图。
以下代码加载冥想数据并将两个图保存为 PNG 文件。
结束语
在这篇博文中,我们学习了直方图和核密度估计器。两者都给我们基于观测数据的未知密度函数的估计。
计算直方图和 kde 的算法非常相似。kde 提供了更大的灵活性,因为我们不仅可以改变带宽,还可以使用不同形状和大小的内核。
用于生成这篇博文中所有情节的 python 源代码可从这里获得:冥想. py
非常感谢 Sarah Khatry 阅读了这篇博文的草稿,并提供了无数的改进意见和更正。
直方图、为什么和如何、讲故事、技巧和扩展
图片来自 Pixabay
又名:柱状图
为什么:直方图是数据集分布的图形表示。虽然它的外观类似于标准条形图,但直方图不是在不同项目或类别之间进行比较,也不是显示一段时间内的趋势,而是一种图表,让您显示潜在的频率分布或单个连续数字变量的概率分布**。**
让我澄清一下,概率分布表示某个随机变量可能取的所有值,以及这些值的概率汇总。简而言之,连续数值变量是指在一个范围或区间内可以取无限多个值的变量。比如:身高,体重,年龄,温度。
如何:直方图是有两个轴的二维图;纵轴是频率轴,而横轴被分成一系列数值(间隔或箱)或时间间隔。每个仓的频率由垂直矩形条的面积表示。每个柱覆盖了所研究变量的连续数值范围。纵轴显示从每个箱的计数中导出的频率值。
中点值是为间隔命名的值。当一个数值正好对应于间隔的一个边界时,它将根据可视化工具的默认设置被分配给左侧或右侧间隔。有些工具可以修改这个默认设置,以适应用户的偏好或需求。
直方图有时有不相等宽度的条。然而,通常以相同的宽度绘制它们,以表示每个间隔的相同范围的数据。作为反例,可以指出下面的情况:从人群中的个体收集数据,在 10 年年龄范围的箱之间分割数据,但是在单个间隔中累积来自 75 岁以上的人的数据。当条宽在所有区间都相同时,相当于用条长替换条面积。
示意图:
参考消息的性质,直方图显示了频率分布,用于(或应该用于)表示单个连续定量变量的概率分布。从概念上讲,与每个区间的频率成比例的不是矩形的高度,而是矩形的面积,而这又与连续变量被划分的每个值范围的概率有关。
请记住,频率分布是一种表示,它显示某个变量的值在给定数据集中出现的频率(多少次)。
为了说明这个想法:一个中等规模的社区 24 小时便利店从 537 名顾客那里收集了单次光顾该店所花金额的数据。下面的直方图显示了分布模式。分布的整体形状向右倾斜,在$25 附近有一个清晰的模式。此外,它在 50-55 美元区间附近有第二个较小的峰值。尽管大多数客户每次购物平均花费 25 美元,但还有一小部分客户每次购物大约花费 50 美元。
来源:#1
讲故事:直方图是对连续变量进行初步探索的合适图形。通过一组竖线,它显示了该变量的数值是如何分布的。直方图允许计算所研究的连续变量的任何值的表示概率,如果我们想从我们的样本的结果中进行推断和估计人口值,这是非常重要的。
直方图提供了数据集分布的直观表示:数据的位置、分布和偏斜度;这也有助于观察分布是对称的还是左右倾斜的。另外,如果是单峰,双峰或者多峰。它还可以显示数据中的任何异常值或缺口。简而言之,直方图总结了连续数值变量的分布特性。
在这一点上,澄清一些统计学术语是很重要的:总体是组成被研究对象的完整元素集合;更广泛的人群、汽车、事物、花费的金钱等。你打算向他推广你的研究成果。样本是整个总体的子集,通过某种抽样方法获得,并被选择来代表该总体。示例:调查结果或便利店收集的数据。
模式是一种集中趋势的度量,代表数据集中出现频率最高的值。单峰分布是具有唯一模式或一个单峰的分布;如果呈现两个峰或模式,则为双峰;如果呈现两个或多个峰,则为多峰。下图显示了左偏或右偏、对称、均匀或多峰分布的表示。
来源:#2
直方图提示
垂直轴基线总是从 0 开始。由于分布是由矩形的高度显示的(对于相等的 binwidths ),如果我们修改基线,我们不可避免地会扭曲视觉;
间隔的大小和数量没有严格定义的规则。总是尝试一些不同的 binwidth 值。虽然可视化工具包括这些参数的选择标准,但试验其他值也很重要。间隔的数量可以由数据集的性质或通过观察视觉信息的大小的深刻变化来建议。永远记住:很少的间隔不允许我们阐明数据分布的精细结构;许多区间重视抽样误差。
来源:#3
尽管最好对所有区间使用相同的二进制宽度,但有时某些二进制的数值很少,特别是在极端情况下。还记得前面那个来自 75 岁以上老人的反例吗?在这些情况下,在更宽的间隔内累积这些稀疏值。包括清楚地指示该变化的附加信息。
直方图(HG)和标准条形图(BC)之间的差异
标准条形图用于在类别之间进行数字比较,而直方图用于显示数据集的频率分布;
BCs 绘制类别图(离散定性元素),而 HGs 绘制按区间分组的定量数据图;
直方图的条之间没有“间隙”或空间;必须在 BC 上的条形之间留出一些空间,以清楚地表明它指的是离散的(互斥的)组。
BCs 可以重新排列(升序、降序、字母顺序等)。);HGs 不能被重新排序,因为它们有一个内在的排序;
HGs 显示区域,而 BCs 显示长度。在水银柱中,横轴和纵轴都有数值,因此可以计算出面积。在 BC 中作为一个轴显示类别,没有办法计算面积;
BC 中的所有条形必须具有相同的宽度。直方图可能有不同宽度的条。
**观察:**直方图一词来源于希腊语: histos 的意思是“直立的任何东西”Grama的意思是绘画或书写。
扩展 1 : 重叠直方图
它们用于比较连续变量在两个或更多类别中的频率分布。要非常小心,因为屏幕上出现两个以上的直方图可能会让观众感到困惑。
扩展 2:频率多边形
这是一个从典型的直方图中得到的图表。它由通过连接直方图条的上边缘的中点而形成的连接线段组成。频率多边形中的所有条形必须具有相同的宽度。
来源:#4
频率多边形用作重叠直方图的替代方法,以同时比较两个或多个频率分布。通常的过程(如下图所示)是删除产生直方图的条,只留下生成的多边形。
扩展 3 : 密度图
又名:核密度图,核密度估计,密度迹图
它是直方图的“自然”延伸,并使用相同的数值进行开发。密度图试图通过连续曲线显示数据集的概率密度函数。考虑到这个目标,密度图应用了一个统计过程(内核密度估计),其思想是平滑表征直方图的矩形条。结果,获得了平滑的曲线,其允许分布形状的更好的可视化。
使用相同数据构建的直方图(左)和核密度估计(右)的比较。6 个单独的内核是红色虚线;蓝色曲线是核密度估计。数据点是水平轴上的地毯图。来源:#5
核是应用于一组数值的对称函数。密度估计方法累积由核函数提供的所有信息,并生成表示密度的最终估计的平滑曲线。三个最常用的核函数是:高斯,均匀或 Epanechnikov。
密度图是具有两个轴的二维图:垂直轴是密度轴,而水平轴是数值轴。密度曲线通常被缩放,使得曲线下的面积等于 1。曲线的峰值表示所研究的数据集的值集中的位置。
来源:#6
密度图的关键思想是消除直方图的锯齿状特征(不要忘记比较这些图)。为此,它“诱导”直方图的相邻间隔或区间之间的重叠。直方图的平滑版本显示了被研究变量的概率密度函数。
记住概率密度函数描述的是连续随机变量的相对概率。
密度图的外观取决于两个参数:核函数和带宽。该参数相当于直方图中的二进制宽度。出于与直方图中间隔大小相关的问题所描述的相同原因,请始终尝试几个不同的带宽值。此外,尝试不同的内核函数也是明智的。
最后两个警告 : a)密度图需要大量数据,以使平滑曲线真正代表基本分布;b)它们倾向于在不存在数据的地方产生数据,特别是在尾部。因此,不小心使用密度估计很容易导致数字产生无意义的陈述(来源:#7)。
如果你对这篇文章感兴趣,请阅读我以前的:
散点剧情,为什么&怎么样,评书,提示&警告
【https://medium.com/analytics-vidhya/search?q=weitz】T5T6
条形图,为什么&如何,讲故事,提示&警告
https://medium.com/@dar.wtz/bar-graphs-why-how-8c031c224c9f
参考文献
# 2:https://chartio.com/learn/charts/histogram-complete-guide/
# 3:https://statistics . laerd . com/statistical-guides/understanding-histograms . PHP
# 4:https://www.webyempresas.com/poligono-de-frecuencia/
【https://en.wikipedia.org/wiki/Kernel_density_estimation】# 5:
**# 6:https://www.data-to-viz.com/graph/density.html
**# 7:https://serial mentor . com/dataviz/histograms-density-plots . html
带 Plotly Express 的直方图:完整指南
一个数据集,60 多个图表,以及所有解释的参数
大多数图形都是用 canva 创建的
直方图是一种特殊的条形图,显示变量的分布。 Plotly。Express 允许使用一个函数px.histogram(df, parameters)
从数据集创建几种类型的直方图。在本文中,我想探究所有的参数以及它们如何影响图表的外观和感觉。
普洛特利。Express 是 python Plotly 库的高级 API,专门用于处理数据帧。它创建交互式图表,您可以放大和缩小,打开和关闭图形的一部分,当您将鼠标悬停在图上的任何元素上时,会出现一个带有信息的工具提示。
所有的图表都可以使用本笔记本上的 GitHub 来创建。请随意下载、播放和更新它。
目录
- 安装
- 数据集 —在示例中使用
- 直方图的类型
- 直方图使用 plotly 条形图
- 参数:c olor ,b armode , nbins , histfunc ,cumulatual, barnorm , histnorm , category_orders , range_x and range_y ,color _ discrete _ sequence,
装置
普洛特利。Express 是在 plotly 库的 4.0.0 版本中引入的,您可以使用以下命令轻松安装它:
# pip
pip install plotly# anaconda
conda install -c anaconda plotly
Plotly Express 还要求安装 pandas,否则当你尝试导入时会得到这个错误。
[In]: import plotly.express as px
[Out]: **ImportError**: Plotly express requires pandas to be installed.
如果您想在 Jupyter 笔记本中使用 plotly,还有其他要求。对于 Jupyter 实验室你需要[jupyterlab-plotly](https://plotly.com/python/getting-started/#jupyterlab-support-python-35)
。在普通笔记本上,我必须安装nbformat
( conda install -c anaconda nbformat
)
一个数据集和 70 多个图表。交互性和动画通常只需一行代码。
towardsdatascience.com](/visualization-with-plotly-express-comprehensive-guide-eb5ee4b50b57)
数据集
直方图可在您想要查看分布的任何时候使用:
- 一段时间内出现的错误
- 每个班次的成品
- 统计分布——身高、体重、年龄、价格、工资、速度、时间、温度、周期、差值范围
Plotly 的直方图很容易使用,不仅是常规直方图,而且也很容易用于创建一些类型的条形图。您可以通过间隙从条形图中识别直方图,因为直方图的条形之间没有间隙。
我将使用我最喜欢的数据集,了解世界各国的游客人数以及他们在假期的花费。数据被预处理成一个长格式——每个类别Country Name
、Region
、Year
是一列,这些类别的每个组合占据一行,显示两个数据值[number of visotors](https://data.worldbank.org/indicator/ST.INT.ARVL)
和[receipts](https://data.worldbank.org/indicator/ST.INT.RCPT.CD)
当地人从这些游客那里获得的美元。关于游客的数据从 1995 年到 2018 年。
预处理数据集的样本-1995 年至 2018 年关于 2015 个国家的数据
普洛特利。如果每个类别和每个值都是数据集的一列,Express 可以创造奇迹。在这个例子中,我将使用:
long_df
—95 年至 2018 年 215 个国家的完整数据集yr2018
—2018 年的数据spfrit
—关于西班牙、法国和意大利的数据
直方图的类型
最常见的直方图显示一个数字变量的分布,该分布被分成多个区间。在我们的案例中,2018 年的访客数量分布在 0 到 89 322 000 之间。
# import the libraries
import plotly.express as px
import pandas as pd# create the simples histogram
px.histogram(yr2018, x="visitors")
simples 直方图将 215 个国家分为 18 个区域,每个区域覆盖 500 万游客。第一层包括 157 个国家,游客数量在 0-490 万之间,第二层包括 17 个国家,游客数量在 500-990 万之间,依此类推。
Simples 直方图将国家划分为多个区域
关于如何创建条块,您有更多的选择,它们可以基于一个类别(例如,我们的数据框架中的Region
)或一个日期值,该日期值被划分为包含几天、几个月或几年的条块。
将 x 变量指定为数值、分类或日期列会导致不同的箱。在这种情况下,年份可以是数值,生成的 bin 将是 int(1995)到 int(1999)或日期 1995 年 1 月到 1999 年 1 月。
您可能已经注意到,范围直方图和分类直方图显示的是落入分类框的国家的数量,而日期直方图显示的是访问者的数量。您可以使用y
—参数指定将哪一列聚合到直方图中。因为我们的数据集每年包含 215 个国家,所以对行进行计数会产生一个平坦的直方图。
在 Plotly Express 直方图中指定 Y 会改变聚合
因素
除了x
和y
之外,plotly 的直方图还有许多其他参数,这些参数在文档—直方图中有所描述。让我们一个接一个地回顾它们,这样您就可以知道如何将直方图包含到您的下一个可视化中。
参数:颜色
像所有其他情节一样。Express chart,color
参数需要一个包含某个类别的列,它将用单独的颜色对属于该类别的值进行着色。
fig = px.histogram(yr2018, x="visitors", nbins=10, color="Region", title="Visitors per region")
fig.show()
定义颜色以指定按颜色分割直方图。
参数:Barmode
因为直方图实际上是一个条形图,所以您可以设置三种类型的条形图:
stacked
—值堆叠在另一个之上grouped
—以分组条形图的形式显示直方图overlayed
—在彼此顶部显示半透明条
将颜色和条形模式结合起来会产生不同的图表类型。没有按颜色划分组的 Barmode 结果总是在同一个图表中。
这些条必须按颜色分开,这样barmode
才有效果。在上面的例子中,我们看到每年有 50 万游客参观阿拉比亚,但是土耳其和西班牙占据了更多的位置。
如果你对这些年来这些国家的旅游业如何发展感兴趣,你可以通过改变x
和y
参数来快速实现。
fig = px.histogram(sptuar,
x="years",
y="visitors",
color="Country Name",
barmode="group",
title=f"Visitors in Aruba, Spain, Turkey - {barmode}")
fig.update_layout(yaxis_title="Number of Visitors")
fig.update_xaxes(type='category')
fig.show()
普洛特利。Express 是非常通用的,通过改变 x 和 y 参数可以得到不同的图。
除了更改x
和y
之外,我还将图表分配给了一个变量fig
,这允许我们使用fig.update_layout(yaxis_title="title axis")
更新yaxis
,更重要的是,修改年份颜色,使其既不被视为int
也不被视为date
,而是被视为一个类别,这意味着每年都有一个单独的条形fig.update_xaxes(type="category")
。
Plotly 图表在后台存储为字典,可以通过打印
fig.to_dict()
来查看
参数:nbins
如果使用类别,nbins 参数将被忽略,并为每个类别绘制一个条形。但是如果你的x
是数字或日期类型,就把你的数据分成n
个区间。文件上说:
nbins(int)—正整数。设置箱子的数量。
但实际上,箱的数量通常是不同的。我尝试用不同的nbins
运行我的图表,结果如下:
- nbins = 3–2 箱
- nbins = 5–5 个箱
- nbins = 10–9 个箱子
- nbins = 20–18 箱
增加 nbins 参数会导致更多的箱数
甚至关于 plotly 直方图的示例页面也有 nbins=20,导致只有 11 个柱。尽管增加数量通常会导致箱的数量增加。Plotly 还确定了箱的开始和结束位置。例如,使用宁滨的年份可以从 1990、1994 或 1995 年开始。
- nbins = 3–3 个箱(1990–1999,2000–2009,2010–2019)
- nbins = 5–5 个箱(95–99,00–04,05–09,10–14,15–19)
- nbins = 10–5 个箱(95–99,00–04,05–09,10–14,15–19)
- nbins = 20–13 个箱(94–95,96–97,98–99,00–01…)
你影响箱子的数量和范围的能力有限,但是很快就会进化,所以这很可能会在未来的版本中得到改进。
要获得所有的能量,自己计算,然后用 plotly express 条形图绘制,如本文末尾所示。
参数:histfunc
到目前为止,我们已经看到直方图计数和求和的价值。Plotly 的直方图允许使用 5 个函数来聚合值— count
、sum
、avg
、min
、max
。
Plotly 历史函数的各种参数。
当然,当我们使用分级箱时,avg 产生箱的平均值,min 产生最小值,max 产生最大值,所以avg
、min
和max
总是形成某种上升的阶梯。在这种情况下,对分类值应用直方图更有意思,这在技术上创建了一个条形图。
将 histfunc 应用于分类箱显示,尽管我们在拉丁美洲、非洲、欧洲和东亚有类似数量的国家,但欧洲国家总体上是最多人访问的,而北美国家是平均水平。游客数量最多的非洲国家不超过 1200 万。
参数:累积
如果累积参数设置为False
,直方图会显示频率(sum,avg …),但如果是True
,则每个后续柱会累积所有先前柱的值。
累积直方图累积所有先前条形图的值。
参数:barnorm
如果barnorm
为None
,该参数允许显示精确值,或者显示每个颜色类别的百分比。您可以通过将barnorm
设置为fraction
或percent
来实现。
Barnorm 表示堆积直方图上的零、分数或百分比。
右边的最后一幅图像被fig.update_layout(yaxis={"ticksuffix":"%"})
修改,添加了一个百分号。
如果在分组图表上应用 barnorm,比例保持不变,但绝对值变为分数或百分比:
组合直方图保留条形的比例,但轴标签会改变。
使用fig.update_layout(yaxis={"tickfont":{"size":18}})
对xaxis
进行格式化,使标签更大。
参数历史标准
一个条柱的barnorm
百分比总和等于 100%,而所有相同颜色的条柱相加后histnorm
达到 100%。它提供了 5 个选项:
None
—显示骨料的绝对值percent
—占箱中总值的百分比(0–100%)probability
—容器中总量的分数(0–1)density
—总面积除以总面积(所有条形面积之和等于样本点总数)probability density
—histfunc
对给定条柱的输出进行归一化,使其对应于随机事件落入该条柱的概率,该随机事件的分布由histfunc
的输出描述(所有条柱面积之和等于 1)
histnorm 的前三个参数。
我已经从几个角度研究了density
和probability density
,但是可能会有一个 bug,因为每个 bin 的累积图和普通图的值是不同的。
参数类别 _ 订单
当你用color
划分图表时,你可能会对定义这些彩色类别的顺序感兴趣。默认情况下,顺序基于输入数据帧中的外观,这可能很难控制。使用category_order
让你对图上的类别进行排序。
您必须指定为哪一列定义顺序(作为字典)。这是您在color
参数中使用的列。
fig = px.histogram(spfrit,
x="years",
y="visitors",
**color="Country Name",**
barmode="group",
title=f"Ordered Italy, Spain, France",
category_orders={"**Country Name**":["Italy","Spain","France"]}
)
fig.show()
Plotly 表示直方图参数,允许改变类别的顺序
参数 range_x 和 range_y
这两个参数不会改变图表的范围,但它们会根据设定的边界放大数据。您可以随时使用 Plotly 的交互式菜单取消缩放。
fig = px.histogram(long_df,
x="years",
y="receipts",
range_x=["2009","2018"],
title="Yearly Histogram",
)
fig.show()
放大很多可以看到 plotly 认为年份是floats
,因为会加上2016.5
这样的标签。如果您想确保 Plotly 显示的年份始终为"2016"
而不是小数2016.5
或月份Jan 2016
,请使用fig.update_xaxes(type='category')
。这将悬停改变直方图到一个条形图和差距之间的酒吧将出现。
数字形式的条柱可能会出现意外的带小数的网格线,而分类直方图会变成带缺口的条形图。
参数颜色 _ 离散 _ 序列
color_discrete_sequence 参数允许您影响条形的颜色。simples 直方图的所有条形都具有相同的颜色,您可以使用以下命令进行更改:
px.histogram(df, x="column",
color_discrete_sequence=["blue"])
Plotly 期望一个列表作为输入,因此您必须将您的颜色包装到一个列表中["#00ff00"]
。您可以使用任何颜色名称-蓝色、红色、浅灰色,如果您没有猜出正确的名称,plotly 的错误将提供可通过名称访问的颜色的完整列表:
**ValueError:**
Invalid value of type 'builtins.str' received for the 'color' property of histogram.marker
Received value: 'lightgreene'
The 'color' property is a color and may be specified as:
- A hex string (e.g. '#ff0000')
- An rgb/rgba string (e.g. 'rgb(255,0,0)')
- An hsl/hsla string (e.g. 'hsl(0,100%,50%)')
- An hsv/hsva string (e.g. 'hsv(0,100%,100%)')
- A named CSS color:
**aliceblue, antiquewhite, aqua, aquamarine, azure,
beige, bisque, black, blanchedalmond, blue, ...**
也可以用 hash string 或者 rgb/rgba,hsl/hsla 和 hsv/hsva(谷歌这个术语如果他们不对钟的话)。最后一个a
代表alpha
,它控制条的不透明度。
如果您在未使用color
参数的情况下为未分割直方图列出了多种颜色,则仅应用列表中的第一种颜色。当您使用color
分割条形时,您在color_discrete_sequence
中提供的色调将绘制每个类别的条形。您可以使用前面的参数 category _ orders 来更改顺序或类别。
如果您只能选择一个类别,列表中的第一种颜色将用于所有条形图。有多个类别,您可以指定更多的颜色。如果你设置的颜色没有你的类别多,那么第一种颜色将用于那些未指定的类别。
如果你不确定选择哪种颜色,但你想让这些颜色搭配在一起,试试 plotly 的一些预建颜色集。
fig = px.histogram(... color_discrete_sequence=px.colors.qualitative.Pastel2,
...)
使用定性分析。Pastel2 按颜色顺序构建。
参数颜色 _ 离散 _ 映射
您也可以使用字典来指定颜色。在这种情况下,您使用参数color_discrete_map
。这个字典的关键字是在color
中指定的列中的值。
px.histogram(df, x="column",
color="Country Names",
color_discrete_map={
"Spain":"lightgreen",
"France":"rgba(0,0,0,100)",
"Italy":"#FFFF00"}
)
使用颜色 _ 离散 _ 映射设置颜色
还有一个选项是在数据框中使用包含颜色名称或其哈希代码的列。在你使用color="column with colors name"
和color_discrete_map="identity"
的情况下。这种方法的缺点是会丢失交互式图例,因为它不再包含类别的名称(例如国家名称),而是包含颜色的名称。
# create a color column specifying color for each of the countriesspfrit["color"] = spfrit["Country Name"].map(
{"Spain":"red",
"France":"black",
"Italy":"orange"}
)# spfrit now contains:
# country_name year visitors **color**
# Spain 1995 32971000 **red**
# France 1995 60033000 **black**
# ...""" Parameter color_discrete_map using identity in case color contains real color names/hex codes """fig = px.histogram(spfrit,
x="year",
y="visitors",
color="color",
barmode="group",
title=f"Histnorm {histnorm} histogram",
category_orders={"Country Name":["Italy","Spain","France"]},
color_discrete_map="identity"
)
fig.show()
如果使用 color_discrete_map="identity ",则缺少图例,但是可以使用带有颜色名称的现有列来指定条形的颜色
参数 facet_col 和 facet_row
有时,您更喜欢在列中并排显示类别,或者在行中上下显示类别。facet_col
和facet_row
参数用于此目的。
Facet_row 和 facet_col 可以与 color 参数结合使用,以不同的色调对条形进行着色。
通常,您可以将facet_col
或facet_row
与一个color
参数结合起来,以区分每一行或每一列中条形的颜色。
px.histogram(df,
x="value column",
color="column",
facet_col="column")
如果您有太多的列,您可以通过参数facet_col_wrap
在每第 x 列之后拆分它们。以下示例显示了由facet_col_wrap=3
在 3 列后拆分的 9 个类别
px.histogram(df, x="value column",
color="column",
facet_col="column",
facet_col_wrap=n)
使用facet_col_wrap=3
将 9 个不同的类别分成 3 行
所有的图都是相连的,因此当您放大或平移其中一个图时,所有其他的图也会发生变化。
行没有 facet_row_wrap 参数,但是您可以通过facet_row_spacing
调整行之间的间距。
px.histogram(df, x="value column",
color="column",
facet_row="column",
facet_row_spacing=0.2)
Facet_row_spacing 在各行之间创建一个间隙。当您放大一行时,所有其他行也会放大。
参数 hover_name 和 hover_data
Hover_name 和 hover_data 影响工具提示的外观。hover_name
高亮显示工具提示顶部的列,使用hover_data
可以在工具提示中删除或添加列
hover_data={
# to remove
"Column Name 1":False, # to add
"Column Name 2":True
}
这些参数在 plotly 中总是工作得很好,但是在直方图的情况下有一些 bug,并且hover_name
根本不工作,而hover_data
只是有时工作。
参数定向
直方图可以水平或垂直定向。Orientation
参数有两个值v
和h
,但是方向受x
和y
的影响较大。切换x
和y
的顺序,可以垂直旋转水平图表。
垂直或水平条受 x 和 y 参数影响,而不是受方向参数影响。
如果您需要颠倒轴的顺序,以便最小的数字框位于顶部而不是底部,请使用:
fig.update_yaxes(autorange="reversed")
这同样适用于同时指定x
和y
的情况。通过切换它们,你可以将水平图变成垂直图。
将 x =“years”改为 y =“years”会改变方向。
在上图中,你可以看到悬停显示所有类别的工具提示。因为我点击了 Plotly 菜单中的Compare data on hover
图标(右数第二个)。
参数边际
我想向您展示的一个有趣的参数是,可以选择添加一个边缘子图来显示变量的详细分布。您可以从 4 种边际地块中进行选择:
histogram
—与其下方的直方图基本相同rug
—显示每个数据值在violin
—做小提琴图,估计变量的概率密度box
—突出显示中间值、第一个和第三个四分位数的箱形图
4 种边际参数——直方图、地毯、小提琴和盒子。这些图出现在垂直直方图的上方,也是交互式的。
甚至可以为多个类别绘制边际图。在这种情况下,将计算一个单独的边际图。注意,在这种情况下,你不能使用barmode="group"
。
多类别情况下四种类型的纵横军图
参数动画 _ 帧
我们今天要讨论的最后一个参数是 Plotly 的另一个交互特性,它可以让您制作图表动画。添加单个参数animation_frame="years"
会将绘图变成动画,可通过play
和stop
按钮启动,或者您可以通过点击菜单导航至单独的幻灯片。
通常需要指定动画图表的范围,以避免网格尺寸的变化。
px.histogram(spfrit,
y="Country Name",
x="visitors",
color="Country Name",
barmode="group",
# add the animation
animation_frame="years",
# anchor the ranges so that the chart doesn't change frame to frame
range_x=[0,spfrit["visitors"].max()*1.1]
)
动画帧允许您设置值的进度动画
它也可以用于分类列。
px.histogram(long_df,
x="years",
y="visitors",
color="Region",
animation_frame="Region",
color_discrete_sequence=px.colors.qualitative.Safe,
range_y=[0,long_df.groupby(["Region","years"])["visitors"].sum().max()*1.1]
)
使用分类列的动画可能不如动画有用,但是滑块可以帮助用户查看各种选项。
使用 plotly 条形图的直方图
如你所见,当我们讨论nbins
参数时,Plotly 对宁滨数据很固执。如果你想保持你的自由,你总是可以自己收集数据并绘制一个规则的条形图。使用pd.cut
对数据进行分类,groupby
对分类中的值进行聚合,并将结果传递给px.bar(df, parameter)
可以让您获得自己的直方图。
这样你有更多的选择。您可以在 x 轴(5, 10]
上显示箱,或者当您使用pd.cut(df, bins=bins, labels=bins[1:])
装箱时,您可以只显示边界编号10M, 20M etc.
。您可以在条形中或条形上方添加标签,以显示每个条形包含的出现次数。使用fig.update_layout(bargap=0)
可以调整杆之间的间隙
使用 pd.cut 计算直方图,并通过 px.bar 绘制
多个类别,当按媒体夹和类别分组时
或者,您可以通过 numpy 的np.histogram
来绑定数据。
# bin with np.histogram
counts, bins = np.histogram(yr2018["visitors"], bins=bins)# turn into data frame
df = pd.DataFrame({"bins":bins[1:], "counts":counts})# chart using Plotly.Express
fig = px.bar(df, x="bins", y="counts", text="counts")
结论
Plotly 的直方图是描绘数据变量分布的一种快速方法。Plotly Express 直方图也有助于绘制多种条形图,将数据按类别或时间进行汇总。
然而,到目前为止,plotly 直方图缺少一些功能(其他 Plotly 图表也有),尤其是添加标签的选项。箱不容易修改,并且nbins
参数并不总是提供预期的结果。您可以随时自己进行计算,并使用px.bar()
得出结果。
Plotly 正在定期改进,所以也许这些东西会很快更新,我们可能会选择添加一个估计分布曲线覆盖。
现在轮到你研究直方图了。下载一个数据集,例如,世界各地城市的历史温度,并研究各个地区的温度分布。
If you liked this article, check other guidelines:
* [Visualize error log with Plotly](/visualize-error-log-with-pandas-and-plotly-d7796a629eaa)
* [How to split data into test and train set](/complete-guide-to-pythons-cross-validation-with-examples-a9676b5cac12)
* [Various pandas persistance methods](/stop-persisting-pandas-data-frames-in-csvs-f369a6440af5)
* [Unzip all archives in a folder](/unzip-update-and-zip-again-xmls-in-a-folder-7d57f9710ddb)Many graphics on this page were created using [canva.com](https://partner.canva.com/vdek) (affiliate link, when you click on it and purchase a product, you won't pay more, but I can receive a small reward; you can always write canva.com to your browser to avoid this). Canva offer some free templates and graphics too.
所有的图表都可以通过这个笔记本中的 python 脚本运行 Github 上的直方图与 Plotly 。
使用 Python 的 Matplotlib 绘制直方图
如何使用这个简单的可视化来有效地显示分布
直方图—作者提供的图像
卡尔·皮尔逊创造了术语直方图,但是很难说是谁发明了可视化,很可能在皮尔森命名之前就已经使用了。
威廉·普莱费尔被认为是条形图的发明者,也是第一个发表这种图表的人,所以不难想象他会画几幅这样的图表来形象化 18 世纪末或 19 世纪初的频率。
毕竟,直方图基本上就是这样;它们是条形图,通常用相连的条来可视化,其中的值被分成相等的范围,称为条块或类。条形的高度代表该类别中记录的数量,也称为频率。
直方图—作者提供的图像
在本文中,我将介绍这种可视化的基础知识,并且在了解更多直方图的同时,我们还将探索 Matplotlib 的许多定制选项。
太空任务直方图
我将在 Jupyter 中运行我的代码,使用 Pandas、Numpy 和 Matplotlib 来开发视觉效果。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import AutoMinorLocator
from matplotlib import gridspec
在这个例子中,我们将要探索的数据集包含了自 1957 年以来所有太空任务的数据,并且是由 Agirlcoding 从nextspaceflight.com搜集而来的。
df = pd.read_csv('medium/data/Space_Corrected.csv')
df
清理前的数据帧
加载数据集后,我们可以进行一些清理和小的调整。
# date column to datetime
df['Datum'] = pd.to_datetime(df['Datum'], utc=True)# costs column to numeric
df['Rocket'] = pd.to_numeric(df[' Rocket'], errors='coerce')# drop columns
# ' Rocket' had an extra space and was renamed
df.drop([' Rocket', 'Unnamed: 0', 'Unnamed: 0.1'], axis=1, inplace=True)
清理后的数据帧
现在一切都设置好了,我们可以毫不费力地用 Matplotlib 绘制直方图。
主要是我想把“火箭”一栏的数据可视化,这是以百万美元为单位的任务成本。我的想法是观察该列中值的分布。
plt.hist(df.Rocket)
plt.show()
默认直方图
没关系,默认的图表给了我们一个简单的 x 轴和 y 轴,棒线被自动划分为条块。
在继续之前,让我们将直方图的仓分配给一个变量,以便更好地观察它。
n, bins, patches = plt.hist(df.Rocket)bins
包含容器范围的数组
这意味着我们的值被分成十个箱,就像这样:
- 5.3 ≤ n < 49.77
- 49.77 ≤ n < 94.24
- …
- 405.53 ≤ n ≤ 450
请注意,每个容器的顶部值被排除在外(
很好,现在我们有了一个包含我们的箱子边缘的列表,让我们试着用它作为 x 轴的刻度。
让我们也添加一个数字,并增加我们的图表的大小。
fig = plt.figure(figsize=(16,6))n, bins, patches = plt.hist(df.Rocket)plt.xticks(bins)
plt.show()
根据条形调整刻度的直方图
那更好。
因为我们没有给 Matplotlib 任何关于 bin 的信息,所以它自动定义了它的数量和范围。
我们可以在定义绘图时通过传递一个边列表来设置箱;这允许我们创建不均匀间隔的容器,这通常是不推荐的——但是也有这种情况。
我们可以设置它们的另一种方式是使用一个整数,其中包含我们想要的箱数。
fig = plt.figure(figsize=(16,6))n, bins, patches = plt.hist(df.Rocket, bins=16)plt.xticks(bins)
plt.show()
有 16 个柱的直方图
直方图的主要目的是可视化我们数据的分布。我们不希望我们的图表有太多的容器,因为那会隐藏我们数据中的浓度;同时,我们不希望类的数量很少,因为我们可能会误解分布。
在我们的直方图中选择类的数量有时非常直观,但其他时候相当困难。幸运的是,我们有大量的算法,Matplotlib 允许我们选择使用哪一个。
fig = plt.figure(figsize=(16,6))# 'auto', 'sturges', 'fd', 'doane', 'scott', 'rice' or 'sqrt'
n, bins, patches = plt.hist(df.Rocket, bins='rice')plt.xticks(bins)
plt.show()
由“rice”算法计算的条柱直方图
很简单,我们已经知道直方图的基本原理。现在我们可以尝试自定义它。
我们可以在 x 轴上使用一些网格线来更好地显示箱子开始和结束的位置。一个标题也很好。
fig = plt.figure(figsize=(16,6))n, bins, patches = plt.hist(df.Rocket)plt.xticks(bins)
plt.grid(color='white', lw = 0.5, axis='x')plt.title('Histogram of Space Missions Costs', loc = 'left', fontsize = 18)
plt.show()
带有网格线和标题的直方图
如果分笔成交点位于条形的中心并同时显示范围的下限和上限,效果会更好。
我们可以通过遍历除最后一个之外的所有容器来定义标签,同时将当前值与下一个值相结合。
大概是这样的:
# x ticks labels
[ "{:.2f} - {:.2f}".format(value, bins[idx+1]) for idx, value in enumerate(bins[:-1])]
类别的标签列表
刻度位置应该在两个值的中间,如下所示:
# x ticks positions
[(bins[idx+1] + value)/2 for idx, value in enumerate(bins[:-1])]
为类绘制标签的位置列表
酷,当我们把它添加到我们的绘图中时,我们需要重新定义网格。如果我们用刻度画网格线,我们会在条形的中间画一条线。
为了解决这个问题,我们将使用我们在开始时导入的类AutoMinorLocator
。该类将帮助我们设置次要刻度,我们可以用它来绘制网格。
fig = plt.figure(figsize=(16,6))
n, bins, patches = plt.hist(df.Rocket)**# define minor ticks and draw a grid with them
minor_locator = AutoMinorLocator(2)
plt.gca().xaxis.set_minor_locator(minor_locator)
plt.grid(which='minor', color='white', lw = 0.5)****# x ticks
xticks = [(bins[idx+1] + value)/2 for idx, value in enumerate(bins[:-1])]****xticks_labels = [ "{:.2f}\nto\n{:.2f}".format(value, bins[idx+1]) for idx, value in enumerate(bins[:-1])]****plt.xticks(xticks, labels = xticks_labels)**plt.title('Histogram of Space Missions Costs (Millions of USD)', loc = 'left', fontsize = 18)
一个直方图,用一个刻度描述每个条形
它开始看起来很棒;让我们删除图表的脊线和刻度线,使其看起来更清晰。
fig, ax = plt.subplots(1, figsize=(16,6))n, bins, patches = plt.hist(df.Rocket)# define minor ticks and draw a grid with them
minor_locator = AutoMinorLocator(2)
plt.gca().xaxis.set_minor_locator(minor_locator)
plt.grid(which='minor', color='white', lw = 0.5)# x ticks
xticks = [(bins[idx+1] + value)/2 for idx, value in enumerate(bins[:-1])]
xticks_labels = [ "{:.2f}\nto\n{:.2f}".format(value, bins[idx+1]) for idx, value in enumerate(bins[:-1])]
plt.xticks(xticks, labels = xticks_labels)**# remove major and minor ticks from the x axis, but keep the labels
ax.tick_params(axis='x', which='both',length=0)****# Hide the right and top spines
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)**plt.title('Histogram of Space Missions Costs (Millions of USD)', loc = 'left', fontsize = 18)
先前直方图的更清晰版本
对于 y 轴,我们可以将值打印在条形的顶部,并删除 y 刻度。
n
我们从绘制直方图中得到的第一个变量包含一个列表,其中包含每个 bin 的计数。
我们可以从前面构建的列表中获得xticks
的 x 位置,从n
中获得标签和 y 值。
fig, ax = plt.subplots(1, figsize=(16,6))
n, bins, patches = plt.hist(df.Rocket)# define minor ticks and draw a grid with them
minor_locator = AutoMinorLocator(2)
plt.gca().xaxis.set_minor_locator(minor_locator)
plt.grid(which='minor', color='white', lw = 0.5)# x ticks
xticks = [(bins[idx+1] + value)/2 for idx, value in enumerate(bins[:-1])]
xticks_labels = [ "{:.2f}\nto\n{:.2f}".format(value, bins[idx+1]) for idx, value in enumerate(bins[:-1])]
plt.xticks(xticks, labels = xticks_labels)
ax.tick_params(axis='x', which='both',length=0)**# remove y ticks
plt.yticks([])**# Hide the right and top spines
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)**# plot values on top of bars
for idx, value in enumerate(n):
if value > 0:
plt.text(xticks[idx], value+5, int(value), ha='center')**plt.title('Histogram of Space Missions Costs (Millions of USD)', loc = 'left', fontsize = 18)
plt.show()
功能元素就位后的最终直方图
厉害!
要素已经到位;剩下要做的就是更改颜色、字体大小,在 x 和 y 轴上添加一些标签,并根据需要定制图表。
**facecolor = '#EAEAEA'
color_bars = '#3475D0'
txt_color1 = '#252525'
txt_color2 = '#004C74'**fig, ax = plt.subplots(1, figsize=(20,6), **facecolor=facecolor**)
**ax.set_facecolor(facecolor)**n, bins, patches = plt.hist(df.Rocket, **color=color_bars**, **bins='doane'**)#grid
minor_locator = AutoMinorLocator(2)
plt.gca().xaxis.set_minor_locator(minor_locator)
plt.grid(which='minor', **color=facecolor**, lw = 0.5)xticks = [(bins[idx+1] + value)/2 for idx, value in enumerate(bins[:-1])]
xticks_labels = [ "{:.0f}-{:.0f}".format(value, bins[idx+1]) for idx, value in enumerate(bins[:-1])]
plt.xticks(xticks, labels=xticks_labels, **c=txt_color1, fontsize=13**)
# remove major and minor ticks from the x axis, but keep the labels
ax.tick_params(axis='x', which='both',length=0)
# remove y ticks
plt.yticks([])# Hide the right and top spines
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)for idx, value in enumerate(n):
if value > 0:
plt.text(xticks[idx], value+5, int(value), **ha='center'**, **fontsize=16, c=txt_color1**)plt.title('Histogram of Space Missions Costs\n', loc = 'left', fontsize = 20, **c=txt_color1**)
**plt.xlabel('\nMillions of USD', c=txt_color2, fontsize=14)
plt.ylabel('Number of Space Missions', c=txt_color2, fontsize=14)**
plt.tight_layout()
plt.savefig('costs.png', facecolor=facecolor)
太好了!我们得到了一个数值场,并用漂亮的图表描述了它的分布。现在让我们看看如何处理直方图中的日期。
为了弄清楚这个事件的分类,我们可以从查看数据中最早和最晚的日期开始。
我们可以使用 Matplotlib 支持的许多不同算法轻松地为数值字段选择箱,但这些技术在处理日期时可能不会产生最佳结果。
不要误解我的意思,你会发现,描述变量分布的最佳仓位大小是 378 天,用一整年更容易理解。
好了,让我们将日期时间对象转换成 Matplotlib 可以处理的数字格式,然后我们将调整我们的刻度,看看它看起来怎么样。
import matplotlib.dates as mdates# convert the date format to matplotlib date format
plt_date = mdates.date2num(df['Datum'])
bins = mdates.datestr2num(["{}/01/01".format(i) for i in np.arange(1957, 2022)])# plot it
fig, ax = plt.subplots(1, figsize=(22,6))
n, bins, patches = plt.hist(plt_date, bins=bins)# x ticks and limit
ax.xaxis.set_major_locator(mdates.YearLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%y'))
plt.xlim(mdates.datestr2num(['1957/01/01','2021/12/31']))plt.show()
以年份为条块的直方图
那很有趣。我们可以看到太空竞赛从 1957 年到 1970 年代末逐渐成形,最近五年太空计划有所增加。
现在,我们可以根据新的直方图调整之前的设计。
facecolor = '#EAEAEA'
color_bars = '#3475D0'
txt_color1 = '#252525'
txt_color2 = '#004C74'# convert the date format to matplotlib date format
plt_date = mdates.date2num(df['Datum'])
bins = mdates.datestr2num(["{}/01/01".format(i) for i in np.arange(1957, 2022)])# plot it
fig, ax = plt.subplots(1, figsize=(22,8), facecolor=facecolor)
ax.set_facecolor(facecolor)n, bins, patches = plt.hist(plt_date, bins=bins, color=color_bars)ax.xaxis.set_major_locator(mdates.YearLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%y'))
plt.xlim(mdates.datestr2num(['1957/01/01','2021/12/31']))#grid
plt.grid(axis='y', color=color_bars, lw = 0.5, alpha=0.7)
plt.grid(axis='x', color=facecolor, lw = 0.5)#remove major and minor ticks from the x axis, but keep the labels
ax.tick_params(axis='both', which='both',length=0)# Hide the right and top spines
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.spines['left'].set_position(('outward', 10))plt.xticks(c=txt_color1, fontsize=12)
plt.yticks(c=txt_color1, fontsize=12)plt.title('Histogram of Space Missions Dates\n', loc = 'left', fontsize = 20, c=txt_color1)
plt.xlabel('\nYear', c=txt_color2, fontsize=14)
plt.ylabel('Number of Space Missions', c=txt_color2, fontsize=14)
plt.tight_layout()
plt.savefig('hist.png', facecolor=facecolor)
就是这样!我们构建了两个直方图,了解了定义箱和类的不同方法,更改了许多可视元素以使我们的图表看起来像我们想要的那样,探索了日期格式、主要和次要刻度、网格线和文本。
感谢阅读我的文章。我希望你喜欢它。
你可以在这里找到更多关于 Python 和 Matplotlib 的教程。
资源:
数据;
代码(GitHub);
Matplotlib。hist;
Matplotlib 日期;
Matplotlib Tick 格式化程序 s;
Matplotlib 日期刻度标签—示例;
历史直方图;
Python 中的历史股票价格数据
使用雅虎财经获得每日和分钟级别的历史股票数据。拿到 S&P500 的股票行情列表。
股票是非常不稳定的工具,因此在做出任何交易决定之前,我们彻底分析价格行为是非常重要的。这就是为什么获取和分析价格是至关重要的。python 可以方便地做到这一点。
股票数据可以从 yahoo finance、quandl 和 alpha vantage 等不同的软件包下载。在本文中,我们将研究如何从 yahoo finance 获取每日和分钟级别的数据。这是获取数据的简要版本,如果你正在寻找其他方法和不同的数据类型,那么你可以参考下面。
在这篇文章中,你将学会如何获得股票市场的数据,如价格、成交量和基本面数据…
blog.quantinsti.com](https://blog.quantinsti.com/stock-market-data-analysis-python/)
雅虎财经
我们将使用 yfinance 包获取数据。您可以使用安装此软件包!pip install yfinance(如果尚未安装)。以下代码显示了如何获取 AAPL 从 2016 年到 2019 年的数据,并绘制数据的调整后收盘价。
AAPL 每日价格
多只股票的数据
在下面的代码中,我们将获取多个股票的数据,并将其存储在 dataframe data 中。然后我们将使用 matplotlib 软件包计算每日回报并绘制所有股票价格的累积回报。
分钟级数据
通过 yfinance,还可以取分钟频率的数据。你可以通过调整下面第 8 行的间隔参数来下载其他频率。区间支持以下值:1m
、5m
、15m
、30m
、60m.
您可以分析这些数据,创建交易策略,并使用 pyfolio 软件包分析策略的性能。它计算夏普比率,索蒂诺比率,最大下降和许多其他指标。
我希望你发现这是有用的和快乐的交易和分析。
S&P500 证券交易所列表
下一个合乎逻辑的要求是,如何获得构成你最喜欢的指数或在特定交易所上市的股票。为此,您可以从维基百科页面获取报价器,并使用这些报价器从 yfinance 获取数据。
股票代码列表和其他信息。
S&P500 股票的收盘价。
来源和参考
- y 金融
单个图表中的流行病历史
流行病和大流行仍然是一个热门话题,所以让我们使用交互式水平条形图和 D3.js 来可视化它们的历史吧!
新冠肺炎是本月数据可视化的热门话题,每个人都想使用这个数据集。然而,在这篇文章中,我们将后退一步,看看更大的图景——世界流行病和大流行的整个历史。为此,我们将使用一个名为水平条形图的交互式图表。
图表演示
完整的图表可以在 https://martinheinz.github.io/charts/horizontal-bar-chart/的找到。它包含了发生在公元前 1200 年至 2020 年间的近 250 种流行病的列表。每个条形代表一种流行病。横轴显示时间,以年为单位,纵轴显示疫情。
你可以将鼠标悬停在每个条形上,查看名称、时间跨度和死亡人数。要查看关于疫情的进一步描述,请将鼠标悬停在左侧的标签上。您可以使用顶部的字段深入查看特定的时间段。你也可以按总流行时间跨度、起始年份或死亡人数对图表上的条形进行排序。
数据集
根据标题和主题,本文的数据集是历史或世界流行病列表。我能找到的附有最多数据的最完整的列表来自维基百科文章这里。
这个数据集实际上只是一个包含所有瘟疫、流行病甚至小规模爆发的大表格。作为一个快速示例,这里有一行:
维基百科中的示例行
为了能够在可视化中使用这些数据,我们需要一种对计算机更友好的格式,即 CSV 。我使用简单的 Python 脚本生成了这个 CSV ,你可以在这里找到。这个脚本所做的就是使用 BeautifulSoup 从维基百科中抓取表格,从中检索所有值,并将其写入 CSV 文件。
这里还有一个解析数据的示例行:
至于任何替代的数据来源——我真的找不到任何这类详尽的列表,每个条目都有足够的信息。我在网上能找到的大多只是*“十大流行病排行榜”*或者只是大量的新冠肺炎数据。如果你知道比这个更好的数据集,请告诉我!
水平条形图
水平条形图实际上只是一个旋转了 90 度的普通条形图,即垂直轴上有数据类别,水平轴上有数据值的图表。尽管它比普通的条形图有很多优点。
一个非常简单的优点是,通过将类别标签放在纵轴上,您可以获得更多的空间来显示它们。另一个是显示时间的能力——它自然地显示在水平轴上,这在普通的条形图上是做不到的。
接下来的几个优势源于我们在这个特定的可视化中使用图表的方式。正如您已经从上面的演示中看到的,单个条形并不仅仅显示一个值。他们显示了长度(以年为单位)以及实际的时间框架。与基本条形图不同,单个条形图并不都连接到水平轴,而是使用每个条形图的起点(也是终点)来显示额外信息。
除此之外,我们还使用工具提示来传达更多的数据,并使用调色板来以易于理解的方式显示数据。同样重要的是要提到调色板的选择是非常重要的,因为如果图表不直观的话,它会使图表很难阅读。一般来说,使用高对比度、发散的冷-暖调色板是最安全的,就像在这篇文章中描述的那样。
密码
这种可视化所需的代码相当长,而且大部分都不那么有趣,所以我不会查看每一行代码,我将只展示和解释最重要的部分。如果你想深入了解代码的细节,那就去我的知识库中的横条图. js 或者查看我之前的关于蜂群图的文章,在那里我展示了关于代码和 D3.js 的更多细节。
过滤
此图表上显示的数据集非常大,几乎有 250 条记录,一次显示所有记录可能会很难阅读。因此,过滤选项对于用户体验至关重要。GUI 允许用户根据时间范围(即流行病的开始和结束年份)进行过滤,并可以选择过滤出死亡人数未知的流行病。
这两种过滤器都需要对数据集和轴进行一些操作。遍历行列表并删除/添加符合过滤标准的行非常容易。但是,当我们已经准备好更新的数据时,我们如何更新图表呢?
第一步是更新 X 轴和 Y 轴的比例。这些刻度中的每一个都有映射到一个范围的域。在我们的例子中,对于 X 轴,我们将年份映射到图表的宽度(范围):
如上面的代码片段所示,我们从数据集中的所有行中提取最小开始年份和最大结束年份,并将其映射到浏览器窗口中的图表大小。使用此图表上的默认设置,最终会将年份[1875–2020]投影到像素[250,980]上。
类似的情况也适用于垂直(Y)轴,我们需要将所有流行病的标题映射到各个蜱:
这里,我们使用波段刻度代替线性刻度,它更适合分类或顺序数据,如标题。这里的域由所有标题的列表组成——同样——投影到图表的大小(高度)上。正如你在上面所看到的,我们也添加了填充以避免标题重叠。我们图表的一部分将以这样的映射结束:
随着比例尺和坐标轴的更新,我们现在需要关注图表中最重要的部分——条形图。使用 D3.js ,该过程有两个部分,包括所谓的进入和退出选择。首先,我们使用exit
选项从图表中删除现有数据:
如注释中所述,上面的代码从查询所有带有类.bars
的 HTML 元素开始。接下来,它将空数组作为数据集绑定到所选的 HTML 元素。在第三行,它应用了exit
选择——简单地说——从选择中删除所有以前在那里并且不应该再在那里的数据(我们只是绑定了一个空数组给它,所以它只是删除了所有的数据)。最后,最后一行删除数据。
删除数据后,我们还需要放回一些东西来显示。这就是enter
选择的由来:
我们再次选择和以前一样的 HTML 元素。然而,这一次,我们将过滤后的数据集绑定到选择,而不是空数组,并执行enter
选择,这是与exit
相反的操作。在最后一行,我们使用了append
函数…为 SVG 的每个数据条目追加 1 个rect
元素,创建我们所有的小条。在这一点上,我们有了所有的条,有了所有的数据,但是它们没有任何属性,比如宽度、位置、颜色等等。但是,我们将在下一节中解决这个问题!
注:对 *enter*
、 *exit*
和 *append*
的解释非常简单,我建议查看 Jonathan Soma 的这篇文章,了解更多上下文。
动画片
仅仅显示更新的数据并不有趣。因此,为了让观众看起来更加愉快,我们将为这些数据更新添加一些过渡。
与我们更新数据时一样,我们将从 X 轴开始。这是我们如何创建它的动画/过渡:
如果你不习惯于 D3.js 代码,上面的片段可能对你来说不太清楚,所以让我们从说明过渡实际上是什么开始——过渡在 D3.js 中是一种动画形式,其中动画的起点是 DOM 的当前状态,终点是你指定的样式、属性和特性的集合。
现在,让我们一行一行地检查代码。首先,我们选择带有.x
和.axis
CSS 类的元素,在这种情况下是横轴——这是我们动画的起点。接下来,我们开始转换,并将其持续时间设置为 1 秒。之后,我们使用.call
函数,该函数将过渡的结束点作为参数,在本例中,该点是从上一节定义的xScale
创建的底轴,加上 15 个垂直刻度。剩下的就是 D3.js 魔了。
现在,在 Y 轴上。理解了前面的代码之后,这一段就简单了,因为它几乎是一样的东西:
我们只改变了 CSS 类(.y
,并将axisBottom
换成了axisLeft
,就这样,我们完成了 Y 轴的动画和渲染:
垂直轴更新
与前一部分一样,我们将结束所有的小酒吧。为了将它们全部动画化,我们将采用与之前的过渡相同的方法,除了在这种情况下,我们将不使用.call
而是直接使用每个attr
函数:
这看起来很复杂,但实际上并不复杂。我们需要意识到的是,这不是一个单独的动画,而是每个条形对应一个动画。对于它们中的每一个,我们希望结束过渡点的是一个条,其x
坐标等于其d.start
,其y
坐标等于 Y 轴上匹配标题的 Y 坐标,其width
等于其d.end
和d.start
之差。至于最后一个属性——我们根据它的长度(d.start - d.end
)设置它的颜色,这个长度映射到预定义的色标。
整理
在这一点上,我们可以让图表保持原样,这样就很好了,但是我们可以通过添加排序选项为用户提供不同的(可能更可读的)数据视图。顶部的 3 个排序按钮允许用户按流行病的总跨度、开始年份和总死亡人数进行排序。让我们看看如何实现这一点:
所有的工作都由一个名为drawSort
的函数来完成,这个函数监听来自上述按钮的点击事件。根据点击的按钮,它决定应用哪种排序。在每种情况下,它都根据每条记录各自的属性以升序/降序对数据集进行排序。然后,这个排序后的数据集被应用于垂直比例,以与我们在上面的过滤部分中所做的相同的方式更新它的域。接下来,我们执行与上一节相同的转换。这样,最终结果将如下所示:
完整图表动画
结论
在这篇文章的最后,我想说的是,并不是所有的图表和情节都是一样的。在我看来,其中一些——比如这种水平条形图——应该得到更多的关注,应该更频繁地使用。所以,希望这个可视化和简短的解释给你足够的信息,也许可以在你的下一个数据可视化中使用这个图表。如果你想看这个图表的完整源代码,你可以到我的知识库这里,并随时留下反馈或在问题中提问,或者如果你喜欢这种内容,就给它打个星。😉
本文最初发布于martinheinz . dev
让我们使用 D3.js 创建交互式蜂群图表,以便更好地可视化您的数据。
towardsdatascience.com](/better-data-visualization-using-beeswarm-chart-bb46a229c56b) [## 自动化 Python 项目的各个方面
每个 Python 项目都可以从使用 Makefile、优化的 Docker 映像、配置良好的 CI/CD、代码…
towardsdatascience.com](/automating-every-aspect-of-your-python-project-6517336af9da) [## 用 Javascript 实现 2D 物理学
让我们在实现真实的 2D 物理模拟和可视化的同时享受一下 JavaScript 的乐趣吧!
towardsdatascience.com](/implementing-2d-physics-in-javascript-860a7b152785)
数据科学学习指南
学习数据科学的途径应该是什么样的
随着公司使用术语“数据科学”筹集大量资金,该技能的价值已经建立了相当长一段时间。数十亿美元被用来雇佣有才华的数据科学家,他们可以建立一个最先进的演绎机器来使用 zettabytes 的数据。随着我们的生活越来越依赖于零售、娱乐、体育、医疗保健、金融和语言等主要行业,这场革命现在已经成为现实。如果使用得当,数据是所有这些主要领域的一个非常有前途的驱动力,这也是对数据科学家的需求不断增加的原因。
在与全球数千名学生和专业人士讨论了与学习数据科学相关的挑战/问题后,我开设了这个频道来应对所有这些挑战,并帮助你们每个人定义自己从数据到涅槃的道路。
开始于,
数据科学家(DS)的真正含义是什么?
这里有一个非常著名但有点误导的维恩图,它将数据科学解释为数学、黑客技能和实质性专业知识的混合。
来自http://drew Conway . com/Zia/2013/3/26/the-data-science-Venn-diagram
作为一名 DS,你的最终目标是为高管提供指路明灯,让他们做出更明智的决策,并通过解决实际数据问题创造尽可能大的影响。
- 对于一名优秀的数据科学家来说,你必须知道如何定义精确的、有意义的问题,这些问题的答案可以映射到潜在的商业计划中。这需要你有一些领域知识(图中的实质性专业知识)。这是随着你解决越来越多的问题而积累的经验。
2.对于许多问题来说,需要从不同的来源搜寻数据,并将其压缩成更容易处理的形式。编写复杂的 SQL 查询提取数据,使用 python 或 R 脚本操纵 CSV 和文本文件,理解矢量化运算和编码算法;这些让你成为一个优秀的数据黑客。
3.所有的机器学习算法都是基于数学和统计学的。拥有足够数学和统计知识的黑客技能将使你成为一名优秀的机器学习实践者,但不是数据科学家。科学谈论回答导致发现的动机问题。
因此,数据科学家必须专注于 3 个主要课题,领域知识,数学和统计原理以及数据编程/黑客技能。
数据科学的层次结构
数据科学是一个广阔的学习空间,数据科学家在一个组织中工作的职位和部门各不相同。例如,谷歌为工程、客户解决方案、运营、谷歌地图等领域雇佣数据科学家。他们不需要在我们谈到的所有三个领域都表现出色。这就是我们谈论的数据科学和行业实际要求之间的差距。
这里是数据科学技能金字塔,用于在更精细的层面上理解数据科学。你需要覆盖至少 3-4 个层次的知识,才能被一家不一定是数据科学家而是分析师的公司聘用。然后,当你到达金字塔的顶端时,你被称为研究科学家,数据科学家核心,他们由机器学习工程师协助。
作者 Monica Rogati—https://medium . com/hacker noon/the-ai-hierarchy-of-needs-18f 111 FCC 007
注意:重点是你可以从数据科学领域瞄准一堆工作描述。
学习数据科学的先决条件
基于 python 的数据科学课程/程序/书籍要求您对 python 编程和数学能力有所了解。我将介绍基本的 python 编程和概念,它们在处理数据时将变得非常方便。
因此,要掌握数据科学,你需要的只是学习的意愿、好奇的头脑以及明确定义和引导的途径。
顶级数据科学课程
我设计的数据科学课程分支!
我认为数据科学课程有 4 个主要分支有助于培养 rockstar 数据科学家。这是按顺序排列的名单
- 黑客编程工具—
- 数据 —从提取到执行探索性分析。
- 数学和统计— 所有的先决数学概念都有助于你对算法及其原理有一个坚实的理解。
- **算法和项目【V . Imp】—**从不同的机器/深度学习算法到实现这些模型的基于领域的企业级项目。
学习目标
一旦你找到了一条路可走,下一个重要的问题是你的学习目标是什么,例如,我的一个学员在金融领域工作了 20 年,现在他们想学习数据分析,因为这将有助于她在自己的岗位上成长,并能够寻找其他机会。您可能是以下人员之一:
- 希望转换你的职业领域(例如,从软件工程师到数据科学家),但在同一个领域。
- 找数据科学的工作,苦苦挣扎。
- 对数据科学及其给你的个人资料带来的职业前景感兴趣的学生。
- 我想从事一些自由职业数据项目。
现在,根据你属于哪一类,你必须找出你的优势和你的劣势。例如,软件工程师的优势在于编程,但不一定在于数学建模,统计学家可能会发现自己在 python 或 r。
一旦你从自己的弱点中找到了主要的关注点,那么你只需要在你的强项上花更多的时间在你的弱项上。
制定自己的学习计划
你的学习目标会给你指明方向,但是能够继续前进是人们为自己开脱的地方。
问:动机是这里的关键问题。
一个深思熟虑的学习计划可以帮助你实现你的目标。但是什么是好的学习计划呢?
鼓励大脑学习更多知识的制度。构建/解决一个现实世界的问题会给你的思维提供背景和清晰性,这反过来会让你有兴趣去发现隐藏的模式,以及清晰定义的下一步,以防止你迷路。
回答:保持你的学习过程项目/问题驱动。解决不同复杂程度的现实世界问题,并在学习新概念和新技术的过程中不断进步。
其他常见问题有:
一个人应该做什么样的项目?
答:如果你不想呆在自己的专业领域,你应该参与不同行业的项目组合,即医疗保健、金融、电子商务、生物信息学、旅行和旅游、制造业等。
问:学数据科学需要多少时间?
答:这取决于个人,但平均需要 3-4 个月来涵盖所有主题及其在 6-8 个项目中的实施,因为你每天投入 2 个小时。
问:有哪些学习数据科学的好资源?
Ans:
1。对于 Python 编程,可以使用:https://www.learnpython.org/或者https://docs.python.org/3/tutorial/2.使用 Scikit-learn、Numpy、Pandas、Keras 和 Tensorflow 等库的官方文档。
3.对于数学或者统计学,可以用书:https://mml-book.github.io/book/mml-book.pdf
4.对于项目,开始在 Kaggle 上练习。注意:我将写另一篇关于资源的文章。
- 找出一天中最适合你的时间。
- 养成阅读研究论文的习惯。
整个计划的唯一问题是有许多主题要涉及,有许多地方要寻找。所以,我尝试在一个地方给你提供最好的资源,我的 YouTube 频道叫做:
Harshit 的数据科学
通过这一渠道,我计划推出几个关于上述数据科学需求层次的系列。以下是你应该订阅频道的原因:
- 该系列将涵盖每个主题和副主题的所有必需/要求的高质量教程。
- 解释了为什么我们在 ML 和深度学习中做这些事情的数学和推导。
- 与谷歌、微软、亚马逊等公司的数据科学家和工程师以及大数据驱动型公司的首席执行官的播客。
- 项目和说明,以实现迄今为止所学的主题。
订阅我的 YouTube 频道,第一个视频将于 3 月 23 日发布:
涵盖整个数据科学课程和其他所有内容。指导了 1500 多名学生,课程…
www.youtube.com](https://www.youtube.com/channel/UCH-xwLTKQaABNs2QmGxK2bQ)
你可以在 LinkedIn 、 Twitter 或 Instagram 上与我联系(在那里我谈论健康和福祉。)
注意:在这段黑暗的日子里,自我隔离给了我们一些自我提升的空间,我们可以利用它来发展新的技能、爱好,并帮助我们未来的自己从新冠肺炎这样的大流行病中吸取教训。
¡Hola! 你好!Hej ! — Multilanguage and more for Power Virtual Agents.
微软 POWER 平台解决方案
Power 虚拟代理有什么新特性?作为微软 Power 平台的一部分,Power 虚拟代理聊天机器人的最新改进概述
乔恩·泰森在 Unsplash 上的照片
在过去的几年里,低代码解决方案变得越来越流行。对于微软 Power 平台及其最新成员 Power 虚拟代理,其低代码聊天机器人引擎来说尤其如此。
到目前为止,这个解决方案有其局限性;最重要的是,我们只能用英语创建聊天机器人。幸运的是,微软最近大大改进了这个解决方案。
这一简要概述涵盖了最重要的功能:
- 多语言支持
- 全局对话框变量
- 来自外部源的全局对话框变量
- 应用生命周期管理支持
如果你是电力虚拟代理新手,你可以按照我的逐步介绍这里。
2020 年夏季 Power 虚拟代理的新特性
¡Hola! 你好!Hej! — Multilanguage Support
有了这个新版本,我们现在可以为多种语言创建一个聊天机器人,而且非常简单。只要创建一个新的机器人,你会在第一步看到语言下拉菜单。
根据文档,支持的语言如下:
- 英语(已正式发布)
- 中文(简体)
- 中文(繁体)
- 丹麦的
- 荷兰人
- 法语
- 德国人
- 印度尼西亚的
- 意大利的
- 日本人
- 挪威的
- 葡萄牙语
- 俄语
- 西班牙语
- 瑞典的
- 土耳其的
- 印地语
- 韩国的
- 抛光剂
要获得支持语言的完整列表,请点击这里查看官方文档。
注意,一个机器人一次只能说一种语言。如果你想让同一个聊天机器人支持多种语言,比如说德语和英语,你可以创建两个聊天机器人。这就是像 Microsoft Bot Framework 这样的亲代码解决方案给你带来显著优势的地方,它允许你构建一个 Bot 来检测所说的语言并动态地调整语言。
全局变量
直到最近,我们可以在单个对话框中定义变量来收集、存储和管理机器人的上下文。我们可以很容易地收集像用户名这样的细节,并在同一个对话框(主题)的后续步骤中使用这些信息。然而,我们不能在不同的对话框之间共享信息,这使得体验有点模糊,因为我们需要多次问用户同样的问题。
随着全局变量的引入,我们现在可以在不同的对话框之间共享这些信息。
让我们做一个快速测试。创建一个名为的新话题收集用户信息。添加问题“你叫什么名字?”。给输出变量起一个有意义的名字,比如用户名、并将用法选项切换为 Bot(任何主题都可以访问)。
这个变量现在可以从任何其他主题中访问,包括像问候对话框这样的内置主题。
例如,您可以在问候对话框中添加分支逻辑,看看我们是否已经知道了用户的名字。如果是这样,我们输出一个更加个性化的问候消息。
如果变量没有值,Power Virtual Agent 将自动切换到收集用户信息对话框,尝试收集该信息。
外部来源的全局变量
我们不仅可以从对话框中创建全局变量,还可以从外部资源中设置它。我们可以从外部传入一些参数,例如,从嵌入聊天机器人的网站传入。
为此,我们需要选中复选框外部源可以在我们的目标变量上设置值。如描述所示,这允许我们从外部设置变量。
让我们使用 iFrame 来尝试一下。
确保您已经发布了您的更改(这可能需要 15 分钟),然后转到频道并点击定制网站。
从那里,你可以复制 html 代码并在任何网站上使用。
我们使用jsfiddle.net来模拟这个过程。只需将复制的 html 片段粘贴到 html 面板,然后单击运行。
要使用这个 iFrame 代码传递变量的值,只需将它作为 URL 变量附加在 src 属性的末尾。要设置用户名,只需追加?UserName=Sebastian
并再次运行代码。
聊天机器人将不再提示您的姓名。
请注意,参数必须是 URL 编码的,以防它包含特殊字符或空格。
支持应用生命周期管理
Power Virtual Agents 现在支持解决方案。这意味着可以使用 Microsoft Power Platform 的解决方案概念来管理它。请将解决方案视为每个应用程序或 chatbot 使用 Microsoft Power Platform 构建的基本构建块的包。
您可以打包、导出、导入解决方案,并在不同的环境之间共享它们。
这使得能够使用应用生命周期管理(ALM)实践来管理这样的解决方案。您可以使用您最喜欢的 CI-CD 解决方案在不同阶段之间移动您的聊天机器人,如开发、测试、试运行和生产。
要查看您的所有机器人,请前往make.powerapps.com>聊天机器人>列表。
要打包您的聊天机器人,只需进入解决方案,点击新建并创建一个空解决方案。
接下来,点击添加现有的并从列表中选择聊天机器人。
最后,您选择想要添加到解决方案中的聊天机器人,并点击添加按钮。
从这里,我们可以开始导出解决方案或开始实施 CI-CD 管道。
我最近写了一篇关于如何用 Azure DevOps 实现这样一个管道的博文。你可以很容易地将它应用到聊天机器人上。
就是这样。试试看。
就这样吧。👉
—塞巴斯蒂安
霍尔特-温特斯指数平滑
使用霍尔特-温特斯指数平滑法生成的销售预测(数据来源: US FRED )(图片由作者提供)
时间序列数据的超快速预测工具
霍尔特-温特斯指数平滑法用于预测既显示趋势又显示季节变化的时间序列数据。霍尔特-温特斯技术由以下四种预测技术叠加而成:
(图片由作者提供)
**加权平均值:**加权平均值就是对 n 个数字进行平均,其中每个数字都被赋予一定的权重,分母是这些 n 个权重的总和。重量通常根据一些称重功能进行分配。常见的加权函数有对数函数、线性函数、二次函数、三次函数和指数函数。平均作为一种时间序列预测技术,具有在计算预测时消除历史值变化的特性。通过选择合适的加权函数,预测器确定在计算时间序列的未来值时应该强调哪些历史值。
**指数平滑:**指数平滑(ES)技术使用所有先前值的加权平均值来预测下一个值,其中权重从最近的历史值到最早的历史值呈指数衰减。当您使用 ES 时,您做出了一个重要的假设,即时间序列的最近值比旧值更重要。ES 技术有两个大的缺点:当你的数据表现出趋势和/或季节变化时,它不能被使用。
**霍尔特指数平滑:**霍尔特 es 技术弥补了简单 ES 技术的两个缺点之一。Holt ES 可用于预测具有趋势的时间序列数据。但是 Holt ES 在时间序列中存在季节性变化时就失效了。
霍尔特-温特斯指数平滑法:霍尔特-温特斯法修正了霍尔特-温特斯法,使其可以用于趋势和季节性并存的情况。
要了解霍尔特-温特斯指数平滑法的工作原理,必须了解时间序列的以下四个方面:
水平
通过一个例子可以更好地理解级别的概念。以下时间序列显示了默克公司在纽约证券交易所的收盘价。水平红线表示时间序列在上升和下降过程中的一些级别:
数据来源:雅虎财经
趋势
水平以某种模式变化的时间序列被称为具有趋势。水平围绕某个平均值随机变化的时间序列可以说表现出随机趋势。除了知道趋势是随机的之外,当趋势是随机的时候,趋势的概念就没有那么有用了,相比之下,趋势可以用一些函数来建模。
让我们放大上述股价图中的一个特定区域来说明积极趋势的概念:
两个连续水平之间的积极趋势的例证
一些常见的趋势是线性、平方、指数、对数、平方根、倒数和三阶或更高阶多项式。使用相应的数学函数,即 log(x)、linear、x、exp(x)等,可以很容易地对这些趋势进行建模。
高度非线性的趋势需要复杂的建模技术,例如人工神经网络来成功地对其建模。
观察趋势的一个有用的方法是作为一个比率,或者作为时间序列在给定水平上的速度。
这使得趋势成为一个有大小(变化率)和方向(增加或减少)的向量。
让我们把趋势的这种解释作为一种速率或速度放在我们的脑海里。我们将在解构霍尔特-温特斯指数平滑的预测方程时使用它。
季节性
许多时间序列显示围绕当前水平的周期性上下运动。这种周期性的上下运动被称为季节性。以下是展示季节性模式的时间序列示例:
每日太阳黑子计数。数据来源: SILSO (图片由作者提供)
噪音
噪声只是时间序列数据中你无法(或不想)解释的一个方面。
水平、趋势、季节性和噪声被认为以相加或相乘的方式相互作用,产生您观察到的时间序列的最终值:
乘法组合(具有加法趋势)
加法趋势、乘法季节性、乘法噪声(图片由作者)
完全加法组合
加法趋势、季节性和噪声(图片由作者提供)
霍尔特-温特斯指数平滑方程
我们现在准备看看霍尔特-温特指数平滑技术的预测方程。我们将首先考虑趋势增加到当前水平的情况,但是季节性是倍增的。这是现实世界时间序列数据中的常见情况。
因为我们指定了预测模型的方程,所以我们将忽略噪声项。
(图片由作者提供)
在上面的等式中,我们预测了从某个任意步 i 开始的时间序列 k 的值。假设季节变化具有已知的周期长度 m 时间步长。例如,对于年度变化, m=12。
让我们看看如何估计 L_i,B_i 和 S_i.
让我们从步骤 i 的趋势 B_i 的估计开始:
(图片由作者提供)
上面的等式通过以下两种不同的方式计算来估计在步骤 i 中观察到的趋势 B_i :
**【L _ I _ L _(I-1)】😗*这是两个连续电平之间的差值,它代表电平 L_(i-1) 处的电平变化率。看待这一项的一种方式是把它想象成数据在水平 L_i 处的速度,它来自水平 L_(i-1) 。
**【B _(I-1):这就是在【L (I-1)*的电平变化率,递归表示。为了计算 *B(i-1) ,我们通过用 (i-1) 替换 i ,对 B_i 使用相同的等式,并且我们一直这样做,直到我们到达 B_0 ,其值我们假设为初始条件。一会儿会有更多关于估计初始条件的内容。
下图说明了对 B_i 的上述递归关系的递归分解:
(图片由作者)
现在应该很清楚指数加权平均是如何形成霍尔特-温特斯技术的弱点的。这里有三个重要的观察结果:
- 重量 β(1-β)、β(1-β)、β(1-β)…等。形成几何级数。
- 这个数列的每一项 β(1-β)^k 对时间数列中两个连续电平[l _(I-k)-l _(I-k-1)】之差进行加权。
- 最近的两个级别*【L _ I—L _(I-1)】*之间的差异具有最大的权重 β ,并且随着时间的推移,权重以因子 (1-β) 呈指数衰减。
还要注意的是, B_i 的估算要求我们知道步骤 i 和 (i-1) 、 (i-2) 等的水平,直到我们假设的初始条件 L_0 为止。
现在让我们看看如何在时间步 i 估计水平 L_i :
(图片由作者)
正如趋势 B_i 一样,上述等式通过以两种不同的方式计算来估计水平 L_i ,然后取两个估计值的加权平均值,如下所示:
T _ I/S _(im)😗*回想一下,我们已经假设水平和季节性是相乘的,即 T_i=L_iS_(i-m)N_i. 因此,如果你选择忽略噪声的影响N _ I,那么 L_i 的一个好的估计值就是T _ I/S _(im)
**【L _(I-1)+B _(I-1)】😗*在本项中,我们通过将 L_(i-1) 与 L_(i-1) 到 L_i 之间发生的水平变化相加,即趋势 B_(i-1) 来估计水平 L_i 。
与 B_i 一样,我们递归地求解这个方程,直到我们碰到 T_0 、 S_0 、 B_0 和 L_0。T_0 只是我们训练数据集中最老的数据点。s0、B0和l0为水平、趋势和季节变化的初始值。它们是用各种技术估算的,我很快就会讲到。现在,我们假设它们被设置为一些合理的初始值。
在 L_i 的上述等式中,为了估计 L_i ,我们还需要估计季节性成分 S_(i-m) 的贡献。因此,让我们看看如何在步骤 i 中估算季节性成分:
(图片由作者提供)
您可以看到,季节性成分 S_i 的估算策略与趋势 B_i 和水平 L_i 的估算策略相似,它通过两种不同的方式计算来估算 S_i ,然后取两个估算值的加权平均值。
现在我们知道了如何估计时间步 i 的水平、趋势和季节性成分,我们准备将三个估计值放在一起,以获得步骤*【I+k】的预测值(I+k)*,如下所示:**
(图片由作者提供)
初始条件的估计
由于 Holt-Winters 方法的所有方程都是递归关系,我们需要为这些估计方程提供一组初始值,以启动预测引擎。具体来说,我们需要设置 L_0,B_0,S_0 的值。**
有几种方法可以设置这些初始值。我将解释 Pythonstats models库使用的技术。(我们将很快使用 statsmodels 来构建 Holt-Winters ES 估计器,并使用它来预测未来的 12 个时间步长)。
估算 L_0 : Statsmodels 将 L_0 设置为您提供的时间序列的所有观测值的平均值,位于指数 0,m,2m,3m 等,其中 m 为季节周期。例如,如果您告诉 statsmodels 您的时间序列显示 12 个月的季节周期,它将按如下方式计算 L_0 :
(图片由作者提供)
注意,T_0 是时间序列数据中最老的值。
即使时间序列不显示季节性,也可以使用霍尔特-温特斯预测技术。在这种情况下,statsmodels 会将 L_0 设置为训练数据集的第一个值。即
l0 = t0,当数据中没有季节变化时**
估计 B_0 :如果您的时间序列显示一个相加趋势,即其水平线性变化,statsmodels 通过计算观察值 T_i 在 m 时间步上的变化率,然后取这些变化率的平均值,来估计初始趋势 B_0 。例如,如果您告诉 statsmodels,您的时间序列显示出一个相加趋势,并且它有一个 12 个月的季节周期,它将按如下方式计算 B_0 :
(图片由作者提供)
如果你的时间序列呈现倍增趋势,即水平以与当前水平成比例的速率增长, statsmodels 对 B_0 使用看起来稍微复杂的估计器。最好用年度季节性的例子来说明( m=12 ):
(图片由作者提供)
但是,如果您的时间序列不显示季节性变化,如果趋势是乘法的,则简单地将B0设置为t1/t0*,如果趋势是加法的,则设置为*(t1-t0)。
估计 S_0 : 如果季节性是倍增的,即给定水平的季节性变化值与该水平的值成比例,那么 S_0 估计如下:
(图片由作者提供)
当季节变化是常数或在每个水平上增加一个固定的量,即它是累加的,那么s0估计如下:
(图片由作者提供)
当你的时间序列没有季节变化时, S_0 是[],一个空向量。
注意一件重要的事情。虽然 L_i 和 B_i 是标量,但是 S_i (因此 S_0 )是长度为 m 的向量*,其中 m 是季节周期。在您的时间序列中的每个时间步 i=0,1,2,…n ,位于矢量位置 (0 mod m),(1 mod m),(2 mod m),…,(i mod m),…,(n mod m) 的相应季节因子用于预测 F_i.*
估计α、β和γ
加权系数 α、β和γ 通过给它们初始值,然后针对某个合适的分数迭代优化它们的值来估计。最小化 MSE(均方误差)是一个常用的优化目标。Statsmodels 将初始 α 设置为 1/2m,将β 设置为 1/20m ,当存在季节性时,将初始 γ 设置为 1/20(1 — α) 。*
一旦l0,B0 和 s0*被估计,并且 α,β和γ 被设定,我们可以使用 L_i,B_i,S_i,F_i 和 F_(i+k) 的递推关系来估计时间序列在步骤 0,1,2,3,…,I,…,n,n+1,n+2,…,n 的值*
如果您的训练数据集有 n 个数据点,那么位置 n+1,n+2,…,n+k 对应于使用霍尔特-温特斯估计技术生成的 k 样本外预测。
在 Python 中使用霍尔特-温特斯指数平滑法
我们将使用 Holt-Winters 指数平滑技术估计美国二手车经销商零售时间序列的 12 个未来值:
数据集可从这里下载。
让我们从导入所有需要的包开始。
***import** pandas **as** pd
**from** matplotlib **import** pyplot **as** plt
**from** statsmodels.tsa.holtwinters **import** ExponentialSmoothing **as** HWES*
将数据集读入熊猫数据框。请注意,日期列(列 0)是索引列,其格式为 mm-dd-yyyy。
*df = pd.**read_csv**('retail_sales_used_car_dealers_us_1992_2020.csv', **header**=0, **infer_datetime_format**=True, **parse_dates**=[0], **index_col**=[0])*
将索引频率明确设置为每月一次,这样 statsmodels 就不必尝试推断它。
*df.index.**freq** = **'MS'***
绘制数据:
*df.**plot**()
plt.**show**()*
我们得到了下面的图表:
(图片由作者提供)
在训练数据集和测试数据集之间拆分。最后 12 个周期形成测试数据。
*df_train = df.**iloc**[:-12]
df_test = df.**iloc**[-12:]*
根据训练数据建立和训练模型。在上图中,时间序列的水平似乎是线性增加的。所以我们把趋势设为相加。然而,每一水平周围的季节变化似乎与当前水平成比例增加。所以我们把季节性设为倍增。
*model = **HWES**(df_train, **seasonal_periods**=12, **trend**='add', **seasonal**='mul')
fitted = **model**.fit()*
打印出培训总结。
***print**(fitted.**summary**())*
我们得到以下输出:
(图片由作者提供)
为训练数据集中最后一个数据点之后的 12 个步骤创建样本外预测。
*sales_forecast = fitted.**forecast**(**steps**=12)*
将训练数据、测试数据和预测绘制在同一个图上。
*fig = plt.**figure**()
fig.**suptitle**('Retail Sales of Used Cars in the US (1992-2020)')
past, = plt.**plot**(df_train.index, df_train, **'b.-'**, label=**'Sales History'**)
future, = plt.**plot**(df_test.index, df_test, **'r.-'**, **label**='Actual Sales')
predicted_future, = plt.**plot**(df_test.index, sales_forecast, **'g.-'**, **label**='Sales Forecast')
plt.**legend**(**handles**=[past, future, predicted_future])
plt.**show**()*
(图片由作者提供)
让我们放大到最近 12 期。您可以看到预测滞后于急剧的转折点,这对于任何基于移动平均线的预测技术来说都是应该的:
(图片由作者提供)
以下是完整的源代码:
进一步阅读
温特斯出版社(1960 年)。通过指数加权移动平均线预测销售额。管理科学。
Makridakis,s .、Wheelwright,S. C .、Hyndman,R. J. 预测方法和应用。第三版。约翰·威利的儿子们。
引用和版权
美国人口普查局,零售销售:二手车经销商[MRTSSM44112USN],检索自圣路易斯美联储银行弗雷德;https://fred.stlouisfed.org/series/MRTSSM44112USN,2020 年 6 月 17 日,根据弗雷德版权条款。
SILSO,世界数据中心-太阳黑子数和长期太阳观测,比利时皇家天文台,在线太阳黑子数目录:http://www.sidc.be/SILSO/,1818–2020(CC-BY-NA
默克公司(MRK),纽约证券交易所——历史调整收盘价。货币为美元,https://finance.yahoo.com/quote/MRK/history?p=MRK,2020 年 7 月 23 日。版权所有雅虎财经和纽约证券交易所
本文中的所有图片版权归 CC-BY-NC-SA 下的 Sachin Date 所有,除非图片下面提到了不同的来源和版权。
感谢阅读!如果您喜欢这篇文章,请 关注我 获取关于时间序列分析的提示、操作方法和编程建议。