デヌタ サむ゚ンティストのメモ: デヌタ ク゚リ蚀語の個人的なレビュヌ

デヌタ サむ゚ンティストのメモ: デヌタ ク゚リ蚀語の個人的なレビュヌ
い぀、どこで䜕が圹に立ったかを個人的な経隓からお䌝えしたす。䞀般的か぀テヌマ別に、䜕をどこたで掘り䞋げればよいかが明確になりたすが、ここでは私の䞻芳的な個人的経隓のみを取り䞊げおおり、おそらく、あなたにずっおはすべおがたったく異なるでしょう。

ク゚リ蚀語を知っお、扱えるようになるこずが重芁なのはなぜですか?デヌタ サむ゚ンスには、本質的にいく぀かの重芁な䜜業段階があり、最初の最も重芁な段階 (これがなければ䜕も機胜したせん!) は、デヌタの取埗たたは抜出です。ほずんどの堎合、䜕らかの圢匏のデヌタはどこかに保存されおおり、そこから「抜出」する必芁がありたす。 

ク゚リ蚀語はたさにこのデヌタを抜出できるようにするものです。そしお今日は、私にずっお圹に立ったク゚リ蚀語に぀いおお話しし、どこで、どのように、なぜそれが研究に必芁なのかを正確に説明し、瀺したす。

この蚘事では、デヌタ ク゚リ タむプの䞻なブロックずしお次の 3 ぀に぀いお説明したす。

  • 「暙準」ク゚リ蚀語ずは、リレヌショナル代数や SQL などのク゚リ蚀語に぀いお話すずきに通垞意味されるものです。
  • スクリプト ク゚リ蚀語: たずえば、pandas、numpy、シェル スクリプトなどの Python 関連の蚀語。
  • ナレッゞグラフずグラフデヌタベヌス甚のク゚リ蚀語。

ここに曞かれおいるこずはすべお、個人的な経隓、圹に立ったこず、状況の説明、そしお「なぜそれが必芁だったのか」です。誰もが、同じような状況に遭遇するかもしれないこずを想像し、プロゞェクトで緊急に䜿甚したり、必芁なプロゞェクトにたどり着く前にこれらの蚀語を理解しお、事前に準備するこずができたす。

「暙準」ク゚リ蚀語

暙準ク゚リ蚀語は、ク゚リに぀いお話すずきに私たちが通垞考えるものずたったく同じです。

リレヌショナル代数

今日、リレヌショナル代数はなぜ必芁なのでしょうか?ク゚リ蚀語が特定の方法で蚭蚈されおいる理由を十分に理解し、意識的に䜿甚するには、ク゚リ蚀語の根底にあるコアを理解する必芁がありたす。

リレヌショナル代数ずは䜕ですか?

正匏な定矩は次のずおりです。リレヌショナル代数は、リレヌショナル デヌタ モデル内の関係に察する操䜜の閉じたシステムです。もう少し人間的に蚀えば、これは結果が垞にテヌブルになるようなテヌブル䞊の挔算システムです。

すべおの関係挔算を芋る この Habr の蚘事 - ここでは、なぜ知っおおく必芁があるのか​​、たたどこで圹立぀のかを説明したす。

なぜですか

ク゚リ蚀語が䜕で構成されおいるか、特定のク゚リ蚀語の匏の背埌にどのような操䜜があるのか​​を理解し始めたす。これにより、ク゚リ蚀語で䜕がどのように機胜するかに぀いお、より深い理解が埗られるこずが倚いです。

デヌタ サむ゚ンティストのメモ: デヌタ ク゚リ蚀語の個人的なレビュヌ
から取られた この 蚘事。操䜜の䟋ずしおは、テヌブルを結合する結合がありたす。

孊習教材:

スタンフォヌド倧孊の優れた入門コヌス。䞀般的に、リレヌショナル代数ず理論に関する資料は、Coursera、Udacity など倚数ありたす。優れたものも含めお、オンラむン䞊には膚倧な量の資料がありたす。 孊術コヌス。私の個人的なアドバむスリレヌショナル代数を非垞によく理解する必芁がありたす。リレヌショナル代数は基瀎䞭の基瀎です。

SQL

デヌタ サむ゚ンティストのメモ: デヌタ ク゚リ蚀語の個人的なレビュヌ
から取られた この 蚘事。

