Andmeuurija mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringukeeltest

Andmeuurija mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringukeeltest
Jag rÀÀgin isiklikest kogemustest, millal ja kus miski on kasulik olnud. Ülevaatlikult ja teesidena, et oleks aru saada, mida ja kuhu edasi uurida — aga see on puhtalt minu subjektiivne isiklik kogemus, teil vĂ”ib kĂ”ik olla sootuks teine.

Miks on oluline teada ja osata kĂ€sitleda pĂ€ringukeeli? Andmeteaduses on mitmeid olulisi tööetappe ning esimene ja tĂ€htsaim (ilma selleta ei toimi tĂ”epoolest mitte midagi!) — andmete saamine vĂ”i vĂ€ljavĂ”tmine. KĂ”ige sagedamini asuvad andmed mingis vormis kuskil ja neid tuleb sealt 'vĂ€lja tĂ”mmata'. 

PĂ€ringukeeled just aitavadki neid andmeid vĂ€lja vĂ”tta! Ja tĂ€na rÀÀgin ma neist pĂ€ringukeeltest, mis mul on kasulikud olnud, ning nĂ€itan, kus ja kuidas tĂ€pselt — miks on vajalik neid Ă”ppida.

Kokku on kolm pĂ”hiblokki andmete pĂ€ringute tĂŒĂŒpe, mida me selles artiklis kĂ€sitleme:

  • „Standardsed“ pĂ€ringukeeled — need, mille kohta tavaliselt mĂ”eldakse, kui rÀÀgitakse pĂ€ringukeeltest, nagu nĂ€iteks relatsiooniline algebral vĂ”i SQL.
  • Skriptikeeled pĂ€ringute jaoks: nĂ€iteks Pythonis olevad vahendid pandas, numpy vĂ”i shell-i skriptimine.
  • PĂ€ringukeeled teadmiste graafide ja graafandmebaaside jaoks.

KĂ”ik, mis siin on kirjutatud, pĂ”hineb isiklikul kogemusel, mis on olnud kasulik, koos olukordade kirjelduse ja 'miks see oli vajalik' — igaĂŒks vĂ”ib end proovile panna, kuidas sellised olukorrad vĂ”iksid ette tulla ja proovida neile eelnevalt valmistuda, uurides neid keeli enne, kui tuleb neid (kĂ”ige kiiremas korras) rakendada projektis vĂ”i sattuda projektile, kus need on vajalikud.

„Standardsed“ pĂ€ringukeeled

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

Relatsiooniline algebra

Miks on tÀna vajalik relatsiooniline algebra? Selleks, et omada head ettekujutust, miks pÀringukeeled on korraldatud teatud viisil ja teadlikult neid kasutada, tuleb aru saada pÔhijÔududest, mis nende taga on.

Mis on relatsiooniline algebra?

Formaalne mÀÀratlus on jĂ€rgmine: relatsiooniline algebra — suletud sĂŒsteem operatsioone suhete ĂŒle relatsioonilises andmemudelis. Kui rÀÀkida inimsĂ”bralikumalt, siis on see sĂŒsteem operatsioone tabelite ĂŒle, nii et tulemuseks on alati ka tabel.

Vaata kĂ”iki relatsioonilisi operatsioone selle Habrist artiklis — siin me selgitame, miks on oluline teada ja kus seda rakendatakse.

Miks?

Sa hakkad aru saama, millest kĂŒsitluskeel koosneb ja millised toimingud on seotud konkreetsete kĂŒsitluskeelte mĂ”istetega — see annab sageli sĂŒgavamal tasandil arusaama sellest, kuidas kĂŒsitluskeeled toimivad.

Andmeuurija mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringukeeltest
VĂ”etud selle artiklist. NĂ€ide toimingust: join, mis ĂŒhendab tabeleid.

Õppematerjalid:

Hea sissejuhatav kursus Stanfordist. Üldiselt on relaatsiooni algebrast ja teooriast palju materjale — Coursera, Udacity. Samuti on internetis tohutult materjale, sealhulgas hĂ€id akadeemilisi kursusi. Minu isiklik nĂ”uanne: relaatsiooni algebra peab olema vĂ€ga hĂ€sti mĂ”istetud — see on aluspĂ”hi.

