Anteckningar frÄn Data Scientist: personlig översikt över dataförfrÄgningssprÄk

Anteckningar frÄn Data Scientist: personlig översikt över dataförfrÄgningssprÄk
Jag delar med mig av mina personliga erfarenheter om vad som varit anvĂ€ndbart, nĂ€r och var. En sammanfattande och punktlista som tydligt visar vad och var man kan fördjupa sig — men detta Ă€r endast baserat pĂ„ min subjektiva upplevelse, och din erfarenhet kan vara helt annorlunda.

Varför Àr det viktigt att kÀnna till och kunna hantera frÄgesprÄk? I Data Science finns det flera avgörande faser i arbetet, och den första och viktigaste (utan den fungerar ingenting!) Àr att skaffa eller hÀmta data. Ofta sitter data nÄgonstans i sin form och mÄste 'fiskas upp' dÀrifrÄn. 

FrĂ„gesprĂ„k gör just det möjligt att extrahera dessa data! Idag kommer jag att berĂ€tta om de frĂ„gesprĂ„k som varit anvĂ€ndbara för mig och visa var och hur de anvĂ€nds — varför det Ă€r viktigt att lĂ€ra sig dessa.

Vi kommer att gÄ igenom tre huvudsakliga block av datatyper av frÄgor som vi ska diskutera i denna artikel:

  • HĂ€r Ă€r de 'standardiserade' frĂ„gesprĂ„ken — de sprĂ„k som vanligtvis avses nĂ€r man pratar om frĂ„gesprĂ„k, som till exempel relationell algebra eller SQL.
  • SkriptfrĂ„gesprĂ„k: till exempel Python-grejer som pandas, numpy eller shell scripting.
  • FrĂ„gesprĂ„k för kunskapsgrafer och grafdatabaser.

Allt som skrivits hĂ€r Ă€r helt enkelt personliga erfarenheter, vad som varit anvĂ€ndbart, med beskrivningar av situationer och 'varför de behövdes' — varje person kan reflektera över i vilken utstrĂ€ckning liknande situationer kan uppstĂ„ för dem och försöka förbereda sig i förvĂ€g genom att sĂ€tta sig in i dessa sprĂ„k innan de mĂ„ste tillĂ€mpa dem (i brĂ„dskande fall) pĂ„ ett projekt eller ens hamna i ett projekt dĂ€r de behövs.

'Standardiserade' frÄgesprÄk

'Standardiserade' frÄgesprÄk i den meningen att det Àr vanligtvis dem vi tÀnker pÄ nÀr vi pratar om frÄgor.

Relationell algebra

Varför behövs relationell algebra idag? För att ha en god förstÄelse för varför frÄgesprÄk Àr utformade pÄ ett visst sÀtt och medvetet anvÀnda dem mÄste vi förstÄ kÀrnan som ligger till grund.

Vad Àr relationell algebra?

Den formella definitionen Ă€r: relationell algebra — ett slutet system av operationer pĂ„ relationer i den relationella datamodellen. Mer begripligt Ă€r det ett system av operationer pĂ„ tabeller, sĂ„dant att resultatet alltid ocksĂ„ Ă€r en tabell.

Se alla relationella operationer i denna artikeln frÄn Habr - hÀr beskriver vi varför det Àr viktigt att veta och var det anvÀnds.

Varför?

Du börjar förstÄ hur frÄgesprÄk egentligen Àr uppbyggda och vilka operationer som ligger bakom uttrycken i specifika frÄgesprÄk - det ger ofta en djupare förstÄelse för vad som hÀnder och hur det fungerar i frÄgesprÄken.

Anteckningar frÄn Data Scientist: personlig översikt över dataförfrÄgningssprÄk
Taget frÄn denna artiklar. Exempel pÄ en operation: join, som förenar tabeller.

Material för studier:

En bra introduktionskurs frÄn Stanford. Generellt finns det mycket material om relationell algebra och teori - Coursera, Udacity. Det finns ocksÄ en stor mÀngd material online, inklusive bra akademiska kurser. Mitt personliga rÄd: du mÄste förstÄ relationell algebra mycket vÀl - det Àr grunden till allt.

