Opombe podatkovnega znanstvenika: prilagojen pregled jezikov podatkovnih poizvedb

Opombe podatkovnega znanstvenika: prilagojen pregled jezikov podatkovnih poizvedb
Iz lastnih izkušenj vam povem, kaj je bilo uporabno kje in kdaj. Je pregled in teza, da je jasno, kaj in kje lahko še kopljete - ampak tukaj imam izključno subjektivno osebno izkušnjo, morda je pri vas vse popolnoma drugače.

Zakaj je pomembno poznati in znati uporabljati poizvedovalne jezike? Podatkovna znanost ima v svojem bistvu več pomembnih faz dela, prva in najpomembnejša (brez nje zagotovo nič ne deluje!) pa je pridobivanje oziroma ekstrahiranje podatkov. Najpogosteje se podatki nahajajo nekje v neki obliki in jih je treba od tam »priklicati«. 

Poizvedovalni jeziki vam omogočajo, da izvlečete prav te podatke! In danes vam bom povedal o tistih poizvedovalnih jezikih, ki so mi bili koristni, in vam bom povedal in pokazal, kje in kako natančno - zakaj je to potrebno za študij.

Obstajajo trije glavni bloki vrst podatkovnih poizvedb, o katerih bomo razpravljali v tem članku:

  • "Standardni" poizvedbeni jeziki so tisto, kar se običajno razume, ko govorimo o poizvedovalnem jeziku, kot je relacijska algebra ali SQL.
  • Skriptni poizvedovalni jeziki: na primer Python stvari pande, numpy ali skriptna lupina.
  • Poizvedovalni jeziki za grafe znanja in baze podatkov grafov.

Vse, kar je tukaj napisano, je samo osebna izkušnja, kar je bilo koristno, z opisom situacij in "zakaj je bilo to potrebno" - vsak lahko poskusi, kako se lahko zgodijo podobne situacije in se poskuša nanje vnaprej pripraviti z razumevanjem teh jezikov ​​preden se morate (nujno) prijaviti na projekt ali celo priti do projekta, kjer so potrebni.

"Standardni" poizvedovalni jeziki

Standardni poizvedbeni jeziki so natanko v smislu, da nanje običajno pomislimo, ko govorimo o poizvedbah.

Relacijska algebra

Zakaj je danes potrebna relacijska algebra? Da bi dobro razumeli, zakaj so poizvedovalni jeziki strukturirani na določen način, in jih zavestno uporabljali, morate razumeti jedro, na katerem temeljijo.

Kaj je relacijska algebra?

Formalna definicija je naslednja: relacijska algebra je zaprt sistem operacij nad relacijami v relacijskem podatkovnem modelu. Povedano malo bolj človeško, to je sistem operacij nad tabelami, tako da je rezultat vedno tabela.

Oglejte si vse relacijske operacije v to članek iz Habra - tukaj opisujemo, zakaj morate vedeti in kje vam pride prav.

Zakaj?

Začetek razumevanja, za kaj gre pri poizvedovalnih jezikih in katere operacije so v ozadju izrazov v določenih poizvedovalnih jezikih, pogosto omogoči globlje razumevanje, kaj v poizvedovalnih jezikih deluje in kako.

Opombe podatkovnega znanstvenika: prilagojen pregled jezikov podatkovnih poizvedb
Odvzet od to članki. Primer operacije: join, ki združuje tabele.

Materiali za študij:

Dober začetni tečaj iz Stanforda. Na splošno obstaja veliko gradiva o relacijski algebri in teoriji - Coursera, Udacity. Tudi na spletu je ogromno gradiva, tudi dobrega akademski tečaji. Moj osebni nasvet: zelo dobro morate razumeti relacijsko algebro - to je osnova osnov.

SQL

Opombe podatkovnega znanstvenika: prilagojen pregled jezikov podatkovnih poizvedb
Odvzet od to člankov.

SQL je v bistvu implementacija relacijske algebre - s pomembno opozorilo, SQL je deklarativen! Se pravi, da pri pisanju poizvedbe v jeziku relacijske algebre dejansko rečete, kako izračunati - pri SQL pa določite, kaj želite ekstrahirati, in potem DBMS že generira (učinkovite) izraze v jeziku relacijske algebre (njihove enakovrednost nam je znana kot Coddov izrek).

Opombe podatkovnega znanstvenika: prilagojen pregled jezikov podatkovnih poizvedb
Odvzet od to člankov.

Zakaj?