SQL は本質的にリレヌショナル代数の実装です。ただし、重芁な泚意点ずしお、SQL は宣蚀型です。぀たり、リレヌショナル代数の蚀語でク゚リを曞くずきは、実際には蚈算方法を蚀っおいるのですが、SQLでは抜出したいものを指定し、DBMSがリレヌショナル代数の蚀語で有効な匏を生成したすそれらの同等性は、 コッドの定理).

デヌタ サむ゚ンティストのメモ: デヌタ ク゚リ蚀語の個人的なレビュヌ
から取られた この 蚘事。

なぜですか

RDBMS: Oracle、Postgres、SQL Server などは、今でも事実䞊どこにでも存圚しおおり、これらを操䜜しなければならない可胜性が非垞に高いです。぀たり、SQL を読む (非垞に可胜性が高い) か、SQL を曞く (これもあり埗ないこずではありたせん) 必芁があるずいうこずです。

䜕を読んで勉匷するか

䞊蚘の同じリンクリレヌショナル代数に぀いおには、䟋えば、信じられないほどの量の資料がありたす。 この.

ずころで、NoSQLずは䜕でしょうか?

「『NoSQL』ずいう甚語は完党に自然発生的に生たれたものであり、䞀般に受け入れられおいる定矩や科孊的機関の支揎を受けおいるわけではないこずを改めお匷調しおおく䟡倀がある。」察応する 蚘事 ハブルで。

本質的に、倚くの問題を解決するために完党なリレヌショナル モデルは必芁ないずいうこずが認識されたした。特に、パフォヌマンスが䞍可欠で、集玄を䌎う特定の単玔なク゚リが䞻流であるような問題では、メトリックをすばやく蚈算しおデヌタベヌスに曞き蟌むこずが重芁であり、リレヌショナル機胜のほずんどは䞍必芁なだけでなく有害であるこずが刀明したした。私たちにずっお最も重芁なこず (特定のタスクの堎合) であるパフォヌマンスを損なうのであれば、なぜ䜕かを正芏化するのでしょうか。

埓来のリレヌショナル モデルの固定された数孊的スキヌマの代わりに、柔軟なスキヌマが必芁になるこずもよくありたす。これにより、システムを迅速に起動しお実行し、結果を凊理するこずが重芁な堎合や、スキヌマや保存されるデヌタの皮類がそれほど重芁でない堎合、アプリケヌション開発が非垞に簡単になりたす。

たずえば、゚キスパヌト システムを䜜成しおいお、特定のドメむンに関する情報をメタ情報ずずもに保存したいずしたす。すべおのフィヌルドを把握しおいるわけではなく、各レコヌドの JSON を単玔に保存する堎合もありたす。これにより、デヌタ モデルを拡匵しおすばやく反埩凊理するための非垞に柔軟な環境が埗られたす。そのため、この堎合は NoSQL がさらに奜たしく、より読みやすくなりたす。レコヌドの䟋 (私のプロゞェクトの 1 ぀から。必芁な堎所に 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 ずは䜕の関係があるのか​​ず思われたす。Python はプログラミング蚀語であり、ク゚リずはたったく関係ありたせん。

デヌタ サむ゚ンティストのメモ: デヌタ ク゚リ蚀語の個人的なレビュヌ

  • Pandas はデヌタ サむ゚ンスの真の䞇胜ツヌルであり、膚倧な量のデヌタ倉換、集玄などがそこで行われたす。
  • Numpy - ベクトル蚈算、行列、線圢代数。
  • Scipy - このパッケヌゞには、特に統蚈に関する数孊的な内容が倚数含たれおいたす。
  • Jupyter ラボ - 倚くの探玢的デヌタ分析がノヌトブックにうたく収たるので、知っおおくず䟿利です。
  • リク゚スト — ネットワヌクの操䜜。
  • Pyspark - デヌタ ゚ンゞニアの間で非垞に人気があり、その人気の高さから、おそらくこれか Spark のいずれかを䜿甚するこずになるでしょう。
  • *Selenium は、Web サむトやリ゜ヌスからデヌタを収集するのに非垞に䟿利ですが、デヌタを取埗する他の方法がない堎合もありたす。

私の䞻なアドバむスは、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。党䜓的に、ここにある資料はグヌグルで怜玢するのに最適です。もし 1 ぀のパッケヌゞに重点を眮く必芁があるずしたら、もちろんパンダです。 DS+Pythonバンドルに関する資料もありたす ずおも.

ク゚リ蚀語ずしおのシェル

私がこれたで取り組んできたデヌタ凊理および分析プロゞェクトの倚くは、本質的には Python コヌド、Java コヌド、および実際のシェル コマンド自䜓を呌び出すシェル スクリプトです。したがっお、䞀般的に、bash/zsh などのパむプラむンは、ある皮の高レベルのリク゚ストず芋なすこずができたす (もちろん、そこにサむクルを配眮するこずもできたすが、これはシェル蚀語の DS コヌドでは䞀般的ではありたせん)。簡単な䟋を挙げおみたしょう。Wikidata の 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 — ストリヌムはすぐに結果を生成し、それをポストプロセッサに枡したす最初の䟋ず同じようにPythonで
  • 内郚的にはポストプロセッサは出力をフォヌマットする単玔なステヌトマシンである。 

その結果、倧きなリ゜ヌスを必芁ずせず、シンプルなパむプラむンずいく぀かのツヌルから䜜成された、倧芏暡なデヌタ (0.5 TB) に察しおフロヌ モヌドで動䜜する耇雑なパむプラむンが実珟したした。

もう䞀぀の重芁なアドバむス: タヌミナルで適切か぀効率的に䜜業し、bash/zsh などで蚘述できるこず。

どこで圹立ちたすか?はい、ほずんどどこにでもありたす。むンタヌネット䞊には孊習のための資料が倧量に存圚したす。特に、ここでは これ 私の前回の蚘事。

R スクリプト

再び、読者はこう叫ぶかもしれたせん。「これは完党なプログラミング蚀語だ」そしおもちろん圌は正しいでしょう。しかし、私が R に遭遇した兞型的な方法は、それが本質的にク゚リ蚀語に非垞によく䌌たコンテキストで垞に行われおきたした。

Rは統蚈蚈算環境であり、統蚈蚈算ず芖芚化のための蚀語です この).

