TowardsDataScience 博客中文翻译 2019(三百三十七)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

流形和神经活动:导论

原文:https://towardsdatascience.com/manifolds-and-neural-activity-an-introduction-fd7db814d14a?source=collection_archive---------13-----------------------

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

流形是数学和物理中的重要对象,因为它们允许用更简单的空间来表达和理解更复杂的结构。这是将该理论与神经科学联系起来以理解和解释复杂的神经活动的关键动机。

T he 流形假设陈述了真实世界的数据(图像、神经活动)位于被称为流形的低维空间中,这些流形嵌入在高维空间中。松散流形是局部看起来像欧几里得空间的拓扑空间。为了给流形一个简单的例子,并理解前两个句子,考虑一个球。球体不是欧几里得空间,因为我们不能用直线连接两点,而是需要测地线的概念,但是局部欧几里得几何定律是很好的近似。例如,地球可以近似为一个球体。你不是生活在一个球体上,而是生活在一个平面上。所以我们可以说我们“生活”在一个流形上。我希望这能给术语流形的含义一点直觉。**

流形本身属于拓扑学和微分几何的数学分支。它们存在于任何维度的空间中,但是为了简单起见,为了更直观,我们在这里只考虑三维空间。

在这篇文章中,我不想深入探究它背后的数学,而是探索它在神经科学中的相关性,以及如何利用它从神经活动数据中获得更多见解。如果你对流形的更深入的数学解释感兴趣,你可能会觉得这篇文章很有趣。

为什么我们对神经活动中的流形感兴趣?

最近,神经系统的许多研究正在经历从单个神经元到群体水平的假设和分析的范式转变。大脑中的网络由成千上万的神经元组成。我们可以预期,一个网络的自由度的数量和它的神经元的数量一样大。然而,研究【1】显示了实验证据,表明局部大脑活动被限制在由几个变量跨越的子空间(低维流形)中。

出现的一个关键问题是,除了单独研究每个神经元之外,通过研究这些被记录的神经元群体还能获得什么科学见解。事实上,当它们的活性被平均化时,单个单元通常不显示任何刺激特异性。这就是多重假说的由来。我们希望找到在单个神经元水平上不明显的结构(或特征)。此外,简单地平均许多神经元的响应可能会掩盖重要的信号,因为神经群体在其细胞类型、投射目标等方面通常具有巨大的多样性。【第二】

在计算神经科学中,流形假设认为,潜在的网络连通性限制了神经群体活动的可能模式,并且这些模式被限制在一个低维流形中,该流形由几个独立变量跨越,我们可以称之为“神经模式”【3】盖莱戈等人。艾尔。 进一步说明

“这些神经模式捕获了人口协方差的重要部分。正是这些神经模式的激活,而不是单个神经元的活动,提供了神经动力学和功能的基本构建模块。”

为了识别这些神经模式,我们需要应用一些降维方法来计算高维神经活动的低维表示。

降维背后的直觉

在这里,我不会深入探讨像主成分分析(PCA)这样的特定类型的降维方法,而是会提供一个基于【4】的一般直觉。如果你对 PCA 更深刻的解释感兴趣,请看这篇写得很好的博文

通常,我们对有 D 个测量变量的数据进行降维,并且我们怀疑这些变量可以通过更少数量的“解释性”变量 K 来更好地表示(或理解)。我们如何提取这些解释变量取决于选择的方法。由于人们不能直接观察到这些变量,它们被称为潜在变量。我们试图以描述我们数据的统计特征来结束,并把我们数据的某些方面作为噪声排除。

在神经科学中,变量 D 通常对应于观察到的神经元数量。由于这些神经元跨越了一个基础网络,因此很可能不是相互独立的,可以假设我们只需要一小部分的潜在变量来解释它们的网络活动。下面是一个思考这些潜在变量的好方法:

“潜在变量可以被认为是共同的输入,或者更一般地说,可以被认为是未被观察到的神经元在与被记录的神经元相同的网络中的集体作用。”

我们通常测量的是一个神经元发出的动作电位的时间序列。在神经科学中,这通常被建模为泊松过程。降维的目的是描述不同神经元的放电频率是如何协变的(并排除作为噪声的尖峰变化)。每一个神经元都提供了由潜在变量捕获的同一潜在过程的不同视图。潜在变量定义了一个 K 维空间,表示在群体反应中突出的共享活动模式。

下一部分将提供一个这样的例子,以及我们如何使用这些潜在的属性来建立一个基于神经模式激活的单个神经元活动的生成模型。

神经流形

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

Figure 1: (A) Activity of each recorded neuron is a weighted combination of the time varying activation of the neural modes. (B) Trajectory of time-dependent population activity in the neural space spanned by three recorded neurons (red). This trajectory is mostly confined to the neural manifold which is a plane shown in gray and spanned by the neural modes (green and blue vector). (This Figure is adapted from [3])

如上所述,最近的实验工作表明,神经功能可能建立在我们称为神经模式的特定群体活动模式的激活上,而不是建立在单个神经元的独立调节上。为了估计这些神经模式的数量,我们对记录的群体活动应用了类似 PCA 的降维方法。获得的一组神经模式现在定义了一个神经流形*。这个流形可以被认为是一个表面,它捕获了记录的活动数据中的大部分差异,参见图 1(B)中的灰色超平面。神经模式的时间相关激活被称为它们的潜在动力学。每个神经元的活动被表示为来自所有模式的潜在动力学的加权组合,见图 1 (A)。*

为了让我们刚才说的更清楚一点,把每个神经元想象成一个 N 维状态空间中的一个轴,每个轴对应一个神经元的放电频率。某个时间点的活动对应于该空间中的一个点,神经元活动的时间演化构成了一个轨迹[1]。现在,轨迹(图 1 (B)红线)倾向于被约束到这个状态空间的一个线性子空间(神经流形)而不是在所有方向上自由移动(图 1 (B)灰线)。

每个神经元可以参与一个或多个神经模式,并且神经模式包括群体活动中的大部分神经元。在图 1(B)中,描绘了三个神经元的神经空间(或状态空间)。同样,每个轴代表一个神经元的活动。我们之前提到过,网络连通性限制了群体活动的可能模式,这意味着群体动力学不会探索完整的高维神经空间,而是会保留在低维表面“神经流形”中。在我们的(简单)例子中,这个流形是由两个神经模式 u1u2 跨越的平坦超平面。

神经模式可用于建立实际神经活动的生成模型[3]。我们可以将每个神经模式与一个潜在变量相关联,这样任何时间点的神经活动都是由相应潜在变量加权的神经模式的总和,图 1 (A) [1]。

这些神经模式现在可以用来描述特定任务的神经流形,例如运动皮层[5]。

结论

科学的主要追求是用简单的术语解释复杂的现象。降维使我们能够在群体水平上研究神经元,而不是平均群体反应或单独研究每个神经元。神经模式跨越一个低维流形,其中神经活动受到限制,允许检测网络中的模式。

此外,神经模式及其潜在的动力学提供了对整个大脑许多区域功能的更多了解,这些了解在单个神经元水平上并不明显[【5】](http://A stable, long-term cortical signature underlying consistent behavior)。

尽管如此,在这个研究领域仍有一些悬而未决的问题。例如,神经流形的概念不限于平面。神经流形可能是神经空间内的非线性表面。对于动力学探索神经空间的更大区域的复杂行为,线性方法可能是糟糕的估计,我们需要非线性方法,例如 IsoMap

请注意,本文中讨论的研究集中在与某些特定任务相关的神经流形上。另一个问题是不同的流形如何在神经空间内相互组织。

我希望这篇文章让你对什么是神经流形假说有了第一印象。为了进一步阅读,我推荐我在本文中引用的论文。

参考

[1]“扰乱脉冲神经元网络中的低维活动流形”,e . rnberg,A. Kumar

[2]“概念和技术进步为理论神经科学定义了一个关键时刻”,A. K. Churchland,L. F. Abbott

[3]“运动控制的神经流形”,J. A. Gallego,M. G. Perich,L. E. Miller,S. A.Solla

[4]“大规模神经记录的维数约减”,J. P. Cunningham,B. M. Yu

[5]“一致行为背后的稳定、长期的皮层信号”,J. A. Gallego,M. G. Perich,R. H. Chowdhury,S. A. Solla,L. E. Miller

数据科学中的流形——概述

原文:https://towardsdatascience.com/manifolds-in-data-science-a-brief-overview-2e9dde9437e5?source=collection_archive---------8-----------------------

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

What is this thing?

数据科学需要对数据有深刻的理解。随着越来越多的数据积累,回答以下问题变得更加困难:

我如何以准确且有意义的方式在空间上表示我的数据?

我声称回答这个问题的一个超级有用的步骤是理解什么是流形。*这里有一个好消息:*很可能你已经理解了什么是流形。流形本质上是可视化的,所以日常例子是丰富的。

在本文中,我将:

  1. 解释什么是流形,给出一个概念性的定义。
  2. 在不同的上下文中可视化流形的例子。
  3. 展示流形在数据科学中的应用。

什么是流形?

流形描述了大量的几何曲面。要成为一个流形,有一个重要的规则需要满足。理解这一属性的最好方法是通过例子。流形存在于任何一个维度,但为了简单起见,让我们考虑一个三维空间。

假设有一只小蚂蚁在三维流形上行走。这个流形可以是弯曲的,扭曲的,甚至有洞。规则如下: 从蚂蚁的角度来看,它走到哪里都应该看起来像一个平面

这个规则听起来耳熟吗?如果你正在寻找一个应用程序,我想这是一个我们所有人都可以涉及的;我们生活在一个流形上!球面是三维流形中最简单的例子之一。

流形的例子

下面是一些常见的流形例子。请注意,流形只是这些对象的表面,而不是内部。

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

Basic surfaces that are manifolds.

你能想到是不是流形的曲面吗?这些表面在一些“尖”点会有问题。以下是我首先想到的几个:

  1. 一个立方体。如果你沿着一边走,到了边上,东西就会太尖,看起来就不再像平面了。
  2. 一座山的风景。假设峰顶非常尖,在这一点上,物体看起来不会像平面。
  3. 一个沙漏。假设两半的交点是一个单点,那么这个规则在这里就被打破了。

思考流形的直觉

这些例子的共同主题是它们有些光滑——这意味着没有尖锐的尖峰或边缘。对象的整体形状可以是无定形的,这在描述没有严格边界的数据集时很好。

数据科学中的流形

数据可以来自各种空间。它可以是所有图像的空间,或者来自一个价格和数值范围。这些高维空间具有复杂的表示,并不总是可视化的。然而,数据可能来自由流形表示的特殊子集。

因此,流形可以充当从复杂空间到更简单、更平滑子集的垫脚石。

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

Manifold of handwritten digits as a two-dimensional representation.

分类问题是流形学习的主要例子——我们专门寻找分离两种类型数据的流形。

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

Classification problems involve finding manifolds.

其他时候,我们可能对将数据“分解”到更低的维度感兴趣——考虑从螺旋形流形中采样,并学习如何将它从下面的三维表示展开为二维平面表示。

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

(a) Dataset spatial representation. (b) Smooth surface approximation.

定义流形

不幸的是,流形通常不容易解析定义,大多数几何对象都是如此。机器学习中的许多任务都与学习数据的多种表示有关,然后利用这种表示对剩余空间进行预测。如果你对机器学习的这个分支感兴趣,可以去看看流形学习

结论

看数据对很多人来说是极其满足的,理解数据的几何结构也随之而来。流形是发现数据的基本表面。一旦你有一个流形来描述你的数据,你就可以预测剩余的空间。

感谢阅读!如果能听到你对这篇文章的反馈以及你将来想看到的东西,那将是非常好的!欢迎在下面的评论中写下任何问题。

用随机状态操纵机器学习结果

原文:https://towardsdatascience.com/manipulating-machine-learning-results-with-random-state-2a6f49b31081?source=collection_archive---------3-----------------------

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

Photo by Simon Basler on Unsplash

理解随机状态对模型结果的影响

T 调整超参数、执行正确的特征工程、特征选择等都是构建机器学习模型的数据科学流程的一部分。几个小时花在调整和修改过程的每个部分,以改善我们的模型的结果。

然而,在数据科学中最受欢迎的函数中,有一个参数可以改变,以改变机器学习的结果。

……它与领域知识或您对数据所做的任何工程无关。

随机状态

ML_model(n_estimators=100,max_depth=5,gamma=0,**random_state=0..)**

一个看似无害的论点可能会改变你的结果,但几乎没有任何文章教你如何优化它。通过对训练数据和模型种子的随机排列进行一些操作,任何人都可以人为地改善他们的结果。

在这篇文章中,我想温和地强调一下大多数数据科学项目中经常被忽视的一个组成部分— 随机状态,以及它如何影响我们在机器学习中的模型输出。

那么随机状态是如何影响分类器输出的呢?

为了展示这是如何影响预测结果的,我将使用 Kaggle 著名的泰坦尼克号数据集来预测乘客的存活率。

使用训练数据集,我应用了一些最少的数据清理和特征工程,只是为了获得足够好的数据用于训练。在这个例子中,我将使用 xgboost 分类器模型进行典型的网格搜索交叉验证。

我将使用的培训数据:

利用网格搜索寻找最优的 xgboost 超参数,得到了模型的最佳参数。

基于交叉验证结果,我的最佳性能达到 82.49%,最佳参数为:

'colsample_bytree': 1.0, 'gamma': 0.5, 'max_depth': 4, 'min_child_weight': 1, 'subsample': 0.8

这个过程是许多机器学习项目的主要内容:搜索一系列超参数,以获得最佳的平均交叉验证结果。这时,工作就被认为完成了。

毕竟,交叉验证应该对随机性具有鲁棒性。对吗?

不完全是

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

对于数据科学教程或 Kaggle 内核中的结果展示,笔记本将会就此结束。然而,我想拉回到以前的工作流程,以显示不同随机状态的结果如何不同。

这次让我们在分类器上运行具有 5 种不同随机状态的代码:

让我们也改变交叉验证随机状态:

所有返回的结果都不同。对于 xgboost 分类器和交叉验证分割的 5 种不同的随机状态,网格搜索运行产生 25 种不同的最佳性能结果。

拥有多个结果源于这样一个事实,即我们使用的数据和算法有一个随机的成分会影响输出。

然而,这在数据科学过程中产生了巨大的疑问,因为我们一直在改变我们的模型。

对于我所做的每一个改变,我会比较不同运行的结果来验证改进。例如改变“a”可以提高模型 2%,增加“b”可以进一步提高模型 3%。

随着上面显示的结果的变化,这让我想知道我的特征工程是否真的有助于更好的结果或者这种改进完全是偶然的

也许不同的随机状态会使我的结果比以前更糟。

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

Photo by dylan nolte on Unsplash

我最初的成绩是 82.49%,但 84.84%更高

请注意,在分类器随机状态 4 和分层洗牌随机状态 2 下,我的结果比我最初的运行高出了 84.84%。

那我该展示哪个结果呢?

呈现最好的模型结果是诱人的,因为随机种子是固定的,结果是可重复的。

结果的 2%的改善仅仅归因于不同的随机状态,这似乎是荒谬的。似乎在一个好的日子里,用正确的种子,我们会得到一个更好的结果。

我们应该如何应对这种不确定性?

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

https://xkcd.com/2110/

在数据科学管道中,有许多方法可以解决这个问题。这绝不是一个完整的列表,而只是我在工作中进行的一些实践。

1)从一开始就固定随机状态

对所有事情都承诺一个固定的随机状态,或者更好的是,确定一个全局随机种子,这样随机性就不会发挥作用。将其视为流程中不可改变的变量,而不是可以修补的东西。

或者,

2)使用预测结果作为区间

由于结果在一个范围内会有所不同,因此您可以选择将交叉验证结果报告为一个范围。用不同的种子重复运行,以产生您可以报告的置信区间。人们可以很轻松地说,该模型的性能范围确实在这个范围之内。

3)减少数据分割的不平衡/随机性

减少随机分割对数据的影响的方法之一是确保分割不会对数据的组成产生太大影响。

将数据分层以减少随机性。对数据进行分层可确保训练测试分割/oob 错误/交叉验证的数据在训练和测试集中分别具有相同的存活者/非存活者比率。分割是通过保留每个职业的百分比来完成的,这样可以减少随机洗牌对结果的影响。甚至可以在多列上进行分层。

值得注意的是,尽管数据是随机的,但表现的变化不应太大。

如果精度结果随种子变化很大,这可能意味着模型不够稳健,你应该考虑改进你的方法以更好地拟合数据。大多数情况下这并不重要,但是当边界非常接近时,考虑所有可以用来提高模型性能的变量,包括随机状态,将是很有诱惑力的。

希望这篇文章已经设法强调了随机性如何影响我们的模型,以及减轻其影响的几种方法。

下面是我用过的代码的 github repo ,都可以转载。感谢阅读!

使用 Python 操作熊猫的数据。

原文:https://towardsdatascience.com/manipulating-the-data-with-pandas-using-python-be6c5dfabd47?source=collection_archive---------15-----------------------

让我们用 Python 来计算我的熊猫数据框架的兼职收入。

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

Credits: GeoSpatial Training Services

在开始之前,让我给你介绍一下 Pandas ,Pandas 是一个 python 库,它为 Python 编程语言的数据分析工具提供了高性能、易于使用的数据结构,如系列、数据框和面板。为了使用 pandas 库和它的数据结构,你必须安装并导入它。请参见熊猫库的文档以获得更多更好的理解和安装指南。

计算兼职收入的步骤。

  1. 导入所需的(熊猫)库。
  2. 将日期、工作时间和收入等值存储在数据帧中。
  3. 向现有数据帧添加更多行(更新数据帧的行)。
  4. 计算挣的钱和工作的总时间。
  5. 用日期和挣得的钱绘制条形图。
  6. 包括搜索选项,以便搜索相应的工作日期。
  7. 最后添加工资选项。

让我们开始吧!!!

1。导入所需的(熊猫)库。

在本教程中,我们将只使用 pandas 库来执行以下计算,pandas 库本身将为我们提供计算总和并绘制条形图的选项,您无需导入 matplotlib 来绘制图形,pandas 库将为您提供绘制条形图的选项。这将是非常重要的,以了解如何使用熊猫数据框架绘制条形图。如果你用的是 Google Colab 笔记本,你不需要安装任何熊猫图书馆,只需要导入就可以了。否则,您必须在命令提示符下说 pip install pandas 来手动安装它。别名(pd)的原因是,当我想通过别名使用任何方法时,我不必每次都写给熊猫,我可以改为写 pd.method name。

# Importing pandas library.
import pandas as pd 

2。将日期、工作时间和收入等值存储在数据帧中。

# Creating a data frame df.
df = pd.DataFrame({'Date':['11/05/19', '12/05/19', '19/05/19', '25/05/19', '26/05/19', '1/06/19'],'Time Worked': [3, 3, 4, 3, 3, 4],'Money Earned': [33.94, 33.94, 46, 33.94, 33.94, 46]})# Head displays only the top 5 rows from the data frame.
df.head()

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

Storing the values in a data frame.

在这一步中,我将所有数据分类为数据、工作时间和收入三列。日期栏以日/月/年格式显示工作的日期,它将以字符串形式存储,工作时间以整数形式显示一天内完成的工作总量(小时),收入以整数形式显示一天内收入的总额(加元)。在这里工作一小时,最低工资是 11.51 加元。所有这些只是原始数据,这些数据后来被存储在 pandas DataFrame 中,并被分配给一个变量 df。为此,只需使用“pd。DataFrame”并传入所有数据,通过这样做,熊猫会自动将原始数据转换成 DataFrame。我使用 head()是因为数据框包含 10 行数据,所以如果我打印它们,它们可能会看起来很大并覆盖大部分页面,因此 head()显示数据框中的前 5 行数据。

3。向现有数据帧添加更多行(更新数据帧的行)