Relacijski DBMS: Oracle, Postgres, SQL Server itd. so še vedno tako rekoč povsod in obstaja neverjetno velika verjetnost, da boste morali komunicirati z njimi, kar pomeni, da boste morali brati SQL (kar je zelo verjetno) ali ga pisati ( tudi ni malo verjetno).

Kaj brati in študirati

Po istih zgornjih povezavah (o relacijski algebri) obstaja neverjetno veliko gradiva, npr. ta.

Mimogrede, kaj je NoSQL?

»Vredno je še enkrat poudariti, da je izraz »NoSQL« povsem spontanega izvora in za njim ne stoji nobena splošno sprejeta definicija ali znanstvena ustanova.« Dopisovanje članek na Habru.

Pravzaprav so ljudje ugotovili, da popolni relacijski model ni potreben za rešitev številnih problemov, zlasti za tiste, kjer je na primer zmogljivost kritična in prevladujejo določene preproste poizvedbe z združevanjem – kjer je kritično hitro izračunati metrike in jih zapisati v bazo podatkov, večina funkcij pa je relacijskih, se je izkazalo ne samo za nepotrebne, ampak tudi za škodljive - zakaj bi nekaj normalizirali, če nam bo pokvarilo tisto najpomembnejše (za neko specifično nalogo) - produktivnost?

Poleg tega so pogosto potrebne prilagodljive sheme namesto fiksnih matematičnih shem klasičnega relacijskega modela - in to neverjetno poenostavi razvoj aplikacij, ko je kritično razmestiti sistem in hitro začeti delovati, obdelovati rezultate - ali shemo in vrste shranjenih podatkov. niso tako pomembni.

Na primer, ustvarjamo ekspertni sistem in želimo shraniti informacije o določeni domeni skupaj z nekaterimi meta informacijami - morda ne poznamo vseh polj in preprosto shranimo JSON za vsak zapis - to nam daje zelo prilagodljivo okolje za razširitev podatkov model in hitro ponavljanje - tako da bo v tem primeru NoSQL še bolj zaželen in bolj berljiv. Primer vnosa (iz enega od mojih projektov, kjer je bil NoSQL točno tam, kjer je bil potreben).

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

Lahko preberete več tukaj o NoSQL.

Kaj študirati?

Tukaj morate samo temeljito analizirati svojo nalogo, katere lastnosti ima in kateri sistemi NoSQL so na voljo, ki bi ustrezali temu opisu - in nato začeti preučevati ta sistem.

Skriptni poizvedovalni jeziki

Sprva se zdi, kaj ima Python s tem na splošno - to je programski jezik in sploh ne o poizvedbah.

Opombe podatkovnega znanstvenika: prilagojen pregled jezikov podatkovnih poizvedb

  • Pandas je dobesedno švicarski nož podatkovne znanosti; v njem se zgodi ogromno transformacij podatkov, združevanja itd.
  • Numpy - vektorski izračuni, matrike in linearna algebra tam.
  • Scipy - v tem paketu je veliko matematike, še posebej statistike.
  • Laboratorij Jupyter – veliko raziskovalnih analiz podatkov se dobro prilega prenosnim računalnikom – koristno je vedeti.
  • Zahteve - delo z omrežjem.
  • Pyspark je zelo priljubljen med podatkovnimi inženirji, najverjetneje boste morali komunicirati s tem ali Sparkom, preprosto zaradi njune priljubljenosti.
  • *Selenium – zelo uporaben za zbiranje podatkov s spletnih mest in virov, včasih preprosto ni drugega načina za pridobitev podatkov.

Moj glavni nasvet: naučite se Pythona!

pand

Za primer vzemimo naslednjo kodo:

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

V bistvu vidimo, da se koda ujema s klasičnim vzorcem 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

Toda pomemben del je, da je ta koda del skripta in cevovoda; pravzaprav v cevovod Python vdelamo poizvedbe. V tej situaciji nam poizvedbeni jezik pride iz knjižnic, kot sta Pandas ali pySpark.

Na splošno v pySparku vidimo podobno vrsto transformacije podatkov prek poizvedovalnega jezika v duhu:

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

Kje in kaj brati

Na Python samem na splošno brez problema najti materiale za študij. Na spletu je ogromno tutorialov pand, pySpark in tečaji naprej Spark (in tudi sama po sebi DS). Na splošno je vsebina tukaj odlična za googlanje in če bi moral izbrati en paket, na katerega bi se osredotočil, bi bile to seveda pande. Tudi glede kombinacije materialov DS+Python zelo veliko.

