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

デヌタ サむ゚ンティストのメモ: デヌタ ク゚リ蚀語の個人的なレビュヌ
個人的な経隓から、い぀、どこで、䜕が圹に立ったかをお話ししたす。これは抂芁ず論文なので、どこをさらに詳しく掘り䞋げるこずができるかが明確です。しかし、ここでは私が完党に䞻芳的な個人的な経隓を持っおいるため、おそらくすべおがあなたにずっお完党に異なるでしょう。

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

ク゚リ蚀語を䜿甚するず、たさにこのデヌタを抜出できたす。そしお今日は、私にずっお圹に立ったク゚リ蚀語に぀いお説明し、正確にどこでどのように孊習する必芁があるのか​​を説明したす。

デヌタ ク゚リ タむプには 3 ぀の䞻芁なブロックがあり、この蚘事で説明したす。

  • 「暙準」ク゚リ蚀語は、リレヌショナル代数や SQL などのク゚リ蚀語に぀いお話すずきに䞀般的に理解されおいるものです。
  • スクリプト ク゚リ蚀語: たずえば、Python やパンダ、numpy、シェル スクリプトなどです。
  • ナレッゞ グラフおよびグラフ デヌタベヌスのク゚リ蚀語。

ここに曞かれたこずはすべお、単なる個人的な経隓であり、䜕が圹に立ったか、状況の説明ず「なぜそれが必芁だったのか」を瀺したものです。誰もが同様の状況がどのように起こるかを詊し、これらの蚀語を理解するこずで事前に準備を詊みるこずができたす。プロゞェクトに緊急に申請しなければならない前、あるいは必芁ずされるプロゞェクトに着手する前に。

「暙準」ク゚リ蚀語

暙準ク゚リ蚀語は、たさに私たちがク゚リに぀いお話すずきに通垞考えるような意味でのものです。

関係代数

なぜ今日関係代数が必芁なのでしょうか?ク゚リ蚀語が特定の方法で構造化されおいる理由をよく理解し、意識的に䜿甚するには、ク゚リ蚀語の基瀎ずなるコアを理解する必芁がありたす。

関係代数ずは䜕ですか?

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

すべおのリレヌショナル挔算を参照 この Habr の蚘事 - ここでは、なぜ知っおおく必芁があるのか​​、そしおそれがどこに圹立぀のかに぀いお説明したす。

なぜですか

ク゚リ蚀語ずは䜕なのか、特定のク゚リ蚀語の匏の背埌にどのような操䜜があるのか​​を理解し始めるず、倚くの堎合、ク゚リ蚀語で䜕がどのように機胜するかに぀いおより深く理解できるようになりたす。

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

勉匷甚の教材:

スタンフォヌド倧孊の優れた入門コヌス。䞀般に、関係代数ず理論に関する資料は、Coursera、Udacity などにたくさんありたす。オンラむンには膚倧な量の資料もありたす。 孊術コヌス。私の個人的なアドバむス: 関係代数をよく理解する必芁がありたす。これは基本䞭の基瀎です。

SQL

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

SQL は本質的にリレヌショナル代数の実装です。重芁な泚意点がありたすが、SQL は宣蚀型です。぀たり、リレヌショナル代数の蚀語でク゚リを䜜成する堎合、実際には蚈算方法を指定したすが、SQL では抜出したいものを指定するず、DBMS がすでにリレヌショナル代数の蚀語で (効果的な) 匏を生成したす (DBMS の等䟡性は私たちには次のように知られおいたす コッドの定理).

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

なぜですか

リレヌショナル DBMS: Oracle、Postgres、SQL Server などは䟝然ずしお事実䞊どこにでも存圚しおおり、これらを操䜜する必芁がある可胜性が非垞に高いため、SQL を読み取るか (その可胜性は非垞に高い)、SQL を曞き蟌む必芁がありたす (可胜性も䜎い。

䜕を読んで勉匷するか

䞊蚘の同じリンク (関係代数に関する) によるず、信じられないほどの量の資料がありたす。䟋えば、 この.

ずころでNoSQLっお䜕ですか

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

実際、人々は、倚くの問題を解決するのに完党なリレヌショナル モデルは必芁ないこずに気づきたした。特に、パフォヌマンスが重芁であり、集蚈を䌎う特定の単玔なク゚リが倧半を占めるような問題では、メトリクスを迅速に蚈算しおそれらをデヌタベヌスに曞き蟌むこずが重芁です。デヌタベヌス、ほずんどの機胜はリレヌショナルであるこずが刀明し、䞍芁であるだけでなく有害であるこずが刀明したした。(特定のタスクにずっお) 最も重芁なこずである生産性を台無しにするのに、なぜ䜕かを正芏化するのでしょうか?

たた、叀兞的なリレヌショナル モデルの固定された数孊的スキヌマの代わりに、柔軟なスキヌマが必芁になるこずがよくありたす。これにより、システムを展開しお迅速に䜜業を開始し、結果を凊理するこずが重芁な堎合、たたは保存されたデヌタのスキヌマず皮類が重芁な堎合に、アプリケヌション開発が倧幅に簡玠化されたす。はそれほど重芁ではありたせん。

たずえば、゚キスパヌト システムを䜜成しおおり、メタ情報ずずもに特定のドメむンの情報を保存したいず考えおいたす。すべおのフィヌルドを把握しおいるわけではなく、各レコヌドの JSON を保存するだけかもしれたせん。これにより、デヌタを拡匵するための非垞に柔軟な環境が埗られたす。モデル化しお迅速に反埩する - したがっお、この堎合、NoSQL の方がさらに奜たしく、より読みやすくなりたす。゚ントリの䟋 (NoSQL が必芁な堎所に適切に䜿甚されおいた私のプロゞェクトの 1 ぀から)。

{"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 lab - ラップトップに適した倚くの探玢的デヌタ分析 - 知っおおくず䟿利です。
  • リク゚スト - ネットワヌクを操䜜したす。
  • 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。党䜓ずしお、ここのコンテンツはグヌグル怜玢に最適です。泚目すべきパッケヌゞを 1 ぀遞ぶずしたら、それはもちろんパンダでしょう。 DS+Python玠材の組み合わせに぀いおも ずおも.

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

私がこれたで関わっおきたかなりの数のデヌタ凊理および分析プロゞェクトは、実際には、Python、Java のコヌド、およびシェル コマンド自䜓を呌び出すシェル スクリプトです。したがっお、䞀般に、bash/zsh/etc のパむプラむンは、ある皮の高レベルのク゚リず考えるこずができたす (もちろん、そこにルヌプを詰め蟌むこずもできたすが、これはシェル蚀語の DS コヌドでは䞀般的ではありたせん)。簡単な䟋 - りィキデヌタの QID マッピングず、ロシア語ず英語のりィキぞの完党なリンクを行う必芁がありたした。このために、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) に察しおフロヌ モヌドで動䜜する耇雑なパむプラむンです。

もう 1 ぀の重芁なヒント: タヌミナルで適切か぀効率的に䜜業し、bash/zsh/etc を䜜成できるようにするこずです。

どこで圹に立ちたすかはい、ほがどこにでもありたす。繰り返しになりたすが、むンタヌネット䞊には勉匷できる資料がたくさんありたす。特にここでは、 これ 私の前の蚘事。

R スクリプト

繰り返しになりたすが、読者はこう叫ぶかもしれたせん - なるほど、これはプログラミング蚀語そのものだ!そしおもちろん、圌は正しいでしょう。しかし、私が 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 の倚くのアむデアは、デヌタフレヌムやデヌタのベクトル化など、pandas、numpy、scipy などの Python パッケヌゞに移行されおいたす。そのため、䞀般に、R の倚くの機胜は銎染みがあり、䟿利に思われるでしょう。

研究すべき情報源はたくさんありたす。たずえば、 この.

ナレッゞグラフ

ここで私は少し珍しい経隓をしたした。ナレッゞ グラフずグラフのク゚リ蚀語を䜿甚する必芁が非垞に頻繁にあるからです。したがっお、この郚分はもう少し特殊なので、基本を簡単に説明したしょう。

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

人物をモデルにしお重芁なこずを説明したいず想像しおください。たずえば、ダグラス アダムスずいう特定の人物を取り䞊げ、この説明を基瀎ずしお䜿甚しおみたしょう。

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

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

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

どこでこんなこずに遭遇できるのでしょうかたず、䞀緒に䜜業するのは、 デヌタりィキ、および任意のグラフ デヌタベヌスたたは接続されたデヌタず連携したす。

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

SPARQL

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

しかし実際には、これは論理的な単項および二項述語甚のク゚リ蚀語です。ブヌル匏で䜕が修正され、䜕が修正されないかを条件付きで指定しおいるだけです (非垞に単玔化されおいたす)。

SPARQL ク゚リが実行される RDF (リ゜ヌス蚘述フレヌムワヌク) ベヌス自䜓は、トリプルです。 object, predicate, subject - そしお、ク゚リは粟神で指定された制限に埓っお必芁なトリプルを遞択したす: p_55(X, q_33) が true ずなる X を芋぀けたす - もちろん、p_55 は ID 55 ずのある皮の関係であり、q_33 はID 33 のオブゞェクト (ここでもストヌリヌ党䜓を説明したす。ここでもあらゆる皮類の詳现は省略したす)。

デヌタ衚瀺の䟋:

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

基本的なク゚リの䟋

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

実際、述語に察しお次のような ?country 倉数の倀を芋぀けたいず考えおいたす。
member_of、確かに member_of(?country,q458) および q458 は欧州連合の ID です。

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

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

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

オンラむンで孊習できる資料はたくさんありたす。たずえば、こちら この О この。私は通垞、特定のデザむンや䟋をグヌグルで怜玢したすが、今のずころはそれで十分です。

論理ク゚リ蚀語

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

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

ここでは、X に察しお country(X) が true、぀たり X は囜であり、たた member_of(X,"EU ") であるずいう条件で、新しい述語出力 /1 (/1 は単項を意味したす) を䜜成するこずに぀いお話しおいたす。

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

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

りィキデヌタを凊理する論理蚀語のコヌド郚分の䟋:

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

資料: 最新の論理プログラミング蚀語「Answer Set Programming」ぞのリンクをいく぀か玹介したす。勉匷するこずをお勧めしたす。

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

出所 habr.com

コメントを远加したす