Duomenų mokslininko pastabos: suasmeninta duomenų užklausų kalbų apžvalga

Duomenų mokslininko pastabos: suasmeninta duomenų užklausų kalbų apžvalga
Iš asmeninės patirties sakau, kas kur ir kada buvo naudinga. Tai apžvalga ir disertacija, kad būtų aišku, ką ir kur galite kasti toliau - bet čia aš turiu išskirtinai subjektyvią asmeninę patirtį, galbūt jums viskas yra visiškai kitaip.

Kodėl svarbu žinoti ir mokėti naudoti užklausų kalbas? Iš esmės duomenų mokslas turi keletą svarbių darbo etapų, o pats pirmasis ir svarbiausias (be jo tikrai niekas neveiks!) yra duomenų gavimas arba išgavimas. Dažniausiai duomenys kažkur sėdi tam tikra forma ir juos reikia iš ten „gauti“. 

Užklausų kalbos leidžia išgauti būtent šiuos duomenis! Ir šiandien aš jums papasakosiu apie tas užklausų kalbas, kurios man buvo naudingos, ir pasakysiu bei parodysiu, kur ir kaip tiksliai – kodėl to reikia mokytis.

Bus trys pagrindiniai duomenų užklausų tipų blokai, kuriuos aptarsime šiame straipsnyje:

  • „Standartinės“ užklausų kalbos yra tai, kas paprastai suprantama kalbant apie užklausos kalbą, pvz., reliacinė algebra arba SQL.
  • Scenarijų sudarymo užklausų kalbos: pavyzdžiui, Python things pandas, numpy arba apvalkalo scenarijai.
  • Žinių grafikų ir grafikų duomenų bazių užklausų kalbos.

Viskas, kas čia parašyta, yra tik asmeninė patirtis, kas buvo naudinga, su situacijų aprašymu ir „kodėl to reikėjo“ – kiekvienas gali išbandyti, kaip panašios situacijos gali užklupti jūsų kelią ir bandyti joms pasiruošti iš anksto suprasdamas šias kalbas. ​prieš jums teks (skubiai) pateikti paraišką dėl projekto ar net patekti į projektą, kur jų reikia.

„Standartinės“ užklausų kalbos

Standartinės užklausų kalbos yra būtent ta prasme, kad dažniausiai apie jas galvojame kalbėdami apie užklausas.

Reliacinė algebra

Kodėl šiandien reikalinga reliacinė algebra? Kad gerai suprastumėte, kodėl užklausų kalbos yra tam tikra struktūra, ir jas sąmoningai naudotumėte, turite suprasti jų esmę.

Kas yra reliacinė algebra?

Formalus apibrėžimas yra toks: reliacinė algebra yra uždara santykių operacijų sistema reliaciniame duomenų modelyje. Žmogiškiau tariant, tai yra operacijų su lentelėmis sistema, kad rezultatas visada būtų lentelė.

Peržiūrėkite visas reliacines operacijas tai straipsnis iš Habr – čia aprašome, kodėl reikia žinoti ir kur tai praverčia.

Kodėl?

Pradėjus suprasti, kas yra užklausų kalbos ir kokios operacijos yra už išraiškų konkrečiomis užklausų kalbomis, dažnai leidžia geriau suprasti, kas ir kaip veikia užklausų kalbomis.

Duomenų mokslininko pastabos: suasmeninta duomenų užklausų kalbų apžvalga
Paimta iš tai straipsniai. Operacijos pavyzdys: join, kuris sujungia lenteles.

Medžiaga studijoms:

Geras įvadinis kursas iš Stanfordo. Apskritai, yra daug medžiagos apie reliacinę algebrą ir teoriją - Coursera, Udacity. Taip pat internete yra daug medžiagos, įskaitant gerą akademiniai kursai. Mano asmeninis patarimas: reikia labai gerai suprasti reliacinę algebrą – tai yra pagrindų pagrindas.

SQL

Duomenų mokslininko pastabos: suasmeninta duomenų užklausų kalbų apžvalga
Paimta iš tai straipsniai.

SQL iš esmės yra reliacinės algebros įgyvendinimas – su svarbiu įspėjimu SQL yra deklaratyvus! Tai yra, kai rašote užklausą reliacinės algebros kalba, jūs iš tikrųjų sakote, kaip skaičiuoti, bet su SQL nurodote, ką norite išgauti, ir tada DBVS jau generuoja (efektyvias) išraiškas reliacinės algebros kalba (jų lygiavertiškumas mums žinomas kaip Coddo teorema).

Duomenų mokslininko pastabos: suasmeninta duomenų užklausų kalbų apžvalga
Paimta iš tai straipsniai.

Kodėl?

Reliacinės DBVS: Oracle, Postgres, SQL Server ir tt vis dar yra beveik visur ir yra neįtikėtinai didelė tikimybė, kad turėsite su jomis bendrauti, o tai reiškia, kad turėsite arba skaityti SQL (tai labai tikėtina), arba rašyti ( taip pat mažai tikėtina).

Ką skaityti ir mokytis

Remiantis tomis pačiomis aukščiau pateiktomis nuorodomis (apie reliacinę algebrą), yra neįtikėtinai daug medžiagos, pavyzdžiui, tai.

Beje, kas yra NoSQL?

„Verta dar kartą pabrėžti, kad terminas „NoSQL“ yra absoliučiai spontaniškas ir už jo nėra visuotinai priimto apibrėžimo ar mokslinės institucijos. Atitinkamas straipsnis apie Habr.

Tiesą sakant, žmonės suprato, kad norint išspręsti daugelį problemų nereikia viso santykio modelio, ypač tiems, kur, pavyzdžiui, našumas yra labai svarbus ir dominuoja tam tikros paprastos užklausos su agregavimu – kai labai svarbu greitai apskaičiuoti metrikas ir įrašyti jas į duomenų bazės, o dauguma funkcijų yra reliacinės pasirodė ne tik nereikalingos, bet ir žalingos – kam kažką normalizuoti, jei tai sugadins mums svarbiausią dalyką (kažkokiai konkrečiai užduočiai) – produktyvumą?

Be to, dažnai reikalingos lanksčios schemos, o ne fiksuotos matematinės klasikinio reliacinio modelio schemos – tai neįtikėtinai supaprastina programų kūrimą, kai labai svarbu įdiegti sistemą ir greitai pradėti dirbti, apdoroti rezultatus – arba saugomų duomenų schemą ir tipus. nėra tokie svarbūs.

Pavyzdžiui, kuriame ekspertų sistemą ir norime saugoti informaciją konkrečiame domene kartu su metainformacija – galime nežinoti visų laukų ir tiesiog kiekvienam įrašui saugome JSON – tai suteikia mums labai lanksčią aplinką duomenims plėsti. modelio ir greitai kartojasi – taigi šiuo atveju NoSQL bus net pageidautina ir lengviau skaitoma. Įrašo pavyzdys (iš vieno iš mano projektų, kur NoSQL buvo ten, kur reikėjo).

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

Galite paskaityti daugiau čia apie NoSQL.

Ką studijuoti?

Čia jums tiesiog reikia nuodugniai išanalizuoti savo užduotį, kokias jos savybes ir kokias NoSQL sistemas galima rasti, kurios atitiktų šį aprašymą – ir tada pradėti studijuoti šią sistemą.

Skriptų užklausų kalbos

Iš pradžių atrodo, ką Python turi su juo apskritai - tai programavimo kalba, o ne apie užklausas.