Shell kot poizvedovalni jezik

Kar nekaj projektov za obdelavo in analizo podatkov, s katerimi sem delal, je pravzaprav lupinskih skriptov, ki kličejo kodo v Pythonu, Javi in ​​samih lupinskih ukazih. Zato lahko na splošno cevovode v bash/zsh/etc obravnavate kot neke vrste poizvedbo na visoki ravni (seveda lahko vanjo vnesete zanke, vendar to ni značilno za kodo DS v lupinskih jezikih), dajmo preprost primer - moral sem narediti preslikavo QID wikipodatkov in polne povezave do ruskega in angleškega wikija, za to sem napisal preprosto zahtevo iz ukazov v bash in za izhod sem napisal preprost skript v Pythonu, ki sem ga skupaj takole:

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

če

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

To je bil pravzaprav celoten cevovod, ki je ustvaril zahtevano preslikavo; kot vidimo, je vse delovalo v pretočnem načinu:

  • pv filepath - daje vrstico napredka glede na velikost datoteke in posreduje njeno vsebino naprej
  • unpigz -c je prebral del arhiva in ga dal jq
  • jq s ključem - tok je takoj ustvaril rezultat in ga posredoval postprocesorju (enako kot pri prvem primeru) v Pythonu
  • interno je bil postprocesor preprost stroj stanja, ki je formatiral izhod 

Skupaj kompleksen cevovod, ki deluje v pretočnem načinu na velikih podatkih (0.5 TB), brez večjih virov in narejen iz preprostega cevovoda in nekaj orodij.

Še en pomemben nasvet: biti sposoben dobro in učinkovito delati v terminalu in pisati bash/zsh/itd.

Kje bo uporaben? Da, skoraj povsod - spet, na internetu je VELIKO gradiva za študij. Zlasti tukaj to moj prejšnji članek.

R skriptiranje

Spet lahko bralec vzklikne - no, to je cel programski jezik! In seveda bo imel prav. Vendar sem R običajno srečal v takem kontekstu, da je bil pravzaprav zelo podoben poizvedovalnemu jeziku.

R je statistično računalniško okolje in jezik za statično računalništvo in vizualizacijo (v skladu z to).

Opombe podatkovnega znanstvenika: prilagojen pregled jezikov podatkovnih poizvedb
sprejeti zato. Mimogrede, priporočam, dober material.

Zakaj mora podatkovni znanstvenik poznati R? Vsaj zato, ker obstaja ogromna plast ne-IT ljudi, ki analizirajo podatke v R. Naletel sem na to na naslednjih mestih:

  • Farmacevtski sektor.
  • Biologi.
  • Finančni sektor.
  • Ljudje s čisto matematično izobrazbo, ki se ukvarjajo s statistiko.
  • Specializirani statistični modeli in modeli strojnega učenja (ki jih pogosto najdemo le v avtorski različici kot paket R).

Zakaj je pravzaprav poizvedovalni jezik? V obliki, v kateri jo pogosto najdemo, je pravzaprav zahteva za ustvarjanje modela, vključno z branjem podatkov in popravkom parametrov poizvedbe (modela) ter vizualizacijo podatkov v paketih, kot je ggplot2 - to je tudi oblika pisanja poizvedb .

Primeri poizvedb za vizualizacijo

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

Na splošno se je veliko idej iz R preselilo v pakete python, kot so pandas, numpy ali scipy, kot so podatkovni okviri in vektorizacija podatkov - tako da se vam bo na splošno veliko stvari v R zdelo znanih in priročnih.

Obstaja veliko virov, ki jih je treba preučiti, npr. ta.

Grafi znanja

Tukaj imam nekoliko nenavadno izkušnjo, saj moram pogosto delati z grafi znanja in poizvedovalnimi jeziki za grafe. Zato pojdimo le na kratko čez osnove, saj je ta del malo bolj eksotičen.

V klasičnih relacijskih bazah podatkov imamo fiksno shemo, tukaj pa je shema fleksibilna, vsak predikat je pravzaprav “stolpec” in še več.

Predstavljajte si, da modelirate osebo in želite opisati ključne stvari, na primer vzemimo določeno osebo, Douglasa Adamsa, in ta opis uporabimo kot osnovo.

Opombe podatkovnega znanstvenika: prilagojen pregled jezikov podatkovnih poizvedb
www.wikidata.org/wiki/Q42

Če bi uporabili relacijsko zbirko podatkov, bi morali ustvariti ogromno tabelo ali tabele z ogromnim številom stolpcev, od katerih bi bila večina NULL ali napolnjena z neko privzeto vrednostjo False, na primer, malo verjetno je, da bi mnogi od nas imeli vnos v korejski nacionalni knjižnici - seveda bi jih lahko dali v ločene tabele, vendar bi bil to končno poskus modeliranja prilagodljivega logičnega vezja s predikati z uporabo fiksnega relacijskega.

Opombe podatkovnega znanstvenika: prilagojen pregled jezikov podatkovnih poizvedb
Predstavljajte si torej, da so vsi podatki shranjeni kot graf ali kot binarni in unarni logični izrazi.

Kje se to sploh lahko sreča? Prvič, delo z podatki wikiin z vsemi bazami podatkov grafov ali povezanimi podatki.

Sledijo glavni jeziki poizvedb, ki sem jih uporabljal in z njimi delal.

SPARQL

Wiki:
SPARQL (rekurzivna kratica od Angleščina Protokol SPARQL in poizvedovalni jezik RDF) - jezik podatkovnih poizvedb, ki ga predstavlja model RDFin protokol za posredovanje teh zahtev in odgovor nanje. SPARQL je priporočilo Konzorcij W3C in ena od tehnologij semantični splet.

Toda v resnici je poizvedbeni jezik za logične unarne in binarne predikate. Preprosto pogojno določate, kaj je v logičnem izrazu določeno in kaj ne (zelo poenostavljeno).

Sama osnova RDF (Resource Description Framework), nad katero se izvajajo poizvedbe SPARQL, je trojka object, predicate, subject - in poizvedba izbere zahtevane trojčke v skladu z določenimi omejitvami v duhu: poiščite X tako, da je p_55(X, q_33) resničen - kjer je seveda p_55 neke vrste relacija z ID 55, q_33 pa je objekt z ID 33 (tukaj in cela zgodba, spet izpuščeno vse mogoče podrobnosti).

Primer predstavitve podatkov:

Opombe podatkovnega znanstvenika: prilagojen pregled jezikov podatkovnih poizvedb
Slike in primer z državami tukaj zato.

Primer osnovne poizvedbe

Opombe podatkovnega znanstvenika: prilagojen pregled jezikov podatkovnih poizvedb

Pravzaprav želimo najti vrednost spremenljivke ?country tako, da za predikat
member_of, res je, da je member_of(?country,q458) in q458 ID Evropske unije.

Primer prave poizvedbe SPARQL znotraj motorja python:

Opombe podatkovnega znanstvenika: prilagojen pregled jezikov podatkovnih poizvedb

Običajno sem moral prebrati SPARQL, namesto da bi ga napisal - v tej situaciji bi bilo verjetno koristno razumeti jezik vsaj na osnovni ravni, da bi natančno razumeli, kako se podatki pridobivajo. 

Na spletu je veliko gradiva za študij: na primer tukaj ta и ta. Običajno v Googlu poiščem posebne modele in primere in to je za zdaj dovolj.

Jeziki logičnih poizvedb

Več o temi si lahko preberete v mojem članku tukaj. In tukaj bomo le na kratko preučili, zakaj so logični jeziki zelo primerni za pisanje poizvedb. V bistvu je RDF samo nabor logičnih izjav v obliki p(X) in h(X,Y), logična poizvedba pa ima naslednjo obliko:

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

Tu govorimo o ustvarjanju novega predikatnega izhoda/1 (/1 pomeni unarni), pod pogojem, da za X velja, da država(X) - tj. X je država in tudi članica(X,"EU").

Se pravi, da so v tem primeru tako podatki kot pravila predstavljeni na enak način, kar nam omogoča zelo enostavno in dobro modeliranje problemov.

Kje v industriji ste se srečali?: cel velik projekt s podjetjem, ki piše poizvedbe v takem jeziku, pa tudi na trenutnem projektu v jedru sistema - zdi se, da je to precej eksotična stvar, a včasih se zgodi.

Primer fragmenta kode v logičnem jeziku, ki obdeluje wikipodatke:

Opombe podatkovnega znanstvenika: prilagojen pregled jezikov podatkovnih poizvedb

Materiali: tukaj bom dal nekaj povezav do sodobnega logičnega programskega jezika Answer Set Programming - priporočam, da ga preučite:

Opombe podatkovnega znanstvenika: prilagojen pregled jezikov podatkovnih poizvedb

Vir: www.habr.com

Dodaj komentar