SQL

Andmeuurija mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringukeeltest
VÔetud selle artiklist.

SQL on oma olemuselt relaatsiooni algebrakohane rakendus — olulise erandiga, SQL on deklaratiivne! See tĂ€hendab, et kui kirjutad pĂ€ringu raja algebrakeeles, ĂŒtled sa sisuliselt, kuidas tuleks arvutada — kuid SQL-i puhul mÀÀratled, mida tahad vĂ€lja kahe ja seejĂ€rel genereerib DBMS juba (tĂ”husad) vĂ€ljendid raja algebra keeles (nende ekvivalents on meile teada kui Codd'i teoreem).

Andmeuurija mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringukeeltest
VÔetud selle artiklist.

Miks?

Relaatsioonilised DBMS-id: Oracle, Postgres, SQL Server jne — on endiselt praktiliselt igal pool ja on uskumatult suur vĂ”imalus, et pead nendega suhtlema, mis tĂ€hendab, et pead kas lugema SQL-i (mis on vĂ€ga tĂ”enĂ€oline) vĂ”i kirjutama seda (ka mitte ebatĂ”enĂ€oline).

Mida lugeda ja Ôppida

Samad linkid eespool (ralaatsiooni algebra kohta) sisaldavad tohutult materjali, nÀiteks see.

Muide, mis on NoSQL?

„On veel ĂŒks kord oluline rĂ”hutada, et termin „NoSQL” on tĂ€iesti orgaanilise pĂ€ritoluga ning sellel ei ole ĂŒldiselt tunnustatud mÀÀratlust ega teadusasutust, mis selle taga seisab.” Vastav artikkel Habrist.

Sisuliselt mĂ”istsid inimesed, et tĂ€ielik relaatsiooniline mudel ei ole paljude probleemide lahendamiseks vajalik, eriti seal, kus nĂ€iteks toodangutootlikkus on oluline ja domineerivad teatud lihtsad kĂŒsitlusd, kus on kriitiliselt oluline kiiresti mÔÔdikuid arvestada ja need andmebaasi kirjutada, ja enamus funksioone, mis on seotud relaationitega, osutusid mitte ainult mittevajalikeks, vaid isegi kahjulikeks — miks normaliseerida midagi, kui see rikub meie jaoks kĂ”ige olulisemat (konkreetse ĂŒlesande jaoks) — tootlikkust?

Samuti on sageli vajalikud paindlikud skeemid traditsiooniliste relatsiooniliste mudelite fikseeritud matemaatiliste skeemide asemel — ja see lihtsustab rakenduste arendamist, kui on kriitiline sĂŒsteemi kiiresti seadistada ja tööd alustada, töötades tulemusi — vĂ”i skeem ja salvestatud andmete tĂŒĂŒbid ei ole nii olulised.

NĂ€iteks loome ekspert sĂŒsteemi ja soovime salvestada teavet teatud domeeni kohta koos mĂ”ne metaandmega — me ei pruugi teada kĂ”iki vĂ€lju ja lihtsalt salvestame JSON-i iga kirje jaoks — see annab meile vĂ€ga painduva keskkonna andmemudeli laiendamiseks ja kiireks iteratsiooniks — seega on sellisel juhul NoSQL isegi eelistatavam ja loetavam. NĂ€ide kirjest (ĂŒhelt minu projektist, kus NoSQL oli just seal, kus see vajalik oli).

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

Rohkem infot saab lugeda siit NoSQL-i kohta.

Mida Ôppida?

Siin tuleb pigem lihtsalt pĂ”hjalikult analĂŒĂŒsida oma ĂŒlesannet, millised on selle omadused ja millised NoSQL sĂŒsteemid sobivad selle kirjelduse alla — ja siis tegeleda selle sĂŒsteemi Ă”ppimisega.

Skripti keeltes pÀringud

Esialgu tundub, et mis see Python siin ĂŒldse teeb — see on programmeerimiskeel, mitte pĂ€ringute keel.

Andmeuurija mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringukeeltest

  • Pandas on nagu Ć veitsi armee nuga andmeteaduses, tohutult palju andmete transformatsiooni, agregatsiooni jne toimub selles.
  • Numpy — vektorkalkulatsioonid, maatriksid ja lineaarne algebra seal.
  • Scipy — palju matemaatikat selles paketis, eriti statistika.
  • Jupyter lab — palju uurimistöö analĂŒĂŒsi sobib hĂ€sti mĂ€rkmikesse — kasulik osata.
  • Requests — töövĂ”rguga.
  • Pyspark — vĂ€ga populaarne andmeinseneride seas, tĂ”enĂ€oliselt peate te selle vĂ”i Sparkiga koostööd tegema, lihtsalt nende populaarsuse tĂ”ttu.
  • *Selenium — vĂ€ga kasulik andmete kogumiseks veebisaitidelt ja ressurssidelt, mĂ”nikord ei saa te lihtsalt teisiti andmeid kĂ€tte.

Minu peamine soovitus: Ôppige Pythonit!

Pandas

VÔtame nÀiteks jÀrgmise koodi:

import pandas as pd
df = pd.read_csv("data/dataset.csv")
# Arvuta ja nimeta agregatsioonid ĂŒmber
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 sobib klassikaliselt SQL mustrisse.

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

Kuid oluline osa on see, et see kood on osa skriptist ja torustikust; tegelikult integreerime pÀringud Python'i torustikku. Antud olukorras pÀringute keel tuleb meieni sellistest raamatutest nagu Pandas vÔi pySpark.

Üldiselt nĂ€eme pySpark'is sarnast tĂŒĂŒpi andmete transformatsiooni pĂ€ringu keele kaudu sellise vaimuga:

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

Kus ja mida lugeda

Pythoni kohta ĂŒldiselt pole probleem leidmaks Ă”ppematerjale. Internetis on tohutult palju Ă”petusi pandas, pySpark ja kursusi Spark (nagu ka kindlasti DS). Üldiselt on siin materjalid suurepĂ€raselt otsitavad ja kui peaksin valima ĂŒhe paketi, millele keskenduda — siis oleks see kindlasti pandas. DS+Python seose kohta on samuti vĂ€ga palju.

Shell kui pÀringu keel

Palju projekte andmete töötlemiseks ja analĂŒĂŒsiks, millega olen kokku puutunud — need on sisuliselt shell skriptid, mis kĂ€ivitavad koodi Python'is, javasse ja tegelikult ka shell kĂ€sklused. SeetĂ”ttu vĂ”ib torustikke bash'i/zsh'i/jne. kontekstis kĂ€sitleda kui mingit kĂ”rgetasemelist pĂ€ringut (seal saab muidugi ka tsĂŒkleid kasutada, aga see ei ole tĂŒĂŒpiline DS kood shell keeltes), toome vĂ€lja lihtsa nĂ€ite — mul oli vaja teha QID mappimise Vikipeedia ja tĂ€ieliku lingi jaoks vene ja inglise Vikis, selle jaoks kirjutasin lihtsa pĂ€ringu bash'i kĂ€skudest ja vĂ€ljundi jaoks kirjutasin lihtsa Python skripti, mille seotud kokku jĂ€rgmiselt:

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 genereeris vajalikku mappimist; nagu nĂ€eme, töötas kĂ”ik voogesituse reĆŸiimis:

  • pv filepath — nĂ€itab edusammude baar, mis pĂ”hineb faili suurusel ja edastab selle sisu edasi
  • unpigz -c luges osa arhiivist ja andis selle edasi jq-le
  • jq vĂ”ti — stream andis kohe tulemuse vĂ€lja ja edastas selle postprotsessorile (nagu ka kĂ”ige esimese nĂ€ite puhul) Python'is
  • postprotsessor on sisuliselt lihtsalt olekute masin, mis vormindas vĂ€ljundi 

KokkuvĂ”ttes keeruline voolupipe, mis töötab suurte andmete (0.5TB) reĆŸiimis, ilma mĂ€rkimisvÀÀrsete ressurssideta ning on koostatud lihtsast voolupipest ja paarist tööriistast.

Veel ĂŒks oluline nĂ€punĂ€ide: osake hĂ€sti ja tĂ”husalt kasutada terminali ning kirjutada bash/zsh/ jne.

Kus see vajalik on? Peaaegu igal pool — Ă”ppematerjali on veebis ÜLI palju. Eriti just siit see minu eelmine artikkel.

R skriptimine

JĂ€lle vĂ”ib lugeja hĂŒĂŒda — see on ju terviklik programmeerimiskeel! Ja ta on kindlasti Ă”ige. Kuid tavaliselt olen ma R-iga kokku puutunud sellistes kontekstides, kus see sarnanes pigem pĂ€ringukeelega.

R on statistiliste arvutuste keskkond ja statistiliste arvutuste ja visualiseerimise keel (vastavalt sellele).

Andmeuurija mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringukeeltest
VÔetud siit. Muide, soovitan, hea materjal.

Miks peab andmete teadlane R-i teadma? Esiteks seepĂ€rast, et on tohutu hulk inimesi, kes ei ole IT-sektorist, kuid tegelevad andmete analĂŒĂŒsiga R-is. Olen kokku puutunud jĂ€rgmistes valdkondades:

  • Farmaatsiatööstus.
  • Bioloogid.
  • Rahandusvaldkond.
  • Loodusteaduste haridusega inimesed, kes tegelevad statistikaga.
  • Spetsialiseeritud statistilised mudelid ja masinĂ”ppe mudelid (mida sageli leidub vaid autori versioonis R-paketina).

Miks on see tegelikult pĂ€ringukeel? Selles vormis, milles see sageli esineb, on see tegelikult pĂ€ring mudeli loomise kohta, sealhulgas andmete lugemine ja pĂ€ringu (mudeli) parameetrite mÀÀramine, samuti andmete visualiseerimine sellistes paketides nagu ggplot2 — see on samuti vorm pĂ€ringute kirjutamiseks.

NÀide visualiseerimise pÀringutest

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

KokkuvĂ”ttes on paljusid ideid R-ist ĂŒle vĂ”etud Python-i pakettidesse, nagu pandas, numpy vĂ”i scipy, nagu andmeraamid ja andmete vektorisalad — seetĂ”ttu tunduvad paljusid asju R-is teile tuttavad ja mugavad.

Õppematerjale on palju, nĂ€iteks see.

Teadmiste graaf (Knowledge graph)

Siin on mul veidi ebatavaline kogemus, kuna ma pean ĂŒsna tihti töötama teadmusgraafide ja graafide pĂ€ringukeeltega. SeetĂ”ttu lĂ€bime kiiresti pĂ”hitĂ”ed, kuna see osa on veidi eksootilisem.

Klassikalistes relatsioonilistes andmebaasides on meil fikseeritud skeem — siin on skeem paindlik, iga predikaat on sisuliselt "veerg" ja isegi rohkem.

Kujutage ette, et modelleerinud inimest ja soovitud kirjeldada vÔtmeasju, nÀiteks vÔtame konkreetse inimese Douglas Adamsi ja kasutame selleks jÀrgmist kirjeldust.

Andmeuurija mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringukeeltest
www.wikidata.org/wiki/Q42

Kui me oleksime kasutanud relatsioonilist andmebaasi, oleksime pidanud looma tohutu tabeli vĂ”i tabelid tohutu hulga veergudega, millest enamik oleks NULL vĂ”i tĂ€idetud mingi vaikse False vÀÀrtusega, nĂ€iteks on kahtlemata vĂ€he inimesi, kellel on kirje riiklikus Korea raamatukogus — loomulikult vĂ”iksime need eraldi tabelitesse viia, kuid see oleks lĂ”puks ikka katse modelleerida paindlikku loogilist skeemi predikaatidega, kasutades fikseeritud relatsioonilist.

Andmeuurija mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringukeeltest
Seega kujutage ette, et kÔik andmed on salvestatud graafina vÔi binaarsete ja unaarsete loogiliste vÀljenditena.

Kus te ĂŒldse sellise olukorraga kokku puutute? Esiteks tegeledes wikipedia andmetega, ja ka mis tahes graafipĂ”histe andmebaaside vĂ”i seotud andmetega.

JÀrgmiseks on pÔhilised pÀringukeel, mida olen pidanud kasutama ja millega olen töötanud.

SPARQL

Wiki:
SPARQL (rekursiivne akronĂŒĂŒm alates inglise. SPARQL Protocol and RDF Query Language) — andmete pĂ€ringukeel, mis esitatakse mudelis RDF, samuti protokoll selle pĂ€ringute edastamiseks ja nendele vastamiseks. SPARQL on W3C konsortsiumi soovitus ja ĂŒks tehnoloogia semantilise vĂ”rgu Tegelikult on see pĂ€ringukeel loogiliste unaarsete ja binaarsete predikaatide jaoks. Lihtsalt mÀÀratakse, mis on loogilises vĂ€ljendis fikseeritud ja mis mitte (vĂ€ga lihtsustatult)..

Isegi RDF (Resource Description Framework) andmebaas, mille ĂŒle SPARQL pĂ€ringud teostatakse — see on kolmik

objekt, predikaat, subjekt — ja pĂ€ring valib vajalikud kolmikud mÀÀratud piirangute alusel, nagu: leida selline X, et p_55(X, q_33) on tĂ”ene — kus p_55 on mingi suhe ID-ga 55 ja q_33 on objekt ID-ga 33 (ja see on kogu lugu, jĂ€ttes kĂ”rvale erinevad ĂŒksikasjad). Andmete esitlemise nĂ€ide:

Pildid ja nÀide riikidest on siin

Andmeuurija mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringukeeltest
PÔhirikka pÀringu nÀide siit.

Tegelikult tahame leida muutuja vÀÀrtust ?country, nii et predikaadi

Andmeuurija mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringukeeltest

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

NÀide reaalsetest SPARQL pÀringutest Pythonis:

Andmeuurija mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringukeeltest

Reeglina olen pidanud SPARQLi lugema, mitte kirjutama - sellises olukorras on tÔenÀoliselt kasulik osata keelt vÀhemalt pÔhimÔtteliselt, et mÔista, kuidas andmeid vÀljaspoolt kÀtte saadakse. 

Internetis on palju materjale Ôppimiseks: nÀiteks, siin on see ja see. Mina otsin tavaliselt konkreetseid konstruktsioone ja nÀiteid Google'ist ja seni on sellest piisavalt.

Loogilised pÀringukeeled

Teemast saab rohkem lugeda minu artiklist siit. Siin kĂ€sitleme ĂŒlevaatlikult, miks loogilised keeled sobivad hĂ€sti pĂ€ringute kirjutamiseks. Tegelikult on RDF lihtsalt loogiliste vĂ€idete kogum, nĂ€iteks p(X) ja h(X,Y), ning loogiline pĂ€ring nĂ€eb vĂ€lja jĂ€rgmine:

output(X) :- country(X), member_of(X,"EU").

Siin loome uue predikaadi output/1 (1 tÀhendab unaarset), eeldusel, et X on tÔsi, et country(X) - ehk X on riik ja samas member_of(X,"EU").

See tĂ€hendab, et andmed ja reeglid on antud juhul esitatud tĂ€iesti ĂŒhtemoodi, mis vĂ”imaldab ĂŒlesandeid vĂ€ga lihtsalt ja hĂ€sti modelleerida.

Kus on kohanud tööstuses: suur projekt ettevĂ”ttega, mis kirjutab pĂ€ringuid sellisel keelel, ja ka praeguses projektis sĂŒsteemi tuumas - see vĂ”ib tunduda ĂŒsna eksootiline, kuid mĂ”nikord see siiski esineb.

NÀide loogilisel keelel pÔhinevast koodifragmendist, mis töötleb wikidata:

Andmeuurija mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringukeeltest

Materjalid: toon siin paar lingi kaasaegse loogilise programmeerimiskeele Answer Set Programming'ile - soovitan just selle uurimist:

Andmeuurija mĂ€rkmed: isiklik ĂŒlevaade pĂ€ringukeeltest

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster