TowardsDataScience 博客中文翻译 2020(五百零六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

如何从外太空理解全球贫困

原文:https://towardsdatascience.com/how-to-understand-global-poverty-from-outer-space-442e2a5c3666?source=collection_archive---------32-----------------------

使用卫星图像和神经网络预测资产财富,以卢旺达为例

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

图片来自美国地球物理联合会

经济生计难以估计。即使在当今世界,也缺乏明确的数据来确定贫困地区,这导致资源分配不足——金钱、食物、药物和受教育机会。我们生产了大量的资源,为多达 100 亿人提供食物、衣服和住房,但仍有数亿人生活在贫困之中。

帮助缓解这一问题的一种方法是创建一个模型,利用计算机视觉来绘制和预测非洲国家卢旺达的贫困状况,这个模型足够小,可以提供丰富多样但不庞大的数据集。

我们如何完成这项任务?有几个关键步骤:

  1. 下载人口和健康调查(DHS)、夜灯卫星图像和白天卫星图像
  2. 测试夜灯能否准确预测财富
  3. 测试白天图像的基本特征是否也能准确预测财富,并提取图像特征
  4. 利用白天和夜晚灯光图像的组合数据集构建一个卷积神经网络(CNN ),并应用迁移学习
  5. 构建显示预测财富分布的地图

在本文中,我们将学习如何开发一种可扩展的方法,使用识别图像特征的 CNN 来预测农村地区的贫困状况。我们将利用白天和夜间的卫星图像来创建一种准确而廉价的方法,以在集群级别(一个 10×10 公里的区域)估计资产财富。以下概述抓住了主要目标:

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

概观

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

模型管道

1.下载数据

有三个组成部分:夜间照明,白天图像和 DHS 调查。

卢旺达 DHS

官方 DHS 页面下载卢旺达 DHS 数据并构建集群需要注册访问。这些调查提供了健康、人口和营养方面的代表性家庭数据,并通过给电力和技术设备等普通资产分配-2 到 6 的值,列出了资产得分(衡量财富的一种方法)。这些数据将作为我们的“地面实况”数据和标签系统,用于提取相应的白天和夜间图像。我们还使用地理数据集 shapefile 来报告每个指定聚类的坐标。具体来说,我们要求 RWHR61FL。ZIP(家庭调查)和 RWGE61FL。DHS 网站上的 ZIP (shapefile)文件。

夜灯

2010 年夜灯文件是一个包含来自世界各地的夜灯强度的单一大图像。为了只提取卢旺达,我们利用先前下载的 shapefile。

白天的图像

最后,我们使用 API 密匙从谷歌地图平台获取白天的图像。像夜灯一样,它们是基于 DHS 数据集中提供的位置提取的,包含聚类级别的有价值的景观和活动特征。使用 Maps Static API 和卢旺达 shapefile,我们对成千上万的卫星图像进行了 ping 服务。我们使用 400×400 像素的图像,每幅图像代表 1 平方公里。

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

数据组织方案

2.尝试夜灯和 DHS 数据

在收集了必要的数据后,目标就变成了理解夜灯数据是否可以用来预测财富。首先,我们合并 DHS 和夜灯数据,然后拟合一个关于夜灯的财富模型。每个 DHS 星团的平均夜间亮度是通过对环绕星团中心的夜灯位置的亮度值取平均值来计算的。

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

(左)资产评分和夜灯叠加;(右)回归模型说明了平均集群财富与相应集群夜灯亮度之间的关系

叠加可视化意味着夜灯亮度是较低贫困的一个很好的指标,因为较亮的区域有代表较高资产财富的冷色点簇。为了更深入地探究为什么较暗区域的资产分数是这样的,以及回归模型更好,我们问:我们可以从卫星图像中提取出什么有意义的东西?

3.切换到白天图像

白天的图像不断被记录,自动更新,并且大量可用,被证明是一种有价值的资源。

提取基本特征

为了测试白天图像是否可以预测集群财富,我们首先提取基本特征。对图像进行编码,使得每个像素由 0 到 255 之间的三个数值组成,对应于红色、绿色和蓝色级别。从这三个颜色层的每一层中,我们提取五个基本特征:像素值的最大值、最小值、平均值、中值和标准偏差。

然后将白天的图像与 DHS 数据合并,并拟合出一个财富模型,作为这些基本白天特征的函数。预测平均集群财富的线性回归模型得出的 R 值(相关系数)为 0.558。

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

基本影像特征-当模型基于基本日间影像特征进行训练时的资产财富预测,产生 0.558 的 R 值

结合预先训练的神经网络

接下来,我们用深度学习提取特征。首先获得在 ImageNet 上预训练的 CNN (8 层,VGG-F ), ImageNet 是为对象识别研究设计的大型带注释的数据库。

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

原始的 VGG-F 架构,其中有一个通过卷积和池层分析的输入。该模型从图像中提取 4096 个特征。

在学习从 1000 多个类别中正确分类每张图像的过程中,该模型识别边缘和拐角等低级特征,这些特征对计算机视觉任务至关重要。通过 Keras,我们使用 CNN 将白天的卫星图像输入到这个模型中,并输出 4096 维的特征向量,然后这些特征可以用于预测资产财富。R 值增加到 0.689。因此,我们得出结论,用深度学习提取特征确实提高了模型的准确性。

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

CNN 特征-根据 CNN 的日间影像特征训练模型时的资产财富预测,得出 R 值为 0.689

到目前为止,我们只合并了白天的图像。为了获得更好的预测,我们还应该以一种巧妙的方式包括夜间图像。

4.实施迁移学习

为了提高模型的准确性,我们应用了转移学习步骤,而不是直接使用 CNN 提取的图像特征,我们重新训练它从白天的图像中预测夜间灯光,以最终使用这些特征,这可能更适合估计资产财富的最终预测任务。该模型依赖于一种迁移学习方法,使用 CNN 从白天的卫星图像中提取图像特征。有三个步骤:

估计夜灯强度

DHS 调查数据集将夜间亮度表示为 0 到 63 范围内的整数。在预测夜灯时,我们将这些亮度分为三类——低(0 到 2),中(3 到 34),高(35 到 63)。

改变模型的用途

现在,我们通过重新训练最后一层,将该模型重新用作白天卫星图像的特征提取器;这是夜灯强度分类图层。本质上,我们要问的是:给定一个白天的图像输入,同一个区域在晚上会是什么样子?

该模型学习从每个输入的卫星图像到某个矢量表示的非线性映射,并具有在图像上“滑动”的过滤器,精确定位逐渐变得更加复杂的特征。例如,该模型最初学习诸如边和顶点之类的基本特征,但是最终寻找诸如道路、水路和建筑物之类的复杂得多的特征。

完全连接的层被转换成卷积层,随后是平均池层,这允许网络通过卷积对单个图像进行多次评估,并对结果进行平均,以产生概括每个图像的一个特征向量。卷积层对输入进行多次评估,输出多个特征向量。对图像的几次评估有助于处理每个输入图像的不同部分。

获得最终特征向量

然后,我们对这些特征向量进行平均,以获得每个聚类的一个向量,该向量被用作估计消费支出和资产财富的岭回归模型的输入。

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

覆盖在卫星图像上的卷积滤波器(来源:科学

我们分析这些特征,而不是仅仅使用白天图像收集的特征,是否在预测平均集群财富方面做得更好。他们做到了!R 值甚至进一步增加到 0.718,显著增加。

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

迁移学习-当模型通过迁移学习在白天影像特征上进行训练时的资产财富预测,产生 0.718 的 R 值。该模型现在更加可靠,由红色和灰色虚线的紧密程度以及较高的 R 值来表示。

5.创建资产财富图

用于评估经济福祉的迁移学习模型显著改进了现有的夜灯方法。我们分析了接近和低于贫困线的人口的福祉,因为夜灯显示的变化很小,并且在这些地区的预测能力很低。夜灯无法很好地区分贫穷、密集的区域和富裕、稀疏的区域,这两种区域的夜灯水平都很低。

在应用迁移学习之后,产生标准化的混淆矩阵。矩阵值沿对角线最大,表明相对较高的真阳性率。从图中可以明显看出,最低的夜灯级别具有最高的准确度(与仅夜灯模式的主要区别),最高的夜灯级别具有第二高的准确度。

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

转移学习混淆矩阵,因为夜灯不能有效地表征低亮度区域

此外,我们可以构建财富预测的热图,将所有绘制的特征叠加到卢旺达地图上。您可以看到,结果非常像之前显示的资产财富和夜间照明数据叠加的彩色地图,这意味着该模型表现良好。

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

预测财富的热图-较亮的区域对应于贫困程度较低,较暗的区域对应于贫困程度较高。

结论

本文介绍的方法表明,我们可以利用 CNN 的日间和夜间卫星图像,配合调查数据,准确定位特定地方的高经济福祉和低经济福祉区域,从而确定贫困区域。由于这种方法是可扩展的和廉价的,我们希望将研究和结果扩展到更多的国家。

完整代码可在此 GitHub 资源库 获得。

参考文献

[1] K. Beegle,L. Christiaensen,A. Dabalen 和 I. Gaddis,崛起中的非洲的贫困问题 (2016 年),世界银行

[2] M. Brems,主成分分析一站式商店 (2019),走向数据科学

[3] N. Jean,M. Burke,M. Xie,W. Davis,D. Lobell,S. Ermon,结合卫星图像和机器学习预测贫困 (2016), Science

[4] S. Athey,超越预测:利用大数据解决政策问题 (2017),科学

[5] S. Pandey,T. Agarwal,C. Krishnan,从卫星图像预测贫困的多任务深度学习 (2018),AAAI 2018

[6] S. Piaggesi,L. Gauvin,M. Tizzoni,C. Cattuto,N. Adler,S. Verhulst,A. Young,R. Price,L. Ferres,A. Panisson,利用卫星图像预测城市贫困 (2019),CVPR,2019

[7] T. Stark,M. Wurm,H. Taubenbock,X. Zhu,使用迁移学习深度特征在不平衡遥感数据集中绘制贫民窟 (2019),IEEE

[8] M .谢,n .让,m .伯克,d .洛布戴尔,s .埃蒙,遥感与贫困制图深度特征迁移学习(2016) ,2016

如何通过踢足球了解 LSTM

原文:https://towardsdatascience.com/how-to-understand-lstm-by-playing-football-136c8431e451?source=collection_archive---------60-----------------------

得分时掌握长短期记忆门

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

足球图书概念’ | ID 27329051 庞苏万| Dreamstime.com

在这一系列文章中,我们研究了前馈神经网络(FFNN)在理解上下文时的局限性。为了解决这个问题,我们引入了递归神经网络(RNN) 的概念,并定义了存在的不同类型。然而,我们之前的分析没有充分解决 RNN 的关键问题,比如是什么让 RNN 变得不同?细胞内部会发生什么样的计算?RNN 是如何学习的?

本文的目的就是要解决所有这些问题,为了做到这一点,从历史的角度入手可能会有所帮助。Jeffrey L. Elman 在 20 世纪 90 年代早期首次尝试创建能够理解上下文的模型。这第一个 RNN,有时被称为香草 RNN,是同一层的两个单元共享信息的第一个单元之一,状态将从一个传递到另一个。

正如这篇文章的标题所暗示的,目的是通过踢足球而不是谈论历史来了解 LSTM,球在哪里?

比赛开始了

来了,下面的模型代表了作为一名足球运动员你必须采取的行动的简化。模型的输入是你的眼睛在野外看到的图像。然后一个 RNN 层对你的下一个动作做出正确的计算,它可以是“通过”、“等待”、“运行”…

在时间 t,你得到球,你看到你的一个同事没有被防守,所以 RNN 决定传球。下一个图像是你的同事试图控制球,你不知道他是否能做到,然后你在进攻或防守之前等待。在时间 t+2,他拿着球,如果他想把球传回来,你可以主动出击。他是一个非常优秀的球员,所以他决定向足球目标跑去,那么你的行动就是也跑。在时间 t+4,他正在投篮,所以你的第一个想法是准备好,如果有任何反弹。在时间 t+5,你看到球进了球门,所以你和你的同事一起庆祝进球,度过了一个美妙的时刻。

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

作者图片

一旦我们感受到进球和庆祝进球的激动时刻,是时候看看数学了。下面我们表示 RNN 层中的一个单元,内部发生了什么计算?

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

作者图片

在时间 t+1,单元接收两个输入,来自前一单元的状态 S̅ₜ和事件 x̄ₜ₊₁,在我们的例子中是图像。为了计算单元 S̅ₜ₊₁的下一个状态,我们将来自事件和状态的点积的结果与其各自的权重矩阵相加,并且我们应用激活函数φ。你不知道什么是激活函数吗?激活函数的概念将在下一节更详细地探讨。结果向量在时间 t+2 作为其输入之一进入单元。最后,通过 S̅ₜ₊₁与其权重矩阵 Wᵧ的点积获得预测 y̅ₜ₊₁。

那么,我们是不是说人类的记忆可以通过两次计算来复制?神经网络理解上下文就这么简单吗?答案是否定的,埃尔曼的方法是一个非常好的工作,但是它有一个障碍,叫做消失梯度问题,因此我们也知道这个单元是短记忆。计算机还没有变得比人更聪明。

1-谁在我的团队中?或者消失梯度问题

在代表 RNN 足球裁决的例子中,我们只关注了一个动作。但是结果是什么呢?还剩多少时间?是联赛还是冠军赛?我要传球给的球员是否在我的队伍中?

**Elman 结构遭受消失梯度问题:这意味着细胞不能从 8-10 个时间步长学习任何时间依赖性。**由于之前的 RNN 模型,我们可以找到问题的更清晰的表述。在这种情况下,我们将改变 RNN 层的颜色(绿色气泡)的表现多少数据,它可以记住从以前的步骤。在每个时间步,新数据被添加到由不同颜色表示的 RNN 中。第一步,我们只显示蓝色,而第二步,添加橙色。然后,当我们继续穿越时间时,从先前的时间步骤接收的信息开始消失,而由更近的步骤给出的信息变得更加可见。我们的模型已更改如下:

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

作者图片

即使我们没有涉及到消失梯度下降背后的数学,从这个图中我们可以清楚地理解这个问题。序列越长,神经网络就越难从前面的步骤中学习。

所以,我们已经看到我们的球员有短暂的记忆。然后他可能会忘记比赛的目标或者队友;因此,他所做的决定可能会阻止他赢得比赛。那么我们如何解决短期记忆的问题呢?

2-如何赢得’ le ballon d’or’ (长短期记忆)

90 年代中期,Sepp Hochreiter 和 Jürgen Schmidhuber 介绍了长短期记忆或 LSTM。这个理论引入的创新是 gates 的想法,我们数据中的一些信号可以保存为【LTM】,而其他信号可以保存为短时记忆(STM) 。这种区分允许根据情况在需要时使用长期或短期信息。为了更好地理解长时记忆和短时记忆的区别,让我们关注一下同事进球后的时间步长 t + 5。我们希望得到的最终图表如下所示:

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

作者图片

作为输入,我们有我们正在分析的事件(图像),而不是只有一个状态或记忆,我们有两个,LTM 的目的是记住不会经常更新的一般信息,而 STM 专注于要使用的精确信息。然后我们应用 LSTM 细胞,我们输出一个新的 LTM,一个 STM 和一个预测。在图像的中间,我们再次看到代表 RNN 的绿色气泡。如果我们观察这个气泡内部,我们将分析 4 种不同的计算。为了便于表示,我们将气泡转换成了矩形。从概念上讲,RNN 单元看起来如下:

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

作者图片

**有 3 个门加一个单元状态。*在一些文章中,你可能会发现存在 4 个门,但这是因为它们也将单元状态称为门。在“3-数学表示法”*部分,我们将看到不同之处。

为了更好地理解每个关卡的目的,让我们继续看时间步长 t+5 的例子,在这个例子中,我们的队友得分了。

  • 忘记门:顾名思义,这个门的作用是决定前一时间步中哪些信息不再有用。例如,在 t + 5,因为我们的同事进了一球,我们不再需要记住前一分钟的比分。我们首先忘记旧的结果,然后添加新的结果。在这个门口,我们只是忘记了我们是 1-0 获胜。
  • 输入门 : 决定我们应该保留哪些新信息。从输入图像中,我们不需要知道草是绿色的,或者球是圆的。并不是所有来自图像的信息都是相关的,我们将只保留例如我们进了一个球。
  • 细胞状态:正如我们之前看到的,LSTM 允许拥有不仅仅是短暂的记忆。单元状态负责从遗忘门获取输出并遗忘不再有效的内容,然后从输入门获取输出并添加相关信息。细胞状态的输出将是下一步的长期记忆。
  • 使用 Gate :我们已经计算了什么信息会作为长期传递到下一个时间步;现在是**计算短期状态的时刻。**我们一方面需要细胞状态的输出,另一方面需要来自事件(图像)和短期记忆的信息,以决定我们作为足球运动员的下一步行动是与我们的团队一起庆祝进球。这个结果将具有双重目的,一方面它将是要传递到下一层的短记忆状态,另一方面它将是 LSTM 层的预测。

很好,到目前为止,我们已经研究了埃尔曼提出的香草 RNN 的极限。我们理解了消失梯度的问题,以及这个模型如何只能创造短期记忆。为了解决这个问题,我们引入了一种新的 RNN 单元结构,称为 LSTM,由不同的门组成。上面的解释是对 LSTM 工作原理的简化解释,让我们在更深层次上理解所使用的数学。

3-数学表示

一旦我们把上面的图和门转换成计算,这就是它看起来的样子。

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

作者图片

第一次看到这张图片时,我有点不知所措,一个单元格中有太多的函数和线条。如果你也和我一样,没有必要担心,因为如果你已经理解了上面解释的概念;理解这种结构将会非常容易。

在详细解释 LSTM 之前,先说一下激活函数。为了理解激活功能,只要想想我们大脑中的神经元它们以开关的方式与电脉冲一起工作。神经元是相互连接的,它们用这些脉冲交换信息。某些神经元的激活会触发我们的行动。回到我们的 **RNN,输入是用数字而不是脉冲来测量的,那么我们如何将这些数字转换成脉冲呢?**这正是激活功能开始为我们做这项工作的时候。让我们特别关注其中的两个:

  • Sigmoid(σ):Sigmoid 函数的每个输入都有一个介于 0 和 1 之间的输出值。万一忘记了信息,该函数输出 0。否则,该函数输出 1 以保留信息。
  • 双曲正切 (tanh):这个激活函数的输出在-1 和 1 之间。那么 tanh 的目标只是将它接收到的所有信息转换成[-1;1]这样网络才能正常工作。

关于激活函数的更多信息,我推荐下面的文章

我们已经把图表转换成了数学表示,让我们用同样的方法来解释。一旦我们理解了用文字解释的每个门的作用,现在是时候用数字来解释了:

  • 忘记入口:

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

作者图片

我们解释说这个门的作用是决定由于短期记忆和新图像在 LTM 中哪些信息要忘记因此,我们使用了一个 sigmoid 函数。正如我们在图像中看到的,我们将 LTM 表示为一个向量,sigmoid 的输出将是一个相同形状的向量。来自团队游戏的信息将被保留,因为激活函数的输出是 1,而对于分数输出是 0。然后我们忘记了分数。

  • 输入门:

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

作者图片

它由两个动作组成,一方面我们通过应用 tanh 计算新信息,然后我们根据这个新信息中的 sigmoid 决定我们应该保留哪个。“分数”、“团队”和“游戏”的新信息已经计算出来,但我们将只保留新的“分数”。

  • 单元格状态:

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

作者图片

在这里我们可以清楚地看到为什么这不是一个门。有一个乘法和一个加法,我们不是用 tanh 变换数据,也不是用 sigmoid 选择要保留什么信息。一旦我们知道从以前的 LTM 中保留什么信息,从新的输入中保存什么信息,我们就有了下一步的 LTM。

  • 使用门:

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

作者图片

这个门将从新的 LTM 接收过滤的信息,由于 STM,新的图像将得到一个新的 STM。值得注意的是,这个门的输出同时是新的 STM 和预测。

这是一个长期的短期记忆结构,我们利用来自前一时间步的信息,感谢 LTM 和 STM 结合新的信息,图像。我们应用 sigmoid 来决定保留什么信息,并用 tanh 来保持值在-1 和 1 之间。每个门都有自己的角色和激活功能的组合。

我们必须考虑到,LSTM 不是唯一的结构,例如门控循环单元(GRU)也是一个众所周知的结构。它遵循相同的门和激活函数的思想,不同之处在于门的数量和它们各自的分布。

摘要

如果你到了这一步,恭喜你!你开始成为 RNN 专家。这意味着我们理解了 FFNN 在理解上下文以及如何应用 RNN 来解决它时的局限性。

这也意味着我们知道存在不同的细胞结构。第一个是香草 RNN ,它遇到了梯度消失的问题,换句话说就是无法在多个时间步上保持依赖性。这个短记忆的问题可以通过一种叫做 LSTM 的新单元结构来解决。最重要的是,我们深入研究了 LSTM 细胞的结构,以了解它是如何工作的。

长短期记忆不是像香草 RNN 那样只有一种状态,而是有长期记忆和短期记忆两种状态。我们分析了遗忘门的作用,它决定了前一时间步中哪些信息不再有用。然后输入门从新输入中过滤出相关的信息。单元状态从遗忘门和输入门获取输出以产生新的 LTM。最后,使用门结合新的 LTM 和输入来创建 STM。

到目前为止,我们已经关注了细胞本身,在接下来的文章中,我们将探索使用 LSTM 细胞的多种方法,例如创建一个编码器-解码器结构,以及它如何允许为注意力模型播下种子。

[## 递归神经网络导论(RNN)

计算机是如何理解上下文的?什么是递归神经网络,它如何帮助我们?有没有…

medium.com](https://medium.com/swlh/introduction-to-recurrent-neural-networks-rnn-c2374305a630) [## 如何用 RNN 和喀拉斯建立翻译管道

你有没有想过一台计算机是如何能够如此快速地学习多种语言的?按照这个逐步指南…

towardsdatascience.com](/how-to-build-a-translation-pipeline-with-rnn-and-keras-57c1cf4a8a7)

如何通俗地理解 p 值?

原文:https://towardsdatascience.com/how-to-understand-p-value-in-layman-terms-80a5cc206ec2?source=collection_archive---------4-----------------------

理解 p 值的简单方法

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

统计学中最重要的概念之一是 p 值的解释。我想更简单的分享一下我对 p 值的理解。

假设一家公司声称其生产的巧克力“X”在 1 块巧克力中含有 70 克坚果。但是一些顾客抱怨巧克力棒的果仁少于 70 克。我们想测试一下该公司关于巧克力 X 中坚果平均重量的说法是否正确。让我们试着解决这个问题。

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

你认为所有这些巧克力棒都有同样多的坚果吗??

我们抽取 20 个巧克力棒的样本,并找出这些巧克力棒中坚果的平均数量(样本平均值),以推断总体平均值。总体和样本的区别?见下文:

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

从人群中取样有不同的方法。这里我们从最近的商店里随机抽取了一些酒吧。

总体平均值(我们不知道)是该公司生产的所有巧克力棒中所含坚果的平均值,这在现实中是无法计算的。在我们的例子中,我们假设它的价值为 70gm(假设的平均值——公司所声称的)。

假设我们取样的 20 根棒线的坚果平均值为 68.5。我们能断定顾客的说法是真实的吗?这是否提供了足够的证据证明巧克力棒缺少坚果,或者这一结果只是运气使然?为了回答这个问题,我们进行假设检验。

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

让我们陈述无效假设和替代假设。

**零假设:**巧克力棒中坚果的总体平均值为 70 克。(这是我们试图提供证据反对的事情。)

**替代假设:**巧克力棒中坚果的总体平均值小于 70 克。(这是我们试图证明的)

该规则规定,如果 p 值小于显著性水平(α),我们拒绝零假设。下一个问题:

显著性和 p 值是什么水平?

显著性水平(alpha) 是我们拒绝零假设时愿意承担的风险百分比。

P 值是随机机会产生的数据或其他相等或更少的数据的概率(在零假设下)。我们计算样本统计的 p 值(在我们的例子中是样本平均值)。我们可以通过查看 z 表来手动计算,或者使用一些统计软件来计算。

假设真正的巧克力数量平均为 70 克。这并不一定意味着,如果世界上有 100 万块 X 型巧克力,那么每块巧克力的平均坚果含量为 70 克。可能很少有平均重量小于 70 克的巧克力,也有一些平均重量大于 70 克的。因此,当我们抽取一些巧克力样品时,由于取样的变化,样品的平均值可能小于、等于或大于 70 克。

回到 p 值的解释。

“p 值用于确定实验结果是否具有统计学意义。低 p 值意味着假设零假设是真的,那么这个结果是运气的结果的可能性非常低。高 p 值意味着假设零假设是真的,这种结果是非常可能的”

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

p 值-正态曲线下阴影区域的面积

如果 p 值

假设我们得到 p 值为 0.04。这意味着,在假设总体螺母平均值为 70 gm 的情况下,如果我们在零假设下重新运行测试,我们将获得 100 次样本平均值中的 4 次(在我们的情况下为 68.5)。非常不可能!因此,我们可以说——结果表明样本可能来自不同的亲本群体。

因此,我们拒绝零假设。在这种情况下,我们有强有力的证据再次无效。

得到如此罕见的东西(几率为 4/100)可能不太可能,但仍有可能是运气使然。

让我们试着理解我们拒绝零假设的基础——为什么我们得出样本不是来自零假设下的总体。假设你有两张彩票,然后随机洗牌。一张票来自有 300,000 个参与者和 1 个奖品的事件 X。另一张票来自 Y 事件,有 30 名参与者,有 10 个奖项。你中了一张彩票,但你不知道它属于哪个项目。你的猜测不会是:事件 Y,因为奖品多,人少的时候,你本来中奖的机会就多。但是假设你的中奖彩票来自 X 事件!万岁!!!运气发挥了作用,你得到了!

因此,当我们说一个事件不太可能发生时,它仍然有可能是侥幸发生的,这就是我们偶然发现第一类错误的时候——当它为真时拒绝空值。未能拒绝错误的零假设被称为第二类错误。

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

记住第一类和第二类错误定义的最好例子之一。(参考谷歌图片)

回到我们的定义,因为这会更有意义。显著性水平(Alpha) —在拒绝零假设或 I 型错误率时,我们愿意承担的风险百分比。

事实上,重要程度取决于我们基于假设检验试图回答的问题类型。如果这个问题是关于你当地核电站的熔毁风险,就在这条路不到一英里的地方,会怎么样?在接受错误答案的风险之前,你可能想更确定一点。

我相信这篇文章帮助你建立了对 p 值的基本理解。围绕在现实世界中使用它有很多争论。使用 p 值有一些优点和缺点。参考本文快速阅读:https://www . prosancons . com/education/pros-and-cons-of-p-values/

感谢阅读。希望得到您的反馈。

参考资料:

[1]https://www.investopedia.com/terms/p/p-value.asp

[2]https://blog . minitab . com/blog/adventures-in-statistics-2/how-to-correct-interpret-p-values

[3]https://amstat . tandfonline . com/doi/full/10.1080/00031305 . 2016 . 1154108 # . xhx 1 tedkhpa

使用 BigQuery 和 SQL UDF 将多个列拆分成整齐的对

原文:https://towardsdatascience.com/how-to-unpivot-multiple-columns-into-tidy-pairs-with-sql-and-bigquery-d9d0e74ce675?source=collection_archive---------18-----------------------

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

这篇文章是写给任何在 CSV 中处理时间序列的人的,每天都有一个新的专栏。拥有整洁的数据很重要!尤其是现在,一些公共数据的提供者选择了每天一列——这使得用 SQL 分析时间序列变得非常困难。在这篇文章中,可以找到一个共享的持久化 BigQuery UDF,它可以将数百个列转换成整齐的(日期,值)对,供您使用。

重要更新 : 我在 2020 年离开了谷歌,加入了雪花——所以我无法保持更新我的旧帖子。如果你想尝尝雪花啤酒,加入我们吧——我在❄️.玩得很开心

作为非整齐数据的一个例子,我们可以看到新型冠状病毒(新冠肺炎)案例(由 JHU·CSSE 提供)和苹果移动趋势报告表格的外观:

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

JHU CSSE 表格,苹果移动趋势报告表格:每个日期一列。我们不想那样。

我们不希望多列,每个日期。我们希望有(日期,值)对。因为这个问题似乎很常见,所以我编写了两个 BigQuery 持久性 UDF 来解决这个问题:

  • fhoffa.x.unpivot()
  • fhoffa.x.cast_kv_array_to_date_float()

让我们回顾一下它们是如何工作的。

使用 fhoffa.x.Unpivot()进行 unpivot

只需给unpivot()一个完整的行,以及每个列的名称如何显示的正则表达式。

苹果桌子:

SELECT a.geo_type, region, transportation_type, unpivotted
FROM `fh-bigquery.public_dump.applemobilitytrends_20200414` a
  , UNNEST(fhoffa.x.unpivot(a, '_2020')) unpivotted

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

颠覆苹果移动趋势

与 JHU 表:

SELECT province_state, country_region, unpivotted
FROM `bigquery-public-data.covid19_jhu_csse.confirmed_cases`  a
  , UNNEST(fhoffa.x.unpivot(a, '_[0-9]')) unpivotted

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

取消旋转 JHU 表

这就好多了,但我们还没完。我们如何将这些值转换成日期和数字?

用 cast_kv_array_to_date_float()转换数组

我们可以使用cast_kv_array_to_date_float()重新转换未透视的列。

当将这些列转换为日期时,更“令人恼火”的是它们使用不同的格式对日期进行编码。您不必担心,因为 UDF 也可以将日期格式作为输入。

例如,苹果的桌子:

SELECT a.geo_type, region, transportation_type, unpivotted.*
FROM `fh-bigquery.public_dump.applemobilitytrends_20200414` a
  , UNNEST(fhoffa.x.cast_kv_array_to_date_float(fhoffa.x.unpivot(a, '_2020'), '_%Y_%m_%d')) unpivotted

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

颠覆和铸造苹果移动趋势

还有 JHU 的桌子:

SELECT province_state, country_region, unpivotted.*
FROM `bigquery-public-data.covid19_jhu_csse.confirmed_cases`  a
  , UNNEST(fhoffa.x.cast_kv_array_to_date_float(fhoffa.x.unpivot(a, '_[0-9]'), '_%m_%d_%y')) unpivotted

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

拆除和铸造 JHU 表

看到了吗?这些结果看起来比开始的表格更整洁。

奖励:covid 19 _ USA facts . confirmed _ cases 表

一旦我们有了这两个 UDF,将它们应用到其他表就变得非常容易了:

SELECT county_fips_code, county_name, state, state_fips_code, unpivotted.*
FROM `bigquery-public-data.covid19_usafacts.confirmed_cases` a
  , UNNEST(fhoffa.x.cast_kv_array_to_date_float(fhoffa.x.unpivot(a, '_[0-9]'), '_%m_%d_%y')) unpivotted

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

取消“covid 19 _ USA facts . confirmed _ cases”表的透视

操作方法

查看我之前关于 BigQuery 中持久 UDF 的帖子:

[## BigQuery 中的新特性:持久性 UDF

用户定义的函数是扩展 BigQuery 的一种强有力的方法,但直到现在,它一直是一个必须复制粘贴的累赘…

medium.com](https://medium.com/@hoffa/new-in-bigquery-persistent-udfs-c9ea4100fd83)

这两个 UDF 的源代码是:

CREATE OR REPLACE FUNCTION fhoffa.x.unpivot(x ANY TYPE, col_regex STRING) 
AS ((
  # [https://medium.com/@hoffa/how-to-unpivot-multiple-columns-into-tidy-pairs-with-sql-and-bigquery-d9d0e74ce675](https://medium.com/@hoffa/how-to-unpivot-multiple-columns-into-tidy-pairs-with-sql-and-bigquery-d9d0e74ce675)
  SELECT 
   ARRAY_AGG(STRUCT(
     REGEXP_EXTRACT(y, '[^"]*') AS key
   , REGEXP_EXTRACT(y, r':([^"]*)\"?[,}\]]') AS value
   ))
  FROM UNNEST((
    SELECT REGEXP_EXTRACT_ALL(json,col_regex||r'[^:]+:\"?[^"]+\"?') arr
    FROM (SELECT TO_JSON_STRING(x) json))) y
));CREATE OR REPLACE FUNCTION fhoffa.x.cast_kv_array_to_date_float(arr ANY TYPE, date_format STRING) 
AS ((
  # [https://medium.com/@hoffa/how-to-unpivot-multiple-columns-into-tidy-pairs-with-sql-and-bigquery-d9d0e74ce675](https://medium.com/@hoffa/how-to-unpivot-multiple-columns-into-tidy-pairs-with-sql-and-bigquery-d9d0e74ce675)
  SELECT ARRAY_AGG(STRUCT(SAFE.PARSE_DATE(date_format, key) AS date, SAFE_CAST(value AS FLOAT64) AS value))
  FROM UNNEST(arr)
));

这个函数背后的秘密引擎:用TO_JSON_STRING()将一整行转换成 JSON,然后对它执行一个REGEXP_EXTRACT_ALL

历史笔记

我的以前的解决方案在 BigQuery 中的 UNPIVOT 已经收到了超过 5000 个关于堆栈溢出的视图:

[## 如何在 BigQuery 中取消透视?

stackoverflow.com](https://stackoverflow.com/a/27832362/132438)

后续步骤

一旦我为这些函数编写了文档,并且我们确定了它们的最终名称——我将把它们提交给我们与社区 UDF([bqutil](https://github.com/GoogleCloudPlatform/bigquery-utils/tree/master/udfs/community))共享的存储库。

[## Google cloud platform/big query-utils

该目录包含社区贡献的用户定义函数,以扩展 BigQuery 用于更专门的用途…

github.com](https://github.com/GoogleCloudPlatform/bigquery-utils/tree/master/udfs/community)

想要更多吗?

查看谷歌的公共数据集项目,在 BigQuery 中收集了越来越多的新冠肺炎相关数据集:

[## 新冠肺炎免费公共数据集|谷歌云博客

数据在调查、研究和应对突发公共卫生事件的能力中始终发挥着至关重要的作用

cloud.google.com](https://cloud.google.com/blog/products/data-analytics/free-public-datasets-for-covid19)

我是 Felipe Hoffa,谷歌云的开发者倡导者。在 @felipehoffa 上关注我,在medium.com/@hoffa上找到我以前的帖子,在reddit.com/r/bigquery上找到所有关于 BigQuery 的帖子。

如何更新你的 Django 网站

原文:https://towardsdatascience.com/how-to-update-your-live-django-website-b84645753ea1?source=collection_archive---------19-----------------------

数字海洋的逐步指南以及 AWS EB、Heroku 和 Azure 的链接

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

我的 Django-数字海洋网络应用。图片作者。

我最近用 Django 开发了一个网络应用程序(见此)并通过 DigitalOcean 部署了它。

使用 DigitalOcean 有很多绝妙的理由,但更新不是其中之一。因为它是云托管提供商,而不是像 AWS Elastic Beanstalk 一样的 PaaS,更新过程 100%是你的问题

此外,如果您也部署了 DigitalOcean,您可能会意识到关于如何运行更新的资源非常少。这就是我进来的地方。

我已经在我如何建立我的网站的详细演练中写了这个过程(如果你愿意,你可以在下面阅读),但我想详细说明这一点,以帮助填补像我这样的初学者的知识空白。

[## 37 天内从零到全栈 web 开发

以及如何更快地完成它

towardsdatascience.com](/from-zero-to-full-stack-web-development-in-37-days-97b8c254a3d1)

如果你部署在数字海洋之外的地方,更新会容易得多,这里有一些可能与你相关的页面:

如何更新您现有的网站/应用程序

步骤 1: If Django: 为本地调试配置您的 Django 设置。您需要这样做来在您的本地主机上运行您正在进行的工作。

# in settings.py
DEBUG = True
ALLOWED_HOSTS = []

如果您在设置文件中使用自定义变量在“实时”和“本地”模式之间切换,尤其是当您的数据库也发生变化时(例如,如果您使用 PostgreSQL),您可以使这变得稍微容易一些。

在这个例子中,当我想要编辑或部署时,我所做的就是切换 live_deploy 变量。

步骤 2: 更新项目代码。

第三步:如果姜戈:进行迁移。在本地进行迁移,但在服务器上进行迁移,因为迁移文件是源代码的一部分,不应该在服务器上被篡改。阅读这篇 StackOverflow 帖子了解更多信息。

# in terminal
python3 manage.py makemigrations

第 4 步:如果 Django: 重新配置您的设置以进行实时部署。

# in settings.py
DEBUG = False
ALLOWED_HOSTS = ['00.000.0.000','www.yourdomain.com'] # insert your IP or domain

**第五步:**准备好你的修改,提交到 Git,然后推送到你选择的远程存储库。非常重要,因为在数字海洋(步骤 8)中,遥控器是您获取代码的地方。

# in terminal
git commit -m "your commit message"
git push origin master

**第六步:**使用 SSH 登录您的数字海洋虚拟机。

# in terminal
ssh user@00.000.0.000

步骤 7: 激活您的项目所使用的虚拟环境,因为您需要运行 Django 命令。

# in terminal
source venv/bin/activate #replace with your venv

步骤 8: 从您的项目目录中,从您的远程存储库中提取您的更新代码。

# in terminal
cd /your/project/dir
git pull origin

步骤 9:如果 Django: 运行迁移并收集静态。不进行迁移 —参考步骤 3。

# in terminal
python3 manage.py migrate
python3 manage.py collectstatic

步骤 10: 重启 Gunicorn(您的 WSGI 服务器)以应用更改。通常情况下,您不需要重启 NGINX,因为不会对 web 服务器进行任何更改——我唯一一次重启是在更新 SSL 证书的时候。

# in terminal
sudo service gunicorn restart
sudo service nginx restart #only if you need to

看起来有点冗长,但重要的是坚持所有的步骤,以确保您的新代码正确配置用于实时部署,使其进入虚拟机,并显示在您的网站或应用程序中。

如果你想自动更新,你可以用 Fabric 和 Ansible 来实现。你可以在这里找到一个相当完整的指南,所以我就不详述了。

但是,如果你像我一样刚刚开始,你可能不需要频繁更新,而是喜欢尽可能保持简单。

在这种情况下,这 10 个步骤将是您每次可靠地运行更新所需要的全部。

如何向 Google BigQuery 上传数据

原文:https://towardsdatascience.com/how-to-upload-data-to-google-bigquery-989dc7b92583?source=collection_archive---------15-----------------------

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

在本文中,我们考虑将数据上传到 Google BigQuery 云存储的选项。我们考虑从 CSV/JSON 文件加载数据的简单方法,以及通过 API 或插件上传数据的方法。

Google BigQuery (GBQ)允许您从不同来源收集数据,并使用 SQL 查询进行分析。GBQ 的优势之一是计算速度快(即使数据量很大)和成本低。

为什么需要将数据加载到一个存储中?如果你想使用端到端的分析,使用原始数据来创建报告,并衡量你的营销效率,那么你应该使用谷歌大查询。

如果你需要在几秒钟内分析万亿字节的数据,Google BigQuery 是最简单、最实惠的选择。你可以通过观看 Google Developers YouTube 频道上的短片来了解这项服务的更多信息。

创建数据集和表

在上传任何数据之前,您需要在 Google BigQuery 中创建一个数据集和表。为此,在的 BigQuery 主页上,选择要在其中创建数据集的资源。

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

图片由作者提供

在“创建数据集”窗口中,为数据集指定一个 ID,选择一个数据位置,并设置默认的表有效期。
注意:如果您为表过期选择“永不”,将不会定义物理存储位置。对于临时表,您可以指定存储它们的天数。

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

图片由作者提供

接下来,在数据集中创建一个表。

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

图片由作者提供

准备好了!现在可以开始加载数据了。

使用 Google Sheets 上传数据(OWOX BI BigQuery Reports 插件)

如果您需要将数据从 Google Sheets 上传到 Google BigQuery,最简单的方法是安装免费的 OWOX BI BigQuery Reports 插件。

你可以直接从 Google Sheets 或者从 Chrome 网上商店安装这个插件。

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

图片由作者提供

安装后,会出现一个提示和权限请求的对话框。

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

图片由作者提供

现在是时候回到谷歌床单了。要将数据上传到 BigQuery,只需从 Add-ons –> OWOX BI big query Reports 菜单中选择 upload data to BigQuery。

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

图片由作者提供

指定要将数据上载到的项目、数据集和表的名称。仅此而已:)

OWOX BI BigQuery Reports 插件的一个不可否认的优势是它的易用性。您还可以使用该插件来设置计划报告。

要基于来自所有来源的准确原始数据构建报告,并自动将它们上传到 Google BigQuery 存储库,我们建议使用 OWOX BI Pipeline 服务。

借助 Pipeline,您可以从广告服务以及呼叫跟踪和 CRM 系统中设置自动数据收集。这使您能够快速、轻松地从您选择的源中获得现成的完整数据集。

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

图片由作者提供

只需选择数据源并授予访问权限;剩下的交给奥克斯毕。

有了 OWOX BI,您可以为每一种口味和需求构建报告,从投资回报、ROPO 效应和群组分析到 LTV 和 RFM 分析。

从 CSV 文件上传数据

要从 CSV 文件上传数据,请在“创建表”窗口中选择数据源并使用上传选项。

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

图片由作者提供

然后选择文件和文件格式。

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

图片由作者提供

接下来,定义数据的目的地,指定项目和数据集的名称。
注意:在 Google BigQuery 中,您可以选择两种类型的表:本地表和外部表。

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

图片由作者提供

Google BigQuery 将自动确定表结构,但是如果您想要手动添加字段,您可以使用文本修订功能或+ Add field 按钮。
注意:如果你想改变 Google BigQuery 从 CSV 文件中解析数据的方式,你可以使用高级选项。

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

图片由作者提供

有关 CSV 格式的更多信息,请参见互联网协会的详细文档。

从 JSON 文件上传数据

要从 JSON 文件上传数据,请重复所有步骤创建或选择您正在使用的数据集和表-仅选择 JSON 作为文件格式。

您可以从您的电脑、Google 云存储或 Google Drive disk 上传 JSON 文件。

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

图片由作者提供

注意:关于 JSON 格式的更多信息,请参见 Google Cloud 文档。

从谷歌云存储上传数据

谷歌云存储允许你安全地在线存储和传输数据。

关于使用此服务的有用信息:

您可以将以下格式的文件从 Google 云存储上传到 Google BigQuery:

  • 战斗支援车
  • JSON(换行符分隔)
  • Avro
  • 镶木地板
  • 妖魔
  • 云数据存储

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

图片由作者提供

您可以在官方文档中了解更多关于使用云存储和大数据的信息。

你也可以在谷歌云帮助中心了解数据下载限制云存储权限

从谷歌广告和谷歌广告管理器等其他谷歌服务上传数据

要从各种 Google 服务上传数据,首先需要配置 BigQuery 数据传输服务。在您可以使用它之前,您必须选择或创建一个数据项目,并且在大多数情况下,为它启用计费。例如,对于以下服务,计费是强制性的:

  • 活动经理
  • 谷歌广告经理
  • 谷歌广告
  • Google Play(测试版)
  • YouTube —频道报道
  • YouTube —内容所有者报告

注意:在谷歌云帮助中心阅读更多关于计费设置和变更的信息。

要启动 BigQuery 数据传输服务,在 BigQuery h ome 页面上,从左侧菜单中选择 Transfers。

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

图片由作者提供

注意:您将需要管理员访问权限来创建传输。

在下一个窗口中,您所要做的就是选择您想要的数据源。

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

图片由作者提供

注意:BigQuery 数据传输服务不仅可以从平台控制台访问,还可以从以下位置访问:

  • с经典 bq_ui
  • bq 命令行工具
  • BigQuery 数据传输服务 API

配置完成后,该服务将自动定期向 BigQuery 上传数据。但是,您不能使用它从 BigQuery 下载数据。

使用 API 下载数据

通过云客户端库,您可以使用自己喜欢的编程语言来使用 Google BigQuery API。
注意:您可以在 Google Cloud 文档中找到更多关于使用 API 下载数据的详细信息。

首先,您需要创建或选择您将使用的项目。然后在主页上,转到 API 部分。

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

图片由作者提供

在“API 概述”窗口中,您可以启用 API 和服务,并从库中选择 API。

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

图片由作者提供

在库中,您可以使用字段搜索或按类别过滤 API。

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

图片由作者提供

您可以使用 OWOX BI 中的一组 Python 脚本来自动将数据导入 Google BigQuery。

您可以从以下来源找到将数据自动导入 Google BigQuery 的脚本:

  • amoCRM
  • 文件传送协议
  • FTPS
  • HTTP(S)
  • 对讲机
  • 专家发送器
  • 关系型数据库
  • science for the people 为人类服务的科学

你可以从 GitHub 下载这些 Python 脚本。

注意:在谷歌开发者 YouTube 频道的这个视频课程中,学习如何在使用谷歌 API 的同时使用 Python。

关键要点

在我们的文章中,我们考虑了向 Google BigQuery 上传数据的最流行的方式。从简单地加载数据文件到通过 API 加载数据,任何用户都可以找到合适的选项。

如何从 Google Ads 上传原始数据到 Google BigQuery

原文:https://towardsdatascience.com/how-to-upload-raw-data-from-google-ads-to-google-bigquery-4bf0f2565f18?source=collection_archive---------39-----------------------

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

来源:沉积照片

如何将原始数据从你的谷歌广告账户上传到谷歌大查询,并识别自动标记广告活动的所有 UTM 标签

通过在 Google Analytics 中分析 Google Ads 广告活动的有效性,您可能会遇到采样、数据聚合或其他系统界面限制。幸运的是,这个问题很容易解决,只需将广告服务的原始数据上传到 Google BigQuery 即可。

为什么你需要谷歌广告的原始数据

来自谷歌广告的原始数据将允许你精确到每个关键词来分析广告活动。通过将数据上传到 BigQuery,您可以:

  • 构建您想要的详细报告,不受 GA 限制。
  • 在会话和用户层面确定广告活动的效果。
  • 按地区、用户类型(新用户或老客户)、设备和任何其他参数计算 ROI、ROAS 和 CRR。
  • 有效管理您的价格,并创建再销售清单。
  • 结合来自 Google Ads、Google Analytics 和 CRM 的数据,根据您的商品的利润和可赎回性来评估活动的有效性。
  • 训练你的 ML 模型以获得更精确的计划。

要了解哪些活动、广告和关键词将用户带到您的网站,您需要将来自 Google 广告和分析的数据结合到 BigQuery 中。您可以使用 OWOX BI 流来实现这一点。

流式传输这些信息会将您网站上未采样的用户行为数据发送到 GBQ。实时传输点击,然后基于这些点击形成会话。

OWOX BI 流量来源信息取自 UTM tags 广告标记。标签为手动,而为自动。

假设您手动标记了广告,并获得了以下 URL:

https://example.com/?utm_source=facebook&UTM _ medium = CPC&UTM _ campaign = UTM _ tags

在这种情况下,连接 OWOX BI 后,您将在 GBQ 表中获得来源、渠道和活动数据:

  • trafficSource.source —谷歌
  • trafficSource.medium — cpc
  • traffic source . campaign-UTM _ tags

如果您在广告服务中启用了自动标记,则会为您的每个广告分配一个特殊的 gclid 参数。当用户点击公告时,它被添加到登录页面 URL。

这种链接示例:

http://www.example.com/?gclid=TeSter-123

如果使用自动标记,没有原始数据就无法从 gclid 获得 source、medium 或 campaign 这些字段在 OWOX BI 收集的 BigQuery 表中将为空。

在这种情况下,如果只有 gclid,您能做什么?如何获得活动名称和其他参数?配置从 Google Ads 到 GBQ 的自动上传。

**注意:**如果公告根本没有标记,OWOX BI 将分配链接如下:

  • 对于非 Google 来源,作为推荐流量(例如 facebook/referral)
  • 对于 Google source 作为直接流量(直接/无)

如果您的报告中有大量直接/无流量,您可能没有启用僵尸过滤,或者您可能有大量未标记的广告。

从 Google Ads 上传原始数据到 BigQuery 的两种方法

我们使用并推荐两种方法从 Google Ads 上传原始数据:数据传输连接器Ads 脚本。

选择哪种方式取决于你的目标和预算。为了让您更容易做出决定,我们准备了一份对照表:

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

你需要什么设置

以下位置的活动项目和客户:

  • 谷歌云平台(GCP)
  • 谷歌大查询
  • OWOX BI
  • 谷歌广告

访问:

  • GCP 的所有者
  • GBQ 中的管理员
  • 在 OWOX BI 中编辑。重要提示:只有创建了 Google Analytics→Google big query streaming pipeline 的用户才能打开从 Google Ads 下载。
  • 在谷歌广告中阅读

如何在 GBQ 中授予访问权限

打开 GCP 控制台,从侧面菜单中选择 IAM 和 admin —管理资源。然后选择项目并单击添加成员。输入用户的电子邮件,选择 BigQuery 管理员角色,并保存您的更改。

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

图片由作者提供

如何使用数据传输配置上传

第一步。在谷歌云平台中创建一个项目

如果你在 GCP 已经有一个项目,跳过这一步。如果没有,打开 GCP 控制台并从侧面菜单中选择 IAM 和 admin —管理资源。单击创建项目按钮。然后输入项目名称,指定组织,并单击创建:

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

图片由作者提供

确保启用计费。为此,请打开侧面菜单中的“计费-账户管理”选项卡,选择项目,并链接计费账户:

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

图片由作者提供

接下来,通过输入您的联系人和支付卡详细信息来完成所有字段。如果这是你在 GCP 的第一个项目,你会得到 300 美元,可以用 12 个月。每月有 1-2 个谷歌广告账户和多达 100,000 个独立用户的项目将足够用一年。当你用完这个额度,就不需要还钱了。为了进一步使用,您只需将余额充值到与项目关联的卡上。

第二步。打开 API BigQuery

创建项目后,必须激活 BigQuery API。为此,请从 GCP 侧菜单转到“API 和服务—仪表板”,选择项目,然后单击“启用 API 和服务”:

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

图片由作者提供

在 API 库中,搜索“BigQuery API”并单击启用:

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

图片由作者提供

要使用 API,请单击创建凭据:

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

图片由作者提供

从下拉列表中选择 BigQuery API,然后单击我需要什么凭据?

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

图片由作者提供

创建服务帐户的名称,并指定 BigQuery 角色访问级别。选择 JSON 密钥的类型,然后单击继续:

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

图片由作者提供

第三步。激活数据传输 API

接下来,您需要激活 BigQuery 中的数据服务。为此,打开 GBQ 并从左侧菜单中选择传输。然后启用 BigQuery 数据传输 API:

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

图片由作者提供

第四步。准备 GBQ 中的数据集

在 BigQuery 中,选择项目并单击右侧的 Create Dataset 按钮。完成新数据集的所有必填字段(名称、位置、保留期):

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

图片由作者提供

第五步。从 Google Ads 设置数据传输

单击侧面菜单上的“转移”选项卡,然后单击“创建转移”。然后选择 Google Ads(以前的 AdWords)作为来源,并输入上传的名称,例如 Data Transfer。

在“时间表选项”下,您可以保留默认设置“立即开始”,或者设置您想要开始下载的日期和时间。在重复字段中,选择上传频率:每天、每周、每月按需等。

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

图片由作者提供

然后,您必须指定 GBQ 数据集,以便从 Google Ads 加载报告。输入客户 ID(这是您的 Google Ads 帐户的 ID 或 MCC ID ),然后单击添加。你可以在谷歌广告账户的右上角查看客户 ID,就在你的邮箱旁边。

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

图片由作者提供

然后,您需要授权您正在使用的 Gmail 帐户。第二天,该信息将出现在您设置转移时指定的数据集中。

因此,您将在 GBQ 中收到大量原始数据,您可以使用这些数据:按活动、受众、常用(自定义)表格、关键字和转换的表格。例如,如果您想要构建一个定制的仪表板,您可以从这些表中提取非聚合数据。

如何使用 Ads 脚本设置上传

打开您的 Google Ads 帐户,单击右上角的工具和设置,选择批量操作—脚本,然后单击加号:

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

图片由作者提供

然后,在右上角,单击高级 API 按钮,选择 BigQuery,并保存您的更改:

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

图片由作者提供

请务必使用您登录 Google Ads 时使用的帐户进行注册:

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

图片由作者提供

复制这个剧本。在 BIGQUERY_PROJECT_ID、BIGQUERY_DATASET_ID 和您的电子邮件行中,用您自己的信息替换这些值:项目名称、GBQ 数据集和电子邮件。将脚本文本粘贴到文本编辑器中。

在运行脚本之前,一定要单击右下角的预览按钮来检查结果。如果其中有错误,系统会警告您并指出错误发生在哪一行,如下图所示:

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

图片由作者提供

如果没有错误,请单击运行按钮:

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

图片由作者提供

因此,您将在 GBQ 中收到一份新的 CLICK_PERFORMANCE_REPORT 报告,该报告将于第二天提供:

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

图片由作者提供

回想一下,当您使用数据传输时,您会得到大量原始的非聚合数据。与广告脚本,你只会有关于某些领域的信息。

本次上传的以下字段包含在与会话相关的 OWOX BI 表中:

  • GclId
  • CampaignId
  • 活动名称
  • AdGroupId
  • AdGroupName
  • 标准 Id
  • 标准参数
  • 关键字匹配类型

如何将从 Google Ads 下载的数据连接到 OWOX BI

现在,你需要将谷歌广告的信息与网站数据结合起来,以了解用户通过哪些活动到达了你的网站。在 BigQuery 中得到的表,比如数据传输,没有客户机 ID 参数。您只能通过将 gclid 数据链接到 OWOX BI 流数据来确定哪个客户点击了广告。

如果你还没有 OWOX BI 中的 Google Analytics → Google BigQuery 流管道,请阅读关于如何创建它的说明。

然后转到您的 OWOX BI 项目,打开这个管道。单击设置选项卡,然后在会话数据收集下,单击编辑设置:

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

图片由作者提供

使用滑块为 Google Ads 自动标记的活动启用数据收集,然后单击更改设置:

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

图片由作者提供

选择自动标签标记类型,指定如何将数据传输或 Ads 脚本加载到 BigQuery。指定将从中下载 Google Ads 数据的项目和数据集,并保存您的设置:

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

图片由作者提供

有用的提示

**提示 1。**通过数据传输,您可以将 Google Ads 中的历史数据上传到 GBQ。同时,对加载的总周期没有限制(一年或三年),但每次只加载 180 天的数据。

您可以通过选择所需的传输,使用“传输”选项卡上的“计划回填”按钮来激活上传并指定时间段:

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

图片由作者提供

技巧二。如果您想检查 GCP 将收费的 Google Ads 帐户的数量,您需要使用以下查询来确定 Customer 表中 ExternalCustomerID 的数量:

**SELECT** 
ExternalCustomerId
**FROM** `project_name.dataset_name.Customer_*`
**WHERE** _PARTITIONTIME >= "2020-01-01 00:00:00" **AND** _PARTITIONTIME < "2020-07-10 00:00:00"
**group** **by** 1

您可以在查询中编辑日期。

技巧三。您可以使用 SQL 查询自己访问上传的数据。例如,下面是一个查询,用于从数据传输派生的“Campaign”和“CampaignBasicStats”表中确定活动的有效性:

**SELECT**
{**source** **language**="sql"}
  c.ExternalCustomerId,
  c.CampaignName,
  c.CampaignStatus,
  **SUM**(cs.Impressions) **AS** Impressions,
  **SUM**(cs.Interactions) **AS** Interactions,
{/**source**}
  (**SUM**(cs.Cost) / 1000000) **AS** **Cost**
**FROM**
  `[DATASET].Campaign_[CUSTOMER_ID]` c
**LEFT** **JOIN**
{**source** **language**="sql"}
{**source** **language**="sql"}
  `[DATASET].CampaignBasicStats_[CUSTOMER_ID]` cs
**ON**
  (c.CampaignId = cs.CampaignId
   **AND** cs._DATA_DATE **BETWEEN**
   **DATE_ADD**(**CURRENT_DATE**(), INTERVAL -31 **DAY**) **AND** **DATE_ADD**(**CURRENT_DATE**(), INTERVAL -1 **DAY**))
**WHERE**
  c._DATA_DATE = c._LATEST_DATE
**GROUP** **BY**
  1, 2, 3
**ORDER** **BY**
  Impressions **DESC**

页(page 的缩写)如果你需要帮助上传和合并数据到谷歌大查询,我们随时准备提供帮助。

如何在 GitHub 上上传 R 代码:MacOS 上的 R 脚本示例

原文:https://towardsdatascience.com/how-to-upload-your-r-code-on-github-example-with-an-r-script-on-macos-3205d8d0d60?source=collection_archive---------50-----------------------

查看如何创建 GitHub 资源库以及如何使用 GitHub desktop 上传 R 代码和脚本的分步指南(带截图)

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

介绍

前几天,一个同事问我如何在 GitHub 上上传一些 R 代码,以便让每个人都可以访问。由于封锁,我不能直接去他的办公室,在他的电脑上给他看。所以我给他发了几张截图,一步一步地告诉他怎么做。

就在我删除刚刚拍摄的截图之前,我想它们可能对其他人有用,所以我写了这篇文章。

注 1:截图是在 MacOS 上拍摄的,我没有在 Windows 上测试过。请在评论中告诉我它在其他操作系统上是否相似。

注 2:肯定还有其他方法,但下面的方法(在我看来)很简单,而且效果很好。

先决条件

为了遵循这个指南并在 GitHub 上上传您的 R 代码,您至少需要:

  • GitHub 的一个账户
  • 安装在您电脑上的 GitHub 桌面应用程序

逐步指南

在本指南中,我使用了一个 R 脚本来绘制比利时因新冠肺炎而住院的演变。如果您想在继续下一步之前看到最终结果,请查看 GitHub 上的库。

你经常听到

“一图胜千言”

下面是如何将你的 R 脚本上传到 GitHub 上的简单方法:

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

第一步:去 github.com/login 并登录

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

步骤 2:转到您的 GitHub 概要文件并创建一个新的存储库

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

步骤 3:设置新存储库的名称、描述、受众和自述文件

请注意,如果您选择将公开,它将对所有人可见。如果您不想共享代码,但仍然希望它被上传到 GitHub,请选择 private 选项。

用 README 文件初始化 repo 不是强制性的,但是我强烈建议您这样做,以便您能够为这个 repo 添加信息。

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

步骤 4:现在您会看到新的存储库,其中只有自述文件

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

第五步:打开 GitHub 桌面应用程序,用你的 GitHub 账户登录

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

步骤 6 a:将您刚刚在 github.com 上创建的存储库克隆到您的计算机上

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

步骤 6 b:将您刚刚在 github.com 上创建的存储库克隆到您的计算机上

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

步骤 6 c:将您刚刚在 github.com 上创建的存储库克隆到您的计算机上

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

步骤 7:您的新回购出现在 GitHub 桌面应用程序上

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

步骤 8:打开一个 R 脚本并编写代码

(如果不熟悉,请参见如何安装 R 和 RStudio 。)

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

步骤 9 a:将你的 R 脚本保存在相应的文件夹中

您可以在步骤 6 c 中的“本地路径”下看到文件夹的路径。

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

步骤 9 b:将你的 R 脚本保存在相应的文件夹中

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

步骤 10:重新打开 GitHub 桌面,编辑提交标题(1)并点击提交按钮(2)

在步骤 10 中,确保当前存储库(见左上角)是您当前正在处理的 repo。

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

步骤 11:将提交推给 github.com

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

第 12 步:在你的 GitHub 概要文件中,点击新创建的存储库

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

步骤 13:您现在看到您的脚本已经被添加到存储库中

您的 R 代码现在可以通过您的 GitHub 档案上的新存储库在线获得。如果需要分享,只需分享回购的网址即可。

附加注释

如果您需要编辑代码:

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

在您的计算机上找到 repo 的文件夹,打开 R 脚本,编辑并保存它

保存脚本后,不要忘记提交更改,并按下 commit (参见上面的步骤 10)。

如果您需要查看旧版本的代码,您可以通过点击 github.com 上的 repo 访问 commits 选项卡来查看所有提交:

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

查看所有提交

感谢阅读。我希望这篇文章能帮助你创建一个 GitHub 库,并上传你的 R 脚本,以便任何人都可以使用。

和往常一样,如果您有与本文主题相关的问题或建议,请将其添加为评论,以便其他读者可以从讨论中受益。

相关文章

原载于 2020 年 5 月 24 日 https://statsandr.com

如何使用预训练模型(VGG)进行图像分类

原文:https://towardsdatascience.com/how-to-use-a-pre-trained-model-vgg-for-image-classification-8dd7c4a4a517?source=collection_archive---------7-----------------------

为什么要重新发明轮子?

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

图片来源:https://unsplash.com/photos/LJ9KY8pIH3E

嗨,伙计们,今天我要谈谈如何使用 VGG 模型作为预训练模型。让我们一小步一小步来

这些 VGG 模型是什么?

  • VGG 模型是由牛津大学视觉几何小组(VGG)的卡伦·西蒙扬和安德鲁·齐泽曼提出的一种 CNN 架构,它为 ImageNet 挑战赛带来了显著的成绩。
  • 他们试验了 6 个模型,有不同数量的可训练层。根据型号数量,最受欢迎的两种型号是 VGG16 和 VGG19。

在我们继续之前,我们应该回答什么是 CNN 架构以及 ImageNet。

对于感兴趣的读者,可以参考下表来了解作者实验的所有 ConvNet 系列。

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

图 1:不同的 ConvNet 架构(图片来源:Simonyan、Karen 和 Andrew Zisserman。“用于大规模图像识别的非常深的卷积网络。” arXiv 预印本 arXiv:1409.1556 (2014)。)

这是什么 CNN 架构?

CNN 是一个专门处理图像数据的深度神经网络模型。

  • 它不需要传统的图像处理滤波器,如边缘、直方图、纹理等。,而不是在美国有线电视新闻网,过滤器是可以学习的。所以,这些不需要通过反复试验来确定。
  • CNN 有两个部分,第一部分是特征学习部分,然后是分类层(通常称为全连接层)
  • 特征学习部分的两个主要构建块是卷积层和池层
  • **卷积层:**我们讨论过的可学习过滤器或特征提取器。
  • **池层:**这做了一些空间压缩,也带来了不变性。一辆车就一辆车,哪怕旋转一点点。

图 2 给出了 CNN 的架构概述。卷积创建特征图,汇集是通过二次采样实现的。

如果你需要更详细的解释,你可以看这里的。

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

图 2: CNN 架构(来源:维基百科https://creativecommons.org/licenses/by-sa/4.0&gt;,via Wikimedia Commons " href = “https://commons.wikimedia.org/wiki/File:Typical_cnn.png”>

预训练模型的原因和用途?

  • 这些是模型,是具有大量参数的网络(一个恰当的例子是 VGG16,它具有 1.38 亿个参数)
  • 一般来说,训练这样的网络是耗时且耗费资源的
  • CV 的预训练模型大多也非常通用
  • 我们可以直接使用这些模型,如果我们选择 1000 个训练类中的任何一个
  • 即使有一点点不同,我们也可以去掉顶层,只训练那一层的权重(迁移学习)

这个 ImageNet 数据集是什么?

这是斯坦福大学教授费-李非从 2006 年开始与 wordnet 合作的一个项目。图像注释是众包的。这实际上使得计算机视觉任务的试验台变得非常健壮、庞大和昂贵。基于 ImageNet 的 1000 类分类挑战始于 ImageNet 大规模视觉识别挑战(ILSVRC)。

实际上,这种竞争是 CNN 大多数杰出模特诞生的原因。

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

ImageNet 与其他图像数据集(来源:林等。艾尔。https://www.dbs.ifi.lmu.de/~yu_k/cvpr11_0694.pdf

现在实施

**T5 第一步:导入模型 **

from keras.applications.vgg16 import VGG16
model = VGG16(weights='imagenet')
print(model.summary())

还有很多其他 CNN 的型号可供选择,可以在这里找到

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

图 4: VGG 16 摩尔(图片来源:作者)

第二步:加载样本图像

from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.vgg16 import preprocess_input,decode_predictions
import numpy as np

img_path = '/kaggle/input/images/dog.jpg'
*#There is an interpolation method to match the source size with the target size*
*#image loaded in PIL (Python Imaging Library)*
img = image.load_img(img_path,color_mode='rgb', target_size=(224, 224))
display(img)

测试图像,我们使用的是黄金猎犬,也请注意图像是以 Python 图像库(PIL)格式加载的

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

测试图片: (图片来源:https://unsplash.com/photos/x5oPmHmY3kQ)

第三步:使图像尺寸与 VGG16 输入兼容

*# Converts a PIL Image to 3D Numy Array*
x = image.img_to_array(img)
x.shape
*# Adding the fouth dimension, for number of images*
x = np.expand_dims(x, axis=0)

这里,PIL 图像首先被转换成 3d 阵列,RGB 格式的图像是 3D 阵列。然后为多个图像添加另一维度。因此,输入实际上是一个 4D 数组。

第四步:做预测

*#mean centering with respect to Image*
x = preprocess_input(x)
features = model.predict(x)
p = decode_predictions(features)

在该步骤中,进行简单的均值居中预处理,然后进行预测,最后,将概率分布的预测解码为可理解的类名。我们已经在默认的前 5 名可能类模式中使用了它。

输出

[[('n02099601', 'golden_retriever', 0.8579672),
  ('n02099267', 'flat-coated_retriever', 0.018425034),
  ('n04409515', 'tennis_ball', 0.01615624),
  ('n02099712', 'Labrador_retriever', 0.015078514),
  ('n02099849', 'Chesapeake_Bay_retriever', 0.012522769)]]

如果我们使用条形图,这就是它的样子

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

图 5:最有可能的 5 类(图片来源:作者)

因此,无需创建模型并训练它,我们就可以完美地对一张金毛寻回犬的图像进行分类。

尾注:

  • 预先训练的模型就像魔术一样,我们可以下载模型并开始使用它们,即使没有任何数据和训练。
  • 如果源任务和目标任务是不同的,那么在域之间有一些相似性,那么我们可能必须训练几层,但是仍然,它不会像从头开始训练那样广泛,并且需要更少的数据

参考:

[1]https://www.kaggle.com/saptarsi/using-pre-trained-vgg-model

[2]西蒙扬、卡伦和安德鲁·齐泽曼。“用于大规模图像识别的非常深的卷积网络。” arXiv 预印本 arXiv:1409.1556 (2014)。

如何在希格斯玻色子上使用人工智能

原文:https://towardsdatascience.com/how-to-use-ai-on-the-higgs-boson-e97ef4fb2fb2?source=collection_archive---------25-----------------------

上帝粒子仍然充满秘密

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

安装部分 ATLAS 探测器。欧洲核子研究中心提供

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 P 文章欧洲粒子物理研究所的物理学家在 2012 年发现了希格斯玻色子。现在,我们的任务是了解更多关于它的特性。人工智能在其中扮演着至关重要的角色。

今天是星期天。你和我正在公园散步。我们的狗布鲁托在我们身边蹦蹦跳跳,渴望玩耍。你扔一根棍子让它接住。

然后你转向我。“你以前研究希格斯玻色子,对吗,”

没错。不过那是在它被发现的四年后。

如果它已经被发现了,还有什么可做的呢?

我们现在知道希格斯玻色子的存在。但是它的许多特性仍然未知。我和我的同事正在研究如何发现希格斯玻色子是否会在粒子对撞机中衰变为暗物质的策略。

“那么,比如说,希格斯玻色子破裂了,剩下的就是暗物质了?”

人工智能可以照亮希格斯玻色子的奥秘

理论上是这样,是的。我们不确定这是否真的会发生。但值得调查。这就是为什么我和我的同事考虑如何检测这些衰变——如果它们存在的话。我们发现人工智能是实现这一目标的最佳方式。

AI?“怎么做,”

为此,你首先需要了解我们在解决什么样的问题。

在欧洲粒子物理研究所,粒子探测器捕捉两个粒子以极高能量碰撞时发生的情况。每种类型的粒子——例如夸克或希格斯玻色子——都会在粒子探测器中留下特有的痕迹。“如果我们把这些痕迹放在一起,就可以重建两个粒子碰撞时发生的过程。”

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

CMS 探测器中产生希格斯玻色子的碰撞痕迹。欧洲核子研究中心提供

所以你用人工智能来找出哪些过程发生了?

没那么快!让我解释一下。

在一些碰撞中,会产生希格斯玻色子。但是希格斯玻色子的寿命相当短,所以它会很快衰变为其他粒子。这些可能是夸克或其他玻色子,或者可能是暗物质粒子。后者我们称之为信号事件——暗物质在产生的粒子中的碰撞。

当然,我们可以在探测器记录的许多过程中简单地搜索信号——我们正在谈论每秒发生的 5 亿次碰撞。

[## 数据处理:这么多碰撞!

考虑到大量的数据,粒子物理学家必须选择那些他们想为他们的研究存储信息的碰撞。

home.cern](https://home.cern/science/computing/processing-what-record)

问题是有些事件看起来和信号非常相似。但实际上它们是不同的过程。这些我们称之为背景事件。我们不希望这些扭曲我们的数据。所以我们的任务是教会探测器区分信号和背景。

“人工智能是如何发挥作用的?”

如果没有人工智能,我们只会查看信号的不同属性,然后在不太可能找到任何属性的地方剪切数据集。

例如,人们可以使用作为希格斯玻色子衰变为暗物质的副产品而释放出来的夸克数量。除了暗物质粒子之外,根据这个过程的基本物理性质,我们可能会想到两个夸克。有时候可能多一个夸克,有时候少一个。可能存在统计差异。

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

信号和背景事件及其各自的夸克数的示意图。如果只选择具有一个、两个或三个夸克的事件,就可以得到背景事件较少的数据集。作者图片

所以在这个例子中,我们可以从我们的数据集中去掉没有发现夸克或者多于三个夸克的碰撞。我们可以很有把握地说它们不是信号事件。通过这种方式,我们改进了数据集,因为它包含的背景比以前少了一些。

这就是人工智能的用武之地吗?

是的,没错。聪明的是,我们可以让人工智能算法学习信号事件的属性。“这让我们的工作变得容易多了,因为这意味着我们不一定需要了解太多的基础物理知识。”

“你在偷懒——不去研究基本的物理学!”

我称之为高效。

那好吧。人工智能如何学习什么是信号,什么是背景?

有很多不同的方法。在我们的例子中,我们使用了非常简单的算法,叫做决策树。基本原理是,你先用假数据集训练算法。该数据集来自计算机模拟,并且仅包含已经被正确标记为信号或背景的事件。

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

机器学习算法,如决策树,可以更快地提高数据集的质量。Javier Allegue Barros 在 Unsplash 上拍摄的照片

决策树对训练集应用随机切割,然后检查它将信号从背景中分离的程度。然后反复迭代,直到找到最佳切割。

但你为什么不能手动操作呢?

我们是手动完成的,但这需要大量关于底层流程的知识,否则会花费很长时间。此外,它很快变得复杂,因为信号的属性往往相互依赖。

例如,在一次信号碰撞中发射的两个夸克彼此之间可能有一定的距离。但是可能有其他信号事件涉及三个夸克。在这种情况下,三个夸克之间的距离可能不同于两个夸克之间的距离。所以我们不能只在夸克之间切割一段距离。决策树有助于考虑这种依赖性。

所以在某种程度上,机器知道的比你多!”

真的!这有助于我们揭示希格斯玻色子的特性。

[## 在看不见的希格斯搜索中标记喷流

我们关于这个主题的原创论文!如果你不是在这个领域工作的话,可能会很难读懂。

inspirehep.net](https://inspirehep.net/record/1642733?ln=en)

你又把棍子扔给布鲁托了。

这对你研究希格斯粒子有什么帮助?

有了人工智能,我们可以产生真正好的数据集,其中包含大量的信号和少量的背景事件。在我们的例子中,信号事件是希格斯玻色子衰变为暗物质之后的碰撞。

现在,我们需要做的就是计算我们发现的信号事件的数量。如果我们发现了一定的数量,我们就可以说我们发现了希格斯玻色子到暗物质粒子的衰变。

然后呢。“你发现了吗,”

没有。至少——还没有。我们的论文只是实现这一发现的众多步骤之一。“研究需要时间,”

希格斯玻色子的未来仍然令人兴奋

看看你是否会发现它,这将会很有趣!或者这些衰变是否根本不存在。

等着瞧吧!

我当然会…事实上,我认为人工智能真的很难理解。但现在看来这并不太疯狂。

公平地说,我们使用了现有的最简单的人工智能工具之一。如今,科学家经常使用更复杂的算法,包括监督深度学习和 GANs。但是如果你愿意的话,我们可以改天再谈。

“我很乐意!”当你试图把棍子从狗嘴里拔出来时,你惊叫了一声。“来吧,布鲁托,我们要回家了,”

如何使用人工智能来改善初级医疗保健的结果和效率

原文:https://towardsdatascience.com/how-to-use-ai-to-improve-outcomes-and-efficiency-in-primary-healthcare-77a46729670f?source=collection_archive---------37-----------------------

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

图像归属

只有 7%的信息是基于它所包含的单词。其余的 93%来自说话者的语调、肢体语言和面部表情 (1)

想象一下去看医生。你描述你的情况和症状,医生仔细观察和倾听。想象一下,这个咨询正在被录像。

该视频将包含您的发言(文本、单词),可以自动提取为文字记录并进行分析。您的声音及其相关特征,如音调、音量或震颤,也可以提取和分析。同样,你的动作包括面部表情,坐立不安,手势,姿势和物理距离都可以被分析。

让我们考虑可以单独分析的视频成分:

可以用主要症状提取来概括文本,然后可以将主要症状提取馈送到内部医学知识库(本体)模块,通过该模块可以提供诊断见解和相关建议。

您的声音及其特征,或声音生物标记(医学生物标记是从患者“外部”观察到的指示患者医学状态的医学标志)可用于探索特定疾病存在的可能性。在说明这一点的各种相关研究中,Beyond Verbal 和 Mayo Clinic 进行了一项双盲研究,涉及 120 名在冠状动脉疾病(CAD)背景下接受冠状动脉造影的患者和一组对照组,该研究使用移动应用程序在冠状动脉造影之前测量他们的语音信号。一个特别的声音特征(人耳听不到)表明冠心病的可能性增加了近 20 倍。

视频本身可以用来分析肢体语言和面部表情。例如,没有明确诊断帕金森病的特定测试。神经科医生根据病史、体征和症状回顾以及体检来临床诊断帕金森氏症。如果我们训练一个基于机器学习的人工智能系统,从大量帕金森患者视频访谈中学习身体运动、面部表情、震颤等,这可以用于潜在地诊断新记录(甚至直播)的患者咨询。例如,给定 10.000 个采访的训练和测试数据集,所能达到的准确度将是非常令人惊讶的。

智能数字医疗助理

使用文本、语音和视频对患者交互进行人工智能处理,以及医学知识、患者历史和自动化通信模块的知识库,是构成智能数字医疗助理的工具。最终,大多数临床医生和私人诊所将使用这项技术与他们的病人进行初步互动。

然而,重要的是,数字医疗助理永远不会取代有经验的医生。他们只会让一些医生比其他没有使用这项技术的医生更好!医生将有更多的时间与病人进行有意义的咨询。

不可避免的是,医疗保健的未来将涉及患者最初通过网络、移动或 IOT 界面与智能医疗数字助理联系,这些界面将自动分析患者的语音、声音和视频。除非得到妥善解决,否则提出的问题将自动转交给医疗专业人员进行进一步咨询。

总之,智能数字医疗助理将:

使用内部医学知识本体来回答问题(例如,它将存储我们所知道的关于喉咙痛的所有信息,以便回答相关问题)

使用机器学习和大数据来提供基于先前患者健康参数和结果的见解(即,给定患者 X 进行 Y 血液测试和潜在疾病 A,运行测试 Z 将是有用的,或者注意条件 B)

跟踪患者健康参数(波动、重复症状)

管理药物

提供简单可行的建议

提供个性化的健康建议和生活方式指导。

在紧急情况下,立即提供一线帮助

结论

人工智能(AI)将全面变革医疗保健。它可以改善结果和患者体验,同时实现医疗保健服务的大众化。

人工智能可以帮助改善医疗保健从业者的体验,使他们能够减少倦怠,花更多时间在严重的直接患者护理上。人工智能可以帮助医疗保健系统通过资源分配主动管理人口健康,以实现最大影响。

带走

使用基于移动或网络的智能数字医疗助理来提供基于远程视频的医疗咨询,并几乎即时地从视频中提取知识以支持或建议诊断,同时使用相同的系统来组织和跟进这些交互,这是使用人工智能技术来改善初级医疗保健的结果和效率的方式,尤其是在全球疫情中!

如果您想了解更多信息并站在医疗保健技术的最前沿,请加入权威的免费在线医疗保健社区 Footchat

(1)艾伯特·梅拉比安的权威性研究

关于作者

图片 1 & 2 归属

如何使用 Angular 部署 TensorFlow Web 应用程序

原文:https://towardsdatascience.com/how-to-use-angular-to-deploy-tensorflow-web-apps-5675b5a042cc?source=collection_archive---------13-----------------------

在角度构建的 web 应用程序中使用 Python 构建的模型

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

法比安·格罗斯在 Unsplash 上拍摄的照片

在机器学习和人工智能的新时代,Python 无疑是任何崭露头角的工程师的首选语言。干净、伪代码外观的语法——世界上最大的科学计算和机器学习社区已经为希望让他们的机器更智能的开发人员创造了完美的语言。

然而,向大众部署任何用 Python 构建的东西并不容易。构建任何人都可以使用的东西的最有效途径是 web 开发。

几乎每个有电脑的人都可以上网和浏览网页。即使是那些没有手机的人也可以通过手机上网。

使用 Python 进行 Web 开发是可能的。两个最大的框架是 Django 和 Flask——都很好,但是都比不上 JavaScript 可用的框架。

被全球 96%的网站使用[1] — JavaScript 在客户端 web 浏览器语言中占主导地位。自然,这就是 web 开发的空间。

幸运的是,像 Angular 和 Node 这样的框架使得构建 web 应用程序变得更加容易。只需很少的时间,我们就可以构建动态、交互式、快速的应用程序。

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

我们会建造这个。

在本文中,我们将采用 Python 内置的文本生成模型,并使用 Angular 将其集成到一个交互式 web 应用程序中。这里有很多细节,所以作为参考:

**1\. Our Model** - brief description of the model and download links**2\. Tensorflow.js** - conversion of model from Python to JS**3\. Getting Started With Angular** - installation and set-up**4\. Bootstrap** - how to implement Bootstrap CSS styles in Angular**5\. Model Component** - setting up the model component**6\. Loading Our Model** - how to load a model using TypeScript**7\. Making Predictions** - setup of prediction function in Typescript**8\. TextGenComponent** - implementation of all this code with the app

1.我们的模型

我们将保持这一部分很短,所以我们可以更多地集中在角接下来。

该模型是一个自然语言生成器。它使用字符级嵌入和一个非常标准的 LSTM 网络。

它是用 Python 构建和训练的,使用 TensorFlow 2。

训练数据包括马库斯·奥勒留的《沉思》和塞内卡的《致卢西留的道德书》——这两本书在斯多葛派哲学领域都是有影响力的文本。

这个模型产生的是一种特别雄辩的胡言乱语。

请记住,理性这个词的本意是表示分散,或者分解成原子,或者湮灭,它要么消失,要么改变。—艾·马库斯·奥勒留,大约 2020 年

在 Python 中,我们打开控制台,加载模型,并为模型输入一些内容。

接下来的一切都是模型产生的。

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

几个模型迭代产生的句子截图——这里我们对每个句子进行评分,并选择得分最高的文本

我们希望重现这一功能,但在一个易于分发的 web 应用程序中实现。我当然不是设计师——但我们也会努力让它看起来很酷。

如果你确实想了解更多关于这个模型的信息,这里有GitHub repo,我已经在这些文章中描述了构建过程(第一篇应该足够了)。

构建需要时间,所以您可以从这里下载模型和映射,分别是model.h5char2idx.json,。

2.TensorFlow.js

首先,我们需要将模型翻译成 JavaScript 可读的东西。

首先,pip install tensorflowjs安装我们需要的模型编译器,将模型从h5翻译到json

打开命令行并导航到包含modelname.json的项目文件夹。在那里,我们可以键入以下内容:

tensorflow_js model_type="Keras"
    modelname.h5
    nlg_models/modelname.json

这产生了我们的JSON格式的模型,我们稍后将把它加载到我们的 web 应用程序中。

3.Angular 入门

Angular 是一个很棒的 web 应用框架。它是轻量级的,结构良好,并且拥有大量的追随者。

要设置我们的环境,我们首先从这里 安装节点 。我们不会直接使用 Node,但它提供了我们在 Angular 中开发应用程序所需的几个功能

安装完成后,我们可以使用节点包管理器(NPM)来安装包——就像使用 Python 的pip一样。

我们需要的第一个工具是 Angular CLI(命令行界面),我们将使用它为应用程序的不同部分快速生成模板。我们打开自己的命令行并键入:

npm install -g @angular/cli

现在我们可以使用 Angular CLI 来创建一个项目。仍然在命令行中,首先导航到我们希望项目所在的位置。然后,对于一个名为nlg-project的项目,我们将输入ng new nlg-project——我们将被询问路由和样式表:

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

我们的新项目目录看起来应该与图中所示类似。我们可以用ng serve为这个项目初始化一个本地服务器。

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

默认角度应用程序页面

我们的服务器将被托管在localhost:4200——在我们的浏览器中输入这个会给我们默认的 Angular 应用页面。

我们将在应用程序中使用 TensorFlow.js 和 jQuery。这些可以与以下设备一起安装:

npm install @tensorflow/tfjs --save
npm install jquery --save

安装后,两个库都可以在node_modules目录中找到。为了避免这种情况,在我们的代码中使用任一库之前,还必须重新启动服务器:

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

这就是我们所需要的 Angular。大多数编辑器都可以用于我们的 Angular 项目,但我会推荐尝试使用括号VS 代码(我更喜欢后者)。

4.引导程序

我们将使用 Bootstrap 来设计我们 web 应用程序的大部分样式。Bootstrap 是一个预先格式化的 CSS 框架。它承载了一系列有用的预样式但灵活的元素。多亏了 Bootstrap,我们可以轻松地创建一个干净的动态页面。

要安装,我们键入npm install bootstrap --save

Angular 使用src/styles.css来设计网络应用。现在我们已经安装了引导程序,我们只需通过向styles.css添加以下内容来导入bootstrap.css:

@import "~bootstrap/dist/css/bootstrap.css";

应用程序 HTML

我们不想要默认网页,所以让我们更新它。HTML 代码包含在src/app/app.component.html中。

让我们只放置一个简单的标题和段落,这样我们就可以看到我们已经更改了正确的文件并正确地实现了 Bootstrap:

<h1>Meditations NLG</h1>
<textarea>Lorem ipsum dolor...</textarea>
<button class="btn btn-dark">Run</button>

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

无引导(左)和有引导(右)—这是一个开始,但当然还需要做更多的工作。

现在一切就绪,我们可以开始集成模型本身了。

5.模型组件

Angular 的工作原理是将我们的应用模块化成不同的部分。我们已经在src/app中看到了“app”组件,它表现为主/顶层,我们将所有其他组件放在其中。

要创建新组件,我们需要返回 Angular CLI。确保命令行位于项目目录中,并使用以下内容生成我们的text-gen组件:

ng generate component text-gen

这里,我们使用 Angular CLI nggenerate一个新的component叫做text-gen。如果我们查看一下app目录,我们会注意到几个新文件:

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

这是我们新的text-gen组件。要将组件放在 web 应用程序页面上,我们必须将组件标识符添加到app.component.html —组件选择器的名称包含在下面的text-gen.component.ts中:

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

因此,要在我们的应用程序中包含这个组件,我们只需在app.component.html中将<app-text-gen><app-text-gen/>添加到我们的代码中。将之前包含在app.component.html中的所有内容移动到text-gen.component.html

6.加载我们的模型

回到src/app/text-gen我们可以开始组装我们的模型。

首先,在text-gen.component.ts中,让我们编写加载模型的代码:

对我来说,这里最令人困惑的部分是asyncawait——其余部分与 Python 差别不大。

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

异步执行(左)和同步执行(右)—图片来自作者。

在 Python 中,我们一次运行一行代码——等待当前行完成处理,然后移动到下一行。

然而,JavaScript 可以并行运行我们的代码脚本。所以当第一行还在处理的时候,第二、三、四行已经被执行了——我们称之为异步执行。

如果这对你来说听起来像一场逻辑噩梦——相信我,当我说时,它是

loadLayersModel功能是异步的。为了正确处理这个问题,我们需要使用async使加载函数异步——允许我们使用awaitloadLayersModel函数。

在这里使用await使得这一小部分代码是同步的(像 Python 一样)。我们在加载和构建char2idxidx2char映射时也会用到这个。

整合负载函数

目前,我们的加载函数没有内置到我们的text-gen组件中。为了干净地做到这一点,我们可以将它与现有的类定义集成在一起。

TextGenComponent类中,有一个名为ngOnInit的函数——在类初始化时,这个函数会被立即调用。因此,如果我们将 load 函数放入其中,页面一加载,我们就加载模型。

修改ngOnInit,我们得到如下:

此时,您可能会(也可能不会)遇到以下错误:

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

如果是,我们导航到tfconfig.json并将"skipLibCheck": true添加为 TensorFlow 推荐的,如下所示:

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

7.做预测

我们已经加载了模型、字符到索引的映射和字符数组。现在,我们需要编写一个函数,它以文本的形式接受输入,并使用它来输出更多的文本,正如我们的模型所预测的那样。

我们可以把它分成三个部分:

  • 要索引的字符 —将文本转换为数字数组
  • 预测循环 —下一个最可能值的迭代预测
  • 字符索引 —将预测数字数组转换回文本

要索引的字符

第一部分是文本到数字数组的转换。为此,我们使用了getNum功能:

getNum接受char2idx和输入文本,并返回相同文本的编码版本。例如,用这个 char2idx 字典我们得到:

getNum(char2idx, "Hello World")

**[Out]:** [20, 45, 52, 52, 55, 1, 35, 55, 58, 52, 44]

预测循环

这是我们代码中最复杂的部分,但它只做了一点点:

  • 将由getNum生成的索引数组转换成张量——我们的模型需要的数据类型
  • 将张量输入到我们的模型中,该模型输出一个新的张量,其中包含每个字符的预测概率——由数组索引表示
  • indexOfMax取最高概率指数,并将其反馈到模型中进行另一次预测

在代码中,这给了我们:

注意,[indexOfMax](https://gist.github.com/jamescalam/b54dba89fc02feb7e08dc5017e6ac38d)函数查找数组中最大值的索引——我们把它放在我们的类之外。

字符索引

这部分是最简单的,实际上我们已经在预测循环的第 39 行实现了它:

this.text = this.text.concat(this.idx2char[yIdx]);

它所做的只是将预测的索引传递给idx2char,返回英文字符并将其连接到当前文本字符串。迭代生成我们预测的文本。

8.TextGenComponent

这些部分都是通过generate函数实现的——该函数是作为另一个方法添加到TextGenComponent类中的。

getNumindexOfMax方法都被添加到组件类之外。

当我们在text-gen.component.ts中将所有这些放在一起时,我们得到了脚本的功能版本:

完整的 text-gen.component.ts 脚本。如果它看起来很多,不要担心——这个代码块也让我害怕,但是一旦你一次一行地完成它,它会出奇地简单。

连接页面和模型

现在,我们需要做的就是将我们的首页元素——<textarea><button>——连接到组件的内部。

导航至src/text-gen/text-gen.component.html并添加以下内容:

首先,我们需要将显示在<textarea>中的文本绑定到包含在TextGenComponent中的text变量。这很容易通过向<textarea>元素添加[value]="text"来完成。

现在,当generate运行时,它用新文本更新TextGenComponent.text——反过来更新<textarea>

最后一部分是告诉 Angular 在点击“沉思”按钮时运行generate。还是那句话,这个超级简单,加上(click)="generate( meditationInput.value)"就行了。

meditationInput指的是<textarea>元素,而.value捕捉元素内部的文本,并将其传递给我们的generate函数。

拍拍自己的背

就这样,我们完成了!这款应用程序谈不上漂亮(正如我说过的——我不是设计师),但功能齐全:

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

为了简洁起见,我将把进一步的开发、设计和清理工作留到以后的文章中进行——本指南已经远远超出了我的预期!

尽管这篇文章很长,但我希望它是有用的。欢迎提问,或者告诉我不清楚的地方。那些使用过 JavaScript/TypeScript 或 Angular 的人——让我知道什么需要改进。

感谢阅读!

参考

[1]JavaScript 作为客户端编程语言在、W3 Techs 网站上的使用统计

如何使用 API 获取模型的空间要素

原文:https://towardsdatascience.com/how-to-use-apis-to-get-spatial-features-for-your-models-da729785f132?source=collection_archive---------81-----------------------

通过使用 API 中基于位置的功能,而不是另起炉灶,快速提高数据科学模型的性能。

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

在本文中,我将向您展示如何使用 API 快速获取空间数据集的许多要素,以构建更好的数据科学模型。

在我成为数据科学家的过程中,以及随后作为数据科学家的工作中,我建立了几个基于空间数据的模型,例如,预测房价,或者最近预测电动汽车充电站的预期用途。我很快发现,这些模型的性能(至少对于较小的数据集而言)并没有从模型的复杂性或广泛的参数搜索中受益,而是从良好的空间要素的可用性中受益。

我还意识到,提取这些空间特征可能相当麻烦:你需要识别和评估数据源,设置一套新的工具,如 PostGIS 数据库、OpenStreetMap 工具(如 transition、nomist 等。),并学习许多新的东西,如地图投影、空间索引、特定查询语言等,这会大大降低您的特征提取速度。

然而,还有一种更简单快捷的方法来获取您的空间要素集:使用一个处理所有这些任务的 API,这样您就不必这么做了。

如果你刚开始接触数据科学,或者不是来自计算机科学家教育背景的人,那么 API 一开始可能会让人望而生畏(专业术语有资源、端点、基本身份验证等。).至少对我来说是这样,这在某种程度上阻止了我使用它们。

但是,通过学习更多关于 API 的一般知识和使用提供免费帐户的 API,您将很快熟悉使用 API,并能够将它们作为一种新的有用资源集成到您的建模工作流中。由于大多数 API 都是以类似的方式构建的(这是它们如此受欢迎的一个原因),知道如何使用一个 API 也将有助于您理解其他 API 是如何工作的。

用于空间特征的 API

我目前正在 features4.com(现已公开测试)构建一个新的 API,它提供了对丰富的空间特征的免费和便捷的访问,例如 500 米半径内的餐馆数量或到最近医生的距离。我将使用 Features4 API 作为如何使用 API 的例子。

那么,我们如何使用 Featurees4 API 来获取您的空间要素呢?

鸟瞰图

从鸟瞰的角度来看,使用 API 很像调用一个普通的函数。您需要函数名,向它传递参数,然后返回一个结果。这与 API 基本相同(只是名称不同):你需要一个 URL,向它发送一些数据,然后得到一个响应。

网址

最重要的区别是,当你的函数托管在你的计算机上时,API 托管在 web 服务器上。因此,API“函数名”将总是包含它所在的地址,通常是一个 URL(就像您在浏览器中输入以检索网站一样)。例如,features4 API 的所有 URL 都以 https://api.features4.com/v1 的开始,因为这是 API 在服务器上可以到达的地方。例如“功能”位于https://api.features4.com/v1/number.

传递参数

一旦知道了 URL,就需要指定要发送给它的参数。你如何找出一个函数需要哪些参数?你只要看看它的文档就知道了。对于 API,您可以做同样的事情:为了知道 API 端点接受哪些参数,您可以查看一下 API 参考。在这样的参考中,您通常会找到关于参数的所有信息,包括它们的类型、描述和允许值。

我还没有提到的一点是,一般来说,API 比典型函数更加灵活。通常情况下,您可以用不同的方式发送参数值。一种常见的方法是以下面的形式传递它们(所谓的表单 urlencoded,因为您可以像这样将它们附加到 URL):

param1=value&param2=300&param4=true

指定参数的另一种常见方式是发送 JSON 编码的参数:

JSON 的好处是它支持嵌套参数和不同的数据类型,比如字符串、数字和列表:

方法

您需要向 API 提供一条信息:请求方法告诉服务器您希望服务器采取什么样的动作。这又使得 API 更加灵活,因此同一个 URL 可以服务于多个不同的响应。例如,GET表示应该获取一个项目,或者POST表示将数据推送到服务器(创建一个资源,或者生成一个临时文档发送回来)。

该方法还告诉服务器在哪里查找您传递的参数。使用GET方法,您可以将参数值附加到 URL,而使用POST方法,参数值将作为请求的一部分发送。

与传递参数一样,API 文档将让您确切地知道服务器接受什么方法,以及它将给出什么响应。为了一致性和简单性,特性 4 API 目前只使用 POST 方法,这样所有对 API 的调用都可以用同样的方式进行。

回应

API 非常可靠。除非无法访问他们的 web 服务器,否则无论您的请求是成功还是失败,他们都会给您返回一个响应。为了让你知道是否一切顺利,或者是否出了差错,它会给你发回一个 3 位数的数字(例如 200),即所谓的状态码。每个状态代码都有特定的含义,并且有一个具有标准化含义的状态代码的大列表。别担心,你不必把它们都背下来,或者一开始就记住这一点:

如果状态代码以下列开头:

  • 2 一切都好
  • 4 您可能犯了一个错误(比如遗漏了一个参数)
  • API 出错(所以,你对此无能为力)

如果一切正常,并且您收到了状态代码为 200 的响应,那么您还将收到您向 API 请求的数据。例如,Features4 API 将返回您所请求的空间特征,例如 500 米半径范围内的餐馆数量。响应的格式取决于 API,但您经常会收到 JSON 格式的响应,您已经通过传递参数知道了这一点:

如果您收到一个状态代码以 4 开始的响应,这意味着您这边出了问题,一个好的 API 会告诉您更多关于您所犯错误的类型,以便您能够快速修复它。例如,如果您省略了一个名为“半径”的参数,Features4 API 会告诉您哪里出错了:

所以,这是一个关于 API 一般如何工作的非常简短的介绍。关于它和 HTTP 协议还有很多要学习的,例如, Mozilla 提供了一个很好的信息来源。

一个具体的例子

让我们继续看一个具体的例子,看看如何使用 Features4 API 来检索一个位置的空间特征。我们将使用 Python 作为一种语言,但是基本上所有的语言都提供了向 API 发出请求的库。

假设你正在建立一个预测房价的模型,你认为中心性将是它的一个重要方面。假设酒吧和餐馆位于城市中心,密度较高,您希望获得给定位置周围 500 米半径范围内的餐馆数量。

获取访问权限

几乎所有的 API 都要求您提供一些凭证来访问它,比如用户名和密码。特性 4 允许你在注册一个免费账户后,用一个测试用户名API_TEST_KEY和没有密码或你的私有 API 密钥来试用 API(包括更多特性)。

获得您的第一个功能

首先要做的是在 API 参考中找出 Radius 中元素的特征号的 URL、方法和参数:

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

半径特征中元素数量的 API 参考

你可以在右上角找到网址和方法,上面说你要对/number网址使用 POST 方法。点击网址将显示完整的网址https://api.features4.com/v1/number

在文档的中心部分,您可以看到 API 为此特性采用的所有参数,它们是:

  • lat:所在位置的纬度
  • lng:所在地的经度
  • element:您感兴趣的地图元素(如餐厅)
  • radius:该位置周围的半径,以米为单位(如 500)

例如,您可以使用这个网站来获取某个位置的纬度和经度。

一旦有了 URL、方法、凭证和参数,就可以使用请求库来检索特性。为了方便起见,API 参考提供了不同语言的代码示例,您只需复制和粘贴即可获得基本结构,然后您只需根据需要更改参数。因此,在示例中,只需将bar替换为restaurant

如何使用 python 向 Features4 API 发出请求

很好:您可以看到,在某个地点(慕尼黑市中心)500 米半径范围内的餐馆数量为 153 家。

对 Features4 API 的请求结果

类似地,您可以检索另一个特征:到最近地图元素的距离。例如,对于房价,到最近的幼儿园的距离可能是感兴趣的。获得此功能的过程与之前相同:

  • 查看 API 参考中相应的部分
  • 识别这些信息:URL /distance、方法POST和参数lat, lng, element
  • 提出请求

结论

通过使用新的 Features4 API ,您已经了解了如何使用 API 为数据科学模型检索空间要素的一些基础知识。

随意探索 API 参考以获得更多特性,或者查看文档以了解哪些地图元素可用于这些特性。

作为一名数据科学家,掌握 API 知识将对你有很大帮助,因为对于许多事情,你不必重新发明轮子,而是可以使用别人已经为你做的工作。因此,利用现有的 API 将让您更快地提高工作效率。

我希望这篇文章能帮助你开始使用 API。

如何在 3 分钟内使用应用、应用地图和地图

原文:https://towardsdatascience.com/how-to-use-apply-applymap-and-map-in-3-minutes-36a08c09257?source=collection_archive---------26-----------------------

有时不太清楚什么时候使用 map、applymap 或 map。我会解释何时使用哪一个。

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

当你开始使用 Python 进行数据分析时,你会对所有的可能性着迷,但有时你也会感到困惑。通常有很多方法可以达到相同的目标,但你不确定该用哪一种。比如,很多人并不清楚applyapplymapmap的区别。为此,我想讨论一下三种方法的区别以及何时使用哪一种方法。

示例 1 —应用

假设你是辛普森团队的数据科学家。该系列的明星得到了赞助,每个明星每一季都有预算来买东西。你有第一季到第三季的成本:

>>> df = pd.DataFrame({'Customer': 'Mr.Burns Lisa Marge Milhouse Bart Homer'.split(),
 'Costs_1': np.arange(6) *2, 'Costs_2': np.arange(6) * 4, 'Costs_3': np.arange(6) * 6})
>>> df
   Customer  Costs_1  Costs_2  Costs_3
0  Mr.Burns        0        0        0
1      Lisa        2        4        6
2     Marge        4        8       12
3  Milhouse        6       12       18
4      Bart        8       16       24
5     Homer       10       20       30

第一项任务是确定每个季度的支出差异有多大。为此,我们首先创建一个函数来确定列的最大值和最小值,并将它们相减:

>>> def diff_calc(x):
 diff = x.max() — x.min()
 return diff

在我们将该函数应用于数据帧中所有需要的列之后:

>>> df[['Costs_1', 'Costs_2', 'Costs_3']].apply(diff_calc)
Costs_1    10
Costs_2    20
Costs_3    30
dtype: int64

如您所见,我们总共得到三个结果。我们对其应用函数的每一列都有一个结果。这是一个有趣的发现:每一季差异都在增加,所以我们似乎有特别渴望消费的明星。

我们为什么使用 apply?

apply方法可以用于一维数组。该方法可用于列和行。一维数组总是作为输入,即函数是逐行或逐列执行的。如果我们添加axis=1作为参数,我们得到一个逐行计算:

>>> df[['Costs_1', 'Costs_2', 'Costs_3']].apply(diff_calc, axis=1)
0     0
1     4
2     8
3    12
4    16
5    20
dtype: int64

示例 2 —应用地图

在第一个例子中,我们希望对数据帧的每个数字列应用一个特定的函数。如果我们想单独改变每个元素呢?假设市场部的一位同事要求您将每个元素格式化为字符串,并为每个元素添加前缀“S_”作为 Simpson 值的标签。在这种情况下,您需要一个可以应用于每个单独元素的函数。让我们首先创建函数:

>>> def simpsons_string(x):
 result = "S_" + str(x)
 return result

使用applymap,我们现在可以将函数应用于数据帧的任何元素:

>>> df.applymap(simpsons_string)
     Customer Costs_1 Costs_2 Costs_3
0  S_Mr.Burns     S_0     S_0     S_0
1      S_Lisa     S_2     S_4     S_6
2     S_Marge     S_4     S_8    S_12
3  S_Milhouse     S_6    S_12    S_18
4      S_Bart     S_8    S_16    S_24
5     S_Homer    S_10    S_20    S_30

好吧,实际上我们应该告诉我们的同事,这个要求在数据处理方面不是最佳的,但是applymap为我们提供了很好的服务。

示例 3 —地图()

在我们准备了上面的数据并给每个元素添加了前缀之后,我们得到的反馈是这位同事犯了一个错误。他只希望所有的字符串元素都有一个前缀。所以现在我们必须改变列的每个元素:

>>> df['Customer'].map(simpsons_string)
0    S_Mr.Burns
1        S_Lisa
2       S_Marge
3    S_Milhouse
4        S_Bart
5       S_Homer
Name: Customer, dtype: object

完美!使用map(),我们可以将函数应用于一列中的每个元素,而使用applymap(),我们可以将函数应用于整个数据帧。

结论

通过这三种方法,apply()applymap()map()功能可应用于数据帧或部分数据帧。使用apply()将函数应用于列或行,applymap()对整个数据帧的元素起作用,map()对单个系列的元素起作用。

如果您喜欢中级数据科学,并且尚未注册,请随时使用我的推荐链接加入该社区。

新手如何使用 AWS Lambda 和 CloudWatch

原文:https://towardsdatascience.com/how-to-use-aws-lambda-and-cloudwatch-for-beginner-67df0755922e?source=collection_archive---------43-----------------------

让我们使用 AWS 服务构建一个简单的无服务器工作流!

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

我发现了一个很酷的网站(https://covid19api.com/),在那里我们可以使用免费 API 轻松访问 COVID19 数据。这给了我一个想法,创建一个简单的函数来使用 AWS Lambda 获取数据,并将其保存到 S3。该脚本将使用 CloudWatch 每天自动执行。

以下是我需要完成的任务列表:

  1. 写一个函数来检索数据并保存到 S3。
  2. 将函数部署为 AWS Lambda 函数。
  3. 在 AWS CloudWatch 上创建一个事件,定时运行该功能。

所以,让我们开始吧!

  1. 编写一个函数来检索数据并保存到 S3。

一开始,我编写代码来检索本地计算机上的数据。下面是代码和结果:

import requests
import pandas as pd
from pandas.io.json import json_normalize
baseUrl = "[https://api.covid19api.com/total/dayone/country/indonesia/status/confirmed](https://api.covid19api.com/total/dayone/country/indonesia/status/confirmed)"
response = requests.get(baseUrl)
df = json_normalize(response.json())
df['change (%)'] = df['Cases'].pct_change()*100

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

如您所见,脚本运行良好。接下来,我们需要将脚本放在处理函数上,这是 Lambda 将要执行的函数。

import requests
import pandas as pd
from pandas import json_normalize
import boto3
from datetime import datetime
from io import StringIO def lambda_handler(event, context):

    baseUrl = "[https://api.covid19api.com/total/dayone/country/indonesia/status/confirmed](https://api.covid19api.com/total/dayone/country/indonesia/status/confirmed)"
    response = requests.get(baseUrl)
    df = json_normalize(response.json())
    df['change (%)'] = df['Cases'].pct_change()*100

    bucketname = 'my-beautiful-bucket'
    filename = 'corona_dataset.csv'

    csv_buffer = StringIO()
    df.to_csv(csv_buffer)

    client = boto3.client('s3')

    response = client.put_object(
        ACL = 'private',
        Body= csv_buffer.getvalue(),
        Bucket= bucketname,
        Key= filename
    )

我添加了两个新的库,即 boto3 和 StringIo,我还添加了脚本来将数据帧转换为 csv,并将其保存到我的 s3 存储桶中,名为“my-beautiful-bucket”。复制这个脚本并保存到一个名为 lambda_function 的. py 文件中。

2。将函数部署为 AWS Lambda 函数。

由于 AWS Lambda 不包括外部 python 库,我们不能只部署lambda_function.py。我们需要将lambda_function.py和所有那些库压缩成一个。zip 文件。

所以接下来要做的是创建一个新目录,并将lambda_function.py文件放入这个新目录。对于 windows 用户,打开命令提示符并转到我们刚刚创建的目录,使用 pip 将所有库安装到本地目录:

pip install -t . pandas

现在有一个棘手的部分,因为 AWS Lambda 使用亚马逊 Linux 作为操作系统。所以我们需要兼容 Linux 的熊猫和 Numpy。

要解决这个问题,首先移除移除pandasnumpy*.dist-info__pycache__ 。接下来就是打开https://pypi.org/project/pandas/#files下载最新的*manylinux1_x86_64.whl包。Numpy 也是一样:打开https://pypi.org/project/numpy/#files下载最新的 Linux 兼容包。两者都提取。whl 文件放在我们的目录中,并将其全部压缩到一个新的。zp 文件(注意:不要忘记删除 whl 文件、*.dist-info__pycache__。):

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

现在是时候创建一个 Lambda 函数了,登录你的 AWS 账户,找到 Lambda 服务,打开它,创建一个函数。

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

接下来,进入函数内部,选择“上传. zip 文件”作为代码输入类型,单击上传按钮,选择。zip 文件并单击 save 按钮来部署它。

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

如果。压缩文件太大,我们可以把它上传到我们的 S3 桶,然后上传。来自亚马逊 S3 的 zip 文件。单击测试按钮运行脚本。

3。在 AWS CloudWatch 上创建一个事件,以便按计划运行该功能。

假设我希望我的函数在每天 10:00 GMT 运行。转到 CloudWatch 服务,单击规则,然后单击创建规则按钮。选择 Schedule 然后选择 Cron expression 而不是 Fixed rate,然后输入 0 10 * *?0 10 * * ?*在文本框中,这意味着它将在每天 10:00 GMT 运行。选择我们的 Lambda 函数,单击 configure details 按钮,键入事件的名称,最后单击 create rule 按钮创建事件。

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

希望每一个读这篇文章的人都会觉得有用。当然,还有其他的 AWS 服务可以包含在这个项目中,使它变得更好,例如 AWS Athena 在 S3 使用 SQL 语言分析数据,AWS QuickSight 创建和分析数据的可视化。随意探索!

如何对自己的数据集使用 BigQuery API?

原文:https://towardsdatascience.com/how-to-use-bigquery-api-with-your-own-dataset-c901972cebd?source=collection_archive---------12-----------------------

使用 Flask 和 Bigquery APIs 根据用户查询参数从 Bigquery 数据集中提取数据。

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

来源: imgflip

我们要用 BigQuery APIs 做什么?

big query(BQ)API 对于让最终用户与数据集和表进行交互非常有用。

我们在本文中的目标是利用一些 BQ API 函数建立与 BigQuery 项目的连接,然后查询存储在那里的数据库。该数据库包含通过将 firebase analytics 链接到 Firebase 仪表板中的 BigQuery 而获得的 firebase 事件数据。

这是我的podcastApp项目的云控制台的样子(它现在是一个 Android 和 IOS 应用程序,对那些有兴趣听播客的人来说是 Podurama ):

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

装置

步骤 1:在终端中运行以下命令:

pip install --upgrade google-cloud-bigquery

步骤 2:使用以下步骤从 Google Cloud console 获取您的 BQ 项目的认证密钥:

  • 前往 项目选择器页面
  • 启用 API
  • 在云控制台中,进入 创建服务账号密钥 页面。
  • 服务账户列表中选择新服务账户
  • 服务帐户名称字段中,输入一个名称。
  • 角色列表中,选择项目 > 所有者
  • 点击创建。一个 JSON 文件,包含下载到您计算机的密钥。

如果你在遵循这些步骤时遇到困难,在开始官方 Bigquery 文档页面上的之前,检查一下下的步骤 1、2 和 3。

一旦您按照这些步骤操作,您的下载文件夹中就会有一个 JSON 文件。确保将它移动到您将要编写 python API 脚本的目录中。

在我们开始之前…

在我们之前的博客文章中,我们讨论了什么是 API 和端点,如何使用 Flask 框架编写一个简单的HelloWorld API,然后编写稍微高级的 API——从用户那里获取输入参数的 API。我们还深入讨论了如何通过在本地运行后端服务器来测试我们的 API。最后,我们还学习了如何编写简单而强大的 REST APIs 来部署机器学习模型。

我强烈推荐您去看看,因为在使用 Flask 框架方面有很多重叠,也因为在本文中我将更多地关注 BigQuery API。

注意:我将使用 Spyder 来编写 API 代码。最后,我将从 Jupyter 笔记本中访问我的 API。

让我们直接进入编码…

在存储 JSON 认证密钥的同一个目录中创建一个新的 Python 脚本BigQuery_API.py

正在导入 BigQuery 库

from google.cloud import bigquery

直接在代码中设置环境变量

import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = 'podcastApp-e07020594640.json'

在上面的代码中替换 JSON 键的名称。

提示:我发现在代码中直接设置 Google 应用程序凭证非常有用,当你同时处理需要不同凭证的项目时。

初始化 BigQuery 客户端

*# simple non parameterized query*
client = bigquery.Client()

编写 SQL 查询

query = """
    SELECT user_pseudo_id, event_name 
    FROM `podcastapp-767c2.analytics_193436959.events_*` 
    LIMIT 5

"""

这是一个非常基本的查询,我希望看到两列的前五行数据——用户 id 和事件名称。当然,你的问题可能会比这更复杂。要获得一些查询灵感,请查看这篇文章。

发出 API 请求

query_res = client.query(query)  # Make an API request.

打印结果

*# to print in the console*
for row in query_res:
    print(f'{row.user_pseudo_id}: {row.event_name}')

最后,所有代码都在一个地方…

from google.cloud import bigqueryimport os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = 'podcastApp-e07020594640.json'*# simple non parameterized query*
client = bigquery.Client()query = """
    SELECT user_pseudo_id, event_name 
    FROM `podcastapp-767c2.analytics_193436959.events_*` 
    LIMIT 5

"""query_res = client.query(query)  # Make an API request.*# to print in the console*
for row in query_res:
    print(f'{row.user_pseudo_id}: {row.event_name}')

运行该脚本会在 iPython 控制台中产生以下输出:

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

Wohoo!我们已经成功地从我们的 BigQuery 数据库中进行了查询。

参数化 SQL 查询

正如我之前提到的,我们选择了一个相对简单的查询作为例子。让我们继续,这次对数据集进行一个有用的查询:

查询以显示每个国家/地区的 ios 应用程序用户数量:

query = """
        SELECT geo.country AS country, COUNT(DISTINCT user_pseudo_id) AS count
        FROM `podcastapp-767c2.analytics_193436959.events_*` 
        WHERE device.operating_system = 'IOS'
        GROUP BY geo.country
        """

但是,如果我想将 WHERE 子句指定为用户的输入,该怎么办呢?好了,向参数化查询问好:

在参数化查询中,占位符用于参数,参数值在执行时提供。这些通常用于防止 SQL 注入袭击。

要指定一个已命名的参数,使用字符@后跟一个用户特定的变量名,例如@device_name

让我们看看如何将它作为 BigQuery API 请求的一部分:

from google.cloud import bigqueryimport os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = 'podcastApp-e07020594640.json'*# simple non parameterized query*
client = bigquery.Client()**query = """
        SELECT geo.country AS country, COUNT(DISTINCT user_pseudo_id) AS count
        FROM `podcastapp-767c2.analytics_193436959.events_*` 
        WHERE device.operating_system = @device_name
        GROUP BY geo.country
        """****job_config = bigquery.QueryJobConfig(
                query_parameters=[
                        bigquery.ScalarQueryParameter("device_name", "STRING", 'IOS')])**query_res = client.query(query, **job_config = job_config**) ***# to print in the console*
results = {} 
for row in query_res:
    results[row.country] = row.count
print(results)**

评估我们所做的修改:

  • 查询中的 WHERE 子句现在有了一个占位符@device_name
  • 该查询现在使用在job_config中指定的某些作业配置运行。
  • 我们指定了一个名为device_nameScalarQueryParameter,它的类型为STRING,值为IOS

控制台中的输出如下所示:

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

这看起来很棒,除了让用户指定他们感兴趣的设备作为 API 调用的一部分对我们来说更有意义。幸运的是,我们已经知道(从我们的之前的教程中)如何接受用户输入并使用 Flask 将它们作为 API 请求的一部分插入。

将 REST APIs 和 BigQuery APIs 结合成一个令人惊叹的大碗:

如果你完全遵循了之前和当前的教程,下面的代码将会非常有意义。

**from flask import Flask
from flask_restful import Resource, Api, reqparse** from google.cloud import bigqueryimport os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = 'podcastApp-e07020594640.json'**app = Flask(__name__)
api = Api(app)****# argument parsing
parser = reqparse.RequestParser()
parser.add_argument('user_device', choices = ('IOS', 'ANDROID', 'WEB'), help = 'Bad Choice: {error_msg}')
parser.add_argument('countries', action = 'append')**# parameterized query- one is scalar and other is array 
**class PrintUserCount(Resource):
    def get(self):
        # parsing the input argument
        args = parser.parse_args()
        device = args['user_device']
        countries = args['countries']**

        client = bigquery.Client() query = """
        SELECT geo.country AS country, COUNT(DISTINCT user_pseudo_id) AS count
        FROM `podcastapp-767c2.analytics_193436959.events_*` 
        WHERE device.operating_system = [@device](http://twitter.com/device) **AND geo.country IN UNNEST(**[**@countries**](http://twitter.com/countries)**)**
        GROUP BY geo.country
        """ job_config = bigquery.QueryJobConfig(
                query_parameters=[
                        bigquery.ScalarQueryParameter("device", "STRING", device), **bigquery.ArrayQueryParameter("countries", "STRING", countries)**
                        ]
                ) query_res = client.query(query, job_config = job_config)

        # to store results in dataframe 
        results = {} #empty dataframe
        for row in query_res:
            results[row.country] = row.count
       ** return{'res': results}**

**api.add_resource(PrintUserCount, '/')

if __name__ == '__main__':
    app.run(debug=True, port = 1123)**

评估我们所做的一些修改:

  • 我们现在接受来自用户的两个输入:
    (1)设备类型,可以是IOSANDROIDWEB
    (2)您想要输出用户数量的国家列表。
  • 作业配置必须将countries占位符指定为ArrayQueryParameter,因为这将是一个国家名称数组。
  • 在访问 WHERE 子句中的countries占位符时,记住要UNNEST它。

最后,保存文件并使用顶部绿色的 run 按钮(或 Mac 上的 F5)运行它。正如您在 iPython 控制台中看到的,API 正在本地服务器上运行[http://127.0.0.1:1123/](http://127.0.0.1:12345/)

现在打开 Jupyter Notebook 并输入以下代码来访问我们刚刚编写的 API。

url = '[http://127.0.0.1:1123/'](http://127.0.0.1:1123/')
params = {'user_device': 'IOS', 
          'countries':["China", "India", "Canada"]
         }
response = requests.get(url, params)
response.json()

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

瞧,我们有一个可用的 API,您可以使用它来查询您的 BigQuery 数据集,并接受来自用户的输入。

结束前的一些提示…

  • 用生命保护您的 JSON 认证密钥。防止它落入坏人之手!
  • 为了获得轻松的体验,在从您最喜欢的客户端库中访问 SQL 查询之前,请始终在 BigQuery Web UI 中尝试/测试/运行您的 SQL 查询。
  • 如需进一步阅读,请查看 API 参考文档

结论

在本文中,我们学习了如何使用 Flask 和 Bigquery APIs 根据用户查询参数从 Bigquery 数据集中提取数据。我目前正在使用这些框架作为我先睹为快的播客数据集的一部分。这对于创建基于 user_id 和他们之前与其他播客节目的交互请求推荐的 API 非常有用。希望在不久的将来,我会分享这些脚本。

直到下次:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值