数据科学家笔记:数据查询语言的个性化回顾

数据科学家笔记:数据查询语言的个性化回顾
我根据个人经验告诉你什么在何时何地有用。 这是概述和论文,因此很清楚您可以进一步挖掘什么和在哪里 - 但在这里我有完全主观的个人经验,也许一切对您来说都完全不同。

为什么了解并能够使用查询语言很重要? 从本质上讲,数据科学有几个重要的工作阶段,第一个也是最重要的(没有它,当然什么都行不通!)是获取或提取数据。 大多数情况下,数据以某种形式位于某处,需要从那里“检索”。 

查询语言允许您提取这些数据! 今天我将告诉你那些对我有用的查询语言,我将告诉你并向你展示在哪里以及如何确切地-为什么需要学习它。

数据查询类型将分为三个主要块,我们将在本文中讨论:

  • “标准”查询语言是在谈论查询语言时通常理解的语言,例如关系代数或 SQL。
  • 编写查询语言脚本:例如,Python、pandas、numpy 或 shell 脚本。
  • 知识图和图数据库的查询语言。

这里写的所有内容都只是个人经历,什么是有用的,并描述了情况和“为什么需要它”——每个人都可以尝试类似的情况会如何发生,并尝试通过理解这些语言来提前做好准备​​在您必须(紧急)申请某个项目甚至到达需要它们的项目之前。

“标准”查询语言

标准查询语言正是我们在谈论查询时通常想到的意义上的语言。

关系代数

为什么今天需要关系代数? 为了很好地理解为什么查询语言以某种方式构建并有意识地使用它们,您需要了解它们背​​后的核心。

什么是关系代数?

正式定义如下:关系代数是关系数据模型中关系的封闭运算系统。 更通俗地说,这是一个对表进行操作的系统,其结果始终是一个表。

查看所有关系运算 Habr 的文章 - 在这里我们描述了为什么您需要知道以及它在哪里派上用场。

Зачем?

开始了解查询语言的全部内容以及特定查询语言中表达式背后的操作通常可以更深入地了解查询语言中的内容和方式。

数据科学家笔记:数据查询语言的个性化回顾
摘自 文章。 操作示例:join,连接表。

学习材料:

斯坦福大学的很好的入门课程。 一般来说,关于关系代数和理论的资料有很多——Coursera、Udacity。 网上也有大量材料,其中包括好的 学术课程。 我个人的建议:你需要很好地理解关系代数——这是基础知识的基础。

SQL

数据科学家笔记:数据查询语言的个性化回顾
摘自 文章。

SQL 本质上是关系代数的实现 - 有一个重要的警告,SQL 是声明性的! 也就是说,当用关系代数语言编写查询时,您实际上是在说如何计算 - 但使用 SQL,您指定要提取的内容,然后 DBMS 已经用关系代数语言生成(有效)表达式(它们的我们知道等价性是 科德定理).

数据科学家笔记:数据查询语言的个性化回顾
摘自 文章。

Зачем?

关系型 DBMS:Oracle、Postgres、SQL Server 等几乎仍然无处不在,您很有可能必须与它们进行交互,这意味着您要么必须读取 SQL(这很可能),要么编写 SQL(也不是不可能)。

阅读和学习什么

根据上面的相同链接(关于关系代数),有大量的材料,例如, .

顺便问一下,NoSQL 是什么?

“值得再次强调的是,‘NoSQL’这个术语绝对是自发产生的,并且没有普遍接受的定义或背后的科学机构。” 相应的 文章 在哈布尔。

事实上,人们意识到解决许多问题并不需要完整的关系模型,特别是对于那些性能至关重要且某些具有聚合的简单查询占主导地位的问题 - 快速计算指标并将其写入到数据库中至关重要数据库,并且大多数功能都是关系型的,结果不仅是不必要的,而且是有害的 - 如果某些东西会破坏对我们来说最重要的事情(对于某些特定任务) - 生产力,为什么要标准化某些东西?

此外,通常需要灵活的模式,而不是经典关系模型的固定数学模式 - 当部署系统并快速开始工作、处理结果或存储数据的模式和类型至关重要时,这极大地简化了应用程序开发并不那么重要。

例如,我们正在创建一个专家系统,想要存储特定域的信息以及一些元信息 - 我们可能不知道所有字段,而只是为每条记录存储 JSON - 这为我们提供了一个非常灵活的环境来扩展数据模型并快速迭代 - 所以在这种情况下,NoSQL 将更可取且更具可读性。 示例条目(来自我的一个项目,NoSQL 正是需要它的地方)。

{"en_wikipedia_url":"https://en.wikipedia.org/wiki/Johnny_Cash",
"ru_wikipedia_url":"https://ru.wikipedia.org/wiki/?curid=301643",
"ru_wiki_pagecount":149616,
"entity":[42775,"Джонни Кэш","ru"],
"en_wiki_pagecount":2338861}

您可以阅读更多内容 这里 关于NoSQL。