SQL

Anteckningar frÄn Data Scientist: personlig översikt över dataförfrÄgningssprÄk
Taget frÄn denna artiklar.

SQL Àr i grunden en implementering av relationell algebra - med den viktiga anmÀrkningen att SQL Àr deklarativt! Det vill sÀga nÀr du skriver en frÄga pÄ relationell algebra talar du faktiskt om hur det ska berÀknas - men med SQL beskriver du vad du vill hÀmta, och dÀrefter genererar DBMS redan (effektiva) uttryck pÄ relationell algebra (deras ekvivalens Àr kÀnd som Codd-teoremet).

Anteckningar frÄn Data Scientist: personlig översikt över dataförfrÄgningssprÄk
Taget frÄn denna artiklar.

Varför?

Relationella DBMS: Oracle, Postgres, SQL Server osv - finns fortfarande överallt och chanserna Àr stora att du kommer att behöva interagera med dem, vilket betyder att du antingen mÄste lÀsa SQL (vilket Àr mycket troligt) eller skriva i det (inte heller osannolikt).

Vad man ska lÀsa och studera

Via samma lÀnkar ovan (om relationell algebra) finns det otroligt mycket material, till exempel det hÀr.

Förresten, vad Àr NoSQL?

"Det Àr vÀrt att understryka igen att termen 'NoSQL' har ett helt spontant ursprung och saknar en allmÀnt erkÀnd definition eller nÄgot vetenskapligt institut bakom sig." Relaterat artikeln pÄ Habr.

I sjÀlva verket insÄg folk att den fullstÀndiga relationella modellen inte Àr nödvÀndig för att lösa mÄnga problem, sÀrskilt dÀr till exempel prestanda Àr avgörande och vissa enkla frÄgestÀllningar med aggregering dominerar - det Àr kritiskt att snabbt rÀkna metrik och skriva dem till databasen, och de flesta funktioner av relationella var inte bara onödiga, utan ocksÄ skadliga - varför normalisera nÄgot om det pÄverkar det mest viktiga för oss (för en viss specifik uppgift) - prestanda?

Det behövs ofta flexibla scheman istÀllet för fasta matematiska scheman frÄn den klassiska relationella modellen - och det förenklar verkligen utvecklingen av applikationer, nÀr det Àr kritiskt att snabbt distribuera systemet och börja arbeta, hantera resultaten - eller sÄ Àr schemat och typerna av lagrade data inte sÄ viktiga.

Till exempel, nÀr vi skapar ett expertssystem och vill lagra information om ett visst domÀn tillsammans med viss metadata - kan vi faktiskt inte veta alla fÀlt och enkelt lagra JSON för varje post - det ger oss en mycket flexibel miljö för att utöka datamodellen och snabbt iterera - dÀrför blir NoSQL i detta fall till och med att föredra och lÀsbarare. Ett exempel pÄ en post (frÄn ett av mina projekt dÀr NoSQL verkligen var 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 ). Ett typiskt exempel pÄ anvÀndning: om NoSQL.

Vad ska man studera?

Det handlar mer om att noggrant analysera din uppgift, vilka egenskaper den har och vilka NoSQL-system som passar under denna beskrivning - och sedan börja studera det specifika systemet.

Scriptbaserade frÄgesprÄk

Först verkar det som om Python hamnar lÄngt frÄn frÄgorna - det Àr ett programmeringssprÄk, och handlar inte alls om frÄgningar.

Anteckningar frÄn Data Scientist: personlig översikt över dataförfrÄgningssprÄk

  • Pandas Ă€r verkligen en schweizisk armĂ©kniv inom Data Science, en enorm mĂ€ngd datatransformationer, aggregeringar och sĂ„ vidare sker dĂ€r.
  • Numpy - vektorberĂ€kningar, matriser och linjĂ€r algebra finns dĂ€r.
  • Scipy - mycket matematik i detta paket, sĂ€rskilt statistik.
  • Jupyter lab - passar bra för mycket exploratory data analysis i anteckningsböcker - det Ă€r bra att kunna.
  • Requests - nĂ€tverksarbete.
  • Pyspark - mycket populĂ€r bland datatekniker, du kommer sannolikt att behöva interagera med denna eller Spark, bara pĂ„ grund av deras popularitet.
  • *Selenium - mycket anvĂ€ndbar för insamling av data frĂ„n webbsidor och resurser, ibland fĂ„r man helt enkelt inte tag pĂ„ data pĂ„ nĂ„got annat sĂ€tt.

