Bilješke Data Scientist-a: Personalizirani pregled jezika upita za podatke

Bilješke Data Scientist-a: Personalizirani pregled jezika upita za podatke
Iz ličnog iskustva govorim šta je bilo korisno gdje i kada. To je pregled i teza, da bude jasno šta i gde možete dalje kopati - ali ovde imam isključivo subjektivno lično iskustvo, možda je kod vas sve sasvim drugačije.

Zašto je važno znati i znati koristiti jezike upita? U svojoj srži, Data Science ima nekoliko važnih faza rada, a prva i najvažnija (bez nje sigurno ništa neće raditi!) je pribavljanje ili izdvajanje podataka. Najčešće, podaci se nalaze negdje u nekom obliku i odatle ih je potrebno "preuzeti". 

Jezici upita vam omogućavaju da izdvojite ove podatke! A danas ću vam reći o onim jezicima upita koji su mi bili korisni i reći ću vam i pokazati gdje i kako tačno - zašto je potrebno učiti.

Postojat će tri glavna bloka tipova upita podataka o kojima ćemo raspravljati u ovom članku:

  • "Standardni" jezici upita su ono što se obično razumije kada se govori o jeziku upita, kao što je relaciona algebra ili SQL.
  • Jezici za skriptiranje upita: na primjer, Python stvari pandas, numpy ili shell skripte.
  • Jezici upita za grafove znanja i baze podataka grafova.

Sve što je ovdje napisano je samo lično iskustvo, ono što je bilo korisno, s opisom situacija i „zašto je bilo potrebno“ - svako može isprobati kako vam slične situacije mogu naići i pokušati se pripremiti za njih unaprijed razumijevanjem ovih jezika ​​prije nego što se morate (hitno) prijaviti na projekat ili čak doći do projekta gdje su oni potrebni.

"Standardni" jezici upita

Standardni jezici upita su upravo u smislu da o njima obično razmišljamo kada govorimo o upitima.

Relaciona algebra

Zašto je danas potrebna relaciona algebra? Da biste dobro razumjeli zašto su jezici upita strukturirani na određeni način i svjesno ih koristili, morate razumjeti srž koja je u njihovoj osnovi.

Šta je relaciona algebra?

Formalna definicija je sljedeća: relaciona algebra je zatvoreni sistem operacija nad relacijama u relacionom modelu podataka. Da kažem malo ljudskije, ovo je sistem operacija nad tabelama tako da je rezultat uvek tabela.

Pogledajte sve relacijske operacije u ovo članak sa Habra - ovdje opisujemo zašto trebate znati i gdje vam to dobro dođe.

Zašto?

Početak razumijevanja o čemu se radi u jezicima upita i koje operacije se kriju iza izraza u određenim jezicima upita često daje dublje razumijevanje onoga što i kako funkcionira u jezicima upita.

Bilješke Data Scientist-a: Personalizirani pregled jezika upita za podatke
Uzeto od ovo članci. Primjer operacije: spoj, koji spaja tablice.

Materijali za učenje:

Dobar uvodni kurs sa Stanforda. Općenito, postoji mnogo materijala o relacionoj algebri i teoriji - Coursera, Udacity. Postoji i ogromna količina materijala na internetu, uključujući i dobar akademski kursevi. Moj lični savjet: morate vrlo dobro razumjeti relacionu algebru - to je osnova osnova.

SQL

Bilješke Data Scientist-a: Personalizirani pregled jezika upita za podatke
Uzeto od ovo članci.

SQL je u suštini implementacija relacione algebre - uz važno upozorenje, SQL je deklarativni! Odnosno, kada pišete upit na jeziku relacijske algebre, vi zapravo kažete kako izračunati - ali kod SQL-a specificirate šta želite da izdvojite, a onda DBMS već generiše (efikasne) izraze na jeziku relacione algebre (njihov ekvivalencija nam je poznata kao Codova teorema).

Bilješke Data Scientist-a: Personalizirani pregled jezika upita za podatke
Uzeto od ovo članci.

Zašto?

Relacioni DBMS-ovi: Oracle, Postgres, SQL Server, itd. su još uvijek bukvalno posvuda i postoji nevjerovatno velika šansa da ćete morati komunicirati s njima, što znači da ćete morati ili čitati SQL (što je vrlo vjerovatno) ili ga pisati ( takođe nije malo verovatno).