在这一步中,我们将学习如何向现有数据框追加或添加更多行,这是一个重要的步骤,因为很多时候您必须通过添加更多行来更新您的数据框,在本例中,我首先创建了一个名为 df2 的新数据框,然后通过将 df2 作为参数传递来调用 append()。您必须像 df.append(df2) (existing)那样将新数据帧附加到现有数据帧。append(新数据帧)),现在在 append 函数中,我们有一些其他参数,如 ignore_index = True,这可以防止数据帧追加新的索引,因此在此示例中,所有索引都是连续的(递增),下一个参数是 sort = False。这是因为我们不想根据索引对数据进行排序,否则我们的数据将完全是一个混合体,您可以通过分别将这些参数的值更改为 False 和 True 来处理这些参数,并注意它们之间的差异。最后,将新的附加数据帧存储到新的变量 df 中。

# Adding more rows
df2 = pd.DataFrame({‘Date’: [‘10/06/19’, ‘12/06/19’, ‘14/06/19’],
                    ‘Time Worked’: [3, 4, 3],
                    ‘Money Earned’: [33.94, 46, 33.94]})
df2

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

Storing the values in a new data frame df2

# Appending the rows of the old data frame to the new data frame.df = df.append(df2, ignore_index=True, sort = False)
df.head()

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

Appending the rows of the old data frame to the new data frame.

4。计算挣得的钱和总工作时间的总和

这一步非常简单,因为我们只需获得“挣得的钱”和“工作的时间”两列的总和。要做到这一点,您只需使用 sum()即可,它将返回这两列中所有数据的总和。我只是对 Total_earnings 使用 round()来获得精确的值。确保在 df 中传递正确的列名,因为如果列名不匹配,就会给你带来麻烦。最后,我以可读性更好的方式打印结果。

Total_earnings = df[‘Money Earned’].sum()
Total_time = df[‘Time Worked’].sum()print(“You have earned total of ====>” ,round(Total_earnings),“CAD”)
print(“ — — — — — — — — — — — — — — — — — — — — — — — — — — — ”)
print(“You have worked for a total of ====>”, Total_time, “hours”)

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

Printing the result of total earnings and total time worked.

5。绘制总持续时间与收入的条形图

正如我前面提到的,要绘制一个图形,您不必导入 matplot 库,pandas 有一个 plot(),它将在一定程度上帮助您绘制一个图形。我已经使用了 plot()并将“日期”和“赚的钱”作为 x 和 y 值传递(因为你需要 x 和 y 值来绘制一个图形;)我想要一个条形图,所以我用了条形图,你也可以使用线,分散到关键字种类。然后我们得到一个漂亮的条形图,其中所有的值都是根据我们的期望绘制的。

# Plotting a bar graph using pandas library.
df.plot(x =’Date’, y=’Money Earned’, kind = ‘bar’)

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

Plotting the graph of Date vs Money Earned.

上面显示的不是绘制图表的最佳方式,但是我已经向你们展示了熊猫库可以帮助你们绘制图表,有时使用这种方法很方便,因为数据和计算较少,你所要做的就是用 x 和 y 值绘制图表。

6。包括搜索选项,以便搜索相应的工作日期。

这是一个额外的步骤,只是为了给它一种感觉,就像我加入了一些功能的数据库,比如搜索选项。在实时项目中,这是一个方便的功能,你经常需要搜索数据,但你不能手动搜索,所以在下面代码片段的帮助下,你就可以完成任务了。在这个例子中,我使用 str.contains()进行搜索操作,并将数据作为参数传递,现在数据是一个变量,包含用户输入的要搜索的数据。输入日期时,str.contains()会搜索输入的日期,然后显示日期和数据框中的相应值。这将有助于当你想搜索一个特定的数据,并获得时间和金钱,你可以只输入日期,并得到结果快,而不是手动寻找所需的日期。

# Including a search option.
date = input(“Enter the date you want to search ===> “)
df[df[‘Date’].str.contains(date)]

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

The result of the search option.

7。最后添加工资选项

这更像是一个可选(奖金)步骤,因为这将为输入的数据生成工资,这不是一个行业级工资生成器,而是一个简单的工资生成器,具有不同的功能和打印报表。逻辑非常简单,我所做的就是将姓名、小时数和费率作为用户输入,然后将费率和小时数相乘,并将它们存储在 total_money 中,并将其封装在一个函数中。

# Function payroll contains calculation of total money.
def payroll():
 name = input(“Enter the name of the employee: ==> “)
 hours = int(input(“Enter the hours worked by the employee ==>“))
 rate = float(input(“Enter the pay rate for one hour ==> “)) total_money = hours * rate print(“The total money earned by “, name, “for working “, hours,  “hours”, “is ===> “, round(total_money), “CAD”)

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

The result of the payroll function.

因此,这就是如何使用 pandas 数据框和 python 计算兼职收入的方法。我知道这很容易理解,因为我已经尽可能多地解释了代码,剩下的你可以自己练习。如果你对熊猫图书馆知之甚少,这是一个好的开始,这些是你应该唾手可得的一些基本方法。我就讲到这里,让你们练习代码。如果你有任何疑问,请在评论区告诉我,或者给 tanunprabhu95@gmail.com发邮件让我知道你的问题,我一定会解决你的问题。祝你过得愉快!!!!

在人工智能定义的自动化的新时代,公司会蓬勃发展还是勉强生存?

原文:https://towardsdatascience.com/manufacturing-industry-reshuffle-will-companies-thrive-or-barely-survive-in-the-new-era-of-aa06a3cade5c?source=collection_archive---------29-----------------------

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

Photo by Rob Lambert on Unsplash

先前我们讨论了人工智能如何使机器人执行过去无法完成的任务。具体来说,AI 机器人在三大领域实现了突破。但会对目前制造业的格局产生什么影响呢?谁将能够抓住新技术所带来的机遇?哪些公司将面临前所未有的挑战?

人工智能机器人将如何颠覆制造业?

破坏性创新是由哈佛商学院教授克莱顿·克里斯滕森提出的。该理论的中心思想是:行业中的现有参与者一般选择专注于“持续创新”,以改善现有客户的现有产品和服务。这些客户通常是那些产生最多利润的人。

此时,一些资源较少的小公司就会抓住机会,瞄准被忽视的市场需求,站稳脚跟。破坏性创新分为两种类型:低级市场创新新市场创新

低层次的市场创新(如数码摄影)

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

Photo by Jon Tyson on Unsplash

早期的数码相机分辨率差,快门延迟长。然而,随着数码摄影质量和分辨率的提高,数码相机已经逐渐从低端市场走向主流市场。

具有讽刺意味的是,尽管柯达开发了数码相机,但最终还是被新技术淘汰了。原因是柯达不可能放弃该公司三分之二的胶片市场份额。这就是“创新的困境”。尽管目睹了新技术的威胁,但由于现有的公司结构和战略,公司无法应对。

新市场创新(如电话)

新市场创新指公司通过瞄准现有公司不服务的客户来进入市场。比如电话刚问世的时候,只能用于短距离的本地通信。当时电报行业的领头羊西联电讯拒绝购买发明者贝尔的专利,因为该公司最赚钱的业务是长途电报市场。当时,短距离通信甚至不被认为是一个市场。不幸的是,他们无法预见未来无处不在的电话通讯。

AI 机器人带来的正是新市场的 D 颠覆性创新

汽车和电子制造业目前占工业机械臂出货量的 60%。这就是 FANUC、ABB、库卡和安川等传统机器人公司将大部分资源用于“持续创新”的原因他们专注于自己擅长的领域和主要客户的需求:提高速度和精度

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

Comparison of traditional and AI robot innovation strategies (source: Bastiane Huang)

他们忽略了新的市场和应用,包括仓储、食品和制造的配套流程。这些行业的客户不需要如此高速、高精度的工作。他们需要的是灵活性、灵巧性,以及机器人学习识别和处理各种部件的能力

感知到这些未满足的需求,新的人工智能机器人创业公司开始将人工智能应用于机器人。这些公司开始进入隐蔽的新市场,如配套、包装和仓储。

Source: OSARO

有趣的是,这些创业公司很多都不生产自己的机械臂。相反,他们专注于开发机器学习模型、机器人视觉感知和控制软件。因此,他们与现有的机器人手臂制造商合作,提供硬件支持。你可能会假设,即使这些机器人公司不追求 AI 创新,它们也不会被淘汰,因为自动化仍然需要硬件供应。

然而,这忽略了一些事实:

首先,很少有机器人公司已经发现了商机,并开始与这些初创公司合作或建立自己的人工智能团队。由于他们的领先,这些公司可以在以前没有服务的市场建立客户基础,并领先于他们的竞争对手。

其次,随着 AI 的采用越来越多,产业链中最有价值的组件将逐渐从硬件转移到软件和数据。我们已经可以从自动驾驶汽车的发展趋势中看出这一点。一旦无人驾驶汽车变得高度自主,最赚钱的组件将掌握在特斯拉、谷歌和其他控制机器学习模型和自动驾驶数据的公司手中。

这就是传统汽车制造商高度警惕的原因。汽车制造商要么积极参与并购,要么与硅谷软件人工智能初创公司合作。相比之下,机械臂制造商似乎不像汽车制造商那样对颠覆性的人工智能技术做出反应。

机器人制造商、制造商和人工智能初创公司:谁能在人工智能时代巩固地位?

与汽车行业的同行相比,大多数机器人公司似乎对人工智能的反应不够快。即使他们真的投资人工智能,他们仍将面临与柯达相同的困境。组织的重建和战略的制定,以尽量减少转型的负面影响,将考验每个公司管理层的判断和决心。

另一方面,开发新市场极具挑战性。创业公司仍然需要与制造商密切合作,开发更好地满足客户需求的解决方案。制造过程甚至比仓储更复杂。创业公司不一定像理解人工智能和机器人一样理解制造过程。这给了制造商一个成长和转型的绝佳机会!

如果制造商能够率先与这些新的人工智能创业公司合作,他们将能够通过流程自动化提高生产效率和质量。他们还可以满足少量但高度定制的客户需求,这在过去是很难实现的。这一点尤为重要,因为制造商长期以来一直受困于大规模生产和残酷的定价竞争。

制造中心应该利用他们现有的优势和制造过程中的知识来发展人工智能,最终成为下一个人工智能中心。

与人工智能应用相对成熟的零售或消费网络等其他行业相比,人工智能在制造业的发展仍处于萌芽状态。传统制造商仍然有可能利用他们的优势,包括对应用案例的更好理解和对数据的掌握,来巩固在自动化新时代的地位!

如果你想看更多这样的文章,请点击这里!

Bastiane Huang 是 OSARO 的产品经理,OSARO 是一家总部位于旧金山的初创公司,致力于开发软件定义的机器人。她曾在亚马逊的 Alexa 小组和哈佛商业评论以及该大学的未来工作倡议中工作。她写关于人工智能、机器人和产品管理的文章。跟着她到这里 。

Map-Reduce:梯度下降

原文:https://towardsdatascience.com/map-reduce-gradient-descent-276e6ed0b002?source=collection_archive---------21-----------------------

使用 PySpark 和 vanilla Python

