Andmete teadlase mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringute keeltest

Andmete teadlase mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringute keeltest
Jag rÀÀgin oma kogemusest, kus ja millal midagi kasulikku leidsin. Ülevaatlikult ja lĂŒhidalt, et oleks arusaadav, mida ja kuhu edasi uurida — kuid see on ainult minu subjektiivne kogemus, teil vĂ”ib olla kĂ”ik tĂ€iesti teistmoodi.

Miks on oluline teada ja osata kasutada pÀringukeeli? Data Science'is on mitmeid olulisi tööetappe, kus kÔige esimene ja olulisem (ilma selleta ei toimi midagi!) on andmete hankimine vÔi vÀljavÔtmine. KÔige sagedamini on andmed mingis vormis kusagil peidus ja need tuleb sealt "vÀlja tuua". 

PĂ€ringukeeled just vĂ”imaldavad neid andmeid vĂ€lja tĂ”mmata! TĂ€na rÀÀgin nendest pĂ€ringukeeltest, mis on mulle kasulikud olnud, ja nĂ€itan, kus ja kuidas — miks on vajalik nende Ă”ppimine.

Kokku on kolm peamist tĂŒĂŒpi pĂ€ringute blokki, mida me selles artiklis kĂ€sitleme:

  • "Standardsed" pĂ€ringukeeled — need, mida tavaliselt mĂ”istetakse rÀÀgides pĂ€ringukeeltest, nagu nĂ€iteks relatsiooniline algebra vĂ”i SQL.
  • Skripti pĂ€ringukeeled: nĂ€iteks Pythonis kasutatavad pandas, numpy vĂ”i shell scripting.
  • PĂ€ringukeeled teadmiste graafide ja graafandmebaaside jaoks.

KĂ€esolevas kirjutises esitatud on lihtsalt isiklik kogemus, mis osutus kasulikuks, olukordadega ja "miks see vajalik oli" — igaĂŒks vĂ”ib proovida ette kujutada, kui sarnased olukorrad talle ette vĂ”ivad tulla ning valmistuda neiseks ette, uurides neid keeli enne, kui peab neid (kiireloomuliselt) projektis rakendama vĂ”i ĂŒldse sattuma projekti, kus neid vajatakse.

"Standardsed" pÀringukeeled

Standardsed pÀringukeeled just selles mÔttes, et me mÔtleme tavaliselt nendest, kui rÀÀgime pÀringutest.

Relatsiooniline algebra

Miks on tÀna vajalik relatsiooniline algebra? Selleks, et saada hea arusaam, miks pÀringukeeltes asjad on seadistatud teatud viisil, tuleb mÔista aluspÔhimÔtteid.

Mis on relatsiooniline algebra?

Formaalne mÀÀratlemine on jĂ€rgmine: relatsiooniline algebra — suletud operatsioonide sĂŒsteem suhete ĂŒle relatsioonilises andmemudelis. Inimkeeles öeldes, see on tabelite ĂŒle toimingute sĂŒsteem, mille tulemuseks on alati tabel.

Vaadake kĂ”iki relatsioonilisi toiminguid sellest artiklis Habrast — siin selgitame, miks on vajalik teada ja kus seda kasutatakse.

Miks?

Sa saad aru, millest tegelikult pĂ€ringukeelte keeled koosnevad ja millised toimingud seisavad nende konkreetses pĂ€ringukeeles ĂŒlesannete taga — see annab sageli sĂŒgavamal arusaama, mis ja kuidas pĂ€ringukeeltes töötab.

Andmete teadlase mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringute keeltest
VĂ”etud sellest artiklid. NĂ€ide toimingust: join, mis ĂŒhendab tabeleid.

Uurimismaterjalid:

Hea sissejuhatav kursus Stanfordist. Üldse, relatsioonilise algebra ja teooria kohta on palju materjale — Coursera, Udacity. Samuti on tohutult palju materjale veebis, sealhulgas hĂ€id akadeemilisi kursusi. Minu isiklik soovitus: peate relatsioonilist algebra hĂ€sti mĂ”istma — see on pĂ”hialus.

SQL

Andmete teadlase mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringute keeltest
VÔetud sellest artiklist.

