Andmeteadlase märkmed: andmepäringu keelte isikupärastatud ülevaade

Andmeteadlase märkmed: andmepäringu keelte isikupärastatud ülevaade
Ma räägin teile isiklikust kogemusest, mis oli kasulik kus ja millal. See on ülevaade ja lõputöö, et oleks selge, mida ja kuhu saate edasi kaevata - kuid siin on mul eranditult subjektiivne isiklik kogemus, võib-olla on teie jaoks kõik täiesti erinev.

Miks on oluline osata päringukeeli ja osata neid kasutada? Andmeteaduse tuumaks on mitu olulist tööetappi ning kõige esimene ja kõige olulisem (ilma selleta ei tööta kindlasti mitte miski!) on andmete hankimine või väljavõtmine. Enamasti seisavad andmed mingil kujul kuskil ja tuleb sealt “välja otsida”. 

Päringukeeled võimaldavad teil just neid andmeid välja võtta! Ja täna räägin teile nendest päringukeeltest, mis on mulle kasulikud olnud, ja räägin ja näitan teile, kus ja kuidas täpselt - miks seda on vaja õppida.

Siin on kolm peamist andmepäringutüüpide plokki, mida käsitleme selles artiklis:

  • "Standardsed" päringukeeled on need, mida tavaliselt mõistetakse päringukeelest rääkides, näiteks relatsioonialgebrast või SQL-ist.
  • Skriptimispäringu keeled: näiteks Pythoni asjad pandas, numpy või shelliskriptimine.
  • Teadmiste graafikute ja graafikute andmebaaside päringukeeled.

Kõik, mis siin kirjas on, on vaid isiklik kogemus, millest oli kasu, koos olukordade kirjelduse ja “miks seda vaja oli” – igaüks saab proovida, kuidas sarnased olukorrad võivad teie teele sattuda ja proovida neid keeli mõistes nendeks eelnevalt valmistuda ​enne kui peate (kiiresti) projekti taotlema või isegi jõudma projekti, kus neid vajatakse.

"Standardsed" päringukeeled

Standardsed päringukeeled on just selles mõttes, et tavaliselt mõtleme neile päringutest rääkides.

Relatsioonialgebra

Miks on tänapäeval vaja relatsioonialgebrat? Selleks, et mõista hästi, miks päringukeeled on teatud viisil üles ehitatud, ja kasutada neid teadlikult, peate mõistma nende aluseks olevat tuuma.

Mis on relatsioonialgebra?

Formaalne definitsioon on järgmine: relatsioonialgebra on relatsioonilise andmemudeli seostega seotud operatsioonide suletud süsteem. Natuke inimlikumalt öeldes on see tabelite operatsioonide süsteem, mille tulemuseks on alati tabel.

Vaadake kõiki relatsioonioperatsioone see artikkel Habrilt – siin kirjeldame, miks sa pead teadma ja kus see kasuks tuleb.

Miks?

Kui hakkate aru saama, mida päringukeeled endast kujutavad ja millised toimingud on konkreetsete päringukeelte väljendite taga, annab see sageli sügavama arusaama sellest, mis päringukeeltes töötab ja kuidas.

Andmeteadlase märkmed: andmepäringu keelte isikupärastatud ülevaade
Võetud see artiklid. Näide operatsioonist: join, mis ühendab tabeleid.

Materjalid õppetööks:

Hea sissejuhatav kursus Stanfordist. Üldiselt on relatsioonialgebra ja teooria kohta palju materjale – Coursera, Udacity. Internetis on ka tohutult palju materjali, sealhulgas head akadeemilised kursused. Minu isiklik nõuanne: peate relatsioonialgebrast väga hästi aru saama - see on põhitõdede alus.

SQL

Andmeteadlase märkmed: andmepäringu keelte isikupärastatud ülevaade
Võetud see artiklid.

SQL on sisuliselt relatsioonialgebra rakendamine – olulise mööndusega on SQL deklaratiivne! See tähendab, et kui kirjutate päringu relatsioonialgebra keeles, siis ütlete tegelikult, kuidas arvutada - aga SQL-iga määrate, mida soovite ekstraktida ja seejärel genereerib DBMS juba (tõhusaid) avaldisi relatsioonialgebra keeles (nende samaväärsus on meile tuntud kui Coddi teoreem).

Andmeteadlase märkmed: andmepäringu keelte isikupärastatud ülevaade
Võetud see artiklid.

Miks?

