TowardsDataScience 博客中文翻译 2021(四百二十三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

使用 UMAP 和聚类整合组学

原文:https://towardsdatascience.com/integrating-omics-using-umap-and-clustering-d2a5ef39693f?source=collection_archive---------6-----------------------

实践教程

使用 Python 通过降维和聚类对蛋白质组和转录组数据的联合无监督探索

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

蛋白质组和转录组数据集的联合 2D 嵌入和随后的聚类。作者图片

如今,生命科学是由数据驱动的。你可能听说过基因组学、转录组学、蛋白质组学,即使你不是生物学家或医学研究者。 组学 是试图整体理解细胞、组织或有机体子系统的科学方法,它们在此过程中产生大量信息。这些技术在产生数据方面做得越好,就越需要新的计算方法来处理数据。

我对整合蛋白质组学数据和其他组学的信息,主要是转录组学的信息很感兴趣。简而言之,蛋白质组学旨在确定生命系统中蛋白质的水平、功能和相互作用,而转录组学则捕捉基因表达产物 RNA 分子的快照。基因表达和蛋白质的功能错综复杂地联系在一起,因此一起探索它们结合了细胞拼图的两个关键部分。组学整合的计算方法正在积极开发中:参见,例如,多组学因子分析(MOFA 和 MOFA+ 包)[1]或混合组学 [2]。这些包涵盖了各种数据类型的监督和非监督集成的一系列用例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实现组学技术的自动化设备。国立癌症研究所Unsplash 上拍摄的照片

最近,我将注意力转向了被称为一致流形逼近和投影,或 UMAP【3】,【4】的降维技术。是的,我参加聚会迟到了,但迟到总比不到好!我真正感兴趣是在我读了 TDS 博客的一篇文章之后,文章作者是尼古拉·奥斯科尔科夫,他利用 UMAP 构建了一个单细胞 RNA-seq 和蛋白质组数据的组合嵌入。对我来说很明显,UMAP 提供了一种在混合数据集中寻找内部结构的工具,我想知道这是否可以成为一种有效的方法,根据蛋白质和 RNA 水平上的丰度分布联合聚类基因,这项任务因基于质谱的蛋白质组学和转录组学中获取数据的方式不同而变得复杂。

加载和格式化数据

在本帖中,我们将重复使用 Hultqvist 和合著者的论文中的数据,包括发表在同行评审期刊《自然生态&进化【5】上的 yours truly。手稿在付费墙后面,但数据集是公开的,这要感谢鼓励透明和共享研究数据的出版政策。基于质谱的蛋白质组数据可以在蛋白质组鉴定数据库(PRIDE)中找到;如果没有该领域的经验,将质谱文件转换成蛋白质水平的数据可能会很复杂,因此我重新处理了它们以获得一个全面的蛋白质表,该表被放入本文的 GitHub 存储库中。RNA-seq 转录组数据可通过基因表达综合 (GEO)公开获得,我已经从页面下载了 RPKM(每千碱基每百万次阅读的阅读数)表。你们当中对这项研究的生物学方面感兴趣的人可以参考 GEO 项目的网页来获得样本的描述。

实验由属于 5 种不同条件的大肠杆菌细胞组成,我将它们称为 WT(野生型,一种默认的细胞培养物)、ORF、ORF+IPTG、SVI 和 SVI+IPTG(经过基因改造和化学处理的细胞)。每种条件下有两种平行生长的细胞培养物,我们称之为生物复制物。一式两份培养样品的目的是评估培养引起的变化,而不是由条件之间的差异引起的变化。

完整的 Jupyter 笔记本可以在 Github 资源库中找到,这里我将只展示最相关的代码片段。我们需要 umap-learn、scikit-learn 和通用数据分析库:

加载蛋白质组和 RNA 序列数据:

(1955, 48)
(4205, 37)

这些表包含一堆列,其中大部分对于这个分析是不必要的。我们将为每个蛋白质添加基因名称(将蛋白质与 RNA-seq 中的基因联系起来),选择丰度列并对它们进行对数转换:

蛋白质组表中的每一行相对丰度都表示为一个比率,该蛋白质的 WT1 丰度作为分母。这对于这种特定的蛋白质组技术来说是相当典型的(所谓的同量异位标记链接到供应商的网站获取信息),它强调丰度数据的相对性质,同时保留关于丰度变化的可变幅度的信息。使用同量异位标记的实验的一般想法是从每个样品中获取等量的总蛋白质质量。因此,我们预计样本之间蛋白质丰度的中值比率约为 1.0,因为一些蛋白质上升,一些蛋白质下降,而总蛋白质量保持不变。与中值的偏差可能是由样品制备的缺陷引起的,我们可以通过重新归一化数据进行补偿,使每个样品的中值在对数空间中等于零:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

蛋白质组分布现在非常对称,以零为中心!

RNA-seq 表中的 RPKM 值分布非常不同:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以与蛋白质组数据相同的方式格式化 RNA-seq 数据可能是一个好主意:使用 WT1 强度作为每个基因的分母,并对所得比率进行对数转换:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

重新归一化为相等的中间值:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选择方差最大的基因

由于生物数据的大量特征和噪声性质,仅选择最具信息性的特征用于进一步分析是有意义的。你可以在尼古拉·奥斯科尔科夫另一篇文章中找到对功能选择的深刻见解。

我们的数据集有 5 个生物条件,每个条件 2 个重复。为什么我们不在这里利用复制进行特性选择呢?简而言之,我们想要在生物条件下具有“强烈变化”的信息特征,并且我们希望过滤掉保持相对不变的特征。我们可以用一种独立的方式定义“强变化”:如果条件之间的变化超过了条件内重复之间的大部分变化值,那么它就是“强变化”。我们可以计算每个蛋白质/基因重复之间的 log2 差异:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

RNA-seq 数据集中的差异明显更大。现在让我们看看这些条件的平均值之间的差异:

蛋白质表中的平均分组:

RNA 表中的平均组数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在我们可以看到,对于 RNA-seq 数据集,重复之间和条件之间的差异更大。这可能是因为 RNA 数据比蛋白质组数据更嘈杂,和/或因为与本研究中使用的质谱法相比,RNA-seq 测量的动态范围更高。

准备就绪后,让我们按基因名称连接这些表,并选择其中或者平均蛋白质值之间的最大变化高于蛋白质重复差异的第 90 百分位或者平均 RNA 值之间的差异高于 RNA 重复差异的第 90 百分位的行:

Proteins 90th percentile: 0.2658608755331754
RNA 90th percentile: 0.8764194924938945
Before: (1778, 32)
After: (951, 32)

UMAP 嵌入

UMAP 的数据已经准备好了!我们将从每行中选择蛋白质和 RNA 的平均值,因为我们希望强调生物条件之间的差异,而忽略条件内的变化。我们也可以排除 WT 样本,因为根据我们数据转换的本质,所有的值都非常接近于零(分母中的 WT1)。让我们计算并可视化蛋白质和 RNA 上的独立嵌入,以及联合嵌入:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

太好了,我们可以看到集群正在形成!聚类的形状和分布将因设置而异,包括重要的 n_neighbors 参数。我和 n_neighbors 在 10 到 100 的范围内玩,定在 30,接近特征数的平方根(951)。

使聚集

Scikit-Learn 为我们提供了一系列可以应用于嵌入结果的聚类选项。由于我们在图上看到了密集的集群,因此尝试基于密度的集群或 DBSCAN 是很自然的。eps 参数很重要,应该根据数据进行调整。我们也可以应用其他常用的算法,例如,均值漂移凝聚聚类。这些情况下的关键参数分别是带宽和集群数量。让我们看一下通过这三种方法完成的集群概述:

Found clusters 52
Found clusters 43
Found clusters 45

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从鸟瞰图来看,算法以不同的方式突出了散点图上的点的密度簇和“星座”。但是他们捕捉到了行为相似的基因群吗?为了判断这一点,我们可以用热图来表示每个星团中的相对丰度。让我们以 DBSCAN 结果为例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看起来这些星团确实有一致的内部结构!如有必要,调整聚类参数有助于进一步调整结果组的大小和组成。在组学整合的背景下,探索显示蛋白质谱(P-样本)和 RNA 谱(R-样本)之间差异的聚类是令人兴奋的。以集群 36 和 37 为例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到一些有趣的相对丰度的轮廓,其中蛋白质和转录物明显不同步!此外,簇中的基因可能彼此相关。探索性的数据分析为进一步的科学研究提供了有趣的候选者!

结论

对来自同一实验的蛋白质组和转录组数据的联合 UMAP 嵌入和随后的聚类是突出相似行为基因组的直接方法。在这篇文章中,我们研究了数据过滤、使用 umap-learn 包的 UMAP 降维以及使用 scikit-learn 中实现的三种算法的聚类。

参考

[1] Argelaguet MOFA+:多模态单细胞数据综合整合的统计框架 (2020),Genome Biol 21,111

[2] F. Rohart 混合组学:一个用于“组学特征选择和多重数据整合”的 R 包 (2017),PLOS 计算生物学 13(11): e1005752

[3]麦金尼斯,希利 UMAP:统一流形逼近和降维投影 (2018),ArXiv 电子版 1802.03426,2018]

[4] E. Becht 使用 UMAP (2019),Nat Biotechnol 37,38–44 可视化单细胞数据的降维

[5]j . jerlstrm Hultqvist 一种噬菌体酶诱导细菌代谢扰动,赋予一种新的混杂功能 (2018),Nat Ecol Evol 2,1321–1330

集成 PyPlot 和 PySimpleGUI

原文:https://towardsdatascience.com/integrating-pyplot-and-pysimplegui-b68be606b960?source=collection_archive---------4-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有图片由作者提供

一个实用的数据即解决方案。

这是给谁的?

如果你是一名数据科学家或者有一些 python 中的数据可视化需求,你可能正在使用https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.htmlPyPlot,如果你需要与你的绘图交互或者制作一个独立的程序,你将需要将 py plot 与 GUI 库集成。我之所以使用 PySimpleGUI 是因为当我想快速地将东西放在一起并演示一个工作程序时,我会使用它。