SQL on tegelikult relatsioonilise algebraga seotud rakendus — oluliselt on SQL deklaratiivne! Toimides relatsioonilise algebraga, ĂŒtlete tegelikult, kuidas tuleb arvutada — aga SQL-iga mÀÀrate, mida soovite vĂ€lja vĂ”tta, ja seejĂ€rel genereerib andmebaasihaldussĂŒsteem (tĂ”husad) avaldused relatsioonilise algebraga ( nende ekvivalentsust tuntakse meile) Codd'i teoreemi all).

Andmete teadlase mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringute keeltest
VÔetud sellest artiklist.

Miks?

Relatsioonilised andmebaasid: Oracle, Postgres, SQL Server jne — on endiselt peaaegu igal pool ja on tohutult suur vĂ”imalus, et peate nendega suhtlema, mis tĂ€hendab, et peate kas lugema SQL-i (mis on vĂ€ga tĂ”enĂ€oline) vĂ”i kirjutama seda (ka mitte ebatĂ”enĂ€oline).

Mida lugeda ja uurida

Sama kaudu, mida linkides eespool (relatsioonilise algebraga), on palju materjale, nÀiteks seda.

Muide, mis on NoSQL?

"Tuleb veel kord rĂ”hutada, et termin "NoSQL" on tĂ€iesti spontaanselt tekkinud ja tal ei ole ĂŒldtunnustatud mÀÀratlust ega teaduslikku asutust selle selja taga." Vastav artikkel Habr's.

Inimesed said aru, et tĂ€ielik relatsiooniline mudel ei ole paljude probleemide lahendamiseks vajalik, eriti seal, kus nĂ€iteks on oluline jĂ”udlus ja domineerivad teatud lihtsad pĂ€ringud koos aggregeerimisega — seal on kriitiliselt oluline kiiresti arvestada mÔÔdikuid ja need andmetesse kirjutada, ning enamik relatsioonilise funksioone osutus mitte ainult mitte vajalikuks, vaid ka kahjulikuks — miks normaliseerida midagi, kui see rikub meie jaoks kĂ”ige olulisemat (konkreetse ĂŒlesande jaoks) — jĂ”udlust?

Samuti on sageli vajalikud paindlikud skeemid, mitte fikseeritud matemaatilised skeemid klassikalisest relatsioonilisest mudelist — ja see muudab rakenduste arendamise uskumatult lihtsamaks, kui on kriitiline sĂŒsteem kiiresti kĂ€ivitada ja alustada töötamist, töötades tulemusi — vĂ”i skeem ja salvestatavate andmete tĂŒĂŒbid ei ole nii olulised.

NĂ€iteks loome ekspertsĂŒsteemi ja soovime salvestada teavet teatud domeeni kohta koos mingisuguse metaandmetega — me ei pruugi teada kĂ”iki vĂ€lju ja saame lihtsalt salvestada iga kirje jaoks JSON-i — see annab meile vĂ€ga paindliku keskkonna andmemudeli laiendamiseks ja kiireks iteratsiooniks — seetĂ”ttu oleks sellisel juhul NoSQL isegi eelistatum ja loetavam. NĂ€ide kirjest (ĂŒhest minu projektist, kus NoSQL oli seal, kus seda tĂ”esti vajasime).

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

Lisainfot saab lugeda siin NoSQL-ist.

Mida Ôppida?

Siin tuleb pigem lihtsalt hĂ€sti analĂŒĂŒsida oma ĂŒlesannet, millised on selle omadused ja millised NoSQL-sĂŒsteemid sobivad sellele kirjeldusele — ja siis hakata seda sĂŒsteemi Ă”ppima.

PĂ€ringuskripti keeled

Esmalt tundub, et mis seondub ĂŒleĂŒldse Pythoniga — see on programmeerimiskeel, mitte pĂ€ringute keel.