Šta čitati i proučavati

Prema istim linkovima iznad (o relacionoj algebri), postoji nevjerovatna količina materijala, npr. ovo.

Usput, šta je NoSQL?

“Vrijedi još jednom naglasiti da pojam “NoSQL” ima apsolutno spontano porijeklo i da iza sebe nema općeprihvaćenu definiciju ili naučnu instituciju.” Dopisivanje članak na Habr.

Zapravo, ljudi su shvatili da potpuni relacijski model nije potreban za rješavanje mnogih problema, posebno za one gdje je, na primjer, izvedba kritična i dominiraju određeni jednostavni upiti sa agregacijom - gdje je ključno brzo izračunati metriku i zapisati ih u baza podataka, a većina karakteristika je relacijski ispostavilo se ne samo nepotrebno, već i štetno - čemu normalizirati nešto ako će nam pokvariti ono najvažnije (za neki specifičan zadatak) - produktivnost?

Također, često su potrebne fleksibilne sheme umjesto fiksnih matematičkih shema klasičnog relacionog modela – a to nevjerovatno pojednostavljuje razvoj aplikacija kada je ključno da se sistem implementira i počne brzo raditi, obrađujući rezultate – ili shemu i tipove pohranjenih podataka nisu toliko bitni.

Na primjer, kreiramo ekspertski sistem i želimo pohraniti informacije na određenoj domeni zajedno sa nekim meta informacijama - možda ne znamo sva polja i jednostavno pohranjujemo JSON za svaki zapis - ovo nam daje vrlo fleksibilno okruženje za proširenje podataka model i brzo ponavljanje - tako da će u ovom slučaju NoSQL biti još poželjniji i čitljiviji. Primjer unosa (iz jednog od mojih projekata gdje je NoSQL bio upravo tamo gdje je bio potreban).

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

Možete pročitati više ovdje o NoSQL-u.

Šta studirati?

Ovde, radije, samo treba da temeljno analizirate svoj zadatak, koja svojstva ima i koji NoSQL sistemi su dostupni koji bi odgovarali ovom opisu - a zatim da počnete da proučavate ovaj sistem.

Skriptiranje jezika upita

U početku se čini, kakve veze Python ima s tim općenito - to je programski jezik, a ne o upitima uopće.

Bilješke Data Scientist-a: Personalizirani pregled jezika upita za podatke

  • Pandas je doslovno švicarski nož nauke o podacima; u njemu se dešava ogromna količina transformacije podataka, agregacije itd.
  • Numpy - tu su vektorski proračuni, matrice i linearna algebra.
  • Scipy - u ovom paketu ima puno matematike, posebno statistike.
  • Jupyter lab - mnogo istraživačkih analiza podataka dobro se uklapa u laptop računare - korisno je znati.
  • Zahtjevi - rad sa mrežom.
  • Pyspark je veoma popularan među inženjerima podataka, najverovatnije ćete morati da komunicirate sa ovim ili Sparkom, jednostavno zbog njihove popularnosti.
  • *Selen - veoma koristan za prikupljanje podataka sa sajtova i resursa, ponekad jednostavno ne postoji drugi način da dođete do podataka.

Moj glavni savjet: naučite Python!

Pandas

Uzmimo sljedeći kod kao primjer:

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

U suštini, vidimo da se kod uklapa u klasični SQL obrazac.

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

Ali važan dio je da je ovaj kod dio skripte i cevovoda; u stvari, mi ugrađujemo upite u Python cevovod. U ovoj situaciji, jezik upita dolazi nam iz biblioteka kao što su Pandas ili pySpark.

Općenito, u pySparku vidimo sličan tip transformacije podataka kroz jezik upita u duhu:

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

Gdje i šta čitati

Na samom Pythonu općenito nije problem pronađite materijale za proučavanje. Postoji ogroman broj tutorijala na internetu pande, pySpark i kursevi na iskra (i takođe sam po sebi DS). Sve u svemu, sadržaj je odličan za guglanje, a ako bih morao odabrati jedan paket na koji bih se fokusirao, to bi bile pande, naravno. Što se tiče kombinacije DS+Python materijala također jako puno.

Shell kao jezik upita