⚠️ **Caveat Emptor:** There are other patterns and ways to code the same functionality, this is what makes sense to me, if you want to learn more check these related posts: [**Organizing your python code**](https://k3no.medium.com/organizing-your-python-code-ca5445843368) and [**Alternatives to using globals Python**](https://betterprogramming.pub/alternatives-to-using-globals-in-python-a3b2a7d5411b). There are also other GUI Libraries you might want to check via the following introductory posts, in addition to [**PySimpleGUI**](https://levelup.gitconnected.com/uis-in-python-with-pysimplegui-e5cd8ea275e8) I currently like [**KIVY**](https://k3no.medium.com/kivy-menagerie-af6a53e74695) and [**PyQT/PySide**](https://medium.com/swlh/python-gui-with-pyqt-pyside2-5cca38d739fa)**.**

投机

我们想要的是一个交互式的绘图,我的意思是你在 UI 中有一些影响绘图的控件,它可以从不同的数据系列或其他数据中选择,出于演示的目的,我们的规范将只有几个基本的调用来进行交互,但希望你能适应你的项目…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

imho 规范是建议性的,而不是决定性的,我的意思是,最终结果可能不会像上面那样,但会做所代表的一切,甚至可能看起来更好。

婴儿学步

在将 Pyplot(或任何其他库)与 GUI 集成之前,我发现拥有一个可工作的最小化脚本是一个好主意,这样您可以稍后将它插入 GUI:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

👋👋 Hi there 👋👋 all my content is free for Medium subscribers, if you are already a subscriber I wanted to say thank you ! 🎉 If not and you are considering subscribing, you can use my membership referral link, you will be supporting this and other high quality content, Thank you !**⭐️⭐** [**Subscribe to Medium !**](https://k3no.medium.com/membership) **⭐️⭐️**

最小 PySimpleGUI Pyplot 集成

下一步是抓住这个最小的例子,并把它添加到 PySimpleGUI 中,UI 集成的关键是,有时你必须有一个各种各样的桥梁,帮助器方法,或者下降到两个库可以相互对话的水平,在这个例子中是 tkinter canvas。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Note that we lost the toolbars from PyPlot, mostly to keep things simple and use the GUI to interact with the plot, if you still need the toolbar check this demo program:[https://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_Matplotlib_Embedded_Toolbar.py](https://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_Matplotlib_Embedded_Toolbar.py)

更新图表

要更新图表,我们需要重新绘制它,这意味着我们需要删除它,修改它,然后在画布上再次绘制它…

⚠️ **A few new things in this script:** We have new methods to deal with the plot update ( I am calling it chart in the methods to differentiate the methods, the plot and the figures ), there are also new "global" variables for the figure and plot so we can reference them after creating them, a new button and event catcher for the UI part and a new method to update the chart/plot/figure where we actually do the updating, one last upgrade is the makeSynthData method (always be refactoring). 

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

还改变了主题,以突出闪烁的更新。

好消息是,它的工作,我们现在有一个可更新的情节,它似乎工作得很好,唯一的问题是,更新似乎有点不和谐,这是由于画布重绘,并证明是一个不那么微不足道的问题…

💁 Like many things in life, getting rid of bugs in programs seems to follow the [Pareto Principle](https://en.wikipedia.org/wiki/Pareto_distribution), that is 20% of the final improvements can take 80% of your time and add considerable complexity ( *I guess* t*he flip side might be that 20% of your time will give you 80% of the program* ). In this case getting a smooth update would perhaps entail integrating PyPlot at a lower level, introducing threads and on and on, read here if you want to go this route : [How to update a plot in matplotlib?](https://stackoverflow.com/questions/4098131/how-to-update-a-plot-in-matplotlib)

折衷解决方案。

解决这种困境的一个简单的方法是简单地使用你所拥有的东西,找到简单的替代方法,这里我只是简单地将 Pyplot 风格与 PysimpleGUI 主题相匹配,这样会有更好的体验:

应该给你:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

⚠️ Matching themes across libraries can be time consuming, getting the exact colors for an element might require you to dig through the documentation, my quick alternative is to simply use a color picker, so here I first changed the theme to **Solarize_Light**, and then got the colors for PySimpleGUI with a color picker (I like [colorslurp](https://colorslurp.com) ). 

发展

经过这个小小的迂回之后,剩下要做的就是添加更多的按钮和调用来修改你的情节,例如,让我们用一个滑块来改变**dataSize** 变量…

应该给你:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看在我当初的 spec 上,叶不可一世,绝望!但是说真的,它做了规范中说的所有事情。

**Some Final Changes:** I've added a [**slider**](https://pysimplegui.readthedocs.io/en/latest/call%20reference/#slider-element) element to take care of the sample size ( also renamed everything so it makes some Data Science sense ) this slider simply changes the now global dataSize variable and calls the **updateChart** method we've been using, I left the update button but renamed it to resample. The rest of the changes are visual ones( check the **layout** definition) note that most of the alignment is done via padding.

总而言之,我可以演示这一点,我希望它能作为你制作自己的快速数据即仪表板实验的起点。

感谢阅读!

将 Scikit-learn 机器学习模型集成到微软。NET 生态系统使用开放神经网络交换(ONNX)格式

原文:https://towardsdatascience.com/integrating-scikit-learn-machine-learning-models-into-the-microsoft-net-7eaec29e8669?source=collection_archive---------28-----------------------

行业笔记

使用 ONNX 格式将经过培训的 Scikit-learn 销售线索评分预测模型部署到。网络生态系统

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由米格尔·Á拍摄。佩克斯公司的帕德里安

作为设计和开发 lead scoring 系统原型的团队的一员,我面临着将机器学习模型集成到围绕微软构建的目标环境中的挑战。网络生态系统。从技术上来说,我使用 Scikit-learn 机器学习内置算法实现了领先得分预测模型,用于回归,更准确地说是逻辑回归。考虑到初始数据分析、数据预处理、探索性数据分析(EDA)以及模型构建本身的数据准备阶段,我使用了由 Anaconda 发行版支持的 Jupyter Notebook 环境进行 Python 科学计算。之前,我在 Flask 中研究和接触过 Python,它是用这种编程语言编写的一个微型 web 框架。然而,我的目标是将 Python 编写的机器学习模型集成或部署到。NET 生态系统,使用 C#编程语言Visual Studio IDE

*注意:本文中给出的源代码仅用于演示目的——简化到强调核心概念、库和转换解决方案的程度。

什么是销售线索评分?

销售线索评分代表一种共享的销售和营销方法,用于对销售线索进行排名,以描述他们对公司的销售准备程度的潜力。这是一种为公司的销售线索数据库分配不同值的技术,通过转换为“热门线索”和官方客户来指导营销和销售团队。从战略角度来看,销售线索评分被认为是调整公司战略、提高销售团队绩效和效率的重要过程。

为什么这个故事里有 ML?

通常,数字营销、销售线索挖掘和销售团队会生成大量销售线索数据,这些数据通常以预定的结构化格式存储在单个或多个平台上。由于数据是即将到来的数字时代的新石油,公司如何处理和分析数据至关重要。然而,假设人类的专业知识足以检索有价值的数据洞察,那么将需要许多团队和人员。但是,即使这是完全正确的,它也只是一种可持续的模式,只适用于拥有丰富经验和资深数字营销、销售和商业分析背景的大型企业。

另一方面,机器学习方法在提到“大数据”这个热门术语后自然会立即出现。总的来说,机器学习算法不会取代人力资源,而是作为一种补充工具,改善和提高线索转化的过程和速度。利用数据背后的数学和统计学,机器学习可以打开视野,并“捕捉”人类肉眼目前无法“看到”的其他深入见解和结论。在有监督的机器学习领域,采用线索评分作为用例是值得一提的。我们可以使用生成数据的完整历史(作为监督学习方法的先决条件的标记数据集)。

图片中的 ONNX

在开发了用于销售线索评分的机器学习回归器之后,我开始研究将其集成到。NET 世界,用 C#编程语言访问它。不管目标环境是什么,这都是一个广泛讨论的话题,目标环境可以是 Keras、TensorFlow 或 Java 中的模型部署。总的来说,我不认为这是一个问题,而更像是一个解决系统互操作性、集成简单性和维护的挑战。归根结底,这是部署策略的复杂性。因此,我们的挑战是缩小在 Python 和 Scikit-learn 中进行数据分析和科学研究的技术“差距”,同时有机会将模型直接用作目标系统基础架构的一部分,该模型用 C#编写,并受。NET 核心框架。

开放神经网络交换(ONNX) 是代表机器学习模型的开放文件格式标准。按照设计,它完全作为一个框架无关的标准来实现,这意味着它是作为一个提供独特格式互操作性的解决方案来构建的。我使用 ONNX 标准来转换和存储机器学习模型。此外,我还使用了 ONNX 运行时,这是一个跨平台的高性能引擎,提供了一组不同的 API,在我们的例子中,用于工作和集成到不同的目标环境。NET 核心框架与 C#。

数据集概述

为了构建线索评分原型的初始版本,我决定使用在 Kaggle 上公开的线索评分数据集案例研究。数据集由名为 X Education 的公司的营销/销售团队检索的历史数据组成。总的来说,该公司是一个在线学习平台的模型,许多专业人士/学生可以在这里找到兴趣并参与一门或多门课程。数据是使用不同的来源生成的,如网页、登录页面、表单等。由于联系对特定学习领域感兴趣的候选人的过程,还另外开发了填充有数据的字段。

初始数据集涵盖 9.240 条独特的记录组织在 37 个不同的列中,包括用于独特前景识别的字段。数据分析、EDA 过程以及数据预处理和准备超出了本文的范围,因此我将直接介绍在不同工作环境之间部署机器学习模型的实用方法。

构建 ONNX 模型

我将简要介绍机器学习模型构建的核心方面,作为创建 ONNX 模型的先决条件。为此,我使用来自sk learn . model _ selection的标准拆分过程,将经过处理和优化的结果数据集划分为训练和测试子集。在这种情况下,我认为 30%的数据是测试数据

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

是时候做模型了。我使用 sklearn.linear_model 库创建并装配了一个逻辑回归机器学习模型(使用**‘liblinear’算法**对其进行配置,以解决优化问题)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

使用 Scikit-learn 的管道机制,我创建了一个简单的管道表单,包含数据缩放(从 sklearn.preprocessing 导入的标准缩放算法)和模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

此外,从另一个设计角度来看,如果只缩放数字属性(以调整零的公共平均值),这是有效的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

最后,我从sk learn . model _ selection中引用了cro _ val _ predict功能,并生成了明确配置**‘predict _ proba’估算器方法的交叉验证估算。这种评估方法确保获取成功的目标销售线索转化的概率** —事实上,解决了向每个潜在客户分配销售线索得分的挑战。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

*注意:模型验证、评估和性能调优的过程超出了本文的范围——它是机器学习设计的一部分。

一旦机器学习模型准备就绪,就该创建 ONNX 模型了。下面提到了应该导入的标准 ONNX 包。作为旁注,我想强调的是,只有当 skl2onnx 安装在开发环境上时,导入 ONNX 包才有效(这个模块可以使用**“pip install skl 2 ONNX”命令**安装)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

ONNX 模型的创建实际上意味着将 Scikit 学习模型转换成遵循 ONNX 格式的文件的过程。这是通过使用 convert_sklearn() 方法完成的,该方法采用之前创建的模型及其维度,在本例中是来自已处理数据集中的要素数量。在这个场景中,特征工程以及特征降维的过程产生了总共 19 个输入特征

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

最后一步是 ONNX 模型导出,在先前指定的系统位置/路径上序列化(声明文件扩展名为**‘ONNX’**)。

这里一个重要的信息是 ONNX 库目前支持的机器学习算法的 s et。可以使用以下命令生成版本以及所有集成算法的列表(图像预览显示了受支持算法的完整列表的一部分)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

因此,我总是建议在验证的上下文中检查列表,确认您正在使用受支持版本的算法来建立模型。这种检查应该在机器学习阶段进行,更准确地说是在算法选择阶段。值得一提的是,不属于 ONNX 包的任何其他算法也可以得到支持,但是适当的定制配置和调整超出了本文的范围。此外,还有一些众所周知的与软件包相关的限制,可以在官方文档页面中解决。

。网络核心集成

如前所述,将 sklearn 模型转换为 ONNX 模型是解决方案的第一部分,也是将 ONNX 模型导入的后续步骤的先决条件。网络生态系统。这可以使用微软的来完成。ML.OnnxRuntime Nuget 包。我决定使用 Microsoft Azure Function 模板来演示 ONNX 到。NET 以及下一节中描述的集成验证和测试。我已经创建了 Azure 函数,作为一个新项目,包含在一个面向。NET Core 3.1 框架版本。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

最初,我从 Http 请求中提取请求体,并将其反序列化为动态数据对象,这是一种在运行时检索类型的技术。然后,我使用了简单的方法来声明和初始化请求体中的每个变量。这里值得一提的是,变量的数量(请求体参数的数量)应该与 ONNX 模型创建时定义的输入特征的数量相同。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

之后,我定义了先前保存的 ONNX 模型的本地系统路径,并创建了创建输入特征列表和创建推理会话所需的输入张量。初始化会话后,就该运行它并以原始格式提取模型输出了。推理会话也可用于对 Jupyter 笔记本解决方案中已创建的 ONNX 模型进行预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

在会话执行之后,我已经将检索到的原始格式值解析为集合 DisposableNamedOnnxValue 对象,然后使用该集合将结果数组提取为 Dictionary < long、float>的形式。然后,字典结构用于提取转化销售线索的概率值**(销售线索评分结果)。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

集成验证

考虑到最初用 Python 和 Scikit-learn 设计和编写的线索评分模型现已成功集成,我将使用 Postman API 平台测试和验证完整的场景。因为我使用 Microsoft Azure 函数模板包装了集成,所以我可以在我的开发机器上通过 HTTP 调用本地访问它,遵循之前配置的路径( url、端口和函数名绑定)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

利用 Visual Studio 集成调试器的优势,我深入研究了模型响应,研究了对象的结构和类型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

最后的话

在本文中,我展示了我们目前正在开发的线索评分原型的部分实际实现。基本上,它描述了解决从 Python 和 Scikit 转换和部署 ML 模型挑战的技术方法——了解不同的目标技术环境,在本例中是。网络生态系统。利用 ONNX 格式的优势,我演示了最简单的形式构建 ONNX 模型,并使用格式灵活性将其作为目标环境源代码的结构部分。除了这种方法正在弥合不同数据科学和应用程序开发平台之间的技术差异之外,它还提供了将已经设计好的模型与 ML.NET 的优势相集成的机会。网)。此外,ONNX NuGet 包和实现方法也可用于将 Scikit-learn 模型集成到 Web API 解决方案中。

更多应用

除了构建销售线索评分系统,我们还成功创建了一个销售线索决策原型,该原型遵循类似的模式,除了机器学习算法选择之外。到目前为止,我已经使用随机森林分类器开发了一个线索决策集成模块。它也是 ONNX 包支持的算法列表的一部分。因此,从业务角度来看,我们提供了根据历史和当前数据做出销售线索决策的机会。

此外,在进行探索性数据分析并涵盖设计和构建 ML 模型的过程时,我们正在提供和生成有益于未来应收集和跟踪的数据的优选类型和格式的数据见解和知识这种全面的数据分析之后是模型的解释过程,通常提供特征和相关性重要性的其他有价值的方面

— — — — — — — — — — — —

感谢您阅读内容,我坚信这些内容清晰、详细且有帮助。

我目前的重点和专业知识与企业 web 开发和架构中的最新和前沿技术优势有关,特别是微软。网络生态系统。此外,我喜欢从事数据科学、生物信息学和数字营销/销售线索挖掘中的机器学习应用。所以,如果你能花时间评论、支持和分享这篇文章,我将非常感激。

最初发表于【https://www.linkedin.com】

用胶水粘合雪花

原文:https://towardsdatascience.com/integrating-snowflake-with-glue-c00a1e25335c?source=collection_archive---------12-----------------------

将两个系统结合在一起可能很棘手,但是您获得的数据洞察力是值得的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

米凯拉·帕兰特在 Unsplash 上的照片

雪花是一个优秀的现代数据库,它将传统 SQL 的强大功能与现代数据湖架构相结合。AWS Glue 是内置于 AWS 无服务器生态系统中的本地 ETL 环境。它们共同构成了构建现代数据湖的强大组合。

本文将详细介绍如何创建一个胶合工作来将 120 年的奥运奖牌数据加载到雪花数据库中,以确定哪个国家拥有最好的击剑手。

将您的雪花凭据集成到 Secrets Manager 中

AWS 提供了一个名为 Secrets Manager 的实用程序来存储密码,它有几个特性,包括自动密码轮换,这使它非常适合安全存储。

利用 Secrets Manager 的最佳方式是使用多因素身份验证来存储您的雪花凭据。

打开秘密管理器,添加你的雪花用户证书。填写管理器中的所有必填字段,并存储密码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

雪花连接参数(按作者)

填写雪花连接信息

记录秘密 ID,并将其添加到云形成文件中的 AWS::IAM::Role 规范中。使用环境变量来存储机密名称。不用担心;我们将使用 AWS 角色来明确限制对粘合作业的秘密访问。

- PolicyName: "AllowSecretsManager"
  PolicyDocument:
    Version: "2012-10-17"
    Statement:
      - Effect: "Allow"
        Action: [
            "secretsmanager:GetSecretValue",
            "secretsmanager:DescribeSecret"
        ]
        Resource: [
            !Sub "arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:${SecretName}*"

该策略将允许您的胶合作业连接到雪花以执行操作。

创造一个舞台

复制需要连接到 AWS 中 S3 存储桶的阶段。按照雪花法创建一个阶段。最佳实践是为您的 S3 存储区创建一个存储集成,然后为应用程序或客户创建多个存储集成阶段。你可以使用 SNOWSQL 和变量替换来实现自动化。

!set variable_substitution=true;
create or replace stage &{database}.stage.OLYMPICS
storage_integration = &{storage_integration}
url = '&{S3DataHome}/stage/olympics/';

在雪花中创建一个表来包含数据

我们将创建一个表来包含公共数据集,该数据集包含按运动员、运动和他们所代表的国家分类的运动员成绩。下表列出了每个数据仓库表应该包含的数据集列和标准列(以粗体突出显示)。

CREATE OR REPLACE TABLE STAGE.OLYMPICS_ATHELETE_EVENT
(
 **FILE_LOAD_ID     INTEGER identity (1,1),
    FILE_NAME         VARCHAR,
    FILE_ROW_NUMBER         INTEGER,**
    ID             VARCHAR(100) NOT NULL,
    NAME           VARCHAR(100) NOT NULL,
    SEX            VARCHAR(100) NOT NULL,
    AGE            VARCHAR(100) NOT NULL,
    HEIGHT         VARCHAR(100) NOT NULL,
    WEIGHT         VARCHAR(100) NOT NULL,
    TEAM           VARCHAR(100) NOT NULL,
    NOC            VARCHAR(100) NOT NULL,
    GAMES          VARCHAR(100) NOT NULL,
    YEAR           VARCHAR(100) NOT NULL,
    SEASON         VARCHAR(100) NOT NULL,
    CITY           VARCHAR(100) NOT NULL,
    SPORT          VARCHAR(100) NOT NULL,
    EVENT          VARCHAR(100) NOT NULL,
    MEDAL          VARCHAR(100) NOT NULL,
 **DW_CREATE_DATE TIMESTAMPTZ           DEFAULT CURRENT_TIMESTAMP(),
    DW_CREATE_USER VARCHAR      NOT NULL DEFAULT CURRENT_USER(),
    DW_UPDATE_DATE TIMESTAMPTZ           DEFAULT CURRENT_TIMESTAMP(),
    DW_UPDATE_USER VARCHAR      NOT NULL DEFAULT CURRENT_USER()**
);

创建一个 COPY 语句来从 S3 加载数据

Snowflake 中的 COPY 语句是从数据仓库导入和导出数据的强大方法。它将加载任何新的数据文件,并忽略以前加载的文件。利用拷贝是管理仓库的一种简单而有效的方法。

copy into STAGE.OLYMPICS_ATHELETE_EVENT (FILE_NAME,
                                         FILE_ROW_NUMBER,
                                         ID,
                                         NAME,
                                         SEX,
                                         AGE,
                                         HEIGHT,
                                         WEIGHT,
                                         TEAM,
                                         NOC,
                                         GAMES,
                                         YEAR,
                                         SEASON,
                                         CITY,
                                         SPORT,
                                         EVENT,
                                         MEDAL)
    from (
        select METADATA$FILENAME        file_name,
               METADATA$FILE_ROW_NUMBER row_number,
               t.$1,
               t.$2,
               t.$3,
               t.$4,
               t.$5,
               t.$6,
               t.$7,
               t.$8,
               t.$9,
               t.$10,
               t.$11,
               t.$12,
               t.$13,
               t.$14,
               t.$15
        from @stage.OLYMPICS t
    )
    pattern = '.*athlete_events.csv.gz'
    on_error = CONTINUE
    force = false
    file_format = (field_optionally_enclosed_by = '"'
        type = 'csv'
        compression = GZIP
        field_delimiter = ','
        skip_header = 1);

云的形成脚本

自动气象站的基础是云的形成。基本云形成文件包含参数部分、角色部分和组件部分。上面的组件部分包含了本文前面的 Secrets Manager 片段。

AWSTemplateFormatVersion: "2010-09-09"
Description: >
  This Template Configures a Job to Load Event Data into a Snowflake Table using GlueParameters:
  JobName:
    Type: String
    Description: "The Glue Job name used for the Stack and tags in the Snowflake query" JobSql:
    Type: String
    Description: "A SQL COPY function to load the data into Snowflake." S3DataHome:
    Type: String
    MinLength: "1"
    Description: "The S3 Bucket Containing the Data Lake Data" SecretName:
    Type: String
    Description: "The secret containing the Snowflake login information"Resources:
  SnowflakeGlueJobRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - glue.amazonaws.com
            Action:
              - sts:AssumeRole
      Policies:
        - PolicyName: root
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - "s3:GetObject"
                  - "s3:PutObject"
                  - "s3:ListBucket"
                  - "s3:DeleteObject"
                Resource:
                  - !Sub "arn:aws:s3:::${S3DataHome}"
                  - !Sub "arn:aws:s3:::${S3DataHome}/*" - PolicyName: "AllowSecretsManager"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: "Allow"
                Action: [
                    "secretsmanager:GetSecretValue",
                    "secretsmanager:DescribeSecret"
                ]
                Resource: [
                    !Sub "arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:${SecretName}*"
                ] ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole
      Path: "/" LoadOlympicData:
    Type: AWS::Glue::Job
    Properties:
      Command:
        Name: pythonshell
        PythonVersion: 3
        ScriptLocation: !Sub "s3://${S3DataHome}/src/etl-scripts/copy_to_snowflake.py"
      GlueVersion: 1.0
      DefaultArguments:
        "--job-bookmark-option": "job-bookmark-enable"
        "--job-language": "python"
        "--extra-py-files": !Sub "s3://${S3DataHome}/lib/snowflake_connector_python-2.4.2-cp37-cp37m-manylinux2014_x86_64.whl"
        "--RegionName": !Sub "${AWS::Region}"
        "--SecretName": !Ref SecretName
        "--JobName": !Ref JobName
        "--JobBucket": !Ref S3DataHome
        "--JobSql": !Ref JobSql
      ExecutionProperty:
        MaxConcurrentRuns: 2
      MaxRetries: 0
      Name: snowflake-load-olympic-data
      Role: !Ref SnowflakeGlueJobRole

在 Docker 中创建雪花 Python 轮

仔细记下带有雪花连接器库的行。由于雪花不是 AWS 的原生产品,您需要提供一个带有雪花 Python 库编译的二进制文件的 Wheel 文件。使用 docker 或带有 AWS AMI 的 EC2 实例来创建 wheel 文件。

这是 docker 文件。

python3.7 -m venv wheel-env
source wheel-env/bin/activate
pip install --upgrade pip
cat "snowflake-connector-python" > requirements.txt
for f in $(cat ../requirements.txt); do pip wheel $f -w ../wheelhouse; done
cd wheelhouse/
INDEXFILE="<html><head><title>Links</title></head><body><h1>Links</h1>"
for f in *.whl; do INDEXFILE+="<a href='$f'>$f</a><br>"; done
INDEXFILE+="</body></html>"
echo "$INDEXFILE" > index.html
cd ..
deactivate
rm -rf cache wheel-env
aws s3 sync wheelhouse s3://${S3DataHome}/lib/

创建 Python 脚本

粘合作业需要一个 Python 脚本。

ScriptLocation: !Sub "s3://${S3DataHome}/src/etl-scripts/copy_to_snowflake.py"

该脚本相当通用,并且需要一个 SQL 文件来执行,以便于重用。

import sysimport boto3
import jsonfrom botocore.exceptions import ClientError
from awsglue.utils import getResolvedOptionsimport snowflake.connector def get_secret_json(session, secret_name, region_name): client = session.client(
        service_name='secretsmanager',
        region_name=region_name
    ) secret = None
    get_secret_value_response = None try:
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )
    except ClientError as e:
            raise e
    else:
        if 'SecretString' in get_secret_value_response:
            secret = get_secret_value_response['SecretString'] return json.loads(secret) def connect(user, password, account, database, warehouse, session_parameters=None):
    *"""*
 *Connect to Snowflake*
 *"""*
return snowflake.connector.connect(
        user=user,
        password=password,
        account=account,
        database=database,
        warehouse=warehouse,
        session_parameters=session_parameters
    ) def read_sql(session, bucket, filename):
    s3_client = session.client("s3")
    s3_object = s3_client.get_object(Bucket=bucket, Key=filename)
    return s3_object['Body'].read().decode("utf-8") def main():
    # Create a Secrets Manager client
    session = boto3.session.Session() args = getResolvedOptions(sys.argv, ['JobName', 'RegionName', 'SecretName', 'JobBucket', 'JobSql']) json_secret = get_secret_json(session, args["SecretName"], args["RegionName"]) sql = read_sql(session=session, bucket=args["JobBucket"], filename=args["JobSql"]) with connect(
            user=json_secret['USERNAME'],
            password=json_secret['PASSWORD'],
            account=json_secret['ACCOUNT'],
            database=json_secret['DB'],
            warehouse=json_secret['WAREHOUSE'],
            session_parameters={
                'QUERY_TAG': args["JobName"]
            }) as con:
        cs = con.cursor() result_cs = cs.execute(sql) result_row = result_cs.fetchone() print(result_row) if __name__ == "__main__":
    main()

使用云形成脚本创建粘合作业

下面是 Makefile 表单,用于执行云形成脚本来创建粘合作业。

package-job:
   aws cloudformation package \
      --template-file resources/glue/snowflake-glue-load-history.yaml \
             --s3-bucket ${S3_DEPLOYMENT_BUCKET} \
       --output-template-file build/snowflake-glue-load-history.yamldeploy-job: package-job
   aws cloudformation deploy \
      --template-file build/snowflake-glue-load-history.yaml \
      --parameter-overrides S3DataHome=${S3_DATA_BUCKET} \
         SecretName="${SECRET_NAME}" JobName=${LOAD_OLYMPICS_DATA_JOB} \
         JobSql=${SQL_COPY_OLYMPIC_DATA} \
       --stack-name ${LOAD_OLYMPICS_DATA_JOB} \
       --capabilities CAPABILITY_IAM

执行粘合作业(或对其进行调度)

您可以在 AWS 控制台中运行和执行 Glue 作业。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

胶水控制台(作者)

胶合过程的成本是每 DPU 小时 0.44 美元,每秒计费,最少 1 分钟,因此它在价格上非常有竞争力,即使是运行在 EC2 实例上的免费 ETL 工具。

检查结果

现在有趣的部分—运行查询来检查您的数据。

select TEAM,
       sum(case when MEDAL='Gold' then 1 else 0 end) GOLD_MEDALS,
sum(case when MEDAL='Silver' then 1 else 0 end) SILVER_MEDALS,
sum(case when MEDAL='Bronze' then 1 else 0 end) BRONZE_MEDALS
from stage.OLYMPICS_ATHELETE_EVENT
where medal in ('Gold', 'Silver', 'Bronze')
 and sport = 'Fencing'
    group by team
order by sum(case when MEDAL='Gold' then 1 else 0 end) desc,
         sum(case when MEDAL='Silver' then 1 else 0 end) desc,
         sum(case when MEDAL='Bronze' then 1 else 0 end) desc;

那么谁的剑术最好呢?当然是意大利。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论

加载数据是一项棘手的技术工作,尤其是在桥接两个系统时,比如 AWS 和雪花。然而,结果——从数据中获得的洞察力将使它变得值得。从这篇文章中吸取这些教训:

  1. 将您的凭证保护到您的雪花数据库
  2. 借力雪花舞台AWS S3 整合
  3. 使用云形成来集成 AWS 服务
  4. 扩展 Glue Python 作业以自动加载雪花中的数据
  5. 通过使用 SQL 查询提出有趣的问题,让数据自己说话

快乐数据分析!

(使)融入🤗带 MedCAT 的变压器,用于生物医学 NER+L

原文:https://towardsdatascience.com/integrating-transformers-with-medcat-for-biomedical-ner-l-8869c76762a?source=collection_archive---------26-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Irwan iweUnsplash 拍摄的照片

生物医学 NER+L 致力于从电子健康记录(EHRs)中的自由文本中提取概念,并将它们链接到大型生物医学数据库,如 SNOMED-CT 和 UMLS。

医学概念注释工具包(MedCAT)使用基于 Word2Vec 的浅层神经网络来检测和消除生物医学概念的歧义。这种方法给了我们:1)无监督训练;2)检测数百万个独特概念的可能性;3)训练速度快,资源要求低;4)仅从正面例子中学习的能力;

对于一些我们有足够训练样本的用例,基于变压器(如 BERT)的监督学习方法可能更合适。

在这项工作中,我们展示了如何整合🤗使用 MedCAT 的数据集/转换器,或者更准确地说,我们展示了如何将 MedCATtrainer 导出(手动注释的项目)转换为🤗数据集和训练 a🤗变压器型号。

先决条件:

随附的 Jupyter 笔记本可以在 MedCAT 资源库中找到。

数据准备

MedCATtrainer 用于手动注释任何生物医学概念的自由文本文档(例如 SNOMEDUMLS )。注释过程完成后,项目可以以如下所示的.json格式导出(有限视图):

{'projects': [{'name': '<something>', 
               'documents': [{'text': '<some text>', 
                              'annotations': [{'start': 23,
                                               'end': 32,
                                               'cui': <label>},
                                              ...]}]}]}

简化对一个🤗Transformer 模型,我们将 JSON 输出转换成🤗数据集。我们只保留 JSON 中的重要特性,而丢弃其他特性:

features=datasets.Features(
{
"id": datasets.Value("int32"),
"text": datasets.Value("string"),
"ent_starts": datasets.Sequence(datasets.Value("int32")),
"ent_ends": datasets.Sequence(datasets.Value("int32")),
"ent_cuis": datasets.Sequence(datasets.Value("string")),
}),

这里,id是文档的 ID,text是文档的文本,ent_starts是文档中所有被手工注释的实体的起始字符的位置列表,ent_ends是结束字符的位置,ent_cuis是标签。请注意,MedCATtrainer 使用在线学习,虽然用户能够创建新实体,但大多数实体都由 MedCAT 预先注释,并由用户简单验证(正确/不正确)。因此,当在 dataset 类中生成示例时,我们只保留correct示例和那些由用户添加的manually_created示例,换句话说:

for entity in document['annotations']:
    if entity.get('correct', True) or entity.get('manually_created', False):
        # Use the annotation
        ...

加载.json文件现在很简单:

import os
import datasets
from medcat.datasets import medcat_nerDATA_PATH = '<path to my .json export from medcattrainer>'
dataset=datasets.load_dataset(os.path.abspath(medcat_ner.__file__), 
                              data_files=DATA_PATH, 
                              split=datasets.Split.TRAIN)

一旦数据集被加载,我们需要把它转换成正确的格式🤗变形金刚模型。也就是说,对文本进行标记并分配标签。我们写了一个包装器🤗tokenizers,这将照顾一切:

from medcat.datasets.tokenizer_ner import TokenizerNER
from transformers import AutoTokenizerhf_tokenizer = AutoTokenizer.from_pretrained('<name>')
id2type = {}
for i in range(hf_tokenizer.vocab_size):
    id2type[i] = 'sub' if hf_tokenizer.convert_ids_to_tokens(i).startswith("##") else 'start'
tokenizer = TokenizerNER(hf_tokenizer, id2type=id2type)

使用新的标记器,我们可以将数据集转换成所需的格式:

encoded_dataset = dataset.map(
 lambda examples: tokenizer.encode(examples, ignore_subwords=True),
 batched=True,
 remove_columns=['ent_cuis', 'ent_ends', 'ent_starts', 'text'])

数据集现在看起来像这样:

Dataset({
    features: ['id', 'input_ids', 'labels'],
    num_rows: 4935
})

培训 a🤗变形金刚模型

如果我们的用例具有相对较少数量的独特概念(不是几十个,几千个),我们可以使用来自🤗使用 TokenClassification 头:

# It is important to set the num_labels, which is the number of unique conceptsmodel = AutoModelForTokenClassification.from_pretrained("emilyalsentzer/Bio_ClinicalBERT", num_labels=len(tokenizer.label_map))

为了对数据进行批处理并填充到需要的地方,我们使用了来自MedCAT.datasetsCollateAndPadNER,对于metrics,我们编写了一个简单的函数来打印令牌分类报告。现在一切都准备好了,我们从🤗并运行培训:

trainer = Trainer(
    model=model,                         
    args=training_args,                 
    train_dataset=encoded_dataset['train'],       
    eval_dataset=encoded_dataset['test'],     
    compute_metrics=metrics,
    data_collator=collate_fn,
    tokenizer=None # We've tokenized earlier
)
trainer.train()

结果

我们在 MedMentions (MM)上测试性能,因为它是一个相当完整的数据集,有大量的注释(它并不完美,因为注释者有一些分歧,但它已经足够好了)。

该模型在三个不同版本的 MM 上进行测试:1)整个数据集;2)只有频率在 300 以上的概念;3)只有 1000 以上的频率。

