Datawetenskaplike se notas: 'n Persoonlike oorsig van datanavraagtale

Datawetenskaplike se notas: 'n Persoonlike oorsig van datanavraagtale
Ek vertel jou uit persoonlike ondervinding wat waar en wanneer nuttig was. Dis oorsig en tesis, sodat dit duidelik is wat en waar jy verder kan delf - maar hier het ek uitsluitlik subjektiewe persoonlike ervaring, miskien is alles heeltemal anders vir jou.

Hoekom is dit belangrik om navraagtale te ken en te kan gebruik? In sy kern het Data Science verskeie belangrike fases van werk, en die heel eerste en belangrikste (daarsonder sal beslis niks werk nie!) is die verkryging of onttrekking van data. Dikwels sit die data iewers in een of ander vorm en moet dit daarvandaan "herwin" word. 

Navraagtale laat jou toe om hierdie einste data te onttrek! En vandag sal ek jou vertel van daardie navraagtale wat vir my nuttig was en ek sal jou vertel en jou wys waar en hoe presies - hoekom dit nodig is om te studeer.

Daar sal drie hoofblokke van tipes datanavrae wees, wat ons in hierdie artikel sal bespreek:

  • "Standaard" navraagtale is wat algemeen verstaan ​​word wanneer daar oor 'n navraagtaal gepraat word, soos relasionele algebra of SQL.
  • Skripnavraagtale: byvoorbeeld Python-dinge-pandas, numpy of shell scripting.
  • Navrae tale vir kennisgrafieke en grafiekdatabasisse.

Alles wat hier geskryf is, is net 'n persoonlike ervaring, wat nuttig was, met 'n beskrywing van situasies en "waarom dit nodig was" - almal kan probeer hoe soortgelyke situasies oor jou pad kan kom en probeer om vooraf daarvoor voor te berei deur hierdie tale te verstaan ​​​​voordat jy (dringend) op 'n projek moet aansoek doen of selfs by 'n projek moet uitkom waar dit nodig is.

"Standaard" navraagtale

Standaardnavraagtale is juis in die sin dat ons gewoonlik daaraan dink wanneer ons oor navrae praat.

Relasionele algebra

Hoekom is relasionele algebra vandag nodig? Om 'n goeie begrip te hê van hoekom navraagtale op 'n sekere manier gestruktureer is en dit bewustelik gebruik, moet jy die kern onderliggend daaraan verstaan.

Wat is relasionele algebra?

Die formele definisie is soos volg: relasionele algebra is 'n geslote stelsel van bewerkings op relasies in 'n relasionele datamodel. Om dit 'n bietjie meer menslik te stel, dit is 'n stelsel van bewerkings op tabelle sodat die resultaat altyd 'n tabel is.

Sien alle relasionele bewerkings in hierdie artikel van Habr - hier beskryf ons hoekom jy moet weet en waar dit handig te pas kom.

Зачем?

Om te begin verstaan ​​waaroor navraagtale gaan en watter bewerkings agter uitdrukkings in spesifieke navraagtale is, gee dit dikwels 'n dieper begrip van wat in navraagtale werk en hoe.

Datawetenskaplike se notas: 'n Persoonlike oorsig van datanavraagtale
Geneem vanaf hierdie artikels. 'n Voorbeeld van 'n bewerking: join, wat tabelle verbind.

Studiemateriaal:

Goeie inleidende kursus van Stanford. Oor die algemeen is daar baie materiaal oor relasionele algebra en teorie - Coursera, Udacity. Daar is ook 'n groot hoeveelheid materiaal aanlyn, insluitend goed akademiese kursusse. My persoonlike raad: jy moet relasionele algebra baie goed verstaan ​​- dit is die basis van die basiese beginsels.

SQL

Datawetenskaplike se notas: 'n Persoonlike oorsig van datanavraagtale
Geneem vanaf hierdie artikel.

SQL is in wese 'n implementering van relasionele algebra - met 'n belangrike voorbehoud, SQL is verklarend! Dit wil sê, wanneer jy 'n navraag in die taal van relasionele algebra skryf, sê jy eintlik hoe om te bereken - maar met SQL spesifiseer jy wat jy wil onttrek, en dan genereer die DBMS reeds (effektiewe) uitdrukkings in die taal van relasionele algebra ( hulle ekwivalensie is aan ons bekend as Codd se stelling).

Datawetenskaplike se notas: 'n Persoonlike oorsig van datanavraagtale
Geneem vanaf hierdie artikel.

Зачем?