Duomenų mokslininko pastabos: suasmeninta duomenų užklausų kalbų apžvalga

  • Pandos tiesiogine prasme yra Šveicarijos armijos duomenų mokslo peilis, jame vyksta didžiulis duomenų transformavimas, agregavimas ir pan.
  • Numpy – ten vektoriniai skaičiavimai, matricos ir tiesinė algebra.
  • Scipy – šiame pakete yra daug matematikos, ypač statistikos.
  • Jupyter laboratorija – daug tiriamųjų duomenų analizės puikiai tinka nešiojamiesiems kompiuteriams – naudinga žinoti.
  • Užklausos – darbas su tinklu.
  • Pyspark yra labai populiarus tarp duomenų inžinierių, greičiausiai jums teks bendrauti su šiuo ar „Spark“ vien dėl jų populiarumo.
  • *Selenas – labai naudingas renkant duomenis iš svetainių ir išteklių, kartais tiesiog nėra kito būdo gauti duomenis.

Mano pagrindinis patarimas: išmok Python!

Pandas

Paimkime šį kodą kaip pavyzdį:

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

Iš esmės matome, kad kodas atitinka klasikinį SQL modelį.

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

Tačiau svarbi dalis yra tai, kad šis kodas yra scenarijaus ir konvejerio dalis; iš tikrųjų mes įterpiame užklausas į Python dujotiekį. Esant tokiai situacijai, užklausos kalba gaunama iš bibliotekų, tokių kaip Pandas ar pySpark.

Apskritai, „pySpark“ matome panašaus tipo duomenų transformaciją naudojant užklausos kalbą pagal:

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

Kur ir ką skaityti

Apie patį Pythoną apskritai ne bėda rasti medžiagos studijoms. Internete yra daugybė pamokų panda, pySpark ir kursai Sukelti (ir savaime DS). Apskritai, čia esantis turinys puikiai tinka „Google“ paieškai, o jei turėčiau pasirinkti vieną paketą, į kurį norėčiau atkreipti dėmesį, tai, žinoma, būtų pandos. Taip pat dėl ​​DS + Python medžiagų derinio daug.

Shell kaip užklausos kalba

Nemažai duomenų apdorojimo ir analizės projektų, su kuriais dirbau, iš tikrųjų yra apvalkalo scenarijai, iškviečiantys kodą Python, Java ir pačios apvalkalo komandos. Todėl apskritai bazh/zsh/etc konvejerius galite laikyti kažkokia aukšto lygio užklausa (žinoma, čia galite įkišti kilpų, bet tai nebūdinga DS kodui apvalkalo kalbomis), duokime paprastas pavyzdys - man reikėjo atlikti wikiduomenų QID atvaizdavimą ir visas nuorodas į rusų ir anglų vikius, tam parašiau paprastą užklausą iš komandų bash, o išvesties parašiau paprastą scenarijų Python, kurį aš sudėti taip:

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

kur

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

Tiesą sakant, tai buvo visas dujotiekis, kuris sukūrė reikiamą atvaizdavimą; kaip matome, viskas veikė srauto režimu:

  • pv failo kelias – pateikia eigos juostą pagal failo dydį ir perduoda jos turinį
  • unpigz -c perskaitė dalį archyvo ir atidavė jq
  • jq su raktu - srautas iš karto sukūrė rezultatą ir perdavė jį postprocesoriui (tas pats kaip ir pirmame pavyzdyje) Python
  • viduje postprocesorius buvo paprasta būsenos mašina, kuri suformatavo išvestį 

Iš viso sudėtingas dujotiekis, veikiantis srauto režimu naudojant didelius duomenis (0.5 TB), be didelių išteklių ir pagamintas iš paprasto vamzdyno ir kelių įrankių.

Kitas svarbus patarimas: mokėti gerai ir efektyviai dirbti terminale ir rašyti bash/zsh/etc.

Kur tai bus naudinga? Taip, beveik visur – vėlgi, internete yra DAUG medžiagos, kurią reikia studijuoti. Visų pirma čia tai mano ankstesnis straipsnis.

R scenarijus

