Data Scientist's Notes: Data Sorğu Dillərinin Fərdi İcmalı

Data Scientist's Notes: Data Sorğu Dillərinin Fərdi İcmalı
Mən sizə şəxsi təcrübəmdən nəyin harada və nə vaxt faydalı olduğunu deyirəm. Bu icmal və tezisdir ki, daha nəyi və harada qaza biləcəyiniz aydın olsun - amma burada mənim yalnız subyektiv şəxsi təcrübəm var, bəlkə də hər şey sizin üçün tamamilə fərqlidir.

Sorğu dillərini bilmək və istifadə edə bilmək nə üçün vacibdir? Özündə Data Science işin bir neçə mühüm mərhələsinə malikdir və ən birinci və ən vacibi (onsuz, əlbəttə ki, heç nə işləməyəcək!) məlumatların əldə edilməsi və ya çıxarılmasıdır. Çox vaxt məlumatlar hansısa formada bir yerdə oturur və oradan “alınmalıdır”. 

Sorğu dilləri bu məlumatları çıxarmağa imkan verir! Və bu gün sizə mənim üçün faydalı olan sorğu dilləri haqqında danışacağam və sizə harada və necə dəqiq öyrənmək lazım olduğunu söyləyəcəyəm və göstərəcəyəm.

Bu məqalədə müzakirə edəcəyimiz məlumat sorğusu növlərinin üç əsas bloku olacaq:

  • "Standart" sorğu dilləri əlaqə cəbri və ya SQL kimi sorğu dili haqqında danışarkən ümumi başa düşülən dillərdir.
  • Skript sorğu dilləri: məsələn, Python şeyləri pandalar, numpy və ya qabıq skripti.
  • Bilik qrafikləri və qrafik verilənlər bazası üçün sorğu dilləri.

Burada yazılan hər şey sadəcə şəxsi təcrübədir, faydalı olan, vəziyyətlərin təsviri və "nə üçün lazım idi" - hər kəs oxşar vəziyyətlərin necə qarşınıza çıxa biləcəyini sınaya bilər və bu dilləri başa düşərək onlara əvvəlcədən hazırlaşmağa çalışa bilər. bir layihəyə (təcili) müraciət etməzdən və ya hətta ehtiyac duyulan bir layihəyə getmədən əvvəl.

"Standart" sorğu dilləri

Standart sorğu dilləri o mənadadır ki, biz sorğular haqqında danışarkən adətən onlar haqqında düşünürük.

Əlaqəli cəbr

Niyə bu gün əlaqə cəbri lazımdır? Sorğu dillərinin niyə müəyyən bir şəkildə qurulduğunu və onlardan şüurlu şəkildə istifadə edildiyini yaxşı başa düşmək üçün onların altında yatan əsası başa düşməlisiniz.

Əlaqəli cəbr nədir?

Formal tərif aşağıdakı kimidir: relyasiya cəbri, əlaqə məlumat modelində əlaqələr üzərində qapalı əməliyyatlar sistemidir. Bir az daha insani desək, bu, cədvəllər üzərində elə bir əməliyyat sistemidir ki, nəticə həmişə cədvəl olsun.

Bütün əlaqəli əməliyyatlara baxın bu Habr-dan məqalə - burada niyə bilməli olduğunuzu və bunun harada lazım olduğunu təsvir edirik.

Niyə?

Sorğu dillərinin nə olduğunu və xüsusi sorğu dillərində ifadələrin arxasında hansı əməliyyatların olduğunu başa düşməyə başlamaq çox vaxt sorğu dillərində nəyin və necə işlədiyini daha dərindən başa düşməyə imkan verir.

Data Scientist's Notes: Data Sorğu Dillərinin Fərdi İcmalı
-dən götürülüb bu məqalələr. Əməliyyat nümunəsi: cədvəlləri birləşdirən qoşulma.

Təhsil üçün materiallar:

Stanforddan yaxşı giriş kursu. Ümumiyyətlə, əlaqə cəbri və nəzəriyyəsi ilə bağlı çoxlu materiallar var - Coursera, Udacity. İnternetdə çoxlu sayda material var, o cümlədən yaxşı akademik kurslar. Mənim şəxsi məsləhətim: siz əlaqə cəbrini çox yaxşı başa düşməlisiniz - bu əsasların əsasıdır.

SQL

Data Scientist's Notes: Data Sorğu Dillərinin Fərdi İcmalı
-dən götürülüb bu məqalələr.

SQL mahiyyətcə əlaqə cəbrinin tətbiqidir - vacib bir xəbərdarlıqla, SQL deklarativdir! Yəni, əlaqə cəbri dilində sorğu yazarkən, əslində necə hesablamaq lazım olduğunu deyirsiniz - lakin SQL ilə siz nə çıxarmaq istədiyinizi müəyyənləşdirirsiniz və sonra DBMS artıq relyasiya cəbrinin dilində (effektiv) ifadələr yaradır (onların ekvivalentliyi bizə məlumdur Codd teoremi).

Data Scientist's Notes: Data Sorğu Dillərinin Fərdi İcmalı
-dən götürülüb bu məqalələr.

Niyə?

Əlaqəli DBMS-lər: Oracle, Postgres, SQL Server və s. hələ də demək olar ki, hər yerdədir və sizin onlarla qarşılıqlı əlaqədə olma şansınız olduqca yüksəkdir, bu o deməkdir ki, siz ya SQL-i oxumalı (bu, çox güman ki) və ya onu yazmalısınız ( heç də çətin deyil).

Nə oxumaq və öyrənmək

Yuxarıdakı eyni bağlantılara görə (əlaqə cəbri haqqında) inanılmaz miqdarda material var, məsələn, bu.

Yeri gəlmişkən, NoSQL nədir?

“Bir daha vurğulamağa dəyər ki, “NoSQL” termini tamamilə kortəbii mənşəyə malikdir və onun arxasında heç bir ümumi qəbul edilmiş tərif və ya elmi qurum yoxdur.” Uyğundur məqalə Habr haqqında.

Əslində, insanlar başa düşdülər ki, bir çox problemi həll etmək üçün tam əlaqə modelinə ehtiyac yoxdur, xüsusən də, məsələn, performansın kritik olduğu və aqreqasiya ilə müəyyən sadə sorğuların üstünlük təşkil etdiyi üçün - burada tez bir zamanda metrikləri hesablamaq və onlara yazmaq vacibdir. verilənlər bazası və əksər xüsusiyyətlərin əlaqəsi yalnız lazımsız deyil, həm də zərərlidir - bizim üçün ən vacib olanı (müəyyən bir tapşırıq üçün) - məhsuldarlığı korlayacaqsa nəyi normallaşdırmağa nə ehtiyac var?

Həmçinin, klassik relyasiya modelinin sabit riyazi sxemlərinin əvəzinə tez-tez çevik sxemlərə ehtiyac duyulur - və bu, sistemin yerləşdirilməsi və nəticələrin işlənməsi, ya da sxem və saxlanılan məlumatların növlərinin işlənməsi vacib olduqda, tətbiqin işlənməsini inanılmaz dərəcədə asanlaşdırır. o qədər də vacib deyillər.

Məsələn, biz ekspert sistemi yaradırıq və müəyyən bir domendə məlumatı bəzi meta məlumatlarla birlikdə saxlamaq istəyirik - ola bilsin biz bütün sahələri bilmirik və sadəcə olaraq hər qeyd üçün JSON-u saxlayırıq - bu bizə məlumatı genişləndirmək üçün çox çevik mühit verir. model və tez təkrarlanan - belə ki, bu halda, NoSQL hətta üstünlük və daha oxunaqlı olacaq. Nümunə girişi (NoSQL-in lazım olduğu yerdə olduğu layihələrimdən birindən).

{"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}

Daha çox oxuya bilərsiniz burada NoSQL haqqında.

Nə öyrənmək lazımdır?

Burada, daha doğrusu, sadəcə tapşırığınızı, onun hansı xüsusiyyətlərə malik olduğunu və bu təsvirə uyğun gələn hansı NoSQL sistemlərinin mövcud olduğunu hərtərəfli təhlil etməlisiniz - və sonra bu sistemi öyrənməyə başlayın.

Skript Sorğu Dilləri

Əvvəlcə Python-un ümumiyyətlə bununla nə əlaqəsi var - bu proqramlaşdırma dilidir və ümumiyyətlə sorğular haqqında deyil.

Data Scientist's Notes: Data Sorğu Dillərinin Fərdi İcmalı

  • Pandalar sözün əsl mənasında İsveçrə Ordusunun Data Elm bıçağıdır; onda çoxlu sayda məlumat çevrilməsi, yığılması və s. baş verir.
  • Numpy - vektor hesablamaları, matrislər və xətti cəbr var.
  • Scipy - bu paketdə çoxlu riyaziyyat, xüsusən də statistika var.
  • Jupyter laboratoriyası - bir çox kəşfiyyat məlumatlarının təhlili noutbuklara yaxşı uyğun gəlir - bilmək faydalıdır.
  • Sorğular - şəbəkə ilə işləmək.
  • Pyspark məlumat mühəndisləri arasında çox populyardır, çox güman ki, sadəcə populyarlığına görə bu və ya Spark ilə qarşılıqlı əlaqə qurmalı olacaqsınız.
  • *Selenium - saytlardan və resurslardan məlumat toplamaq üçün çox faydalıdır, bəzən məlumatları əldə etməyin başqa yolu yoxdur.

Əsas məsləhətim: Python öyrənin!

Pandas

Nümunə olaraq aşağıdakı kodu götürək:

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'}))

Əslində kodun klassik SQL modelinə uyğun olduğunu görürük.

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

Amma vacib olan odur ki, bu kod skriptin və boru xəttinin bir hissəsidir; əslində biz sorğuları Python boru kəmərinə daxil edirik. Bu vəziyyətdə sorğu dili bizə Pandas və ya pySpark kimi kitabxanalardan gəlir.

Ümumiyyətlə, pySpark-da biz sorğu dili vasitəsilə oxşar tipli məlumatların çevrilməsini görürük:

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

Harada və nə oxumaq

Ümumiyyətlə Python-un özündə problem deyil öyrənmək üçün materiallar tapın. İnternetdə çox sayda dərslik var pandalar, pySpark və kurslar Qığılcım (həm də özü ilə DS). Ümumiyyətlə, buradakı məzmun googling üçün əladır və mən diqqəti cəmləmək üçün bir paket seçməli olsam, bu, əlbəttə ki, pandalar olardı. DS+Python materiallarının birləşməsi ilə bağlı da çoxdur.

Shell sorğu dili kimi

İşlədiyim bir neçə məlumat emalı və təhlili layihələri əslində Python, Java və shell əmrlərinin özlərini çağıran qabıq skriptləridir. Buna görə də, ümumiyyətlə, bash/zsh/etc-də boru kəmərlərini bir növ yüksək səviyyəli sorğu kimi nəzərdən keçirə bilərsiniz (əlbəttə ki, orada döngələri doldura bilərsiniz, lakin bu shell dillərində DS kodu üçün xarakterik deyil), gəlin verək. sadə misal - Mən vikidataların QID xəritəsini və rus və ingilis vikilərinə tam keçid etməli idim, bunun üçün bash-dakı əmrlərdən sadə bir sorğu yazdım və çıxış üçün Python-da sadə bir skript yazdım. belə birləşdirin:

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

hara

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

Bu, əslində, tələb olunan xəritələşdirməni yaradan bütün boru kəməri idi; gördüyümüz kimi, hər şey axın rejimində işləyirdi:

  • pv fayl yolu - fayl ölçüsünə əsaslanan tərəqqi çubuğunu verir və məzmununu irəli ötürür
  • unpigz -c arxivin bir hissəsini oxuyub jq-a verdi
  • jq açarı ilə - axın dərhal nəticə çıxardı və onu Python-da postprosessora ötürdü (ilk nümunə ilə eyni)
  • daxili olaraq, postprosessor çıxışı formatlaşdıran sadə dövlət maşını idi 

Ümumilikdə, böyük məlumatlarda (0.5 TB) axın rejimində işləyən, əhəmiyyətli resurslar olmadan və sadə boru kəmərindən və bir neçə alətdən hazırlanmış mürəkkəb boru kəməri.

Başqa bir vacib ipucu: terminalda yaxşı və effektiv işləməyi və bash/zsh/etc yazmağı bacarın.

Harada faydalı olacaq? Bəli, demək olar ki, hər yerdə - yenə də İnternetdə öyrənmək üçün çoxlu materiallar var. Xüsusilə, burada bu əvvəlki məqaləm.

R skriptləri

Yenə də oxucu qışqıra bilər - yaxşı, bu bütöv bir proqramlaşdırma dilidir! Və təbii ki, o, haqlı olacaq. Lakin mən adətən R ilə elə bir kontekstdə qarşılaşırdım ki, əslində bu sorğu dilinə çox bənzəyirdi.

R statik hesablama və vizuallaşdırma üçün statistik hesablama mühiti və dilidir (müvafiq olaraq bu).

Data Scientist's Notes: Data Sorğu Dillərinin Fərdi İcmalı
qəbul buradan. Yeri gəlmişkən, tövsiyə edirəm, yaxşı material.

Data alimi nə üçün R-ni bilməlidir? Ən azı ona görə ki, R-də məlumatları təhlil edən qeyri-IT insanların böyük bir təbəqəsi var. Mən aşağıdakı yerlərdə rast gəldim:

  • Əczaçılıq sektoru.
  • Bioloqlar.
  • Maliyyə sektoru.
  • Statistika ilə məşğul olan sırf riyazi təhsili olan insanlar.
  • İxtisaslaşmış statistik modellər və maşın öyrənmə modelləri (bunları tez-tez yalnız müəllif versiyasında R paketi kimi tapmaq olar).

Niyə əslində sorğu dilidir? Tez-tez rast gəlindiyi formada bu, əslində məlumatların oxunması və sorğu (model) parametrlərinin düzəldilməsi, həmçinin ggplot2 kimi paketlərdə verilənlərin vizuallaşdırılması daxil olmaqla, model yaratmaq tələbidir - bu həm də sorğuların yazılması formasıdır. .

Vizuallaşdırma üçün nümunə sorğular

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

Ümumiyyətlə, R-dən bir çox ideyalar dataframelər və verilənlərin vektorlaşdırılması kimi pandalar, numpy və ya scipy kimi python paketlərinə köçdü - buna görə də ümumiyyətlə R-də bir çox şey sizə tanış və rahat görünəcək.

Öyrənmək üçün çoxlu mənbələr var, məsələn, bu.

Bilik qrafikləri

Burada bir az qeyri-adi təcrübəm var, çünki çox vaxt bilik qrafikləri və qrafiklər üçün sorğu dilləri ilə işləməli oluram. Buna görə də, gəlin qısaca əsasları nəzərdən keçirək, çünki bu hissə bir az daha ekzotikdir.

Klassik relational verilənlər bazalarında sabit bir sxemimiz var, lakin burada sxem çevikdir, hər bir predikat əslində bir "sütun" və daha çox.

Təsəvvür edin ki, bir insanı modelləşdirirdiniz və əsas şeyləri təsvir etmək istəyirdiniz, məsələn, konkret bir şəxsi, Duqlas Adamsı götürək və bu təsviri əsas götürək.

Data Scientist's Notes: Data Sorğu Dillərinin Fərdi İcmalı
www.wikidata.org/wiki/Q42

Əlaqəli verilənlər bazasından istifadə etsəydik, çoxlu sayda sütunlu nəhəng cədvəl və ya cədvəllər yaratmalı olardıq, onların əksəriyyəti NULL olardı və ya hər hansı bir defolt Yanlış dəyərlə doldurulardı, məsələn, çoxumuzun Koreya milli kitabxanasına giriş - əlbəttə ki, biz onları ayrı-ayrı cədvəllərə yerləşdirə bilərdik, lakin bu, son nəticədə sabit relyativdən istifadə edərək predikatlarla çevik məntiqi dövrə modelləşdirmə cəhdi olardı.

Data Scientist's Notes: Data Sorğu Dillərinin Fərdi İcmalı
Təsəvvür edin ki, bütün məlumatlar qrafik şəklində və ya ikili və birlik məntiqi ifadələr kimi saxlanılır.

Bununla harda qarşılaşa bilərsiniz? Birincisi, ilə işləmək data wiki, və hər hansı bir qrafik verilənlər bazası və ya əlaqəli data ilə.

Aşağıdakılar istifadə etdiyim və işlədiyim əsas sorğu dilləridir.

SPARQL

Wiki:
SPARQL (rekursiv akronim etibarən Eng. SPARQL Protokolu və RDF Sorğu Dili) - məlumat sorğu dili, modeli ilə təmsil olunur RDFprotokol bu sorğuları ötürmək və onlara cavab vermək. SPARQL tövsiyədir W3C Konsorsiumu və texnologiyalardan biridir semantik şəbəkə.

Amma reallıqda bu məntiqi unar və binar predikatlar üçün sorğu dilidir. Siz sadəcə olaraq şərti olaraq Boolean ifadəsində nəyin sabit olduğunu və nəyin olmadığını (çox sadələşdirilmiş) müəyyənləşdirirsiniz.

SPARQL sorğularının yerinə yetirildiyi RDF (Resurs Təsviri Çərçivəsi) bazası üçqatdır. object, predicate, subject - və sorğu ruhda göstərilən məhdudiyyətlərə uyğun olaraq tələb olunan üçlüyü seçir: X tapın ki, p_55(X, q_33) doğru olsun - burada, əlbəttə ki, p_55 ID 55 ilə bir növ əlaqədir və q_33 ID 33 olan obyekt (burada və bütün hekayə, yenə hər cür təfərrüatları buraxmaqla).

Məlumat təqdimatının nümunəsi:

Data Scientist's Notes: Data Sorğu Dillərinin Fərdi İcmalı
Burada ölkələrlə şəkillər və nümunələr buradan.

Əsas sorğu nümunəsi

Data Scientist's Notes: Data Sorğu Dillərinin Fərdi İcmalı

Əslində, biz predikat üçün ?ölkə dəyişəninin qiymətini tapmaq istəyirik
member_of, doğrudur, member_of(?country,q458) və q458 Avropa Birliyinin ID-sidir.

Python mühərrikində real SPARQL sorğusunun nümunəsi:

Data Scientist's Notes: Data Sorğu Dillərinin Fərdi İcmalı

Tipik olaraq, mən SPARQL-i yazmaq əvəzinə oxumalı oldum - bu vəziyyətdə, verilənlərin necə əldə edildiyini dəqiq başa düşmək üçün dili ən azı əsas səviyyədə başa düşmək çox güman ki, faydalı bir bacarıq olardı. 

İnternetdə öyrənmək üçün çoxlu material var: məsələn, burada bu и bu. Mən adətən Google-da xüsusi dizaynlar və nümunələr axtarıram və bu, hələlik kifayətdir.

Məntiqi sorğu dilləri

Mövzu haqqında daha çox məqaləmdə oxuya bilərsiniz burada. Və burada məntiqi dillərin niyə sorğu yazmaq üçün yaxşı uyğun olduğunu qısaca araşdıracağıq. Əslində, RDF sadəcə p(X) və h(X,Y) formalarının məntiqi ifadələrinin toplusudur və məntiqi sorğu aşağıdakı formaya malikdir:

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

Burada söhbət yeni predikat çıxışı/1 (/1 vahid deməkdir) yaratmaqdan gedir, bir şərtlə ki, X üçün ölkə(X) doğru olsun - yəni X həm ölkədir, həm də (X,"AB") üzvüdür.

Yəni, bu halda həm verilənlər, həm də qaydalar eyni şəkildə təqdim olunur ki, bu da problemləri çox asan və yaxşı modelləşdirməyə imkan verir.

Sənayedə harada tanış olmusunuz?: belə bir dildə sorğular yazan bir şirkətlə bütöv bir böyük layihə, eləcə də sistemin nüvəsindəki cari layihə - bu, olduqca ekzotik bir şey kimi görünə bilər, lakin bəzən belə olur.

Məntiqi dildə vikidata emal edən kod fraqmentinə nümunə:

Data Scientist's Notes: Data Sorğu Dillərinin Fərdi İcmalı

Materiallar: Mən burada müasir məntiqi proqramlaşdırma dili ilə bağlı bir neçə keçid verəcəyəm.

Data Scientist's Notes: Data Sorğu Dillərinin Fərdi İcmalı

Mənbə: www.habr.com

Добавить комментарий