Relasionele DBBS'e: Oracle, Postgres, SQL Server, ens. is nog feitlik oral en daar is 'n ongelooflike groot kans dat jy met hulle sal moet omgaan, wat beteken dat jy óf SQL sal moet lees (wat heel waarskynlik is) óf dit sal skryf ( ook nie onwaarskynlik nie).

Wat om te lees en te bestudeer

Volgens dieselfde skakels hierbo (oor relasionele algebra) is daar 'n ongelooflike hoeveelheid materiaal, bv. hierdie.

Terloops, wat is NoSQL?

"Dit is die moeite werd om weereens te beklemtoon dat die term "NoSQL" 'n absoluut spontane oorsprong het en geen algemeen aanvaarde definisie of wetenskaplike instelling daaragter het nie." Ooreenstemmende статья op Habr.

Trouens, mense het besef dat 'n volledige verhoudingsmodel nie nodig is om baie probleme op te los nie, veral vir dié waar byvoorbeeld prestasie van kritieke belang is en sekere eenvoudige navrae met samevoeging oorheers - waar dit van kritieke belang is om metrieke vinnig te bereken en dit na die databasis, en die meeste kenmerke is relasioneel blyk nie net onnodig te wees nie, maar ook skadelik - hoekom iets normaliseer as dit die belangrikste ding vir ons sal bederf (vir 'n spesifieke taak) - produktiwiteit?

Buigsame skemas is ook dikwels nodig in plaas van die vaste wiskundige skemas van die klassieke relasionele model - en dit vereenvoudig toepassingsontwikkeling ongelooflik wanneer dit van kritieke belang is om die stelsel te ontplooi en vinnig te begin werk, die resultate te verwerk - of die skema en tipes gestoorde data is nie so belangrik nie.

Ons skep byvoorbeeld 'n kundige stelsel en wil inligting oor 'n spesifieke domein stoor saam met sommige meta-inligting - ons ken dalk nie al die velde nie en stoor bloot JSON vir elke rekord - dit gee ons 'n baie buigsame omgewing om die data uit te brei model en vinnig herhalend - so in hierdie geval sal NoSQL selfs verkieslik en meer leesbaar wees. Voorbeeldinskrywing (van een van my projekte waar NoSQL presies was waar dit nodig was).

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

Jy kan meer lees hier oor NoSQL.

Wat om te studeer?

Hier moet jy eerder net jou taak deeglik ontleed, watter eienskappe dit het en watter NoSQL-stelsels beskikbaar is wat by hierdie beskrywing sal pas - en dan hierdie stelsel begin bestudeer.

Skripnavraagtale

Aanvanklik, blyk dit, wat het Python in die algemeen daarmee te doen - dit is 'n programmeertaal, en glad nie oor navrae nie.

Datawetenskaplike se notas: 'n Persoonlike oorsig van datanavraagtale

  • Pandas is letterlik 'n Switserse weermagmes van datawetenskap; 'n groot hoeveelheid datatransformasie, samevoeging, ens. vind daarin plaas.
  • Numpy - vektorberekeninge, matrikse en lineêre algebra daar.
  • Scipy - daar is baie wiskunde in hierdie pakket, veral statistieke.
  • Jupyter-laboratorium - baie verkennende data-analise pas goed in skootrekenaars - nuttig om te weet.
  • Versoeke - werk met die netwerk.
  • Pyspark is baie gewild onder data-ingenieurs, waarskynlik sal jy met hierdie of Spark interaksie moet hê, bloot as gevolg van hul gewildheid.
  • *Selenium - baie nuttig vir die insameling van data van werwe en hulpbronne, soms is daar eenvoudig geen ander manier om die data te kry nie.

My belangrikste raad: leer Python!

pandas

Kom ons neem die volgende kode as 'n voorbeeld:

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

In wese sien ons dat die kode by die klassieke SQL-patroon pas.

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

Maar die belangrike deel is dat hierdie kode deel is van die skrif en die pyplyn; in werklikheid is ons besig om navrae in die Python-pyplyn in te sluit. In hierdie situasie kom die navraagtaal na ons toe vanaf biblioteke soos Pandas of pySpark.

Oor die algemeen sien ons in pySpark 'n soortgelyke tipe datatransformasie deur 'n navraagtaal in die gees van:

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

Waar en wat om te lees

Op Python self in die algemeen geen probleem materiaal te vind om te bestudeer. Daar is 'n groot aantal tutoriale aanlyn pandas, pySpark en kursusse oor Spark (en ook op sigself DS). Oor die algemeen is die inhoud hier wonderlik om te google, en as ek een pakket moet kies om op te fokus, sal dit natuurlik pandas wees. Wat die kombinasie van DS+Python-materiale ook betref baie.

Shell as 'n navraagtaal

