資料科學家筆記:資料查詢語言的個人化回顧

資料科學家筆記:資料查詢語言的個人化回顧
我根據個人經驗告訴你什麼在何時何地有用。這是概述和論文,因此很清楚您可以進一步挖掘什麼和在哪裡 - 但在這裡我有完全主觀的個人經驗,也許一切對您來說都完全不同。

為什麼了解並能夠使用查詢語言很重要?從本質上講,資料科學有幾個重要的工作階段,第一個也是最重要的(沒有它,當然什麼都行不通!)是獲取或提取資料。大多數情況下,資料以某種形式位於某處,需要從那裡「檢索」。 

查詢語言允許您提取這些資料!今天我將告訴你那些對我有用的查詢語言,我將告訴你並向你展示在哪裡以及如何確切地-為什麼需要學習它。

資料查詢類型將分為三個主要區塊,我們將在本文中討論:

  • 「標準」查詢語言是在談論查詢語言時通常理解的語言,例如關係代數或 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.5.​​XNUMXTB) 的複雜管道,無需大量資源,由簡單管道和幾個工具組成。

另一個重要提示:能夠在終端機中良好有效地工作並編寫 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 ")。

也就是說,在這種情況下,資料和規則都以相同的方式呈現,這使我們能夠非常輕鬆且很好地對問題進行建模。

你們在這個行業哪裡認識的?:一個用這種語言編寫查詢的公司的整個大型項目,以及系統核心的當前項目 - 這似乎是一個相當奇特的事情,但有時會發生。

邏輯語言處理維基資料的程式碼片段範例:

資料科學家筆記:資料查詢語言的個人化回顧

材料:我將在這裡提供一些現代邏輯程式語言答案集程式設計的連結 - 我建議學習它:

資料科學家筆記:資料查詢語言的個人化回顧

來源: www.habr.com

添加評論