学习什么?

相反,在这里,您只需要彻底分析您的任务、它具有哪些属性以及哪些 NoSQL 系统适合此描述 - 然后开始研究该系统。

编写查询语言脚本

乍一看,Python 与它有什么关系——它是一种编程语言,根本与查询无关。

数据科学家笔记:数据查询语言的个性化回顾

  • Pandas 简直就是数据科学的一把瑞士军刀;大量的数据转换、聚合等都在其中发生。
  • Numpy - 向量计算、矩阵和线性代数。
  • Scipy - 这个包中有很多数学知识,尤其是统计数据。
  • Jupyter 实验室 - 很多探索性数据分析非常适合笔记本电脑 - 很有用。
  • 请求 - 使用网络。
  • Pyspark 在数据工程师中非常受欢迎,很可能您将不得不与此或 Spark 进行交互,仅仅是因为它们的受欢迎程度。
  • *Selenium - 对于从站点和资源收集数据非常有用,有时根本没有其他方法来获取数据。

我的主要建议:学习Python!

熊猫

我们以下面的代码为例:

import pandas as pd
df = pd.read_csv(“data/dataset.csv”)
# Calculate and rename aggregations
all_together = (df[df[‘trip_type’] == “return”]
    .groupby(['start_station_name','end_station_name'])
                  	    .agg({'trip_duration_seconds': [np.size, np.mean, np.min, np.max]})
                           .rename(columns={'size': 'num_trips', 
           'mean': 'avg_duration_seconds',    
           'amin': min_duration_seconds', 
           ‘amax': 'max_duration_seconds'}))

本质上,我们看到代码符合经典的 SQL 模式。

SELECT start_station_name, end_station_name, count(trip_duration_seconds) as size, …..
FROM dataset
WHERE trip_type = ‘return’
GROUPBY start_station_name, end_station_name

但重要的是,这段代码是脚本和管道的一部分;事实上,我们正在将查询嵌入到 Python 管道中。 在这种情况下,查询语言来自 Pandas 或 pySpark 等库。

一般来说,在 pySpark 中,我们通过查询语言看到类似类型的数据转换,其精神如下:

df.filter(df.trip_type = “return”)
  .groupby(“day”)
  .agg({duration: 'mean'})
  .sort()

在哪里阅读以及阅读什么内容

关于 Python 本身 没问题 寻找材料进行研究。 网上有海量的教程 大熊猫, 火花 和课程 火花 (以及它本身 DS)。 总的来说,这里的内容非常适合谷歌搜索,如果我必须选择一个包来关注,那当然是 pandas。 关于DS+Python资料的结合也是如此 非常.

Shell 作为查询语言

事实上,我参与过的相当多的数据处理和分析项目都是调用 Python、Java 代码以及 shell 命令本身的 shell 脚本。 因此,一般来说,您可以将 bash/zsh/etc 中的管道视为某种高级查询(当然,您可以在其中填充循环,但这对于 shell 语言中的 DS 代码来说并不典型),让我们给出一个简单的例子 - 我需要对 wiki 数据进行 QID 映射以及到俄语和英语 wiki 的完整链接,为此我从 bash 中的命令编写了一个简单的请求,对于输出我用 Python 编写了一个简单的脚本,我像这样放在一起:

pv “data/latest-all.json.gz” | 
unpigz -c  | 
jq --stream $JQ_QUERY | 
python3 scripts/post_process.py "output.csv"

哪里

JQ_QUERY = 'select((.[0][1] == "sitelinks" and (.[0][2]=="enwiki" or .[0][2] =="ruwiki") and .[0][3] =="title") or .[0][1] == "id")' 

事实上,这是创建所需映射的整个管道;正如我们所见,一切都在流模式下运行:

  • pv filepath - 根据文件大小给出进度条并向前传递其内容
  • unpigz -c 读取部分存档并将其交给 jq
  • jq 和 key - 流立即生成结果并将其传递给 Python 中的后处理器(与第一个示例相同)
  • 在内部,后处理器是一个简单的状态机,用于格式化输出 

总的来说,这是一个以流模式处理大数据 (0.5TB) 的复杂管道,无需大量资源,由简单管道和几个工具组成。

另一个重要提示:能够在终端中良好有效地工作并编写 bash/zsh/etc。

哪里会有用呢? 是的,几乎无处不在——同样,互联网上有很多可供学习的材料。 特别是,这里 我的上一篇文章。

R 脚本

读者可能会再次感叹——好吧,这是一门完整的编程语言! 当然,他是对的。 然而,我通常在这样的环境中遇到 R,事实上,它与查询语言非常相似。

R是一种用于静态计算和可视化的统计计算环境和语言(根据 ).

数据科学家笔记:数据查询语言的个性化回顾
回收 。 顺便推荐一下,很好的材料。

为什么数据科学家需要了解 R? 至少,因为有大量非 IT 人员在 R 中分析数据。我在以下地方遇到过它:

  • 医药行业。
  • 生物学家。
  • 金融领域。
  • 受过纯数学教育、处理统计数据的人。
  • 专门的统计模型和机器学习模型(通常只能在作者的 R 包版本中找到)。

为什么它实际上是一种查询语言? 从常见的形式来看,它实际上是创建模型的请求,包括读取数据和修复查询(模型)参数,以及可视化 ggplot2 等包中的数据 - 这也是编写查询的一种形式。

可视化查询示例

ggplot(data = beav, 
       aes(x = id, y = temp, 
           group = activ, color = activ)) +
  geom_line() + 
  geom_point() +
  scale_color_manual(values = c("red", "blue"))

一般来说,R 中的许多想法已经迁移到 python 包中,例如 pandas、numpy 或 scipy,例如数据帧和数据矢量化 - 所以一般来说,R 中的很多东西对你来说看起来很熟悉和方便。

有很多来源可供研究,例如, .

知识图谱

在这里我有一个稍微不寻常的经历,因为我经常需要使用知识图和图的查询语言。 因此,让我们简单回顾一下基础知识,因为这部分比较奇特。

在经典关系数据库中,我们有一个固定的模式,但这里的模式是灵活的,每个谓词实际上是一个“列”,甚至更多。

想象一下,您正在为一个人建模并想要描述关键事物,例如,让我们以一个特定的人 Douglas Adams 为例,并使用此描述作为基础。

数据科学家笔记:数据查询语言的个性化回顾
www.wikidata.org/wiki/Q42

如果我们使用关系数据库,我们将不得不创建一个巨大的表或具有大量列的表,其中大多数为 NULL 或填充一些默认的 False 值,例如,我们中的许多人不太可能有一个韩国国家图书馆的条目 - 当然,我们可以将它们放在单独的表中,但这最终将是一种尝试,使用固定的关系电路来对具有谓词的灵活逻辑电路进行建模。

数据科学家笔记:数据查询语言的个性化回顾
因此,想象一下所有数据都存储为图表或二进制和一元布尔表达式。

你在哪里能遇到这种事? 首先,与 数据维基,以及任何图形数据库或连接的数据。

以下是我使用过和使用过的主要查询语言。

SPARQL

维基:
SPARQL(递归缩写工程。 SPARQL 协议和 RDF 查询语言) - 数据查询语言,由模型表示 RDF协议 传输这些请求并对其做出响应。 SPARQL 是一个推荐 W3C联盟 以及其中一项技术 语义网.

但实际上它是逻辑一元和二元谓词的查询语言。 您只需有条件地指定布尔表达式中固定的内容和未固定的内容(非常简单)。

执行 SPARQL 查询的 RDF(资源描述框架)基础本身是一个三元组 object, predicate, subject - 查询根据精神中指定的限制选择所需的三元组:找到一个 X,使得 p_55(X, q_33) 为 true - 其中,当然,p_55 是与 ID 55 的某种关系,q_33 是一个ID 为 33 的对象(这里和整个故事,再次省略各种细节)。

数据呈现示例:

数据科学家笔记:数据查询语言的个性化回顾
此处包含国家/地区的图片和示例 .

基本查询示例

数据科学家笔记:数据查询语言的个性化回顾

事实上,我们想要找到 ?country 变量的值,使得对于谓词
member_of,确实member_of(?country,q458) 并且q458 是欧盟的ID。

Python 引擎内的真实 SPARQL 查询示例:

数据科学家笔记:数据查询语言的个性化回顾

通常,我必须阅读 SPARQL 而不是编写它 - 在这种情况下,至少在基本层面上理解该语言以准确理解数据的检索方式可能是一项有用的技能。 

网上有很多资料可以学习:例如这里 и 。 我通常会在谷歌上搜索具体的设计和示例,现在就足够了。

逻辑查询语言

您可以在我的文章中阅读有关该主题的更多信息 这里。 而在这里,我们只会简单地研究一下为什么逻辑语言非常适合编写查询。 本质上,RDF 只是一组 p(X) 和 h(X,Y) 形式的逻辑语句,逻辑查询具有以下形式:

output(X) :- country(X), member_of(X,“EU”).

这里我们讨论的是创建一个新的谓词output/1(/1表示一元),前提是对于X来说,country(X)是真的——即,X是一个国家,也是member_of(X,"EU ")。

也就是说,在这种情况下,数据和规则都以相同的方式呈现,这使我们能够非常轻松且良好地对问题进行建模。

你们在这个行业哪里认识的?:一个用这种语言编写查询的公司的整个大型项目,以及系统核心的当前项目 - 这似乎是一个相当奇特的事情,但有时会发生。

逻辑语言处理维基数据的代码片段示例:

数据科学家笔记:数据查询语言的个性化回顾

材料:我将在这里提供一些现代逻辑编程语言答案集编程的链接 - 我建议学习它:

数据科学家笔记:数据查询语言的个性化回顾

来源: habr.com

添加评论