'n Hele paar dataverwerkings- en analiseprojekte waarmee ek gewerk het, is in werklikheid dopskrifte wat kode in Python, Java oproep, en die dopopdragte self. Daarom, oor die algemeen, kan jy pyplyne in bash/zsh/etc beskou as 'n soort hoëvlaknavraag (jy kan natuurlik lusse daarin invul, maar dit is nie tipies vir DS-kode in doptale nie), kom ons gee 'n eenvoudige voorbeeld - ek moes 'n QID-kartering van wikidata en volledige skakels na die Russiese en Engelse wiki's doen, hiervoor het ek 'n eenvoudige versoek van die opdragte in die bash geskryf en vir die uitvoer het ek 'n eenvoudige skrif in Python geskryf, wat ek so saamgestel:

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

waar

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

Dit was in werklikheid die hele pyplyn wat die vereiste kartering geskep het; soos ons sien, het alles in vloeimodus gewerk:

  • pv-lêerpad - gee 'n vorderingsbalk gebaseer op lêergrootte en gee die inhoud daarvan verder
  • unpigz -c het 'n deel van die argief gelees en dit aan jq gegee
  • jq met die sleutel - stroom het dadelik die resultaat geproduseer en dit na die naverwerker deurgegee (dieselfde as met die heel eerste voorbeeld) in Python
  • intern was die naverwerker 'n eenvoudige staatsmasjien wat die uitvoer geformateer het 

In totaal 'n komplekse pyplyn wat in vloeimodus werk op groot data (0.5TB), sonder noemenswaardige hulpbronne en gemaak van 'n eenvoudige pyplyn en 'n paar gereedskap.

Nog 'n belangrike wenk: kan goed en effektief in die terminale werk en bash/zsh/etc skryf.

Waar sal dit nuttig wees? Ja, amper oral – weereens is daar BAIE materiaal om op die internet te bestudeer. In die besonder, hier hierdie my vorige artikel.

R scripting

Weereens kan die leser uitroep - wel, dit is 'n hele programmeertaal! En natuurlik sal hy reg wees. Ek het R egter gewoonlik in so 'n konteks teëgekom dat dit eintlik baie soortgelyk was aan 'n navraagtaal.

R is 'n statistiese rekenaaromgewing en taal vir statiese berekening en visualisering (volgens hierdie).

Datawetenskaplike se notas: 'n Persoonlike oorsig van datanavraagtale
geneem vandaar. Terloops, ek beveel dit aan, goeie materiaal.

Hoekom moet 'n datawetenskaplike R ken? Ten minste, want daar is 'n groot laag nie-IT mense wat data in R ontleed. Ek het dit op die volgende plekke raakgeloop:

  • Farmaseutiese sektor.
  • Bioloë.
  • Finansiële sektor.
  • Mense met 'n suiwer wiskundige opvoeding wat met statistiek te doen het.
  • Gespesialiseerde statistiese modelle en masjienleermodelle (wat dikwels slegs in die skrywer se weergawe as 'n R-pakket gevind kan word).

Hoekom is dit eintlik 'n navraagtaal? In die vorm waarin dit dikwels gevind word, is dit eintlik 'n versoek om 'n model te skep, insluitend die lees van data en die regstelling van navraag (model) parameters, sowel as die visualisering van data in pakkette soos ggplot2 - dit is ook 'n vorm van die skryf van navrae .

Voorbeeldnavrae vir visualisering

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

Oor die algemeen het baie idees van R na luislangpakkette soos pandas, numpy of scipy gemigreer, soos datarame en datavektorisering - so oor die algemeen sal baie dinge in R vir jou bekend en gerieflik lyk.

Daar is baie bronne om te bestudeer, bv. hierdie.

Kennisgrafieke

Hier het ek 'n effens ongewone ervaring, want ek moet gereeld met kennisgrafieke werk en tale navraag doen vir grafieke. Kom ons gaan dus net kortliks oor die basiese beginsels, aangesien hierdie deel 'n bietjie meer eksoties is.

In klassieke relasionele databasisse het ons 'n vaste skema, maar hier is die skema buigsaam, elke predikaat is eintlik 'n "kolom" en selfs meer.

Stel jou voor dat jy besig was om 'n persoon te modelleer en sleuteldinge wou beskryf, byvoorbeeld, kom ons neem 'n spesifieke persoon, Douglas Adams, en gebruik hierdie beskrywing as basis.

Datawetenskaplike se notas: 'n Persoonlike oorsig van datanavraagtale
www.wikidata.org/wiki/Q42

As ons 'n relasionele databasis gebruik, sou ons 'n groot tabel of tabelle met 'n groot aantal kolomme moes skep, waarvan die meeste NULL sou wees of gevul sou wees met een of ander verstek Vals waarde, byvoorbeeld, dit is onwaarskynlik dat baie van ons 'n inskrywing in die Koreaanse nasionale biblioteek - natuurlik kan ons dit in aparte tabelle plaas, maar dit sal uiteindelik 'n poging wees om 'n buigsame logiese stroombaan met predikate te modelleer deur 'n vaste relasionele een te gebruik.

Datawetenskaplike se notas: 'n Persoonlike oorsig van datanavraagtale
Stel jou dus voor dat alle data gestoor word as 'n grafiek of as binêre en unêre Boolese uitdrukkings.

Waar kan jy dit selfs teëkom? Eerstens, werk met data wiki, en met enige grafiekdatabasisse of gekoppelde data.

Die volgende is die hoofnavraagtale wat ek gebruik en mee gewerk het.

SPARQL

wiki:
SPARQL (rekursiewe akroniem van Eng. SPARQL-protokol en RDF-navraagtaal) - data-navraagtaal, verteenwoordig deur die model RDFEn protokol om hierdie versoeke oor te dra en daarop te reageer. SPARQL is 'n aanbeveling W3C-konsortium en een van die tegnologieë semantiese web.

Maar in werklikheid is dit 'n navraagtaal vir logiese unêre en binêre predikate. Jy spesifiseer bloot voorwaardelik wat in 'n Boole-uitdrukking vas is en wat nie (baie vereenvoudig).

Die RDF (Resource Description Framework)-basis self, waaroor SPARQL-navrae uitgevoer word, is 'n drievoudige object, predicate, subject - en die navraag kies die vereiste drievoudige volgens die gespesifiseerde beperkings in die gees: vind 'n X so dat p_55(X, q_33) waar is - waar natuurlik p_55 'n soort verband met ID 55 is, en q_33 'n voorwerp met ID 33 (hier en die hele storie, weereens allerhande besonderhede weggelaat).

Voorbeeld van data-aanbieding:

Datawetenskaplike se notas: 'n Persoonlike oorsig van datanavraagtale
Foto's en voorbeeld met lande hier vandaar.

Voorbeeld van basiese navraag

Datawetenskaplike se notas: 'n Persoonlike oorsig van datanavraagtale

Trouens, ons wil die waarde van die ?landveranderlike so vind dat vir die predikaat
lid_van, dit is waar dat lid_van(?land,q458) en q458 die ID van die Europese Unie is.

'n Voorbeeld van 'n regte SPARQL-navraag binne die luislang-enjin:

Datawetenskaplike se notas: 'n Persoonlike oorsig van datanavraagtale

Tipies moes ek SPARQL lees eerder as om dit te skryf - in daardie situasie sou dit waarskynlik 'n nuttige vaardigheid wees om die taal ten minste op 'n basiese vlak te verstaan ​​om presies te verstaan ​​hoe data herwin word. 

Daar is baie materiaal om aanlyn te bestudeer: byvoorbeeld hier hierdie и hierdie. Ek google gewoonlik spesifieke ontwerpe en voorbeelde en dit is vir eers genoeg.

Logiese navraagtale

Jy kan meer oor die onderwerp in my artikel lees hier. En hier sal ons net kortliks ondersoek waarom logiese tale goed geskik is vir die skryf van navrae. In wese is RDF net 'n stel logiese stellings van die vorm p(X) en h(X,Y), en 'n logiese navraag het die volgende vorm:

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

Hier praat ons van die skep van 'n nuwe predikaatuitset/1 (/1 beteken unêr), mits dit vir X waar is dat land(X) - dit wil sê, X is 'n land en ook lid_van(X,"EU ").

Dit wil sê, in hierdie geval word beide die data en die reëls op dieselfde manier aangebied, wat ons in staat stel om probleme baie maklik en goed te modelleer.

Waar het jy in die bedryf ontmoet?: 'n hele groot projek met 'n maatskappy wat navrae in so 'n taal skryf, asook oor die huidige projek in die kern van die stelsel - dit wil voorkom asof dit 'n taamlik eksotiese ding is, maar soms gebeur dit.

'n Voorbeeld van 'n kodefragment in 'n logiese taal wat wikidata verwerk:

Datawetenskaplike se notas: 'n Persoonlike oorsig van datanavraagtale

Materiaal: Ek gee hier 'n paar skakels na die moderne logiese programmeertaal Antwoordstel-programmering - ek beveel aan om dit te bestudeer:

Datawetenskaplike se notas: 'n Persoonlike oorsig van datanavraagtale

Bron: will.com

Voeg 'n opmerking