完整的 MM 数据集(测试集中的 13069 个概念)

BERT 最糟糕的用例,大量的概念,其中大多数有<10 occurrences. As it can be seen BERT cannot handle this use-case at all — at least not in this form. All scores are macro averaged.

  • MedCAT (unsupervised): F1=0.67, P=0.80, R=0.69
  • BERT: F1=0.0, R=0.01, P=0.0

Only concepts with frequency > 300 个(测试集中有 107 个概念)

第一个用例在医疗保健领域是相当标准的,大量的概念带有不同数量的注释。稍微不太标准的是,我们已经为每个概念添加了不少注释。有趣的是表演几乎是一样的。

  • MedCAT(监督):P=0.50,R=0.44,F1=0.43
  • 伯特:P=0.47,R=0.46,F1=0.43

仅频率> 1000 的概念(测试集中有 12 个概念)

这个用例应该最适合 BERT,因为我们只关注具有大量训练数据的概念。像这样的用例非常罕见,这一个有点特殊,因为出现这么多次的概念主要是定性概念——它们非常多样(许多不同的术语属于同一个概念),更适合类似 BERT 的模型。

  • MedCAT(受监督):F1=0.34,P=0.24,R=0.70
  • 伯特:F1=0.59,P=0.60,R=0.59

结论

生物医学 NER+1 是一项艰巨的任务,就像其他任何事情一样,一个模型并不适合所有情况。我们表明,对于具有有限数量的训练样本或相对较低的术语方差的用例,基于 Word2Vec 的浅层神经网络是更好的选择。但是,如果我们有大量的训练样本和较高的长期方差,基于 BERT 的模型表现更好。

最后,这两种方法现在都是 MedCAT 的一部分。

集成 Trino 和 Apache Ranger

原文:https://towardsdatascience.com/integrating-trino-and-apache-ranger-b808f6b96ad8?source=collection_archive---------6-----------------------

了解如何为数据安全配置 Apache Ranger 和 Trino。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由飞:D的 Unsplash

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者创作,灵感来自分别为 Trino 和 Apache Software Foundation 商标的徽标

第一部分:概念和想法

背景

随着对数据需求的日益增长,企业对数据安全性的要求也在不断提高。在 Hadoop 生态系统中,Apache Ranger 是一个很有前途的数据安全框架,拥有大量插件,如 HDFS、Solr、Yarn、Kafka、Hive 等。 Apache Ranger 在版本 2.1.0 中为 prestosql 添加了一个插件,但最近 PrestoSQL 被更名为 Trino ,这破坏了 Apache Ranger 的 PrestoSQL 插件。

我已经提交了这个问题的补丁,这里已经有一个公开的 JIRA 问题但是这不会阻止我们将 Trino 与 Apache Ranger 集成。对于本教程,我已经用 Trino 插件构建了 Apache Ranger 2.1.0。如果你想从包括 trino 插件的源代码中构建 Apache Ranger,你可以参考分支ranger-2.1.0-trino上的这个 GitHub 库,出于本教程的目的,我们将这个 Github 库。

更新时间:2022 年 5 月 20 日

Trino 插件现已在 ranger 资源库中正式发布,发布于 Apache Ranger-2.3https://github.com/apache/ranger/tree/ranger-2.3

组件和关键思想介绍

阿帕奇游侠有三个关键部件ranger-adminranger-usersyncranger-audit。让我们了解一下这些组件。

注意: 配置 *ranger-usersync* 超出了本教程的范围,我们不会在本教程中使用任何 *usersync* 组件。

管理员管理

Ranger 管理组件是一个 UI 组件,使用它我们可以为不同的访问级别创建策略。Ranger Admin 需要一个后端数据库,在我们的例子中,我们使用 Postgres 作为 Ranger Admin UI 的后端数据库。

管理员审计

Ranger 审计组件收集并显示资源的每个访问事件的日志。Ranger 支持两种审计方式,solrelasticsearch。我们将使用elasticsearch来存储 ranger 审计日志,这些日志也将显示在 Ranger 审计 UI 中。

特里诺

Trino 是一个快速分布式查询引擎。可以连接多个数据源,如hivepostgresoracle等。你可以在官方文档这里阅读更多关于 Trino 和 Trino 连接器的信息。对于本教程,我们将使用默认目录tpch,它带有虚拟数据。

trino-Ranger-插件

阿帕奇游侠支持许多插件,如 HDFS,蜂巢,纱线,特里诺等。每个插件都需要在运行该进程的主机上进行配置。Trino-Ranger-Plugin 是一个组件,它将与 Ranger Admin 通信,以检查和下载访问策略,然后这些策略将与 Trino 服务器同步。下载的策略作为 JSON 文件存储在 Trino 服务器上,可以在路径/etc/ranger/<service-name>/policycache下找到,因此在这种情况下,策略路径是/etc/ranger/trino/policycache

下图解释了上述组件之间的通信。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

docker-compose 文件连接了上述所有组件。

关于docker-compose.yml的要点

  1. 我们已经使用named-docker-volumes ex: ranger-es-dataranger-pg-data来持久化诸如 elasticsearch 和 postgres 等服务的数据,即使在容器重启之后
  2. Ranger-Admin 和 Ranger-Trino 插件的预构建 tar 文件可作为发布资产在这个演示存储库这里获得。
  3. ranger-Admin 进程需要至少 1.5 GB 的内存。Ranger-Admin tar 文件包含install.propertiessetup.shsetup.sh脚本从install.properties读取配置。以下补丁文件描述了与 Ranger-Admin 组件的默认版本install.properties相比,对install.properties所做的配置更改。

4.Ranger-Trino-Plugin tar 文件也包含了install.propertiesenable-trino-plugin.sh脚本。关于 trino docker 环境需要注意的重要一点是,配置文件和插件目录被配置到不同的目录位置。配置是从/etc/trino读取的,而插件是从/usr/lib/trino/plugins加载的。这两个目录在为 Trino-Ranger-Plugin 配置install.properties时非常重要,因此需要对 Trino-Ranger-Plugin tar 文件附带的默认脚本enable-trino-plugin.sh进行一些额外的定制,以使其能够与 dockerized Trino 一起工作。这些更改在下面的修补程序文件中突出显示。基本上,这些变化引入了两个新的自定义变量INSTALL_ENVCOMPONENT_PLUGIN_DIR_NAME,它们可以在install.properties中进行配置

5.install.propertiesTrino Ranger 插件的文件需要按照以下补丁文件所示进行配置。请注意,我们使用两个新引入的自定义变量来通知enable-plugin-scriptTrino 已经部署在 docker 环境中。

6.最后,如下图所示,将它们放在docker-compose.yml中。这个文件也可以在 Github 库这里获得。

第二部分:设置和初始化

在这一部分中,我们将部署 docker-compose 服务并确认每个组件的状态。

步骤 1:克隆存储库

git clone [https://github.com/aakashnand/trino-ranger-demo.git](https://github.com/aakashnand/trino-ranger-demo.git)

步骤 2:部署 docker-compose

$ cd trino-ranger-demo
$ docker-compose up -d

一旦我们使用 docker-compose 部署服务,我们应该能够看到四个正在运行的服务。我们可以通过docker-compose ps来证实这一点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 3:确认服务

让我们确认 Trino 和 Ranger-Admin 服务在以下 URL 上是可访问的

游侠管理员: http://localhost:6080

崔诺: http://localhost:8080

elastic search:http://localhost:9200

步骤 4:从 Ranger-Admin 创建 Trino 服务

让我们访问 Ranger-Admin 用户界面,并作为admin用户登录。我们在上面的ranger-admin-install.properties文件中配置了我们的管理员用户密码rangeradmin1。正如我们在下面的截图中看到的,默认情况下,没有trino服务。因此,让我们创建一个名为trino的服务。服务名应该与在 **install.properties** 中为 Ranger-Admin 定义的名称相匹配

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

请注意 JDBC 字符串中的主机名。从 **ranger-admin** 容器 trino 可到达 **my-localhost-trino** ,因此主机名被配置为 **my-localhost-trino**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我们点击测试连接,我们将得到如下所示的连接失败错误。这是因为 Ranger-Admin 进程已经在运行,并且仍在寻找我们尚未创建的名为trino的服务。一旦我们点击Add,它将被创建。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,让我们添加trino服务,然后再次单击Test Connection

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在 Ranger-Admin 成功连接到 Trino🎉

步骤 5:确认 Ranger 审计日志

要检查审计日志,从顶部导航栏导航至审计,并点击Audit。我们可以看到显示了审计日志🎉。Ranger-Admin 和 Elasticsearch 工作正常。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第三部分看到它在行动

现在我们已经完成了设置,是时候创建实际的访问策略并查看它的运行情况了

  • 当创建trino服务时,我们在连接信息中使用ranger-admin作为用户名。这会使用该用户名创建默认策略,因此ranger-admin用户将拥有超级权限

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了理解访问场景并创建访问策略,我们需要创建一个测试用户。Ranger usersync 服务将各种来源(如 Unix、文件或 AD/LDAP)的用户、组和组成员身份同步到 Ranger 中。Ranger usersync 提供了一组丰富而灵活的配置属性,用于同步来自 AD/LDAP 的用户、组和组成员,支持多种使用情形。在本教程中,我们将从 Ranger-Admin UI 手动创建一个测试用户。

步骤 1:从 Ranger-Admin 创建test-user

要创建用户,我们导航至设置→用户/组/角色→添加新用户

创建用户时,我们可以选择不同的角色。

  • user角色是普通用户
  • Admin角色可以从 Ranger Admin UI 创建和管理策略。
  • Auditor角色是read-only用户角色。

现在,让我们创建一个角色为Admin的用户。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 2:确认进入test-user和 r anger-admin

让我们确认用户的访问权限ranger-admin

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如我们看到的ranger-admin用户可以访问模式tpch.sf10下的所有表

由于我们没有为test-user配置任何策略,如果我们试图访问任何目录或执行任何查询,我们应该会看到一条访问被拒绝消息。让我们通过从 Trino CLI 执行查询来确认这一点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 3:允许访问模式tpch.sf10下的所有表test-user

让我们创建一个允许test-user访问tpch.sf10所有表的策略。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们还可以为每个策略分配特定的权限,但是现在让我们创建一个具有所有权限的策略。创建此策略后,我们有以下活动策略。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在让我们再次确认访问。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们仍然收到拒绝访问的消息。这是因为需要为每个对象级别配置 Trino ranger 策略。例如,catalog级策略,catalog+schema级策略,catalog+schema+table 级策略, information_schema级策略。让我们为catalog级别添加策略。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们用 Trino CLI 再次确认

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们仍然得到错误,但错误信息不同。让我们转到 Ranger 审计部分,了解更多相关信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到一个拒绝对名为tpch.information_schema.tables.table_schema的资源进行访问的条目。在 Trino 中,information_schema是包含关于表和表列的元数据的模式。因此也有必要为information_schema添加策略。任何用户都需要访问information_schema才能在 Trino 中执行查询,因此,我们可以在 Ranger 策略中使用{USER}变量,将访问权限授予所有用户。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们再次从 Trino CLI 确认访问。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我们试图执行任何 SQL 函数,我们仍然会得到拒绝访问的消息。在默认策略部分,all-functions策略(ID:3)是允许 access 执行任何 SQL 函数的策略。因为执行 SQL 函数是所有用户的要求,所以让我们编辑all-functions策略(ID:3)并使用{USER}变量添加所有用户来访问函数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总而言之,为了访问sf10下的test-user所有表,我们添加了三个新策略,并编辑了默认的all-function策略。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在我们可以访问和执行针对sf10模式的所有表的查询。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在下一步中,让我们了解如何为模式sf10下的特定表提供对test-user的访问

步骤 4:授予对sf10模式下特定表的访问权

在上一步中,我们配置了策略来访问sf10模式下的所有表,因此,schema-level策略是不必要的。为了访问特定的模式,我们需要添加schema-level策略,然后我们可以配置table-level策略。所以让我们为tpch.sf10增加schema-level一项政策

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在让我们将sf10-all-tables-policy从所有表格编辑到特定表格。我们将配置一个策略,只允许访问nation

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后,我们有以下积极的政策

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在让我们再次从 Trino CLI 对test-user执行查询。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

test-user现在可以根据需要从tpch.sf10模式中访问唯一的nation表。

如果你已经完成了所有的步骤,那么恭喜你,㊗️,现在你已经了解了如何配置 Trino 和 Apache Ranger。

第三部分:关键要点和结论

  • 从 PrestoSQL 更名为 Trino 后,Apache Ranger 的 GitHub 库中的默认插件将无法与新的 Trino 一起工作,因为它仍然引用旧的io.prestosql包。你可以在 JIRA 这里追踪这个问题
  • 更名的 Trino 插件将不会在新的 Ranger 版本 2.2.0 中提供。因此,与此同时,请随意使用这个 GitHub 库从源代码构建 Apache Ranger,使用这个 GitHub 库开始 Trino-Ranger 集成。
  • 为 Trino 配置 Ranger 策略并不那么直观,因为我们需要为每个级别配置访问策略。在 Trino 的知识库这里有一个关于这个的公开问题。
  • 尽管如此,建议配置一些基本策略,如带有{USER}变量的information_schemaall-functions,因为这些策略对于任何用户执行查询都是必需的。

由于缺乏好的文档和集成过程不太直观,集成 Apache Ranger 和 Trino 可能会很痛苦,但我希望这篇文章能让它变得简单一点。如果你正在使用 Trino,我强烈推荐你加入 Trino 社区 Slack 进行更详细的讨论。感谢您的阅读。

将您的数据分析与 Google Workspace 和 Google 云存储相集成

原文:https://towardsdatascience.com/integrating-your-data-analysis-with-google-workspace-and-google-cloud-storage-f80649404bb0?source=collection_archive---------27-----------------------

如何使用 Python 从云中加载文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马文·迈耶在 Unsplash 上的照片

1.介绍

协作是当今成功的数据团队的关键因素之一。您的团队交流和共享信息的方式会对您公司的生产力产生重大影响。

不幸的是,大多数公司仍然依赖于通过电子邮件和其他通信平台共享 CSV 和 Excel 文件,这种做法损害了数据的一致性和安全性。

因此,使用正确的工具共享数据文件可以提高您的分析重现性,并帮助您的团队提高生产率。

本文的目标是介绍几种使用Google Workspace Google 云存储 的数据共享替代方案。

下面介绍的每个函数的教程和代码可以在我的 GitHub 库中找到。

2.谷歌云环境

谷歌是云资源和存储的主要提供商之一,也是面向各种终端用户的可访问解决方案。 Google Drive 和 Sheets 是 Google Workspace(前身为 GSuite) 的热门服务部分,也是处理表格数据和存储文件的主要工具之一。谷歌还通过其谷歌云平台(GCP)为企业提供云服务。云存储是一种用于存储文件的 GCP 服务(类似于 AWS S3)。

这些服务允许用户在涉及数据产品、分析和数据科学的项目中进行协作。因此,学习如何使用每个工具的正确特性可以帮助您的团队开发涉及数据共享的最佳实践。

3.加载公共文件

一些涉及数据的项目可能要求您公开您的数据集,以便其他人可以访问它。科学期刊、政府、非政府组织和许多其他机构可能需要提供对数据的开放访问,因此下面描述的工具是访问存储在 Google Sheets 或 Drive 中的开放数据的替代方法。

3.1.谷歌工作表

Google Sheets 是一个在线电子表格编辑器(类似于 Microsoft Excel ),允许用户处理表格数据。由于我们处理的大部分数据都是以表格的形式组织的,所以使用表格来组织和存储基本分析会非常方便。

要公开您的工作表文档,您需要点击共享>发布到 web

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来,选择一个工作表和文档类型为**逗号分隔值(。csv),**并复制创建的链接。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

函数read_public_sheets接收您刚刚创建的链接,并返回一个 Pandas 数据帧,这是将表格直接加载到 Jupyter 笔记本的一个很好的选择。

# Loading a Public Google Sheets as a Pandas Dataframe
sheet_url = '<url to a Google Sheets>'df_sheet_public = read_public_sheets(sheet_url)

3.2.Google Drive

Google Drive 是存储任何文件格式的绝佳存储解决方案。公开可用的数据集可以以不同的格式找到,如 csv、xlsx、json 或 parquet。要访问文件,请打开 Google Drive 文件夹,右键单击所需文件,单击获取链接,选择选项任何有链接的人,然后复制创建的链接。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

函数read_public_file_from_gdrive接收存储在 Google Drive 中的文件的复制 URL,并返回一个 Pandas Daframe(对于 csv 或 xlsx 文件)或一个字典(对于 json 文件)。

# Example on how to load a CSV file from Google Drive
link_to_csv = '<url to a Google Drive file>'df_public_csv = read_public_file_from_gdrive(
    link_to_csv,
    "csv"
)

4.加载私有文件

由于公司内部共享的大多数数据文件都是私有的,为了防止数据泄露,您还需要使用某种身份验证来访问这些文件。

在本节课中,我们将了解如何访问谷歌云服务来获取不公开的文件。

4.1.谷歌工作表

我们将使用gspreadPython 模块与 Google Sheets 进行交互。为了访问私人文件,首先,你需要定义你的凭证。请遵循官方文件上的说明。使用您的服务凭证下载 JSON 文件后,您还需要将服务帐户电子邮件添加到 Sheets 权限电子邮件列表 ( 共享>添加人员和组)。

要运行函数read_private_sheets,您需要将路径传递给您的credentials_json、您的sheet_url和目标worksheet(名称或索引)。

# Loading a private Google Sheets
gcloud_credentials = '<path to service credentials JSON>'
sheet_url = '<url to a Google Sheets>'df_private_sheet = read_private_sheets(gcloud_credentials, sheet_url, 0)

4.2.Google Drive

要从 Google Drive 访问私有文件,我们可以使用 PyDrive2 ,这是一个 Python 库,它简化了与 Google Drive API V2 的交互。函数read_private_file_from_gdrive能够读取 5 种不同的文件格式(csv、xlsx、parquet、json 或 txt),您只需提供到它的链接(file_url,与会话 3.2 中描述的链接相同。)、file_formatgoogle_auth(凭证)。要生成访问 Google Drive 上私人文件所需的凭证,请遵循 Pydrive2 文档中描述的步骤。

from pydrive2.auth import GoogleAuth
from gcloud_data_analysis_functions import read_private_file_from_gdrive# 1\. Authenticate using OAuth2.0
gauth = GoogleAuth()
gauth.LocalWebserverAuth()# 2\. Access a private parquet from a Google Drive
file_url_parquet = '<url to a Google Drive Parquet>'
df_parquet_gdrive = read_private_file_from_gdrive(file_url_parquet, "parquet", gauth)

当你在#1上运行代码时,如果成功生成了凭证,就会显示一个指向谷歌账户认证的链接。选择您的帐户并允许其访问服务。

#2上,你只需要通过gauth (Google Auth Object),带着文件链接和格式,就可以加载想要的内容了。

4.3.谷歌云存储

云存储是在企业环境中存储/共享数据的一个很好的解决方案,因为它提供了一种安全的方式来定义用户对文件的访问。因此,尽管您可能将文件夹定义为公共文件夹,但下面的示例将描述如何使用 GCP 凭证加载私有文件。要创建一个 [gcp_credentials](https://developers.google.com/identity/protocols/oauth2?hl=en) json,请跟随官方页面。

函数read_file_from_gcloud_storage能够读取 5 种类型的file_format : csv、xlsx、parquet、json 或 txt。要定义要加载的特定文件,您需要提供file_namegcp_bucketgcp_project作为参数。

df_from_storage = read_file_from_gcloud_storage(
    "<file name>",
    "<file format>",
    "<bucket name>",
    "<GCP project name>",
    "<path to GCP credentials json>",
)

5.一锤定音

我希望您和您的团队都能从本文介绍的功能中受益,避免通过电子邮件或视频聊天软件共享数据文件。通过使用 Google 云服务共享您的文件,您可以提高跨团队的数据一致性,并帮助在您的公司内部创建数据安全性和意识。

如简介中所述,你可以在我的 GitHub 资源库中找到代码和一本 Jupyter 笔记本教程**。**

如果您对所展示的主题有任何建议,请随时写信给我😉!

非常感谢你阅读我的文章!

  • 你可以在我的个人资料页面 找到我的其他文章🔬
  • 如果你喜欢它并且想成为中级会员,你可以通过我的 推荐链接 来支持我👍

不连续函数的积分与欧拉常数

原文:https://towardsdatascience.com/integration-of-discontinuous-functions-and-eulers-constant-44b4c61380d7?source=collection_archive---------19-----------------------

地板函数有反导数吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自维基共享资源

介绍

最近我一直在研究更多的实验数学。

提出一些不标准的东西总是令人兴奋和有点伤脑筋的,从某种意义上说,严谨性可能不存在,或者数学界还没有接受它作为一个一致的数学理论,但尽管如此,我认为数学在某种程度上既是科学,也是艺术和创造力。

欧拉在真正理解复数之前欣然接受了负数的平方根拉马努金研究了对当时的数学家没有任何数学意义的发散级数,但这些结果后来被用于一百多年后的量子力学弦理论

我的观点是,有时候以一种非正式的方式来玩和实验数学是可以的。当然,归根结底,我们需要一个有效且一致的理论,并对定理进行严格证明。

在这篇文章中,我会给你一些有趣的想法,但最后,这个理论实际上是一致的,伟大的事情是我们可以将它应用到实际问题中,正如你将看到的。

我们将在文章的最后使用 Python 对结果进行数值验证。

基底函数和分数部分函数

在解析数论中,我们经常会遇到涉及底函数的级数和积分,因此定义如下:

表示为[x]的 x 的底等于小于或等于 x 的最大整数。因此它将向下舍入到最接近的整数。一些例子是[3.2] = 3 和[2/3] = 0。

在文献中,你有时会看到用略有不同的括号表示的底函数,但幸运的是,数学不依赖于符号,所以我们可以自由选择自己的。如果你正在用“纸和笔”阅读这篇文章,请随意使用你想要的任何东西。

另一个非常常用的函数是一个密切相关的函数,叫做小数部分函数。x 的小数部分表示为{x},定义为{x} = x - [x]。一些例子是{3.2} = 0.2 和{2/3} = 2/3。

请注意,这些函数不是连续的。地板函数的图形如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自维基共享资源

如你所见,地板函数的图形在整数值处有“跳跃”,使得它在这些值处不连续。

小数部分函数的图形如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自维基共享资源

同样,这个图在整数处有“跳跃”,但是如果你(在心理上)将这两个图加在一起,你几乎可以看到底函数的跳跃是如何用小数部分填充的,以创建恒等函数 f(x) = x

数论的应用

早先我说过这些函数在数论领域被大量使用,但是在哪里,为什么?

其中一个原因就是著名的阿贝尔求和。我给你公式,让你自己试着证明。

设 x > 1 为实数,且实函数 f 可微,则以下成立:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总和是 1 到 x 之间的所有自然数,包括 1 和 x。

一个小小的证据提示:

如果你想证明,试着把积分写成从[x]到 x 的整数区间上带小余积分的积分和,那么[t]因子在整个区间上是常数,可以从积分中抽出来。然后你使用微积分的基本定理,你会得到一个伸缩的和,有很多抵消。

你可以用很多方法证明这个结果,实际上这是一个更一般的定理的特例,但我们只需要这篇文章中的结果。

这个公式将和转化为积分,反之亦然,所以让我们尝试将其应用于一个非常有趣的和,即调和和。换句话说,让 *f(t) = 1/t,*让我们将阿贝尔求和公式应用于该函数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们用分数部分扩展了基底函数。现在我们注意到,有一个 ln(x) 在附近,我们可以把它拉到等式的另一边。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当极限值为 x 时,两边都趋于无穷大,我们得到了有趣的结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中γ ≈ 0.5772…欧拉-马斯切罗尼常数。

欧拉-马斯切罗尼常数被神秘所包围,我们对它一无所知,尽管它在数论和分析中随处可见。

人们怀疑这个数字是先验的,但令人尴尬的是,我们甚至不知道它是否是无理数!

我知道你在想什么。至少我在想:如果我们能用两个被积因子 {t}1/t 做偏积分岂不是很棒?

不连续函数的“反导数”

现在,函数 f 的反导数是一个可微函数 F ,它的导数等于原函数 f 。因此,不连续函数的反导数是不存在的,因为它是不可微的。

然而,让我们想一想反导数的特征是什么,它们在部分积分技术中起什么作用。

实际上,我们不需要假设积分因子是连续的——只需要知道它是勒贝格可积的,所以如果我们能找到一个函数 f ,它将在几乎所有的点起反导数的作用(因此将给出图 f 下的面积),我们将能够在分部积分时以通常的方式使用它。

让我们更仔细地看看如何找到函数 f(t) = {t} 的图下面积公式,比如从 0 到 *x,*其中 x 是某个实数。

作为练习,你现在可以自己尝试一下。

对此有两种主要的思考方式。在这种情况下,最简单的方法是从几何角度推导公式,因为当我们查看 {t} 的图表时,很明显,面积将是每个面积为 1/2 的三角形的面积之和。

剩余面积显然是 1/2 {x},因此我们的公式变成:([x] + {x} ) / 2 = ( x - {x} + {x} ) / 2。

然而,我们将采用另一种方法,因为我想向你们展示一种更通用的推导方法,因为在未来我们可能必须找到{t}的积分,这在几何上并不容易…

我们将利用这样的事实:在区间*【n-1,n】*上我们有{t} = t - (n - 1)。因此,我们可以把积分分解成具有整数端点的单位区间。具体来说,我们有

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一般来说,我们可以使用这种技术,通过在积分中使用智能替换来计算小数部分的 n 次方:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用这种技术,我们可以对底函数做同样的计算,当尘埃落定,一些方程会从灰烬中升起。

这里我将陈述两个结果,即需要一些解释。但首先,让我陈述它们:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于一些实数 C0C1

我这么说是什么意思?显然,这些函数是不可微的,所以它们不可能是经典意义上的反导数,因此我们可以认为这是对符号的一点滥用,但是这个符号在一段时间内会有意义。

以下是一些观察结果:

  1. 这些是实际的面积函数,也就是说,如果对积分进行定积分(从 ab 进行积分),并以通常的方式将这些函数用作反导数,那么我们可以得到两个图形下的面积,x 轴上方和下方的面积之间通常存在差异。
  2. 分数部分和底函数仅在一组离散的点,即整数上是不可微的。因此,它们实际上几乎在任何地方都是可微的(在 T2 测度论的意义上),因为微分是局部的(逐点的)运算,我们可以陈述如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们只需要小心一点,因为微积分的基本定理不成立。如果我们想要这样的东西,我们将不得不使用狄拉克δ函数的无穷级数(分布理论),我们不需要这样。

但以上仍然是正确的,我们只是砍掉了一些点。因此,我们可以利用这一点来做部分集成。

请注意,这一切都完美地融合在以下内容中:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于一些常数 C ,就像它应该的那样。

重温欧拉常数

那么现在我们有了一些工具,如何应用呢?

我们推导出了一个关于欧拉-马斯切拉诺尼 常数的公式,现在我们有了足够强大的武器来进一步进行计算:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里我们使用了分部积分和 {x} 的积分公式。我们可以通过再次使用部分积分来进一步接近γ。如果你觉得无聊或者只是好奇,可以试一试。请告诉我你发现了什么。

数值分析

只是为了满足自己的好奇心,我在 Python 中做了一些数值积分。对于那些不知道如何用 Python 编码的人来说,这对于本文来说并不重要,但是对于那些知道的人来说,如果你愿意,你可以试一试。

让我们创建一个数字积分模块:

在一个单独的文件中,我们进行实际的计算。我们从上面的模块中导入 Integrate 类,并定义分数部分函数和被积函数。然后,我们将结果打印到控制台。

我们得到大约 0.5772154… 考虑到真实值从 0.572156649 开始,这一点都不差…

如果增加精度或上限,您将获得更好的近似值,但是,运行时间也会增加。

这在数值方法中总是一个折衷。当然,没有什么能打败纯数学。然而,数字验证可能是一个很好的指导。

这是这个故事的结尾,但是更多的故事还在后面。

如果你想了解我的研究和写作过程,想“先睹为快”未来的故事,想了解我更私人的一面,请在 Instagram 上关注我:

点击下面的图片找到我的简介。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

如果您有任何问题、意见或顾虑,也欢迎通过 LinkedIn 联系我:

https://www.linkedin.com/in/kasper-müller-96ba95169/

数学家是把咖啡变成定理的机器。

阿尔弗雷·德·雷尼

情报服务和自然语言处理

原文:https://towardsdatascience.com/intelligence-services-and-natural-language-processing-926b18736796?source=collection_archive---------36-----------------------

对象角色建模中的派生事实类型

很容易想象一个情报机构问一个收集情报的知识图表这样的问题:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自然语言智能查询。图片作者。

这种类型的查询的问题是,根据下面的实体关系图,数据库可能只存储某人在某个日期访问某个国家的事实,而不是在哪个时间段内:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实体关系图。图片作者。

要回答这个问题,需要做一些数学计算。我们需要说明以下几点:

过去几个月内访问过的国家/地区月份
是指人员在日期
和今天——日期<期间月份* 30 访问过的国家/地区

输入对象角色建模和派生事实类型

对象-角色建模 (ORM)是一种概念建模,它有一种事实类型,称为派生事实类型。派生的事实类型允许您定义涵盖这些事实类型的事实的算法/公式。

例如,在我们的例子中,我们将如下定义一个派生的事实类型:(即在读数’…visited…with the last…* '中用星号表示的事实类型):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

具有派生事实类型的对象-角色模型。图片作者。

星号让您知道有一个公式与派生的事实类型相关联(如右侧所示)。不需要为派生的事实类型创建数据库中的表…它们的事实是存储在其他表中的事实的派生。

现在当我们问“哪个人…在过去(PeriodMonths:10)内访问过(Country:'Adjikistan ')”使用 ORM 的知识图上的查询引擎知道使用派生的事实类型及其公式来查找在特定日期和“今天—(那)日期< PeriodMonths * 30”访问过 Adjikistan 的那些人。

人工智能的含义

即使只看最初的查询,也很容易认识到,如果我们不得不查阅自己的内部记忆,我们需要做一些心理体操,看看我们知道哪些人住在悉尼,在某个特定日期去过阿吉基斯坦,然后计算该日期是否在过去 10 个月内。

也就是说,人类很自然地使用我们自己内部衍生的事实类型的等价物来做这种类型的数学。对我来说,任何未来合适的处理自然语言查询的人工智能都必须有能力将人工智能形成的查询的某些部分传递给适当的数学函数,其方式类似于派生事实类型的使用。

在早期的一篇文章中,我描述了主人工智能之外的小程序,作为应用专业智能(ASI)服务,人工智能利用它们来解决更广泛的人工通用智能范围内相对简单的问题。绑定到查询中的派生事实类型类似于那些 ASIs。

自然语言数据库查询的体系结构

早先我描述了一个基于 TDS 的架构,用于在标准数据库管理系统上应用自然语言查询。表面上,人们在现有的数据库技术上应用知识图的模型,而不必有专门的知识图数据库,使用对象-角色建模作为数据库上的语义/知识模型层。

如果我们考虑替代方案,这种技术的好处就显而易见了。例如,如果我们使用 SQL,我们简单的一行查询就变成了相当复杂的 SQL(结构化查询语言)查询,如下所示:

选择[人员]。名字,[人]。LastName
FROM [Person],
【Country】,
(SELECT Person_Id,Country_Name,Date
FROM personvisiteddcountryondate
WHERE julianday(’ now ')—julianday(Date)<10 * 30)AS personvisiteddcountrywithinthelastpiolmonthsmonths months
WHERE[personvisiteddcountrywithelastpiolmonthsmonths months]。Person_Id=[Person]。Person_Id
和[personvisiteddcountrywithinthelastperiodemonthsmonths]。国家名称=[国家]。国家名称
和【国家】。Country_Name = 'Adjikistan ’

我知道,为了我的钱,我更愿意将查询写在这篇文章的顶部。

难题…用一种语言代替另一种语言

在知识图数据库架构中,派生事实类型允许以简单的受控自然语言在数据库上执行非常简单的查询,但是有一个难题。

我们有效地做的是用一套函数/公式编程(例如软件代码或 SQL)代替另一套编程。也就是说,在派生事实类型语言中为派生事实类型定义公式是一项必须完成的工作,就像在 SQL 中需要完成的一样。

这个难题在信息技术和数据科学中一直存在,不同的语言适合不同技能的人。然而,使用具有派生事实类型的对象-角色模型知识图的好处是,如果它在现有数据库技术(如 ORACLE)上运行,那么最终用户可以选择…他们可以使用自然语言(使用正确的工具) 查询数据库,使用类似 SQL 的语言。因此,开发人员需要权衡的是,他们的客户是需要在 SQL 中快速生成一个肮脏的查询,还是创建一个派生的事实类型来回答最终用户在许多不同情况下可能会多次询问的自然语言查询类型。

可以说,创建派生的事实类型比编写 SQL 更容易,情报服务专业人员可能更喜欢用易于使用的受控自然语言来查询他们的情报数据库。

情报服务愿景

在科幻电影的领域中,询问智能代理计算机系统并让它理解你所说的话的能力在现实中并不遥远。原因是因为投入到问题空间的努力量。

就在几年前,与智能手机交谈似乎还不合时宜,但俗话说,人工智能技术一好就很快变得无聊。语音识别现在是如此普遍,以至于它看起来是一项无聊的技术。以同样的方式,有大量的研究进入自然语言查询处理,我认为用不了多久,它就会显得过时了。至少这个愿景激励着我的研究…

最新研究

派生的事实类型在我开发的工具中相对较新,但对于对象-角色模型数据库的概念化来说却是旧闻。上面提到的难题对于开发人员来说也是一个难题…虽然遵从数据库管理系统的查询引擎(例如 SQL 查询引擎)的公式处理能力可能很容易,但是必须首先为派生的事实类型语法开发一个合适的解析器。所以这是鸡和蛋类型的工作。

没有为派生事实类型的语法发布 ORM 标准,语法需要从头开始开发。

幸运的是,除了数学公式之外,派生事实类型语法很大程度上可以用同样的受控自然语言编写,这种语言可以首先使用对象-角色建模谓词来形成,因此这是一个应用 ASI 愿景的问题……将派生事实类型视为 ASI,并将它们作为查询中的查询进行投影。

例如,在下面的模型中,考虑兄弟的派生规则:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

具有派生事实类型的对象-角色模型。图片作者。

构成兄弟的定义在语法上与我们查询知识图的方式没有什么不同,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

点击放大。自然语言查询。图片作者。

哪个人 1 是居住在(城市:“悉尼”)的人 2 的兄弟姐妹,并且那个人 1 在过去(周期月数:10)内访问过(国家:“阿吉基斯坦”)

所以派生的事实类型公式语法与更广泛的查询语言本身没有太大的不同。

我发现这项工作很有意思,并期待更多关于派生事实类型和使自然语言查询更容易的工作。

感谢您的阅读,如果时间允许,我会写更多关于对象角色建模、派生事实类型、自然语言查询和知识图的内容。

— — — — End — — — — —

智能裁剪页面旁注

原文:https://towardsdatascience.com/intelligently-cropping-page-marginalia-ab04744a1111?source=collection_archive---------21-----------------------

在本文中,我将向您展示如何编写代码来自动裁剪文档的页面旁注,以处理用于光学字符识别(OCR)的图像。

更新:帖子的第二部分是 这里是

编辑:我错误地将这个过程称为“预处理”,而它应该被称为“后处理”或者仅仅是“处理”。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

OCR 前的图像处理方法。【图文由作者提供;第三版。(波哥大:奥利韦里奥·佩里&中央情报局。, 1961)]

有几种方法可以在将图像输入到 AWS Textract 或 Tesseract 等 OCR 软件之前对其进行处理,使页面上的文字成为计算机可读的文本。你使用的方法很大程度上取决于你所拥有的图像质量。下面是一个不完整的列表:

  • 二值化—将图像转换为黑白像素,以增加文本和背景之间的对比度
  • 倾斜校正—旋转图像,使文本以整齐的水平行显示
  • 透视扭曲—修复实际图像和捕获图像之间的扭曲
  • 裁剪—删除图像中我们不想阅读的部分,并简化图像,以便 OCR 软件“阅读”

对于这些问题,已经有几种解决方案,但是裁剪页面旁注(页眉和页脚)是很困难的。并非所有页面都以相同的方式扫描,从而导致不同的页面方向和清晰度。页面旁注也不总是在同一个位置或具有一致的文本,这使得在 OCR 后很难删除。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个例子,我们希望如何理想地裁剪一页。【图文由作者提供;第三版。(波哥大:奥利韦里奥·佩里&中央情报局。, 1961)]

上面的照片是你理想的裁剪扫描图像的方式。本质上,我们定位页眉或页脚和正文之间的空间,以及每列文本之间的空间,并说“我要在这里裁剪它”。但是我们不希望手动处理成百上千或上百万的文档。这需要很长时间,如果有自动化的流程,为什么还要自己做呢?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用于 OCR 的图像处理方法。【图文由作者提供;第三版。(波哥大:奥利韦里奥·佩里&中央情报局。, 1961)]

我的方法是教计算机“看”图像,就像我在上图中所做的那样。将图像二值化后,图像的每个像素变成黑色或白色,分别用数字 255 和 0 表示。当我们看图片时,我们在寻找一条水平的白色像素带,它代表了页眉和文本之间的空间。

下面的代码片段从图像顶部开始查看 30%的水平像素行。它计算每行像素之间的百分比差异,并允许来自低质量图像或随机斑点的少量噪声。然后,它识别最长的连续白带,并在中心裁剪它。这个过程依赖于已经被倾斜校正和二进制化的图像,所以请查看链接的解决方案。

故障排除——啊哦,这种作物偏离太远了

一旦您有机会在一些图像上测试该代码(我强烈建议在浏览所有图像之前),如果图像裁剪不如您想象的那样好,请确保:

  • 所有图像中的文本都是水平的
  • 你已经选择了正确的像素窗口来查看

我希望这个解决方案已经节省了你的时间,并教你如何处理图像!

为数据科学家在 Django 3 中交互数据

原文:https://towardsdatascience.com/interact-data-in-django-3-for-data-scientists-952b308fb0a8?source=collection_archive---------25-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

斯蒂芬·斯坦鲍尔在 Unsplash 上拍摄的照片

文章一览:

  • Django 3 简介
  • 作为数据科学家,您可能会遇到哪些情况?
  • 如何使用分步指南和示例代码运行迁移
  • 如果您知道 SQL,如何运行 Django 查询

谁是代表:数据科学家,他们希望将您的代码插入到您的组织代码库中,该代码库是基于 Django 的。

在我开始分享我对 Django 3 的了解之前,我想提一下为什么我需要快速学习 Django。我在之外的一家名为的公司工作,我的主要工作是建立推荐系统来个性化用户的内容消费。两个月前,我们决定将 web 开发框架从 FastAPI 改为 Django。在我们开始这个项目之前,我对 FastAPI 的了解非常有限,我学到的知识足以成功实现数据科学算法部分。但是随着新的变化,我需要快速进化,将我的代码移植到 Django 框架中。

旁注:作为一名数据科学家,你可能已经看过著名的数据科学维恩图并为之苦恼,在该图中,你需要精通数学统计、计算机科学和领域专业知识,尤其是如果你想成为独角兽的话🦄。在我的个人职业发展中,我注意到,除了深化数据科学和机器学习知识之外,我的工作要求我主要在两个领域拓展技能:

  1. Web 开发:如果你在一家开发面向消费者的应用程序(Web 和/或移动)的初创公司工作,你很可能会遇到这样的问题——我们如何将数据科学模型部署到应用程序中?如何在 API 中包装模型?等等,REST API 和 GraphQL 有什么区别?什么是阿波罗和联邦数据?事实上,为了将我的代码集成到更大组织的代码库中,这些都是我需要解决的问题。
  2. **数据工程:**您的组织很可能会有专门的数据工程师来处理生产数据库,但您绝不会后悔扩展您的技能组合,包括设计表格、数据库迁移、非常熟悉如何将雪花、Postgres 和 Redshift 连接到 PyCharm 和 Jupyter Notebook。

好了,足够的背景故事,让我们开始姜戈。

Django 3 简介

一行解释:Django 3 是一个 python web 开发框架。

什么是 web 框架?我制作了这个图表来说明 Django 模型视图模板(MTV)范例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由杨文拍摄

基本上,客户端发送一个 HTTP 请求,它被传递给urls.py,这有助于将请求映射到适当的视图。views.py就像一个请求句柄,它可以使用模板以正确的方式访问数据和组织数据,然后将其作为 HTTP 响应发送回来。

这就是我们所需要知道的,我告诉过你它会很“简短”。🍃

让我们转到更有趣的问题→

作为数据科学家,您可能会遇到哪些情况?

从我个人的经验来看,您很可能需要知道如何正确地将您的代码插入到models.py中,它允许您指定数据的模式并在数据模型类中编写定制的函数。

例如,下面是一个名为ContentItem的数据类,就像我们从 SQL 中的表创建开始模式设计一样,我们为每个列或数据字段定义了一个具有预期数据类型的类。

有几件事值得注意:

  1. 如果您没有创建一个id列,Django 会自动将它添加到实际的表中
  2. 如果你想为列tags创建一个列表,例如,在一个单元格中存储像【新闻,自行车,冬天】这样的东西,你可以使用ArrayFieldmodels.CharField意味着在列表内部,每个元素都是一个字符串。
  3. Django 中的数据字段遵循非常类似 SQL 的列约束。

列约束是应用于单个列的值的规则:

PRIMARY KEY约束可用于唯一标识行。

UNIQUE每一列都有不同的值。

NOT NULL列必须有值。

DEFAULT未指定值时,为列指定默认值。

每个表只能有一个PRIMARY KEY列和多个UNIQUE列。例如,当我们在 Django 中创建ContentItem类时,自动生成的id将成为PRIMARY KEY列,并且我们将item_urlitem_uuid都指定为UNIQUE列。

一旦有了数据模型类,就需要运行数据迁移来将模式应用到新表中。

如何在 Django 中运行迁移?

步骤 1:假设您在同一个项目环境中,打开 Pycharm 终端,运行

$ python manage.py makemigrations

然后,一个新的迁移文件将被自动填充,类似于0018_auto_...py,因为已经存在 17 个迁移,我的被表示为0018。通常,您不必编辑该文件中的任何内容。

步骤 2:通过运行以下命令将迁移文件应用到您的数据库

$ python manage.py migrate

更多细节可以在 Django 的官方文档中找到。

如果您知道 SQL,如何运行 Django 查询

对于大多数数据科学家来说,幸运的是我们知道 SQL。并且 Amit Chaudhary 写了一篇精彩的帖子关于如何在 Django 中执行我们典型的 SQL 任务。

既然他抢先我写了这个,我就补充一个需要注意的事情:小心什么时候对 QuerySets 求值(摘自本书< Django 3 By Example >第 1 章):

" QuerySets 仅在下列情况下进行评估:

-第一次迭代时

——当你把它们切片的时候,比如说,objects.all()[:3]

-当你腌制或储藏它们时

-当你在上面呼叫repr()len()

-当你在它们上显式调用list()时"

如果您希望在函数中使用 QuerySet 的输出,这将变得非常重要。

如果你想了解更多关于 Django ORM 的信息,还有一个很棒的媒体帖子。

结束语

  1. Django 是一个强大的 web 开发工具。而作为数据科学家,我们可以向两个方向拓展:前端←数据科学→后端。学习 Django 可以增强我们的前端和后端知识。本文中的例子更多地与后端相关,但是在现实生活中,在添加了表和迁移之后,我还需要创建定制的函数并更新前端 API——graph QL 中的解析器。
  2. 我发现自己使用的一个典型的重构工作流程是:更新models.py →运行迁移→运行数据摄取任务→更新schema.graphql →更新graphql.py中的解析器函数
  3. 我对 Django 的理解仍然非常有限,在一般的 DS 工作中,用例可能太窄了。但是如果你碰巧在相似的环境下处理相似的问题,我希望这能有所帮助,哪怕只是一点点。

参考

  1. SQL 上的 codecademy cheat sheets:https://www . codecademy . com/learn/becp-SQL-for-back-end-development/modules/fscp-SQL-creating-updating-and-deleting-data/cheat sheet
  2. 书籍:《Django 3 举例》——第三版,作者安东尼奥·梅尔

交互式动画可视化

原文:https://towardsdatascience.com/interactive-animated-visualization-db91d1c858ad?source=collection_archive---------18-----------------------

使用 AnimatPlot 制作图形和绘图动画

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:作者

数据可视化有助于理解不同的模式、关联、来自数据的视觉洞察等。它很重要,因为它以图表、图形和绘图的形式揭示了数据表背后的奥秘。有 N 个 python 库可以帮助可视化数据,如 Matplotlib、Seaborn 等。

如果我告诉你,你可以动画化你的视觉效果呢?挺有意思的吧!如果你能做到这一点,那该多好啊。让我们揭开这背后的秘密,并了解我们如何才能动画我们的常规情节。

AnimatPlot 是一个基于 Matplotlib 构建的开源 python 库,用于创建高度交互式的动画情节。在本文中,我们将探索 AnimatPlot 提供的一些功能。

让我们开始吧…

安装所需的库

我们将从使用 pip 安装 AnimatPlot 开始。下面给出的命令可以做到这一点。

!pip install animatplot

导入所需的库

在这一步中,我们将导入创建动画图所需的库。

%**matplotlib** notebook
**import** **numpy** **as** **np**
**import** **matplotlib.pyplot** **as** **plt**
**import** **animatplot** **as** **amp**

创建数据集

这里创建的数据集将创建一个正弦波,然后我们将制作这个正弦波的动画。类似地,我们也将另一个数据集用于在单个图形中显示多个图。

x = np.linspace(0, 1, 50)
t = np.linspace(0, 1, 20)

X, T = np.meshgrid(x, t)
Y = np.sin(2*np.pi*(X+T))

创建动画情节

这是最后一步,我们将创建情节和动画。

block = amp.blocks.Line(X, Y)
anim = amp.Animation([block])
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:作者

现在,我们将向绘图添加控件。

timeline = amp.Timeline(t, units='s', fps=20)
block = amp.blocks.Line(X, Y)
anim = amp.Animation([block], timeline) 
anim.controls()
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:作者

同样,现在我们将添加更多数据,并在单个图表中创建多个图。

x = np.linspace(-2, 2, 41)
y = np.linspace(-2, 2, 41)
t = np.linspace(0, 2*np.pi, 30)
X, Y, T = np.meshgrid(x, y, t)
data = np.sin(X*X+Y*Y-T)
line_data = data[20,:,:] fig, (ax1, ax2) = plt.subplots(1, 2)
for ax in [ax1, ax2]:
    ax.set_aspect('equal')
    ax.set_xlabel('x')ax2.set_ylabel('y', labelpad=-5)
ax1.set_ylabel('z')
ax1.set_ylim([-1.1,1.1])fig.suptitle('Multiple blocks')
ax1.set_title('Cross Section: $y=0$')
ax2.set_title(r'$z=\sin(x^2+y^2-t)$')line_block = amp.blocks.Line(X[0,:,:], line_data,
                                   ax=ax1, t_axis=1)
block = amp.blocks.Pcolormesh(X[:,:,0], Y[:,:,0], data, ax=ax2, t_axis=2, vmin=-1, vmax=1)
plt.colorbar(block.quad)
timeline = amp.Timeline(t, fps=10)
anim = amp.Animation([block, line_block], timeline)
anim.controls()
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:作者

在这里你可以看到我们是如何创建动画情节并为其添加互动的。

继续尝试不同的数据,并创建一个动画可视化。如果您发现任何困难,请在回复部分告诉我。

本文是与 Piyush Ingale 合作完成的。

在你走之前

感谢 的阅读!如果你想与我取得联系,请随时联系我在 hmix13@gmail.com 或我的 LinkedIn 简介 。可以查看我的Github简介针对不同的数据科学项目和包教程。还有,随意探索 我的简介 ,阅读我写过的与数据科学相关的不同文章。

用于地理空间数据可视化的交互式地形图

原文:https://towardsdatascience.com/interactive-choropleth-map-for-geospatial-data-visualization-a53688c8ef21?source=collection_archive---------31-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

斯特凡诺·瓦尔托塔在 Unsplash 上拍摄的照片

详细教程

地理空间数据可能很有趣。一个交互式地理空间可视化提供了关于数据和区域等的大量信息。Python 有这么多库。很难知道用哪一个。对于地理空间可视化,我将使用叶子。这是非常容易使用,它有几种风格,以及符合您的选择和要求。我们开始吧。

为此,我使用了 Jupyter 笔记本环境。如果您使用的是 Jupyter 笔记本,那么您需要使用 anaconda 提示符,使用以下命令来安装 lyum:

conda install -c conda-forge folium=0.5.0 — yes

或者请查看文档。我用的是 windows。

现在我们可以在笔记本中导入叶子了。叶子内置了世界地图。

import folium
folium.Map()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是世界地图。如您所见,您可以放大、缩小和导航。你可能想要某个国家、州或城市的地图。该特定地点的纬度和经度可以作为参数提供,以获得该特定地点的地图。我想打印佛罗里达地图。

folium.Map(location = [27.664827, -81.516], zoom_start = 4)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里你可以看到佛罗里达州。我把 zoom_start 设为 4。在您的笔记本中,您可以放大或缩小并导航到某个部分。但是你也可以从放大开始。

florida = folium.Map(location = [27.664827, -81.516], zoom_start = 7)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们看看不同的风格。制作高对比度的黑白地图。可以通过使用参数瓦片来实现。对于高对比度的黑白地图,拼贴将是“雄蕊调色剂”。

folium.Map(location= [27.665, -81.516], zoom_start = 8, tiles = 'Stamen Toner')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

是不是很好看!这种类型的地图非常适合沿海地区。对数据混搭也有好处。

在我的下一个例子中,我将使用雄蕊地形图。这将显示自然植被和山丘阴影。

folium.Map(location= [27.665, -81.516], zoom_start = 4, tiles = 'Stamen Terrain')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我相信你有兴趣看看我们能否在地图上标出事件或事故。我们当然可以。为了演示,我将使用一个数据集来显示佛罗里达州的事件。请随意从这里下载数据集:

https://github.com/rashida048/Datasets/blob/master/Florida_Subsidence_Incident_Reports.csv

将数据集导入笔记本。

import pandas as pd
florida_incidents = pd.read_csv('Florida_Subsidence_Incident_Reports.csv')

数据集太大。所以我没有在这里显示截图。但是数据集有一个 X 和 Y 列,它们是佛罗里达不同位置的纬度和经度。我们可以将这些位置放在地图上,创建一个要素组。我们将包括点的位置和样式。为了图像的清晰,我将只放 100 个数据点。

florida_incidents = florida_incidents.iloc[0:100, :]
florida = folium.Map(location= [27.665, -81.516], zoom_start = 7)
incidents = folium.map.FeatureGroup()
for lat, lng, in zip(florida_incidents.Y, florida_incidents.X):
    incidents.add_child(
    folium.features.CircleMarker(
    [lat, lng],
    radius=5,
    color='yellow',
    fill=True,
    fill_color='blue',
    fill_opacity=0.6))florida.add_child(incidents)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以更进一步,在这些点上添加标记。

latitudes = list(florida_incidents.Y)
longitudes = list(florida_incidents.X)for lat, lng in zip(latitudes, longitudes):
    folium.Marker([lat, lng]).add_to(florida)
florida.add_child(incidents)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

随意放大并导航以查看特定县或城市的事件。

结论

我试图展示如何生成一个交互式地图,用标记在上面呈现一些事件或事件,并对其进行样式化。这种类型的交互式地图在仪表板、演示文稿或任何其他呈现的信息中总是很有帮助。我希望这有所帮助。

请随时在 Twitter 上关注我。

更多阅读

[## 熊猫总结数据的三个非常有用的功能

towardsdatascience.com](/three-very-useful-functions-of-pandas-to-summarize-the-data-491b64db9370)

由 Julia 支持的交互式加密仪表板

原文:https://towardsdatascience.com/interactive-crypto-dashboard-powered-by-julia-fd6f60f23063?source=collection_archive---------27-----------------------

可视化历史市场数据的有趣方式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Bermix 工作室Unsplash 拍摄的照片

首先,非常重要的一条免责声明:本教程仅用于教育目的,不应被视为交易建议。加密货币市场非常不稳定,你很可能会失去你的投资。在决定交易本文中讨论的任何加密货币之前,请了解风险并做好自己的研究。

在此之前,我已经探索了 Julia 在新冠肺炎数据可视化中的应用。我们在该教程中制作的情节很有见地,尽管交互性有限。我最近得知 Dash 宣布支持 Julia,因此决定尝试一下。Dash 使用基于 react 的框架,允许我们构建可扩展的 web 应用程序。Python 和 R 用户必须已经熟悉 Dash 生态系统。现在,有了 Dash.jl,我们终于可以利用 Julia 作为 web 应用程序的强大后端了。

简单来说,本教程的重点是构建一个应用程序,允许用户监控历史价格数据,并计算各种加密货币的一些关键技术指标。我选择这个用例,部分原因是我对区块链技术公司的兴趣,以及过去几个月发生的所有令人兴奋的价格行为。这种分析当然也可以用于股票市场数据。

我们开始吧

我使用 VS 代码,为此你需要安装和配置 Julia 扩展。这相当简单,详细说明可以在这里找到。你也可以直接从朱莉娅·REPL 那里运行这个应用程序。克隆这个存储库并遵循其中给出的说明。所有相关的软件包都将自动安装。如果您确实使用 VS 代码,您可以通过单击窗口的左下角(Julia env 按钮)来选择 Julia 环境,然后从顶部面板中选择位置(CryptoDashApp 目录)。我使用的是 Julia 1.6.0,该应用程序也可以在旧版本上运行(在 1.5 和 1.4 上测试)。但是,我强烈建议升级。

获取市场数据

我们需要一种方法来访问许多加密货币的历史市场数据。币安和比特币基地等热门交易所通常为此提供 API。然而,用它们创建一个帐户是很繁琐的,更不用说这些 API 大多数都是基于 Python 的。令人欣慰的是,有许多其他市场数据提供商也提供免费访问,但有一些限制。Alpha Vantage 就是这样一个选择。向 Dean Markwick 大声欢呼,他创造了 AlphaVantage.jl 包,我们将在我们的应用中使用它。点击这里,获取免费的 API 访问密钥。请注意,API 调用的数量被限制为每分钟 5 次,每天 500 次请求(对于我们的应用程序来说已经足够了)。我们将尝试用一些变通方法来规避前一个限制。

项目目录

所有相关代码都可以在这里找到。的。toml 文件位于主目录中,该目录与模块同名。应用程序配置选项位于模块文件“CryptoDashApp.jl”中,其余的 Julia 函数也位于“src”目录中。我们将下载当前日期的市场数据并保存到“数据”文件夹中。为了避免混乱,我们的应用程序还将通过删除以前日期的数据文件来执行清理操作。参见下面的代码要点:

删除除当天之外的数据文件

使用 Alpha Vantage API

我们将创建各种助手函数来检索市场数据并将其转储到 Julia 数据框架中。如果你不熟悉数据框架或者需要一个快速介绍,这里有一个方便的指南。由于 API 调用的数量有限,我们只想在给定的一天为给定的加密货币检索一次数据。因此,第一步是检查数据文件是否已经存在,如果不存在,我们下载并保存到磁盘。这在函数 get_price_data_single 中实现,如下所示:

将当前日期的数据下载并保存到磁盘

如果您仔细观察上面的代码片段,我们还对通过 API 调用直接获得的“原始”数据进行了一些后处理。为此,我们使用了函数 raw_to_df ,它创建了一个漂亮的数据帧,每行表示一天,列名表示相应的数据类型。

将原始数据转换成可读性更强的数据框架

在 REPL 中,生成的数据帧应如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据框架中可用的 ETH 市场数据

为了获得给定一天的平均数据,我们简单地取前四列(开盘、盘高、盘低、收盘)的平均值。这四列也为生成烛台图提供输入。体积数据通过体积列获得。这些操作被归入函数 average_price_dfvol_df :

将平均价格、蜡烛图和成交量数据分组到单独的数据框架中

以上都组合到前面展示的函数 get_price_data_single 中,可以针对任何给定的加密货币调用,并返回单独的数据帧。可以对另一组指标执行类似的操作,这些指标告诉我们资产的市场健康状况。在加密货币的情况下,它们是用户活动、开发者行为和市场成熟度,由 Flipside Crypto 提供。函数 get_ratings_data 返回这些指标。

计算移动平均值

移动平均线是一个重要的技术指标,交易者经常使用它来做出买入/卖出的决定。三个最重要的是简单移动平均线(SMA),加权移动平均线(WMA)和指数移动平均线(EMA)。我就不赘述了,你可以查看这个链接获得额外解释。我们计算所有三个(检查函数移动平均线),并将它们与日平均价格数据一起绘制。可以从网络界面选择所需的平均窗口。

绘图数据

我们使用 PlotlyJS.jl,它是 plotly.js 库的 Julia 接口。为了将数据传递给绘图函数,我们需要从我们的数据帧创建 PlotlyJS 跟踪对象。参见函数 plot_price_vol_data 的示例:

为价格和交易量数据创建 PlotlyJS 跟踪对象

这些跟踪将在回调中使用(稍后显示)! run_app 函数内的部分。

构建 Dash 应用程序

该应用程序的 UI 包括:(1)下拉列表(选择给定的加密货币或选择绘图模式)(2)复选框(选择平均窗口或时间框架以显示历史数据)。这些元素可以很容易地添加,如下面的代码要点所示:

设置 UI 元素的标签和范围

每次用户与应用程序 UI 交互时,都会触发一个回调,该回调将更新输入(考虑数据持续时间、平均窗口等。)到我们的绘图功能。

run_app 函数中的回调部分

生成的新图随后显示在浏览器窗口中。查看 CryptoDashApp.jl 中的 run_app 函数,看看所有这些是如何组合在一起的。

使用应用程序

CryptoDashApp GitHub 页面上给出了如何使用该网络应用的说明。总结一下,你需要:(1)在这里获取一个免费的 API key(2)克隆 repo (3)激活并实例化环境下载所有必要的包(只在第一次需要!)(4)向‘run _ app’函数提供端口号和 API 密钥。(5)转向连杆-1连杆-2

如果一切顺利,您应该会看到如下内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

过去 180 天 BTC 价格数据的日平均+ SMA、WMA 和 EMA (10 天窗口)

复选框的第一行控制用于计算各种移动平均值的平均窗口,而第二行控制应选择显示的历史数据的持续时间(以天为单位)。更改模式(第一个下拉列表)将允许您查看一组不同的数据。参见下面以太坊(ETH)的示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ETH 过去 180 天的烛台和成交量数据

随着 ETH 价格的上涨,交易所开始出现更多的交易活动。这可能是为什么 ETH 的日均交易量在 2021 年 1 月至 2 月期间出现增长的原因。然而,在 2021 年 3 月的大部分时间里,交易量相对较低。这可能意味着更多的投资者持有(保持冷静和 HODL!)放在他们的钱包里,而不是把它转移到/转移出交易所。莱特币(LTC)数据显示了类似的行为,交易量的增加与价格行为相关,见下文:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

过去 270 天 LTC 的烛台和成交量数据

您还可以通过从第一个下拉列表中选择模式来检查 LTC 的 FCAS 数据。它显示了“有吸引力”的总体评分,因为平均分数在 750-899 之间(更多信息)。这一点也不奇怪,因为 LTC 是一个相当成熟的项目,已经存在了很多年。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

FCAS 长期资本评级

这些图是交互式的,这意味着您可以将光标悬停在数据点上以查看它们的值,还可以放大到特定区域。还有一个选项可以将绘图下载为 png 文件。通过单击图例,您可以关闭该数据的显示,这在您希望仅查看特定类型的数据时非常有用,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

过去 180 天 ETH 的日平均+ EMA 数据

结论

Dash.jl 提供了一个易于使用的框架来开发基于 Julia 的可伸缩的 web 应用程序。官方的 Plotly 教程也是一个很好的起点。我喜欢做这个练习,并将继续探索更多有趣的用例。与此同时,如果你有自己的想法,可以在这个应用上自由开发。完整的代码可以在这里找到。感谢你花时间阅读这篇文章!如果你想联系,这是我的 LinkedIn

参考

  1. https://github.com/vnegi10/CryptoDashApp.git
  2. https://dash-julia.plotly.com/
  3. 另一个 web 应用可视化新冠肺炎数据的好例子:https://github.com/mbauman/CovidCountyDash.jl.git
  4. https://www.alphavantage.co/documentation/
  5. https://DM 13450 . github . io/2021/03/27/cryptoalphavantage . html

构建一个可视化新冠肺炎数据的 Streamlit 应用

原文:https://towardsdatascience.com/interactive-dashboard-in-streamlit-to-analyse-owid-covid-19-data-180b1c3372e4?source=collection_archive---------32-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

埃德温·胡珀在 Unsplash 上的照片

语境

我们的数据世界 (OWID)是一个开源的在线研究出版物。他们拥有广泛的公共数据集,涵盖疾病、气候变化、社会不公和贫困等主题。

我们工作的目标是让大问题上的知识变得容易理解。我们的数据世界是关于研究和数据的,以针对世界上最大的问题取得进展。

因此,当您发现 OWID 在他们的 GitHub 存储库中托管了大量新冠肺炎数据集时,您不会感到惊讶。

我采用了他们的一些新冠肺炎数据,着手开发一款能够让用户可视化和分析新冠肺炎数据的 Streamlit 应用。特别重要的是,用户能够与数据进行交互,从而进行定制分析并回答以下问题:

  • 人口密度和总病例数有关系吗?
  • 哪些国家在疫苗接种方面领先,哪些国家落后了?
  • 什么特征与死亡最密切相关?

我希望它看起来很容易,所以是我完成这项任务的首选图表库。我特别想制作一些可视化的动画,Plotly 是少数几个能以代码高效的方式做到这一点的库之一。

最终的 Streamlit 已经部署,您可以在下面的链接中找到它,但我想介绍一下我构建它的一些关键步骤,并谈谈在整个开发过程中的一些想法。

https://share . streamlit . io/kitsa mho/新冠肺炎数据/covid_streamlit_app.py

我们可以访问哪些数据?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由米卡·鲍梅斯特Unsplash 上拍摄

OWID GitHub 存储库中有许多数据集,但是它们已经将许多关键数据点聚合到一个组合结构中。这使得生活变得相当容易,因为转换不那么密集。

让我们看看 CSV。

import pandas as pddf = pd.read_csv('owid-covid-data.csv')
print(df.shape)(101752, 60)print('Total unique continents:',len(df.continent.unique()))
print('Total unique countries:',len(df.location.unique()))
print('Date span:',df.date.min(),df.date.max())Total unique continents: 7
Total unique countries: 231
Date span: 2020-01-01 2021-07-11

让我们检查数据帧的头部…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者分类的图像-示例数据框架

观察

  • 我们有 60 列,101,000 多行(截至 2021 年 7 月正确),每行代表年中的一天
  • 我们有横跨六大洲的 231 个国家
  • 几乎所有的变量都是连续的,而国家和大陆是分类的
  • 有许多空值**(稍后会详细介绍)。**
  • 鉴于我们分析的性质,这些变量中有些是相关的,有些最好描述为独立的,尤其是如果我们透过风险因素及其对新冠肺炎疫情的影响来看。

注意——我选择了 24 个我认为对演示仪表盘最有用的变量,概述如下。如果你想你可以发展这个应用程序,并包括更多。

因变量

dependent_var = [‘total_deaths’,’total_deaths_per_million’,’total_cases_per_million’,’icu_patients_per_million’,‘people_vaccinated_per_hundred’,
’total_vaccinations’,'hosp_patients_per_million]

自变量

independent_var = [‘gdp_per_capita’,’population’,’stringency_index’,’population’, 
‘population_density’, ‘median_age’, ‘aged_65_older’,
‘aged_70_older’, ‘gdp_per_capita’, ‘extreme_poverty’,
‘cardiovasc_death_rate’, ‘diabetes_prevalence’, 
‘female_smokers’,’male_smokers’, ‘handwashing_facilities’, 
‘hospital_beds_per_thousand’,’life_expectancy’,'continent', 'location']

这些指标中的大多数都是不言自明的。关于它们代表什么以及如何测量的详细分类,这里有一个广泛的数据字典。

数据准备

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由凯蒂·史密斯Unsplash 上拍摄

缺失值和插值

当我们准备数据时,经常会遇到缺失值。这可能是因为收集管道中的错误,也可能是因为开始时没有任何数据。当我们处理符合高斯分布的数据时,一个有效的策略是用平均值代替零值,在其他情况下可能用中位数。对于随时间累积的数据,更合适的方法是使用插值法,根据其周围的值来估计和估算值。Pandas 有一个方法pd.interpolate(),默认替换是线性的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者分类的影像-我是如何在 OWID 新冠肺炎数据集中发现缺失值的

对原始 OWID 数据集的检查显示,丢失值是常见的。下面是一些解决这个问题的函数。

下面是生成可在应用程序中使用的干净/格式化数据的主要函数。

让我们来看看最终的数据框架,看看英国是什么样子的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者分类的图像—示例数据框架

观察

  • 我们的新冠肺炎因变量按周分组(例如,总病例数、死亡人数、住院人数、疫苗接种数),但是随着时间的推移,您可以看到数据存在差异
  • 每个独立特征(如人均 GDP、人口密度、吸烟率)也按周分组,尽管数据不会改变,因为这些东西不会像新冠肺炎那样移动得那么快。

太好了,现在我们有了符合我们需要的正确格式的数据。接下来,我们需要开始思考如何在我们的应用程序上以有意义和有用的方式呈现这些数据!

简化应用程序设计

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

凯利·西克玛Unsplash 上拍摄

这篇文章假设你对 Streamlit 的工作原理有所了解。如果你不知道,那么请看看下面的这篇文章

**

分析方法

查看这些数据有两种有用的方法:

  • 横截面——探索在给定时间点多个自变量和因变量之间的关系
  • 时间序列 —探究多个自变量和因变量之间的关系,以及如何随时间变化

我想让应用程序一直亮着,不想让多个图显示不同的数据点,所以我决定只使用一个散点图可视化,但允许用户进行高级定制。这将鼓励互动,并希望有一定程度的发现。

多页

我在应用程序中建立了两个页面,一个用于横截面可视化,一个用于时间序列可视化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者提供的图片——应用程序截图

注意——使用 pages 导航 Streamlit 应用并不是 Streamlit 平台的固有功能,但 Praneel Nihar 在此概述了一个解决方案:

https://medium.com/@u.praneel.nihar/building-multi-page-web-app-using-streamlit-7a40d55fa5b4

散点图

我喜欢散点图。如果散点图是静态的并且是二维的,我们有能力在一张图中显示多达五个变量。

  • 横坐标
  • y 轴
  • 分散点
  • 散布大小
  • 分散颜色

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者分类的图像-横截面分析示例

如果我们把这些图做成动画,我们也可以在可视化中增加第六维度的时间

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者分类的图像-时间序列分析示例

最后,如果我们能给用户机会来改变这些变量中的每一个,那么分析的范围可以进一步扩大。Streamlit 中的小部件允许我们提供这个特性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片 Streamlit 下拉小工具的屏幕截图

其他功能

除了 X、Y 和分散数据点,我还包括了一些其他可视化选项:

  • 选择按洲屏蔽,即只显示特定洲的国家
  • 对于 X 和 Y 图,用一条垂直/水平线表示某一特征的集中趋势。这允许您查看哪些标记高于或低于任何绘制的指标的平均值

应用程序示例输出—横截面散点图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者分类的图像-横截面散点图示例

下面的代码块概述了创建上述横截面散点图所需的步骤。

示例输出-时间序列散点图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者分类的图像-带动画的横截面散点图示例

下面的代码块概述了创建动画横截面散点图所需的步骤。

摘要

希望这个简短的介绍已经为您提供了一些我们如何以一种令人信服的方式可视化数据的例子。通过选择正确的工具与数据进行交互,并通过使用适当的可视化,探索性分析比单独使用条形图更有效、更有趣、信息量更大。

无论如何,请使用我的 Streamlit 代码并在此基础上进行构建——这里有大量的数据,尽管我已经编写了一些全面的代码来可视化这些数据,但我确信还有许多其他途径可以探索和构建。

下次见!

萨姆(男子名)

链接和资源

要在本地启动此应用程序,您应该克隆我的分叉 OWID repo,并在命令行中运行:

$ streamlit run covid_streamlit_app.py
  1. Streamlit App
  2. 用我的应用程序分叉 OWID 存储库
  3. 简化应用程序要求
  4. 原始数据回购中的我们的世界**

在 Jupyter 笔记本中使用下拉菜单 Ipywidgets 和 Plotly 进行交互式数据分析。

原文:https://towardsdatascience.com/interactive-data-analysis-with-dropdown-menu-ipywidgets-and-plotly-in-jupyter-notebook-591a84a81b22?source=collection_archive---------3-----------------------

这是一个例子,展示了如何设置一个交互式下拉菜单小部件,以及如何使用 IPython 和 Pandas 在 Jupyter Notebook 中显示数据库分析的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片:拉森火山国家公园。

挑战

最近,在为我的一个研究生班做项目时,我面临着这样一个问题:对我在 Jupyter 笔记本上处理的多个数据集进行数据库分析的最佳方式是什么。这些数据库中的每一个都包含了多年来收集的信息,并且对于该特定数据库中询问的每个不同问题都有多个分层级别,例如性别和种族。此外,每个数据库都有国家汇编的信息。例如,每次您想要查看不同州的数据或按种族或性别查看数据时,都必须修改代码并重新运行每个单元格,这既麻烦又低效。这个问题的解决方案在于 ipywidgets。 Ipywidgets 是用于 Jupyter 笔记本和 IPython 内核的交互式 HTML 小部件。它们使用户能够以快速、简单和有效的方式与数据交互并可视化数据中的变化。

在本文中,我将展示如何设置交互式下拉菜单小部件,以“阿尔茨海默氏病和健康老化数据”CDC 数据库为例进行简单的数据分析。3 下拉菜单部件将建立一个用户友好的菜单,在这里可以选择一个国家,一个分层水平(性别,种族或整体)和一个问题,用户希望看到的信息。我将使用 Plotly 这个交互式图形库来显示存储在数据库中的信息的图形表示。

本文使用的 csv 文件可在 CDC 网站上公开下载。

首先,让我们导入所有需要的库和扩展:

其次,让我们准备好要处理的 cvs 文件:

  • 为了简化输出,我们将只查看数据集中评估的以下 5 个问题:
  1. 身体质量指数(身体质量指数)为 30 或以上的肥胖老年人的百分比。
  2. 在过去的一个月中没有任何闲暇时间体育活动的老年人的百分比。
  3. 终生被诊断患有抑郁症的老年人的百分比。
  4. 被告知患有高血压的老年人中目前正在服药治疗高血压的比例。
  5. 每天吃 3 种或 3 种以上蔬菜的老年人百分比。
  • 不需要的列将被删除。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,让我们设置存储在“阿尔茨海默氏病和健康老化数据”数据库中的信息的图形表示所需的所有函数:

  • 为了简化输出,我们将只关注所有年龄组的数据点。
  • 将只分析 2015 年至 2019 年的可用数据。

函数 plot_healthy_aging_data_gender 采用 2 个字母的状态缩写,3 个数据帧,其中包含制作 Plotly 图形和一个问题所需的信息。如果用户在 dropdown 小部件中指定他们希望看到按性别绘制的数据,将选择该功能。

函数 plot_healthy_aging_data_race 采用 2 个字母的状态缩写,3 个数据帧,其中包含制作 Plotly 图形和一个问题所需的信息。如果用户在 dropdown 小部件中指定他们希望看到按种族绘制的数据,将选择此功能。

函数 plot _ healthy _ aging _ data _ overall 采用 2 个字母的状态缩写,3 个数据帧,其中包含制作 Plotly 图形和一个问题所需的信息。如果用户在 dropdown 小部件中指定他们希望查看按总体分层类别绘制的数据,将选择此功能。

函数 dataset _ analysis _ aging 查询原始数据集,根据种族、性别或整体(所有种族、性别和年龄)分层类别将结果划分为 3 个不同的数据框架。该功能旨在用户选择输入后,提取制作曲线图所需的信息。

如前所述,为了简化输出,我们将只关注所有年龄组的数据点,这些数据点在数据集的“分层 1”列中标记为整体。

函数 dataset_analysis_aging_gender、dataset_analysis_aging_race 和 dataset_analysis_aging _ race 是帮助函数,用于将州、问题和分层类别(性别、种族或总体)的数据集信息传递给 dataset _ analysis _ aging 函数。然后将返回的数据帧传递给相应的分层类别绘图函数。

现在,我们准备设置 3 个下拉菜单小部件,用于“阿尔茨海默氏病和健康老化数据”数据库的数据分析。这将通过编写一个函数来完成,该函数创建一个下拉菜单来选择特定的状态、问题和分层类别,并将这些信息传递到数据集分析函数中以获得特定的输出。

函数 drop down _ menu _ widget _ healthy _ ageing 接受一个与健康老龄化相关的数据集,以及 3 个帮助函数和一个要查询的问题列表。每个助手功能用于控制 UI 界面,以选择特定的状态、问题和分层,即性别、种族或总体数据。

该功能首先返回下拉菜单以选择要分析的状态、问题和分层类别,并且在用户选择输入之后,该功能基于所做的下拉菜单选择返回数据分析。

最后,我们准备调用交互式 drop down _ menu _ widget _ healthy _ age 函数。在初始输入选择后,用户可以继续改变菜单中的输入,以查看不同输入的图形输出,而无需重新运行任何单元。

在 Jupyter 笔记本中运行上面的单元格后,会出现下面显示的下拉菜单。现在可以选择下拉菜单来显示相应的曲线图。下拉菜单演示可以在文章末尾找到。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文使用的 Jupyter 笔记本和数据集可以在 GitHub 找到:https://github.com/drozenshteyn/Jupyter_widgets_dropdown

感谢您的阅读,

月形蝴蝶

注:我使用了 jupyter_to_medium 和 GitHub embeds 的组合来发布这篇文章。

交互式数据可视化

原文:https://towardsdatascience.com/interactive-data-visualization-2c7d62fb3b16?source=collection_archive---------32-----------------------

使用 Altair 创建数据可视化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:作者

数据可视化有助于揭示肉眼无法在表格格式中看到的隐藏数据模式。它有助于理解不同数据点之间的相关性和关联性。不同类型的可视化有助于理解数据集的不同属性。

Python 提供了许多可用于数据可视化的库。每个包都有自己的优点和缺点。这里我们将讨论交互式数据可视化,这只有在极少数 pythons 库中才有可能。

Altair 是一个开源 Python 库,用于创建高度交互和有用的数据可视化。它提供了我们可以创建的各种各样的图表和绘图。

在本文中,我们将探索 Altair 并使用它创建一些可视化。

让我们开始吧…

安装所需的库

我们将从使用 pip 安装来安装 Altair 开始。下面给出的命令将使用 pip 安装 Altair。

pip install altair vega_datasets

导入所需的库

在这一步中,我们将导入创建模型和可视化这些模型所需的所有库。

import altair as alt
from vega_datasets import data

正在加载数据集

在这篇文章中,我们将从织女星数据集著名的数据集’汽车’。在下面给出的代码中,您可以看到我们如何导入数据集。

source = data.cars()

创建图表

现在,我们将从创建一些图表开始,并探索如何创建这些图表。

  1. 散点图
alt.Chart(source).mark_circle(size=60).encode(
    x='Horsepower',
    y='Miles_per_Gallon',
    color='Origin',
    tooltip=['Name', 'Origin', 'Horsepower', 'Miles_per_Gallon']
).interactive()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

散点图(来源:作者)

在这里,您可以清楚地看到,我们在代码中添加了一个工具提示,使该图更具交互性。

2.条形地块

alt.Chart(source).mark_bar().encode(
    y='Origin:N',
    color='Origin:N',
    x='count(Origin):Q'
)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

条形图(来源:作者)

3.组合图表

points = alt.Chart(source).mark_point().encode(
    x='Horsepower:Q',
    y='Miles_per_Gallon:Q',
    color=alt.condition(brush, 'Origin:N', alt.value('lightgray'))
).add_selection(
    brush
)bars = alt.Chart(source).mark_bar().encode(
    y='Origin:N',
    color='Origin:N',
    x='count(Origin):Q'
).transform_filter(
    brush
)
points & bars

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Combo(来源:作者)

正如你在上面的视频中看到的,使用上面的代码创建的图表是高度交互式的。该图同时具有散点图和条形图。

在这里,您可以清楚地看到我们使用 Altair 创建的不同图表和图形。尝试使用不同的数据集,创建不同的可视化效果,并在回复部分告诉我您的意见。

本文是与 Piyush Ingale 合作的。

在你走之前

感谢 的阅读!如果你想与我取得联系,请随时通过 hmix13@gmail.com 联系我或我的 LinkedIn 个人资料 。可以查看我的Github简介针对不同的数据科学项目和包教程。还有,随意探索 我的简介 ,阅读我写过的与数据科学相关的不同文章。

Python 中 Lux 的交互式数据可视化

原文:https://towardsdatascience.com/interactive-data-visualization-with-lux-in-python-94bfcf84d15?source=collection_archive---------28-----------------------

只需点击一下,就可以看到几乎所有的图表

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 JJ 英Unsplash

介绍

数据可视化是数据科学的基本步骤之一。通过可视化数据,我们可以获得洞察力,这可以帮助我们获得新的洞察力。

有时创建一个很好的可视化效果,甚至选择一个适合数据的可视化类型,都需要很长时间。因此,我们需要一个能够自动化这个过程的库。

Lux 是一个 python 库,只需点击一下鼠标,就可以实现数据可视化工作流程的自动化。此外,lux 可以为您的数据选择完美的可视化方式。

在这篇文章中,我将向你介绍力士图书馆。此外,我将向您展示如何使用 python 来实现它。

没有进一步,让我们开始吧!

履行

安装库

你需要做的第一件事就是安装 lux 库。您可以使用 pip 或 conda 来完成此操作。在这种情况下,我将使用 pip 来安装 lux。另外,我启用了 jupyter 笔记本的插件。下面是这样做的代码。

! pip install lux-api 
! jupyter nbextension install --py luxwidget 
! jupyter nbextension enable --py luxwidget

加载数据

安装完库之后,现在可以加载它了。接下来,您需要加载数据。您可以使用任何您喜欢的数据,但现在我将使用来自 lux 库的数据。这些数据基本上描述了美国的大学,包括 SAT 平均分、地区、费用等。这是完成这项工作的代码,

import lux 
import pandas as pd df = pd.read_csv('https://raw.githubusercontent.com/lux-org/lux-datasets/master/data/college.csv') df

当您运行代码时,您不仅会看到数据帧。您还会看到将您从 lux 重定向到可视化的按钮。这是它的预览图,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为您使用所有列进行可视化,所以它会提供几个选项卡供您查看。每个选项卡由不同列的图表组成。这些选项卡是

  • “相关性”选项卡为您提供了散点图之类的图表,直观显示了两个变量之间的关系。
  • distribution 选项卡为您提供了类似直方图的图表,显示了一列的值分布。
  • “发生”选项卡为您提供了类似于分类条形图的图表。

选择列

与任何其他库一样,您可以选择想要可视化的特定列。在这种情况下,我们希望看到 AverageCost 列和 SATAverage 列之间的关系。这是可视化它的代码,

df.intent = ["AverageCost", "SATAverage"]
df

这是代码的预览,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

除了可视化数据之外,它还为您提供了一些增强可视化的建议。您可以看到三个选项卡。

  • “增强”选项卡为您提供增强可视化样式的建议。
  • 过滤器选项卡将过滤显示基于特定条件减少的图表。
  • 概化选项卡将通过移除给定的属性来显示图表。

过滤数据

正如我上面提到的,您可以使用某些条件来过滤数据。我们来看看东南地区有多少大学基于他们的资助模式。下面是实现它的代码,

df.intent = ["Region=Southeast", "FundingModel"] 
df

这是结果,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

导出可视化效果

在您选择列并给出一些条件后,现在您可以从您喜欢的图表范围中进行选择。在可视化块上,您可以点击您喜欢的图表。之后,您可以单击箭头导出它们。这是它的样子,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选择图表后,您可以使用如下导出的属性来访问它,

df.exported

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果您想从列表中选择一个图表,可以使用索引来访问它。下面是这样做的命令,

df.exported[0]

这是它的样子,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

转换为 Matplotlib

现在您想导出图表,但又想将它们转换成另一种类型。幸运的是,lux 可以将您的图表转换为另一种格式,例如 matplotlib。

要将图表转换为 matplotlib 格式,可以使用 to_matplotlib 函数来完成。这是实现这一点的代码,让我们回忆一下我们导出的第一个图表,

如您所见,它显示了 matplotlib 代码。我们可以在我们的环境中运行代码。所以我们试试。

哦不,有一个错误。它说“Set1”对象未定义。要解决这个问题,您可以在对象名称中添加记号。修复后,我们可以看到 matplotlib 格式的图表。这是代码和预览。

干得好!该图表已经在 matplotlib 版本中。

结束语

恭喜你!现在,您已经了解了如何使用 lux 来自动化您的数据可视化工作流。希望对你有用。

如果你对我的文章感兴趣,可以关注我的媒介。还有,如果你有什么问题,可以在 LinkedIn 上联系我。

谢谢你看我的文章!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值