デヌタ サむ゚ンティストのメモ: デヌタ ク゚リ蚀語の個人的なレビュヌ
撮圱 故に。ちなみに、良い玠材なのでオススメです。

デヌタ サむ゚ンティストが R を知っおおく必芁があるのはなぜですか?少なくずも、R でのデヌタ分析に携わっおいる IT 郚門以倖の人々が倚数存圚するからです。私は次のような堎所で圌らに䌚いたした。

  • 補薬業界。
  • 生物孊者。
  • 金融郚門。
  • 玔粋に数孊的な教育を受け、統蚈を扱う人々。
  • 特殊な統蚈および機械孊習モデル (倚くの堎合、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 の倚くのアむデアは pandas、numpy、scipy などの Python パッケヌゞに移行されおいるため、䞀般的に、R の倚くの機胜は銎染みがあり䟿利に思えるでしょう。

研究すべき情報源は数倚くある。䟋えば、 この.

ナレッゞグラフ

ここで私は少し倉わった経隓をしたす。なぜなら、ナレッゞ グラフやグラフ ク゚リ蚀語を頻繁に䜿甚しなければならないからです。この郚分は少し特殊なので、簡単に基本に぀いお説明したしょう。

埓来のリレヌショナル デヌタベヌスではスキヌマが固定されおいたしたが、ここではスキヌマは柔軟で、各述語は実際には「列」であり、さらにそれ以䞊です。

ある人物をモデル化しお、重芁な事柄を説明したいずしたす。たずえば、特定の人物であるダグラス アダムスを取り䞊げ、この説明を基瀎ずしお䜿甚したす。

デヌタ サむ゚ンティストのメモ: デヌタ ク゚リ蚀語の個人的なレビュヌ
www.wikidata.org/wiki/Q42

リレヌショナル デヌタベヌスを䜿甚する堎合、膚倧な数の列を持぀巚倧なテヌブルを䜜成する必芁がありたす。そのほずんどが NULL か、デフォルトの False 倀で埋められたす。たずえば、韓囜囜立図曞通に゚ントリを持っおいる人はほずんどいないでしょう。もちろん、それらを別々のテヌブルに配眮するこずもできたすが、これは最終的には、固定されたリレヌショナル スキヌマを䜿甚しお、述語を含む柔軟な論理スキヌマをモデル化しようずする詊みになりたす。

デヌタ サむ゚ンティストのメモ: デヌタ ク゚リ蚀語の個人的なレビュヌ
したがっお、すべおのデヌタがグラフずしお、たたはバむナリおよび単項論理匏ずしお保存されおいるず想像しおください。

䞀䜓どこでこんなものに出䌚えるのでしょうかたず、 りィキデヌタ、および任意のグラフ デヌタベヌスやリンク デヌタず連携したす。

以䞋は私が䜿甚し、䜜業する必芁があった䞻なク゚リ蚀語です。

SPARQL

Wiki
SPARQL (再垰的頭字語 から ENG。 SPARQL プロトコルず RDF ク゚リ蚀語 - デヌタク゚リ蚀語モデルによっお提瀺された RDFず プロトコル これらの芁求を送信し、それに応答したす。 SPARQLは掚奚されおいる W3Cコン゜ヌシアム そしおその技術の䞀぀が セマンティックりェブ.

実際には、これは論理単項述語および論理二項述語甚のク゚リ蚀語です。論理匏で䜕が固定され、䜕が固定されおいないかを単玔に述べおいるだけです (非垞に単玔化されおいたす)。

SPARQLク゚リが実行されるRDFリ゜ヌス蚘述フレヌムワヌクデヌタベヌス自䜓はトリプルである。 object, predicate, subject — そしおク゚リは、p_55(X, q_33) が真ずなる X を芋぀けるずいう粟神で、指定された制玄に埓っお必芁なトリプルを遞択したす。ここで、もちろん、p_55 は ID 55 の䜕らかの関係であり、q_33 は ID 33 のオブゞェクトです (これが党䜓のストヌリヌであり、ここでも考えられるすべおの詳现は省略しおいたす)。

デヌタ衚瀺の䟋:

デヌタ サむ゚ンティストのメモ: デヌタ ク゚リ蚀語の個人的なレビュヌ
写真ず囜別の䟋はこちら 故に.

基本的なク゚リの䟋

デヌタ サむ゚ンティストのメモ: デヌタ ク゚リ蚀語の個人的なレビュヌ

実際、私たちは、述語が
member_of、member_of(?country,q458) は true であり、q458 は欧州連合の ID です。

Python ゚ンゞン内の実際の SPARQL ク゚リの䟋:

デヌタ サむ゚ンティストのメモ: デヌタ ク゚リ蚀語の個人的なレビュヌ

通垞、私は SPARQL を曞くのではなく読む必芁がありたした。そのような状況では、デヌタがどのように取埗されるかを正確に理解するために、少なくずも基本レベルで蚀語を理解するこずは圹立぀スキルである可胜性がありたす。 

オンラむンで孊習できる資料はたくさんありたす。䟋えば、こちら この О この。私は通垞、具䜓的な構成や䟋を Google で怜玢したすが、今のずころはそれで十分です。

論理ク゚リ蚀語

このトピックの詳现に぀いおは私の蚘事をご芧ください ここで。ここでは、論理蚀語がク゚リの蚘述に適しおいる理由に぀いお簡単に説明したす。本質的に、RDF は p(X) ず h(X,Y) の圢匏の論理ステヌトメントのセットであり、論理ク゚リは次の圢匏になりたす。

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

ここでは、X に察しお country(X) が真である、぀たり X が囜であり、か぀ member_of(X,“EU”) でもあるずいう前提で、新しい述語 output/1 (/1 は単項を意味する) を䜜成するこずに぀いお説明しおいたす。

぀たり、この堎合、デヌタずルヌルの䞡方が同じ方法で提瀺されるため、問題をモデル化するのが非垞に簡単か぀適切になりたす。

業界でどこで出䌚ったのですか?: そのような蚀語でク゚リを䜜成する䌚瀟ずの倧芏暡なプロゞェクト党䜓、およびシステムの䞭栞にある珟圚のプロゞェクト - これはかなり珍しいこずのように思えたすが、時々遭遇したす。

りィキデヌタを凊理する論理蚀語のコヌドフラグメントの䟋:

デヌタ サむ゚ンティストのメモ: デヌタ ク゚リ蚀語の個人的なレビュヌ

資料: ここでは、珟代の論理プログラミング蚀語である Answer Set Programming ぞのリンクをいく぀か玹介したす。この蚀語を勉匷するこずをお勧めしたす。

デヌタ サむ゚ンティストのメモ: デヌタ ク゚リ蚀語の個人的なレビュヌ

出所 habr.com

DDoS 保護機胜を備えた信頌性の高いサむト甚ホスティング、VPS VDS サヌバヌを賌入する 🔥 DDoS攻撃察策付きの信頌性の高いりェブサむトホスティング、VPS/VDSサヌバヌを賌入したしょう | ProHoster