Relatsioonilised DBMS-id: Oracle, Postgres, SQL Server jne on endiselt peaaegu kõikjal ja on uskumatult suur tõenäosus, et peate nendega suhtlema, mis tähendab, et peate kas SQL-i lugema (mis on väga tõenäoline) või kirjutama ( pole ka ebatõenäoline).

Mida lugeda ja uurida

Samade ülaltoodud linkide järgi (relatsioonialgebra kohta) on uskumatult palju materjali, näiteks see.

Muide, mis on NoSQL?

"Väärib veel kord rõhutamist, et termin "NoSQL" on täiesti spontaanne päritolu ja selle taga pole üldtunnustatud määratlust ega teaduslikku institutsiooni." Vastav artikkel kohta Habr.

Tegelikult mõistsid inimesed, et paljude probleemide lahendamiseks pole täielikku relatsioonimudelit vaja, eriti nende puhul, kus näiteks jõudlus on kriitiline ja domineerivad teatud lihtsad agregatsiooniga päringud – kus on ülioluline kiiresti arvutada mõõdikud ja kirjutada need andmebaas ja enamik funktsioone on relatsioonilised, osutus mitte ainult tarbetuks, vaid ka kahjulikuks - milleks midagi normaliseerida, kui see rikub meie jaoks kõige olulisemat (mõne konkreetse ülesande jaoks) - tootlikkust?

Samuti on klassikalise relatsioonimudeli fikseeritud matemaatiliste skeemide asemel sageli vaja paindlikke skeeme – see lihtsustab uskumatult rakenduste arendamist, kui on oluline süsteemi juurutamine ja kiire töö alustamine, tulemuste töötlemine – või salvestatud andmete skeem ja tüübid. pole nii olulised.

Näiteks loome ekspertsüsteemi ja soovime salvestada teavet konkreetse domeeni kohta koos metateabega – me ei pruugi teada kõiki välju ja salvestame lihtsalt iga kirje jaoks JSON-i – see annab meile väga paindliku keskkonna andmete laiendamiseks. mudel ja kiire iteratsioon - nii et sel juhul on NoSQL veelgi eelistatavam ja loetavam. Näidiskirje (ühest minu projektist, kus NoSQL oli täpselt seal, kus vaja).

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

Saate rohkem lugeda siin NoSQL-i kohta.

Mida õppida?

Siin tuleb pigem lihtsalt oma ülesannet põhjalikult analüüsida, millised omadused sellel on ja millised NoSQL-i süsteemid on saadaval, mis selle kirjeldusega sobiksid – ja siis hakata seda süsteemi uurima.

Skriptimispäringu keeled

Esialgu tundub, mis on Pythonil sellega üldiselt pistmist - see on programmeerimiskeel ja mitte päringute kohta.

Andmeteadlase märkmed: andmepäringu keelte isikupärastatud ülevaade

  • Pandas on sõna otseses mõttes Šveitsi armee andmeteaduse nuga, milles toimub tohutul hulgal andmete teisendamist, koondamist jne.
  • Numpy - vektorarvutused, maatriksid ja lineaaralgebra seal.
  • Scipy – selles paketis on palju matemaatikat, eriti statistikat.
  • Jupyteri labor – paljud uurimuslikud andmeanalüüsid sobivad hästi sülearvutitesse – kasulik teada.
  • Taotlused - võrguga töötamine.
  • Pyspark on andmeinseneride seas väga populaarne, tõenäoliselt peate lihtsalt nende populaarsuse tõttu selle või Sparkiga suhtlema.
  • *Seleen – väga kasulik saitidelt ja ressurssidelt andmete kogumisel, vahel lihtsalt pole muud võimalust andmete hankimiseks.

Minu peamine nõuanne: õppige Python!

Pandad

Võtame näitena järgmise koodi:

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

Sisuliselt näeme, et kood sobib klassikalise SQL-i mustriga.

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 konveierist; tegelikult põimime päringuid Pythoni konveierisse. Sellises olukorras tuleb päringukeel meile sellistest raamatukogudest nagu Pandas või pySpark.

Üldiselt näeme pySparkis sarnast tüüpi andmete teisendamist päringukeele kaudu järgmise vaimus:

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

Kus ja mida lugeda

Pythonis endas üldiselt pole probleemi leida õppimiseks materjale. Internetis on tohutult palju õpetusi pandas, pySpark ja kursused käimas Säde (ja ka iseenesest DS). Üldiselt on siinne sisu guugeldamiseks suurepärane ja kui peaksin valima ühe paketi, millele keskenduda, oleks see loomulikult pandad. Mis puudutab ka DS+Python materjalide kombinatsiooni väga palju.

