使用 Java 解决您的数据科学问题
通过了解这种广泛使用的编程语言的基础知识,快速访问高质量的数据。
Java——一次编写,随处运行。照片由内森·绍特在佩克斯拍摄。
Java 提供了多功能性、互操作性,以及开着红色 vespa 环游欧洲的机会。数据科学家被期望拥有良好的 Python(或 R)编码能力。我认为 Java 应该作为一个有用的工具加入到数据科学技能集中。
自 1995 年以来,Java 一直在啜饮浓咖啡,编写杀手级应用程序,偶尔还会向咖啡馆窗外投去渴望的一瞥。很可能已经有一个 Java 应用程序可以帮助你作为数据科学家的工作。
本文将帮助您了解一些基本知识,理解如何使用 Java 来支持机器学习,并查看一些资源以进一步学习。本文并不打算教你这种通用语言的实际语法。本文不会购买您的浓缩咖啡,但 Java 可能会。
在本指南中:
Java 是什么?
Java 是一种通用编程语言,它是基于类的、面向对象的,并且是为互操作性而设计的。说到部署环境,你可以说 Java 有一种不顾一切的态度——用 Java 编写的应用程序可以在任何可以运行 Java 虚拟机(JVM)的操作系统上运行。这种灵活性就是为什么 Java 是应用程序开发人员的最爱,他们寻求创建一个与操作系统无关的工具,并能很好地移植到移动设备上。
java 程序的源代码。java 文件)是用大括号语法编写的。程序被编译成可以在 JVM 上运行的字节码(一个. class 文件)。
通过键入javac pdfParsingApp.java
将程序从源代码(如 pdfParsingApp.class)编译成字节码(如 pdfParsingApp.class)
如果你熟悉计算机科学基础中机器码的概念,java 字节码是类似的——但是字节码不是为主机的特定架构编写的,而是为虚拟机编写的。
via 我的教程博客
JVM 将 Java 字节码翻译成平台的机器语言——这就是 Java 的互操作性。JVM 能够从 Clojure、Scala 和其他编译成 Java 字节码的语言进行翻译。
为什么要学 Java?
虽然 Python 可能是数据科学世界的通用语(R 在较小程度上发挥了作用),但就更广泛的开发人员社区而言,估计有 40%的程序员使用 Java。由于 Java 被广泛采用,至少粗略地了解一下 Java 包是如何构造、编写和实现的,可以帮助数据科学家更有效地与他们的软件工程同事交流。
此外,理解 Java 有助于机器学习管道的数据获取和部署阶段。
在数据采集阶段,Java 很有帮助,因为生产代码库通常是用 Java 编写的。作为一名数据科学家,在坏数据进入机器学习管道之前逆流而上修复坏数据的能力是非常宝贵的。在 SQL ( 被 55%的程序员使用)之后,Java 可能是解决后端数据问题和清理数据最有用的语言。
从模型开发到数据清理的倒退——这是我们试图通过数据工程改善数据质量来避免的。由 Wilbur Wong 在 Unsplash 上拍摄的照片。
例如,在自然语言处理(NLP)中,我们处理大量非结构化的文本数据,这些数据被设计为人类可读,但计算机不可读。 Apache PDFBox 是一个 Java 库,旨在解决将 PDF 文本转换成可用格式的挑战。这个工具不仅支持内容提取,还可以用来修改现有文档和创建新文档。这将是一种非常酷的方式来报告基于文本分析的机器学习模型的输出。
说到部署, Java 提供了对 Scala 的简单介绍。这种超快的语言运行在 JVM 上,经常被 DevOps 工程师用来将机器学习模型投入生产。
学习 Java 最有力的论据是,它为改进面向对象编程提供了坚实的基础。计算机科学 101 课程通常以 Java 为基础语言,提供关于数据结构&算法的教学。因为 Java 提供的抽象不像 Python 那么多,所以它会提高你对计算机科学基础的整体知识。
一句话:当数据科学在计算机科学实践中得到正确定位时,每个人——数据科学家、软件工程师和他们所在的组织——都会受益。
我有时看到人们将神经网络称为“你的机器学习工具箱中的另一个工具”。他们有一些…
medium.com](https://medium.com/@karpathy/software-2-0-a64152b37c35)
Python 和 Java 的核心区别是什么?
Python 是一种动态类型的解释语言。编写 Python 代码时,程序员不必声明每个变量的类型——类型是动态的、可变的。在运行时,解释器通过将每个语句翻译成一系列子例程,然后翻译成机器代码来执行 Python 程序。
Java 是一种静态类型的编译语言。在 Java 中创建新变量时,程序员负责声明类型。这种类型是静态的,不能改变。静态类型也意味着错误是在编译时被捕获的,而不是在运行时。我们已经讨论了 JVM 在从中间 Java 字节码(即通过编译创建的类文件)转换成特定于底层计算机硬件的机器代码。
Java 源文件就像一个俄罗斯套娃——它只能包含一个公共类,但可以包含任意数量的非公共类以及任意数量的公共内部类。via Etsy 。
与使用 Python 相比,使用 Java 有更多的规则——无论是在语法方面(例如静态类型)还是在包结构方面。例如,一个 Java 源文件只能包含一个公共类。源文件必须以其包含的公共类命名。
例如,程序 pdfParsingApp.java 看起来像这样:
**public static void main**
行必须出现在每个 Java 程序中(作为包库一部分的程序除外)。这是 main 方法的开始,它在执行时运行,本质上告诉 Java 程序要做什么。程序中的其他类可以提供 main 方法使用的信息。
摘要
学习 Java 是熟悉企业机器学习管道通常由多种语言组成这一概念的良好开端。您可能会使用与 Java 和 JVM 相关的技术来收集数据、清理数据并生产您的模型。另外,将 Java 添加到您的堆栈中会提高您编写基于类的、面向对象的程序的能力。
希望这篇文章能让您对 Java 如何对您的 DS 工作有用有一点直觉。利用您对 Python(或 R)的熟悉,您可以快速构建对 Java 的更好理解——以及更好的应用程序和模型部署。
资源
- 丹·黑尔斯将你的大脑从 Python 重新连接到 Java
- 6 小时 Java 编程教程作者凯勒·库里
- 构建肌肉记忆的 Codecademy Java
- JetBrains Academy 基于项目的 Java 学习方法
- 入门教程本书
如果你喜欢阅读这篇文章,请关注我的 Medium 、 LinkedIn 和 Twitter ,了解更多提升你的数据科学技能的想法。
通过这个有用的期刊、视频和讲座的集合,推进你对机器学习的理解。
towardsdatascience.com](/supercharge-data-science-5bb7376d8572) [## 数据分析师、数据科学家和机器学习工程师有什么区别?
以田径运动会为例,探究这些常见职位之间的区别。
towardsdatascience.com](/data-analyst-vs-data-scientist-2534fc1057c3) [## 演练:在 Python 中映射 GIS 数据
通过 GeoPandas DataFrames 和 Google Colab 提高您对地理空间信息的理解
towardsdatascience.com](/walkthrough-mapping-gis-data-in-python-92c77cd2b87a)
Jupyter 笔记本上的 JavaScript 图表
用漂亮的 JavaScript 可视化将 Jupyter 推向新的高度
照片是我的
作为一名专业人士,我喜欢把自己想象成数据科学家和前端开发人员的混合体。我在工作中真正喜欢的,是处理涉及这两个部分的项目。然而,很多时候,我们没有时间去设计和实现一个完整的 web 应用程序,一个可靠的客户端-服务器架构和一个超级可重用的用户界面:在这种情况下,我们需要回到更快的东西。
在接下来的文章中,我将向你展示如何给 Jupyter 笔记本加类固醇,实现**,一个交互式的可过滤的可视化,只需要几行 JavaScript** 。
工具
我们需要为数据可视化选择一个 JS 库。我们有几乎无限的选择;对于本指南,我们希望选择一些易于使用的东西。一些例子包括 Highcharts 、 ECharts 或 d3.js ,
我们将使用 ECharts ,这是一个允许毫不费力地创建超级花哨的可视化效果的框架。该库最初是在百度开发的,但现在在 Apache 孵化器中。它是根据 Apache-2.0 许可的。
JavaScript 可能并不总是数据科学家的武器库(我发现这种语言的知识在具有计算机科学/编程背景的人中更常见)。如果你不知道 JavaScript,那么考虑一下这些库使图表的生成变得非常容易(如果你正在寻找非常复杂的交互,可能还需要做更多的工作)。ECharts 网站包含了大量复制粘贴的例子,展现了几乎所有的特性。
使用这些工具,唯一的“硬”工作就是处理数据,将它们转换成适合我们选择的特定图表类型的格式。
数据
我们将使用 谷歌新冠肺炎社区移动报告 *** 数据*。这个数据集包含了每个国家在一个地理区域[1],【T25 内去杂货店和公园等地方的百分比变化,它是由谷歌设计来帮助抗击新冠肺炎的。让我们来看一段摘录并描述一下这些列:*
country_region_code
:国家代码。我们将从分析中过滤掉这个字段。country_region
:国家名称。sub_region_1
和sub_region_2
:地理区域的两个更精细的视图。对于我们想要实现的图表,我们可以过滤掉这些。我们将只考虑sub_region_1
为null
的行(因此我们只考虑汇总数据,而不考虑每个子区域的信息)date
:简单的日期。retail_and_recreation_percent_change_from_baseline
: 餐馆、咖啡馆、购物中心、主题公园、博物馆、图书馆和电影院等场所的移动趋势。【2】grocery_and_pharmacy_percent_change_from_baseline
: 杂货店、食品仓库、农贸市场、特色食品店、药店和药房等场所的移动趋势。【2】parks_percent_change_from_baseline
: 当地公园、国家公园、公共海滩、码头、狗公园、广场和公园等地的移动趋势。【2】transit_stations_percent_change_from_baseline
: 地铁、公交、火车站等公共交通枢纽的移动趋势。【2】workplaces_percent_change_from_baseline
: 工作场所的移动趋势。【2】residential_percent_change_from_baseline
: 居住地流动趋势。【2】
太好了,我们需要的东西都有了,让我们开始研究代码吧!
谷歌有限责任公司“谷歌新冠肺炎社区移动性报告”*。
https://www.google.com/covid19/mobility/访问:<日期>。
你好世界!
本文的主题不是用 ECharts 创建一个超级漂亮的图表,而是展示如何在 Jupyter 笔记本上启用这个功能。出于这个原因,我们将只实现一个可视化:一个多线图,显示数据集中可用的每个 KPI 的时间序列。
Jupyter 单元可以解释各种类型的内容,从 Python 代码到 Markdown。注入 JavaScript 代码有多难?幸运的是,对我们来说,这就像使用一个Jupyter magic**一样简单!**通过单元格魔术,我们可以指示笔记本以特定的方式读取单元格内容,对于 JavaScript 我们可以使用%%javascript
魔术。
太棒了。我们知道如何在单元格中写 JS。工作流程应该如下:
- 我们使用 Pandas 读取 CSV,并根据需要对数据集进行预处理。
- 虽然仍然在 Python 代码中,但我们将数据转换成 JSON 字符串,这样我们就可以很容易地在 JavaScript 中操作它。
- 我们将 JSON 传递给 JavaScript 代码来生成可视化。
只是一个模式来了解数据流
最简单的方法是将所有的 Python 代码组织在一个函数中,在我们的例子中称为get_data()
。对于这个第一个示例,我们将只显示与retail_and_recreation_percent_change_from_baseline
指示器相关的时间序列。
我们将提供给 JavaScript 的 JSON 将具有以下形式:
{
"dates":[<array of all the dates (sorted)>],
"country_data":[
{"name":"Country Name 1",
"data":[<array of all the KPI's values, sorted by date>]
},
...
{"name":"Country Name N-1",
"data":[<array of all the KPI's values, sorted by date>]
}, {"name":"Country Name N",
"data":[<array of all the KPI's values, sorted by date>]
},
]
}
此时,我们有了数据:我们只需要在 JavaScript 单元格中访问它们。首先,我们需要导入 ECharts:为此,我们可以使用一个名为requirejs
的模块:
稍后,我们将能够使用上面的方法在ech
变量中存储 ECharts 对象。
为了让 JS 和 Python 交流,我们必须在某个地方存储 **get_data()**
函数的结果。让所有其他单元格都可以访问数据的一个非常简单的方法是将输出保存在一个window
属性中:也就是说,我们将把 JSON 字符串保存在全局变量window.outputVar
中。虽然在 **window**
中存储东西几乎从来都不是 JavaScript 开发的最佳实践,但我认为我们可以接受这种妥协来保持代码简单一点。
在%%javascript
单元格中,我们可以使用IPython.notebook.kernel.execute()
函数执行 Python 代码。没有深入研究细节(不幸的是,这个函数似乎缺少好的文档),这个函数接受一个字符串作为第一个参数:这个字符串是将要执行的实际 Python 代码(因此我们将所有内容存储在一个函数中,以使这部分更简洁)。
第二个参数描述 Python 之后需要执行哪些 JavaScript 回调。
我们之所以不能“简单地返回” [get_data()](https://codeburst.io/javascript-what-the-heck-is-a-callback-aba4da2deced)
结果,而是需要一个“回调”和一个全局外部变量,这是我在本文中不谈论的,以免偏离实际主题。然而,上面发生的事情简单如下:
- 执行
get_data()
功能。 - 执行之后,一个 JavaScript 函数读取结果,删除一些不需要的字符(快速而肮脏的解决方案,抱歉),将字符串转换为 JSON 对象,并将 JSON 保存在一个变量中,这个变量现在可以在页面中全局访问。
最后,好玩的部分!让我们深入到 ECharts 示例中,找到一个适合我们需要的可视化效果(想法是只复制-粘贴-编辑一些代码):堆积折线图应该是一个很好的起点:
简单来说,ECharts viz 生成分三步进行:
- 创建将包含可视化效果的 HTML 元素。
- 在元素上初始化 ECharts 对象
- 通过
setOption
方法设置图表选项。“选项”只是一个 JSON 对象,指示 ECharts 做什么。
除了所有视觉上的细微差别(颜色、工具提示等。),最重要的部分在于从上面的 JSON 开始生成数据。我们需要创建两个对象:一个用于 x 轴,另一个用于 y 轴。
x 轴数值 这将包含我们想要显示的所有日期。该列表需要保存在图表选项的 **xAxis**
属性中:
xAxis: {
type: 'category',
data: [<array with all the dates (sorted)>]
},
系列 这将包含我们想要显示的实际数据。**series**
属性由一个对象数组组成,其中每个元素都是图表中的一行:
series: [
{
name: 'Country 1',
type: 'line',
data: [<Array with values for each date>]
},
...
{
name: 'Country N',
type: 'line',
data: [<Array with values for each date>]
},
]
生成 viz 的代码如下:
如您所见,所有代码都保存在一个函数中,这个函数存储在中,同样,在window
全局对象中:(;最后一步是做最后的调用:
注意,在上面的例子中,我们将element
变量传递给了buildChart()
函数。EChart 可视化将追加到 **element**
(即执行 **buildChart()**
功能的单元格)。输出如下所示:
添加过滤器
两个问题:第一,图表不可读——线太多——第二,我们只能看到其中一个指标。我们真的希望有两个 HTML 元素来选择想要显示的国家和 KPI。有多种方法可以做到这一点,我们将选择最简单的一种!
我们需要稍微修改 **build_data()**
来返回所有的 KPI。让我们将该功能重命名为build_data_all()
:
新的 JSON 结构如下:
{
"dates": [<Dates>],
"country_data": [
{
"name": "<Country Name>",
"retail_and_recreation_percent_change_from_baseline": [<Array of values for this KPI>],
"parks_percent_change_from_baseline": [Array of values for this KPI],
"transit_stations_percent_change_from_baseline": [Array of values for this KPI],
"workplaces_percent_change_from_baseline": [Array of values for this KPI],
"residential_percent_change_from_baseline": [Array of values for this KPI]
},
...
]
}
想法是在页面中插入两个 HTML 选择元素**😗*
- 一个包含国家列表(这将是一个多选,以便我们可以同时显示多个国家)。
- 一个包含 KPI 列表。
****和前面代码唯一的区别就是我们需要 e 根据用户选择过滤 JSON。每当用户更改一个选项时,UI 都需要更新图表。
虽然对于 JavaScript 开发来说,在
window
中存储东西几乎从来都不是最佳实践,但我认为我们可以接受这种妥协,让代码简单一点。
下面的代码片段创建了两个 HTML select
元素,并将它们附加到单元格中:
注意,我们将事件监听器附加到了选择框,这样每当选择被修改时,viz 就会被刷新。此外,注意所有的函数都存储在window
对象中,使它们可以全局访问。****
我们已经准备好实现新的函数来生成图表:
我们就要结束了,让我们写一个函数,当一个输入改变时,它进行刷新:
最后,让我们调用单独单元格中的所有内容:
你可以在这里找到完整的笔记本。
希望你喜欢随时关注我的 Medium!
外卖食品
- JavaScript 可以成为 Matplotlib 或其他图表库的有效替代品;这项技术的主要优点之一是有大量的资源和选择。
- Jupyter 笔记本可以包含不同类型的代码,包括 JavaScript :使用魔法命令(在本例中为`%%javascript``)可以非常容易地实现这一点
- 可以包含任何 JS 库,理论上,可以只与独立的笔记本交互(没有外部文件)
- 没有任何调整,笔记本需要在每次页面刷新时重新运行
看看这些其他的文章!
Spark 中加速连接的实用技巧
towardsdatascience.com](/the-art-of-joining-in-spark-dcbd33d693c) [## 聚类波洛克
杰森·布拉克绘画的聚类分析——如何利用 k-means 进行色彩分组
towardsdatascience.com](/clustering-pollock-1ec24c9cf447)**
JAX:谷歌的差异化计算
革命性的机器学习框架
自从深度学习在 2010 年代初起飞以来,许多框架被编写来促进研究和生产中的深度学习。为了记录在案,让我们提一下 Caffe 、 Theano 、 Torch 、千层面、 Tensorflow 、 Keras 或 PyTorch 。一段时间后,这些框架中的一些消失了。其他的幸存下来并发展到今天,主要是 PyTorch 和 Tensorflow。随着时间的推移,这些框架演变成具有许多不同功能的大型生态系统。一方面,它们支持新模型的训练,包括在多 GPU 系统上的大规模并行训练。另一方面,它们允许用户在云中或移动设备上轻松部署训练好的模型。
不幸的是,这种精简有时会以机器学习研究人员测试新模型想法所需的灵活性为代价。谷歌通过其名为 JAX 的新框架瞄准的正是这个用户群体。在这篇博文中,我将向你展示 JAX 是如何通过向量化计算和梯度计算提供一个低级的、高性能的接口来鼓励实验的。
JAX 的设计哲学
JAX 的目标是允许用户通过即时编译和自动并行化来加速原始 Python 和 NumPy 函数,并计算这些函数的梯度。为了做到这一点,JAX 采用了功能设计。梯度计算等函数被实现为作用于用户定义的 Python 函数的函数变换(或函子)。例如,要计算绝对值函数的梯度,您可以写:
from jax import graddef abs_val(x):
if x > 0:
return x
else:
return -x
abs_val_grad = grad(abs_val)
如你所见, abs_val 是一个普通的 Python 函数,由仿函数 grad 转化而来。
为了能够使用 JAX 函子,用户定义的函数必须遵循一些限制:
- JAX 处理的每一个函数都要求是纯的。这意味着当用相同的输入调用时,它应该总是返回相同的结果。从功能上来说,可能没有任何副作用。否则,JAX 无法保证使用实时编译或并行化时的正确性。功能纯度实际上并没有被强制。虽然有时可能会抛出错误,但确保这种情况主要是程序员的责任。
- 人们不得不使用 jax.ops 包中的替代功能,而不是像 x[i] += 1 这样的就地突变更新。
- 实时(JIT)编译对 Python 控制流有一些限制。
就哲学而言,JAX 类似于你在使用纯函数式语言(如 Haskell)时会遇到的情况。事实上,开发人员甚至在文档中使用 Haskell 类型的签名来解释一些转换。
即时编译
JAX 的主要特性之一是能够通过 JIT 加速 Python 代码的执行。在内部,JAX 使用 XLA 编译器来完成这项工作。XLA 不仅能为 CPU 编译代码,还能为GPU 甚至是TPUs 编译代码。这使得 JAX 非常强大和多才多艺。为了使用 XLA 编译一个函数,你可以像这样使用 jit 仿函数:
from jax import jit
import jax.numpy as jnp**def** selu(x, alpha=1.67, lmbda=1.05):
**return** lmbda * jnp.where(x > 0, x, alpha * jnp.exp(x) - alpha)selu_jit = jit(selu)
或者,您也可以使用 jit 作为函数定义顶部的装饰器:
**@jit
def** selu(x, alpha=1.67, lmbda=1.05):
**return** lmbda * jnp.where(x > 0, x, alpha * jnp.exp(x) - alpha)
jit 仿函数通过将输入函数的编译版本返回给调用者来转换输入函数。调用原来的卢瑟函数会使用 Python 解释器,而调用卢瑟 _jit 会调用编译后的版本,应该会快很多,特别是对于 numpy 数组这样的矢量化输入。此外, JIT 编译只发生一次,并在其后被缓存,使得函数的后续调用非常高效。
使用 vmap 的自动矢量化
在训练机器学习模型时,通常会计算输入数据子集的一些损失,然后更新模型参数。由于为每个输入顺序计算模型的正向函数会太慢,所以习惯上是将数据的子集一起分批到一个批次中,并在诸如 GPU 的加速器上以并行方式计算正向函数。这是在 JAX 通过使用函数 vmap 完成的:
def forward(input, w, b):
input = jnp.dot(input, w) + b
return jnp.max(input, 0)jax.vmap(forward, in_axes=(0, None, None), out_axes=0)(inputs, w, b)
该代码片段采用一个具有 ReLU 激活的全连接层的转发功能,并在一批输入上并行执行该功能。参数输入轴和输出轴指定在哪些参数和轴上发生并行化。在这种情况下,(0,None,None)意味着输入在第 0 轴上并行化,而 w 和 b 保持不变。输出在 0 轴上并行化。
计算梯度
让机器学习研究人员对 JAX 特别感兴趣的是它计算任意纯函数梯度的能力。JAX 从 autograd 继承了这种能力,autograd 是一个计算 NumPy 数组导数的包。
要计算函数的梯度,只需使用 grad 变换:
import jax.numpy as jnpgrad(jnp.tanh))(2.0)[0.070650816]
如果您想计算高阶导数,您可以简单地将多个 grad 变换链接在一起,如下所示:
import jax.numpy as jnpgrad(grad(jnp.tanh))(2.0)[-0.13621889]
虽然将 grad 应用于 R(实数集)中的函数会得到一个单一的数字作为输出,但您也可以将其应用于向量值函数以获得雅可比矩阵:
def f(x):
return jnp.asarray(
[x[0], 5*x[2], 4*x[1]**2 - 2*x[2], x[2] * jnp.sin(x[0])])print(jax.jacfwd(f)(jnp.array([1., 2., 3.])))[[ 1\. 0\. 0\. ]
[ 0\. 0\. 5\. ]
[ 0\. 16\. -2\. ]
[ 1.6209 0\. 0.84147]]
这里,我们不使用 grad 变换,因为它只对标量输出函数有效。相反,我们使用类似的函数 jacfwd 进行自动前向模式区分(关于前向和后向模式区分的详细讨论,请参考 JAX 文档)。
**注意,我们可以在 JAX 将功能转换链接在一起。**例如,我们可以使用 vmap 对我们的函数进行矢量化,使用 grad 计算梯度,然后使用 jit 编译结果函数,例如深度学习中的标准小批量训练循环:
def **loss**(x, y):
out = net(x)
cross_entropy = -y * np.log(out) - (1 - y)*np.log(1 - out)
return cross_entropyloss_grad = jax.jit(jax.vmap(jax.grad(loss), in_axes=(0, 0), out_axes=0))
这里, loss_grad 计算交叉熵损失的梯度,同时在输入(x,y)和单个输出(损失)上并行。整个函数是 jitted 的,以允许在 GPU 上快速计算。产生的函数被缓存,允许用不同的输出调用它,而没有任何额外的开销。
多种转换的组合使得框架非常强大,并为用户设计数据流提供了极大的灵活性。
结论
对于需要额外灵活性的研究人员来说,JAX 为 PyTorch 或 Tensorflow 等更高级的框架提供了一个有用的替代方案。通过原生 Python 和 NumPy 函数进行区分的能力令人惊叹,JIT 编译和自动矢量化功能极大地简化了为 GPU 或 TPUs 等大规模并行架构编写高效代码的工作。然而,我最喜欢 JAX 的是它干净的功能界面。一个成熟的高级 API 生态系统将围绕它发展,这肯定只是时间问题。敬请期待!
Jean Alfonso-Decena:引领对话式人工智能创新,颠覆菲律宾金融科技行业
技术领域的女性系列
采访 Starbutter AI 的运营总监&合作伙伴
在过去的几年里,世界各地的科技公司和研究人员一直在竞相推进人工智能的前沿。随着技术空间的不断扩大和快速发展,很明显,在金融行业利用人工智能是经济发展的关键。现在,比以往任何时候都更加明显的是,计算机科学中的这些理论革命给全球市场带来了人工智能的新应用。
在菲律宾等国家,服务业一直是经济中“最强大、增长最快的部门”之一,人工智能创新有可能增加国家对全球价值链的参与。此外,人工智能的发展和与国家人才合作的跨国公司可以让国家更深入地参与国际服务贸易,并加速人工智能特有的隐性知识的传播。
图片由 Jean Alfonso-Decena 提供
在这个混乱的时代,Jean Alfonso-Decena 在对话式人工智能领域取得了巨大的进步。凭借其“探索和实验”的观点,Jean 正在菲律宾技术领域以及全球金融技术领域的人工智能领域创造价值。作为 Starbutter AI 的运营和合作伙伴负责人,她位于商业、数据科学、产品和工程的交汇处。Starbutter AI 被谷歌评为谷歌助理平台上最佳的 3 个人工智能代理之一,旨在帮助消费者选择金融产品。Jean 负责监督公司的业务运营,管理合作伙伴关系,并帮助设计和构建人工智能虚拟助理,以“帮助消费者挑选金融产品,并通过对话式广告和性能 marketing"⁴.发现(这些产品)”
图片由 Jean Alfonso-Decena 提供
你能告诉我们一些你的背景吗?
Jean: 我在初创企业——客户服务领域工作了十多年,最初在 IBM 工作了 7 年,当时他们投资了菲律宾马尼拉的一个业务流程外包部门。我是先锋团队的一员,帮助培训和提升组织,寻找和培养支持一家美国大型电信公司的人才。在 IBM 经历了一次惊人的领导力成长之旅后,我转到了硅谷,为一家总部位于雷德伍德城的大型电子商务公司做文案工作。仅仅几周之后,我被从内容团队中抽调出来,组建了先锋客户服务团队,在接下来的 4 年里,我领导并帮助这个团队成长。我离开了公司,成为了一名企业家,却发现自己又回到了领导和发展另一个 CS 团队的道路上,为一家总部位于波士顿的媒体巨头工作。
客户服务的场景对我来说是一个巨大的祝福,因为这个空间让我在各个层面上成长,而不仅仅是专业方面。又休息了一段时间,在斯里兰卡和印度获得瑜伽/冥想教学认证。然后 Starbutter AI 出现了。这是一个漫长的吉祥之旅,最终来到了这个叫做 Starbutter AI 的特殊地方。
图片由 Jean Alfonso-Decena 提供
你一直都知道在金融科技领域工作是你想做的吗?是什么激励你在创业界追求职业生涯,并与 Starbutter AI 合作?你在信息和传播研究方面的经验对你的决定有什么帮助?
在 fin-tech 工作从未在我的计划或梦想中,更不用说在 AI 了。我有一个完全不同的轨迹——我准备通过有意识的企业家精神传播爱和光明,同时利用我多年来接受的领导力、电子商务和人员/项目管理培训。在我的精神旅程中,我和 Starbutter AI 取得了联系。这家公司的名字引起了我的兴趣,所以我查了一下,在瑜伽和冥想之间,我越来越多地研究团队、人工智能和金融科技。公司的使命、价值观和创始人激发了我的大脑,俘获了我的心。进入一个非常神秘的(人工智能)领域的可能性,了解金融科技,以及与该领域一些最聪明的头脑一起工作,是我改变策略的主要原因。
简而言之,我当时的自我对话是:当你得到一个千载难逢的机会来帮助建造增强人类生活的机器人时,抓住它。创始人的独特使命是我签约的原因。
图片由 Jean Alfonso-Decena 提供
在你的 DEVCON Lightning 演讲“未来的工作”中,你描述了在人工智能虚拟助手领域创造产品所需的创新和跨学科合作。你还描述了人工智能和机器学习应用程序如何受到构建它们的环境以及构建它们的人的高度影响。为什么你认为技术人员在构建聊天机器人和其他被不同客户群使用的产品时采取这种协作方式是重要的?当我谈到建造聊天机器人时,我总是用“人类婴儿”来比喻。虽然它们不完全相同,但它们有共性。抚养一个婴儿需要一个村庄——我知道,因为我是一个母亲。但是,即使在孩子出生之前,也要做大量的准备工作,以确保孩子在子宫里健康成长。这一旅程最好与母亲的支持网络一起进行,以优化婴儿的生长和分娩,其中包括家庭、健康专家、父母社区和该领域的其他专家。
“当你得到一个千载难逢的机会,来帮助制造能够改善人类生活的机器人时,抓住这个机会。”
构建聊天机器人的整个过程,从端到端,涉及到设计和构建它的精心策划。几个因素开始发挥作用,包括用户体验、机器学习和许多其他考虑因素。建造一个让用户满意的机器人确实需要几个人的智慧和双手。跳过一个就像把一个关键的元素留在了画面之外。机器人出来会不完整,用户体验会感觉不好。你永远不会希望这样,尤其是在对话式人工智能领域。更重要的是,如果你有不同的客户统计数据,我们有。在你把你的机器人带到这个世界之前,你要确保所有的基础都被覆盖,并且从发布开始就不断改进。
我认为这适用于任何产品或工作——但在虚拟助理设计的世界里更是如此。
答: Starbutter AI 旨在帮助客户“尽可能容易地匹配金融产品”。Starbutter AI 是如何实现这一使命的,Starbutter AI 的对话代理在这其中扮演了什么角色?你能描述一下在你作为一名专注于自然语言处理、机器学习和 UI/UX 的高级人工智能培训师期间,你在这个目标上的工作经历吗?就寻找有用的信息而言,金融产品的世界仍然是一个难题。你需要花几周到几个月的时间在网上进行研究,比较文献,拜访银行,打电话或发电子邮件,咨询精通金融的朋友和亲戚,以帮助你决定购买哪种保险或选择哪家银行开立储蓄账户。这涉及到很多资源和给予你的信任,并最终做出这个巨大的人生决定。Starbutter AI 通过部署我们的虚拟助理来简化这一过程,虚拟助理提供一份简短的三到四个问题的表格,并根据他们的答案定制前三家公司的推荐。我们的虚拟代理为用户完成繁重的工作——通常需要几个月的工作,机器人只需不到 30 秒就能完成。用户仍然拥有决定权——我们的代理的工作是在回答表格后提出他们的最佳匹配。
“技术的彻底转变正在从人类手中夺走任务,所以我们需要知道我们将如何利用我们的大学学位和工作经验。我们需要知道哪些内容仍然适用,哪些技能和知识可以在我们前进的过程中加以利用。”⁵
作为一名高级人工智能培训师,我很乐意帮助构建这些机器人——为了让一个机器人启动并运行,我做了大量的研究、分析和设计。我仍然参与到这个过程中,但是作为一名教练,我站在训练和提高他们的第一线。很像训练和指导一个人类代理。
作为 Starbutter AI 的运营和合作伙伴主管,你面临的最大挑战是什么,你是如何克服的?J: 阻止自己向世界推出尽可能多的虚拟助手,并向尽可能多的客户提供解决方案!
说真的,鉴于对话式人工智能仍处于萌芽状态,这一领域有很多机会。构建这些是非常有趣的,并且知道您的解决方案真正为个人和组织带来价值会使整个过程真正有回报。我得提醒自己慢慢来。
图片由 Jean Alfonso-Decena 提供
**答:**除了在人工智能虚拟助手领域的工作,你在菲律宾的创业社区也非常活跃。菲律宾的创业界有什么让你特别兴奋的创新吗?
J: 正是时候!我有幸在 2019 年马尼拉创业周末指导的一个团体刚刚启动了他们建立的社区,作为对菲律宾素食主义者社区的首次提供,名为世伟。这是一个在马尼拉的素食者和未来素食者的市场,连接了代表不足的商人和顾客。他们的独特之处在于,他们是一个简单明了的社区,旨在连接素食市场的两端。这只是一个开始,世伟在未来几个月内将会有更多的技术储备。我最喜欢这家初创公司的地方在于,它是由甚至不是素食主义者的高中女性创始人创建的。展示了菲律宾年轻人的聪明才智和素食主义信息的力量,让他们从头做起。
我感到兴奋的其他初创公司是目前正在开发的解决精神健康和农业/农民生计问题的几项技术。我还没有时间深入讨论这些,但这些绝对值得关注。
“我们需要与那种完全脱离常规、创造性地思考和生活的人在一起。我们更需要加强人类之间的联系,因为通过这种联系,我们可以建立起能够推动我们朝着正确方向前进的关系。”⁶
A: 您认为对下一代有抱负的技术人员来说,最大的挑战是什么,目前在该行业工作的数据科学家能提供什么帮助?
J: 新老技术专家不会被告知他们所使用的同一项技术的最新创新和发展,除非他们去寻找(或者有积极的导师)。有很多被动的等待和等待,等待现在正在发生的事情,或者下一个将要发生的事情。我们都需要在技术领域拥有自己的学习和发展——我们必须永远渴望并继续渴望世界上的知识和机会。不仅仅是在技术上。其中大多数都不是主动提供的——事实上,我们必须找到并获得它们。
来自一个没有技术背景的人,我热情地提倡[上述],并以真实的网络努力来补充这一点。与技术领域内外的人联系会带来新的想法和机会。如果你呆在角落里,你永远不会知道外面发生了什么,发生了什么,接下来会发生什么。让自己置身事外并与之交谈有很大的价值。
如饥似渴地阅读,不间断地学习,真实地网络。
由 Jean Alfonso-Decena 提供的图片
**答:**我们的读者如何才能接触到 Starbutter AI?我们的网站https://www.starbutter.com/是一个很好的起点。
除了作为领先的人工智能培训师在人工智能领域掀起波澜之外,Jean 还是菲律宾初创企业的积极导师和思想领袖。她在技术和产品核心领域广泛而深入的经验继续激励女性技术人员在数据科学领域进行创新。今天,Jean 正在领导一场运动,将人工智能和金融可及性民主化。Jean 不仅是菲律宾人的榜样,也让来自不同背景的女性能够利用技术实现积极的社会变革。
特别感谢 Jean Alfonso-Decena 允许我为这个系列采访她,并衷心感谢 TDS 编辑团队对这个项目的支持。
你认识一位鼓舞人心的科技界女性,你希望她出现在这个系列中吗?你是否正在从事任何你希望我写的很酷的数据科学和技术项目?欢迎给我发电子邮件,向 angelamarieteng@gmail.com 寻求意见和建议。感谢阅读!
https://www.starbutter.com/ourstory
https://www.linkedin.com/in/jeanalfonsodecena/?[4]originalSubdomain=ph
参考
“服务——保障菲律宾工业的未来。”n.d .于 2020 年 6 月 20 日进入。http://industry.gov.ph/category/services/.
“(7)谷歌宣布获奖者:助理平台| LinkedIn 最佳 3 款人工智能聊天机器人。”n.d .于 2020 年 6 月 20 日进入。https://developers . Google blog . com/2017/12/introducing-winners-of-actions-on . html。
“(7)让·阿方索-德西纳|领英。”n.d .于 2020 年 6 月 20 日进入。https://www . LinkedIn . com/in/jeanalfonsodecena/detail/recent-activity/shares/。
“马尼拉 2019 年创业周末| 2019 年 2 月 8 日|马尼拉| Techstars。”n.d .于 2020 年 6 月 20 日进入。http://communities . tech stars . com/菲律宾/马尼拉/startup-weekend/14045。
“(481)让·阿方索·德西纳——YouTube。”n.d .于 2020 年 6 月 20 日进入。https://www.youtube.com/channel/UC_w-VaL0BMz50EYPzX2nNaw.
" Quickie 1:Jean Alfonso-Decena——人工智能训练者的忙碌|听笔记."n.d .于 2020 年 6 月 20 日进入。https://www . listen notes . com/pt/podcast/hustle share/quickie-1-jean-Alfonso-ytlwmaxotu 0/。
“认识 Jean Alfonso-Decena—block chain conferences . io”,未注明日期,2020 年 6 月 20 日发布。https://block chain conferences . io/speakers/jean-Alfonso-decena。
"(481)Quickie 1:Jean Alfonso-Decena——人工智能培训师的忙碌——YouTube . "n.d .于 2020 年 6 月 20 日进入。https://www.youtube.com/watch?v=513qpCzZZ_I.
"马尼拉的 IT 人才应对工业 4.0 挑战| HRD 亚洲."n.d .于 2020 年 6 月 20 日进入。https://www . HCA mag . com/Asia/news/general/manilas-it-talent-to-target-industry-4.0-challenges/170535。
"我们知道你对人工智能……-谷歌开发团队菲律宾|脸书感到兴奋."n.d .于 2020 年 6 月 20 日进入。https://www . Facebook . com/gdgphilippines/posts/we-know-that-you-excited-about-how-ai-shaping-todays-work force-so-were-Brin/1660848094047115/。
“服务——保障菲律宾工业的未来。”n.d .于 2020 年 6 月 20 日进入。http://industry.gov.ph/category/services/.
"人工智能在 2020 年银行业:银行如何使用人工智能-商业内幕."n.d .于 2020 年 6 月 20 日进入。【https://www.businessinsider.com/ai-in-banking-report.
"人工智能新闻:人工智能技术的最新进展|商业内幕."n.d .于 2020 年 6 月 20 日进入。https://www.businessinsider.com/artificial-intelligence.
“人工智能的下一步是什么——创新方程式。”n.d .于 2020 年 6 月 20 日进入。https://www . IBM . com/Watson/advantage-reports/future-of-artificial-intelligence/ai-innovation-equation . html
“到底什么是 AI 虚拟助手?| Voicera。n.d .于 2020 年 6 月 20 日进入。https://www.voicea.com/exactly-virtual-assistant/.
“我们公司和团队的故事| Starbutter。”n.d .于 2020 年 6 月 20 日进入。https://www.starbutter.com/ourstory.
“(10)让·阿方索-德西纳|领英。”n.d .于 2020 年 6 月 20 日进入。https://www.linkedin.com/in/jeanalfonsodecena/?原始子域=ph.
用轨道刮除工作板
用 Ruby on Rails 和 Heroku 构建一个调度作业刮刀
唐纳德·詹纳蒂在 Unsplash 上拍摄的照片
与工作相关的数据是我最喜欢处理的数据之一。解析需求和分析跨时间、公司和地域的变化很有趣。
虽然有一些很棒的公共数据库有与工作相关的信息,但也很容易找到。
我们将在 Ruby on Rails 中构建一个每天自动运行一次的工作板刮刀,托管在 Heroku 的免费层上。
设置
假设你已经安装了 rails,创建一个新的 Rails 应用程序并cd
到它的根目录。
$ rails new scraper-2020-03
$ cd scraper-2020-03/
然后修改Gemfile
,这里设置了 ruby 依赖关系。注释掉这一行。
# gem 'sqlite3'
加上这一行。
gem 'pg'
然后运行这个来更新已安装的软件包。
$ bundle install
我们刚刚用 Postgres 替换了 Sqlite。
配置数据库
打开/config/database.yml
并更新文件,如下所示。
default: &default
adapter: postgresql
pool: 5
timeout: 5000
development:
<<: *default
database: scraper_development
test:
<<: *default
database: scraper_test
production:
<<: *default
url: <%= ENV['DATABASE_URL'] %>
这里重要的部分是设置development
的数据库名称database: scraper_development
和production
的 URLurl: <%= ENV[‘DATABASE_URL’] %>
。
后者对我们部署到 Heroku 很重要。Heroku 默认将 Postgres 插件的 URL 设置为环境变量DATABASE_URL
。
现在在本地创建一个数据库。它将被命名为我们上面设置的名称。
$ rake db:create
创建 ORM 模型
生成迁移文件。这是我们指定要对数据库进行什么更改的地方。
$ rails g migration CreateJobs
导航到刚刚生成的迁移文件。我的是db/migrate/20200328142555_create_jobs.rb
,时间戳会有所不同。
编辑它,如下图所示。
class *CreateJobs* < ActiveRecord::Migration[5.0]
def change
create_table :jobs do |*t*|
*t*.string :location
*t*.string :team
*t*.string :job_title
*t*.string :url
*t*.timestamps
end
end
end
我们正在创建一个名为jobs
的表,它有几个字符串列来存储抓取的信息。默认情况下会添加一个主id
。t.timestamps
将添加created_at
和updated_at
列,当您将记录插入数据库时,这些列会自动填充。
在/app/models/
中创建名为job.rb
的文件。这是我们的模型。应该是这样的。
class *Job* < ApplicationRecord
end
创建一个耙子任务
在/lib/tasks
中创建一个名为scrape.rake
的新文件。Rails 中的 Rake 任务是用于自动化管理任务的命令,可以从命令行运行。如果你想写代码并安排它运行的时间,这里是放代码的地方。
更新scrape.rake
。
task scrape: :environment do
puts 'HERE'
require 'open-uri'
*URL* = 'https://jobs.lever.co/stackadapt'
*doc* = Nokogiri::HTML(open(URL))
*postings* = *doc*.search('div.posting')
*postings*.each do |*p*|
*job_title* = *p*.search('a.posting-title > h5').text
*location* = *p*.search('a.posting-title > div > span')[0].text
*team* = *p*.search('a.posting-title > div > span')[1].text
*url* = *p*.search('a.posting-title')[0]['href']
*# skip persisting job if it already exists in db* if Job.where(job_title:*job_title*, location:*location*, team:*team*, url:*url*).count <= 0
Job.create(
job_title:*job_title*,
location:*location*,
team:*team*,
url:*url*)
puts 'Added: ' + (*job_title* ? *job_title* : '')
else
puts 'Skipped: ' + (*job_title* ? *job_title* : '')
end
end
end
用 Nokogiri (Ruby 的 html 解析库)导航 html 超出了我们的范围,但是如果你打开网页查看,你可以按照我的方法解析 DOM 树。
本地运行
应用程序都设置好了。本地运行就这么简单。
$ rake scrape
在我的本地数据库中,我现在可以看到数据。如果您没有好的工具来查看本地数据库,可以考虑使用 dbeaver 。
我们唯一的问题是我们不想每天手动运行它。通过部署到 Heroku 并安排任务来解决这个问题。
部署到生产环境
在浏览器中创建或登录您的 Heroku 帐户。
然后在命令行中键入以下内容。它将使用您的浏览器进行身份验证。
$ heroku login
运行以下命令在 Heroku 上创建您的应用程序。
$ heroku create
Heroku 将输出它给你的应用程序的名字作为响应。我的叫fast-garden-42976
。
现在在本地设置 git。
$ git init
$ git add . -A
$ git commit -m 'The first and last commit'
使用 Heroku 给你的名称(不是我的名称)添加你的应用程序,以便我们可以部署。
$ heroku git:remote -a fast-garden-42976
并展开。
$ git push heroku master
完成后,迁移 Heroku 上的数据库。
$ heroku run rake db:migrate
在生产中配置调度程序
通过手动运行命令在生产环境中测试它。
$ heroku run rake scrape
现在我们只需要将 rake 任务设置为一个调度作业。
在 Heroku web 控制台中,单击“资源”。
开始键入“schedule”并提供 Heroku Scheduler。
单击您刚刚添加的调度程序,然后单击“创建作业”。
配置rake scrape
作业,每天午夜运行一次。
要善良,不要多刮地盘。
瞧啊。你的应用程序现在将每 24 小时添加一次新工作。
当您想要访问这些数据时,可以考虑像 Postico 这样的应用程序,它允许直接连接到 Heroku 中的远程数据库。或者,您可以从 Heroku 下载数据库并将其导入本地。
结论
这是一个快速简单的抓取应用程序。我们获取了每项工作的一些初步信息,并将其存入数据库。
如果你想更进一步,可能还需要补充一些东西。
- 打开存储的 URL 以获取工作描述。
- 如果抓取多个工作公告板,请在数据库中添加另一列来存储公司名称。
我希望这是有益的,我很乐意回答评论中的问题。
招聘会正在虚拟化
女性社交活动虚拟化
照片来自 Shutterstock
一个亲自参加社交活动曾经需要精心计划,打印出名片和简历,穿着得体,留出足够的时间往返于活动现场。随着许多科技公司在新冠肺炎期间继续招聘,这些公司正在寻找虚拟招聘员工的方法,从而改变了社交活动的格局。
我最近参加了一个由 WomenHack Los Angeles 主办的网络活动,对虚拟网络的效率和真实性感到惊喜。WomenHack 是一个“通过评论、工作和活动赋予女性技术力量”的组织。该组织在世界各地的城市举办招聘会,由于新冠肺炎的快速传播,这些活动现在都是虚拟的。
我参加的 WomenHack 活动之所以成为可能,要归功于一个在线活动平台 Hopin 。该平台允许在舞台上进行主题演讲、聊天信息、投票、分组讨论以及一对一的交流。
Hopin 是一个在线活动平台,在这里您可以创建引人入胜的在线活动,将全球各地的人们联系起来。
hopin.to](https://hopin.to/)
主旨
活动以出现在霍普金平台专用窗口的主题演讲开始。该平台还包含一个所有与会者和演示者都可以使用的聊天功能。在观看 keynote 的同时,能够看到其他与会者和演示者分享的聊天内容并参与其中,这种体验让人感到协作和包容。通常在大型活动中,大声说出并提出问题可能会令人生畏。让与会者在聊天窗口中提问,让每个人都能感觉到这个过程,即使对于通常躲在房间后面的胆小的人也是如此。
1:1 联网
主题演讲结束后,与会者有机会参加快速网络会议,与正在招聘的公司进行一对一的面对面交流。这无疑是这次经历中最激动人心和最具互动性的部分。作为一名与会者,我被重定向到一个页面,在那里我被随机匹配到一个招聘公司的代表。在屏幕的底部中央是一个“连接”按钮,如果按下并相互作用,会在活动结束后将每个人的联系信息添加到联系人仪表板中。之前给了我们 4 分钟的发言时间,嘣,计时器超时,我被安排到另一家公司的代表。
世博会
该网站的另一部分模仿了一个网络展厅。出席活动的每家公司都有一个分组讨论展位,供那些有兴趣进一步聊天和了解机会的人使用。这是一种协作体验,多名与会者可以倾听并公开参与讨论。
如何在虚拟活动中成功建立关系网
现在你可能想知道如何在虚拟社交活动中取得成功。当考虑是什么造就了一次成功的面对面交流活动和虚拟交流活动时,有很多重叠的地方。首先也是最重要的,你应该在参加活动之前就有一个目标。问问你自己,“我想从中得到什么?”。目标是找工作或与其他与会者建立关系网吗?第二,与公司代表交谈时,提出深思熟虑的问题会给人留下深刻的印象。提前对这些公司进行调查,并列出有意义的相关问题,这将会影响他们对你的看法。
参加虚拟网络活动时,请遵循以下提示:
- 与其他与会者和公司代表交谈需要网络摄像头和麦克风设置。建议事先测试麦克风和扬声器,并确保你坐在一个背景干净、光线充足的地方。
- 更新你的 LinkedIn 个人资料。与其他与会者和公司代表联系的最佳方式是通过 LinkedIn。大多数虚拟场馆平台可能会允许你创建一个带有 LinkedIn 个人资料链接的个人资料。其他与会者和公司代表将能够看到您的 LinkedIn 个人资料,这可能是您在活动结束后的主要沟通方式。
- 做一个有效简洁的介绍。在 WomenHack 活动期间,1:1 网络仅允许您与每位公司代表进行 4 分钟的交流。这是一段很短的时间,你可以介绍自己,了解公司,并提出任何问题。有效利用这段时间!
- 网络摄像头上的肢体语言很容易读懂,即使你没有亲自互动。一定要微笑,有良好的眼神交流,和良好的姿势,以显得真诚和更有效地沟通。
- 跟进。现在,通过在一对一交流过程中建立联系,您已经获得了该代表的联系信息。如果你对公司的机会或与个人的联系感兴趣,请在活动结束后跟进。
总体印象
无论你是在找工作,还是对建立联系感兴趣,我都强烈建议你参加虚拟社交活动。已经开发并正在开发的支持虚拟场馆的技术在创建与现场活动同义的虚拟体验方面非常强大。如果我亲自参加的话,我会从这个网络会议中获得很多。不必担心运输,交通,印刷名片和简历的物流,举办这些活动实际上使更多的人有机会参加这些类型的活动。
基于 NLP、机器学习和深度学习的工作薪酬预测
利用从 Indeed.com 搜集来的职位信息进行工作薪水预测项目的第二部分
Clem Onojeghuo 在 Unsplash 上拍摄的照片
项目背景
找工作最重要的事情之一是知道你现在在哪里,你下一步想去哪里。求职者的心态很像产品经理,试图找到最适合的产品和市场。聪明的产品经理知道他们的客户想要什么。因此,他们仔细地找出客户的需求,这些需求通过职位描述中的“最高资格”、“你必须具备的条件”来表达。在确定了市场上普遍需要的东西之后,聪明的产品经理会定制他们的产品,比如简历、求职信、在线简介、作品集,以尽可能展示这些特点和特质。这个项目是为了帮助你成为那个聪明的产品经理,告诉你什么样的品质和顶级技能是市场所需要的,并进一步帮助你在工资谈判中导航,做出最佳选择!
怎么会?该项目将在美国主要城市的数据/分析领域取消 10000 多个职位,以及职位名称、公司、公司评论、城市、职位描述、薪资范围等信息。我们将从职位描述文本中提取特征,并在机器学习和深度学习模型中使用这些特征。稍后,我们将把文本特征与生活成本指数、购买力指数、位置等其他特征结合起来,为模型添加更多的颜色。
数据集
我放弃了 Indeed.com 的 12,115 份工作,主要集中在数据相关领域,如数据分析、数据科学/数据工程、商业分析、数据库管理等。如果你对我如何收集数据感兴趣,请查看我在这里发布的部分。
在初始数据清理(删除重复项、检查 nan 等)之后。),留下了 964 个工资明确的岗位。Indeed.com 只有 8%的招聘信息有工资条😂。964 不是一个大数字,但对这个项目来说应该没问题。
我还预处理了位置和薪水列。原始工资信息包括小时工资率、月工资率和年工资率。所以我使用了一些正则表达式技术来清理它们,并将其转换为平均年利率。
这是数据现在的样子。
连续的工资数据被转换成更平衡的箱,以获得更好的预测结果。所以现在我们有 6 个箱子:0-50k 美元、50k-70k 美元、70k-90k 美元、90k-120k 美元、120k-150k 美元和 150k+。
连续工资数据被转到工资箱
我还有另一张表,上面有美国主要城市的生活成本指数,房租成本指数,购买力指数。我将在这篇文章的后面使用它们。
建模
现在我们来看建模部分。由于作业 描述将主要用于获取特征和建立分类模型,因此本项目将探索多种文本矢量化技术。我为这个项目建立了 7 个模型,基本上是不同矢量化方法+分类模型的组合。网格搜索应用于整个建模过程,以获得最佳的参数集。
模型 1:计数矢量器+ TF-IDF 变换+分类模型(随机森林/SGD/SVM)
模型二:Word2Vec 嵌入+分类模型(随机森林/SGD)
模型 3:预训练手套嵌入+分类模型(随机森林/SGD)
模型 4:单词嵌入+简单神经网络模型
模型 5:预训练手套嵌入+深度神经网络模型
模型 6:具有城市、费率类型和生活费用指数的混合输入网络模型
模式 7:仅使用职位、城市、生活成本指数+分类
如果我对每一个模型进行扩展,这篇博客文章将会是一篇论文,所以我将在这篇文章中关注以下三点。
在这篇文章中,我将重点关注以下几点:
- 使用计数矢量器和 TF-IDF 转换器(相当于 TF-IDF 矢量器)从文本中提取特征
- 开发 Word2vec 嵌入并在机器学习管道中使用
3.在 Keras 中建立混合输入网络模型
使用计数矢量器-TF-IDF 转换器提取要素
使用计数矢量器和 TF-IDF 转换器相当于 TF-IDF 矢量器。其思想是首先将一组文本文档转换成一个令牌计数矩阵,然后将一个计数矩阵转换成一个规范化的 TF(术语频率)或 TF-IDF(术语频率-逆文档频率)表示。当分析职位描述以进行薪资预测时,我意识到仅基于计数并不容易找到“决定性”的词,因为所有的职位描述都在数据字段中,因此像“数据”、“分析”、“经验”这样的词出现频率非常高。然而,预测工作工资范围也不同于普通的文本分类,在普通的文本分类中,你可以区分“快乐”和“悲伤”,“真”或“假”。所以我们真的需要 count 和 tf-idf,以及机器学习模型。
编码部分其实很简单:
在分类模型中使用 Word2Vec 嵌入
Word2Vec 是一组用于产生单词嵌入的相关模型。这些模型是浅层的单层神经网络,被训练来重建单词的语言上下文。详细解释可以在这里找到。
为了使用我们自己的数据创建 Word2Vec 模型,我们需要为该模型指定以下参数:
我们想要学习的单词向量的大小训练模型时使用的
窗口大小
- min_count ,其对应于单词为了被包括在训练中而必须在语料库中使用的最小次数(例如, min_count=5 将只学习在整个训练集中出现 5 次或更多次的单词的单词嵌入)
- workers ,用于训练的线程数量,这可以加速处理(通常使用 4,因为现在大多数处理器至少有 4 个内核)
在上面的代码中有两个步骤:1)训练 Word2Vec 模型,2)计算平均单词嵌入——想法是获得出现在该文本块中的每个单词的向量,并将它们平均在一起。这样做的好处是,无论文本块有多大或多小,该句子的平均单词嵌入量将与所有其他句子的平均单词嵌入量相同,以确保我们在对向量进行平均后获得相同的维数。
在 Keras 中建立混合输入网络模型
这是我第一次尝试在一个神经网络模型中同时使用文本数据和数值分类数据。从概念上讲,该过程如下所示:
Keras Functional API 使这项任务变得简单。
第一步是检查数字/分类输入和文本输入的维数,并确保它们具有相同数量的目标类。其次,我们可以为每个输入创建单独的网络模型,并将它们连接在一起。最后一步是添加一个输出图层。
在我的 github 上查看完整的项目和代码,如果有任何问题,请随时告诉我!
感谢阅读到目前为止。最后一个问题:你认为哪种型号性能最好😀?
资源:
[## 如何用 Gensim -机器学习掌握在 Python 中开发单词嵌入
单词嵌入是自然语言处理中表示文本的一种现代方法。单词嵌入算法…
machinelearningmastery.com](https://machinelearningmastery.com/develop-word-embeddings-python-gensim/) [## Keras:多输入和混合数据- PyImageSearch
在本教程中,您将学习如何使用 Keras 处理多输入和混合数据。您将学习如何定义一个 Keras…
www.pyimagesearch.com](https://www.pyimagesearch.com/2019/02/04/keras-multiple-inputs-and-mixed-data/) [## 如何使用 Keras Functional API 进行深度学习——机器学习掌握
Keras Python 库使创建深度学习模型变得快速而简单。顺序 API 允许您创建…
machinelearningmastery.com](https://machinelearningmastery.com/keras-functional-api-deep-learning/)
约翰·康威的生活游戏和互动视觉化
庆祝一位伟大的数学家并探索输入数据的方法。
在当前的冠状病毒疫情的悲惨损失中,杰出的数学家约翰·康威于 4 月 11 日去世。他对群论和博弈论做出了重大贡献,但最广为人知的可能是他的人生游戏。《生命的游戏》是一个简单而迷人的细胞自动机练习,最终发展出了自己的生命,远远超出了康威的预期。
生命的游戏发生在一个网格上,某些细胞被标记为“活的”或“活跃的”,而其他细胞被标记为“死的”或“不活跃的”。
一个生命网格游戏的例子,黑色格子被切换为“开”
网格的初始条件由玩家设定,但之后,网格会根据设定的规则演变:
1.如果一个当前不活跃的细胞正好有三个活跃的邻居,它就像在下一轮繁殖时一样被激活。
2.如果一个活细胞的活邻居少于两个,它就像因人口不足而死亡
3.如果一个活细胞有三个以上活跃的邻居,它就像因人口过多而死亡
4.有两个或三个活邻居的活细胞持续到下一回合
先前的初始安排如何在连续的回合中发挥作用
生活的游戏很简单——康威特别选择了尽可能简单的规则,同时满足其他条件——它被证明是一个持久迷人的框架,基本上开创了细胞自动机的领域。这个游戏有趣的,甚至不可思议的特点是,它可以被证明是图灵完全的,因此人们在游戏中“编程”了一些东西——一个数字钟,一个工作版本的俄罗斯方块,生命本身的游戏。
上周,作为对康威的讽刺性致敬(他公开表示,他不认为自己的人生游戏有那么有趣,并对他可能因此而获得认可表示了些许不满),我试着编写了自己的人生游戏实现。我意识到,对于任何从事数据图形工作的人来说,这个游戏实际上可能是一个有用的可视化和用户交互练习——游戏的规则非常简单,即使是新参与者也应该能够通过代码来理解它们,但用户如何在开始时有效地设置电路板的问题并不是数据科学世界中最常见的交互式可视化的典型问题。
在初始设置过程中,用户有很多种方式与电路板进行交互,但是允许用户在电路板上选择任意数量的点并不是用滑块或下拉菜单就能很好解决的问题。一种解决方案使用通用图形库 Matplotlib,它具有交互式功能,允许用户单击许多新用户可能不知道的图形,但不清楚这是最简单还是最有效的解决方案。考虑到这一点,我想把康威的《生活的游戏》作为一个互动视觉的小型实用案例来展示,并提出几个可能的解决方案。这绝不是所有的解决方案,我把它看作是一个挑战,让用户找到最简单的方法,尽可能高效地建立一个任意的网格,同时需要尽可能少的外部库。
第一步:设置游戏
我做的第一件事是创建一个简单的面向对象版本的规则。我创建了一个新的类,对应于游戏中的一个单元格,属性对应于它在网格中的位置和状态,还有一个方法根据游戏规则更新单元格的状态。这些对象可能看起来像这样:
如果您非常习惯使用 Python,这个方法对您来说可能有点过于复杂。为什么要创建一整类对象呢?你可以像一个由 1 和 0 组成的 Numpy 数组有一个根据游戏规则更新网格的函数一样简单地表示网格。有几个原因。一个是,我认为游戏内部逻辑的实现根本不应该引用任何外部库,不要假设最终用户会安装什么包,如果可能的话,让整个程序运行起来,而不需要另外安装任何东西。我的第一个实现使用了一个名为诅咒的库,它实际上是随 Python 一起安装在 Mac OS 上的,用来可视化网格,因此它不需要 Python 3 以外的任何东西就可以为许多人运行。
另一个原因与个人对代码组织的偏好有关。我需要一种标准的方法来实现规则和更新网格,不管我用什么来输入起始网格或显示视觉效果,它都可以以同样的方式工作。您的收获可能会有所不同,这取决于您认为使用哪种结构最方便,但是我发现这种方法可以简化代码调试。
无论如何,不管你用什么方法,实际上模拟生活的游戏是非常简单的:定义规则,创建你的网格对象,打开某些单元格,更新单元格的状态,迭代连续的回合。更有趣的问题是如何构建一个简单的输入方法,这样无论网格大小如何,用户都可以轻松地输入起始条件。您可以要求输入一些坐标,但这很麻烦,尤其是对于较大的网格,因此最好是找到一些其他的输入方法。
输入法 1: Matplotlib 交互性
如果您与 Matplotlib 的主要交互是查看笔记本中的静态输出,您可能实际上没有意识到 Matplotlib 具有接收交互式输入甚至跟踪内置鼠标移动的能力。从命令行运行 Python 脚本将在自己的 Python 窗口中打开您的绘图,您可以通过该窗口与绘图进行交互,只要您告诉 Matplotlib 何时会收到某些输入,以及在输入到达后如何处理它们。
对于简单的点击界面,您可以使用函数。ginput(),它将收集单击输入的坐标。一个简单的用法可能是这样的,您可以将鼠标悬停在任何单元格上并单击以激活它们,或者再次单击它们以取消激活它们:
使用 Matplotlib 跟踪鼠标点击的位置来更新网格
在本例中,我使用一个 Numpy 数组来表示棋盘,这既是为了便于索引,也是因为您可以使用 Martplotlib 的 imshow 将数组转换为一行中的图形,它将数组中的值读取为编码显示颜色。生成一个简单网格并跟踪哪些点被选中的代码如下所示:
然后可以将启动点列表输入到一个函数中,该函数初始化 Conway cell 对象的网格(或者您可以简单地使用由 1 和 0 组成的 Numpy 数组),然后就可以计算出游戏的未来回合数并绘制成图表。
我鼓励那些之前不熟悉 Matplotlib 的交互特性的人去体验一下。它们开辟了一系列有趣的可能性,切换或选择数据,改变可视化风格,甚至输入新数据,而无需设置外部仪表板。这种方法工作得很好,很明显,更广泛地使用 Matplotlib 的这些特性有很大的潜力,但我并不完全满意。对于更大的网格或更复杂的起始条件,这种方法也会变得很麻烦。在输入和图形响应之间也有一点滞后,我觉得有点沮丧,所以我继续寻找其他有趣的图形输入方法。
输入法二:带诅咒的乐趣!
我前面提到的 Curses 库提供了另一个有趣的解决方案。Curses 允许您控制将字符输出到终端窗口。这更像是一种古怪的倒退,创造了一种有趣的类似 ASCII 的表示,而不是一个严肃的图形库,但是,正如我提到的,它是为许多人内置的。
使用 curses 在网格上输入位置
除了找出如何让我的生活游戏在诅咒中工作的内在乐趣之外,我最终认为像诅咒这样的工具实际上可能提供一些有用的方法。我已经准备好为我的数据科学工作探索其他有趣且很少使用的包。
Curses 允许你在可用屏幕上的任何地方放置角色,这种方式非常简单,尽管有一些奇怪的地方需要记住。首先,在放置任何东西之前,你需要实际检查屏幕有多大。如果用户扩展终端窗口,Curses 必须处理的画布的大小将会扩展。其次,Curses 从上到下对屏幕进行索引,这是标准打印的延续,在标准打印中,页面顶部的内容首先打印出来。最后,Curses 会收集您想要添加到屏幕上或想要更改的任何角色的位置,但它不会实际显示任何更改,直到您告诉它刷新屏幕,并且它不会更改您没有明确告诉它的屏幕的任何部分。如果你不清除屏幕上的任何字符,它们将一直存在,直到被覆盖。
我的生命诅咒游戏实现的输入页面的代码如下所示:
请注意,它在一个字典中收集所有切换单元格的位置,然后我可以轻松地将它传递给一个函数来初始化生活模拟游戏。我开始想,也许终端中的视觉效果是传递坐标等信息的一种不错的方式,我正在考虑使用它的其他方式。
作为对伟大的约翰·康威的致敬,考虑用你自己的方式来玩生活游戏的实现,思考集合或者只是以你自己的方式进行创造性的创新。
连接熊猫聚合和 SQL 分析函数
我们使用聚合函数 sum、average、min 和 max 实现移动平均、等级项目、累积和
SQL 分析函数用于将大型数据集汇总成一个简单的报告。这些功能产生的数据汇总可以很容易地可视化。这些功能有助于数据分析专家轻松分析复杂的数据。
在本文中,我们结合 pandas 聚合和分析函数来实现 SQL 分析函数。
SQL 分析函数有许多种类。我们将逐一介绍这些功能。但首先,让我们了解一下本文中使用的数据。
零售数据集
我们将使用 Kaggle 数据集。以下是对数据集每一列的解释。
该数据集的销售日期从 2010 年 2 月 5 日到 2012 年 11 月 1 日。
商店——商店编号
部门——部门编号
日期—代表一周
Weekly_Sales —每个部门的商店每周销售额
IsHoliday 表示一周内的假期
这里是零售数据集的几行。
现在,让我们从 SQL 分析函数开始。
1.秩和稠密秩函数
秩和密秩提供了有序数据集的秩。这两个函数有一个小的区别。通过这个例子,我们可以很容易地理解这种差异,我将在本节的最后解释这一点。
等级和密集等级的用例
1.您可以使用这些函数来查找世界、大洲或国家的前 N 名亿万富翁。
2.计算商店中前 N 件商品在一天、一周、一月或一年中的销售额。
3.计算一家公司在世界不同地区的增长和业绩。
4.根据 GDP、饥饿指数、人口等对国家进行排名。
SQL 秩和密集秩函数的 Pandas 等价物
- 由等级和密集等级函数分配给索引 5314 和 6214 的等级是 141。并且由等级和密集等级函数分配给索引 2794 的等级是 143 和 142。这种类型的等级分配将等级函数与密集等级函数区分开来。
- 将总和替换为中值。agg 函数计算平均每周销售排名和密集排名。
- 使用 groupby 函数中的其他列可以更好地理解数据和 rank/dense rank 函数。
2.百分比等级函数
Percent rank 函数考虑一组行来计算一行的百分位值。其值范围在 0 到 1 之间。
百分比等级的用例
1.我们在竞争性考试中使用这个函数来根据考生的分数计算他们的百分位数。
2.这些公司使用这种方法计算每个员工的收入,同时考虑其他员工的收入。
SQL 百分位等级函数的 Pandas 等价物
- 在 2011 年 11 月 25 日,商店 4 的销售额最高,商店 10 的销售额次之。索引 1404 处的 Percent_weekly_sales 值表示商店 10 的销售额超过该商店的 97%。
- 将平均值替换为中的和。agg 函数根据每周销售总额计算百分比。
3.滚动功能
滚动函数计算指定时间范围内数据的平均值。它添加一个旧的数据点,并添加一个新的数据点来计算平均值和均值。但是指定的时间框架是不变的。
滚动功能使用案例
1.这种方法将帮助你找到股票的 50、100、200 天移动平均线。均线是股票交易者的重要技术指标。这将有助于他们预测股票价格的走向。
2.你可以用这种方法追踪蔬菜的价格。你可以查一下,淡季蔬菜的移动价格是多少。
SQL 滚动功能的熊猫等价物
- 的。滚动功能输入 5 表示,当前行+ 4 个先前行。的。mean()函数将取 5 行的平均值,并将结果存储在当前行中。也被称为 5 移动平均线周销售量。
- 若要避免 Weekly_Sales_rolling5 列的起始行为空值,请使用 min_period=1。
- 第 4 行的 Weekly_Sales_rolling5 列值表示第 0、1、2、3、4 行的 Weekly_Sales 值的平均值。
4.行数函数
行号函数为聚合组的每一行分配一个唯一的编号。
行号功能的用例
1.此函数将有助于查找组织中员工的第五大或倒数第二个薪金值。
2.您可以使用此函数计算一个组中数据点的总数。
Pandas 等价于 SQL 行号函数
- 熊猫。cumcount 函数为存储组中的每一行提供一个唯一的编号。由于行的编号从 0 开始,因此,我们使用。累计()+1。
- 此功能将帮助您找出商店 1 中销售额第五高的日期。
结论
SQL 分析函数看起来很难理解和实现。但是,你可以很容易地理解或掌握这些分析功能。还有其他类型的分析函数可用于数据分析。但是大多数情况下,我们在数据分析任务中使用上面的 SQL 函数。
使用这些函数深入研究数据并发现数据中的模式。
加入表格
了解 Python pandas 中的 merge()和 concat()
数据科学项目始于数据。从不同的来源收集所需的数据,对其进行评估、清理和存储,以便进一步分析和建模。
数据是数据科学项目的关键要素
然而,在一个项目中有多个数据集是相当混乱的。在数据清理时,需要对所有数据集应用相同的过程,这是一项繁琐的任务。这也可能会导致一些错误。在这种情况下,将所有数据集组合在一起以获得整个数据的单一视图是一个好主意。当原始数据是从不同的文件、工作表、数据表,甚至是从 web 抓取中收集时,这个过程通常是必要的。
从网页中提取数据并将其存储到 excel 中—只需 4 个简单的步骤
towardsdatascience.com](/web-scraping-make-your-own-dataset-cc973a9f0ee5)
在 Python 中,有两种方法可以组合来自不同数据帧的数据。因此,这就是这两种方法的故事—
熊猫。data frame . merge Vs pandas . concat
DataFrame 是最常用的 pandas 对象,用于以行和列的形式存储不同数据类型的表格数据。
merge()和 Concat()是 pandas 中组合不同数据帧的两个非常有用的方法
让我们创建三个数据帧, df_one,df_two,df_three
countries = {'ID':["EU101","AS101","EU103","EU102","US111"],\
'Country': ["Germany", "India", "Belgium", "Austria", "Mexico"]}states = {'Countryname': ["France", "India", "Belgium", "Japan", "Mexico","Spain"],\
'statecount': [15, 7, 10, 9, 32, 10]}europe ={'ID':["EU101","AS101","EU103","EU102","US112"],\
'EU_member': ["Yes", "No", "No", "No", "No"],\
'Airports': [36,126,5,6,77]}df_one = pd.DataFrame(countries, index = [0,1,2,3,4])
df_two = pd.DataFrame(states, index = [1,2,3,4,5,6])
df_three = pd.DataFrame(europe, index = [0,1,2,3,4])
样本数据帧
1.Concat()
它沿着一个特定的轴耦合熊猫数据帧。它将数据集按行或列连接在一起。
假设,您想要在行方向上组合三个数据帧 df_one、df_two 和 df_three,以便它们将形成单个数据帧。
使用 Concat(),您只需要在一个列表中传递数据帧的名称。
df_four = pd.concat([df_one, df_two])
默认情况下,两个数据帧简单地缝合在一起,一个在另一个下面。两个数据帧中的所有列和行都将保留。
级联数据帧
要并排连接这些表,必须向 concat()添加一个额外的参数axis = 1
。
df_four = pd.concat([df_one, df_two], axis = 1)
简单!!
所有数据帧被连接在一起作为单个数据帧。但是等等,我怎么知道,哪个数据来自哪个数据帧??
熊猫对此有一个答案。Pandas 提供了一个用关键字标记数据帧的选项,这样,在连接之后,您将知道数据帧来自哪里。这种数据标记实际上使得提取对应于特定数据帧的数据变得容易。
df_four = pd.concat([df_one, df_two], keys=[“df_one”,”df_two”])
具有源数据帧名称的串联数据帧
在组合来自多个数据帧的数据时,我们确实可以控制在结果数据帧中得到什么。可以使用 Concat()中的join
参数来实现。在这场争论中,熊猫给了我们两个选择。
outer
:数据帧的联合
df_five = pd.concat([df_one, df_two], axis = 1, join = 'outer',\
keys=['df_one', 'df_two'])
带有外部连接的 pandas.concat()
对应于所有索引的行保留在结果数据帧中。
inner
:数据帧的交集
df_five = pd.concat([df_one, df_two], axis = 1, join = 'inner',\
keys=['df_one', 'df_two'])
带有内部连接的 pandas.concat()
在一个inner
连接中,数据帧df_one
和df_two
共有的所有索引都保留在结果数据帧中。默认情况下,熊猫执行沿行的外部连接。关于它的文档信息可以在这里找到。
2。merge()
它以数据库风格组合数据帧,即数据帧在公共列或索引上连接。通常,我们处理不同的数据集,这些数据集包含关于同一实体的不同类型的数据。这种数据集通常通过一两个公共列相互链接。
merge()根据公共列中的值组合数据帧。
df_four = df_one.merge(df_three)
这就是表格合并的方式
如您所见,df_one
和df_three
这两个表在两个表中都可用的公共列 “ID” 上连接,并且在两个表中对于列 “ID” 具有相同值的行将保留在结果表中。merge()自动识别两个表中的公共列。
由于它的定制选项列表很长,merge()被认为是连接表或数据帧的最灵活的方法。
我最常听到的关于 merge()的说法是,
merge()以 SQL 风格连接表
你不了解 SQL 或者结构化查询语言???
完全没问题。这里我展示了理解 merge()的最简单的方法。每个人都知道集合论中的维恩图和维恩图的基础知识,如集合的并和交。下面四张图会给你最简单最清晰的 merge()视图。光看颜色,这些图片就一目了然了。
merge()提供了 4 个选项来获得对结果数据集的控制,这些选项可以在 merge()内的 “how” 参数中传递,例如,
df_one.merge(df_three, how="inner")
默认情况下,merge()提供内部连接,因此不需要特别提到它。一个 内部 连接类似于集合 的 交集,而 外部 连接类似于集合 的 联合。
所以,这里有 merge()选项,
这就是 merge()的工作方式
在 merge()中,有一个巨大的可选参数列表,可以在这里进行探索。
熊猫。DataFrame.join() 可以认为是 merge()的一种简单形式,可选参数较少。它确实像 merge()-join 操作一样。与 merge()不同,join()在公共索引上耦合两个数据帧。因此,要将两个表或数据帧连接在一起,我们应该在两个数据帧中设置相同的列作为索引。该表格连接选项也可在文档中找到。
感谢您的时间和阅读!!!
我希望你喜欢这个关于熊猫的简单解释,这是加入数据集的两个重要特征。选择 Concat()还是 merge()完全是我们的选择,但我主要使用 merge(),因为它提供了广泛的选项。如果你喜欢这篇文章,请随时添加反馈,并在 LinkedIn 上与我联系。
[## Suraj Gurav -副机械工程师-康耐视公司| LinkedIn
查看 Suraj Gurav 在全球最大的职业社区 LinkedIn 上的个人资料。Suraj 有 8 个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/surajgurav17/)
在 Knowi-Tutorial 中连接来自两个独立 REST APIs 的数据
连接和可视化来自不同 REST APIs 的数据,自动查询,并用英语询问您的数据问题。
亚当·诺瓦克斯基在 Unsplash 上的照片
目录
- 简介
- 设置一个 REST API 作为您的数据源
- 从 REST API 中查询数据
- 将您的 REST API 中的数据与另一个 REST API 中的数据结合起来
- 调度自动 API 调用
- 可视化您的数据
- 使用基于搜索的分析来查询您的数据
- 总结
介绍
从REST API中提取数据在当今的分析世界中是一种非常常见的做法,而且理由充分。API 是强大的工具,允许用户的服务器调用另一个服务器,并直接提取大量数据,而无需离开用户的网站或程序。用户还可以设置自动化 API 调用,这允许他们在指定的时间间隔内从外部服务器获取数据。
虽然来自 REST APIs 的大部分数据都是 JSON 格式的,但也有一些数据是 CSV、SQL 或 NoSQL 格式的。Knowi 不仅与 JSON,还与 CSV、SQL 和 NoSQL 数据进行了广泛的本机集成,这使得 Knowi 能够高效地进行 API 调用,并消除繁琐的 ETL 过程。
将 REST API 设置为数据源
一旦您登录到您的 Knowi 试用帐户,第一步是连接到您的目标 REST API 并确保您已经建立了连接。下面是如何做到这一点:
1.使用屏幕左侧的面板点击“数据源”
2.滚动到底部,在中间的“外部”部分,单击{REST}。
3.确保命名新的数据源。出于本教程的目的,我们称之为“冠状病毒数据源”
4.在右上角输入 API REST 主机的 URL。对于本教程,我们将使用 Github 存储库,其中包含直接来自约翰霍普金斯大学的各种文件。将此链接用于您的 REST 主机:
[https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series](https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series)
5.向下滚动到底部,找到标题为“测试连接”的蓝色按钮点击这个,一旦你这样做了,你应该会收到一个警告,在你的页面顶部说“连接成功。”
6.一旦你确定你有一个连接,移到“测试连接”按钮的右边,点击“保存”
将 REST API 设置为您的数据源(来源—knowi.com)
恭喜你!您已经设置了第一个数据源。
从 REST API 查询数据
现在您已经完成了第一个数据源的设置,是时候开始对数据进行查询了。你可以这样做:
1.当您保存完数据源后,您应该会在页面顶部收到一个警告,提示“Datasource Added”。配置查询。点击单词查询。(或者,您可以返回到屏幕左侧的面板,单击“数据源”正下方的“查询”,然后从右上角选择“新查询+”。)
2.在开始任何其他操作之前,请确保将查询命名为 Report Name*,如果在保存数据源后没有直接进入查询,请选择数据源。让我们称这个报告为“API 调用”
3.向下滚动到设置,并在“端点”下添加 API 调用的端点我们将在此使用的端点返回一个大型 CSV 文件,其中包含来自美国每个县的每日确诊新冠肺炎病例。使用此端点:
/time_series_covid19_confirmed_US.csv
4.找到屏幕左下角的蓝色“预览”按钮,然后点击右边的向上小箭头。向上滚动到 100 并点击它,快速预览 100 行数据。
从 REST API 查询数据(来源——knowi.com)
5.我们的数据集对每个日期都有一个单独的列,这不是我们想要的。这意味着我们应该使用 cloud 9ql——Knowi 的强大内置查询语言——来查询我们的数据,并以我们想要的形式呈现出来。向上滚动到“Cloud9QL Query”开始使用。
6.假设我们的最终目标是一个有两列的表:日期和当天美国新确诊的新冠肺炎病例。Cloud9QL 将允许我们通过四个简单的步骤来实现这一点:
- 反向转置所有列,并添加一个名为“日期”的新列来存储刚刚反向转置的新日期。
- 选择一个使用 Cloud9QL 的 str_to_date 函数将日期从字符串转换为日期的新列,以及一个作为事例总数的新列。
- 按日期将我们的数据分组
- 选择日期和一个新列,该列使用 Knowi 的 delta 函数从当前日期的案例总数中减去前一日期的案例总数。为了执行这些步骤,只需将以下语法复制并粘贴到您的 Cloud9QL 查询中:
select reverse_transpose(UID,iso2,iso3,code3,FIPS,Admin2,Province_State,Country_Region,Lat,Long_,Combined_key,Population,Date,Cases,*);
select str_to_date(date,MM/dd/yy) as Date, sum(Cases) as Cases
group by date;
select Date, delta(Cases) as Cases
7.一旦将该语法粘贴到 Cloud9QL 查询中,返回蓝色的“Preview”按钮,再次预览前 100 行,以确保数据是我们想要的格式。您应该会看到一个包含日期和该日期新新冠肺炎病例数的两列表格。
8.一旦您确认数据是您想要的格式,选择当前预览下方的“数据网格”栏,并将可视化类型更改为“折线图”,以便查看您刚刚预览的 100 行的更引人注目的视图。
9.我们稍后将回到可视化我们的其余数据。现在,单击绿色的“保存并立即运行”按钮保存您的查询。
从 REST API 查询数据(来源——knowi.com)
在保存查询并至少运行一次之后,Knowi 使用查询结果创建了一个虚拟数据集,并将该数据集存储在其弹性数据仓库中。每次你运行这个查询时我都会这样做。
将您的 REST API 中的数据与另一个 REST API 中的数据连接起来
既然您已经将一个 REST API 设置为数据源并查询了它,那么用另一个做同样的事情应该会更容易。首先,我们将重复设置第一个 REST API 的过程:
1.使用屏幕左侧的面板点击“数据源”
2.点击屏幕右上角的橙色按钮“新数据源+”
3.滚动到底部,在中间的“外部”部分,单击{REST}。
4.确保命名新的数据源。我们称之为“股票市场数据源”
5.在右上角输入 API REST 主机的 URL。我们将使用 Alpha Vantage 的 API 为我们提供实时股票市场数据。使用这个网址:
[https://www.alphavantage.co](https://www.alphavantage.co)
6.向下滚动到底部,找到蓝色的“测试连接”按钮。点击这个,一旦你这样做了,你应该会收到一个警告,在你的页面顶部说“连接成功。”
7.一旦你确定你有一个连接,移到“测试连接”按钮的右边,点击“保存”
将您的 REST API 中的数据与另一个 REST API 中的数据连接起来(来源——knowi.com)
现在我们已经建立了两个数据源:冠状病毒数据源和股票市场数据源。是时候把我们的股市数据和我们的冠状病毒数据结合起来了。我们是这样做的:
1.返回屏幕左侧的面板,并返回“查询”
2.我们不是创建新的查询,而是将另一个数据源的查询追加到当前查询中,并将新查询中的数据与我们已经拥有的数据连接起来。通过单击现有查询右侧的铅笔图标开始此过程,以便对其进行编辑。
3.打开查询后,滚动到底部,点击蓝色的“加入”按钮。
4.您会注意到出现了一个新的查询构建器。选择刚刚创建的新股票市场数据源作为这部分查询的数据源。
5.向下滚动到查询构建器中的设置,并设置您的端点。我们将使用/query,它让 API 知道我们将查询它的数据。复制并粘贴,并将其设置为您的终点:
/query
将您的 REST API 中的数据与另一个 REST API 中的数据连接起来(来源——knowi.com)
6.在这种情况下,Alpha Vantage 需要我们希望查询运行的函数、我们希望查询运行的符号、API 键和我们希望查询返回的数据类型。这意味着我们需要在进行 API 调用之前设置我们的 URL 参数。我们希望我们的查询以 CSV 格式从 NASDAQ (NDAQ)返回每日时间序列数据。为了做到这一点,将下面的语法复制并粘贴到你的 URL 参数中:
function=Time_Series_Daily
&symbol=NDAQ
&apikey=YYTO4FCR5F6DCNE1
&datatype=csv
7.单击查询构建器左侧的眼睛图标,仅预览查询的这一部分。如您所见,我们将数据列为“时间戳”,旁边是纳斯达克的开盘价、最高价、最低价和收盘价,以及当天的交易量。
8.向上滚动到您选择第二个数据源的位置,并在您的数据源右侧找到“Join Builder”。单击加入生成器,开始加入过程;Knowi 从每个数据集中检索字段可能需要一些时间。
9.同时,将您的联接类型设置为“内部联接”一旦 Knowi 检索到这些字段,就将“日期”设置为“时间戳”
10.对于本练习,我们只需要三列:日期、当天新冠肺炎案例的数量以及当天纳斯达克的收盘价。为了精简我们的查询,我们将使用 Knowi 的 Cloud9QL Post Query 特性,该特性允许用户在提取和连接所有内容后对他们的数据进行额外的查询。在您的 Cloud9QL Post 查询中输入以下代码:
select Date, Cases, close as Close
11.再次单击“预览”按钮,以确保您获得了所需格式的数据。您应该看到三列:日期、当天的新冠肺炎案例和当天的纳斯达克收盘价。
12.滚动回屏幕右下角,点击“保存并立即运行”
将您的 REST API 中的数据与另一个 REST API 中的数据连接起来(来源——knowi.com)
您刚刚完成了一个查询,该查询调用了两个不同的 API,从每个 API 中提取不同的数据,并将其全部返回到一个表中。干得好!
调度自动 API 调用
在我们开始可视化我们的数据之前,重要的是考虑我们想要可视化什么。我们的最终目标是一个仪表板,使我们能够比较纳斯达克股票交易所和新冠肺炎案例之间的趋势,并监控新趋势的出现。我们可以立即设置一个控制面板,使我们能够直观地看到截至今天已经发生的事情,但是这个控制面板会受到限制,因为最新的数据总是来自我们上次手动进行查询的时间。
因为我们希望实时监控事情,所以我们希望设置我们的查询,以便它自动获取新数据,并允许我们在每次打开仪表板时监控最新数据。Knowi 只需三个步骤就可以轻松实现这一过程的自动化。
1.单击查询右侧的铅笔图标,返回到刚刚创建的查询。向下滚动到底部,找到“日程安排”
2.根据您希望进行此 API 调用的频率来配置调度过程。由于收盘价格每天只更新一次,请将您的查询设置为从明天开始每天更新。
3.不要忘记点击绿色的“保存并立即运行”按钮。
调度自动 API 调用(来源——knowi.com)
您的查询现在设置为每天自动从两个独立的 API 提取数据,并自动连接来自每个 API 的数据。最后一步是为您的数据创建一个可视化,以查看事物如何实时移动。
可视化您的数据
即使你以前不好奇随着新冠肺炎在美国的发展,纳斯达克的股票价格是如何变化的,这篇教程可能已经激起了你的好奇心。Knowi 使从我们的数据集创建可视化变得简单,这样我们就可以快速记录任何关键趋势。我们是这样做的:
1.转到左侧面板的顶部,单击“仪表板”单击橙色的“+”按钮,并命名您的仪表板。我们称之为“联合 API 调用可视化”
2.回到左侧面板,在仪表板下,选择“Widgets”在小部件中,您应该会看到您创建的新小部件。点击它并将其拖到您的仪表板上。
3.点击小工具右上角的 3 个点,然后选择“设置”
4.单击“选项”打开选项菜单,向下滚动到选项菜单左侧的“辅助 Y 轴”,然后选择“关闭”这将为纳斯达克股票价格创建一个第二 Y 轴,让你看到它的趋势。
可视化您的数据(来源——knowi.com)
5.使用 Knowi 的可视化设置使您的图表看起来更专业。使用“修改颜色”将新案例更改为#CE0000 并靠近#CECECE,将图例别名更改为更详细地描述数据的名称,并为主要 X 轴和 Y 轴添加标题。
6.在屏幕的右上角,单击橙色的“保存”按钮。
可视化您的数据(来源——knowi.com)
关闭小部件后,您会看到现在已经设置了一个仪表板,可以直观地监控和比较美国和纳斯达克证券交易所新冠肺炎案例的动向。
可视化您的数据(来源——knowi.com)
因为您已经将查询安排为自动化日常 API 调用,所以您将能够使用仪表板来监控这两个变量久而久之。
使用基于搜索的分析来查询您的数据
现在你已经设置好了你的仪表板,你已经准备好使用 Knowi 的自然语言处理能力,通过基于搜索的分析来查询你的数据。您还可以与他人共享您的仪表板,让他们使用基于搜索的分析来查询您的数据——即使他们不熟悉 Knowi。以下是如何对您的数据运行基于搜索的分析:
1.前往部件的右上角,点击 3 个点,然后向下滚动一点,点击“分析”按钮。这将以表格形式显示您的数据。
2.在这里,使用数据上方的搜索栏来询问您的数据问题,并快速获得答案。假设我们希望看到每个数字的周平均值,以便从每日数字中消除一些干扰。我们需要做的就是在我们的搜索栏中键入“显示平均案例,每周平均成交”来查看每周平均数据,以便快速将我们的数据转换为我们想要的格式。
3.现在是时候用这种新格式来可视化我们的数据了。切换到“可视化”,把你的可视化改成折线图。确保将“平均收盘”设置为辅助 y 轴,这样您也可以清楚地看到该变量的变化。
4.前往右上方,点击“克隆”图标。这将创建一个新的小部件,其中包含我们对原始小部件所做的编辑。
5.完成克隆后,单击橙色的“添加到仪表板”按钮。
使用基于搜索的分析来查询你的数据(来源——knowi.com)
如你所见,这个过程只需要好奇心和英语基础知识。用简单的英语提出数据问题并返回答案的能力有助于弥合数据科学家和管理层之间的差距,并使讲英语并希望了解更多数据的任何人都可以访问 Knowi 的仪表板。
摘要
总的来说,我们只是在 Knowi 中设置了两个独立的 REST API 作为数据源,编写了一个查询来调用每个 REST API 并以可理解的格式返回数据,然后安排该查询每天进行 API 调用并返回新数据。然后,我们从运行查询时创建的数据集创建了一个新的小部件,以及一个新的仪表板,并将新的小部件存储在仪表板中。我们还使用基于搜索的分析来创建一个单独的、更平滑的可视化,向我们显示这两个变量的每周平均值。现在,我们所要做的就是登录我们的 Knowi 帐户,以便监控纳斯达克的股票价格以及美国的新新冠肺炎病例。
用 Python Pandas 连接按子串匹配的数据帧
如何使用笛卡尔积连接两个数据帧,其中一个具有全文值,另一个具有子串。
来源 https://getrefe.tumblr.com/的 REFE
源代码
下一个为 Jupyter 笔记本制作的 Python 熊猫代码在 GitHub 中可用,它回答了这个问题:“哪些任务不匹配?”
数据
代码的第一部分创建两个数据帧: df1 和 df2。
df1 数据帧在 task_name 列中有任务的完整名称。
并且 df2 DataFrame 在 partial_task_name 列中有一个子串。
看, partial_task_name 中的值 BC 是 A BC 和 BC D 的子串,这种情况下预期的结果一定会产生很多行,但是怎么才能得到很多行呢?答案是使用笛卡尔积或交叉连接。
连接
要在 Pandas 中做笛卡尔乘积,请执行以下步骤:
- 在每个数据帧中添加一个具有相同值的虚拟列
- 通过新列进行联接
- 删除每个数据帧中的新列
df1['**join**'] = 1
df2['**join**'] = 1
dfFull = df1.merge(df2, on='**join**').drop('**join**', axis=1)
df2.drop('**join**', axis=1, inplace=True)
这场比赛
如果 partial_task_name 列在 task_name 列中,下一步是在返回的结果数据帧中添加一个新列。我们将使用一个 lambda 和“find”函数,其中结果≥ 0
dfFull['match'] = dfFull.apply(lambda x: x.task_name.find(x.partial_task_name), axis=1).ge(0)
该产品为 dfFull 数据帧
我们按任务名、管道名做一个分组,得到匹配的最大值**、**进行过滤。
好答案
为了知道哪些任务不存在于 df2 数据帧中,我们通过匹配列进行了一个负过滤:
不好的答案
如果我们不使用笛卡尔积,而是尝试在 df2 数据帧中添加第一个匹配,然后用 df1 数据帧进行左连接
我们正在犯一个常见的错误,那就是它给了我们错误的答案。
因为我们在用第一个搭配的时候, ABC 搭配的是 BC 而不是 BCD。
有一种更通用的技术叫做近似字符串匹配或者通俗地说叫做模糊查找,它也试图解决相似或部分不连续的子字符串。如果是你的情况,你可以试试 fuzzywuzzy。
感谢 Charles Romestant 给了我写这篇文章的灵感
使用 Python 的熊猫连接数据集
如何使用 Pandas 连接、追加和合并数据集
图片来自 PixBay — Nick115
在执行分析时,使用多个数据集的情况并不少见。因此,有大量的方法将这些数据整合在一起。
SQL 将这些操作称为“联接”或“联合”;在其他语言和工具中,您可能会找到类似 Merge 或 LookUp 的功能来完成这项工作。
在本文中,我将介绍一些我们可以用来将数据集与熊猫连接起来的函数。
我将在一个 Jupyter 笔记本中运行我的代码,我们在示例中唯一需要的是熊猫。
import pandas as pd
我们将从为示例定义一些虚拟数据开始,为了简化,我将使用列表,但是绝对鼓励您加载数据集。
# create 5 lists with the same size
names = ['bob', 'bella', 'blue', 'suzy', 'gunter', 'joe', 'holly', 'coco', 'elliot']species = ['dog', 'cat', 'velociraptor', 'dog', 'penguin', 'squid', 'cat', 'cat', 'horse']age = [1, 6, 70, 8, 3, 1, 2, 13, 3]
weight = [10, 5, 15, 7, 4, 1, 3, 2, 380]color = ['brown', 'black', 'blue', 'black', 'black', 'gray', 'white', 'orange', 'white']
定义列表后,我们可以创建数据框。
# create 3 data frames with the values from the listsdf1 = pd.DataFrame( {'name': names[:3],
'species': species[:3],
'age': age[:3]})df2 = pd.DataFrame( {'name': names[3:6],
'species': species[3:6],
'age': age[3:6]})df3 = pd.DataFrame( {'name': names[6:],
'species': species[6:],
'age': age[6:]})print(df1, '\n')
print(df2, '\n')
print(df3)
三个数据帧
好,我们有三个列和大小相同的数据集。假设我们希望将这些数据分组到一个数据框中。
。串联
为此,我们可以使用。concat,这是一个接受数据帧列表并将它们连接成一个数据帧的函数。
# .concat to join the dataframes, like a 'union all'
df_list = [df1, df2, df3]
df = pd.concat(df_list)df
级联数据帧
很酷,Pandas 匹配了这些列,并毫不费力地返回了一个几乎完美的数据框。
但是如果列名不匹配呢?或者如果我们遗漏了一列呢?
# test with mismatching and missing columnsdf1 = pd.DataFrame( {'name': names[:3],
'specie': species[:3],
'age': age[:3]})df2 = pd.DataFrame( {'name': names[3:6],
'species': species[3:6],
'age': age[3:6]})df3 = pd.DataFrame( {'name': names[6:],
'age - years': age[6:]})print(df1, '\n')
print(df2, '\n')
print(df3)
数据帧不匹配
对于“物种”一栏,我在第一个 df 中更改了它的名称,并从最后一个中删除了它;我还把“年龄”重新命名为“年龄——年”。
# concat with mismatching and missing columns
df_list = [df1, df2, df3]
df = pd.concat(df_list)df
串联不匹配的数据帧
好吧,熊猫。concat 要求列名完全匹配。如果一个列对于数据集来说是唯一的,就像完全连接一样,它会用空值填充空隙。
我用 Sketch.io 制作——知识共享
还有一件事我们需要注意,索引。
由于我们在创建数据框时没有定义唯一索引,Pandas 为我们设置了一些从零开始的默认值,但当我们使用. concat 时,它不会重置它们。
图片来自 PixBay — Skeeze
唯一的索引总是一个好主意。在这种情况下,我们可以使用。reset_index 创建一个具有适当值的新列,或者使用。set_index 将其中一列定义为索引。
但是让我们尝试一个更简单的适合我们情况的解决方案。
df1 = pd.DataFrame( {'name': names[:3],
'species': species[:3],
'age': age[:3]})df2 = pd.DataFrame( {'name': names[3:6],
'species': species[3:6],
'age': age[3:6]})df3 = pd.DataFrame( {'name': names[6:],
'species': species[6:],
'age': age[6:]})# since we didn't define the indexes when creating the dataframes we can ignore them when concatenatingdf_list = [df1, df2, df3]
df = pd.concat(df_list, ignore_index=True)df
级联数据帧重新索引
对于单个参数,我们忽略了索引,并在连接的结果中获得了新的索引。
另一个方便的参数是“keys ”,它允许我们用一个新的索引级别来标识数据源。
df1 = pd.DataFrame( {'name': names[:3],
'species': species[:3],
'age': age[:3]},
index = [1,2,3])df2 = pd.DataFrame( {'name': names[3:6],
'species': species[3:6],
'age': age[3:6]},
index = [10,11,12])df3 = pd.DataFrame( {'name': names[6:],
'species': species[6:],
'age': age[6:]},
index = [100,200,300])# we can pass 'keys' which creates another index level to identify the concatenated data frames
df_list = [df1, df2, df3, df1]
df = pd.concat(df_list, keys=['df1', 'df2', 'df3', 'df4'])df
添加了索引级别的级联数据帧
默认情况下,。concat 使用列作为键,并将值追加为行。但是如果我们想要将列连接到数据框呢?
图片来自 PixBay — 免费照片
首先,让我们定义一些要连接的新列。
df4 = pd.DataFrame( {'weight': weight,
'color': color
})
df4
带有额外列的数据框
类似地,我们可以将列表直接添加到数据框中,方法是将它们分配给一个列,如下所示:
df['color'] = color
但是一个数据框可能有很多字段,逐个传递它们并不是最好的选择。
concatenate 函数接受“轴”的参数,这允许我们这样做—连接列。
df = pd.concat([df, df4], axis=1)
df
级联数据帧
我们还可以改变连接的行为。
让我们尝试将“name”列作为我们的索引,并使用额外的一列创建另一个数据集进行实验。
df_list = [df1, df2]
df = pd.concat(df_list)
df.set_index('name', inplace=True)df5 = pd.DataFrame( {'species': species,
'age': age,
'score': [9,10,10,8,6,9,3,4,10]},
index = names)print(df, '\n')
print(df5)
更多数据帧
请注意,我们的第一个数据框比第二个数据框的值少。当我们执行内部连接时,它应该只带来索引匹配的行。
# by default concat behaves like an outer join, or a union all
# we can change that with the 'join' parameter
df_list = [df, df5]
df = pd.concat(df_list, axis=1, join='inner')
df
使用内部连接连接的数据帧
我用 Sketch.io 制作——知识共享
。附加
现在让我们看看另一个名为. append 的函数。
此函数的行为与. concat 类似。前面的函数获取多个数据帧,并将它们连接成一个新的数据帧。追加方法将使用现有数据框添加数据。
两者都将返回数据框,但是调用它们的方式不同。您将使用 Pandas.concat()和 DataFrame.append()。
让我们检查一些例子。
df1.append(df2)
附加到数据帧 1 的数据帧 2
df = df1.append(df2)
df = df.append(df3)
print(df, '\n')df = df1.append([df2, df3])
print(df)
一个接一个附加的数据帧和附加有列表的数据帧
# append a row
df.append(pd.Series(['oliver', 'monkey', 13], index=['name', 'species', 'age']), ignore_index=True)
带有附加行的数据框
。合并
太棒了。串联和。追加,我们可以执行我们可能需要的大多数连接。现在让我们检查一个更健壮的名为. merge 的解决方案。
图片来自 Dreamstime
从简单的事情开始,让我们看看如何。merge 执行联接。
我将定义另一个数据框,类似于我们已经在使用的数据框,但是多了一列,少了一条记录。
print(df, '\n')df6 = pd.DataFrame( {'name': names[1:],
'age': age[1:],
'score': [10,10,8,6,9,3,4,10]})
print(df6)
更多用于实验的数据帧
Merge 允许我们选择哪个列将成为键;在这种情况下,让我们使用“名称”。
merged_df = pd.merge(df, df6, on='name')
merged_df
由“名称”列合并的数据框。
与我们之前看到的不同,默认情况下,合并是一个内部连接——这意味着除非另有说明,否则它将只返回两个数据集中匹配的行。
我们还可以注意到,两个数据集中的列是分开的,即使它们包含相同的值。
最后,当我们执行如上所示的内部连接时,两个数据框必须具有相同名称的键列。
图片来自 PixBay — cocoparisienne
可以选择多个列作为键,就像组合键一样,还可以选择使用哪种连接。
merged_df = pd.merge(df, df6, how='left', on=['name', 'age'])
merged_df
姓名和年龄字段左侧的数据框已合并。
我用 Sketch.io 制作——知识共享
merged_df = pd.merge(df6, df, how='right', on=['name', 'age'])
merged_df
姓名和年龄字段右侧的数据框已合并。
我用 Sketch.io 制作——知识共享
太好了!除此之外,合并功能还有助于我们验证和理解正在合并的数据。
# 'one_to_one' or ‘1:1’
merged_df = pd.merge(df6, df.append(df1), how='right', on=['name', 'age'], validate='one_to_one')merged_df
出错信息
例如,如果数据框不符合您选择的标准,验证参数将引发错误。
其他有用的选项有:
‘一对多’或‘1:m’—检查左键是否唯一;
**‘多对一’**或’ m:1’ —检查右键是否唯一;
“指示器”参数向数据框中添加一列,解释键的关系。
merged_df = pd.merge(df6, df.append(df1), how='outer', on=['name', 'age'], indicator=True)merged_df
带有指示器列的合并数据框
*如果您将一个字符串传递给指示器参数,它将被用作创建的列的名称。
我们不需要指定哪一列包含键,因为默认情况下,Pandas 会假设索引是键。
让我们尝试将名称设置为我们的索引,并再次合并这些数据框。
df.set_index('name', inplace=True)
df6.set_index('name', inplace=True)print(df)
print(df6)
按名称索引的数据框
pd.merge(df6, df)
按索引合并的数据框
如果我们不希望熊猫重置索引,我们必须使用 right_index 和 left_index 参数。
pd.merge(df6, df, how='outer', left_index=True, right_index=True)
按索引合并的数据框。
如果我们想一边合并一个索引,另一边合并一个键,我们可以指定 right_on 和 left_on 参数。
它们接受包含键的列名,就像我们之前看到的一样,但是将只应用于特定的一侧,使用另一侧的索引列。
pd.merge(df, df6, how='right', right_on='name', left_index=True)
由索引和键列合并的数据框。
太好了!我们看到了。串联和。append,连接两个数据框的两个方便的函数。然后我们探索了。合并,一个更好的选择,具有很大的灵活性。
图片来自 PixBay — PredragKezic
熊猫有更多的方法来帮助你处理多个数据集;花时间构建解决问题的逻辑,然后在库中找到已经实现的解决方案,这种情况并不少见。
因此,我鼓励大家看看其他一些功能,例如。比较,。combine_first,and。merge_asof。
感谢阅读我的文章。我希望你喜欢它!
参考文献: 用于数据分析的 Python 韦斯·麦金尼;
熊猫—Concat;
熊猫——合并;
熊猫—追加;
熊猫——合并、联结、连接、比较;
连接、视图和 cte:MySQL 工作台
通过 MySQL Workbench 连接多个表并创建视图和 cte 来分析数据
MySQL 有七个查询命令( SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY 和 LIMIT ),通过这些命令在数据库中进行数据分析。但是所有这些查询都有助于分析整个数据库中单个表中的数据。在现实世界中,一个数据库包含不止一个表,并且所有这些表都是相互关联的。
为了一次分析多个表上的数据,我们将使用连接、视图和 cte。
我们可以在这里下载文章中使用的数据库。
主键和外键
为了理解连接是如何工作的,我们需要熟悉主键和外键的概念。
主键是唯一定义表的单个字段/列名。该列不应包含任何空值,不应有重复值,并且一个表只能有一个主键。
一个表中的外键引用了另一个表中的列。
让我们看一个简单的例子来更好地理解数据库中的主键和外键。
我们将从数据库中取出两个表。
market_fact_full
市场 _ 事实 _ 完整表格
prod_dimen
产品维度表
现在,在market_fact_full
表中,主键是Market_fact_id
,外键是Prod_id
,因为Prod_id
列用于引用prod_dimen
表,而Prod_id
列在产品维度表中充当主键。
连接
使用连接从数据库的不同表中检索数据。这些表必须通过使用主键和外键相互关联。
有两种类型的连接:
- 内部连接
- 外部连接
内部连接
内部联接选择两个表中的公共列。
如果我们考虑上面的两个表,market_fact_full
表包含产品的利润和相关信息,而prod_dimen
表包含产品的类别。
如果我们想找出利润最大的产品类别,我们将使用 Inner Join。
让我们分析一下代码,
- 在选择,我们试图打印
Product_Category
&Product_Sub_category
列,它们属于prod_dimen
表,利润列来自market_fact_full
表。 - 现在使用 from,首先,我们选择
prod_dimen
表,我们使用inner join关键字连接market_fact_full
表。我们还将把这些表分别称为 p & m 。 - 现在,我们必须指定表必须连接哪一列。我们将通过在关键字上使用并提到列名来实现。
- 最后,我们将根据我们的需求为代码提供必要的命令。
现在,对于上面的代码,输出将如下所示。
利润最高的产品类别
使用内部连接,我们可以连接两个以上的表。让我们看看下面的代码,它将三个表连接在一起以获得所需的输出。
我们想了解每种产品的产品类别及其运输方式。为此,我们必须使用三个表market_fact_full
、prod_dimen
和shipping_dimen
。
现在,输出看起来像这样。
内部连接—三个表
外部连接
有两种类型的外部联接。
- 左(外)连接
- 右(外)连接
左连接 使用左连接,返回左表中的所有值和右表中的匹配值,如果右表中有任何缺失值,则返回 null。
让我们看一个例子,我们需要打印manu
和prod_dimen
表中的manu_name
和prod_id
列,以查看产品的制造名称。
首先,让我们看看表格是什么样子的,
manu
表
制造表
prod_dimen
表
产品维度表
上面的问题我们用左连接。
输出将是,
制造商名称
通过以上输出,我们可以得出结论,只有 Wipro manufacture 生产产品,其余两家制造商没有生产任何产品。
右连接 与左连接类似,右连接返回右表中的所有值和左表中的匹配值。
让我们用左连接的例子。
上面代码的输出是,
产品 id w . r . t .制造商名称
如果我们敏锐地观察上面两个程序,就能发现左连接和右连接的区别。左连接给出所有的制造商名称,而右连接给出所有的产品 id。
类似地,我们可以使用 inner join 和 outer join 关键字连接两个以上的表。
视图
视图是不包含任何真实值的虚拟表。假设有一个复杂的查询,我们需要在数据分析中重复使用。我们将创建一个视图,并在需要时随时随地引用该表,而不是频繁地键入该查询。
让我们举个例子,
现在,我们要打印利润超过 1000 英镑的所有订单。为了获得输出,我们将参考上面创建的视图表。
输出是,
这就是我们如何创建视图表并根据我们的需求使用该表。
CTE
公共表表达式(cte)的功能与视图类似,只有一点不同。可以在数据库中访问视图,因为 cte 只在特定查询中出现。一旦查询被执行,我们就不能再使用 CTE 了。
我们来找出前五名,在那五个产品中,亏损最少,产品基础利润率最高的。
首先,我们将找到排名前 5 的产品
排名前五的产品是,
现在,我们必须从上面的输出中找到最高的产品基本利润。为了获得期望的结果,我们将创建 CTE 并确定最高的产品基本利润。
我们通过使用带有关键字的创建了最小损失 CTE,它创建了一个包含前 5 个最小损失产品的表,并使用该最小损失表,我们获得了产品基数的最高利润。输出将如下所示,
一旦我们执行了查询,我们就不能在其他地方使用最小损失 CTE。
结论
这就是如何使用联接、cte 和视图来分析数据库中的数据。在现实世界中,大多数时候,我们会更多地使用内连接而不是外连接,更多地使用视图而不是 cte。
一旦我们知道如何使用 SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY 和 LIMIT 命令,我们必须掌握 Joins、CTEs 和 Views 命令。因为我们经常需要同时分析一个数据库中两个以上表上的数据。
感谢您阅读和快乐编码!!!
在这里查看我以前关于 Python 的文章
- 数据分析使用基本命令:MySQL Workbench
- 探索性数据分析(EDA): Python
- 假设检验:数据科学
- 中心极限定理(CLT):数据科学
- 推断统计:数据分析
- Seaborn:Python
- 熊猫:蟒蛇
- Matplotlib:Python
- NumPy: Python
参考
- MySQL 中的 JOIN 语句:https://www . educative . io/edpresso/how-to-use-a-JOIN-statement-in-MySQL
- MySQL 中的视图:https://www.guru99.com/views.html
- MySQL:https://www.tutorialspoint.com/mysql/index.htm
- **https://www.educba.com/mysql-cte/的 MySQL CTE:**T42
用幂 BI 和 R 连接
连接将一直存在…让我们使它们变得简单
梅尔·普尔在 Unsplash 上的照片
我已经在我的第一篇文章中描述了连接的基础。希望对您有所帮助。在本文中,我将向您展示如何使用 Power BI 的 Power Query 以及在 R 中使用 dplyr 来完成这些连接。
Power BI 有一个“点击”类型的 UI(大量使用鼠标),而 R 有一个“输入”界面(大量使用键盘)。
我两样都喜欢,希望你也喜欢。
让我们回到我们的小简笔画——有用吗?
作者图片
让我们开始吧!
让我们加载我们的数据:)两个很小的数据集,但对我们的例子来说很棒。
作者图片
现在它们已经加载,让我们进入电源查询
作者图片
一旦我进入超级查询端,我就会看到我的两个数据集。
作者图片
让我们开始合并查询吧!
作者图片
对于连接的放置要非常小心,顶部数据集位于连接的左侧,底部数据集位于连接的右侧。如果它们排列不当,你会得到相反的结果。
如果你感到困惑——看看我的第一篇关于左右的文章。
作者图片
一件重要的事情——让我们选择想要加入的列或“连接”。
作者图片
我选择了左外部连接,但它与左连接相同。有许多术语——左手边、第一数据集、数据集 A 等。在一天结束时,我们希望看到共同的行,以及在比较时没有发现的行。此外,在这个图像中,只有一个“连接”列。你不仅限于使用它。您也可以选择一个额外的列来支持连接。
在我做出这个选择后,我将得到扩展的选项。
让我们点击扩展按钮。
作者图片
哒哒!
作者图片
这里你可以看到内部连接和左反结果。
让我们简单谈谈 Power Query 上的查询设置窗格。这对我们的例子非常有用。为什么?因为只需一次单击,您就可以返回到合并步骤,并更改您的任何连接选择,如前所述。
作者图片
带您回到这里进行其他连接选择。
作者图片
我明白,这可能看起来过于简单,这里的数据集只有 5 行,没有任何重复,数据类型错误,连接上的打字错误,缺少数据,缺少列…等等,我将在另一篇文章中写更多关于这方面的内容。
请这样想,如果您理解这些基础知识,并且能够在小型数据集上构建查询,Power BI 将会完成繁重的工作。稍作调整后,同样的查询可以从 5 行数据集应用到 50K 行数据集。
嗯……让我们回到简笔画上。
现在让我们看看 r,另一个伟大的工具。
让我们使用“Import data”加载我们的数据和包,并加载 Tidyverse。Tidyverse 是一个 R 包的集合,它使数据争论变得有趣和容易(有时)。
我将使用下面的代码回答我在第一篇文章中提出的同样的问题。只有两条主线,但稍加调整就足够了。
library(tidyverse) # loading Tidyverse package -- for dplyr#who is still with the company?Dataset_2007 %>%
inner_join(Dataset_2020, c("Name"))#who is no longer working for the company in 2020?Dataset_2007 %>%
anti_join(Dataset_2020, c("Name")) #who is new to the company in 2020?Dataset_2020 %>% anti_join(Dataset_2019,c("Name"))
我们来分析一下。
你有它!
有些人使用 Power BI 和 r 来加入基础知识。用 Power BI 点击几下,用 r 编写几行代码。这两者都是数据争论的乐趣。
下一篇文章是关于使用 Power BI 中的函数,看看吧!
注意安全,希望你喜欢这篇文章。
使用评论进行推荐的用户和项目的联合深度建模
如今,推荐系统经常出现在我们的日常生活中,比如网上购物、阅读文章和看电影。人们可以根据自己的兴趣从推荐系统中看到推荐的商品。许多推荐系统使用协同过滤方法,该方法的技术表明,过去有相似偏好的人将来倾向于有相似的选择。挑战在于很少有用户对物品发表评论。该文章关注深度合作神经网络(DeepCoNN),针对评分预测问题从用户和项目获取评论。
在本文中,你将学习推荐系统的奇异值分解和截断奇异值分解:
(1)模型架构
(2)单词表征
(3) CNN 层
(4)共享层
(5)网络培训
(6)对 DeepCoNN 的分析
(7)基线模型
模型概述
在深度合作神经网络(DeepCoNN)中,有一个用于学习项目属性和用户行为的评论数据集,以及在最后几层组合的两个并行神经网络。一个网络关注用户的评论以从用户的行为中提取特征,另一个网络主要利用物品的评论以突出物品的属性。
模型架构
有两个并行的神经网络,一个用于用户的网络(Netu)和一个用于项目的网络(Neti),这两个网络合并在最后一层。对于两个网络,输入数据是 Netu 中的用户评论,Neti 中的商品评论,然后是作为输出的评级。
对于也称为查找层的第一层,从用户评论中生成单词嵌入,用于语义提取。接下来,使用卷积层、最大池层和全连接层构建模型,以生成用户和项目的要素。最后,最终的顶层实现了用户和物品之间隐藏的潜在因素的交互。
DeepCoNN 计算 426 目标函数以缩小来自 Netu 和 Neti 输出的潜在因子的评级预测误差。我们将详细介绍 Netu 的过程,同样的过程也适用于 Neti,因为 Netu 和 Neti 具有相同的输入。
情节:模型架构
单词表示法
一个单词嵌入 f: M→ N_n .一个把单词字典变换成 N 维分布向量的映射函数。男:单词字典。N_n: n 维分布向量。
利用词的表示来提取评论的语义。评论被转换成单词嵌入矩阵,用于查找层的语义提取。所有用户的书面评论 u 合并成一个文档 du_(1-n)共 n 个单词。下面内置一个字向量矩阵 Vu_(1:n):
等式:单词向量
du_k:文档 d 的第 k 个单词
du_(1:n):查找函数
φ(d*u_k):返回单词
⊕:连接运算符对应的 c 维单词向量
与词袋技术相比,在矩阵 V * u(1:n)中保持了词的顺序
CNN 图层
CNN 模型包括卷积层、最大池和全连接层。卷积层中有 m 个神经元,通过对用户 u 的单词向量 Vu_(1:n)应用卷积算子来产生新的特征。在卷积层中,每个神经元 j 在大小为 t 的单词窗口上应用滤波器 Kj ∈ n(ct)。
等式:带内核的卷积层
*:卷积算子
b_j:偏置项
f: relu 激活函数
下面指定了 Relu 激活。具有 ReLU 的深度卷积神经网络的训练周期比 tanh 激活函数快得多。
f(x) = max{0,x}
下面的等式是特征图上的最大池,并从特定内核中提取最大值作为特征。特征图中的最高值是最重要的特征。汇集层可以应用于不同的文本长度。在最大汇集操作之后,卷积结果被转换成固定大小的向量。
o_j = max{z_1,z_2,…,z _(n t+1)}
模型中的多个过滤器生成了各种特征。下面的等式是卷积层的输出向量
O = {o_1,o_2,o_3,…,o_n1 },
o_n1:卷积层中内核的数量
X_u = f(W × O + g)
max-pooling 层输出到下一个具有权重矩阵 w 的全连接层上式是全连接层的输出 xu ∈ n*(n_2*1)。最后,我们可以从用户和项目 x_u 和 y_i 的 CNN 层获得输出。
共享层
作为特征的项目和用户的输出在不同的特征空间中,并且不可比较。共享层被引入到 Netu 和 Neti 之上,以在特征空间中映射它们。单个向量ˇz =(xu,yi)由 Xu 和 yi 连接而成。为了模拟 z 中所有嵌套变量的相互作用,因子分解机(FM)被引入作为相应等级的估计器。下面的等式是给定一批 N 个训练示例 t 的成本。
等式:批量的成本函数
ˇw0:全局偏差
ˇwi:模拟 z 中第 I 个变量的强度
模拟二阶相互作用
网络培训
目标是最小化上面指定的成本函数,并且相对于 z 检索导数 J。
等式:成本函数的导数
通过应用链式法则,可以计算不同层中其他参数的导数。利用 N 元组的训练集 T,通过 RMSprop 对混洗小批量进行优化。RMSprop 是为梯度更新方法引入的,它根据梯度的绝对值自适应地管理步长。当 RMSprop 计算梯度范数的平均值时,权重将被更新。下图显示了网络参数集θ的更新规则。
等式:RMSprop 优化函数
λ:学习率
ε:数值稳定性的小附加值
此外,在两个网络的完全连接层之上应用了脱落层,以防止过度拟合。
DeepCoNN 分析
词序保持
常见的是,推荐系统在用户评论上应用主题建模来建模用户或项目。潜在的主题变量使用单词袋技术,忽略了单词的顺序。然而,对于文本建模应用程序来说,考虑单词的顺序是至关重要的。DeepCoNN 与单词嵌入一起应用,以创建单词嵌入,同时保持单词的顺序,但不使用主题建模方法。因此,卷积层提供了一种在文本建模中表征单词顺序的技术。
在线学习
许多推荐系统注意到可伸缩性和处理项目的动态池。对于推荐系统来说,时间敏感性是在线学习潜在因素的一个具有挑战性的任务。DeepCoNN 可根据训练数据的数据可伸缩性进行调整,并且该模型可以灵活地用神经网络中的新数据进行训练和更新。从历史数据中更新项目或用户的潜在因素是独立的。主题建模不包括考虑时间因素和数据更新。
基线模型
矩阵分解(MF)和概率矩阵分解(PMF)被应用于推荐系统中的评论数据集。此外,大多数推荐系统使用主题建模来支持用户评论。为了比较推荐系统和主题建模,选择了 4 种深度学习模型:潜在狄利克雷分配模型(LDA)、协同主题回归模型(CTR)、主题隐藏因子模型(HFT)和深度推荐系统。推荐系统将引入最新的深度推荐系统——协同深度学习(CDL)。为了改进模型预测,除了 MF 和 PMF 以外,所有基线都在模型中加入了审查信息。在所有的协同过滤方法中,MF 是最流行的一种。输入数据集是评级矩阵,MF 将估计两个低秩矩阵来预测评级。交替最小二乘(ALS)技术用于最小化目标函数。
PMF:该模型应用了用户和项目潜在因素的高斯分布。
LDA:潜在狄利克雷分配是一种流行的主题建模算法。它用于从每个项目的一组评论中学习主题分布。为每个项目的潜在特征提取学习的主题分布。为了优化评分预测精度,通过梯度下降更新每个用户的潜在特征。
CTR:协作主题回归也被应用,并在用户感兴趣或不感兴趣的单类协作过滤问题上表现良好。
HFT:隐藏因素作为主题被应用于主题分布,以从用户或项目评论中提取潜在因素。在实验中,基于项目的主题分发比用户主题分发具有更好的性能。
CDL:协作深度学习的特点是堆叠去噪自动编码器和 PMF 的贝叶斯公式。自动编码器和 PMF 与自动编码器的中间层相连。
python 代码的实践经验
数据描述:
数据是从 Amazon review 数据集中提取的,带有杂志订阅的子类别。将链接到数据源。数据集中有各种列,如评论(评级、文本、有用性投票)、产品元数据(描述、类别信息、价格、品牌和图像特征)和链接(也查看过/也购买过的图表)。
DeepCoNN 建模
对于建模方法,DeepConn 模型是卷积神经网络模型,它在 Pytorch 模型中实现。此外,模型的优化是 adam 优化器,损失度量是通过 MSE 评估的。
数据预处理
从 Magazine_Subscriptions.json,我们在评论数据集上实现了一些预处理步骤,如过滤标点符号,保留单词和字符,排除 nan 和 null 值,以及过滤长度大于 1 的单词。在数据集中,有用户多次对相同的产品留下评论。输入数据集也被从相同的 userid 和 itemid 的重复行中排除,因此模型将具有相同的所有条目和用户的评论数据的输入长度。
添加用户和项目功能
在 user_reviews 表中,索引被设置为 userID 和 productID 以及用户评论的列。另一个表是 movie_reviews 表,索引设置为 userID 和 productID 以及电影评论列。数据集还添加了两个附加功能,一个是用户评论列,另一个是电影评论列。
单词嵌入
单词嵌入是手套嵌入的输入,每个单词的向量大小为 200。手套嵌入是一种无监督的学习方法,通过单词的共现来分组单词,以生成单词向量。相似性度量是通过两个单词向量之间的欧几里德距离(或余弦相似性)来计算的。相似的单词放在附近,而没有相似语义的单词放在更远的地方。对于用户和项目的评论数据集,用手套嵌入和 pad 值向量输入单词。用户和项目的评论用相同大小的向量填充。
DeepConn 型号:
对于模型输入,输入的数据结构的嵌入大小为 200,用户序列长度为 61,项目序列长度为 45。有两个独立的数据输入,一个是具有(1910,6,200)的 3d 形状的项目评论输入矩阵,另一个是具有(1910,20,200)的 3d 形状的用户评论输入矩阵。标签是评级栏。该模型根据 80%的输入数据进行训练,并根据 20%的验证数据进行测试。
DeepConn 模型有 1 个卷积层,内核大小为 3,滤波器大小为 2。下一层是 max-pooling 层的输入,以从每个内核中提取最大值作为特征。然后,将特征展平并转发到密集层进行模型预测。最后一层结合了来自项目评审和用户评审矩阵的输入。将组合的特征带入模型,模型将特征和输入连接到最后的密集层。优化函数是 Adam,损失函数是模型评估指标的均方误差。
评估图:
该模型在 100 个时期上用 80%的训练数据分割进行训练,并在 20%的测试数据集上进行测试。训练损失在 0.1514 左右持续下降,测试损失达到 2.6 左右。测试损耗在 60 个周期后变得稳定。
图:训练和测试数据集的损失性能
最后
- 评论数据集的特点是通过一个映射函数将单词字典转换成 n 维分布向量,从而实现单词的嵌入。单词嵌入是手套嵌入的输入,手套嵌入是一种无监督的学习方法,通过单词的共现来分组单词以生成单词向量。
- CNN 模型包括卷积层、最大池和全连接层。卷积层中有 m 个神经元,它们通过对单词向量应用卷积算子来产生新的特征。max-pooling 图层从要素地图中提取最高值作为最重要的要素。汇集层可以应用于不同的文本长度。在最大汇集操作之后,卷积结果被转换成固定大小的向量。
- 作为特征的项目和用户的输出在不同的特征空间中,并且不可比较。共享层被引入到 Netu 和 Neti 之上,以在特征空间中映射它们。单个向量ˇz =(xu,yi)由 Xu 和 yi 连接而成。为了对 z 中的所有嵌套变量交互进行建模,因子分解机(FM)被引入作为相应评级的估计器,它将两个评论的特征连接起来,并在其上对下一个密集层应用点函数。
模型优势
- 深度合作神经网络(DeepCoNN)是一种使用文本评论对用户行为和项目属性进行建模的方法。存在从共享层连接的两个并行网络,使得用户和项目表示的交互可以预测评级。
- 评论由 Glove 转化为词嵌入,以语义和评论情感为特征。DeepCoNN 可以通过利用评论来缓解稀疏性问题。
这是推荐系统主题的结尾
参考
- 使用评论对用户和项目进行联合深度建模
https://dl.acm.org/doi/pdf/10.1145/3018661.3018665 - 使用用于推荐的评论对用户和项目进行联合深度建模 Github 知识库
【https://github.com/richdewey/DeepCoNN - 手套嵌入
https://nlp.stanford.edu/projects/glove/