Data Scientists noter: En personlig gennemgang af dataforespørgselssprog

Data Scientists noter: En personlig gennemgang af dataforespørgselssprog
Jeg fortæller dig af personlig erfaring, hvad der var nyttigt hvor og hvornår. Det er overblik og tese, så det er klart, hvad og hvor du kan grave videre - men her har jeg udelukkende subjektiv personlig erfaring, måske er alt helt anderledes for dig.

Hvorfor er det vigtigt at kende og kunne håndtere forespørgselssprog? Data Science har i sin kerne flere vigtige stadier af arbejdet, og det allerførste og vigtigste (uden det, vil intet fungere!) er at indhente eller udtrække data. Oftest sidder dataene et eller andet sted i en eller anden form og skal "hentes" derfra. 

Forespørgselssprog giver dig mulighed for at udtrække netop disse data! Og i dag vil jeg fortælle dig om de forespørgselssprog, der har været nyttige for mig, og jeg vil fortælle dig og vise dig, hvor og hvordan præcist - hvorfor det er nødvendigt at studere.

Der vil være tre hovedblokke af dataforespørgselstyper, som vi vil diskutere i denne artikel:

  • "Standard" forespørgselssprog er det, der almindeligvis forstås, når man taler om et forespørgselssprog, såsom relationel algebra eller SQL.
  • Scripting forespørgselssprog: for eksempel Python ting pandaer, numpy eller shell scripting.
  • Forespørgselssprog til vidensgrafer og grafdatabaser.

Alt skrevet her er kun en personlig oplevelse, hvad der var nyttigt, med en beskrivelse af situationer og "hvorfor det var nødvendigt" - alle kan prøve, hvordan lignende situationer kan komme din vej og forsøge at forberede sig på dem på forhånd ved at forstå disse sprog ​før du skal ansøge (hurtigt) på et projekt eller endda kommer til et projekt, hvor der er behov for dem.

"Standard" forespørgselssprog

Standard forespørgselssprog er netop i den forstand, at vi normalt tænker på dem, når vi taler om forespørgsler.

Relationel algebra

Hvorfor er relationel algebra nødvendig i dag? For at have en god forståelse af, hvorfor forespørgselssprog er struktureret på en bestemt måde og bruge dem bevidst, skal du forstå kernen bag dem.

Hvad er relationel algebra?

Den formelle definition er som følger: relationel algebra er et lukket system af operationer på relationer i en relationel datamodel. For at sige det lidt mere menneskeligt er dette et system af operationer på tabeller, således at resultatet altid er en tabel.

Se alle relationelle operationer i dette artikel fra Habr - her beskriver vi, hvorfor du skal vide det, og hvor det er praktisk.

Hvorfor?

At begynde at forstå, hvad forespørgselssprog handler om, og hvilke operationer der ligger bag udtryk i specifikke forespørgselssprog, giver ofte en dybere forståelse af, hvad der virker i forespørgselssprog og hvordan.

Data Scientists noter: En personlig gennemgang af dataforespørgselssprog
Taget fra dette artikler. Et eksempel på en operation: join, som forbinder tabeller.

Materialer til undersøgelse:

Godt introduktionskursus fra Stanford. Generelt er der en masse materialer om relationel algebra og teori - Coursera, Udacity. Der er også en enorm mængde materiale online, herunder godt akademiske kurser. Mit personlige råd: du skal forstå relationel algebra meget godt - dette er grundlaget for det grundlæggende.

SQL

Data Scientists noter: En personlig gennemgang af dataforespørgselssprog
Taget fra dette artikel.

SQL er grundlæggende en implementering af relationel algebra - med en vigtig advarsel, SQL er deklarativ! Det vil sige, at når man skriver en forespørgsel på sproget relational algebra, siger man faktisk, hvordan man regner – men med SQL angiver man, hvad man vil udtrække, og så genererer DBMS’en allerede (effektive) udtryk i relational algebra-sproget (deres ækvivalens er kendt for os som Codds sætning).

Data Scientists noter: En personlig gennemgang af dataforespørgselssprog
Taget fra dette artikel.

Hvorfor?