一些统计模型𝑓(𝑥通过优化依赖于一组参数θ的损失函数𝐿(θ来学习。有几种方法可以找到损失函数的最佳θ,其中一种方法是按照梯度迭代更新:

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

然后,计算更新:

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

因为我们假设数据点之间是独立的,所以梯度变成了求和:

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

其中𝐿𝑖是𝑖-th 数据点的损失函数。

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

Image by Gerd Altmann from Pixabay

以统计模型𝑓(𝑥)=𝑏0+𝑏1𝑥和损失函数𝐿(θ)=(𝑓(𝑥)−𝑦为例)。如果我们有一组三个数据点𝐷={(𝑥=1,𝑦=2),(𝑥=−2,𝑦=−1),(𝑥=4,𝑦=3)}

那么它们中每一个的损失函数是

𝐿1=(𝑏0+𝑏1−2)、𝐿2=(𝑏0−2𝑏1+1)和𝐿3=(𝑏0+4𝑏1−3)与

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

如果我们从𝑏1=1 𝑏0=0 的解决方案开始,那么梯度是:

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

积累后会产生

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

现在,我们创建一个函数,它将接收参数 b 和一个数据点 x 作为列表,并返回该数据点的预测值(y)。

Ex: f_linear([0, 1], [1]) will give an output of 1

我们定义一个接收预测 y 和实际 y 并返回它们之间的平方误差的函数。

Ex: L(1, 1) will give an output of 0

函数 gf_linear(f,b,x,y)将返回具有参数 b 的函数 f 相对于平方损失函数的梯度,在 x 和实际结果 y 处评估。此函数应返回每个元素𝑗对应于相对于𝑏𝑗和𝑗={0,1,…,𝑝}.的梯度的向量

Ex: x = [1], y = 2, b = [0, 1], gf_linear(f_linear, b, x, y) will give an output of [-2,-2]

地图缩小:

我们开发了一个生成值的地图缩减作业,因此该值的第一个元素是所有数据的平均损失函数。我们将映射函数实现为map_mse(f, b, L, xy),其中f是函数b是函数的参数L是损失函数xy是数据。假设数据将以 RDD 的形式出现,其中每个元素的格式如下:

[x, y]其中x是列表,y是标量

Ex:rdd _ data . map(lambda x:map _ MSE(f _ linear,[0,0,0],L,x))。collect()会给出一个输出为:[[1,[9,1]],[1,[16,1]],[1,[0.0,1]],[1,[0,1]]。这里 key 是 1,b=[0,0,0],我们从 rdd_data 得到 x。map 的输出是每个数据点的键和值。

现在,我们创建一个 reduce 作业,它接收前一个 reduce(或 map)的两个值,并适当地合并它们。在 reduce 作业结束时,值的第一个元素是均方误差。

例如: rdd_data。
map(lambda x:map _ MSE(f _ linear,[0,0,0],L,x))。
reduceByKey(reduce_mse)。first()[1][0]会给我们一个 6.25 的均方误差。(x 和 y 值请遵循 rdd_data)

因此,现在我们将计算数据模型的累积梯度。我们将定义一个映射函数map_gradient(f, gf, b, xy),它将接收一个函数f,它的梯度gf,它的参数b,以及一个数据点xy = [x, y]。此外,我们将定义一个函数reduce_gradient(v1, v2)来适当地组合这两个值。

Ex:rdd _ data . map(lambda xy:map _ gradient(f _ linear,gf_linear,[0,0,0],xy))。reduceByKey(reduce_gradient)。first()[1]将给出[-14.0,-30.0,-20.0]的输出

现在,为了得到一个优化的值,我们运行下面的代码,使 MSE 每次都减少。

感谢你的阅读,我希望你能学会或至少理解梯度下降是如何工作的,以及如何使用 Map-Reduce 实现它。

Linkedin:

[## Harsh Darji -特约撰稿人- Medium | LinkedIn

我是一名数据科学爱好者,追求应用高级分析,建立大数据分析工具…

www.linkedin.com](https://www.linkedin.com/in/harshdarji23/)

GitHub:

[## harshdarji23 -概述

在 GitHub 上注册您自己的个人资料,这是托管代码、管理项目和与 40…

github.com](https://github.com/harshdarji23)

绘制争议地图:堕胎辩论

原文:https://towardsdatascience.com/mapping-controversies-abortion-debate-7235029fc6d9?source=collection_archive---------21-----------------------

维基百科&辩论的竞技场

安-索菲·索尔森,杰佩·卡姆斯特鲁普,拉斯穆斯·德·尼尔加德和约翰内斯·范登赫维尔。

自从堕胎成为可能以来,围绕这个话题的讨论就一直存在。虽然在现实世界中很容易发现外界的争议,但我们还是去了维基百科,调查一个追求中立的在线百科全书会如何呈现它。

通过使用数字方法和收集在线数据,我们调查了堕胎辩论如何在维基百科的舞台上展开。我们的发现也许向我们展示了当维基百科试图解决社会中有争议的话题时,它和英美世界是如何运作的。

我们所做的:

首先,我们收集了绘制争议地图所需的数据。我们使用了几个 python 脚本,然后对数据进行了清理和排序,这样就可以构建可视化了。这里我们应用了几个不同的程序和应用程序。

这些脚本要么使用维基百科 API,因此向维基百科数据库“请求”信息,然后返回这些信息,要么它们抓取和爬行维基百科。这个过程包括脚本“浏览”有问题的页面,从中提取信息,如文本或链接,并移动到其他连接的页面。

在这样做的时候,我们选择了维基百科类别 堕胎辩论 作为种子,或者“起源页面”,深度为 2,从而移动到所有连接到这个的页面,然后所有的页面链接到那些。这给了我们种子类别的成员,从这个和他们的子类别链接的子类别,总共 204 个维基百科页面。

然后使用其他脚本和程序的组合来处理我们的数据集,如 Gephi、CorTexT、alteryx 和 Tableau。

这为我们的可视化产生了 5 种类型的数据;

  1. 显示链接到其他页面的页面的数据。
  2. 特定页面上特定单词的出现。
  3. 页面中的文本。
  4. 不同的编辑修改不同的页面。
  5. 特定用户在特定时间对页面进行的修订或编辑。

产生的 204 个维基百科页面的数据集然后用两个不同的 python 脚本抓取,生成带有全文的文件。一个用于通过 CorTexT 进行语义分析,而另一个用于查询用户指定的关键字。然后,我们通过 API 检索修订历史,以生成所选页面的两条时间线。

最后,我们抓取了维基百科的 HTML,生成了一个由文本链接连接的 204 页的网络,这意味着维基百科文章的主要文本。然后,这与关键字搜索相结合,生成了 11 个衍生网络,按笔记大小显示了选定的问题。

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

Workflow of our process of data harvesting and construction of visualizations, for a larger size click here.

针,遇到草堆:

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

Our network, where we sat down and looked for clusters in the network. We identified 4 distinct clusters, but also a middle that did not separate easily. For a larger size, click here.

我们开始使用开源应用程序把从堕胎辩论类别收集来的维基页面排列成一个可视网络。这给了我们一张由两种截然不同的东西组成的地图。点是维基页面的可视化,称为节点。第二件事是连接这些节点的线。这些线表示节点是相连的——在这张地图上,这些线显示了不同的维基页面如何在维基页面的文本中相互链接。在我们的术语中,这些线被称为边。

为了搞清楚这个网络,我们使用了一种力导向的放置算法,称为 ForceAtlas2 。该算法给数据点和它们的连接一种空间感,我们需要这种空间感来直观地分析网络。ForceAtlas2 的工作原理是给边和节点一种推拉效应,其中边的功能就像一种弹簧,将节点绑定在一起,这些节点相互排斥。这样,具有许多共同边的节点彼此更接近。因此,该算法将节点展开,并使得通过 Venturini 等人(Venturini 等人)陈述的 4 条规则对网络进行空间分析成为可能。铝:2015):

1:哪些是主要的集群?

2:分隔它们的主要结构孔是哪些?

3:每个集群中有哪些子集群?

4:分隔它们的是哪些较小的结构孔?

然而,我们的问题是,我们的网络中几乎没有结构上的漏洞——它更像一只海星,而不是中间有洞的相连的集群。因此,我们最终在我们看到的“海星”的明显手臂周围画了圈。

这给了我们*爱尔兰、加拿大、宗教、美国法律体系——*但它留给我们一个大中心,我们不知道如何分析。

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

Map of the category of Abortion debate on Wikipedia, and its subcategories with a depth of two. This map shows the network after the use of the modularity tool in gephi. For a larger size, click here.

为了尝试理解这只海星,我们使用了 Gephi 内置的一个工具,叫做模块化工具。模块化是一种尝试将大集群分成更小的子集群的方式,通过数学定位大网络如何划分成更小的组,彼此之间有更多的内部连接。这些子网络可以指示更大网络内的某些社区。

简而言之,它试图让计算机在理解集群时做一部分分析工作。这是通过用不同的颜色给不同的子簇着色来实现的。

模块化工具给了我们与我们自己挑选的集群大致相同的集群。但它也给了我们两个新的集群,在参考了维基百科的文章后,我们将其命名为权利边缘*。*

模块化地图也迫使我们提出另一个观点— *桥。*桥是连接集群的节点——它们是维基百科上通过链接不同主题来连接两者的页面的表示。模块化工具简单地为子集群分配一个它最有可能找到的桥接节点。同样地,堕胎节点成为美国法律系统的一部分,尽管它并不在附近。这可能不是最好的情况,一旦你手动查看维基百科上的页面及其内容。

但是我们的新聚类也许也给了我们一些关于维基百科作为媒介的见解——争论集中在英美世界,但也在法律方面。也许网络也向我们展示了英语维基百科如何对堕胎辩论的争议进行排序,或者用 Marres & Moats (Marres,Nortje & David Moats: 2015)的话说:

……我们可以从关注知识内容和争议中的政治利益之间的关系(这是早期 sts 的目标)扩展这种对称方法,以包括媒介和内容之间的关系。

本质上;我们看到媒体,这里是维基百科,是如何组织讨论有争议的事情的。

地区、宗教和法规:

为了更好地区分我们的聚类,我们搜索了特定的关键词,看看这些关键词是否在文章语料库的某些部分使用得更多。请注意,下面的网络是上面网络的循环版本。

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

Prevalence of regional notions shown by size.

首先,我们调查了在不同地区开展的主题。我们仔细观察了几个英语国家的流行情况。通过对国家术语进行关键字搜索,并在对这些术语进行分组(即“爱尔兰人”、“爱尔兰人”和“爱尔兰人”)时,我们看到两个地理聚类(加拿大爱尔兰),与模块化工具得出的聚类密切相关。我们进一步看到,美国的观念严重影响了网络。

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

Prevalence of religious notions shown by size.

我们发现人们对绿色集群很感兴趣,这是使用模块化工具的结果。为了探索这一点,我们对伊斯兰教、犹太教、基督教和天主教进行了关键词搜索。每一个都是通过搜索包含该信仰的几个词(即“穆斯林”和“伊斯兰”)来构建的。通过比较这些,我们都看到所有的宗教彼此之间有很大的关联,大多数都出现在左下方,同时也看到了它们的差异,如天主教更多地出现在“爱尔兰”部分。

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

Prevalence of different juridical terms shown by size.

在调查网络时,我们注意到很大一部分链接页面都是关于法庭案件的。因此,我们决定调查这个话题对辩论的影响程度。我们看到“法律”严重影响了整个辩论,而“法庭案例”大多位于左上角,大多数位于橙色群集内。最有趣的也许是禁止和管制之间的区别(两者都由动词和名词组成)。我们看到禁酒令在“宗教”绿色集群中更加突出。这可能是因为宗教团体更倾向于谈论禁止堕胎,而监管可能更像是一个法律话题。由于一些集群也有地理上的相似性(如上所述),这里的差异也可能是由于文化或语言的差异。

连通性:单行道还是双行道?

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

A visualization showing the degree of the graphs in two way — in degree and out degree. For a larger size, click here.

这两张地图展示了维基百科的链接是如何作为一种等级体系运作的。维基百科上的一些文章,如 罗伊诉韦德 在两个网络中都很大。在 Roe 诉 Wade 一案中,两个地图中的这种表述是其历史和法律分歧的产物。在美国,如果不联系到 1973 年美国最高法院的案例,讨论堕胎几乎是不可能的。其后果今天仍在政界和司法界继续。

但是更有趣的是那些在一张地图上很大并且可见,但是在另一张地图上却看不见的。堕胎联系紧密,但这在维基百科的结构方式和我们收集数据的方式上是有意义的。几乎所有关于堕胎辩论的网页,以及它的子分类都会链接到关于堕胎的文章。堕胎的文章本身主要读起来像是一个医疗流程及其与历史和宗教实践的关系。文章很少用在辩论上,辩论有自己的文章。

一些链接不太好,但包含其他页面链接的页面是像 【美国】特纳日记Eugen Relgis和各种关于围绕堕胎主题的游行的文章。因此,有一个大的出度而没有一个大的入度可能会告诉我们,所讨论的节点位于网络的边缘。有些联系甚至可能是试图获得更多的合法性,或者是效仿拉图尔,试图调解自己在争议中的立场。也许特别是如果用户群是非常独特的一篇文章?

语义展开海星:

我们利用 CorTexT.net 网站进行了一系列不同的语义分析。该网站是由两个法国政府机构资助的 LISIS 研究单位的在线平台——IFRIS 和 INRA 。CorTexT 是一个有趣的工具,因为它让我们通过一种算法来运行我们的数字电子表格,这种算法对这些电子表格的内容进行语义分析。这让我们有机会从维基百科中搜集大量的文本,然后将它转化为常用短语的网络。

我们对维基百科堕胎辩论类别中的所有文章页面都做了这样的处理,结果地图如下。

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

A map of the top 100 phrases and words in the Wikipedia category of abortion debate. Made with CorTexT. For a larger size, click here.

这张地图证实了我们的发现,即美国司法系统在文章描述堕胎辩论的方式中占据显著地位。这可能是一个迹象,表明这个有争议的话题是如何通过法律体系及其决策方式来处理的?显然,美国的制度似乎就是这样运作的。司法的分量使其他形式黯然失色,这些形式可能是处理有争议话题的途径,如宗教或政治,它们在这种关系中发挥的作用较小。

这张地图还缺少一些东西——争议。或者说,它没有表现出来。也许这告诉我们一些关于维基百科辩论结构的事情——对用户之间争议的处理隐藏在文章之外的某个地方,媒体宁愿避开互联网上辩论者的混乱信息来源?我们必须更深入地了解维基百科页面的世界,才能找到这场斗争。

语义映射集群:

下面的可视化是三个图的合成,基本聚类的所有衍生物,从整个网络中移除,聚类中的文章页面的语义分析,以及文章的谈话页面的语义分析。语义分析是通过 CorTexT 完成的。

权限-群集:

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

Composite of graphs from the Rights cluster. Notice how much of the debate surrounding the production of the article happens in the Talk pages, and how these are often refering to Wikipedias policies. For a larger size, click here.

爱尔兰集群:

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

Composite of graphs from the Irish cluster. Here a discussion on the representation of the relationship between the Republic of Ireland and Northern Ireland is done in the articles. A reflection on another controversial issue, that is present because of the geographical nature of the articles. For larger size, click here.

边缘集群:

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

Composite of graphs from the Fringe cluster. Here we also see that, in the analysis of the articles, there are very few bridges between the different clusters. Perhaps a sign that this cluster should be investigated? Maybe a reflection on how well the modularity tool produced a cluster where the contents of it form a community — here it clearly lumped different communities together. For larger size, click here.

加拿大集群:

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

Composite of graphs from the Canadian cluster. These graphs are interesting in that they display nothing like that looks like a controversy. What has been mapped here is everyday Wikipedia editing of articles. Quite interesting, when one thinks of the subject matter and Canadas geographical connection to America. For larger size, click here.

宗教和伦理集群:

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

Composite of graphs from the Religious & Ethical cluster. Here the discussion on the Talk pages is about certain denominations of christianity — especially The Church of the Latter Day Saints. For a larger size, click here.

美国法律体系集群:

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

Composite of graphs from the American Legal System cluster. Once again, we see the use of Wikipedias policies to filter out views, that are controversial in the articles of the online enyclopedia. Also interesting here, is the fact that all discussion is about judicial and political topics. It is a very specific way of treating a complex subject. For larger size, click here.

对我们来说,很明显,文章和谈话页面的单独语义分析给了我们一个媒体技术效果的概述,这是 Marres 和 Moats (Marres,Nortje & David Moats 2015: 6)所讨论的。

它变成了一张地图,不仅是用户和他们的不同意见的地图,也是这些不同意见只能在维基百科的特定空间里使用的地图。对话页面是一种后端,尽管它是公开可见的——你必须寻找它才能使用它。

这种布置作为物品的一种过滤器。由于维基百科的政策而被认为有问题的内容被隔离到谈话页面的空间中,以便成为文章的一部分,或者被简单地丢弃并最终在谈话部分存档。所以我们也看到了我们在堕胎辩论类文章的语义分析图上没有看到的。原因很简单,由于维基百科的内部运作,争议已经以某种方式被过滤掉了。

这种在谈话页中的过滤在边缘、爱尔兰和美国法律体系群中非常明显。在这里,我们在所有这些地图中都有一个大型语义集群,涉及维基百科在编辑中的良好行为政策——这是维基百科上处理分歧的明显方式之一。

对边缘集群的分析也强调了对模块化工具的批判。它似乎将几个不同的文章社区结合在一起,而这一簇簇支离破碎的主题不容易连接起来。模块化工具看起来并不是一个完美的工具,但在批判性使用时仍然非常有用。

维基百科用户,以及如何映射他们:

这张二分图显示了编辑用户和维基百科文章之间的关系。通过以这种方式产生我们的数据,一些有趣的事情出现了。

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

A bipartite graph showing the relationships between individual users and Wikipedia articles. Users are represented by the red nodes, while the green nodes are Wikipedia articles. Size indicates the level of activity, while the thickness of the edges reflect the amount of times a users has edited one specific article. Based on user revision history data since 2001 from Wikipedia. For a larger size, click here.

例如,右下角的集群是一个主要由爱尔兰用户组成的集群,他们编辑与爱尔兰堕胎法相关的文章。这突出了某些文章编辑的地理性质。2018 年,爱尔兰堕胎法出现在媒体上,因为围绕这些法律的改变举行了全民公决。这可能产生了更多来自当地爱尔兰维基人的与这些页面的互动,他们想在这个展开的讨论中扩展文章。

然后是中间的大集群,诸如堕胎辩论*、反堕胎暴力美国反堕胎运动的周围文章显示大量用户在大集群中的许多不同页面上编辑。*

最有趣的是我们也开始在以前的网络上看到的——学位地图。这些页面中的许多在以前看起来并不重要,但是正如我们所看到的,人们对编辑它们有很大的兴趣。尤其是像 詹姆斯·奥基夫白人种族灭绝阴谋论 这样的页面在这个地图上很有意思。这些页面有大量的维基人,他们只编辑网络中的这些特定文章。这些网页是有趣的异常现象——它们在网络中并没有突出的文章,但是它们吸引了大量的活动。这张地图上许多较大的绿色节点都可以这么说。在用户数据进入我们的地图之前,它们中的大多数并不突出。这是争议的标志吗?有些文章确实突出了有争议的话题和人物。也许这值得深入研究一下。

堕胎辩论和白人种族灭绝的阴谋论?

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

A look into the behaviour and activity of the Wikipedia users editing the Wikipedia article “White Genocide Conspiracy Theory”. For a larger size, click here.

当我们冒险调查编辑白人种族灭绝阴谋论文章的特定维基人时,一张争议话题的地图出现了。这些用户似乎在文章和聊天页面的海洋中航行,在那里,似乎处于永无止境的辩论状态的主题被描述并被制作成一种百科全书式的知识。

许多我们认为是过去几年互联网战场的文章。 Gamergate 争议Alt-rightMe Too movement 的文章都是重剪辑发生的地方。

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

A screenshot of the mainpage of the Gamergate controversy talk pages. Here you can see the different policies being enforced. This article is labelled as controversial and therefore comes with additional scrutiny and sanctions.

这让我们看到了维基百科的温和一面。显而易见,维基百科的政策,如 中立观点原创研究 正在迅速成为我们如何看待文章中争议的经典。这些政策在讨论中被用作武器——尤其是在有争议的讨论页面中。这些规定是摒弃不同意见的方式,或者是压制对文章措辞权威的质疑。

但是这当然没有向我们展示,用户是如何参与有争议的讨论的。他们是版主还是有问题的编辑?进入单个文章的讨论页面并绘制单个用户的评论会给我们一个概览,如果我们走这条路的话,这可能是一条追求的途径。

对于我们的使用来说,可以说这些用户几乎都与大量非常有争议的页面相关——在某种程度上。从这个意义上来说,这是维基百科上意见战场的地图——从文章和他们的谈话页面到管理员的公告栏。互联网上最大的百科全书关于什么是事实的元讨论是通过遵守严格的行为规则并积极执行这些规则来安排的。

一段时间以来的维基百科用户:

到目前为止,我们已经看到用户如何以不同的方式参与不同的主题。上面我们看到了用户在不同的页面上有不同的参与度。下面我们将概述他们是如何随着时间的推移做到这一点的,以及我们是如何绘制的。通过将时间变量引入等式,我们可以看到不同的页面或主题在不同的时间是如何突出的。

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

Timelines for 13 specific pages, picked by us. Made in Tableau. For a larger size, click here.

上面我们看到了 13 个不同的页面,考虑到随着时间的推移修改(或编辑)的数量。所有的网页都被发现是重要的,要么作为一个集群的中心,要么通过我们的其他可视化。

我们注意到的第一件事是“罗伊诉韦德案”页面的大部分内容完全盖过了其他页面,从而强调了我们之前的想法,即这是堕胎辩论中的一个核心角色。从修订量(节点大小)和独特用户参与度(线条粗细)来看都是如此。

接下来我们要强调的是,我们看到了一种模式,即页面在创建后的最初几年(标为“出生”)会有更多的活动,例外情况是“堕胎法”和“堕胎辩论”页面,它们的活动似乎会随着时间的推移而保持不变。

这可能表明,如果一个页面在第一年后出现活动上升,这要么是因为该主题突然变得有争议,要么是因为随后包含的新事件。我们看到有两页展示了这种行为,即“白人种族灭绝阴谋论”和“爱尔兰宪法第八修正案”。调查第一个提到的页面,我们看到南非事件的迹象开始了一场跨越大西洋到唐纳德·特朗普的争端,然后进一步传播到阴谋论的页面。

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

Does the genocide of white people originate in South Africa? According to Wikipedia, it certainly travels through the country — invoking the character of President Trump on the way.

在下一节中,我们将进一步探究爱尔兰案例中价格上涨的可能原因。

我们的爱尔兰问题:

我们想通过维基百科页面上对爱尔兰宪法第八修正案(T0)和第三十六修正案(T3)的编辑时间线可视化来说明的一点是,它们都经历了相同的编辑过程。所有四个图表在相同的月份有相似的峰值。正如我们上面的大图显示的,一个大的尖峰“在生命的后期”表明了维基百科之外的改变,但是第 36 次修正是在修订和编辑发生前几个月才创建的。

虽然第 36 修正案是 2018 年 1 月 18 日创建的新维基百科页面,但我们可以看到修订量的峰值和参与编辑的独立用户是如何按时间段连接的。在第八修正案的编辑历史的可视化上也可以看到类似的趋势。

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

Screenshot from the Wikipedia article page about The Thirty-sixth Amendment of the Constitution of Ireland.

虽然我们从阅读爱尔兰宪法第八修正案的内容中知道,它禁止使用堕胎,而第三十六修正案为必要时绕过第八修正案提供了可能性。

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

Revision history of the Wikipedia page concerning the Eighth Amendment of the Constitution of Ireland.

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

Revision history of the Wikipedia page concerning Thirty-sixth Amendment of the Constitution of Ireland.

这两个维基百科页面的内容解释了这两个页面之间的联系,以及同时修订这两个页面的必要性。我们在编辑社区中从独特的用户活动中看到的类似峰值显示了这些变化的相关性。我们认为两个页面上独特编辑的数量是爱尔兰宪法两个修正案政治变化的一个指标。

上面,我们看了维基百科用户随着时间的推移编辑的更一般的方式。现在,我们深入探讨爱尔兰集群的部分内容的编辑。我们想探究维基百科用户是否会在全球范围内追随爱尔兰宪法的变化。

爱尔兰的编辑们:

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

Data visualization of user data from the Irish cluster. Made with Tableau. For a larger size, click here.

在我们可视化的第一部分,最左边,我们看到大部分编辑是如何由识别的人完成的,几乎所有的修改都是由识别的用户完成的。这已经通过柱状图的使用得到了说明。如果我们将“高”数量的用户编辑和修改与我们可视化的第二和第三个图表进行比较,我们会看到对更新爱尔兰和爱尔兰事务,特别是堕胎的信息感兴趣的独特用户的增加。第一张图让我们相信用户主要是人类,而不是自动机器人。第二张图中的尖峰也表明了某种变化,需要整合到维基百科页面中,就像之前的时间线一样。维基百科页面描述了两部法律,这两部法律相互影响,正在讨论的变化可能是第 36 修正案的通过,这直接影响了第 8 修正案。

上面的图像显示了一个由人类组成的团体,他们在维基百科中的行为主要是爱尔兰式的。这回答了谁以及在某种程度上什么时候的问题。从数据来看,在这个集群中似乎没有关于堕胎的关注或争议,只有关于爱尔兰堕胎的争议或关注,而在集群的其他地方没有类似的关注(Munk:2014)。

正因为如此,我们想在更高的程度上理解事件的时间线。因此,我们继续绘制爱尔兰人的活动图。

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

Data visualization of user data from the Irish cluster. Made with Tableau. For a larger size, click here.

在第一张图中,我们看到在上述修订时间线峰值的同一时期,匿名和非匿名使用修订的情况有所增加。从这张图表中我们可以了解到的新情况是,在仅仅两个月的增加行动后,我们看到匿名用户的大幅下降。

当跟随修订和唯一编辑的时间线时,在可视化的中间,我们可以看到两条线彼此跟随,直到 2017 年 10 月左右,此时 pages 编辑的下降多于修订。这可能意味着一场“改版战争”,用户将精力用在改变现有内容上,而不是贡献新信息。它也可以指向一个专门的核心用户,他们修改和编辑新的信息。从左边的图表中,我们还可以看到修改页面上的大多数用户都是可识别的。这可能也是爱尔兰集群的普遍情况。正如我们在上面看到的,有一大群人参与了爱尔兰堕胎的话题。

当我们打开维基百科第八修正案和第三十六修正案的评论时,我们看到了民意调查的许多变化。像对第八修正案和第三十六修正案的民意调查这样的单一问题会产生大量的修改,因此会产生峰值。

将关键词映射到堕胎类别:

通过对通过 CorTexT 找到的堕胎辩论的语义关键词进行更深入的研究,并系统地回顾最常见的名词短语,我们可以确定 12 个关键词,我们可以在整个堕胎类别中找到它们。

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

Maps showing different keywords from the abortion debate category, mapped out on the abortion category of Wikipedia. For larger size, click here.

“反堕胎”和“反堕胎选择”主要与北美堕胎辩论有关。然而,关键词"反堕胎",一个最常被支持堕胎群体用来称呼反对堕胎者的术语,主要出现在关于反堕胎暴力的页面上,显示当暴力被用来攻击堕胎做法时,它被命名为反堕胎而不是反堕胎。

关键词“死亡”主要出现在关于在爱尔兰和美国引发堕胎辩论的人的具体案例的页面中。萨维塔·哈拉帕纳瓦的案件对爱尔兰堕胎辩论和相关立法产生了巨大影响,克米特·戈斯内尔的案件同样是一个关于美国非法堕胎结果的有争议的案件

“权利”被视为既与胎儿的权利相关,这是一个反堕胎的焦点,也与生殖权利的概念相关,这是一个在欠发达国家主要与妇女权利相关的问题。这表明了世界各地权利问题的双重性。

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

Maps showing different keywords from the abortion debate category, mapped out on the abortion category of Wikipedia. For larger size, click here.

“婴儿”在流产和关于流产的哲学辩论中占主导地位。这显示了不同的观点,婴儿与胎儿依赖流产与堕胎,以及如何从哲学角度就堕胎的道德性进行辩论。

“生存能力”是美国堕胎法律纠纷中的一个核心概念,主要位于这一组中,可能是因为它与胎儿生存能力有关。

“母亲”出现在像共产主义下的堕胎这样的页面下,也许可以用现在和以前的共产主义国家法律来解释,这些法律允许堕胎来保护母亲的生命。

“健康”的分布表明,这一概念在很大程度上与发展中国家妇女的生殖权利和健康有关。

很明显,在某种程度上,描绘一场如此复杂的争议有其自身的生命力,越陷越深最终会产生更多的问题而不是答案。最终在这里,我们希望表明,没有真正的终结,我们仍然有新的机会进行调查,这个关键词分析揭示了以前没有探索的争议方面。这最后的分析标志着我们对堕胎争议和维基百科内部运作的探索的结束。这是一次旅行;一次紧张、激动人心、有时甚至令人疲惫不堪的学习经历。

那么,我们对堕胎辩论了解多少?

回到我们最初的网络,我们不再仅仅看到一只孤独的海星。

相反,我们看到了不同的反对堕胎的观点,以及由此产生的次级争议。我们看到了与主题的联系,从未想象过的联系,我们看到在我们的海星网络中严重缺乏医学专家,这是我们没有预料到的。

那么堕胎辩论是关于什么的呢?谁是持不同意见的一方,他们在哪里会面,分歧是什么,会停止吗?

在我们的映射中,参与堕胎辩论的行动者被简化为维基百科的编辑。他们可以是匿名的,也可以是固定的,甚至是机器人。他们只在维基百科见面,这里是当地的酒吧;一个人了解最新八卦、讨论生活、呐喊和闲逛的地方。尽管我们展示了辩论的主题,但我们没有可视化地展示分歧的实际内容。分歧的核心证据似乎隐藏在谈话页面中,隐藏在回复文章和在页面上添加观点的行列中。虽然我们已经谈到了这一点,但分歧的真正原因似乎从我们的手指间溜走了。

必须说几句维基百科在这场争论中扮演的角色。维基百科的结构和政策为不同意见提供了一定的舞台。我们映射的内容是通过一层层的页面构建的。大多数人从来不会点击超过这篇文章的无争议网页——但我们很少想到它是一个可能会因为用户的内部工作而不断变化的页面,在它背后的 talkpages 上进行辩论——修改和编辑。维基百科的用户一直在构建事实,利用网站的政策作为工具,将文章组织成事实的文学载体。

关于堕胎的争论还有很多方面需要探索,但是通过以上的回顾,无论是争论还是描绘争议的过程,我们希望至少已经阐明了其中的一小部分。

参考书目:

北卡罗来纳州马雷斯和北卡罗来纳州莫茨(2015 年)。用社交媒体描绘争议:对称的例子。https://doi.org/10.1177/2056305115604176

芒克,A. K. (2014 年)。在线绘制风能争议:方法和数据集介绍。

t .文图拉尼,m .雅克米和 d .佩雷拉。视觉网络分析:里约+20 在线辩论的例子。巴黎梅迪亚实验室科学。

绘制布鲁克林的房价图

原文:https://towardsdatascience.com/mapping-housing-prices-in-brooklyn-593d304c4fc?source=collection_archive---------22-----------------------

使用散景的地理测绘教程

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

Photo by NASA on Unsplash

在他的小说《如何毁灭一座城市》中,P.E .莫斯科维茨写了美国四个城市中产阶级化的影响:新奥尔良、底特律、旧金山和纽约。他认为地理学家尼尔·史密斯发展了自 1979 年以来关于中产阶级化最有影响力的学术理论——租金差距。中产阶级化是可以预见的。它遵循资本主义经济学的基本原则,“投资者会去潜在回报率最高的地方。”通过检查税收数据,人们可以在短时间内确定哪里的建筑可以便宜买到,哪里的建筑可以变得更贵。头奖将会是在一个中产阶级化的社区的几个街区内找到一栋破旧的建筑。关键是一处房产的可购买价格和一旦改造后的价值之间的差距。租金差距越大,建筑物成为目标的可能性就越大。寻找下一个中产阶级社区的房地产开发商依赖于这样一个事实,即卖家没有意识到潜在的价值。

Kaggle 有很多很棒的数据集,我很幸运地找到了一个很棒的数据集关于 2003 年至 2017 年的布鲁克林房屋销售。这些数据来自纽约冥王星的 shapefiles 和大量的空值。每个条目都有一个地址和 X、Y 坐标,这些坐标将这些点标绘成布鲁克林的形状。

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

我真的很想在布鲁克林的地图上绘制所有的点,并制作一些交互式的可视化,所以我决定与 Bokeh 合作这个项目。

我的第一步是把我所有的 X 和 Y 坐标转换成纬度和经度,这样我就可以把它们转换成正确的墨卡托坐标。因为你的电脑屏幕是平的,而地球不是平的,所以在绘制地图时,散景只接受墨卡托坐标。

It’s a banana.

由于我无法找到一个免费和快速的地理编码资源,我用我所拥有的。我取了 20 个数据点,一次查找一个数据点的经纬度坐标。利用这些坐标,我创建了一个训练数据集,以便通过简单的线性回归来预测其他 25,000 个点的纬度和经度。

自然地,我也对纵坐标重复了这个操作,并将这些值放入它们自己的列中。结果相当准确。当我比较一个随机数据点的估计坐标和实际坐标时,差异只有几个街区。此外,当我标绘最后一组坐标时,水里和公园里都没有房子。

这是一个将你的经纬度坐标转换成墨卡托坐标的函数。

散景图在交互和用户操作方面有很大潜力。你需要用 conda 命令安装 bokeh。要阅读文档和更详细的说明,请点击这里。以下是开始绘图时需要导入的重要包。

Bokeh 有自己的贴图图块集,允许在没有 shapefiles 或 API 的情况下进行贴图。这对我是一个巨大的加分。他们的牌组在这里列出。请注意,这里的文档中有一些令人困惑的方向。**导入图块集的正确方法是直接导入。在上面的代码中,您调用包 bokeh.tile_providers 并导入您想要使用的任何样式的地图。**使用 get_provider 或 Vendors 会返回一个错误。有些调色板是列表,有些是字典。确保像这样检查你选择的调色板的数据类型。

如果类型是一个列表,那么你只需要定义你的调色板就可以了。如果类型是字典,您必须在下面的第二行代码中指出要使用多少种颜色。

我会把这一大块的所有东西一行一行的分解。我定义了我的调色板,并指出我想要 10 种不同的颜色,这将对应于所售房屋的 10 个不同的价格范围。点击此处查看所有调色板散景报价。源被定义为我的数据帧,称为 TwoThree。这是 2003 年以来所有相关的住房数据。

我不仅想在地图上绘制数据来显示位置,还想用颜色来区分更贵的房子和不太贵的房子。映射器是为我的颜色条属性定义的。它需要一个字段名,以及一系列低值和高值。散景有一个伟大的可定制的悬停功能。当鼠标悬停在可视化中的任何一点上时,您可以决定在相应的窗口中会弹出什么信息。我使用变量工具提示来定义我想要显示的内容。每个属性都是标签和数据来源的元组。在这里看文档。如果数据来自您的数据集,第二个值必须以“@”开头,如果该值来自可视化本身,如索引或图表中的 X 和 Y 坐标,您将在该值前面加上“$”。我添加了一个小部件滑块,以便可视化能够根据所选年份改变和呈现新数据。我将在另一篇教程中更详细地介绍这一点。滑块现在将纯粹是装饰性的。

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

Pretty!

我将图形的 X 轴和 Y 轴定义为墨卡托。这将把墨卡托坐标转换成经纬度坐标,所以它将像一个真正的地图!我称之为工具提示,它是当你在每个点上悬停时出现的值,我给我的图形一个标题。因为这是一张地图,所以我也必须添加我的地图框。

我正在创建一个散点图,所以我只需引用引号中相应的列名,就可以在图中添加圆。颜色将由我的 mapper 变量和我的数据源中的值决定。我创建了一个颜色条作为我的点的键,在它下面我表示我想把我的颜色条放在图表的右边。

我可以将我的布局定义为一行或一列。列会将所有内容上下叠放(从上到下),而行会将所有内容并排放置(从左到右)。我现在把我的形象放在我的滑块上面。

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

2003 年,布鲁克林似乎有很多售价低于 200 万美元的房子。事实上,我的很多数据表明,很多房屋售价低于 1000 美元,很可能是因为止赎。

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

通过缩放功能,我在公园坡找到了一些更贵的房子。2003 年,我敢肯定一些房地产投资者希望在公园坡北部的 Prospect Heights 附近买房。

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

是的,就在离这个 300 万美元的家几个街区远的地方,有一栋售价 16.5 万美元的房子。

我计划在这个项目上做更多的工作,并将创建至少一个与散景视觉交互的教程。让我知道你喜欢使用哪些绘图可视化工具,为什么。我一定会检查他们!

使用 Python 分析 Lending Club 贷款-教程

原文:https://towardsdatascience.com/mapping-inequality-in-peer-2-peer-lending-using-geopandas-part-1-b8c7f883d1ba?source=collection_archive---------18-----------------------

如何使用 pandas,geopandas,matplotlib 处理来自最大的在线 P2P 贷款平台的信贷。

市场借贷是可能存在歧视或不公平借贷行为的场所。在这个帖子系列中,我们研究了 1935-40 年间的红线和今天的 P2P 贷款格局之间的空间相关性。

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

red —main Redlining cities in the 1930s | green — Lending Club’s highest loan application rejects in 2012 | magenta — Lending Club’s highest interest rates in 2012

问题定式化

作为一家的平等住房贷款机构,一个 P2P 贷款市场应该“不分种族、肤色、宗教、国籍、性别、残疾或家庭状况”地筛选贷款申请系统性地拒绝来自特定邮政编码的贷款可能会伤害少数族裔申请人。这是一种在 1935 年至 1940 年间被称为划红线的做法,当时房主贷款公司或“HOLC”在近 250 个美国城市创建了用颜色标记社区信用价值和风险的地图。这些地图最近被数字化,可以在映射不等式上查看。尽管有联邦公平住房法案,现代的红线最近在美国 61 个城市被曝光。另一项调查发现有几家银行显然将一些少数民族排除在他们客户的投资组合之外。

我们使用 Python、Pandas、Jupyter Notebook 和 Geopandas 库来可视化来自 Lending Club 的 2400 万份贷款申请,Lending Club【】是世界上最大的 P2P 贷款平台。目的是调查来自 20 世纪 30 年代被划红线的邮政编码的申请者是否更有可能被今天的市场拒绝。如果没有,我们将核实此类贷款申请人是否获得更高的违约利率。我们也想探究这些关系如何在 Lending Club 的整个生命周期中演变,从 2006-2007 年到现在。

标记数据收集

绘制不平等网站提供了一个选项,可以下载上世纪 30 年代被划上红线的所有美国城市的形状文件。shapefiles 包含描述每个城市中的街区(区域)的多边形的地理纬度和经度坐标,因为它们是由 HOLC 划定的。

*import geopandas as gpd
df_redlines_map = gpd.read_file('data/HOLC_ALL.shp')
df_redlines_map.head()*

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

Figure 1

每行代表一个具有以下特征的多边形(区域):

  • 状态:美国状态,
  • 城市:美国城市,
  • looplat,looplng :多边形起始坐标,
  • 名称:区域名称,
  • holc_id :区域编号,
  • holc_grade : HOLC(安全)等级,
  • area_descr :区域描述,
  • 几何:构建多边形的所有坐标的集合。

HOLC 等级描述了 20 世纪 30 年代分配给该区域的信用价值,如下所示:

  • 最好的
  • b——仍然可取
  • c——肯定下降
  • D —危险

我们清除那些 HOLC 等级无效的多边形。

*df_redlines_map = df_redlines_map[df_redlines_map.holc_grade!='E']*

红线功能工程

在开始我们的分析之前,我们先来看看 HOLC 分配的等级分布,不仅是在每个邮政编码内,而且是在州一级。这需要追溯到 20 世纪 30 年代,对每个地区的人口进行估计。一种简单的方法是使用每个 HOLC 等级的分区数。因为相应多边形的大小变化很大,我们可能无法直观地了解人口数量。因此,我们选择使用区域面积(以平方公里为单位)作为基准单位。

我们从开始计算每个区域的平方公里面积,以及它的地理中心(“质心”)。

*proj = partial(pyproj.transform, pyproj.Proj(init='epsg:4326'),
               pyproj.Proj(init='epsg:3857'))
df_redlines_map['area'] = [transform(proj, g).area/1e+6 for g in df_redlines_map['geometry'].values]
df_redlines_map['centroid_lat'] = df_redlines_map.geometry.centroid.y
df_redlines_map['centroid_long'] = df_redlines_map.geometry.centroid.x
df_redlines_map.head()*

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

Figure 2

我们现在将使用每个区域的质心的坐标来添加每个区域的邮政编码。为此,我们依赖免费的 Python 库 uszipcode,,它使用自己最新的地理编码数据数据库对每批 100 个区域进行地理编码。

*from uszipcode import SearchEngine
i = 0
while i < df_redlines_map.shape[0]:
    df_redlines_map.loc[i:i+100,'zipcode'] = df_redlines_map[i:i+100].apply(lambda row: search.by_coordinates(row.centroid_lat,row.centroid_long, radius=30, returns=1)[0].zipcode, axis=1)    
    i = i + 100
df_redlines_map.head()*

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

Figure 3

计算每个邮政编码的**总红线区域现在很简单。**

*df_redlines = df_redlines_map.groupby(['zipcode']).agg({'area': np.sum}).reset_index().rename(columns={'area': 'zip_area'})
df_redlines.head()*

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

Figure 4

我们现在可以计算每个州的**总红线区域*。***

*df_redlines_state = df_redlines_map.groupby(['state']).agg({'area': np.sum}).reset_index().rename(columns={'area': 'state_area'})
df_redlines_state.head()*

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

Figure 5

使用前面的计算,我们可以获得每个州内 HOLC 等级的百分比分布。

*df_redlines_state_details = df_redlines_map.groupby(['state','holc_grade']).agg({'area': np.sum}).reset_index().rename(columns={'area': 'holc_area'})
df_redlines_state_details = df_redlines_state_details.merge(df_redlines_state, on='state', how='left')
df_redlines_state_details['holc_ratio'] = df_redlines_state_details.holc_area/df_redlines_state_details.state_area
df_redlines_state_details.head()*

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

Figure 6

我们还可以计算每个邮政编码的相似值。

*df_redlines_details = df_redlines_map.groupby(['zipcode','holc_grade']).agg({'area': np.sum}).reset_index().rename(columns={'area': 'holc_area'})
df_redlines_details = df_redlines_details.merge(df_redlines[['zipcode','zip_area']], on='zipcode', how='left')
df_redlines_details['holc_ratio'] = df_redlines_details.holc_area/df_redlines_details.zip_area
df_redlines_details.head()*

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

Figure 7

正如我们将在后面看到的,一些有趣的可视化需要我们将等级值转换成特征。这允许我们计算每个区域内 A、B、C 和 D 分区的面积比,如下所示。我们用零填充缺失的比率值,以考虑没有 HOLC 区的邮政编码。

*for grade in ['A', 'B', 'C', 'D']:
    df1 = df_redlines_map[df_redlines_map.holc_grade==grade].groupby(['zipcode']).agg({'area': np.sum}).reset_index().rename(columns={'area': grade + '_area'})
    df_redlines = df_redlines.merge(df1, on='zipcode', how='left')
    df_redlines[grade + '_ratio'] = df_redlines[grade + '_area'] / df_redlines.zip_areadf_redlines.fillna(0, inplace=True)*

这些比率帮助我们估计所谓的 HOLC 拒绝比率,定义为在 20 世纪 30 年代由于的红线而在一个邮政编码内被拒绝的贷款申请的百分比。假设 A 分区申请人的比率为 0%,C 和 D 分区为 100%,B 分区为 90%。我们选择 B 为 90%,因为它接近文献[ ][ ]中的平均拒绝比率。

*df_redlines['holc_reject_ratio'] = (.9*df_redlines.B_ratio + df_redlines.C_ratio + df_redlines.D_ratio)
df_redlines.head()*

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

Figure 8

红线勘探

下面的条形图显示,在 20 世纪 30 年代,HOLC 考虑的大多数地区被列为危险区或衰落区。

*redlines_labels = {'grade': ['A', 'B', 'C', 'D'],
                   'desc':['A - Best', 'B - Still Desirable', 'C - Definitely Declining', 'D - Hazardous'],
                   'color': ['g', 'b', 'y', 'r']
         }
fig, ax  = plt.subplots(1,1,figsize=(15,5))
sns.countplot(y='holc_grade',data=df_redlines_map, palette=redlines_labels['color'], ax=ax)
ax.set_title('Count of zones per grade');*

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

Figure 9

HOLC 划定的区域通常不太大,不到 5 平方公里。我们注意到很少有表面达到 180 平方公里以下的异常值。

*fig, ax  = plt.subplots(1,1,figsize=(15,5))
sns.boxplot(y="holc_grade", x="area", palette=redlines_labels['color'],data=df_redlines_map, ax=ax)
sns.despine(offset=10, trim=True)
ax.set_title('Distribution of zone areas (km^2) per HOLC grade');*

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

Figure 10

根据 HOLC 在 20 世纪 30 年代的分类,阿拉巴马州和堪萨斯州的危险总面积最大。新罕布什尔州和印第安纳州的选区大部分被归类为绝对衰落。

*fig, ax  = plt.subplots(1,1,figsize=(20,5))
sns.barplot(x="state", y="holc_ratio", hue='holc_grade', data=df_redlines_state_details, ax=ax)
ax.set_title('Holc Grade Ratio per state');*

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

Figure 11

贷款特征工程

在探索了红线数据之后,现在让我们来看看今天的贷款情况。在 2007 年第一季度和 2018 年第二季度之间收到的所有贷款申请都是从 Lending Club 网站下载的。这里引用的项目的作者向我们提供了合并和清理后的数据

*df_loan = pd.read_csv('data/df_reject_ratio_2007-2018.csv')
df_loan.head()*

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

Figure 12

每个贷款申请由以下特征描述:

  • issue_d :收到申请的日期。
  • 邮政编码:申请人(借款人)邮政编码的 3 位数字。出于隐私考虑,Lending Club 不公布完整的邮政编码。
  • 拒绝:如果申请被 Lending Club 拒绝,则标志值为 1,否则为 0。
  • 等级:表示利率的类别(仅适用于未被拒绝的申请)。

根据每一份贷款申请和信用报告,每一笔贷款都被分配一个从 A 到 G 的等级和相应的利率每个贷款等级及其对应的当前利率显示在 Lending Club 网站上。

*print('There have been {} loans requests received at Lending Club since 2007, of which {} have been rejected'.format(df_loan.shape[0], df_loan[df_loan.rejected==1].shape[0]))
There have been 24473165 loans requests received at Lending Club since 2007, of which 22469074 have been rejected*

探索大型时间序列的一种常用方法是根据更大的时间单位(如季度)聚合感兴趣的特征。Lending Club 数据的一个问题是 issue_d 的格式,对于许多行来说是 YYYY-MM-DD,但是我们也可以找到格式为 b-YYYY 的日期。例如,我们看到 2007 年 5 月 26 日和 2011 年 12 月的行。将日期转换为季度时,最好对每种格式进行不同的处理。

具体来说,我们将数据分成两组,每种日期格式一组。

*df1 = df_loan[(df_loan.issue_d.str.len()==10)]
df1['issue_q'] = pd.to_datetime(df1.issue_d, format='%Y-%m-%d').dt.to_period('Q')
df1.head()*

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

Figure 13

*df2 = df_loan[(df_loan.issue_d.str.len()!=10)]
df2['issue_q'] = pd.to_datetime(df2.issue_d, format='%b-%Y').dt.to_period('q')
df2.head()*

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

Figure 14

现在,我们可以合并两个数据集。

*df_loan = df1.append(df2)*

*我们进一步使用这些数据来计算 **Lending Club 贷款拒绝率,*定义为每个季度每个邮政编码被拒绝的贷款申请的百分比。

*df_loan_reject_ratio = df_loan[['issue_q','zip_code','rejected']].groupby(['issue_q','zip_code']).agg(['count', 'sum'])
df_loan_reject_ratio.columns = df_loan_reject_ratio.columns.droplevel(level=0)
df_loan_reject_ratio = df_loan_reject_ratio.rename(columns={'count':'lc_total_requested', 'sum':'lc_total_rejected'})
df_loan_reject_ratio['lc_total_accepted'] = df_loan_reject_ratio.lc_total_requested - df_loan_reject_ratio.lc_total_rejected
df_loan_reject_ratio['lc_reject_ratio'] = df_loan_reject_ratio.lc_total_rejected/df_loan_reject_ratio.lc_total_requested
df_loan_reject_ratio = df_loan_reject_ratio.reset_index()
df_loan_reject_ratio.head()*

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

Figure 15

上面的汇总表给出了每个季度和邮政编码的以下数量:

  • lc_total_requested: 收到的贷款申请数量,
  • lc_total_rejected: 拒绝的贷款申请数,
  • lc_total_accepted: 接受的贷款申请数,
  • **LC _ reject _ ratio:*LC _ total _ rejected*与 lc_total_requested 的比率。

类似地,我们计算 Lending Club 贷款等级比率(每个邮政编码和季度特定利率的贷款百分比)。

*df_loan_grades = df_loan[df_loan.rejected==0][['issue_q','zip_code','issue_d']].groupby(['issue_q','zip_code']).count().reset_index().rename(columns={'issue_d':'total_accepted'})for grade in ['A', 'B', 'C', 'D', 'E', 'F', 'G']:
    df1 = df_loan[(df_loan.rejected==0)&(df_loan.grade==grade)][['issue_q','zip_code','issue_d']].groupby(['issue_q','zip_code']).count().reset_index().rename(columns={'issue_d': 'LC_' + grade + '_accepted'})
    df_loan_grades = df_loan_grades.merge(df1, on=['issue_q','zip_code'], how='left')
    df_loan_grades['LC_' + grade + '_ratio'] = df_loan_grades['LC_' + grade + '_accepted'] / df_loan_grades.total_accepted*

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

Figure 16

例如, LC_A_accepted 是被接受并被分配利率 A 的申请数量。 LC_A_ratio 是相应的百分比。

贷款和标记数据合并

我们现在准备合并贷款和红线数据,允许我们尝试不同的可视化,并在查看 2007-2018 年的“贷款与红线”时提出有趣的问题。

因为 Lending Club 只披露了申请人邮政编码的 5 位数中的 3 位数,所以我们必须根据 123xx 邮政编码模式对数据进行汇总和合并。

*df_redlines[‘zip_code’] = df_redlines[‘zipcode’].astype(‘str’)
df_redlines[‘zip_code’] = df_redlines[‘zip_code’].str.pad(5, ‘left’, ‘0’)
df_redlines[‘zip_code’] = df_redlines[‘zip_code’].str.slice(0,3)
df_redlines[‘zip_code’] = df_redlines[‘zip_code’].str.pad(5, ‘right’, ‘x’)
df_redlines_aggr = df_redlines.fillna(0).groupby('zip_code').agg({'zip_area': np.sum, 
'A_area': np.sum, 'B_area': np.sum, 'C_area': np.sum, 'D_area': np.sum, 'A_ratio': np.mean,'B_ratio': np.mean,'C_ratio': np.mean,'D_ratio': np.mean,'holc_reject_ratio': np.mean}).reset_index()df_redlines_aggr.head()*

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

Figure 17

上表显示了 HOLC 在 20 世纪 30 年代对 A、B、C 或 D 区域的总面积(km2 ),这些区域由一个 123xx 邮政编码模式表示,其中 123 是 Lending Club 公布的邮政编码数字的代表数字。还提供了每个 HOLC 等级的总面积比以及总 HOLC 剔除率。

继续这个聚合的红线数据集,我们现在将添加贷款数据。对于缺少贷款数据或标记数据的 123xx 地区,空比率替换为 0。

*df_redlines_loan = df_loan_reject_ratio.merge(df_loan_grades, on=['zip_code','issue_q'], how='left').merge(df_redlines_aggr, on='zip_code', how='left')
df_redlines_loan.issue_q = df_redlines_loan.issue_q.astype('str')
df_redlines_loan.fillna(0, inplace=True)
df_redlines_loan.head()*

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

Figure 18

结果

看下面的线图,我们可以看到 Lending Club 平均拒绝的贷款比 HOLC 在 20 世纪 30 年代拒绝的要多。我们可以预料,将来拒收的数量会进一步增加。

*fig, ax = plt.subplots(1,1,figsize=(15,5))
sns.lineplot(x="issue_q", y="lc_reject_ratio",data=df_redlines_loan, ax=ax, label='LendingClub reject ratio')
plt.axhline(df_redlines_loan[df_redlines_loan.holc_reject_ratio>0].holc_reject_ratio.mean(), color='r', label='HOLC reject ratio')
plt.axhline(df_redlines_loan.lc_reject_ratio.mean(), color='black', label='LendingClub reject ratio Average')
plt.xlabel('quater')
plt.ylabel('ratio')
plt.title('Average Loan Reject Ratio over time')
plt.legend()
plt.xticks(rotation=45);*

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

Figure 19

下面的散点图显示了 Lending Club 和 HOLC 的贷款拒绝率之间的正相关关系。这表明了以下假设:在 20 世纪 30 年代,HOLC 拒绝大部分或几乎所有贷款的地区,也是 Lending Club 今天可能拒绝大量贷款的地区。

*fig, ax = plt.subplots(1,1,figsize=(15,5))
sns.scatterplot(x=’lc_reject_ratio’, y=’holc_reject_ratio’, data=df_redlines_loan[df_redlines_loan.holc_reject_ratio>0], ax=ax)
plt.title(‘Loan Reject Ratio per zipcode — LendingClub versus HOLC’);*

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

Figure 20

如下面的 distplot 所示,Lending Club 拒绝率分布似乎复制了 HOLC 在大面积地区的拒绝率分布,这些地区在 20 世纪 30 年代被划分为危险明确拒绝贷款。

*fig, ax = plt.subplots(1,1,figsize=(15,5))
sns.distplot(df_redlines_loan[df_redlines_loan.holc_reject_ratio>0].holc_reject_ratio, color='r', hist = False, kde = True, kde_kws = {'shade': True, 'linewidth': 3}, label='HOLC', ax=ax)
sns.distplot(df_redlines_loan[df_redlines_loan.holc_reject_ratio>0].lc_reject_ratio, color='g', hist = False, kde = True, kde_kws = {'shade': True, 'linewidth': 3}, label='LendingClub', ax=ax)
plt.xlabel('ratio')
plt.title('Loan Reject Ratio Distribution over zipcodes');*

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

Figure 21

从下面的热图来看,HOLC 和 Lending Club 特征之间的相关性非常弱。这可能意味着,一般来说,知道一个地区的 HOLC 等级并不能帮助我们自信地预测 Lending Club 的贷款拒绝或贷款利率。

*corr = df_redlines_loan.corr()
mask = np.zeros_like(corr, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
f, ax = plt.subplots(figsize=(11, 9))
cmap = sns.diverging_palette(220, 10, as_cmap=True)
sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,
            square=True, linewidths=.5, cbar_kws={"shrink": .5})
ax.set_title('Correlation between HOLC and LendingClub');*

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

Figure 22

下面的分布图表明,几乎没有贷款俱乐部申请人在红线区获得最低利率(A)。大多数申请人获得中等利率(B、C 或 D)。只有少数申请人不得不面对非常高的利率(E、F 或 G)。这种分布表明,Lending Club 在评估信贷冲销风险时可能不会考虑红线*。*

*f = df_redlines_loan[(df_redlines_loan.holc_reject_ratio==1)&(df_redlines_loan.lc_reject_ratio!=1)].sort_values(by='lc_reject_ratio', ascending=False).reset_index()[['zip_code', 'holc_reject_ratio', 'lc_reject_ratio', 'LC_A_ratio', 'LC_A_ratio', 'LC_B_ratio', 'LC_C_ratio', 'LC_D_ratio', 'LC_E_ratio', 'LC_F_ratio', 'LC_G_ratio']]*

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

Figure 23

结论

我们的研究为借贷俱乐部的现代划红线提供了一些证据。1930 年代的红线图和今天的贷款俱乐部接受贷款请求和评估违约风险的政策之间存在内在联系的假设仍然有效。

Lending Club 使用的数据中有一些不公平算法或历史偏见的迹象。从我们的探索性数据分析中可以清楚地看到这一点,尤其是 HOLC 拒绝率和 Lending Club 拒绝率之间的正线性趋势。

感谢您阅读至此。

在本系列文章的第二部分中,我们将使用 Geopandas 在美国的地理地图上显示红线区域、贷款拒绝率和贷款利率分布。这将包括一个用于空间时间序列可视化的 choropleth 地图动画,显示 2007 年至 2018 年间 peer-2-peer lending 的地理景观在红线方面如何演变。

文献学

库特曼切,c .,斯诺登,K. (2011 年)。修复抵押贷款危机:HOLC 贷款及其对当地住房市场的影响。《经济史杂志》,第 71 卷第 2 期,第 307-337 页。

[ ]菲什巴克,p .,弗洛雷斯-拉古内斯,a .,霍拉斯,w .,坎特,s .,特雷伯。J. (2010)。20 世纪 30 年代房主贷款公司对住房市场的影响。金融研究评论,24(6),1782 年至 1813 年。

用数字工具绘制知识图谱,解决 21 世纪的医疗保健问题

原文:https://towardsdatascience.com/mapping-knowledge-with-digital-tools-to-solve-healthcare-problems-in-the-21st-century-21a19a51c81d?source=collection_archive---------13-----------------------

托普塔尔奖学金赋能未来女性领导者的论文

介绍

当我在医学、学术研究和生物技术领域旅行时,我清楚地认识到,从业者和研究人员正在努力应对我们今天面临的复杂的健康挑战。这些健康问题需要超越生理学和生物化学的理解,因为疾病还受到社会和文化的影响。此外,我们还生活在一个以不断变化的气候和生物多样性丧失所加剧的新情况为特征的时代,当涉及到对人类健康的影响时,我们仍然难以完全理解这些因素。

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

The effects of climate change and loss of biodiversity on human health cannot be understood by reductionist scientific enquiry alone.

在理想的世界中,我们创造的知识和解决方案应该足以解决这些复杂的问题。不幸的是,纯粹的信息过载使获得一个概览成为一项艰巨的任务,导致大多数研究人员退缩到专业的筒仓中,从职业的角度来看,这些筒仓更容易管理,也更安全。

所有这一切让我意识到,我们今天面临的复杂的健康挑战无法通过当前推动医疗保健研究和知识创造的过程来解决。如果我们要创造持久的解决方案,作为研究人员,我们必须理解更大的图景,获得当今时代导致疾病的许多观点的概述,并将这些观点纳入我们的研究。

在寻找工具和方法来整合健康问题固有的不同观点的过程中,我继续探索远离科学和医学舒适区的领域。第一个是设计思维,或以人为中心的设计。作为斯坦福大学设计研究中心的访问学者,我每天都在学习设计师如何解决问题,并参与了许多设计项目。这一经历让我意识到使用设计方法探索复杂问题空间和以不同方式构建问题的可能性。

虽然设计方法对于创建医疗保健实际挑战的解决方案,甚至帮助组织转型非常有用,但我仍然缺乏获得研究信息概览的方法,而这对于开始更下游的设计过程是必要的。在这种需求的驱动下,我开始冒险进入另一个远远超出我最初专业知识的领域,一个将我带入算法和网络世界的领域。

测绘知识

众所周知,人类大脑处理视觉信息的效率远远高于书面信息,这种现象与大脑同时处理多个视觉信息的能力有关,而不是一次处理一个单词。尽管如此,大多数科学出版物和数据库都严重依赖书面信息。由于无法可视化,研究人员只能在长长的出版物列表中滚动,无法立即获得某个领域的概况。事实上,我遇到的大多数研究人员除了偶尔在一篇研究文章上乱涂乱画,然后存档,再也不会被看一眼之外,没有任何可视化的方法来跟踪他们领域的研究。一些新的 web 应用程序(如 Dimensions 和 Meta)稍微改进了这一过程,尽管数据仍然以长列表的形式呈现,而不是可视化。

在与一位从事图形数据库和网络工作的数据科学家讨论后,我偶然发现了映射的概念。从那里,我发现从事分析科学本身的个人,如科学计量学和科学知识社会学的人,一直在使用机器学习和数据提取技术的工具来绘制知识的演变。尽管如此,在这些专门的亚群体之外,很少有人敢于超越理论领域,将他们的发现付诸实际应用,这使得大多数研究人员、从业人员和政策制定者不太重视这些发现。这可能是解释为什么那些研究科学的人和那些实际实践科学的人之间很少交谈的一个原因。

与数据科学家一起,我们开始探索绘制结核病领域的地图,以找出这种方法可以带来什么。在这个过程中,我们发现许多免费工具要么太复杂,非数据科学家无法使用,要么缺乏复杂性,无法回答我们感兴趣的问题。通过我们的探索,我们开始开发自己的工具,使我们能够直观地浏览网络,并以有趣和创造性的方式处理数据。

将知识网络可视化使我能够从数据中获得洞察力,这在以前是不可能的。例如,使用我们新创建的工具来探索结核病领域的引用网络,很明显该领域正在朝着一个非常独特的方向发展,随着时间的推移,明确的研究领域被放弃。随着调查的深入,废弃区域被发现为结核病诊断区,由于该领域资金缺口巨大,世卫组织最近将该领域确定为优先领域。我们创建的可视化使我们能够在概览中看到这一差距,而无需手动梳理大量文献,我们相信这可以以更有效的方式促进决策者的战略进程。这种类型的分析也与研究人员相关,他们可能能够在更大的领域背景下可视化他们的研究,甚至识别最近被遗忘的潜在有趣的研究,如在中看到的这个例子

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

A static screenshot of the interactive citation network using the tool we developed. The program allows users to scroll over each node (research article) and obtain details as well as visualize its direct connections within the network. The network can be seen to have a shape, which tells us that as new articles are published, older ones are no longer being cited. We can observe a clear area that had been thinning out over time, which in this case, corresponded to articles discussing TB diagnostics.

从那时起,通过使用我们的工具,我分析了合作网络中的模式,揭示了学术界和工业界之间的不同合作动态,以及目前处于边缘地位但代表未开发潜力的新兴研究领域。

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

Analyzing collaboration networks revealed clearly the disconnect between industry and academia in the field of multi-drug resistant tuberculosis. Here, a small cluster involving Johnson and Johnson’s pharmaceutical arm, Janssen Pharmaceuticals can be seen to be disconnected from the main research network.

为了理解围绕健康话题的更广泛的背景,我还分析了围绕结核病和全球健康话题的 twitter 网络,它提供了围绕这些主题的生态系统和观点的广泛概述。

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

Examining a twitter network reveals the ideas that are spreading and how they are inter-connected within a health topic, in this case, global health. It gives us an idea about the discourse, or the issues that are important in the community; knowledge that cannot be gathered from official research articles.

随着时间的推移,通过这项工作,一个愿景开始出现,一个我觉得令人兴奋且深具意义的愿景。重要的是,我认为这是一个愿景,它解决了知识创造和利用方式中的一个主要差距,因此可能具有深远的潜力,以我们尚未完全预见的方式转变科学进步并造福社会。

视力

你是一名研究人员,需要决定你的下一个调查,以便写下你将要申请的资助。或者,你可能是一个政策制定者,他需要决定是否有更多的钱需要分配给某个特定的领域。你也可以是一名设计师,与当地的流行病学家一起工作,寻求建立一个更好的系统来识别传染病爆发的源头。

在每一种情况下,你的下一步将取决于你对你将要从事的领域的理解和综合能力。这一过程通常需要几个小时、几周甚至几个月的时间来研究这个主题,以便对这个主题的所有可能的角度有一个全面的了解。

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

Fancy reading through these articles anyone?

现在想象一下另一个现实,点击几下鼠标,你会发现自己在浏览你感兴趣的主题的交互式视觉概览。然后,你迅速确定差距和追求的机会,引导你创建一个合理的和原创的战略或研究方向。当需要时,你现在可以将你更深入的研究锁定在一个非常具体的领域,而不必浪费无数的时间去挖掘不相关的信息。最重要的是,你意识到这是如此有趣,以至于你不断探索,直到你偶然发现一个有趣的见解,让你问了一个你以前从未想过的问题。顺便说一句,这个问题导致了改变生活的疗法或神奇产品的发展,它改变了整个社会人们的健康状况。

如果这个愿景让你兴奋,那么我会说这不是一个遥远未来的愿景。使这成为现实的工具和技术已经存在,而我今天的任务,就是把它引入你们的世界,并为了更大的利益改变我们利用知识的方式。

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

Data sources that can be used will originate from diverse sources and will be subjected to the same processing to create infoscapes that allow the investigator to play with the visualizations and extract insights.

履行

我们的工具目前处于开发的最后阶段,我们预计我们将能够在年内公开这一点。作为一名非技术(数据科学家)联合创始人,我的职责是在数据科学和医疗保健研究之间架起一座桥梁。为了做到这一点,我打算与该领域的专家建立合作关系,并用现实世界的问题创建用户研究。潜在的合作者已经确定,项目将在未来几个月启动。用户研究对于获得重要反馈至关重要,它将使我们能够进一步改进产品。

仅仅开发一个数字工具是不够的,而不开发使用它的技术。因此,我致力于开发一种方法,允许对数据进行更系统的调查。从这项工作中获得的一些见解可以在这里看到。在接下来的几个月里,我将继续研究这种方法,并对其进行微调,以创建一个完整的框架,供用户在探索数据时参考。

由于我们目前自筹资金,没有外部资金来源,下一步将是积极寻求和确保进一步开发该工具的资金。用户研究将是我们吸引合作伙伴或投资者能力的重要组成部分。尽管我们已经制定了业务计划,确定了增长潜力,并将我们的工具与潜在的竞争对手区分开来,但该计划需要进一步完善,才能更有影响力。

需要明确的是,这个项目的目标不是简单地启动一个创业公司来推广一个产品。该项目旨在通过确保有价值的知识不会迷失在信息的海洋中,确保社会从多年的科学研究中获得最大收益。因此,可能还有其他途径有待探索,以使这一愿景成为现实。

例如,这可能是一个咨询服务的路线,该服务将与产品一起提供,由我领导,以确保用户从使用该工具中获得最大利益。

成为女性领导者

2018 年,我参加了在巴塞罗那举行的 EIT Health 增强女性在健康创新方面的领导力研讨会。在这次研讨会期间,我意识到女企业家在企业家世界中的代表性不足的程度。我还了解到,有抱负的女性企业家应该寻求的最重要的东西之一是导师,而这正是我目前努力的方向。

使 Toptal 的提议特别相关的是它提供的指导支持。我认为,导师不仅仅是传授技术建议,对我来说更重要的是,它是从以前走过这条路的其他人的经验中学习。我理想的导师是一位探索过不同职业道路的女性领导者,从与企业合作到创办自己的企业或咨询公司。独立工作意味着大部分时间要么花在自己身上,要么花在与其他团队成员讨论上,这导致获得外部意见的机会很少。在我职业生涯的这一关键时刻,与导师进行定期讨论不仅能鼓舞士气,还能极大地增强我的观点和视野,并拓宽我的视野,让我能通过其他途径将这一愿景变为现实。

改变世界是一项艰巨的任务,单靠自己是无法完成的。只要有一点帮助,这个想法的种子就可以发芽,形成一个复杂的连接网络来维持它,并开花成为一棵宏伟的树。

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

The tree of knowledge 😃

使用 Python 绘制多伦多已报告坑洞的位置图

原文:https://towardsdatascience.com/mapping-locations-of-reported-pot-holes-in-toronto-using-python-376402d8da53?source=collection_archive---------19-----------------------

通过开放数据从 311 多伦多收集数据,用于可视化报告的坑洞。

欢迎来到我的第一个教程,可视化多伦多周围的坑洞的位置。我叫 Mumtahin,是一名数据科学专家,目前在加拿大支付行业工作。数据分析和数据科学项目的最大技能包括理解数据准备。为分析/研究收集数据所需的工作量因手头的任务而异。本教程的目的是提供清理数据和图形化表示数据的基本介绍,因为这是我日常工作的一个重要方面。

对于本教程,我们将从由 open data (由多伦多市维护)提供的可公开访问的 API 端点获取 JSON 格式的结构化数据。你可以通读这篇文章,并了解一步一步的过程,或者如果你熟悉下面的概念,请随意使用我的 Github 资源库中的 Jupyter 笔记本进行自己的探索!

入门指南

对于本教程,请确保您安装了 Python 3 版本。我用的是 Python 3.6.6。

如果您想安装并运行我的 Jupyter 笔记本,请确保您已经安装了 Jupyter 笔记本。关于设置 Jupyter 笔记本的简短的初学者友好教程,请点击这里

安装所需模块

  • 熊猫(我用的是 0.24.1 版本)
  • matplotlib(我使用的是 3.0.2 版本)
  • mpl 传单

导入模块

构建我们的查询

我们有一个由 311 多伦多提供的 API 端点命中。首先,我们需要构造一个查询,其参数反映了我们实际需要的信息。我们将要连接的 API 包含了各种主题的数据,例如垃圾收集、涂鸦清除和其他城市服务的报告数据,以及我们想要的实际坑洞数据。对我们来说,查询是没有意义的,而且可能会使服务器陷入困境,去获取我们一开始就不想要的信息。

到目前为止,我们知道些什么?我们知道我们只需要与报告的坑洞相关的数据。根据 311 发布的 README 文档并查看开放数据目录,我们还了解到以下信息:

  • API 记录限制:一次 1000 条记录
  • 坑洞修复请求有一个服务代码:c rowr-12
  • jurisdiction_id 将始终为“toronto.ca”
  • agency_responsible:始终设置为 311 Toronto
  • service_notice:未退回
  • 邮政编码:未返回

我们需要什么?

  • 我们需要决定开始和结束日期范围来构造我们的查询。

选择日期范围并使用 API 限制

当决定一个日期范围时,很难选择一个有意义的时间向我们展示有价值的结果。因为我们的分析是关于坑洞的,一些关于坑洞成因的先验知识会有所帮助。在深度冻结和解冻期间,会导致路面出现裂缝,这是造成坑洞的原因。当我写这篇文章的时候,多伦多正在经历冰冻和解冻的时期,导致这个城市经历了比平常更高的报告。基于这些知识,查看最近 4 个月的数据会很有趣。

假设我们需要 4 个月的数据,记住为 API 响应设置的最大记录限制是很重要的。311 Toronto API 在其响应对象中有 1000 条记录的限制。使用 API 时有大小限制或速率限制是相当常见的。这是一种确保 311 Toronto 的服务器不会因试图满足大量请求而过载的方法,并且可以提供良好的服务质量。为了遵守 1000 条记录的限制,我首先抽查了不同月份的记录总数。我发现一个月的平均数据低于 1000 条记录的限制。考虑到最近该城市的报告比平时多,我们的数据可能会受到限制,但我们仍然应该有足够的数据点用于我们的可视化。我们将我们的日期范围(4 个月)划分为 29 天的时间段,并对这 29 天的每个时间段进行同步请求。

现在我们有了一个将日期分块的函数,我们将继续选择开始和结束日期。我们知道,在冬末和春季的冰冻和解冻季节,坑洞是有问题的。知道了这一点,看看今年冬天的数据会很有趣,因为我们有一些交替的寒冷和温暖的日子。我们在下面定义了我们的日期参数,但是你可以随意从我的 Github 中获取这个笔记本,并更改日期以获得更多信息。如果您在我的存储库中运行该笔记本,或者基于本教程创建您自己的版本,请随意调整日期范围。

使用上面写的函数,我们有一个反映日期范围块的日期列表。从这个列表中,我将把每个偶数索引项作为我的开始日期,每个奇数索引项作为我的结束日期。

[datetime.datetime(2018, 11, 1, 0, 0),
 datetime.datetime(2018, 11, 30, 0, 0),
 datetime.datetime(2018, 12, 1, 0, 0),
 datetime.datetime(2018, 12, 30, 0, 0),
 datetime.datetime(2018, 12, 31, 0, 0),
 datetime.datetime(2019, 1, 29, 0, 0),
 datetime.datetime(2019, 1, 30, 0, 0),
 datetime.datetime(2019, 2, 28, 0, 0),
 datetime.datetime(2019, 3, 1, 0, 0),
 datetime.datetime(2019, 3, 4, 0, 0)]

我们在上面的输出中看到,第一个范围是 2018–11–01 到 2018–11–30。第二个范围是 2018–12–01 到 2018–12–30 等等。我们看到每个偶数位置(0,2,4 等。)是开始日期,奇数位置的项目是结束日期。

提出 API 请求

基本网址:https://secure.toronto.ca/webwizard/ws/requests.json?

使用 311 自述文件中已知的参数,我们可以添加 service_code、jursidiction _ id、start_date 和 end_date 等参数。我们的 API 请求将从上面获取每个开始和结束日期范围分区。我们总共会做 5 个。

现在我们有了一个巨大的列表(data_clob ),其中包含了返回结果的嵌套 JSON,我们看到每个条目都以关键字“service_requests”开头。我们对每个“服务请求”的价值感兴趣。

查看熊猫数据框架中的数据

熊猫可以从 csv、字典、列表、SQL 查询等一系列格式中读取您的数据,并将其放入数据框中。如果您研究这个数据框架,您可以看到我们有一些重要的列,如 long(经度)和 lat(纬度)。

更多清洁

根据自述文件中的信息,我们可以删除以下几列:“机构 _ 责任”、“服务 _ 通知”和“邮政编码”。

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

计算所需的调查天数和维修天数

我们可以根据“requested_datetime”和“updated_datetime”之间的时间差来计算调查报告的预计天数。“expected_datetime”似乎表示修补坑洞的预期日期,但它通常由一个固定的日期值填充。对于某些报告,我不确定这种自动填充背后的原因是什么。

在下面的要点中,我获取 requested_datetime、updated_datetime 和 expected_datetime 的字符串日期值,并使用 pandas 的 to_datetime 方法将其转换为 datetime 对象(第 4、5 和 6 行)。

一旦我们有了数据框架,我们就可以计算调查和维修所需的平均天数。使用这些平均值,我们设置一个阈值来决定服务请求是慢还是快。

使用上面的分类,我们用 mplleaflet 对应的经度和纬度来绘制坑洞的位置。

  • 比平均响应/调查慢(地图上的蓝点)
  • 比平均响应/调查更快(地图上的黑点)
  • 比平均修复速度慢(地图上的红色方块)
  • 比平均修复速度更快(地图上的绿色方块)

上面的文件保存为 HTML 格式,其中包含我们最终的可视化。

您可以在这里查看互动结果:http://www.mmonzoor.com/pot_holes.html

结论

到目前为止,我们已经学习了如何使用 JSON 对象等结构化数据,通过 GET 请求进行 API 调用,使用 pandas 清理数据,以及通过 matplotlib 可视化清理后的数据。现在你有了一个清晰的数据框架,可以随意调查你可能对你的城市有疑问的问题。如果你所在的城市有像 311 Toronto 这样的开放数据目录,试着模仿这个教程,也许你会发现一些有趣的见解!我希望这个教程是有帮助的,我愿意尽我所知回答任何问题,所以请随意评论。

GitHub 知识库

[## mmonzoor/introductive _ pot _ hole _ viz

在 GitHub 上创建一个帐户,为 mmonzoor/introductive _ pot _ hole _ viz 开发做贡献。

github.com](https://github.com/mmonzoor/introductory_pot_hole_viz)

将机器学习服务从 AWS 映射到 Google Cloud 再映射到 Azure

原文:https://towardsdatascience.com/mapping-machine-learning-services-from-aws-to-google-cloud-to-azure-32b7e76ef674?source=collection_archive---------28-----------------------

AWS、谷歌云和 Azure 的不同机器学习相关云服务列表。谷歌已经提供信息来帮助人们从 AWS 或 Azure 迁移

https://cloud . Google . com/free/docs/map-AWS-Google-cloud-platformhttps://cloud . Google . com/free/docs/map-azure-Google-cloud-platform

微软也提供了类似的对比—https://docs . Microsoft . com/en-us/azure/architecture/AWS-professional/services

下面的列表是基于上述链接,我添加了 AWS 和 Azure 服务的链接。

语音转文字——亚马逊转录|*|云语音转文字||天蓝色语音转文字*

文字转语音——亚马逊波利 | 云文字转语音||天蓝色文字转语音

视觉亚马逊认知 | 云视觉 | 认知服务视觉

NLP亚马逊领悟|云自然语言 | 认知服务语言

翻译——亚马逊翻译 | 云翻译|*|语音翻译*

对话式 AI亚马逊 Lex | 谷歌 dialog flow|*Azure LUIS*

视频智能——亚马逊 Rekognition|*|云视频智能 | Azure 视频索引器*

AutoML—NA*|**|Cloud AutoML(beta)||Azure ML Studio*

完全托管 ML——亚马逊 SageMaker | 云机器学习引擎 | Azure ML 服务

亚马逊最近推出了一些新服务,如用于时间序列预测的亚马逊预测和用于创建推荐系统的亚马逊个性化,目前谷歌云和 Azure 都没有类似的服务。

在命名服务方面,亚马逊有最好的名字,如 Polly、Lex 等:)。我认为谷歌和 Azure 应该开始更好地命名他们的服务:)

*[## 将 AWS 服务映射到谷歌云平台产品|谷歌云平台免费层|谷歌云

如果你熟悉亚马逊网络服务(AWS),快速了解各种谷歌云平台…

cloud.google.com](https://cloud.google.com/free/docs/map-aws-google-cloud-platform)* *[## 将 Microsoft Azure 服务映射到 Google 云平台产品| Google 云平台免费层|…

如果你熟悉微软 Azure 服务,快速了解各种谷歌云平台…

cloud.google.com](https://cloud.google.com/free/docs/map-azure-google-cloud-platform)* * [## AWS 与 Azure 服务对比——Azure 架构中心

这篇文章帮助你理解微软 Azure 服务与亚马逊 Web 服务(AWS)的比较。无论你是…

docs.microsoft.com](https://docs.microsoft.com/en-us/azure/architecture/aws-professional/services)*

映射混乱的地址第 1 部分:获取纬度和经度

原文:https://towardsdatascience.com/mapping-messy-addresses-part-1-getting-latitude-and-longitude-8fa7ba792430?source=collection_archive---------11-----------------------

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

我的家乡多伦多有幸拥有北美唯一一个大型有轨电车网络,它在战后的街头铁路仇杀中幸存了下来。多伦多的有轨电车是整个快速交通系统的重要组成部分。然而,他们有一个明显的弱点——如果一辆电车被堵了,其他电车就不可能绕过它,所以电车延误有可能引发交通堵塞。我一直在研究一个模型,该模型使用一个公开的关于有轨电车延误信息的数据集来预测和帮助防止这种延误。

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

Streetcar delays can cause gridlock (photo by author)

电车延误数据集包括自 2014 年 1 月以来系统中每次延误的详细信息,包括延误的时间、持续时间和位置。

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

Streetcar delay dataset

问题是:杂乱的地址

位置字段完全是非结构化的-交叉点以多种格式表示(“Queen and Sherbourne”、“queen/sherbourne”),街道和地标的指示不一致。

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

例如,单个地标可能出现在具有多个不同位置值的数据集中:

  • 朗塞斯瓦勒斯场
  • 朗西场
  • 朗克。车房。

我需要可视化延迟的位置,以了解网络的哪些部分最容易出现拥堵。为了可视化位置,我需要将它们转换成纬度和经度值。在本文中,我描述了如何从输入数据集中杂乱的位置获取纬度和经度值。在本系列的下一篇文章中,我将描述如何使用这些纬度和经度值来生成地图以可视化延迟模式。

解决方案第 1 部分:清理位置值以减少冗余

在尝试获取纬度和经度值之前,我开始对位置值进行一些老式的清理,包括:

  • 将所有位置值设置为小写

  • 替换用多个字符串表示的公共值,包括不一致的街道名称,并对所有交汇点使用一致的连接:

  • 应用一个函数为交叉点处的街道名称提供一致的顺序,以避免冗余,如“皇后和宽景”/“宽景和皇后”:

这些简单的清理将唯一位置的数量减少了 35%,从 15.6 k 减少到 10 k 多一点。正如我们将看到的,减少唯一位置的数量意味着对 API 进行更少的调用来将位置转换为经度和纬度值。Google 地理编码 API 每 k 次调用的成本为 5.00 美元,所以我通过减少唯一位置的数量节省了 25 美元。

解决方案第 2 部分:使用 Google 地理编码 API 获取纬度和经度值

我决定使用 Google 地理编码 API 来获取纬度和经度值。这一过程没有我预想的那么简单,我希望如果您使用地理编码 API,您可以从我学到的经验中受益,如下所述。

以下是我在从 Python 调用地理编码 API 之前必须采取的步骤:

  • 在 Google Cloud 中建立一个项目。我按照说明这里
  • 查看地理编码 API 介绍材料,并按照其中的说明(1)为您的谷歌云项目激活地理编码 API,以及(2)获取地理编码 API 的 API 密钥
  • 查看用于谷歌地图服务的 Python 客户端自述文件,了解如何从 Python 调用地理编码 API 的说明

要准备从 Python 调用地理编码 API:

  1. 安装客户端
! pip install -U googlemaps

2.将您的 API 键与地理编码 API 客户端相关联,并调用地理编码 API 获取已清理数据集中的样本地址:“lake shore blvd. and superior st .”请注意,传递给地理编码 API 的地址包括数据集中的位置和城市(数据集中所有位置的城市均为“多伦多”)。

3.检查返回的纬度和经度以确认它与输入地址匹配:

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

Latitude and longitude returned by the Geocoding API match the input location

既然我们已经验证了从位置值到纬度/经度再回到地址的往返过程,那么在我们能够转换整批位置值之前,还有一些障碍需要克服。

障碍#1:地理编码 API 在看似无辜的位置值上受阻

地理编码 API 阻塞了一些位置值,但不是我预期的位置值。我天真地试图通过发送垃圾地址“asdfasdfjjjj”来测试 API,并得到非空的 JSON:

然而,当我试图转换一批位置时,它在一个看起来不错的位置值上失败了:“roncesvalles to neville park”

为了可靠地转换一批位置,我必须将地理编码 API 调用封装在一个函数中,该函数检查返回的列表是否为空,如果是,则返回占位符值:

障碍 2:默认的每日 API 限制对于我需要转换的一批位置来说太小了

使用定义为可靠地调用地理编码 API 的 get_geocode_result 函数,我准备好进行批处理运行来转换位置值。为了最小化对 API 的调用,我定义了一个新的数据帧 df_unique ,它只包含唯一的位置值:

然而,当我调用 get_geocode_result 函数向 df_unique 数据帧添加纬度和经度值时:

我收到以下错误消息:

在谷歌云控制台中检查我的项目的配额页面,我可以看到我每天对地理编码 API 的调用限制只有 1400 次。这就是为什么当我试图为值超过 10k 的 df_unique 数据帧调用 API 时,会出现 OVER_QUERY_LIMIT 错误。

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

为了增加我对这个项目的地理编码 API 调用的每日限额,我必须向 Google Cloud support 开一张罚单,要求提高我对地理编码 API 的每日限额:

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

进行批处理运行以将位置转换为经度和纬度

随着我的每日地理编码 API 限制的提高,我能够在 df_unique 数据帧上无错误地调用 API。1.5 小时后(表示大约 110 次 API 调用/分钟),我得到了一个数据帧,其中包括所有不同位置的纬度和经度值:

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

接下来,我在 df_unique 数据帧中创建不同的经度和纬度列,然后用 df_unique 连接原始数据帧:

最后,我有一个数据帧,包含所有原始数据以及与位置值对应的纬度和经度值:

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

摘要

下面总结了获取纬度和经度值以对应原始数据集中所有混乱位置所需的步骤:

  1. 清理原始数据集以移除冗余位置并减少唯一位置的数量
  2. 通过在 Google Cloud 中创建一个项目,获取一个 API 密钥,并为 Google Maps 服务设置 Python 客户端,设置 Python 对 Google 地理编码 API 的访问
  3. 使用地址(位置和城市)调用地理编码 API,并解析返回的 JSON 以获得纬度和经度。检查返回空列表的 API,如果您要转换的不同位置的数量大于默认的每日限制,请使用 Google Cloud 支持打开一个票证以获得增加的每日 API 限制。

在本系列的下一篇文章中,我将描述如何使用这些纬度和经度值来生成地图,以可视化来自原始数据集的延迟模式。

如果您想亲自尝试本文中描述的代码:

  • 将位置转换为纬度和经度的主要笔记本是这里的。您将需要获得自己的 API 密钥来运行它。
  • 你可以在这个笔记本上使用的输入数据帧的一个例子是这里的。请注意,该数据帧中的位置值已经被清除(小写,街道名称以一致的顺序),如上文解决方案第 1 部分:清除位置值以减少冗余一节所述。

绘制混乱的地址第 2 部分:来自叶的见解

原文:https://towardsdatascience.com/mapping-messy-addresses-part-2-insights-from-folium-bafd55858faf?source=collection_archive---------12-----------------------

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

Toronto streetcar delay heat map

在本系列第一篇文章的中,我描述了多伦多有轨电车延迟数据集,并经历了从具有不精确、混乱的位置值的原始数据集获取所需的步骤:

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

到包含所有位置的纬度和经度值的数据帧:

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

在本文中,我将回顾使用第一篇文章中的纬度和经度值获得延迟数据的地图可视化的步骤。

映射镜头 1:像素化灰尘

我第一次尝试可视化包括纬度和经度的数据集时,我决定使用像素化数据

安装并导入 Pixiedust 后,显示数据框:

使用键纬度经度和数值最小延迟:

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

选择简单的聚类风格,我得到如下的地图:

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

Some streetcar delay locations are obviously not correct

来自 Pixiedust 可视化的一些观察:

  • 加纳以南的大西洋中的值位于本初子午线和赤道的交点(纬度/经度= 0.0/0.0)。在这些位置,地理编码 API 返回一个空列表,上一篇文章中描述的 get_geocode_result 函数返回一个占位符值。
  • 在绘制的 10 k 个位置中,超过 97k 个位于多伦多地区,并且是有轨电车延迟的潜在有效地点。

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

  • 除了多伦多地区的 9.7 k 个位置和[0.0,0.0]处的 238 个值之外,在世界其他地方有 43 个位置明显不符合有轨电车延迟的有效地点。

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

This “Toronto” streetcar is in San Francisco, but the dataset only covers Toronto (photo by author)

说完,我基本上用尽了我能用 Pixiedust 得到的东西。虽然 Pixiedust 没有给我想要的一切,但它确实提供了一些非常快速的见解,有助于节省时间。

贴图拍摄 2:叶子

在穷尽了我可以从 Pixiedust 获得的东西之后,我转向了follow,这是一个在 Python 的上下文中很容易利用 fleet . js 库的设施的库。

Pixiedust 可视化显示有轨电车网络上存在合法延迟位置之外的值。为了准备使用,我删除了位于有轨电车网络边界之外的记录。这将数据集的大小减少了 6.5%,只有 65 k 条记录。

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

Bounding box for valid streetcar delays

您可能想知道为什么街道网格不与边界框对齐。多伦多街道网格大致垂直于市中心的安大略湖海岸线,因此网格相对于由纬度和经度定义的边界框向左扭曲

回到代码—现在我们已经准备好安装和导入 Folium 了:

然后,我们可以创建一个简单的映射,显示数据集中前 2.5 k 条记录的延迟聚类:

这是生成的地图,它让我们了解了城市不同区域延误的相对集中程度:

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

我们可以放大到西部市区。注意女王街西的热点,在巴瑟斯特和奥辛顿之间,由三一贝尔伍兹公园南边的伯爵指示。

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

放大来仔细观察热点,很明显,公园南面的皇后区和斯特拉坎区是吸引延误的地方。在这个例子中,全市 7%的延误发生在这个十字路口。

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

既然我们已经查看了集群,让我们修改集群视图的代码,以显示延迟持续时间的热图视图:

这是整个系统的样子:

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

如果我们放大到市中心的中心部分,延误的集中是显而易见的,包括巴瑟斯特、斯帕迪纳和海湾与皇后码头交汇处的湖泊附近的三个不同的热点。

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

结论

通过的上一篇文章和这篇文章,我已经描述了从杂乱的自由格式地址到纬度和经度,再到使用 leav 的有用地图可视化的旅程。这些可视化提供了对数据的深入了解,例如街车延误热点的位置,这些数据很难从原始数据集中提取。

如果您想探索本文中描述的代码:

绘制城市中最受欢迎的地方

原文:https://towardsdatascience.com/mapping-the-most-popular-places-in-the-city-1cd0737e7023?source=collection_archive---------19-----------------------

使用蟒蛇,熊猫和树叶

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

“Mass” by Gaetano Virgallito. Licensed under CC BY-ND 2.0

当“数据科学”一词出现时,一些与分析人类行为、大城市、服务消费等相关的研究引起了我的兴趣。上次工作时,我为巴西纳塔尔的优步服务制作了一张地图,对如何更好地服务中心街区很感兴趣。这一次,人们的兴趣来自于谷歌的一个地点搜索功能:“大众时报”。

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

谷歌虽然聪明,但它可以向我们展示(有时甚至是“直播”)你搜索的地方有多忙。所以…

如果我根据热门时间比较几个地方呢?并发现特定类型的地方比其他地方更受欢迎?使用这种数据可以提出许多问题。

那么,为什么不从纳塔尔市中心(我居住的城市)以 15 英里为半径获取不同类型的地方,然后获取每个地方的流行时间数据,并用这些数据绘制一个交互式地图呢?这就是我们在这里做的。

我会尽量解释,用足够的细节不要让这篇文章讨厌,我是怎么做的,以及这个实验如何能被复制。这里用到的技术有 Python,pandas,叶子库。如果你想了解更多,代码可以在 GitHub 上找到,比如interactives Colab notebooks你可以上传自己的数据库并生成地图。

谷歌,谷歌…

在绘制地图之前,我们必须提取我们需要的数据。这将需要两种类型的数据:纳塔尔的一组地点和这些地点中的每一个地点,关于流行时刻的数据。

我们将使用 Google Places API 来获取位置。这个 API 提供了几种服务,对于所有这些服务,您都需要一个访问令牌来消费数据。

我使用了“附近搜索”来寻找纳塔尔市中心附近半径 15 英里的地方。脚本通过类型(健身房、超市、银行……)搜索这些地方——我为每种类型定义了我想要的地方的数量;这样我会得到最相关的结果。然后,该脚本保存。将数据集放置为places.csv的 csv 文件。

现在我们有地方了。通过我设置的过滤器和界限,我们在纳塔尔有 800 个地方。下一步是捕捉所有这些流行的时间。在 Places API 文档中查找该主题,您会注意到没有提到任何“流行时间”(至少直到今天,2019 年 5 月。)但是用谷歌快速搜索,我找到了让我们获得这项服务的回购。回购协议中说,谷歌确实允许这种查询,但不是免费的,这个 API 调用被 SKU 称为“查找当前位置”。你可以用每月分配的预算给这个 API 打 5000 个电话。

使用该 API,get_places_popular_moments.py读取 places 数据集并在其上包含热门时刻,生成新的places_with_moments.csv数据集。现在,我们应该有 800 个地方,但我们只有 300 个,因为没有每个地方的“流行时间”。

到目前为止,我们的数据集看起来像这样:

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

对于每个工作日列,有 24 个位置,具有一天中每个小时的力矩值。

用 follow 和 Kepler 生成地图

现在,我们希望将这些数据可视化在一个漂亮的交互式地图中。我们将使用基于 fleet . js 的 Python 库——来可视化地图。

这是纳塔尔周一上午 10 点的热门地点地图。圆圈的颜色表示地点的类型和大小,以及时刻值。

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

生成这个地图代码是这样的:

def generate_map(weekday, hour, types=places_types):
  natal = folium.Map(location=[-5.831308, -35.20470], zoom_start=13)
  ptypes_groups = {} for ptype in types:
    ptypes_groups[ptype] = FeatureGroup(name=ptype) for index, place in natal_places.iterrows():
    moments = json.loads(place[weekday])
    if (place.type in types):
      folium.Circle(location=[place.lat, place.lng],
                radius=int(moments[hour])*3,
                fill_color=colors[places_types.index(place.type)],
                fill_opacity=0.6).add_to(ptypes_groups[place.type])
  for ptype, group in ptypes_groups.items():
    group.add_to(natal) LayerControl().add_to(natal)
  return natal

它将星期几、小时和可选的地点类型子集作为参数。它做的第一件事是创建一个新的地图natal,并为每个想要的类型创建一个FeatureGroup。这个资源允许我们在地图上创建一个带有切换类型选项的菜单。

遍历数据集上的所有项目,我们将每个项目添加到相应的特征组。

深入到 colab 笔记本中,您会看到对数据集进行了修改,使其适合与 Kepler.gl 一起使用,这是一个强大的地理空间分析 web 工具。开普勒给了我们比叶更多的资源,而且性能非常好。所以我们可以这样做:

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

Anitation made with Kepler

上面的动画是使用开普勒生成的,让我们可以看到纳塔尔在这一周的移动情况。开普勒还允许我们导出环境,使其可以在线访问,在这个地址你可以访问上面的地图。

我们还能做什么?

乍一看,关于流行时间的信息没什么意义。谷歌说的“地方 100 拥挤”是什么意思?这是这个地方的人口密度等级?这些流行的时代数据到底意味着什么?

通过更好地分析一些值,我意识到“momet”的范围是从 0 到 100,这导致了诸如“通常不太忙”或“通常有点忙”之类的分类。但我真正的问题是“这些信息有多大意义?”

为了更好地理解它,我采用了另一种方法,对在数据集中找到一些有用的信息感兴趣。这是我的发现:

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

这个不错。图表中显示的健身房流量证实了一个常识:健身房周一更忙,周五没那么忙。高峰时间大约是晚上 20 点

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

大多数图表在午餐时间没有高峰时间,这与机场不同,机场在下午 12 点更忙

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

星期五下午,医疗诊所有所减少。

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

纳塔尔的人们喜欢在星期五下午去理发店。

这些是从我们获得的数据中可以推断出的一些有趣的信息。总的来说,我很高兴这些数据与现实相符,这让我相信这确实是“流行时代”数据中的一个含义。这些结果可能会引导我们进行有趣的分析,这对理解纳塔尔,当然还有其他城市的行为是有意义的。

用主题建模描绘技术世界

原文:https://towardsdatascience.com/mapping-the-tech-world-with-topic-modelling-bfc3c40af507?source=collection_archive---------31-----------------------

我们用流行的话题建模算法 LDA 分析了 20 万篇科技新闻文章

克里斯托夫·乔迪、祖卡斯·纳瓦罗、米查什·帕利斯基、马切伊·维拉莫夫斯基(德拉布·UW,华沙大学)

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

Image by: DELab UW

作为 NGI 前进项目的一部分,德拉布·UW正在支持欧盟委员会的下一代互联网计划,确定与互联网相关的新兴技术和社会问题。我们的团队一直在尝试各种自然语言处理方法,以发现不同类型的在线媒体中的趋势和隐藏模式。您可以在这里找到我们的工具和演示文稿。

这篇文章展示了我们对科技新闻的最新分析结果。我们有两个主要目标:

  1. 在讨论新兴技术和社会问题的新闻中发现最重要的话题,
  2. 来映射这些主题之间的关系。

我们的文本挖掘练习基于由 213 000 篇科技媒体文章组成的科技新闻数据集。数据收集时间为 40 个月(2016 年 1 月 1 日至 2019 年 4 月 30 日),包括文章的纯文本。如图所示,出版商位于美国、英国、比利时和澳大利亚。关于数据集的更多信息可以在我们的 Zenodo 知识库中获得。

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

Sources by number of articles and country

在这篇简短的介绍中,我们关注一种广泛使用的文本挖掘方法:潜在狄利克雷分配(LDA)。LDA 因其易用性、灵活性和可解释的结果而广受欢迎。首先,我们为所有非技术读者简要解释算法的基础。在文章的第二部分,我们展示了 LDA 在一个足够大的数据集上可以实现什么。

皱胃向左移

文本数据是高维的。在最基本的形式中,它通常被表示为单词包(BOW)矩阵,其中每行是一个文档,每列包含一个单词在文档中出现的频率。这些矩阵可通过线性代数方法进行转换,以发现其中隐藏的(潜在的和低维的)结构。

主题建模假设文档(如新闻文章)包含各种不同的主题。例如,报道剑桥分析丑闻的新闻文章可能包含以下主题:社交媒体、政治和技术法规,具有以下关系:60%社交媒体、30%政治和 10%技术法规。另一个假设是,主题包含特征词汇,例如,社交媒体主题由脸书、推特等词描述。

LDA 是由 Blei 等人(2003) 基于贝叶斯统计提出的。该方法的名称提供了它的关键基础。潜在来自于文档包含我们事先不知道的潜在主题的假设。分配表明我们将单词分配给主题,将主题分配给文档。狄利克雷是一个多项式似然分布:它提供了任何数量的结果的联合分布。例如,狄利克雷分布可以描述野生动物园中观察到的物种的出现(唐尼,2013 )。在 LDA 中,它描述了主题在文档中的分布,以及词在主题中的分布。

主题建模方法背后的基本机制很简单:假设文档可以由有限数量的主题描述,我们试图从由特征词组成的主题组合中重建我们的文本。更准确地说,我们旨在通过两个矩阵的组合来重新创建我们的 BOW 单词-文档矩阵:包含文档中主题的狄利克雷分布的矩阵(主题-文档矩阵),以及包含主题中的单词的矩阵(单词-主题矩阵)。最终矩阵的构建是通过一个叫做吉布斯采样的过程实现的。Gibbs 抽样背后的思想是将改变逐字引入两个矩阵:改变文档中所选单词的主题分配,并评估这种改变是否改进了我们文档的分解。在所有文档中重复 Gibbs 抽样的步骤提供了提供样本的最佳描述的最终矩阵。

关于主题建模的更多细节,我们推荐这个这个的优秀帖子。关于这项研究的完整技术描述,请阅读我们的完整报告

结果

主题建模最重要的参数是主题的数量。主要目标是达到令人满意的主题分离水平,即主题既不是所有问题都集中在一起,也不是过于分散的问题。为了实现这一点,我们试验了不同的 LDA 超参数水平。对于有 20 个主题的设置,主题是平衡的和可分离的。

因此,我们确定了 20 个主要主题,呈现在下面的可视化中。每个圆圈代表一个主题(大小反映了主题在文档中的流行程度),距离由词汇的相似性决定:共享相同单词的主题彼此更接近。在第二个图中,条形代表当前所选主题的特有术语(对于图示,主题 1。被选中)。一对重叠的条表示给定术语在语料库范围内的频率,以及其特定主题的频率。我们设法达到逐渐减小的主题大小:最大的主题占 19%,第五个 8%,第十个 5%。

要探索呈现结果的交互式可视化,请点击此处

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

For the interactive visualisation see: https://mpalinski.github.io/ngi-fwd-deliv/

在研究了这些最相关的术语后,我们用最接近的总括术语标记了每个主题。经过仔细检查,我们将话题数量减少到了 17 个(话题 5 和 16 成为了联合类别太空技术,话题 10 &和 19 被融合在一起形成了一个关于媒体的话题,而话题 14 &和 15 则专注于 CPU 和其他硬件)。在接下来的章节中,我们将简要介绍已确定的主题。

话题一: AI &机器人

人工智能和机器人构成了最大的主题,约占所有令牌的 19%,其特点是机器学习术语(例如训练数据)以及流行的人工智能应用(机器人、自动驾驶汽车)。

话题 2:社交媒体危机

社交媒体话题也同样普遍,涵盖了现代社交媒体平台( facebooktwitter )有争议的方面,如隐私权、内容节制、用户禁令或选举干预使用微目标(例如:隐私禁令选举内容删除)。

话题三:商业新闻

大量科技文章报道了商业新闻,尤其是在主要平台(T0)、T2 亚马逊、云计算(T4 AWS、T5)等服务或物联网、区块链 T9 等新兴技术上。主题词也暗示了对科技公司财务结果的高度关注(收入亿销售增长)。

主题 4:智能手机

主题 4 涵盖了关于 522 亿美元智能手机市场的文章。两大制造商——三星和苹果——以同样的出场次数名列关键词列表之首。文章重点介绍设备的特点、参数及提供的附加服务(摄像头显示器alexa 等)。).

主题 5 和 16:空间

对太空探索的兴奋在科技媒体中很常见。这些主题包括关于美国国家航空航天局、未来的火星和月球任务以及致力于空间技术的公司的报告,如 SpaceX。

主题 6:隐私

主题 6 围绕剑桥分析隐私丑闻展开,并在语料库中收集该关键词的所有提及内容。英国退出欧盟公投期间,剑桥分析公司(Cambridge Analytica)参与公投脱欧运动是一个主要焦点,诸如 euuk 等关键词的高位表明了这一点。不出所料,在处理加州争议后果的文章中也经常提到 GDPR。

话题七:网络安全

主题 7 涉及网络空间安全问题。它探索恶意软件和系统漏洞的主题,既针对传统的计算机系统,也针对基于区块链的新型分散技术。

主题 8: 5G

备受期待的第五代无线网络具有巨大的潜力,可以通过 ICT 组件改变所有领域。话题 8 涉及向市场提供 5G 技术的全球竞争(华为爱立信)。它还捕捉到了关于 5G 对网络中立性的影响的争论。5G 的主要质量是实现信号的“分段”,这就引发了一场争论,即根据网络中立法,它是否能像前几代移动通信一样被对待。

话题九:跨平台

主题 9 的重点是操作系统,包括移动( iosandroid )、桌面( windowsmacos )以及专用服务(浏览器 chromemozilla )和应用商店( appstore )。

主题 10 和 19:媒体

媒体主题围绕最重要的媒体平台:流媒体和社交媒体。2018 年,全球视频流媒体市场规模约为 370 亿美元,音乐流媒体在此基础上又增加了 90 亿美元,占音乐行业收入的近一半。特别是,本主题关注主要的流媒体平台( youtube网飞spotify )、社交媒体( facebookinstagramsnapchat )、播客的日益流行以及流媒体服务的商业策略(订阅广告)。

话题 11:微软

在其 40 年的历史中,微软已经进行了 200 多次收购。其中一些被认为是成功的(如 LinkedIn、Skype),而另一些则不那么成功……(诺基亚)。话题 11 收集了描述微软近年来完成、计划和失败的收购的文章( githubskypedropboxslack )。

话题 12: 自动驾驶汽车

自主交通是公众辩论的一个重要话题。决策者应该考虑是否应用补贴或税收来平衡这项技术的公共和私人成本和利益。视听技术为社会福利提供了巨大利益的可能性——拯救生命;减少撞车、拥堵、油耗和污染;增加残疾人的行动能力;并最终改善土地利用(兰德,2016 )。专题 12 阐述了该技术的技术缺陷(电池)以及积极的外部性,如降低排放( epa排放)。

话题 13:特斯拉

LDA modelling 已经将特斯拉和其他 Elon Musk 项目确定为一个单独的主题。除了特斯拉电动汽车和自动驾驶汽车的发展,该主题还包括与其他移动解决方案相关的词汇(如 Lime)。

主题 14 和 15: CPU 和其他硬件

主题 14 涵盖英特尔和 AMD 之间的 CPU 创新竞赛,以及因国家安全问题被 Donald Trump 阻止的 Broadcom-高通收购事件。主题 15 包括关于各种标准( usb-c )、存储设备( ssd )等的新闻。

主题 17:初创企业

主题 17 集中于创业生态系统和众包融资。文章讨论了创业战场或创业小巷等主要创业竞赛,以及 Patreon 等众筹服务。

话题 18: 可穿戴设备

我们观察到可穿戴设备的采用激增,如健身追踪器、智能手表或增强和虚拟现实耳机。这一趋势带来了重要的政策问题。一方面,可穿戴设备在监测健康方面提供了巨大的潜力。另一方面,它可能会被对用户隐私和个人数据访问的担忧所掩盖。专题 18 中的文章讨论了可穿戴设备领域关于新设备、新功能等的新闻。( fitbit心率)。

话题 20: 博彩

主题 20 涉及博彩业。它涵盖了流行游戏(口袋妖怪)、游戏平台(任天堂)、各种游戏控制台( switch )和游戏博览会( e3 )。

结论

我们通过主题建模提供了技术世界的鸟瞰图。主题建模是探索广泛主题的适当基础,如社交媒体危机、人工智能或商业新闻。在这个阶段,我们能够确定引发公众辩论的主要总括主题。

我们的完整报告还包括另一种机器学习方法:t-SNE。在这种算法的帮助下,我们创建了一个新闻的二维地图,其中涉及相同主题的文章是邻居。

使用 Python 中的 Matplotlib、Pandas、Geopandas 和底图进行制图

原文:https://towardsdatascience.com/mapping-with-matplotlib-pandas-geopandas-and-basemap-in-python-d11b57ab5dac?source=collection_archive---------0-----------------------

作为 FORSK TECHNOLOGIES, 的一名实习生,我探索了相当多的 Python 库(Matplotlib、Pandas、Numpy、Seaborn、Shapefile、Basemap、Geopandas ),它们对绘制数据(某种程度上也是实时数据)很有帮助…)过地图。

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

用 Python 绘制地理地图

在处理数据科学时,可视化地图上的数据非常有用,这可以通过 geopandas 等模块来完成。在这里,我们将探索使用 shapefiles ()创建地理地图并在其上可视化数据的方法。shp)和其他一些 Python 库。

在这里,我们将根据地图上的可视化数据来研究拉贾斯坦邦的城市人口。

本文所需的 shapefile 可以从这个链接下载 点击这里

安装 Shapefile 库

*~ conda/pip install pyshp*

导入库

*import numpy as np
import pandas as pd
import shapefile as shp
import matplotlib.pyplot as plt
import seaborn as sns*

初始化可视化集

*sns.set(style=”whitegrid”, palette=”pastel”, color_codes=True) sns.mpl.rc(“figure”, figsize=(10,6))*

打开矢量地图

矢量地图是一组具有. shp 格式的文件。

*#opening the vector map**shp_path = “\\District_Boundary.shp”**#reading the shape file by using reader function of the shape lib**sf = shp.Reader(shp_path)*

shp.reader 导入的不同形状的数量

*len(sf.shapes())*

结果将是 33,这告诉我们有 33 个形状,或者我们可以说拉贾斯坦邦地区的城市。

要浏览这些记录:

*sf.records()*

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

A sample output

要浏览特定记录,其中 1 是 Id 或行号,0 表示列:

***sf.records()[1][0]***

结果-

Output= Barmer

将形状文件数据转换为熊猫数据帧:

通过将 shapefile 数据转换为更相关的 Pandas Dataframe 格式,使访问城市变得更加容易。

**def read_shapefile(sf):**
    #fetching the headings from the shape file
    fields = [x[0] for x in sf.fields][1:]#fetching the records from the shape file
    records = [list(i) for i in sf.records()]
    shps = [s.points for s in sf.shapes()]#converting shapefile data into pandas dataframe
    df = pd.DataFrame(columns=fields, data=records)#assigning the coordinates
    df = df.assign(coords=shps)
    return df

数据转换为数据帧后的可视化,其中数据帧指的是行和列

*df = read_shapefile(sf)****df.shape***

具有(33,6)形状的数据帧意味着其中有 33 行和 6 列。

让我们看看创建的数据帧的示例

*# sample of a data representation the last point has the coordinates of the data latitude and longitude which will be used to create a specific map shape****df.sample(5)***

结果会是这样的—

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

Output

这里的线是用来创建地图的纬度和经度。

借助 Matplotlib 绘制拉贾斯坦邦的城市地图或特定形状

#a)根据城市坐标绘制形状(多边形),

#b)计算并返回该特定形状的中点(x0,y0)。

#此中点也用于定义打印城市名称的位置。

**def plot_shape(id, s=None):**
    plt.figure()
    #plotting the graphical axes where map ploting will be done
    ax = plt.axes()
    ax.set_aspect('equal')#storing the id number to be worked upon
    shape_ex = sf.shape(id)#NP.ZERO initializes an array of rows and column with 0 in place of each elements 
    #an array will be generated where number of rows will be(len(shape_ex,point))and number of columns will be 1 and stored into the variable
    x_lon = np.zeros((len(shape_ex.points),1))#an array will be generated where number of rows will be(len(shape_ex,point))and number of columns will be 1 and stored into the variable
    y_lat = np.zeros((len(shape_ex.points),1))
    for ip in range(len(shape_ex.points)):
        x_lon[ip] = shape_ex.points[ip][0]
        y_lat[ip] = shape_ex.points[ip][1]#plotting using the derived coordinated stored in array created by numpy
    plt.plot(x_lon,y_lat) 
    x0 = np.mean(x_lon)
    y0 = np.mean(y_lat)
    plt.text(x0, y0, s, fontsize=10)# use bbox (bounding box) to set plot limits
    plt.xlim(shape_ex.bbox[0],shape_ex.bbox[2])
    return x0, y0

设置城市名称以绘制各自的地图

*DIST_NAME = ‘JAIPUR’**#to get the id of the city map to be plotted**com_id = df[df.DIST_NAME == ‘JAIPUR’].index.get_values()[0]****plot_shape(com_id, DIST_NAME)****sf.shape(com_id)*

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

Output

为了绘制特定的形状,我们必须知道特定城市的 ID,但是将 shapefile 文件数据更改为 Pandas dataframe 使工作变得更加容易和简单,现在我们可以直接调用它的名称。

绘制全图

这个特殊的函数将所有使用坐标制作的单个形状组合起来,并显示为一个组合形状。

def plot_map(sf, x_lim = None, y_lim = None, figsize = (11,9)):
    plt.figure(figsize = figsize)
    id=0
    for shape in sf.shapeRecords():
        x = [i[0] for i in shape.shape.points[:]]
        y = [i[1] for i in shape.shape.points[:]]
        plt.plot(x, y, 'k')

        if (x_lim == None) & (y_lim == None):
            x0 = np.mean(x)
            y0 = np.mean(y)
            plt.text(x0, y0, id, fontsize=10)
        id = id+1

    if (x_lim != None) & (y_lim != None):     
        plt.xlim(x_lim)
        plt.ylim(y_lim)*#calling the function and passing required parameters to plot the full map****plot_map(sf)***

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

绘制缩放地图

*y_lim = (2900000,3000000) # latitude**x_lim = (200000, 400000) # longitude****plot_map(sf, x_lim, y_lim)***

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

output

在完整的地图上突出显示一个单一的形状

结合以前的功能就可以了。我们可以在一张完整的地图上画出一个形状。ID 和颜色代码将是该功能的必需参数。

**def plot_map_fill(id, sf, x_lim = None, 
                          y_lim = None, 
                          figsize = (11,9), 
                          color = 'r'):**

    plt.figure(figsize = figsize)
    fig, ax = plt.subplots(figsize = figsize)
    for shape in sf.shapeRecords():
        x = [i[0] for i in shape.shape.points[:]]
        y = [i[1] for i in shape.shape.points[:]]
        ax.plot(x, y, 'k')

    shape_ex = sf.shape(id)
    x_lon = np.zeros((len(shape_ex.points),1))
    y_lat = np.zeros((len(shape_ex.points),1))
    for ip in range(len(shape_ex.points)):
        x_lon[ip] = shape_ex.points[ip][0]
        y_lat[ip] = shape_ex.points[ip][1]
    ax.fill(x_lon,y_lat, color)

    if (x_lim != None) & (y_lim != None):     
        plt.xlim(x_lim)
        plt.ylim(y_lim)*#plot_map_fill(0, sf, x_lim, y_lim, color=’y’)****plot_map_fill(13, sf,color=’y’)***

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

Desired Output

用城市 ID 在整个地图上突出显示多个形状

在这个函数的帮助下,作为参数,我们可以给出多个城市的 ID,这将导致突出显示多个城市而不是 1 个。

**def plot_map_fill_multiples_ids(title, city, sf, 
                                               x_lim = None, 
                                               y_lim = None, 
                                               figsize = (11,9), 
                                               color = 'r'):**

    plt.figure(figsize = figsize)
    fig, ax = plt.subplots(figsize = figsize)
    fig.suptitle(title, fontsize=16)
    for shape in sf.shapeRecords():
        x = [i[0] for i in shape.shape.points[:]]
        y = [i[1] for i in shape.shape.points[:]]
        ax.plot(x, y, 'k')

    for id in city:
        shape_ex = sf.shape(id)
        x_lon = np.zeros((len(shape_ex.points),1))
        y_lat = np.zeros((len(shape_ex.points),1))
        for ip in range(len(shape_ex.points)):
            x_lon[ip] = shape_ex.points[ip][0]
            y_lat[ip] = shape_ex.points[ip][1]
        ax.fill(x_lon,y_lat, color)

        x0 = np.mean(x_lon)
        y0 = np.mean(y_lat)
        plt.text(x0, y0, id, fontsize=10)

    if (x_lim != None) & (y_lim != None):     
        plt.xlim(x_lim)
        plt.ylim(y_lim)

让我们看看地图是什么样子的

*#naming the id numbers of the cities to be coloured**city_id = [0, 1, 2, 3, 4, 5, 6]****plot_map_fill_multiples_ids(“Multiple Shapes”,******city_id, sf, color = ‘g’)***

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

通过城市名称在整个地图上突出显示多个形状

最近,我们遇到了用城市 ID(索引)突出显示形状的问题,但尽管我们的数据是熊猫数据框架,我们也可以通过提到城市名称来做到这一点。

# plotting the city on the map to be coloured by using the dist_name**def plot_cities_2(sf, title, cities, color):**

    df = read_shapefile(sf)
    city_id = []
    for i in cities:
        city_id.append(df[df.DIST_NAME == i.upper()]
                         .index.get_values()[0])
    plot_map_fill_multiples_ids(title, city_id, sf, 
                                       x_lim = None, 
                                       y_lim = None, 
                                       figsize = (11,9), 
                                       color = color);

让我们来看看输出

*south = [‘jaipur’,’churu’,’bikaner’]**plot_cities_2(sf, ‘DIST’, south, ‘c’)*

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

绘制热图

这是一种根据提供的值用不同强度的特定颜色填充形状的地图。它以地理格式提供清晰的数据解释。

在第一个函数中,我们将把我们的数据列表划分为区间或箱,其中每个箱将具有特定的颜色强度,6 个箱和 4 个不同的颜色托盘。

**def calc_color(data, color=None):**
        if color   == 1: 
            color_sq =  ['#dadaebFF','#bcbddcF0','#9e9ac8F0','#807dbaF0','#6a51a3F0','#54278fF0']; 
            colors = 'Purples';
        elif color == 2: 
            color_sq = ['#c7e9b4','#7fcdbb','#41b6c4','#1d91c0','#225ea8','#253494']; 
            colors = 'YlGnBu';
        elif color == 3: 
            color_sq = ['#f7f7f7','#d9d9d9','#bdbdbd','#969696','#636363','#252525']; 
            colors = 'Greys';
        elif color == 9: 
            color_sq = ['#ff0000','#ff0000','#ff0000','#ff0000','#ff0000','#ff0000'];

        else:           
            color_sq = ['#ffffd4','#fee391','#fec44f','#fe9929','#d95f0e','#993404']; 
            colors = 'YlOrBr';
        new_data, bins = pd.qcut(data, 6, retbins=True, 
        labels=list(range(6)))
        color_ton = []
        for val in new_data:
            color_ton.append(color_sq[val]) 
        if color != 9:
            colors = sns.color_palette(colors, n_colors=6)
            sns.palplot(colors, 0.6);
            for i in range(6):
                print ("\n"+str(i+1)+': '+str(int(bins[i]))+
                       " => "+str(int(bins[i+1])-1))
            print("\n\n   1   2   3   4   5   6")    
        return color_ton, bins;

函数 plot_cities()和 plot_map_fill_multiples_ids 应进行调整,以利用这种新的颜色方案:

**def plot_cities_data(sf, title, cities, data=None,color=None, print_id=False):**

    color_ton, bins = calc_color(data, color)
    df = read_shapefile(sf)
    city_id = []
    for i in cities:
        city_id.append(df[df.DIST_NAME == 
                            i.upper()].index.get_values()[0])
    plot_map_fill_multiples_ids_tone(sf, title, city_id, 
                                     print_id, 
                                     color_ton, 
                                     bins, 
                                     x_lim = None, 
                                     y_lim = None, 
                                     figsize = (11,9));**def plot_map_fill_multiples_ids_tone(sf, title, city,  
                                     print_id, color_ton, 
                                     bins, 
                                     x_lim = None, 
                                     y_lim = None, 
                                     figsize = (11,9)):** 
    plt.figure(figsize = figsize)
    fig, ax = plt.subplots(figsize = figsize)
    fig.suptitle(title, fontsize=16)
    for shape in sf.shapeRecords():
        x = [i[0] for i in shape.shape.points[:]]
        y = [i[1] for i in shape.shape.points[:]]
        ax.plot(x, y, 'k')

    for id in city:
        shape_ex = sf.shape(id)
        x_lon = np.zeros((len(shape_ex.points),1))
        y_lat = np.zeros((len(shape_ex.points),1))
        for ip in range(len(shape_ex.points)):
            x_lon[ip] = shape_ex.points[ip][0]
            y_lat[ip] = shape_ex.points[ip][1]
        ax.fill(x_lon,y_lat, color_ton[city.index(id)])
        if print_id != False:
            x0 = np.mean(x_lon)
            y0 = np.mean(y_lat)
            plt.text(x0, y0, id, fontsize=10)
    if (x_lim != None) & (y_lim != None):     
        plt.xlim(x_lim)
        plt.ylim(y_lim)

让我们举一个例子,以热图演示格式绘制数据。

*names= [‘jaipur’,’bikaner’,’churu’,’bhilwara’,’udaipur’]**data = [100, 2000, 300, 400000, 500, 600, 100, 2000, 300, 400, 500, 600, 100, 2000, 300, 400, 500, 600]**print_id = True # The shape id will be printed**color_pallete = 1 # ‘Purple’****plot_cities_data(sf, ‘Heat map of given cities’, names, data, color_pallete, print_id)***

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

绘制真实数据

绘制拉贾斯坦邦地区的人口图,这里指的是真实数据。

*# reading data set
census_17 = df.POPULATION**census_17.shape**#plotting**title = ‘Population Distrubution on Rajasthan Region’**data = census_17**names = df.DIST_NAME****plot_cities_data(sf, title, names, data, 1, True)***

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

希望你已经理解了通过 Python 库绘制地图的概念。

具体代码可以参考我的GITHUB

使用 Geopandas 制图

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

我们已经看到了用 Pandas 数据帧进行制图的过程,现在轮到用 Geopandas 数据帧对其进行可视化了。Geopandas 简化了 Python 中地理空间数据(包含地理成分的数据)的处理。它结合了熊猫和 shapely 的功能,通过运行一个更紧凑的代码。这是开始制作 choropleth 地图的最好方法之一。

让我们先通过 Geopandas 绘制一些地图,然后在上面绘制拉贾斯坦邦的人口!

上一主题中使用的 Shapefile 足以进一步用于 Geopandas。

安装

conda install geopandas

第一步是导入所需的库

import pandas as pd
import matplotlib.pyplot as plt
import geopandas as gpd

获取感兴趣的数据

作为印度最大的邦,拉贾斯坦邦是一个人口高度密集的邦。绘制人口地图将使可视化更加简单和高效。让我们设置路径,通过 Geopandas 打开 Rajasthan 地区的 shapefile。

# set the filepath and load
fp = “\\District_Boundary.shp”#reading the file stored in variable fp
map_df = gpd.read_file(fp)# check data type so we can see that this is not a normal dataframe, but a GEOdataframe**map_df.head()**

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

让我们预览一下地图

#plotting the map of the shape file preview of the maps without data in it
**map_df.plot()**

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

现在是时候打开包含要绘制的数据的 CSV 文件了。在这里,我们也可以为所需的数据制作一个 csv,但我只从 shapefile 中提取数据,而不是制作 csv 或在 web 上搜索,这样可以节省大量时间。

#opening the csv(.shp) file which contains the data to be plotted on the map
df = gpd.read_file(\\District_Boundary.shp”)df.head()#selecting the columns required
df = df[[‘DIST_NAME’,’POPULATION’]]#renaming the column name
data_for_map = df.rename(index=str, columns={‘DIST_NAME’: ‘DISTRICT’,‘POPULATION’: ‘POP’})

让我们预览一下地理数据框架

# check dat dataframe
**data_for_map.head()**

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

现在,让我们将地理数据与数据集连接起来

# joining the geodataframe with the cleaned up csv dataframe
merged = map_df.set_index(‘DIST_NAME’).join(data_for_map.set_index(‘DISTRICT’))#.head() returns the top 5(by default ) lines of the dataframe
**merged.head()**

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

Output after merging datasets

映射时间

首先,我们需要为 Matplotlib 绘制地图做一些预先要求的工作,如设置变量、范围和为地图创建基本图形。

# set a variable that will call whatever column we want to visualise on the map
variable = ‘POP’# set the range for the choropleth
vmin, vmax = 120, 220# create figure and axes for Matplotlib
fig, ax = plt.subplots(1, figsize=(10, 6))

创建地图的时间

merged.plot(column=variable, cmap=’BuGn’, linewidth=0.8, ax=ax, edgecolor=’0.8')

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

这就是我们想要的,地图已经准备好了!但是需要一些美化和定制。

# remove the axis
ax.axis(‘off’)# add a title
ax.set_title(‘Population of Rajasthan’, fontdict={‘fontsize’: ‘25’, ‘fontweight’ : ‘3’})# create an annotation for the data source
ax.annotate(‘Source: Rajasthan Datastore, 2019’,xy=(0.1, .08), xycoords=’figure fraction’, horizontalalignment=’left’, verticalalignment=’top’, fontsize=12, color=’#555555')

颜色条是地图中必不可少的东西,它告诉我们要寻找的参数,让我们为我们的地图定制它。

# Create colorbar as a legend
sm = plt.cm.ScalarMappable(cmap=’BuGn’, norm=plt.Normalize(vmin=vmin, vmax=vmax))# empty array for the data range
sm._A = []# add the colorbar to the figure
cbar = fig.colorbar(sm)#saving our map as .png file.
fig.savefig(‘map_export.png’, dpi=300)

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

您可能已经知道为什么使用 Geopandas 进行制图更好了。它有一个非常紧凑和简单的代码,并给出了一个很好的期望输出。通过这种方法,我们可以绘制任何地区的任何类型的数据。

关于 th e 的确切代码,请参考我的 GITHUB

使用底图制图

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

Matplotlib 底图工具包是一个用于在 Python 中的地图上绘制 2D 数据的库。底图本身不进行任何绘图,但提供了将坐标转换为 25 种不同地图投影之一的工具。 Matplotlib 用于在转换后的坐标中绘制轮廓、图像、矢量、线或点。提供了海岸线、河流和政治边界数据集,以及绘制它们的方法。

在本节中,您将了解如何通过底图工具包在地图上绘制数据。

让我们通过底图工具包来查看地图可视化。

安装

conda install basemap
conda install basemap-data-hires

导入库

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import geopandas as gpd
import pandas as pd

注意:如果在导入底图库时遇到任何困难或错误(PROJ_LIB ),您可以直接设置其路径,以便在导入底图之前导入并运行它。

#to import the basemap library give the direct path to the libraryimport os
os.environ["PROJ_LIB"]="C:\\Users\\Anaconda3\\Library\\share"

让我们从 csv 和 shapefile 中获取感兴趣的数据。以下是下载所需 csv 文件的链接 点击此处 和所需 shapefile】点击此处

city=gpd.read_file("F:\\District_Boundary.shp")
csv=pd.read_csv("\\latlong_raj.csv")

我们从加载数据开始。Lat-long 是从一个单独的 csv 中导入的,其他数据如地区名称及其人口来自。在前面部分下载的 shp 文件。

lat=csv['LAT'].values
lon=csv['LONG'].values
population = city['POPULATION'].values
dist=city['DIST_NAME'].values

这些数据已经被保存为一个 numpy 数组,你可以通过[ type(lat)] 来检查它。

接下来,我们设置地图投影,散布数据,然后创建一个颜色栏

fig = plt.figure(figsize=(8, 8))
m = Basemap(projection='lcc', resolution='h', 
            lat_0=27.0238, lon_0=74.2179,
            width=1.05E6, height=1.2E6)
m.shadedrelief()

我们的地图背景现在已经准备好了,可以在上面绘制数据。印度拉贾斯坦邦的 lat-long 已经用“lcc”投影设置了一定的缩放量,以便只聚焦特定的状态。

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

我们来给它添加一些细节,划分一下界限。

m.drawcoastlines(color='blue',linewidth=3)
m.drawcountries(color='gray',linewidth=3)
m.drawstates(color='gray')

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

现在是时候在地图投影上散布数据并设置颜色条了。

# scatter city data, with c reflecting population
m.scatter(lon,lat, latlon=True,
          c=population,s=700,
          cmap='YlGnBu_r', alpha=0.5)#create colorbar 
plt.colorbar(label=r'Population')
plt.clim(300000, 4000000)

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

看起来是不是少了点什么?是啊!当然,区名。我们无法通过这种投影来识别地区。

让我们把它们画出来。

我们在上面的变量中存储了地区名称及其经度,但是我们将数据存储为 numpy 数组,所以我们需要将它们存储在列表或字典中。

dict1={}
list1=[]
list2=[]
list3=[]
n=0#storing each value in different lists
for z in lat:
    list1.append(z)
for c in lon:
    list2.append(c)
for b in dist:
    list3.append(b)#storing the values of lat long in a dictionary with lat as keys and long as values    
while(n<len(list1)):
    dict1[list1[n]]=list2[n]
    n+=1

现在,lat-long 已被存储到字典(dict1)和区名列表(list3)中。让我们用它们来命名区域。

i=0# Map (long, lat) to (x, y) for plotting
#naming the cities of Rajasthan with the help of their lat(z)long(c)for z,c in dict1.items():
    x,y = m(c, z)
    plt.plot(x, y, 'ok', markersize=5)
    plt.text(x, y,list3[i], fontsize=10);
    i+=1

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

参考我的GITHUB获取 th e 确切代码。

这就是了。感谢您的阅读。

有关 Geopandas、Basemap 的更多信息,或者您想了解 Python、ML、DL、AI、IoT 等行业趋势技术,请联系 Forsk Technologies。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值