Andmete teadlase mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringute keeltest

  • Pandas on tĂ”eliselt mitmekĂŒlgne tööriist andmete teaduses, tohutu hulga andmete teisendamine, agregatsioon ja nii edasi toimub seal.
  • Numpy — vektorkalkulatsioonid, maatriksid ja lineaarne algebra on seal.
  • Scipy — sisaldab palju matemaatikat, eriti statistikat.
  • Jupyter lab — palju uurimisandmete analĂŒĂŒsi sobitub hĂ€sti mĂ€rkmikesse — seda tasub osata.
  • Requests — veebi töötlemine.
  • Pyspark — vĂ€ga populaarne andmeinseneride seas, tĂ”enĂ€oliselt peate te koos töötama kas selle vĂ”i Sparkiga, lihtsalt nende populaarsuse tĂ”ttu.
  • *Selenium — vĂ€ga kasulik andmete kogumiseks veebisaitidelt ja allikatelt, mĂ”nikord on andmeid lihtsalt teisiti vĂ”imatu saada.

Minu peamine soovitus: Ôppige Pythonit!

Pandas

VÔtame nÀiteks jÀrgmise koodi:

import pandas as pd
df = pd.read_csv("data/dataset.csv")
# Arvutame ja nime jÀrgi muudame agregaate
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'}))

Sisuliselt nÀeme, et kood jÀrgib klassikalist SQL-mustrit.

SELECT start_station_name, end_station_name, count(trip_duration_seconds) as size, 
..
FROM dataset
WHERE trip_type = 'return'
GROUP BY start_station_name, end_station_name

Kuid oluline osa — see kood on osa skriptist ja torustikust, tegelikult integreerime pĂ€ringud Python'i torustikku. Selles olukorras pĂ€ringukeel tuleb meile raamatukogudest, nagu Pandas vĂ”i pySpark.

Üldiselt pySparkis nĂ€eme sarnast tĂŒĂŒpi andmete transformatsiooni pĂ€ringukeele kaudu, nĂ€iteks:

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

Kus ja mida lugeda