Relationelle DBMS'er: Oracle, Postgres, SQL Server osv. er stadig stort set overalt, og der er en utrolig stor chance for, at du bliver nødt til at interagere med dem, hvilket betyder, at du enten bliver nødt til at læse SQL (hvilket er meget sandsynligt) eller skrive det ( heller ikke usandsynligt).

Hvad skal man læse og studere

Ifølge de samme links ovenfor (om relationel algebra) er der utroligt meget materiale, f.eks. dette.

Forresten, hvad er NoSQL?

"Det er værd at understrege endnu en gang, at udtrykket "NoSQL" har en absolut spontan oprindelse og har ingen almindeligt accepteret definition eller videnskabelig institution bag sig." Tilsvarende artiklen paa Habr.

Faktisk indså folk, at en fuld relationel model ikke er nødvendig for at løse mange problemer, især for dem, hvor f.eks. ydeevne er kritisk, og visse simple forespørgsler med aggregering dominerer - hvor det er vigtigt hurtigt at beregne metrics og skrive dem til database, og de fleste funktioner er relationelle viste sig ikke kun at være unødvendige, men også skadelige - hvorfor normalisere noget, hvis det vil ødelægge det vigtigste for os (for en bestemt opgave) - produktivitet?

Der er også ofte behov for fleksible skemaer i stedet for de faste matematiske skemaer i den klassiske relationsmodel - og dette forenkler utroligt meget applikationsudvikling, når det er afgørende at implementere systemet og begynde at arbejde hurtigt, behandle resultaterne - eller skemaet og typerne af lagrede data er ikke så vigtige.

For eksempel opretter vi et ekspertsystem og ønsker at gemme information på et bestemt domæne sammen med nogle metaoplysninger - vi kender måske ikke alle felterne og gemmer simpelthen JSON for hver post - dette giver os et meget fleksibelt miljø til at udvide dataene model og hurtigt itererende - så i dette tilfælde vil NoSQL være endnu at foretrække og mere læsbar. Eksempelindlæg (fra et af mine projekter, hvor NoSQL var lige der, hvor det var nødvendigt).

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

Læs mere her om NoSQL.

Hvad skal man studere?

Her skal du snarere blot analysere din opgave grundigt, hvilke egenskaber den har, og hvilke NoSQL-systemer der er tilgængelige, som ville passe til denne beskrivelse - og så begynde at studere dette system.

Scripting forespørgselssprog

I første omgang ser det ud til, hvad Python har med det at gøre generelt - det er et programmeringssprog og slet ikke om forespørgsler.

Data Scientists noter: En personlig gennemgang af dataforespørgselssprog

  • Pandas er bogstaveligt talt en schweizisk hærkniv inden for datavidenskab; der sker en enorm mængde datatransformation, aggregering osv. i den.
  • Numpy - vektorberegninger, matricer og lineær algebra der.
  • Scipy - der er meget matematik i denne pakke, især statistik.
  • Jupyter lab - en masse undersøgende dataanalyse passer godt ind i bærbare computere - nyttigt at vide.
  • Forespørgsler - arbejde med netværket.
  • Pyspark er meget populær blandt dataingeniører, højst sandsynligt bliver du nødt til at interagere med denne eller Spark, simpelthen på grund af deres popularitet.
  • *Selen - meget nyttigt til at indsamle data fra websteder og ressourcer, nogle gange er der simpelthen ingen anden måde at få dataene på.

Mit vigtigste råd: lær Python!

pandas

Lad os tage følgende kode som 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 det væsentlige ser vi, at koden passer ind i det klassiske SQL-mønster.

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 vigtige del er, at denne kode er en del af scriptet og pipelinen; faktisk indlejrer vi forespørgsler i Python-pipelinen. I denne situation kommer forespørgselssproget til os fra biblioteker som Pandas eller pySpark.

Generelt ser vi i pySpark en lignende type datatransformation gennem et forespørgselssprog i ånden af:

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

Hvor og hvad skal man læse

På selve Python generelt ikke et problem finde materialer til at studere. Der er et stort antal tutorials online pandaer, pySpark og kurser vedr Spark (og også af sig selv DS). Samlet set er indholdet her fantastisk til at google, og hvis jeg skulle vælge én pakke at fokusere på, ville det selvfølgelig være pandaer. Med hensyn til kombinationen af ​​DS+Python materialer også meget meget.

Shell som forespørgselssprog

En hel del databehandlings- og analyseprojekter, som jeg har arbejdet med, er i virkeligheden shell-scripts, der kalder kode i Python, Java og selve shell-kommandoerne. Derfor kan du generelt betragte pipelines i bash/zsh/etc som en slags forespørgsel på højt niveau (du kan selvfølgelig fylde loops derinde, men det er ikke typisk for DS-kode i shell-sprog), lad os give et simpelt eksempel - jeg havde brug for at lave en QID-mapping af wikidata og fulde links til de russiske og engelske wikier, til dette skrev jeg en simpel anmodning fra kommandoerne i bash og til outputtet skrev jeg et simpelt script i Python, som jeg sat sammen sådan her:

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

где

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 pipelinen, der skabte den nødvendige kortlægning; som vi ser, fungerede alt i stream-tilstand:

  • pv filsti - giver en statuslinje baseret på filstørrelse og sender indholdet videre
  • unpigz -c læste en del af arkivet og gav det til jq
  • jq med nøglen - stream producerede straks resultatet og sendte det til postprocessoren (samme som med det allerførste eksempel) i Python
  • internt var postprocessoren en simpel tilstandsmaskine, der formaterede outputtet 

I alt en kompleks pipeline, der arbejder i flow-tilstand på store data (0.5TB), uden væsentlige ressourcer og lavet af en simpel pipeline og et par værktøjer.

Et andet vigtigt tip: kunne arbejde godt og effektivt i terminalen og skrive bash/zsh/etc.

Hvor vil det være nyttigt? Ja, næsten overalt - igen, der er MANGE materialer at studere på internettet. Især her dette min tidligere artikel.

R scripting

Igen kan læseren udbryde - ja, dette er et helt programmeringssprog! Og selvfølgelig vil han have ret. Jeg stødte dog normalt på R i en sådan sammenhæng, at det faktisk lignede et forespørgselssprog.

R er et statistisk computermiljø og sprog til statisk databehandling og visualisering (ifølge dette).

Data Scientists noter: En personlig gennemgang af dataforespørgselssprog
taget dermed. I øvrigt anbefaler jeg det, godt materiale.

Hvorfor skal en dataforsker kende R? I hvert fald fordi der er et kæmpe lag af ikke-it-folk, der analyserer data i R. Jeg stødte på det følgende steder:

  • Farmaceutisk sektor.
  • Biologer.
  • Finansiel sektor.
  • Folk med en rent matematisk uddannelse, der beskæftiger sig med statistik.
  • Specialiserede statistiske modeller og maskinlæringsmodeller (som ofte kun kan findes i forfatterens version som en R-pakke).

Hvorfor er det egentlig et forespørgselssprog? I den form som det ofte findes i, er det faktisk en anmodning om at oprette en model, herunder at læse data og rette forespørgsels(model) parametre, samt visualisere data i pakker såsom ggplot2 - dette er også en form for at skrive forespørgsler .

Eksempelforespørgsler til 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 er mange ideer fra R migreret til python-pakker såsom pandaer, numpy eller scipy, som dataframes og datavektorisering - så generelt vil mange ting i R virke bekendte og praktiske for dig.

Der er mange kilder at studere, f.eks. dette.

Viden grafer

Her har jeg en lidt usædvanlig oplevelse, fordi jeg ret ofte skal arbejde med vidensgrafer og forespørgselssprog til grafer. Lad os derfor lige kort gennemgå det grundlæggende, da denne del er lidt mere eksotisk.

I klassiske relationsdatabaser har vi et fast skema, men her er skemaet fleksibelt, hvert prædikat er faktisk en "kolonne" og endnu mere.

Forestil dig, at du modellerede en person og ønskede at beskrive centrale ting, lad os for eksempel tage en bestemt person, Douglas Adams, og bruge denne beskrivelse som grundlag.

Data Scientists noter: En personlig gennemgang af dataforespørgselssprog
www.wikidata.org/wiki/Q42

Hvis vi brugte en relationsdatabase, ville vi være nødt til at oprette en enorm tabel eller tabeller med et stort antal kolonner, hvoraf de fleste ville være NULL eller udfyldt med en eller anden falsk standardværdi, for eksempel er det usandsynligt, at mange af os har en indgang i det koreanske nationalbibliotek - selvfølgelig kunne vi placere dem i separate tabeller, men dette ville i sidste ende være et forsøg på at modellere et fleksibelt logisk kredsløb med prædikater ved hjælp af et fast relationelt kredsløb.

Data Scientists noter: En personlig gennemgang af dataforespørgselssprog
Så forestil dig, at alle data er gemt som en graf eller som binære og unære booleske udtryk.

Hvor kan du overhovedet støde på dette? For det første arbejde med data wiki, og med eventuelle grafdatabaser eller forbundne data.

Følgende er de vigtigste forespørgselssprog, som jeg har brugt og arbejdet med.

SPARQL

Wiki:
SPARQL (rekursivt akronym fra engelsk SPARQL-protokol og RDF-forespørgselssprog) - dataforespørgselssprog, repræsenteret ved modellen RDFog protokol at sende disse anmodninger og besvare dem. SPARQL er en anbefaling W3C konsortium og en af ​​teknologierne semantisk web.

Men i virkeligheden er det et forespørgselssprog for logiske unære og binære prædikater. Du angiver blot betinget, hvad der er fast i et boolesk udtryk, og hvad der ikke er (meget forenklet).

Selve RDF-basen (Resource Description Framework), som SPARQL-forespørgsler udføres over, er en tredobbelt object, predicate, subject - og forespørgslen vælger de nødvendige tripler i henhold til de specificerede begrænsninger i ånden: find et X, således at p_55(X, q_33) er sandt - hvor p_55 selvfølgelig er en slags relation med ID 55, og q_33 er en objekt med ID 33 (her og hele historien, igen udeladt alle mulige detaljer).

Eksempel på datapræsentation:

Data Scientists noter: En personlig gennemgang af dataforespørgselssprog
Billeder og eksempel med lande her dermed.

Eksempel på grundlæggende forespørgsel

Data Scientists noter: En personlig gennemgang af dataforespørgselssprog

Faktisk ønsker vi at finde værdien af ​​?landevariablen sådan, at for prædikatet
medlem_af, det er rigtigt, at member_of(?land,q458) og q458 er EU's ID.

Et eksempel på en rigtig SPARQL-forespørgsel inde i python-motoren:

Data Scientists noter: En personlig gennemgang af dataforespørgselssprog

Typisk har jeg været nødt til at læse SPARQL frem for at skrive det - i den situation ville det sandsynligvis være en nyttig færdighed at forstå sproget i det mindste på et grundlæggende niveau for at forstå præcis, hvordan data hentes. 

Der er meget materiale at studere online: for eksempel her dette и dette. Jeg plejer at google specifikke designs og eksempler, og det er nok for nu.

Logiske forespørgselssprog

Du kan læse mere om emnet i min artikel her. Og her vil vi kun kort undersøge, hvorfor logiske sprog er velegnede til at skrive forespørgsler. I det væsentlige er RDF blot et sæt logiske udsagn af formen p(X) og h(X,Y), og en logisk forespørgsel har følgende form:

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

Her taler vi om at skabe et nyt prædikatoutput/1 (/1 betyder unært), forudsat at det for X er sandt, at land(X) - dvs. X er et land og også medlem_af(X,"EU ").

Det vil sige, at både data og regler i dette tilfælde præsenteres på samme måde, hvilket gør det muligt at modellere problemer meget nemt og godt.

Hvor mødte du i branchen?: et helt stort projekt med en virksomhed, der skriver forespørgsler på et sådant sprog, samt om det aktuelle projekt i kernen af ​​systemet - det ser ud til, at det er en ret eksotisk ting, men nogle gange sker det.

Et eksempel på et kodefragment i et logisk sprog, der behandler wikidata:

Data Scientists noter: En personlig gennemgang af dataforespørgselssprog

Materialer: Jeg vil her give et par links til det moderne logiske programmeringssprog Answer Set Programming - jeg anbefaler at studere det:

Data Scientists noter: En personlig gennemgang af dataforespørgselssprog

Kilde: www.habr.com

Tilføj en kommentar