Shell päringukeelena

Päris paljud andmetöötlus- ja analüüsiprojektid, millega olen töötanud, on tegelikult shelliskriptid, mis kutsuvad Pythonis, Javas koodi ja shellikäske ise. Seetõttu võib üldiselt pidada torujuhtmeid failis bash/zsh/etc mingiks kõrgetasemeliseks päringuks (seal võib muidugi silmuseid toppida, aga see pole shell-keeltes DS-koodile tüüpiline), anname lihtne näide - mul oli vaja teha wikiandmete QID kaardistamine ja täielikud linkid vene ja inglise vikidesse, selleks kirjutasin bashi käskudest lihtsa päringu ja väljundiks kirjutasin Pythonis lihtsa skripti, mida ma kokku panna 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 tegelikult kogu torujuhe, mis lõi vajaliku kaardistuse; nagu näeme, töötas kõik voorežiimis:

  • pv failitee – annab faili suurusel põhineva edenemisriba ja edastab selle sisu edasi
  • unpigz -c luges osa arhiivist ja andis selle jq-le
  • jq võtmega - voog andis kohe tulemuse ja edastas selle Pythonis järelprotsessorile (sama mis esimeses näites)
  • sisemiselt oli postprotsessor lihtne olekumasin, mis vormindas väljundi 

Kokku on keerukas torujuhe, mis töötab voorežiimis suurtel andmetel (0.5 TB), ilma märkimisväärsete ressurssideta ning on valmistatud lihtsast torujuhtmest ja paarist tööriistast.

Veel üks oluline näpunäide: oska terminalis hästi ja tõhusalt töötada ning kirjutada bash/zsh/jne.

Kus see kasulik on? Jah, peaaegu igal pool – jällegi on Internetis PALJU materjale, mida uurida. Eelkõige siin see minu eelmine artikkel.

R skriptimine

Jällegi võib lugeja hüüatada – no see on ju terve programmeerimiskeel! Ja loomulikult on tal õigus. Tavaliselt puutusin aga R-ga kokku sellises kontekstis, et tegelikult oli see väga sarnane päringukeelega.

R on statistiline andmetöötluskeskkond ja keel staatiliseks arvutamiseks ja visualiseerimiseks (vastavalt see).

Andmeteadlase märkmed: andmepäringu keelte isikupärastatud ülevaade
võetud siit. Muide, soovitan, hea materjal.

Miks peab andmeteadlane teadma R-i? Vähemalt seetõttu, et R-is analüüsib andmeid tohutu hulk mitte-IT-inimesi. Ma puutusin sellega kokku järgmistes kohtades:

  • Farmaatsia sektor.
  • Bioloogid.
  • Finantssektor.
  • Puhtalt matemaatilise haridusega inimesed, kes tegelevad statistikaga.
  • Spetsiaalsed statistilised mudelid ja masinõppe mudelid (mida võib sageli leida ainult autori versioonist R-paketina).

Miks on see tegelikult päringukeel? Sellel kujul, nagu seda sageli leidub, on see tegelikult taotlus mudeli loomiseks, sealhulgas andmete lugemiseks ja päringu (mudeli) parameetrite parandamiseks, samuti andmete visualiseerimiseks sellistes pakettides nagu ggplot2 - see on ka päringute kirjutamise vorm .

Näidispäringud visualiseerimiseks

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 paljud R-i ideed rännanud python-pakettidesse, nagu pandas, numpy või scipy, nagu andmeraamid ja andmete vektoriseerimine – nii et üldiselt tunduvad paljud R-i asjad teile tuttavad ja mugavad.

Uurimiseks on palju allikaid, näiteks see.

Teadmiste graafikud

Siin on mul veidi ebatavaline kogemus, sest pean üsna sageli töötama teadmiste graafikutega ja graafikute jaoks päringukeeltega. Seetõttu käsitleme lühidalt põhitõdesid, kuna see osa on veidi eksootilisem.

Klassikalistes relatsiooniandmebaasides on meil fikseeritud skeem, kuid siin on skeem paindlik, iga predikaat on tegelikult "veerg" ja isegi rohkem.

Kujutage ette, et modelleerisite inimest ja soovisite kirjeldada võtmeasju, näiteks võtame konkreetse isiku, Douglas Adamsi, ja võtke aluseks see kirjeldus.

Andmeteadlase märkmed: andmepäringu keelte isikupärastatud ülevaade
www.wikidata.org/wiki/Q42