Kuna iseenesest Pythonis pole probleem leida Ă”ppematerjale. Internetis on tohutult palju Ă”petusi pandas, pySparkile ja kursusi (ka ise Spark (ja samuti kĂ”ige DS). Üldiselt on siin materjalid suurepĂ€raselt leitavad ja kui peaksin valima ĂŒhe paketi, millele keskenduda — siis oleks see just pandas, muidugi. DS+Python seosest on ka vĂ€ga palju materjale..

Shell pÀringukeelena

Palju andmeanalĂŒĂŒsi ja töötlemise projekte, millega olen tegelenud — need on sisuliselt shell-skriptid, mis kutsuvad esile koodi Pythonis, Java's ja shell-komandeid. SeetĂ”ttu vĂ”ib torustikke bash/zsh/ jne. vaadelda kui mingit kĂ”rgema taseme pĂ€ringut (seal on muidugi vĂ”imalik ka silmusid kasutada, kuid see ei ole tĂŒĂŒpiline DS koodi puhul shelli keeltes), toome lihtsa nĂ€ite — mul oli vaja teha QID mapping Wikidata ja tĂ€islinke vene ja inglise viki jaoks, selleks kirjutasin lihtsalt kĂ€skluste pĂ€ringu bashis ja vĂ€ljastamiseks kasutasin lihtsat Python'i skripti, mille kokku panin nagu nii:

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

kus

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

See oli sisuliselt kogu torustik, mis lĂ”i vajaliku mappingu, nagu me nĂ€eme, kĂ”ik töötas voogesituse reĆŸiimis:

  • pv filepath — annab edusammu ribaga pĂ”hinevalt faili suurusest ja edastab oma sisu edasi
  • unpigz -c luges osa arhiivist ja edastas selle jq-le
  • jq vĂ”tmega — stream edastas kohe tulemuse ja edastas selle post-protsessorile (nagu ka esimese nĂ€ite puhul) Python'is
  • post-protsessor on seespool lihtne olekuma, mis vormindas vĂ€ljundi 

Seega keeruline torustik, mis töötab voogesituse reĆŸiimis suurte andmemahtude juures (0.5TB), ilma oluliste ressurssideta ja loodud lihtsalt kerge torustiku ja paari tööriistaga.

Veel oluline nÔuanne: osake hÀsti ja tÔhusalt töötama terminalis ning kirjutama bash/zsh/jne.

Kus seda vaja lĂ€heb? Praktiliselt igal pool — Ă”ppematerjale on veebis samuti ÜLI palju. Eriti, siin on seda minu eelmine artikkel.

R skriptimine

JĂ€llegi vĂ”ib lugeja hĂŒĂŒatada — noh, see on ju terve programmeerimiskeel! Ja tal on kindlasti Ă”igus. Siiski olen enamasti kokku puutunud R-iga kontekstis, kus see sarnanes pigem pĂ€ringukeeles.

R on statistikaarvutuste keskkond ja statistilise arvutamise ja visualiseerimise keeles (vastavalt seda).

Andmete teadlase mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringute keeltest
VÔetud siit. Muide, soovitan, hea materjal.

Miks peab andeteadlane R-i teadma? VĂ€hemalt seetĂ”ttu, et on tohutult inimesi, kes ei vasta IT-le ja teevad R-is andmeanalĂŒĂŒsi. Olen seda kohanud jĂ€rgmistes kohtades:

  • Farmatseutiline sektor.
  • Bioloogid.
  • FinantssĂŒsteem.
  • Inimesed, kellel on rangelt matemaatiline haridus ja kes tegelevad statistikaga.
  • Spetsialiseeritud statistilised mudelid ja masinĂ”ppe mudelid (mida sageli leidub ainult autori versioonis R-pakendina).

Miks on see tegelikult pĂ€ringukeel? Nagu see tihti esineb — see on tegelikult pĂ€ring mudeli loomiseks, sealhulgas andmete lugemine ja pĂ€ringu (mudeli) parameetrite fikseerimine ning andmete visualiseerimine sellistes pakettides nagu ggplot2 — see on ka pĂ€ringu kirjutamise vorm.

Visualiseerimiseks pÀringud

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

Üldiselt on paljusid R-i ideid ĂŒle viidud Pythonis olevatesse pakettidesse, nagu pandas, numpy vĂ”i scipy, nagu andmeraamid ja andmete vektoreerimine — seega tunduvad paljud asjad R-is teile tuttavad ja mugavad.

Õppematerjale on palju, nĂ€iteks seda.

Teadmiste graafid (Knowledge graph)

Siin on mul veidi ebatavaline kogemus, sest pean ĂŒsna sageli töötama teadmiste graafide ja nende pĂ€ringukeeltega. Seega kĂ€ime lĂ”petuseks kiiresti lĂ€bi pĂ”hialused, kuna see osa on veidi eksootilisem.

Klassikalistes relatsioonilistes andmebaasides on meil fikseeritud skeem — siin on skeem aga paindlik, iga predikaat on tegelikult "veerg" ja veel rohkem.

Kujutage ette, et modelleerisite inimest ja soovite kirjeldada olulisi aspekte, nÀiteks vÔtame konkreetselt Douglas Adamsi, lÀhtudes jÀrgmisest kirjeldusest.

Andmete teadlase mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringute keeltest
www.wikidata.org/wiki/Q42

Kui kasutaksime relatsioonilisi andmeid, peaksime looma tohutu tabeli vĂ”i tabelid tohutu arvu veergudega, kus enamik oleks NULL vĂ”i tĂ€idetud mingite vaikimisi vale vÀÀrtustega, nĂ€iteks ei ole ilmselt paljude meist sissekannet riiklikus Korea raamatukogus — muidugi vĂ”iksime need eraldi tabelitesse viia, kuid see oleks lĂ”ppkokkuvĂ”ttes katse modelleerida paindlik loogilise skeemiga predikaate, kasutades fikseeritud relatsioonilisi.

Andmete teadlase mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringute keeltest
Kujutage seega ette, et kÔik andmed on salvestatud graafina vÔi binaarsete ja unaarsete loogiliste vÀljenditena.

Kus te sellise asjaga kokku pÔrkate? Esiteks, töötades vikandme, samuti kÔikide graafide andmebaaside vÔi seotud andmete puhul.

Edasi tulevad peamised pÀringu keeled, millega olen kokku puutunud ja millega olen pidanud töötama.

SPARQL

Wiki:
SPARQL (rekursiivne akronĂŒĂŒm alates ingl. SPARQL Protocol and RDF Query Language) — andmete pĂ€ringukeel, mis on esitatud mudeli kohaselt, nende pĂ€ringute ja vastuste edastamiseks. SPARQL on W3C konsortsiumi soovitus RDF, samuti protokoll ja ĂŒks tehnoloogiatest semantilises veebis. Tegelikult on see pĂ€ringukeel loogiliste unaarsete ja binaarsete predikaatide jaoks. Te lihtsalt mÀÀrate tinglikult, mis on loogilises vĂ€ljendis fikseeritud ja mis mitte (vĂ€ga lihtsustatult). Ise RDF (Resource Description Framework), millel SPARQL pĂ€ringud kĂ€ivad — see on kolmik.

object, predicate, subject

— ja pĂ€ring valib vajalikud kolmikud toodud piirangute pĂ”hjal, mis tĂ€hendab: leida selline X, et p_55(X, q_33) on tĂ”ene — kus loomulikult p_55 on mingi suhe ID 55, ja q_33 on objekt ID 33 (see on kogu jutt, samuti jĂ€ttes kĂ”rvale kĂ”ik ĂŒmbritsevad detailid). Andmete esitamise nĂ€ide: Pildid ja nĂ€ide maadest on siin

PÔhipÀringu nÀide

Andmete teadlase mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringute keeltest
Tegelikult tahame leida muutuja ?country vÀÀrtust, nii et predikaadi siit.

member_of on tÔene, et member_of(?country,q458), ja q458 on Euroopa Liidu ID.

Andmete teadlase mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringute keeltest

Reaalse SPARQL pÀringu nÀide Pythonis:
Reeglina olen ma pidanud lugema SPARQL-i, mitte kirjutama — sellistes olukordades on tĂ”enĂ€oliselt kasulik osata keelt vĂ€hemalt pĂ”hiliselt, et mĂ”ista, kuidas andmeid tĂ€pselt vĂ€lja tĂ”mmatakse.

Internetis on palju Ôppematerjale: nÀiteks siin on

Andmete teadlase mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringute keeltest

Reeglina olen pidanud lugema SPARQL-i, mitte kirjutama — sellises olukorras on tĂ”enĂ€oliselt kasulik osata keelt vĂ€hemalt baas-toe tasemel, et mĂ”ista, kuidas andmeid tĂ€pselt ekstraktitakse. 

Veebis on palju Ôppematerjale: nÀiteks, siin on seda ja seda. Tavaliselt otsin spetsiifilisi konstruktsioone ja nÀiteid Googlest ning see on seni piisav.

Loogilised pÀringuvahendid

Lisainfot teema kohta leiate minu artiklist siin. Siin kĂ€sitleme vaid lĂŒhidalt, miks loogilised pĂ€ringuvahendid sobivad pĂ€ringute kirjutamiseks. Sisuliselt on RDF lihtsalt loogiliste vĂ€idete kogum, nĂ€iteks p(X) ja h(X,Y), ja loogiline pĂ€ring on sellise vormiga:

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

Siin loome uue predikaadi output/1 (/1 — tĂ€hendab ĂŒhemĂ”ttelist), tingimusel, et X jaoks kehtib, et country(X) — st, X on riik ja samuti member_of(X,“EU”).

Seega on meil andmed ja reeglid sellisel puhul esindatud tĂ€ielikult ĂŒhtmoodi, mis vĂ”imaldab ĂŒlesannete modelleerimist vĂ€ga lihtsalt ja hĂ€sti.

Kus oleme tööstuses kokku puutunud: suur projekt ettevĂ”ttega, kes kirjutab sellise keele pĂ€ringuid, samuti praeguses projektis sĂŒsteemi tuumas — nĂ€iliselt ĂŒsna eksootiline, kuid aeg-ajalt esineb.

Loogilisel keelel pÔhinev koodifragmendi nÀide, mis töötleb wikidata:

Andmete teadlase mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringute keeltest

Materjalid: tutvustan siin paar linki tĂ€napĂ€eva loogilisele programmeerimiskeelele Answer Set Programming — soovitan just seda uurida:

Andmete teadlase mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringute keeltest

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster