Data Scientist's Notes: En personlig granskning av datafrågespråk

Data Scientist's Notes: En personlig granskning av datafrågespråk
Jag berättar av personlig erfarenhet vad som var användbart var och när. Det är översikt och tes, så att det är tydligt vad och var du kan gräva vidare - men här har jag enbart subjektiv personlig erfarenhet, kanske är allt helt annorlunda för dig.

Varför är det viktigt att känna till och kunna använda frågespråk? I sin kärna har Data Science flera viktiga stadier av arbetet, och det allra första och viktigaste (utan det kommer absolut ingenting att fungera!) är att skaffa eller extrahera data. Oftast sitter data någonstans i någon form och behöver "hämtas" därifrån. 

Frågespråk låter dig extrahera just denna data! Och idag kommer jag att berätta om de frågespråk som har varit användbara för mig och jag kommer att berätta för dig och visa dig var och hur exakt - varför det behövs för att studera.

Det kommer att finnas tre huvudblock av datafrågetyper, som vi kommer att diskutera i den här artikeln:

  • "Standard" frågespråk är vad som vanligtvis förstås när man talar om ett frågespråk, till exempel relationalgebra eller SQL.
  • Skriptfrågespråk: till exempel Python-saker pandor, numpy eller skalskript.
  • Fråga språk för kunskapsgrafer och grafdatabaser.

Allt som skrivs här är bara en personlig upplevelse, vad som var användbart, med en beskrivning av situationer och "varför det behövdes" - alla kan prova hur liknande situationer kan komma din väg och försöka förbereda sig för dem i förväg genom att förstå dessa språk Innan du måste ansöka (brådskande) på ett projekt eller ens kommer till ett projekt där de behövs.

"Standard" frågespråk

Standard frågespråk är just i den meningen att vi brukar tänka på dem när vi pratar om frågor.

Relationell algebra

Varför behövs relationalgebra idag? För att ha en god förståelse för varför frågespråk är uppbyggda på ett visst sätt och använda dem medvetet måste du förstå kärnan bakom dem.

Vad är relationalgebra?

Den formella definitionen är följande: relationalgebra är ett slutet system av operationer på relationer i en relationsdatamodell. För att uttrycka det lite mer mänskligt, detta är ett system för operationer på tabeller så att resultatet alltid är en tabell.

Se alla relationsoperationer i detta artikel från Habr - här beskriver vi varför du behöver veta och var det kommer till användning.

Varför?

Att börja förstå vad frågespråk handlar om och vilka operationer som ligger bakom uttryck i specifika frågespråk ger ofta en djupare förståelse för vad som fungerar i frågespråk och hur.

Data Scientist's Notes: En personlig granskning av datafrågespråk
Tagen från detta artiklar. Ett exempel på en operation: join, som sammanfogar tabeller.

Material för studier:

Bra introduktionskurs från Stanford. I allmänhet finns det mycket material om relationalgebra och teori - Coursera, Udacity. Det finns också en enorm mängd material på nätet, inklusive bra akademiska kurser. Mitt personliga råd: du måste förstå relationalgebra mycket väl - detta är grunden för grunderna.

SQL

Data Scientist's Notes: En personlig granskning av datafrågespråk
Tagen från detta artikeln.

SQL är i huvudsak en implementering av relationalgebra - med en viktig varning, SQL är deklarativt! Det vill säga när man skriver en fråga på relations algebras språk säger man faktiskt hur man räknar – men med SQL anger man vad man vill extrahera, och då genererar DBMS redan (effektiva) uttryck på relations algebras språk (deras likvärdighet är känd för oss som Codds teorem).

Data Scientist's Notes: En personlig granskning av datafrågespråk
Tagen från detta artikeln.

Varför?

Relationella DBMS:er: Oracle, Postgres, SQL Server, etc finns fortfarande praktiskt taget överallt och det finns en otroligt stor chans att du kommer att behöva interagera med dem, vilket innebär att du antingen måste läsa SQL (vilket är mycket troligt) eller skriva det ( inte heller osannolikt).

Vad man ska läsa och studera

Enligt samma länkar ovan (om relationalgebra) finns det otroligt mycket material, t.ex. detta.

Förresten, vad är NoSQL?

"Det är värt att än en gång betona att termen "NoSQL" har ett absolut spontant ursprung och har ingen allmänt accepterad definition eller vetenskaplig institution bakom sig." Motsvarande artikel på Habr.

Faktum är att folk insåg att en fullständig relationsmodell inte behövs för att lösa många problem, särskilt för de där till exempel prestanda är avgörande och vissa enkla frågor med aggregering dominerar - där det är viktigt att snabbt beräkna mätvärden och skriva dem till databas, och de flesta funktioner är relationella visade sig inte bara vara onödiga, utan också skadliga - varför normalisera något om det kommer att förstöra det viktigaste för oss (för någon specifik uppgift) - produktivitet?

Dessutom behövs ofta flexibla scheman istället för de fasta matematiska scheman i den klassiska relationsmodellen - och detta förenklar otroligt mycket applikationsutveckling när det är viktigt att distribuera systemet och börja arbeta snabbt, bearbeta resultaten - eller schemat och typer av lagrad data är inte så viktiga.

Till exempel skapar vi ett expertsystem och vill lagra information om en specifik domän tillsammans med viss metainformation - vi kanske inte känner till alla fält och lagrar helt enkelt JSON för varje post - detta ger oss en mycket flexibel miljö för att utöka data modell och snabbt itererande - så i det här fallet kommer NoSQL att vara ännu att föredra och mer läsbar. Exempelinlägg (från ett av mina projekt där NoSQL var precis där det behövdes).

{"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 läsa mer här om NoSQL.

Vad ska man studera?

Här behöver du bara noggrant analysera din uppgift, vilka egenskaper den har och vilka NoSQL-system som finns tillgängliga som skulle passa denna beskrivning – och sedan börja studera detta system.

Språk för skriptfrågor

Till en början verkar det som vad Python har med det att göra i allmänhet - det är ett programmeringsspråk och inte alls om frågor.

Data Scientist's Notes: En personlig granskning av datafrågespråk

  • Pandas är bokstavligen en schweizisk armékniv inom datavetenskap; en enorm mängd datatransformation, aggregering etc. sker i den.
  • Numpy - vektorberäkningar, matriser och linjär algebra där.
  • Scipy - det finns mycket matematik i det här paketet, särskilt statistik.
  • Jupyter lab - mycket utforskande dataanalys passar bra in i bärbara datorer - bra att veta.
  • Förfrågningar - arbeta med nätverket.
  • Pyspark är mycket populärt bland dataingenjörer, troligen kommer du att behöva interagera med denna eller Spark, helt enkelt på grund av deras popularitet.
  • *Selen - mycket användbart för att samla in data från webbplatser och resurser, ibland finns det helt enkelt inget annat sätt att få data.

Mitt främsta råd: lär dig Python!

pandas

Låt oss ta följande kod som ett exempel:

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 huvudsak ser vi att koden passar in i det klassiska SQL-mönstret.

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 viktiga delen är att den här koden är en del av skriptet och pipelinen; i själva verket bäddar vi in ​​frågor i Python-pipelinen. I den här situationen kommer frågespråket till oss från bibliotek som Pandas eller pySpark.

I allmänhet ser vi i pySpark en liknande typ av datatransformation genom ett frågespråk i andan av:

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

Var och vad ska man läsa

På självaste Python i allmänhet inga problem hitta material att studera. Det finns ett stort antal tutorials online pandor, pySpark och kurser på Gnista (och även av sig själv DS). Sammantaget är innehållet här bra för att googla, och om jag var tvungen att välja ett paket att fokusera på skulle det naturligtvis vara pandor. Angående kombinationen av DS+Python-material också mycket.

Shell som frågespråk

En hel del databearbetnings- och analysprojekt som jag har arbetat med är i själva verket skalskript som anropar kod i Python, Java och själva skalkommandona. Därför kan du generellt sett betrakta pipelines i bash/zsh/etc som någon form av högnivåfråga (du kan naturligtvis stoppa in loopar där, men detta är inte typiskt för DS-kod i skalspråk), låt oss ge ett enkelt exempel - jag behövde göra en QID-mappning av wikidata och fullständiga länkar till de ryska och engelska wikis, för detta skrev jag en enkel begäran från kommandona i bash och för utdata skrev jag ett enkelt skript i Python, som jag sätta ihop så här:

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

där

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

Detta var i själva verket hela pipelinen som skapade den nödvändiga kartläggningen; som vi ser fungerade allt i stream-läge:

  • pv filsökväg - ger en förloppsindikator baserat på filstorlek och skickar dess innehåll vidare
  • unpigz -c läste en del av arkivet och gav det till jq
  • jq med nyckeln - stream producerade omedelbart resultatet och skickade det till postprocessorn (samma som med det allra första exemplet) i Python
  • internt var postprocessorn en enkel tillståndsmaskin som formaterade utdata 

Totalt sett en komplex pipeline som arbetar i flödesläge på stora data (0.5TB), utan betydande resurser och gjord av en enkel pipeline och ett par verktyg.

Ett annat viktigt tips: kunna arbeta bra och effektivt i terminalen och skriva bash/zsh/etc.

Var kommer det att vara användbart? Ja, nästan överallt - igen, det finns MYCKET material att studera på Internet. I synnerhet här detta min tidigare artikel.

R-skript

Återigen kan läsaren utbrista – ja, det här är ett helt programmeringsspråk! Och självklart kommer han att ha rätt. Jag stötte dock vanligtvis på R i ett sådant sammanhang att det faktiskt var väldigt likt ett frågespråk.

R är en statistisk beräkningsmiljö och ett språk för statisk beräkning och visualisering (enligt detta).

Data Scientist's Notes: En personlig granskning av datafrågespråk
tagen hence. Förresten, jag rekommenderar det, bra material.

Varför behöver en dataforskare veta R? Åtminstone eftersom det finns ett stort lager av icke-IT-personer som analyserar data i R. Jag stötte på det på följande ställen:

  • Läkemedelssektorn.
  • Biologer.
  • Finansiell sektor.
  • Personer med en rent matematisk utbildning som sysslar med statistik.
  • Specialiserade statistiska modeller och maskininlärningsmodeller (som ofta bara finns i författarens version som ett R-paket).

Varför är det egentligen ett frågespråk? I den form som den ofta finns i är det faktiskt en begäran att skapa en modell, inklusive att läsa data och fixa frågeparametrar (modell) samt visualisera data i paket som ggplot2 - detta är också en form av att skriva frågor .

Exempelfrågor för visualisering

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

I allmänhet har många idéer från R migrerat till pythonpaket som pandor, numpy eller scipy, som dataramar och datavektorisering - så i allmänhet kommer många saker i R att verka bekanta och bekväma för dig.

Det finns många källor att studera, t.ex. detta.

Kunskapsgrafer

Här har jag en lite ovanlig erfarenhet, eftersom jag ganska ofta måste arbeta med kunskapsgrafer och frågespråk för grafer. Låt oss därför bara kort gå igenom grunderna, eftersom den här delen är lite mer exotisk.

I klassiska relationsdatabaser har vi ett fast schema, men här är schemat flexibelt, varje predikat är faktiskt en "kolumn" och ännu mer.

Föreställ dig att du modellerade en person och ville beskriva viktiga saker, låt oss till exempel ta en specifik person, Douglas Adams, och använda denna beskrivning som grund.

Data Scientist's Notes: En personlig granskning av datafrågespråk
www.wikidata.org/wiki/Q42

Om vi ​​använde en relationsdatabas, skulle vi behöva skapa en eller flera enorma tabeller med ett stort antal kolumner, varav de flesta skulle vara NULL eller fyllda med ett felaktigt standardvärde, till exempel är det osannolikt att många av oss har ett post i det koreanska nationalbiblioteket - naturligtvis skulle vi kunna lägga dem i separata tabeller, men detta skulle i slutändan vara ett försök att modellera en flexibel logisk krets med predikat med hjälp av en fast relationell.

Data Scientist's Notes: En personlig granskning av datafrågespråk
Så föreställ dig att all data lagras som en graf eller som binära och unära booleska uttryck.

Var kan man ens stöta på detta? För det första att arbeta med data wiki, och med alla grafdatabaser eller anslutna data.

Följande är de viktigaste frågespråken som jag har använt och arbetat med.

SPARQL

Wiki:
SPARQL (rekursiv akronym från engelsk SPARQL-protokoll och RDF-frågespråk) - språk för datafrågor, representerad av modellen RDFOch protokoll att överföra dessa förfrågningar och svara på dem. SPARQL är en rekommendation W3C-konsortiet och en av teknikerna semantisk webb.

Men i verkligheten är det ett frågespråk för logiska unära och binära predikat. Du anger helt enkelt villkorligt vad som är fixat i ett booleskt uttryck och vad som inte är det (mycket förenklat).

Själva RDF-basen (Resource Description Framework), över vilken SPARQL-frågor exekveras, är en trippel object, predicate, subject - och frågan väljer de nödvändiga tripplarna enligt de angivna begränsningarna i andan: hitta ett X så att p_55(X, q_33) är sant - där, naturligtvis, p_55 är någon slags relation med ID 55, och q_33 är en objekt med ID 33 (här och hela historien, återigen utelämnar alla möjliga detaljer).

Exempel på datapresentation:

Data Scientist's Notes: En personlig granskning av datafrågespråk
Bilder och exempel med länder här hence.

Grundläggande frågeexempel

Data Scientist's Notes: En personlig granskning av datafrågespråk

Faktum är att vi vill hitta värdet på ?landsvariabeln så att för predikatet
member_of, det är sant att member_of(?country,q458) och q458 är Europeiska unionens ID.

Ett exempel på en riktig SPARQL-fråga inuti pythonmotorn:

Data Scientist's Notes: En personlig granskning av datafrågespråk

Vanligtvis har jag behövt läsa SPARQL istället för att skriva det - i den situationen skulle det troligen vara en användbar färdighet att förstå språket åtminstone på en grundläggande nivå för att förstå exakt hur data hämtas. 

Det finns mycket material att studera på nätet: till exempel här detta и detta. Jag brukar googla på specifika mönster och exempel och det räcker för nu.

Logiska frågespråk

Du kan läsa mer om ämnet i min artikel här. Och här kommer vi bara kort att undersöka varför logiska språk är väl lämpade för att skriva frågor. I huvudsak är RDF bara en uppsättning logiska satser av formen p(X) och h(X,Y), och en logisk fråga har följande form:

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

Här talar vi om att skapa en ny predikatutgång/1 (/1 betyder unär), förutsatt att det för X är sant att land(X) - dvs. X är ett land och även medlem_av(X,"EU ").

Det vill säga i det här fallet presenteras både data och regler på samma sätt, vilket gör det möjligt att modellera problem väldigt enkelt och bra.

Var träffades du i branschen?: ett helt stort projekt med ett företag som skriver frågor på ett sådant språk, liksom om det aktuella projektet i kärnan av systemet - det verkar som att detta är en ganska exotisk sak, men ibland händer det.

Ett exempel på ett kodfragment i ett logiskt språk som bearbetar wikidata:

Data Scientist's Notes: En personlig granskning av datafrågespråk

Material: Jag ger här ett par länkar till det moderna logiska programmeringsspråket Answer Set Programming - jag rekommenderar att du studerar det:

Data Scientist's Notes: En personlig granskning av datafrågespråk

Källa: will.com

Lägg en kommentar