Kui kasutaksime relatsiooniandmebaasi, peaksime looma tohutu tabeli või tabelid tohutu hulga veergudega, millest enamik oleks NULL või täidetud mõne vaikeväärtusega False, näiteks on ebatõenäoline, et paljudel meist oleks sissekanne Korea rahvusraamatukogus - loomulikult võiksime need panna eraldi tabelitesse, kuid see oleks lõppkokkuvõttes katse modelleerida paindlikku loogilist ahelat predikaatidega, kasutades fikseeritud relatsioonilist ahelat.

Andmeteadlase märkmed: andmepäringu keelte isikupärastatud ülevaade
Kujutage ette, et kõik andmed on salvestatud graafikuna või binaarsete ja unaarsete tõeväärtusavaldistena.

Kus sa sellega üldse kokku puutud? Esiteks, töötamine andmete wikija mis tahes graafikute andmebaaside või ühendatud andmetega.

Järgmised on peamised päringukeeled, mida olen kasutanud ja millega olen töötanud.

SPARQL

Wiki:
SPARQL (rekursiivne akronüüm pärit Eng. SPARQL-i protokoll ja RDF-päringukeel) - andmepäringu keel, mida esindab mudel RDF ning protokoll päringud edastada ja neile vastata. SPARQL on soovitus W3C konsortsium ja üks tehnoloogiatest semantiline veeb.

Kuid tegelikult on see loogiliste ühe- ja kahendpredikaatide päringukeel. Sa lihtsalt määrad tingimuslikult, mis on Boole'i ​​avaldises fikseeritud ja mis mitte (väga lihtsustatult).

RDF (Resource Description Framework) baas ise, mille kaudu SPARQL päringuid käivitatakse, on kolmik object, predicate, subject - ja päring valib vajalikud kolmikud vastavalt määratud piirangutele vaimus: leidke X nii, et p_55(X, q_33) oleks tõene - kus p_55 on loomulikult mingi seos ID-ga 55 ja q_33 on objekt ID 33-ga (siin ja kogu lugu, jättes jällegi kõikvõimalikud detailid välja).

Andmete esitamise näide:

Andmeteadlase märkmed: andmepäringu keelte isikupärastatud ülevaade
Pildid ja näide riikidega siin siit.

Põhipäringu näide

Andmeteadlase märkmed: andmepäringu keelte isikupärastatud ülevaade

Tegelikult tahame leida muutuja ?country väärtuse nii, et see oleks predikaadi jaoks
Member_of, on tõsi, et Member_of(?country,q458) ja q458 on Euroopa Liidu ID.

Näide tõelisest SPARQL-i päringust pythoni mootoris:

Andmeteadlase märkmed: andmepäringu keelte isikupärastatud ülevaade

Tavaliselt olen pidanud SPARQL-i kirjutamise asemel lugema – sellises olukorras oleks tõenäoliselt kasulik oskus mõista keelt vähemalt algtasemel, et täpselt aru saada, kuidas andmeid tuuakse. 

Internetis on palju materjali, mida uurida: näiteks siit see и see. Tavaliselt otsin guugeldades konkreetseid kujundusi ja näiteid ning sellest praegu piisab.

Loogilise päringu keeled

Lisateavet selle teema kohta saate lugeda minu artiklist siin. Ja siin uurime vaid põgusalt, miks loogilised keeled päringute kirjutamiseks hästi sobivad. Põhimõtteliselt on RDF vaid loogiliste lausete komplekt kujul p(X) ja h(X,Y) ning loogilisel päringul on järgmine vorm:

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

Siin räägime uue predikaadi väljundi/1 loomisest (/1 tähendab unaarset), eeldusel, et X puhul on tõsi, et riik(X) - st X on riik ja ka liige_of(X,"EL ").

See tähendab, et antud juhul esitatakse nii andmed kui ka reeglid ühtemoodi, mis võimaldab probleeme väga lihtsalt ja hästi modelleerida.

Kus te tööstuses kohtusite?: terve suur projekt ettevõttega, kes kirjutab päringuid sellises keeles, nagu ka praeguse projekti kohta süsteemi tuumas - tundub, et see on üsna eksootiline asi, kuid mõnikord juhtub.

Näide koodifragmendist loogilise keele töötlemise vikiandmetes:

Andmeteadlase märkmed: andmepäringu keelte isikupärastatud ülevaade

Materjalid: annan siin paar linki kaasaegsele loogilisele programmeerimiskeelele Answer Set Programming - soovitan seda uurida:

Andmeteadlase märkmed: andmepäringu keelte isikupärastatud ülevaade

Allikas: www.habr.com

Lisa kommentaar