Dosta projekata obrade i analize podataka sa kojima sam radio su, u stvari, shell skripte koje pozivaju kod u Pythonu, Javi i same komande ljuske. Stoga, općenito, cjevovode u bash/zsh/etc možete smatrati nekom vrstom upita visokog nivoa (možete, naravno, ubaciti petlje, ali to nije tipično za DS kod u jezicima ljuske), dajmo Jednostavan primer - trebalo je da uradim QID mapiranje wikida podataka i pune veze do ruskog i engleskog wikija, za to sam napisao jednostavan zahtev iz komandi u bash-u i za izlaz napisao jednostavnu skriptu u Python-u, koji sam sastaviti ovako:

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

gdje

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

Ovo je, u stvari, bio ceo cevovod koji je kreirao potrebno mapiranje; kao što vidimo, sve je radilo u režimu protoka:

  • pv filepath - daje traku napretka na osnovu veličine datoteke i prosljeđuje njen sadržaj dalje
  • unpigz -c je pročitao dio arhive i dao ga jq
  • jq sa ključem - stream je odmah proizveo rezultat i proslijedio ga postprocesoru (isto kao u prvom primjeru) u Pythonu
  • interno, postprocesor je bio jednostavan državni stroj koji je formatirao izlaz 

Ukupno, složeni cevovod koji radi u režimu protoka na velikim podacima (0.5TB), bez značajnih resursa i napravljen od jednostavnog cevovoda i nekoliko alata.

Još jedan važan savjet: budite u stanju da radite dobro i efikasno u terminalu i pišete bash/zsh/etc.

Gdje će biti od koristi? Da, skoro svuda - opet, na Internetu ima PUNO materijala za proučavanje. Posebno, ovdje ovo moj prethodni članak.

R skriptiranje

Opet, čitalac može uzviknuti - pa, ovo je čitav programski jezik! I naravno, biće u pravu. Međutim, obično sam nailazio na R u takvom kontekstu da je, u stvari, bio vrlo sličan jeziku upita.

R je statističko računarsko okruženje i jezik za statičko računanje i vizualizaciju (prema ovo).

Bilješke Data Scientist-a: Personalizirani pregled jezika upita za podatke
uzeti odavde. Inače, preporučujem, dobar materijal.

Zašto naučnik podataka treba da zna R? Barem zato što postoji ogroman sloj ljudi koji nisu IT ljudi koji analiziraju podatke u R. Naišao sam na to na sljedećim mjestima:

  • Farmaceutski sektor.
  • Biolozi.
  • Finansijski sektor.
  • Ljudi sa čisto matematičkim obrazovanjem koji se bave statistikom.
  • Specijalizovani statistički modeli i modeli mašinskog učenja (koji se često mogu naći samo u autorskoj verziji kao R paket).

Zašto je to zapravo jezik upita? U obliku u kojem se često nalazi, to je zapravo zahtjev za kreiranjem modela, uključujući čitanje podataka i popravljanje parametara upita (modela), kao i vizualizaciju podataka u paketima kao što je ggplot2 - ovo je također oblik pisanja upita. .

Primjeri upita za vizualizaciju

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

Općenito, mnoge ideje iz R-a su migrirale u python pakete kao što su pandas, numpy ili scipy, poput okvira podataka i vektorizacije podataka - tako da će vam općenito mnoge stvari u R-u izgledati poznato i zgodno.

Postoji mnogo izvora za proučavanje, npr. ovo.

Grafikoni znanja

Ovdje imam malo neobično iskustvo, jer često moram raditi sa grafovima znanja i jezicima upita za grafove. Stoga, hajde da ukratko pređemo na osnove, jer je ovaj dio malo egzotičniji.

U klasičnim relacionim bazama podataka imamo fiksnu šemu, ali ovde je šema fleksibilna, svaki predikat je zapravo „kolona“ i čak više.

Zamislite da modelirate osobu i želite opisati ključne stvari, na primjer, uzmimo određenu osobu, Douglasa Adamsa, i upotrijebimo ovaj opis kao osnovu.

Bilješke Data Scientist-a: Personalizirani pregled jezika upita za podatke
www.wikidata.org/wiki/Q42

Kada bismo koristili relacionu bazu podataka, morali bismo da kreiramo ogromnu tabelu ili tabele sa ogromnim brojem kolona, ​​od kojih bi većina bila NULL ili popunjena nekom podrazumevanom False vrednošću, na primer, malo je verovatno da mnogi od nas imaju unos u Korejskoj nacionalnoj biblioteci - naravno, mogli bismo ih staviti u zasebne tabele, ali ovo bi na kraju bio pokušaj modeliranja fleksibilnog logičkog kola sa predikatima koristeći fiksni relacioni.

Bilješke Data Scientist-a: Personalizirani pregled jezika upita za podatke
Zato zamislite da su svi podaci pohranjeni kao graf ili kao binarni i unarni logički izrazi.

Gdje uopće možete naići na ovo? Prvo, rad sa data wiki, i sa bilo kojim bazama podataka grafova ili povezanim podacima.

U nastavku su glavni jezici upita koje sam koristio i sa kojima sam radio.

SPARQL

Wiki:
SPARQL (rekurzivni akronim iz Eng. SPARQL protokol i RDF jezik upita) - jezik upita podataka, koju predstavlja model RDFI protokol da prenese ove zahtjeve i odgovori na njih. SPARQL je preporuka W3C Consortium i jedna od tehnologija semantički web.

Ali u stvarnosti to je jezik upita za logičke unarne i binarne predikate. Vi jednostavno uslovno specificirate šta je fiksno u Booleovom izrazu, a šta nije (vrlo pojednostavljeno).

Sama baza RDF (Resource Description Framework), preko koje se izvršavaju SPARQL upiti, je trostruka object, predicate, subject - i upit odabire tražene trojke u skladu sa specificiranim ograničenjima u duhu: pronađite X takav da je p_55(X, q_33) istina - gdje je, naravno, p_55 neka vrsta relacije sa ID 55, a q_33 je objekat sa ID 33 (ovdje i cijela priča, opet izostavljajući svakakve detalje).

Primjer prezentacije podataka:

Bilješke Data Scientist-a: Personalizirani pregled jezika upita za podatke
Slike i primjer sa zemljama ovdje odavde.

Osnovni primjer upita

Bilješke Data Scientist-a: Personalizirani pregled jezika upita za podatke

U stvari, želimo da pronađemo vrednost varijable ?country takvu da je za predikat
member_of, tačno je da je member_of(?country,q458) i q458 ID Evropske unije.

Primjer pravog SPARQL upita unutar python motora:

Bilješke Data Scientist-a: Personalizirani pregled jezika upita za podatke

Obično sam morao da čitam SPARQL umesto da ga pišem – u toj situaciji bi verovatno bila korisna veština da razumem jezik barem na osnovnom nivou da razumem tačno kako se podaci preuzimaju. 

Postoji mnogo materijala za proučavanje na internetu: na primjer, ovdje ovo и ovo. Obično guglam specifične dizajne i primjere i to je za sada dovoljno.

Logički jezici upita

Više o ovoj temi možete pročitati u mom članku ovdje. A ovdje ćemo samo ukratko ispitati zašto su logički jezici pogodni za pisanje upita. U suštini, RDF je samo skup logičkih iskaza oblika p(X) i h(X,Y), a logički upit ima sljedeći oblik:

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

Ovdje govorimo o kreiranju novog predikatnog izlaza/1 (/1 znači unarno), pod uvjetom da je za X istina da je country(X) - tj. X je zemlja i također članica_of(X,"EU").

Odnosno, u ovom slučaju su i podaci i pravila predstavljeni na isti način, što nam omogućava da vrlo lako i dobro modeliramo probleme.

Gdje ste se upoznali u industriji?: čitav veliki projekat sa kompanijom koja piše upite na takvom jeziku, kao i na trenutnom projektu u jezgru sistema - čini se da je to prilično egzotična stvar, ali ponekad se desi.

Primjer fragmenta koda u logičkom jeziku koji obrađuje wikidate:

Bilješke Data Scientist-a: Personalizirani pregled jezika upita za podatke

Materijali: Ovdje ću dati nekoliko linkova na moderni logički programski jezik Programiranje skupa odgovora - preporučujem da ga proučite:

Bilješke Data Scientist-a: Personalizirani pregled jezika upita za podatke

izvor: www.habr.com

Dodajte komentar