Dataforskerens notater: En personlig gjennomgang av dataspørringsspråk

Dataforskerens notater: En personlig gjennomgang av dataspørringsspråk
Jeg forteller deg fra personlig erfaring hva som var nyttig hvor og når. Det er oversikt og oppgave, slik at det er klart hva og hvor du kan grave videre - men her har jeg utelukkende subjektiv personlig erfaring, kanskje er alt helt annerledes for deg.

Hvorfor er det viktig å kjenne til og kunne bruke spørringsspråk? I kjernen har Data Science flere viktige stadier av arbeidet, og det aller første og viktigste (uten det vil absolutt ingenting fungere!) er å skaffe eller trekke ut data. Oftest sitter dataene et sted i en eller annen form og må "hentes" derfra. 

Spørringsspråk lar deg trekke ut nettopp disse dataene! Og i dag vil jeg fortelle deg om de spørrespråkene som har vært nyttige for meg, og jeg vil fortelle deg og vise deg hvor og hvordan nøyaktig - hvorfor det er nødvendig å studere.

Det vil være tre hovedblokker med dataspørringstyper, som vi vil diskutere i denne artikkelen:

  • "Standard" spørrespråk er det som vanligvis forstås når man snakker om et spørrespråk, for eksempel relasjonsalgebra eller SQL.
  • Skriptspørringsspråk: for eksempel Python ting pandaer, numpy eller shell scripting.
  • Spørringsspråk for kunnskapsgrafer og grafdatabaser.

Alt som er skrevet her er bare en personlig opplevelse, hva som var nyttig, med en beskrivelse av situasjoner og "hvorfor det var nødvendig" - alle kan prøve hvordan lignende situasjoner kan komme din vei og prøve å forberede seg på dem på forhånd ved å forstå disse språkene ​før du må søke (hast) på et prosjekt eller til og med komme til et prosjekt der de trengs.

"Standard" spørringsspråk

Standard spørringsspråk er nettopp i den forstand at vi vanligvis tenker på dem når vi snakker om spørringer.

Relasjonsalgebra

Hvorfor trengs relasjonsalgebra i dag? For å ha en god forståelse av hvorfor spørrespråk er strukturert på en bestemt måte og bruke dem bevisst, må du forstå kjernen som ligger til grunn for dem.

Hva er relasjonsalgebra?

Den formelle definisjonen er som følger: relasjonsalgebra er et lukket system av operasjoner på relasjoner i en relasjonsdatamodell. For å si det litt mer menneskelig, er dette et system med operasjoner på tabeller slik at resultatet alltid er en tabell.

Se alle relasjonsoperasjoner i dette artikkel fra Habr - her beskriver vi hvorfor du trenger å vite og hvor det kommer godt med.

Hvorfor?

Å begynne å forstå hva spørrespråk handler om og hvilke operasjoner som ligger bak uttrykk i spesifikke spørrespråk gir ofte en dypere forståelse av hva som fungerer i spørrespråk og hvordan.

Dataforskerens notater: En personlig gjennomgang av dataspørringsspråk
Tatt fra dette artikler. Et eksempel på en operasjon: join, som kobler sammen tabeller.

Materialer for studier:

Godt introduksjonskurs fra Stanford. Generelt er det mye materiale om relasjonsalgebra og teori - Coursera, Udacity. Det er også en enorm mengde materiale på nett, inkludert bra akademiske kurs. Mitt personlige råd: du må forstå relasjonsalgebra veldig godt - dette er grunnlaget for det grunnleggende.

SQL

Dataforskerens notater: En personlig gjennomgang av dataspørringsspråk
Tatt fra dette artikkelen.

SQL er i hovedsak en implementering av relasjonsalgebra - med et viktig forbehold, SQL er deklarativ! Det vil si at når du skriver en spørring på relasjonsalgebraspråket, sier du faktisk hvordan du regner - men med SQL spesifiserer du hva du vil trekke ut, og da genererer DBMS allerede (effektive) uttrykk på relasjonsalgebraspråket (deres ekvivalens er kjent for oss som Codds teorem).

Dataforskerens notater: En personlig gjennomgang av dataspørringsspråk
Tatt fra dette artikkelen.

Hvorfor?

Relasjonelle DBMSer: Oracle, Postgres, SQL Server, osv. er fortsatt praktisk talt overalt, og det er en utrolig stor sjanse for at du må samhandle med dem, noe som betyr at du enten må lese SQL (som er svært sannsynlig) eller skrive det ( ikke usannsynlig heller).

Hva du skal lese og studere

I følge de samme lenkene ovenfor (om relasjonsalgebra) er det utrolig mye materiale, f.eks. dette.

Forresten, hva er NoSQL?

"Det er verdt å understreke nok en gang at begrepet "NoSQL" har en absolutt spontan opprinnelse og har ingen generelt akseptert definisjon eller vitenskapelig institusjon bak seg." Tilsvarende artikkel på Habr.

Faktisk innså folk at en full relasjonsmodell ikke er nødvendig for å løse mange problemer, spesielt for de der for eksempel ytelse er kritisk og visse enkle søk med aggregering dominerer - hvor det er avgjørende å raskt beregne beregninger og skrive dem til database, og de fleste funksjonene er relasjonelle viste seg å være ikke bare unødvendige, men også skadelige - hvorfor normalisere noe hvis det vil ødelegge det viktigste for oss (for en bestemt oppgave) - produktivitet?

Det er også ofte behov for fleksible skjemaer i stedet for de faste matematiske skjemaene til den klassiske relasjonsmodellen - og dette forenkler utrolig applikasjonsutvikling når det er avgjørende å distribuere systemet og begynne å jobbe raskt, behandle resultatene - eller skjemaet og typer lagrede data er ikke så viktige.

For eksempel lager vi et ekspertsystem og ønsker å lagre informasjon på et spesifikt domene sammen med litt metainformasjon - vi kjenner kanskje ikke alle feltene og lagrer ganske enkelt JSON for hver post - dette gir oss et veldig fleksibelt miljø for å utvide dataene modell og raskt itererende - så i dette tilfellet vil NoSQL være enda å foretrekke og mer lesbart. Eksempeloppføring (fra et av prosjektene mine der NoSQL var akkurat der det var nødvendig).

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

Du kan lese mer her om NoSQL.

Hva skal man studere?

Her trenger du bare å analysere oppgaven din grundig, hvilke egenskaper den har og hvilke NoSQL-systemer som er tilgjengelige som passer til denne beskrivelsen - og deretter begynne å studere dette systemet.

Språk for skriptsøk

Til å begynne med ser det ut til hva Python har med det å gjøre generelt - det er et programmeringsspråk, og ikke om spørringer i det hele tatt.

Dataforskerens notater: En personlig gjennomgang av dataspørringsspråk

  • Pandas er bokstavelig talt en sveitsisk hærkniv innen datavitenskap; en enorm mengde datatransformasjon, aggregering osv. skjer i den.
  • Numpy - vektorberegninger, matriser og lineær algebra der.
  • Scipy - det er mye matematikk i denne pakken, spesielt statistikk.
  • Jupyter lab - mye utforskende dataanalyse passer godt inn i bærbare datamaskiner - nyttig å vite.
  • Forespørsler - jobber med nettverket.
  • Pyspark er veldig populær blant dataingeniører, mest sannsynlig må du samhandle med denne eller Spark, rett og slett på grunn av deres popularitet.
  • *Selen - veldig nyttig for å samle inn data fra nettsteder og ressurser, noen ganger er det rett og slett ingen annen måte å få dataene på.

Mitt hovedråd: lær Python!

pandaer

La oss ta følgende kode som et eksempel:

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 hovedsak ser vi at koden passer inn i det klassiske SQL-mønsteret.

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

Men den viktige delen er at denne koden er en del av skriptet og rørledningen; faktisk legger vi inn spørringer i Python-rørledningen. I denne situasjonen kommer spørringsspråket til oss fra biblioteker som Pandas eller pySpark.

Generelt ser vi i pySpark en lignende type datatransformasjon gjennom et spørringsspråk i ånden til:

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

Hvor og hva du skal lese

På selve Python generelt ikke problemet finne materiale å studere. Det er et stort antall opplæringsprogrammer på nettet pandaer, pySpark og kurs på Spark (og også av seg selv DS). Totalt sett er innholdet her flott for googling, og hvis jeg måtte velge én pakke å fokusere på, ville det selvfølgelig vært pandaer. Angående kombinasjonen av DS+Python-materialer også veldig mye.

Shell som spørrespråk

Ganske mange databehandlings- og analyseprosjekter som jeg har jobbet med er faktisk shell-skript som kaller kode i Python, Java og selve shell-kommandoene. Derfor kan du generelt vurdere rørledninger i bash/zsh/etc som en slags høynivåspørring (du kan selvfølgelig legge inn løkker der, men dette er ikke typisk for DS-kode i shell-språk), la oss gi et enkelt eksempel - jeg trengte å gjøre en QID-kartlegging av wikidata og fullstendige lenker til de russiske og engelske wikiene, for dette skrev jeg en enkel forespørsel fra kommandoene i bash og for utgangen skrev jeg et enkelt skript i Python, som jeg satt sammen slik:

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

der

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

Dette var faktisk hele rørledningen som skapte den nødvendige kartleggingen; som vi ser, fungerte alt i strømmodus:

  • pv filbane - gir en fremdriftslinje basert på filstørrelse og sender innholdet videre
  • unpigz -c leste en del av arkivet og ga det til jq
  • jq med nøkkelen - stream produserte umiddelbart resultatet og sendte det til postprosessoren (samme som med det aller første eksemplet) i Python
  • internt var postprosessoren en enkel tilstandsmaskin som formaterte utdataene 

Totalt sett en kompleks rørledning som arbeider i flytmodus på store data (0.5 TB), uten betydelige ressurser og laget av en enkel rørledning og et par verktøy.

Et annet viktig tips: kunne jobbe godt og effektivt i terminalen og skrive bash/zsh/etc.

Hvor vil det være nyttig? Ja, nesten overalt - igjen, det er MYE materiale å studere på Internett. Spesielt her dette min forrige artikkel.

R-skripting

Igjen kan leseren utbryte – vel, dette er et helt programmeringsspråk! Og selvfølgelig vil han ha rett. Imidlertid møtte jeg vanligvis R i en slik sammenheng at det faktisk var veldig likt et spørrespråk.

R er et statistisk databehandlingsmiljø og språk for statisk databehandling og visualisering (i henhold til dette).

Dataforskerens notater: En personlig gjennomgang av dataspørringsspråk
tatt derav. Forresten, jeg anbefaler det, bra materiale.

Hvorfor trenger en dataforsker å vite R? I det minste fordi det er et stort lag med ikke-IT-folk som analyserer data i R. Jeg kom over det på følgende steder:

  • Farmasøytisk sektor.
  • Biologer.
  • Finansiell sektor.
  • Folk med en ren matematisk utdannelse som driver med statistikk.
  • Spesialiserte statistiske modeller og maskinlæringsmodeller (som ofte kun finnes i forfatterens versjon som en R-pakke).

Hvorfor er det egentlig et spørrespråk? I den formen den ofte finnes i, er det faktisk en forespørsel om å lage en modell, inkludert å lese data og fikse spørrings(modell) parametere, samt å visualisere data i pakker som ggplot2 - dette er også en form for å skrive spørringer .

Eksempelspørsmål for visualisering

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

Generelt har mange ideer fra R migrert til python-pakker som pandaer, numpy eller scipy, som datarammer og datavektorisering - så generelt vil mange ting i R virke kjente og praktiske for deg.

Det er mange kilder å studere, f.eks. dette.

Kunnskapsgrafer

Her har jeg en litt uvanlig opplevelse, fordi jeg ganske ofte må jobbe med kunnskapsgrafer og spørrespråk for grafer. Derfor, la oss bare kort gå gjennom det grunnleggende, siden denne delen er litt mer eksotisk.

I klassiske relasjonsdatabaser har vi et fast skjema, men her er skjemaet fleksibelt, hvert predikat er faktisk en "kolonne" og enda mer.

Tenk deg at du modellerte en person og ønsket å beskrive viktige ting, la oss for eksempel ta en spesifikk person, Douglas Adams, og bruke denne beskrivelsen som grunnlag.

Dataforskerens notater: En personlig gjennomgang av dataspørringsspråk
www.wikidata.org/wiki/Q42

Hvis vi brukte en relasjonsdatabase, ville vi måtte lage en stor tabell eller tabeller med et stort antall kolonner, hvorav de fleste ville være NULL eller fylt med en feilaktig standardverdi, for eksempel er det usannsynlig at mange av oss har en oppføring i det koreanske nasjonalbiblioteket - selvfølgelig kunne vi sette dem i separate tabeller, men dette ville til slutt være et forsøk på å modellere en fleksibel logisk krets med predikater ved å bruke en fast relasjonell.

Dataforskerens notater: En personlig gjennomgang av dataspørringsspråk
Så forestill deg at alle data lagres som en graf eller som binære og unære boolske uttrykk.

Hvor kan du i det hele tatt støte på dette? For det første å jobbe med data wiki, og med eventuelle grafdatabaser eller tilkoblede data.

Følgende er hovedspørringsspråkene jeg har brukt og jobbet med.

SPARQL

Wiki:
SPARQL (rekursivt akronym fra Eng. SPARQL Protocol og RDF Query Language) - språk for dataspørring, representert ved modellen RDFOg protokoll å overføre disse forespørslene og svare på dem. SPARQL er en anbefaling W3C-konsortiet og en av teknologiene semantisk nett.

Men i virkeligheten er det et spørrespråk for logiske unære og binære predikater. Du spesifiserer ganske enkelt betinget hva som er fikset i et boolsk uttrykk og hva som ikke er det (veldig forenklet).

Selve RDF-basen (Resource Description Framework), som SPARQL-spørringer utføres over, er en trippel object, predicate, subject - og spørringen velger de nødvendige trippelene i henhold til de spesifiserte restriksjonene i ånden: finn en X slik at p_55(X, q_33) er sann - der selvfølgelig p_55 er en slags relasjon med ID 55, og q_33 er en objekt med ID 33 (her og hele historien, igjen utelater alle slags detaljer).

Eksempel på datapresentasjon:

Dataforskerens notater: En personlig gjennomgang av dataspørringsspråk
Bilder og eksempel med land her derav.

Eksempel på grunnleggende spørring

Dataforskerens notater: En personlig gjennomgang av dataspørringsspråk

Faktisk ønsker vi å finne verdien av ?landsvariabelen slik at for predikatet
member_of, det er sant at member_of(?country,q458) og q458 er ID-en til EU.

Et eksempel på en ekte SPARQL-spørring inne i pythonmotoren:

Dataforskerens notater: En personlig gjennomgang av dataspørringsspråk

Vanligvis har jeg måttet lese SPARQL i stedet for å skrive det – i den situasjonen vil det sannsynligvis være en nyttig ferdighet å forstå språket i det minste på et grunnleggende nivå for å forstå nøyaktig hvordan data hentes. 

Det er mye materiale å studere på nettet: for eksempel her dette и dette. Jeg pleier å google spesifikke design og eksempler, og det er nok for nå.

Logiske spørrespråk

Du kan lese mer om emnet i artikkelen min her. Og her vil vi bare kort undersøke hvorfor logiske språk er godt egnet for å skrive spørringer. I hovedsak er RDF bare et sett med logiske utsagn av formen p(X) og h(X,Y), og en logisk spørring har følgende form:

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

Her snakker vi om å lage en ny predikatutgang/1 (/1 betyr unær), forutsatt at for X er det sant at land(X) - dvs. X er et land og også medlem_av(X,"EU ").

Det vil si at i dette tilfellet presenteres både dataene og reglene på samme måte, noe som gjør at vi kan modellere problemer veldig enkelt og godt.

Hvor møtte du i bransjen?: et helt stort prosjekt med et selskap som skriver spørringer på et slikt språk, så vel som på det aktuelle prosjektet i kjernen av systemet - det ser ut til at dette er en ganske eksotisk ting, men noen ganger skjer det.

Et eksempel på et kodefragment i et logisk språk som behandler wikidata:

Dataforskerens notater: En personlig gjennomgang av dataspørringsspråk

Materialer: Jeg gir her et par lenker til det moderne logiske programmeringsspråket Answer Set Programming - jeg anbefaler å studere det:

Dataforskerens notater: En personlig gjennomgang av dataspørringsspråk

Kilde: www.habr.com

Legg til en kommentar