Vėlgi, skaitytojas gali sušukti – na, čia visa programavimo kalba! Ir, žinoma, jis bus teisus. Tačiau aš dažniausiai susidurdavau su R tokiame kontekste, kad iš tikrųjų jis buvo labai panašus į užklausos kalbą.

R yra statistinio skaičiavimo aplinka ir kalba, skirta statiniam skaičiavimui ir vizualizacijai (pagal tai).

Duomenų mokslininko pastabos: suasmeninta duomenų užklausų kalbų apžvalga
paimtas taigi. Beje, rekomenduoju, gera medžiaga.

Kodėl duomenų mokslininkas turi žinoti R? Bent jau todėl, kad yra didžiulis sluoksnis ne IT žmonių, kurie analizuoja duomenis R. Su jais susidūriau šiose vietose:

  • Farmacijos sektorius.
  • Biologai.
  • Finansų sektorius.
  • Žmonės, turintys grynai matematinį išsilavinimą, kurie dirba su statistika.
  • Specializuoti statistiniai modeliai ir mašininio mokymosi modeliai (kuriuos dažnai galima rasti tik autoriaus versijoje kaip R paketą).

Kodėl tai iš tikrųjų yra užklausų kalba? Forma, kuria jis dažnai randamas, iš tikrųjų yra prašymas sukurti modelį, įskaitant duomenų skaitymą ir užklausos (modelio) parametrų taisymą, taip pat duomenų vizualizavimą paketuose, tokiuose kaip ggplot2 - tai taip pat yra užklausų rašymo forma. .

Vizualizacijos užklausų pavyzdžiai

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

Apskritai, daugelis R idėjų buvo perkeltos į python paketus, tokius kaip pandas, numpy arba scipy, pvz., duomenų rėmeliai ir duomenų vektorizavimas – todėl apskritai daugelis R dalykų jums atrodys pažįstami ir patogūs.

Yra daug šaltinių, kuriuos reikia ištirti, pvz. tai.

Žinių grafikai

Čia turiu šiek tiek neįprastos patirties, nes gana dažnai tenka dirbti su žinių grafikais ir grafų užklausų kalbomis. Todėl trumpai apžvelgsime pagrindus, nes ši dalis yra šiek tiek egzotiškesnė.

Klasikinėse reliacinėse duomenų bazėse turime fiksuotą schemą, tačiau čia schema yra lanksti, kiekvienas predikatas iš tikrųjų yra „stulpelis“ ir dar daugiau.

Įsivaizduokite, kad modeliavote žmogų ir norėjote apibūdinti pagrindinius dalykus, pavyzdžiui, paimkime konkretų asmenį Douglasą Adamsą ir remkitės šiuo apibūdinimu.

Duomenų mokslininko pastabos: suasmeninta duomenų užklausų kalbų apžvalga
www.wikidata.org/wiki/Q42

Jei naudotume reliacinę duomenų bazę, turėtume sukurti didžiulę lentelę ar lenteles su didžiuliu stulpelių skaičiumi, kurių dauguma būtų NULL arba užpildyti kokia nors numatytąją reikšme False, pavyzdžiui, mažai tikėtina, kad daugelis iš mūsų turi įrašas Korėjos nacionalinėje bibliotekoje – žinoma, galėtume jas sudėti į atskiras lenteles, bet galiausiai tai būtų bandymas sumodeliuoti lanksčią loginę grandinę su predikatais, naudojant fiksuotą santykinį.

Duomenų mokslininko pastabos: suasmeninta duomenų užklausų kalbų apžvalga
Taigi įsivaizduokite, kad visi duomenys yra saugomi kaip grafikas arba kaip dvejetainės ir vienarės loginės išraiškos.

Kur galima su tuo net susidurti? Pirma, darbas su duomenų wikiir su bet kokiomis grafikų duomenų bazėmis arba prijungtais duomenimis.

Toliau pateikiamos pagrindinės užklausų kalbos, kurias naudojau ir su kuriomis dirbau.

SPARQL

Wiki:
SPARQL (rekursinis akronimas nuo Anglų SPARQL protokolas ir RDF užklausų kalba) - duomenų užklausos kalba, atstovaujama modelio RDFIr protokolas perduoti šiuos prašymus ir į juos atsakyti. SPARQL yra rekomendacija W3C konsorciumas ir viena iš technologijų semantinis tinklas.

Tačiau iš tikrųjų tai yra loginių vienanarių ir dvejetainių predikatų užklausų kalba. Jūs tiesiog sąlyginai nurodote, kas yra nustatyta Būlio išraiškoje, o kas ne (labai supaprastinta).

Pati RDF (Resource Description Framework) bazė, kurioje vykdomos SPARQL užklausos, yra triguba object, predicate, subject - ir užklausa parenka reikiamus trigubus pagal nurodytus apribojimus pagal dvasią: suraskite tokį X, kad p_55(X, q_33) būtų teisingas - kur, žinoma, p_55 yra tam tikras ryšys su ID 55, o q_33 yra objektas su ID 33 (čia ir visa istorija, vėlgi nuleidžiant visokias smulkmenas).

Duomenų pateikimo pavyzdys:

Duomenų mokslininko pastabos: suasmeninta duomenų užklausų kalbų apžvalga
Nuotraukos ir pavyzdys su šalimis čia taigi.

Pagrindinės užklausos pavyzdys

Duomenų mokslininko pastabos: suasmeninta duomenų užklausų kalbų apžvalga

Tiesą sakant, mes norime rasti ?šalies kintamojo reikšmę, tokią kaip predikatui
narys_of, tiesa, narys_of(?country,q458) ir q458 yra Europos Sąjungos ID.

Tikros SPARQL užklausos python variklio viduje pavyzdys:

Duomenų mokslininko pastabos: suasmeninta duomenų užklausų kalbų apžvalga

Paprastai man teko skaityti SPARQL, o ne rašyti – tokioje situacijoje tikriausiai būtų naudinga suprasti kalbą bent jau pagrindiniu lygiu, kad tiksliai suprasčiau, kaip gaunami duomenys. 

Yra daug medžiagos, kurią reikia studijuoti internete: pavyzdžiui, čia tai и tai. Dažniausiai googlinu konkrečius dizainus ir pavyzdžius ir kol kas to užtenka.

Loginės užklausos kalbos

Daugiau apie temą galite perskaityti mano straipsnyje čia. Ir čia tik trumpai panagrinėsime, kodėl loginės kalbos puikiai tinka užklausoms rašyti. Iš esmės RDF yra tik p(X) ir h(X,Y) formos loginių teiginių rinkinys, o loginė užklausa turi tokią formą:

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

Čia mes kalbame apie naujo predikato išvesties/1 sukūrimą (/1 reiškia unarinį), su sąlyga, kad X yra tiesa, kad šalis(X) - t.y. X yra šalis ir taip pat(X,"EU ") narys.

Tai yra, šiuo atveju tiek duomenys, tiek taisyklės pateikiami vienodai, o tai leidžia labai lengvai ir gerai modeliuoti problemas.

Kur susipažinote pramonėje?: visas didelis projektas su įmone, kuri rašo užklausas tokia kalba, taip pat apie dabartinį projektą sistemos branduolyje – atrodytų, kad tai gana egzotiškas dalykas, bet kartais taip nutinka.

Kodo fragmento pavyzdys loginės kalbos apdorojimo wikiduomenyse:

Duomenų mokslininko pastabos: suasmeninta duomenų užklausų kalbų apžvalga

Medžiaga: Čia pateiksiu keletą nuorodų į šiuolaikinę loginio programavimo kalbą Answer Set Programming – rekomenduoju ją išstudijuoti:

Duomenų mokslininko pastabos: suasmeninta duomenų užklausų kalbų apžvalga

Šaltinis: www.habr.com

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