Note ale cercetătorilor de date: o revizuire personalizată a limbajelor de interogare a datelor

Note ale cercetătorilor de date: o revizuire personalizată a limbajelor de interogare a datelor
Vă spun din experiență personală ce a fost util unde și când. Este o privire de ansamblu și o teză, astfel încât să fie clar ce și unde poți săpa mai departe - dar aici am o experiență personală exclusiv subiectivă, poate totul este complet diferit pentru tine.

De ce este important să cunoaștem și să poți folosi limbaje de interogare? În esență, Data Science are mai multe etape importante de lucru, iar prima și cea mai importantă (fără ea, cu siguranță nimic nu va funcționa!) este obținerea sau extragerea datelor. Cel mai adesea, datele se află undeva într-o anumită formă și trebuie „recuperate” de acolo. 

Limbile de interogare vă permit să extrageți chiar aceste date! Și astăzi vă voi spune despre acele limbaje de interogare care mi-au fost utile și vă voi spune și vă voi arăta unde și cum exact - de ce este necesar să studiați.

Vor exista trei blocuri principale de tipuri de interogări de date, despre care vom discuta în acest articol:

  • Limbajele de interogare „standard” sunt ceea ce se înțelege în mod obișnuit atunci când vorbim despre un limbaj de interogare, cum ar fi algebra relațională sau SQL.
  • Limbaje de interogare de scriptare: de exemplu, Python lucruri panda, numpy sau scripting shell.
  • Limbaje de interogare pentru grafice de cunoștințe și baze de date grafice.

Tot ceea ce este scris aici este doar o experiență personală, ceea ce a fost util, cu o descriere a situațiilor și „de ce a fost nevoie” - toată lumea poate încerca cum îți pot apărea situații similare și încearcă să se pregătească pentru ele în avans, înțelegând aceste limbi. ​înainte trebuie să aplici (de urgență) la un proiect sau chiar să ajungi la un proiect unde este nevoie de ele.

Limbi de interogare „standard”.

Limbile standard de interogare sunt tocmai în sensul în care de obicei ne gândim la ele când vorbim despre interogări.

Algebră relațională

De ce este nevoie de algebra relațională astăzi? Pentru a înțelege bine de ce limbajele de interogare sunt structurate într-un anumit mod și pentru a le folosi în mod conștient, trebuie să înțelegeți nucleul care stă la baza acestora.

Ce este algebra relațională?

Definiția formală este următoarea: algebra relațională este un sistem închis de operații asupra relațiilor într-un model de date relaționale. Pentru a spune un pic mai uman, acesta este un sistem de operații pe tabele, astfel încât rezultatul este întotdeauna un tabel.

Vedeți toate operațiunile relaționale în acest articol de la Habr - aici vă descriem de ce trebuie să știți și unde vă este util.

De ce?

Începând să înțelegeți despre ce sunt limbajele de interogare și ce operațiuni se află în spatele expresiilor în limbaje de interogare specifice oferă adesea o înțelegere mai profundă a ceea ce funcționează în limbajele de interogare și cum.

Note ale cercetătorilor de date: o revizuire personalizată a limbajelor de interogare a datelor
Luat din acest articole. Un exemplu de operație: join, care unește tabele.

Materiale pentru studiu:

Curs introductiv bun de la Stanford. În general, există o mulțime de materiale despre algebra relațională și teorie - Coursera, Udacity. Există, de asemenea, o cantitate imensă de material online, inclusiv bun cursuri academice. Sfatul meu personal: trebuie să înțelegeți foarte bine algebra relațională - aceasta este baza elementelor de bază.

SQL

Note ale cercetătorilor de date: o revizuire personalizată a limbajelor de interogare a datelor
Luat din acest articol.

SQL este în esență o implementare a algebrei relaționale - cu o avertizare importantă, SQL este declarativ! Adică, atunci când scrieți o interogare în limbajul algebrei relaționale, de fapt spuneți cum se calculează - dar cu SQL specificați ce doriți să extrageți, iar apoi DBMS generează deja expresii (eficiente) în limbajul algebrei relaționale (a lor echivalența ne este cunoscută ca teorema lui Codd).

Note ale cercetătorilor de date: o revizuire personalizată a limbajelor de interogare a datelor
Luat din acest articol.

De ce?

SGBD-uri relaționale: Oracle, Postgres, SQL Server etc. sunt încă practic peste tot și există o șansă incredibil de mare ca va trebui să interacționați cu ele, ceea ce înseamnă că va trebui fie să citiți SQL (ceea ce este foarte probabil), fie să îl scrieți ( nici puțin probabil).

Ce să citești și să studiezi

Conform acelorași legături de mai sus (despre algebra relațională), există o cantitate incredibilă de material, de exemplu, acest.

Apropo, ce este NoSQL?

„Meretă să subliniem încă o dată că termenul „NoSQL” are o origine absolut spontană și nu are în spate o definiție general acceptată sau o instituție științifică.” Corespunzător articol pe Habr.

De fapt, oamenii și-au dat seama că un model relațional complet nu este necesar pentru a rezolva multe probleme, în special pentru cele în care, de exemplu, performanța este critică și domină anumite interogări simple cu agregare - unde este esențial să se calculeze rapid valorile și să le scrie în baza de date, iar majoritatea caracteristicilor sunt relaționale s-au dovedit a fi nu numai inutile, ci și dăunătoare - de ce să normalizăm ceva dacă va strica cel mai important lucru pentru noi (pentru o anumită sarcină) - productivitatea?

De asemenea, sunt adesea necesare scheme flexibile în locul schemelor matematice fixe ale modelului relațional clasic - iar acest lucru simplifică incredibil dezvoltarea aplicațiilor atunci când este esențial să implementați sistemul și să începeți să lucrați rapid, să procesați rezultatele - sau schema și tipurile de date stocate. nu sunt atât de importante.

De exemplu, creăm un sistem expert și dorim să stocăm informații despre un anumit domeniu împreună cu unele meta informații - este posibil să nu cunoaștem toate câmpurile și pur și simplu stocăm JSON pentru fiecare înregistrare - acest lucru ne oferă un mediu foarte flexibil pentru extinderea datelor model și repetare rapidă - deci în acest caz, NoSQL va fi chiar preferabil și mai lizibil. Exemplu de intrare (de la unul dintre proiectele mele în care NoSQL a fost exact acolo unde era nevoie).

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

Puteți citi mai multe aici despre NoSQL.

Ce sa studiezi?

Aici, mai degrabă, trebuie doar să vă analizați temeinic sarcina, ce proprietăți are și ce sisteme NoSQL sunt disponibile care s-ar potrivi acestei descrieri - și apoi începeți să studiați acest sistem.

Limbaje de interogare de scriptare

La început, se pare, ce legătură are Python cu el în general - este un limbaj de programare și nu despre interogări deloc.

Note ale cercetătorilor de date: o revizuire personalizată a limbajelor de interogare a datelor

  • Pandas este literalmente un cuțit elvețian al științei datelor; în el are loc o cantitate imensă de transformare a datelor, agregare etc.
  • Numpy - calcule vectoriale, matrici și algebră liniară acolo.
  • Scipy - există o mulțime de matematică în acest pachet, în special statistici.
  • Laboratorul Jupyter - o mulțime de analize exploratorii de date se potrivește bine în laptopuri - util de știut.
  • Cereri - lucrul cu rețeaua.
  • Pyspark este foarte popular printre inginerii de date, cel mai probabil va trebui să interacționați cu acesta sau Spark, pur și simplu datorită popularității lor.
  • *Seleniu - foarte util pentru colectarea datelor de pe site-uri și resurse, uneori pur și simplu nu există o altă modalitate de a obține datele.

Sfatul meu principal: învață Python!

ursi panda

Să luăm următorul cod ca exemplu:

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

În esență, vedem că codul se încadrează în modelul SQL clasic.

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

Dar partea importantă este că acest cod face parte din script și din conductă; de fapt, încorporam interogări în conducta Python. În această situație, limbajul de interogare ne vine din biblioteci precum Pandas sau pySpark.

În general, în pySpark vedem un tip similar de transformare a datelor printr-un limbaj de interogare în spiritul:

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

Unde și ce să citești

Pe Python în sine, în general nici o problema găsi materiale de studiat. Există un număr mare de tutoriale online panda, pySpark si cursuri pe Scânteie (și, de asemenea, de la sine DS). În general, conținutul de aici este grozav pentru a căuta pe Google și, dacă ar trebui să aleg un pachet pe care să mă concentrez, ar fi panda, desigur. Și în ceea ce privește combinația de materiale DS+Python o mulțime de.

Shell ca limbaj de interogare

Destul de multe proiecte de procesare și analiză a datelor cu care am lucrat sunt, de fapt, scripturi shell care apelează cod în Python, Java și comenzile shell în sine. Prin urmare, în general, puteți considera conductele în bash/zsh/etc ca un fel de interogare la nivel înalt (puteți, desigur, să introduceți bucle acolo, dar acest lucru nu este tipic pentru codul DS în limbaje shell), să dăm un exemplu simplu - trebuia să fac o mapare QID a wikidata și legături complete către wiki-urile rusă și engleză, pentru aceasta am scris o cerere simplă de la comenzile din bash și pentru ieșire am scris un script simplu în Python, pe care l-am adunati asa:

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

unde

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

Aceasta a fost, de fapt, întreaga conductă care a creat maparea necesară; după cum vedem, totul a funcționat în modul stream:

  • pv filepath - oferă o bară de progres bazată pe dimensiunea fișierului și transmite conținutul acestuia mai departe
  • unpigz -c a citit o parte din arhivă și a dat-o lui jq
  • jq cu cheia - fluxul a produs imediat rezultatul și l-a transmis postprocesorului (la fel ca și în primul exemplu) în Python
  • intern, postprocesorul era o simplă mașină de stare care formata ieșirea 

În total, o conductă complexă care funcționează în modul flux pe date mari (0.5 TB), fără resurse semnificative și realizată dintr-o conductă simplă și câteva instrumente.

Un alt sfat important: să puteți lucra bine și eficient în terminal și să scrieți bash/zsh/etc.

Unde va fi de folos? Da, aproape peste tot - din nou, există o MULTE de materiale de studiat pe Internet. În special, aici acest articolul meu anterior.

R scripting

Din nou, cititorul poate exclama - ei bine, acesta este un întreg limbaj de programare! Și, desigur, va avea dreptate. Cu toate acestea, de obicei, am întâlnit R într-un astfel de context încât, de fapt, era foarte asemănător cu un limbaj de interogare.

R este un mediu și un limbaj de calcul statistic pentru calcul și vizualizare statică (conform acest).

Note ale cercetătorilor de date: o revizuire personalizată a limbajelor de interogare a datelor
Luat prin urmare. Apropo, recomand, material bun.

De ce un cercetător de date trebuie să cunoască R? Cel puțin, pentru că există un strat uriaș de oameni non-IT care analizează datele în R. Am dat peste el în următoarele locuri:

  • Sectorul farmaceutic.
  • Biologii.
  • Sector Financial.
  • Oameni cu o educație pur matematică care se ocupă de statistici.
  • Modele statistice specializate și modele de învățare automată (care pot fi adesea găsite doar în versiunea autorului ca pachet R).

De ce este de fapt un limbaj de interogare? În forma în care se găsește adesea, este de fapt o solicitare de a crea un model, incluzând citirea datelor și fixarea parametrilor de interogare (model), precum și vizualizarea datelor în pachete precum ggplot2 - aceasta este și o formă de scriere a interogărilor .

Exemple de interogări pentru vizualizare

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

În general, multe idei din R au migrat în pachete python, cum ar fi panda, numpy sau scipy, cum ar fi cadrele de date și vectorizarea datelor - așa că, în general, multe lucruri în R ți se vor părea familiare și convenabile.

Există multe surse de studiat, de exemplu, acest.

Grafice de cunoștințe

Aici am o experiență puțin neobișnuită, deoarece destul de des trebuie să lucrez cu grafice de cunoștințe și limbaje de interogare pentru grafice. Prin urmare, să trecem pe scurt peste elementele de bază, deoarece această parte este puțin mai exotică.

În bazele de date relaționale clasice avem o schemă fixă, dar aici schema este flexibilă, fiecare predicat este de fapt o „coloană” și chiar mai mult.

Imaginați-vă că modelați o persoană și doriți să descrieți lucruri cheie, de exemplu, să luăm o anumită persoană, Douglas Adams, și să folosim această descriere ca bază.

Note ale cercetătorilor de date: o revizuire personalizată a limbajelor de interogare a datelor
www.wikidata.org/wiki/Q42

Dacă am folosi o bază de date relațională, ar trebui să creăm un tabel sau tabele uriașe cu un număr mare de coloane, dintre care majoritatea ar fi NULL sau umplute cu o valoare implicită False, de exemplu, este puțin probabil ca mulți dintre noi să avem o intrare în biblioteca națională coreeană - desigur, le-am putea pune în tabele separate, dar aceasta ar fi în cele din urmă o încercare de a modela un circuit logic flexibil cu predicate folosind unul relațional fix.

Note ale cercetătorilor de date: o revizuire personalizată a limbajelor de interogare a datelor
Așa că imaginați-vă că toate datele sunt stocate ca un grafic sau ca expresii booleene binare și unare.

Unde poți să întâlnești asta? În primul rând, lucrul cu wiki de date, și cu orice baze de date grafice sau date conectate.

Următoarele sunt principalele limbi de interogare pe care le-am folosit și cu care am lucrat.

SPARQL

Wiki:
SPARQL (acronim recursiv din Ing.. Protocolul SPARQL și limbajul de interogare RDF) - limbajul de interogare a datelor, reprezentat de model RDFși protocol să transmită aceste solicitări și să le răspundă. SPARQL este o recomandare Consorțiul W3C și una dintre tehnologii web semantic.

Dar, în realitate, este un limbaj de interogare pentru predicate logice unare și binare. Pur și simplu specificați condiționat ce este fixat într-o expresie booleană și ce nu este (foarte simplificat).

Baza RDF (Resource Description Framework) în sine, peste care sunt executate interogări SPARQL, este un triplu object, predicate, subject - iar interogarea selectează triplele necesare conform restricțiilor specificate în spirit: găsiți un X astfel încât p_55(X, q_33) este adevărat - unde, desigur, p_55 este un fel de relație cu ID 55 și q_33 este un obiect cu ID 33 (aici și toată povestea, omițând din nou tot felul de detalii).

Exemplu de prezentare a datelor:

Note ale cercetătorilor de date: o revizuire personalizată a limbajelor de interogare a datelor
Imagini și exemple cu țări aici prin urmare.

Exemplu de interogare de bază

Note ale cercetătorilor de date: o revizuire personalizată a limbajelor de interogare a datelor

De fapt, dorim să găsim valoarea variabilei ?country astfel încât pentru predicat
member_of, este adevărat că member_of(?country,q458) și q458 este ID-ul Uniunii Europene.

Un exemplu de interogare SPARQL reală în interiorul motorului Python:

Note ale cercetătorilor de date: o revizuire personalizată a limbajelor de interogare a datelor

De obicei, a trebuit să citesc SPARQL mai degrabă decât să-l scriu - în această situație, ar fi probabil o abilitate utilă să înțeleg limbajul cel puțin la un nivel de bază pentru a înțelege exact cum sunt preluate datele. 

Există o mulțime de materiale de studiat online: de exemplu, aici acest и acest. De obicei caut pe Google modele și exemple specifice și este suficient pentru moment.

Limbaje logice de interogare

Puteți citi mai multe despre acest subiect în articolul meu aici. Și aici, vom examina doar pe scurt de ce limbajele logice sunt potrivite pentru scrierea interogărilor. În esență, RDF este doar un set de instrucțiuni logice de forma p(X) și h(X,Y), iar o interogare logică are următoarea formă:

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

Aici vorbim despre crearea unui nou predicat output/1 (/1 înseamnă unar), cu condiția ca pentru X să fie adevărat că country(X) - adică X este o țară și, de asemenea, membru_al(X,"EU ").

Adică, în acest caz, atât datele, cât și regulile sunt prezentate în același mod, ceea ce ne permite să modelăm problemele foarte ușor și bine.

Unde te-ai întâlnit în industrie?: un întreg proiect mare cu o companie care scrie interogări într-o astfel de limbă, precum și despre proiectul actual din miezul sistemului - s-ar părea că acesta este un lucru destul de exotic, dar uneori se întâmplă.

Un exemplu de fragment de cod într-un limbaj logic care procesează wikidata:

Note ale cercetătorilor de date: o revizuire personalizată a limbajelor de interogare a datelor

Materiale: voi oferi aici câteva link-uri către limbajul modern de programare logică Answer Set Programming - vă recomand să-l studiați:

Note ale cercetătorilor de date: o revizuire personalizată a limbajelor de interogare a datelor

Sursa: www.habr.com

Adauga un comentariu