Mitt viktigaste rÄd: lÀr dig Python!

Pandas

LÄt oss ta följande kod som exempel:

import pandas as pd
df = pd.read_csv("data/dataset.csv")
# BerÀkna och döp om aggregeringar
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 grund och botten 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'
GROUP BY start_station_name, end_station_name

Men en viktig del Àr att denna kod Àr en del av ett skript och en pipeline, vi integrerar faktiskt förfrÄgningar i en Python-pipeline. I detta fall kommer sprÄkförfrÄgningarna till oss frÄn bibliotek som Pandas eller pySpark.

I allmÀnhet ser vi i pySpark en liknande typ av datatransformation genom sprÄkförfrÄgningar i stil med:

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

Var och vad att lÀsa

Om sjĂ€lva Python Ă€r det inget problem att hitta material för att studera. Det finns en mĂ€ngd tutorials pĂ„ nĂ€tet om pandas, pySpark och kurser i Spark (liksom om sjĂ€lva DS). Generellt sett Ă€r materialet utmĂ€rkt sökbart och om jag skulle behöva vĂ€lja ett paket som man bör fokusera pĂ„ — skulle det vara pandas, sĂ„klart. Det finns ocksĂ„ mycket materiell.

Shell som sprÄk för förfrÄgningar

MĂ„nga projekt för bearbetning och analys av data, som jag har arbetat med — Ă€r i grund och botten shell-skript som anropar kod i Python, i Java och faktiskt sjĂ€lva shell-kommandona. DĂ€rför kan man i allmĂ€nhet betrakta pipelines i bash/zsh/etc. som en sorts hög nivĂ„förfrĂ„gan (man kan naturligtvis stoppa in loopar dĂ€r, men det Ă€r atypiskt för DS-kod i shell-sprĂ„k), hĂ€r Ă€r ett enkelt exempel — jag behövde göra en mappning av QID frĂ„n Wikidata och den fullstĂ€ndiga lĂ€nken till den ryska och engelska Wikipedia, för detta skrev jag en enkel förfrĂ„gan av kommandon i bash och för utskriften skrev jag ett enkelt skript i Python, som jag satte ihop sĂ„ hĂ€r:

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

w

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 grund och botten hela pipelinen som skapade den nödvÀndiga mappningen, som vi ser fungerade allt i realtid:

  • pv filepath — ger en progressbar baserat pĂ„ filstorlek och skickar dess innehĂ„ll vidare
  • unpigz -c lĂ€ste en del av arkivet och skickade det till jq
  • jq med nyckeln — stream gav omedelbart resultat och skickade det till efterbehandlaren (liksom i det första exemplet) i Python
  • inuti efterbehandlaren — Ă€r en enkel maskin för tillstĂ„nd som formaterade utdata 

Totalt Àr det en komplex pipeline som fungerar i strömmodus pÄ stora data (0,5 TB), utan betydande resurser och skapad av en enkel pipeline och ett par verktyg.

Ett annat viktigt tips: lÀr dig att arbeta bra och effektivt i terminalen och skriva i bash/zsh/etc.

Var Ă€r detta anvĂ€ndbart? NĂ€stan överallt – det finns MYCKET material för studier pĂ„ nĂ€tet. Specifikt, hĂ€r Ă€r detta min tidigare artikel.

R scripting

Återigen kan lĂ€saren utropa – men det Ă€r ju ett helt programmeringssprĂ„k! Och sjĂ€lvklart har de rĂ€tt. Men jag har oftast stött pĂ„ R i sĂ„dana sammanhang att det i praktiken liknar ett frĂ„gesprĂ„k.

R Àr en miljö för statistiska berÀkningar och ett sprÄk för statistiska berÀkningar och visualisering (enligt detta).

Anteckningar frÄn Data Scientist: personlig översikt över dataförfrÄgningssprÄk
Taget hÀrifrÄn. Förresten rekommenderar jag, bra material.

Varför behöver en data scientist veta R? Åtminstone för att det finns en stor grupp mĂ€nniskor utanför IT som sysslar med dataanalys i R. Jag har stött pĂ„ det pĂ„ följande stĂ€llen:

  • Det farmaceutiska sektorn.
  • Biologer.
  • Finanssektorn.
  • MĂ€nniskor med ren matematisk utbildning som sysslar med statistik.
  • Specialiserade statistiska modeller och maskininlĂ€rningsmodeller (som ofta endast kan hittas i författarversioner i form av R-paket).

Varför Ă€r detta faktiskt ett frĂ„gesprĂ„k? I den form det ofta förekommer – det Ă€r i grunden en förfrĂ„gan om att skapa en modell, inklusive att lĂ€sa data och faststĂ€lla parametrar för förfrĂ„gan (modellen), samt visualisering av data i paket som ggplot2 – detta Ă€r ocksĂ„ en form av att skriva förfrĂ„gningar.

Exempel pÄ förfrÄgningar 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"))

Generellt har mĂ„nga idĂ©er frĂ„n R övergĂ„tt till Python-paket som pandas, numpy eller scipy, som dataframes och vektorisering av data – dĂ€rför kommer mĂ„nga saker i R att verka bekanta och anvĂ€ndbara för dig.

Det finns mÄnga kÀllor för att lÀra sig, till exempel, det hÀr.

Kunskapsgrafer (Knowledge graph)

HÀr har jag lite ovanlig erfarenhet, eftersom jag ofta fÄr arbeta med kunskapsgrafer och frÄgesprÄk för grafer. SÄ lÄt oss bara snabbt gÄ igenom grunderna, eftersom denna del Àr nÄgot mer exotisk.

I klassiska relationella databaser har vi ett fast schema – hĂ€r Ă€r schemat flexibelt, varje predikat Ă€r faktiskt en "kolumn" och Ă€nnu mer.

TÀnk dig att du skulle modellera en mÀnniska och ville beskriva nyckeldetaljer, vi tar en specifik person, Douglas Adams, som utgÄngspunkt och anvÀnder denna beskrivning.

Anteckningar frÄn Data Scientist: personlig översikt över dataförfrÄgningssprÄk
www.wikidata.org/wiki/Q42

Om vi hade anvĂ€nt en relationell databas skulle vi ha behövt skapa en enorm tabell eller flera tabeller med ett stort antal kolumner, dĂ€r en stor del av dem nog skulle vara NULL eller fyllda med nĂ„got standard False-vĂ€rde, till exempel Ă€r det osannolikt att mĂ„nga av oss har en post i det nationella koreanska biblioteket – sjĂ€lvklart skulle vi kunna flytta dem till separata tabeller, men det skulle i slutĂ€ndan vara ett försök att modellera ett flexibelt logiskt schema med predikat med hjĂ€lp av en fast relationell databas.

Anteckningar frÄn Data Scientist: personlig översikt över dataförfrÄgningssprÄk
SÄ förestÀll dig att all data lagras i form av en graf eller som binÀra och unÀra logiska uttryck.

Var kan du överhuvudtaget stöta pÄ det hÀr? Först och frÀmst nÀr man arbetar med wikidata, ja, och med alla grafdatabaser eller relaterade data.

Nedan följer de huvudsakliga frÄgesprÄken som jag har varit tvungen att anvÀnda och arbeta med.

SPARQL

Wiki:
SPARQL (rekursivt akronym frĂ„n eng. SPARQL Protocol and RDF Query Language) — frĂ„gesprĂ„k för data, presenterat enligt modellen RDF, samt protokoll för att överföra dessa förfrĂ„gningar och svar pĂ„ dem. SPARQL Ă€r en rekommendation frĂ„n W3C-konsortiet och en av teknologierna den semantiska webben..

I sjÀlva verket Àr det ett frÄgesprÄk för logiska unÀra och binÀra predikat. Det specificeras helt enkelt vad som Àr fast i det logiska uttrycket och vad som inte Àr (mycket förenklat).

SjĂ€lva RDF-databasen (Resource Description Framework), dĂ€r SPARQL-förfrĂ„gningar utförs, Ă€r en triplet objekt, predikat, subjekt – och frĂ„gan vĂ€ljer de relevanta tripletterna enligt angivna begrĂ€nsningar i stil med: hitta sĂ„dan X att p_55(X, q_33) Ă€r sant – dĂ€r p_55 sjĂ€lvklart Ă€r en relation med ID 55, och q_33 Ă€r objektet med ID 33 (och det Ă€r hela berĂ€ttelsen, igen utan att gĂ„ in pĂ„ alla möjliga detaljer).

Exempel pÄ datavisualisering:

Anteckningar frÄn Data Scientist: personlig översikt över dataförfrÄgningssprÄk
Bilder och exempel med lÀnder Àr hÀr hÀrifrÄn.

Exempel pÄ en grundlÀggande förfrÄgan

Anteckningar frÄn Data Scientist: personlig översikt över dataförfrÄgningssprÄk

I sjÀlva verket vill vi hitta vÀrdet av variabeln ?country, sÄdant att för predikatet
member_of, Àr det sant att member_of(?country,q458), dÀr q458 Àr ID för Europeiska unionen.

Ett exempel pÄ en verklig SPARQL-förfrÄgan inom python-motorn:

Anteckningar frÄn Data Scientist: personlig översikt över dataförfrÄgningssprÄk

Som regel har jag fĂ„tt lĂ€sa SPARQL snarare Ă€n att skriva den — i en sĂ„dan situation Ă€r det förmodligen en nyttig fĂ€rdighet att förstĂ„ sprĂ„ket Ă„tminstone pĂ„ en grundlĂ€ggande nivĂ„ för att förstĂ„ hur data faktiskt hĂ€mtas. 

Det finns mycket material online för att studera: till exempel hÀr Àr det hÀr och det hÀr. Jag brukar vanligtvis googla specifika konstruktioner och exempel och det rÀcker hittills.

Logiska förfrÄgningssprÄk

Mer om Àmnet kan lÀsas i min artikel ). Ett typiskt exempel pÄ anvÀndning:. HÀr gÄr vi dock bara kort igenom varför logiska sprÄk Àr bra för att skriva förfrÄgningar. I grund och botten Àr RDF bara en uppsÀttning logiska pÄstÄenden av typen p(X) och h(X,Y), och en logisk förfrÄgan har följande form:

output(X) :- country(X), member_of(X, "EU").

HĂ€r pratar vi om att skapa en ny predikat output/1 (/1 betyder unĂ€r), under förutsĂ€ttning att det för X gĂ€ller att country(X) — det vill sĂ€ga, X Ă€r ett land och Ă€ven member_of(X, "EU").

Det innebÀr att bÄde data och regler i detta fall representeras pÄ exakt samma sÀtt, vilket gör det mycket enkelt och bra att modellera uppgifter.

DĂ€r de förekommit i branschen: ett stort projekt med ett företag som skriver förfrĂ„gningar pĂ„ ett sĂ„dant sprĂ„k, samt i det nuvarande projektet i systemets kĂ€rna — det verkar vara en ganska exotisk sak, men ibland förekommer det.

Ett exempel pÄ en kodsnutt i ett logiskt sprÄk som bearbetar wikidata:

Anteckningar frÄn Data Scientist: personlig översikt över dataförfrÄgningssprÄk

Material: jag ger hĂ€r nĂ„gra lĂ€nkar till det moderna logiska programmeringssprĂ„ket Answer Set Programming — jag rekommenderar att studera just det:

Anteckningar frÄn Data Scientist: personlig översikt över dataförfrÄgningssprÄk

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster