Notysjes fan gegevenswittenskippers: in personaliseare resinsje fan talen foar gegevensfraach

Notysjes fan gegevenswittenskippers: in personaliseare resinsje fan talen foar gegevensfraach
Ik fertel jo út persoanlike ûnderfining wat nuttich wie wêr en wannear. It is oersjoch en proefskrift, sadat it dúdlik is wat en wêr't jo fierder grave kinne - mar hjir haw ik allinich subjektive persoanlike ûnderfining, miskien is alles foar jo folslein oars.

Wêrom is it wichtich om query-talen te kennen en te kinnen brûke? Yn har kearn hat Data Science ferskate wichtige stadia fan wurk, en de alderearste en wichtichste (sûnder it sil wis neat wurkje!) is it krijen of ekstrahearje fan gegevens. Meastentiids sitte de gegevens earne yn ien of oare foarm en moatte dêrwei "ophelle" wurde. 

Query-talen kinne jo dizze tige gegevens ekstrahearje! En hjoed sil ik jo fertelle oer dy query-talen dy't my nuttich west hawwe en ik sil jo fertelle en sjen litte wêr en hoe krekt - wêrom't it nedich is om te studearjen.

D'r sille trije haadblokken wêze fan typen gegevensfragen, dy't wy sille besprekke yn dit artikel:

  • "Standert" query-talen binne wat gewoanlik wurdt begrepen as it praat oer in query-taal, lykas relational algebra of SQL.
  • Scripting query talen: bygelyks, Python dingen pandas, numpy of shell scripting.
  • Query-talen foar kennisgrafiken en grafykdatabases.

Alles wat hjir skreaun is is gewoan in persoanlike ûnderfining, wat nuttich wie, mei in beskriuwing fan situaasjes en "wêrom it nedich wie" - elkenien kin besykje hoe't ferlykbere situaasjes jo wei kinne komme en besykje har foarôf te tarieden troch dizze talen te begripen foardat jo (driuwend) moatte oanfreegje foar in projekt of sels by in projekt komme wêr't se nedich binne.

"Standert" query talen

Standert query-talen binne krekt yn 'e sin dat wy gewoanlik oer har tinke as wy oer queries prate.

Relasjonele algebra

Wêrom is relaasjealgebra hjoed nedich? Om in goed begryp te hawwen fan wêrom query-talen op in bepaalde manier strukturearre binne en se bewust brûke, moatte jo de kearn dy't se ûnderlizze, begripe.

Wat is relaasje algebra?

De formele definysje is as folget: relational algebra is in sletten systeem fan operaasjes op relaasjes yn in relational gegevens model. Om it in bytsje minskliker te sizzen, dit is in systeem fan operaasjes op tabellen sadat it resultaat altyd in tabel is.

Sjoch alle relaasje operaasjes yn dit artikel út Habr - hjir beskriuwe wy wêrom't jo witte moatte en wêr't it fan pas komt.

Wêrom?

Begjin te begripen wêr't query-talen oer geane en hokker operaasjes efter útdrukkingen yn spesifike query-talen sitte, jout faaks in djipper begryp fan wat wurket yn query-talen en hoe.

Notysjes fan gegevenswittenskippers: in personaliseare resinsje fan talen foar gegevensfraach
Oernommen fan dit artikels. In foarbyld fan in operaasje: join, dy't gearfoege oan tabellen.

Materiaal foar stúdzje:

Goede ynliedende kursus fan Stanford. Yn 't algemien binne d'r in protte materialen oer relaasjealgebra en teory - Coursera, Udacity. D'r is ek in enoarme hoemannichte materiaal online, ynklusyf goed akademyske kursussen. Myn persoanlik advys: jo moatte relaasjealgebra hiel goed begripe - dit is de basis fan 'e basis.

SQL

Notysjes fan gegevenswittenskippers: in personaliseare resinsje fan talen foar gegevensfraach
Oernommen fan dit artikels.

SQL is yn wêzen in ymplemintaasje fan relasjonele algebra - mei in wichtige warskôging, SQL is deklaratyf! Dat is, by it skriuwen fan in query yn 'e taal fan 'e relasjonele algebra, sizze jo eins hoe't jo berekkenje moatte - mar mei SQL spesifisearje jo wat jo ekstrahearje wolle, en dan genereart de DBMS al (effektyf) útdrukkingen yn 'e taal fan relasjonele algebra (harren) lykweardigens is ús bekend as De stelling fan Codd).

Notysjes fan gegevenswittenskippers: in personaliseare resinsje fan talen foar gegevensfraach
Oernommen fan dit artikels.

Wêrom?

Relasjonele DBMS's: Oracle, Postgres, SQL Server, ensfh binne noch praktysk oeral en d'r is in ongelooflijke grutte kâns dat jo mei har moatte omgean, wat betsjut dat jo SQL moatte lêze (wat heul wierskynlik is) of it skriuwe ( ek net ûnwierskynlik).

Wat te lêzen en te studearjen

Neffens deselde keppelings hjirboppe (oer relasjonele algebra) is d'r in ongelooflijke hoemannichte materiaal, bygelyks, dit.

Trouwens, wat is NoSQL?

"It is de muoite wurdich om nochris te beklamjen dat de term "NoSQL" in absolút spontane oarsprong hat en gjin algemien akseptearre definysje of wittenskiplike ynstelling efter him hat." Oerienkommende artikel op Habr.

Yn feite realisearre minsken dat in folslein relaasjemodel net nedich is om in protte problemen op te lossen, foaral foar dyjingen wêr't bygelyks prestaasjes kritysk binne en bepaalde ienfâldige fragen mei aggregaasje dominearje - wêr't it kritysk is om metriken fluch te berekkenjen en te skriuwen nei de databank, en de measte funksjes binne relational die bliken net allinnich net nedich, mar ek skealik - wêrom normalisearje wat as it sil bedjerre it wichtichste ding foar ús (foar guon spesifike taak) - produktiviteit?

Ek binne fleksibele skema's faaks nedich yn stee fan de fêste wiskundige skema's fan it klassike relasjonele model - en dit ferienfâldigt ongelooflijk de ûntwikkeling fan applikaasjes as it kritysk is om it systeem yn te setten en fluch te begjinnen te wurkjen, de resultaten te ferwurkjen - as it skema en soarten opsleine gegevens binne net sa wichtich.

Wy meitsje bygelyks in saakkundich systeem en wolle ynformaasje opslaan oer in spesifyk domein tegearre mei wat meta-ynformaasje - wy kinne miskien net alle fjilden kenne en gewoan JSON opslaan foar elke record - dit jout ús in heul fleksibele omjouwing foar it útwreidzjen fan de gegevens model en fluch iterearjen - dus yn dit gefal sil NoSQL sels de foarkar en lêsber wêze. Foarbyld yngong (fan ien fan myn projekten wêr't NoSQL krekt wie wêr't it nedich wie).

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

Jo kinne mear lêze hjir oer NoSQL.

Wat te studearjen?

Hjir, leaver, jo moatte gewoan jo taak yngeand analysearje, hokker eigenskippen it hat en hokker NoSQL-systemen beskikber binne dy't passe by dizze beskriuwing - en dan begjinne te studearjen fan dit systeem.

Skript Query Talen

Yn it earstoan, it liket, wat hat Python dermei yn it algemien te krijen - it is in programmeartaal, en hielendal net oer queries.

Notysjes fan gegevenswittenskippers: in personaliseare resinsje fan talen foar gegevensfraach

  • Pandas is letterlik in Switsersk legermes fan Data Science; in enoarme hoemannichte gegevenstransformaasje, aggregaasje, ensfh.
  • Numpy - vector berekkeningen, matrices en lineêre algebra dêr.
  • Scipy - d'r is in protte wiskunde yn dit pakket, foaral statistiken.
  • Jupyter lab - in protte ferkennende gegevensanalyse past goed yn laptops - nuttich om te witten.
  • Fersiken - wurkje mei it netwurk.
  • Pyspark is heul populêr ûnder data-yngenieurs, wierskynlik moatte jo mei dizze as Spark ynteraksje, gewoan fanwege har populariteit.
  • * Selenium - heul nuttich foar it sammeljen fan gegevens fan siden en boarnen, soms is d'r gewoan gjin oare manier om de gegevens te krijen.

Myn wichtichste advys: lear Python!

pandas

Litte wy de folgjende koade as foarbyld nimme:

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

Yn essinsje sjogge wy dat de koade past yn it klassike SQL-patroan.

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

Mar it wichtige diel is dat dizze koade diel útmakket fan it skript en de pipeline; yn feite binne wy ​​queries ynbêde yn 'e Python-pipeline. Yn dizze situaasje komt de query-taal nei ús út biblioteken lykas Pandas of pySpark.

Yn 't algemien sjogge wy yn pySpark in ferlykber type gegevenstransformaasje troch in query-taal yn' e geast fan:

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

Wêr en wat te lêzen

Op Python sels yn it algemien gjin probleem materiaal fine om te studearjen. D'r binne in grut oantal tutorials online pandas, pySpark en kursussen op Fonk (en ek op himsels DS). Oer it algemien is de ynhâld hjir geweldig foar googlejen, en as ik ien pakket moast kieze om op te fokusjen, soe it fansels panda's wêze. Oangeande de kombinaasje fan DS + Python materialen ek tige folle.

Shell as query-taal

Hiel wat projekten foar gegevensferwurking en -analyse dêr't ik mei wurke haw binne, yn feite, shell-skripts dy't koade yn Python, Java, en de shell-kommando's sels neame. Dêrom kinne jo yn 't algemien pipelines yn bash/zsh/etc beskôgje as in soarte fan query op heech nivo (jo kinne der fansels lussen yn stuffe, mar dit is net typysk foar DS-koade yn shell-talen), lit ús jaan in ienfâldich foarbyld - ik moast in QID-mapping dwaan fan wikidata en folsleine keppelings nei de Russyske en Ingelske wiki's, dêrfoar skreau ik in ienfâldich fersyk fan 'e kommando's yn' e bash en foar de útfier skreau ik in ienfâldich skript yn Python, dat ik gearstald sa:

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

wêr

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

Dit wie yn feite de heule pipeline dy't de fereaske mapping makke; lykas wy sjogge, wurke alles yn streammodus:

  • pv filepath - jout in foarútgongsbalke basearre op triemgrutte en jout de ynhâld troch
  • unpigz -c lêzen diel fan it argyf en joech it oan jq
  • jq mei de kaai - stream produsearre fuortendaliks it resultaat en joech it oan de postprosessor (itselde as mei it earste foarbyld) yn Python
  • yntern, de postprocessor wie in ienfâldige steat masine dy't opmakke de útfier 

Yn totaal in komplekse pipeline dy't wurket yn streammodus op grutte gegevens (0.5TB), sûnder wichtige boarnen en makke fan in ienfâldige pipeline en in pear ark.

In oare wichtige tip: kinne goed en effektyf wurkje yn 'e terminal en bash/zsh/etc skriuwe.

Wêr sil it nuttich wêze? Ja, hast oeral - wer, d'r binne in protte materialen om te studearjen op it ynternet. Benammen hjir dit myn foarige artikel.

R skript

Nochris kin de lêzer útroppen - no, dit is in hiele programmeartaal! En fansels sil hy gelyk hawwe. Ik kaam R lykwols meastentiids tsjin yn sa'n kontekst dat it trouwens hiel ferlykber wie mei in fraachtaal.

R is in statistyske komputeromjouwing en taal foar statyske berekkenjen en fisualisaasje (neffens dit).

Notysjes fan gegevenswittenskippers: in personaliseare resinsje fan talen foar gegevensfraach
nommen fan hjir. Trouwens, ik advisearje it, goed materiaal.

Wêrom moat in gegevenswittenskipper R witte? Teminsten, om't d'r in geweldige laach net-IT-minsken is dy't gegevens analysearje yn R. Ik kaam it op 'e folgjende plakken tsjin:

  • Farmaseutyske sektor.
  • Biologen.
  • Finansjele sektor.
  • Minsken mei in suver wiskundige oplieding dy't mei statistiken dwaande binne.
  • Spesjalisearre statistyske modellen en masine-learmodellen (dy't faaks allinich te finen binne yn 'e ferzje fan 'e auteur as in R-pakket).

Wêrom is it eins in fraachtaal? Yn 'e foarm wêryn't it faaks fûn wurdt, is it eins in fersyk om in model te meitsjen, ynklusyf it lêzen fan gegevens en it fêststellen fan query (model) parameters, en ek it visualisearjen fan gegevens yn pakketten lykas ggplot2 - dit is ek in foarm fan it skriuwen fan queries .

Foarbyld queries foar fisualisaasje

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

Yn 't algemien binne in protte ideeën fan R migrearre yn pythonpakketten lykas panda's, numpy of scipy, lykas dataframes en gegevensvektorisaasje - dus yn it algemien sille in protte dingen yn R fertroud en handich foar jo lykje.

D'r binne in protte boarnen om te studearjen, bygelyks, dit.

Kennisgrafiken

Hjir haw ik in wat ûngewoane ûnderfining, om't ik faaks moat wurkje mei kennisgrafiken en querytalen foar grafiken. Dêrom litte wy gewoan koart oer de basis gean, om't dit diel in bytsje eksoatysker is.

Yn klassike relasjonele databases hawwe wy in fêst skema, mar hjir is it skema fleksibel, elk predikaat is eins in "kolom" en noch mear.

Stel jo foar dat jo in persoan modelleare en wichtige dingen woene beskriuwe, litte wy bygelyks in spesifike persoan nimme, Douglas Adams, en dizze beskriuwing as basis brûke.

Notysjes fan gegevenswittenskippers: in personaliseare resinsje fan talen foar gegevensfraach
www.wikidata.org/wiki/Q42

As wy in relasjonele databank brûkten, soene wy ​​in enoarme tabel of tabellen moatte oanmeitsje mei in enoarm oantal kolommen, wêrfan de measten NULL wêze soene of fol wêze mei wat standert False wearde, bygelyks, it is net wierskynlik dat in protte fan ús in yngong yn de Koreaanske nasjonale bibleteek - fansels, wy koenen sette se yn aparte tabellen, mar dit soe úteinlik wêze in besykjen in model in fleksibele logyske circuit mei predikaten mei help fan in fêste relational.

Notysjes fan gegevenswittenskippers: in personaliseare resinsje fan talen foar gegevensfraach
Stel jo dus foar dat alle gegevens wurde opslein as in grafyk of as binêre en unêre Booleaanske útdrukkingen.

Wêr kinne jo dit sels tsjinkomme? Earst, wurkje mei data wiki, en mei alle grafyske databases of ferbûne gegevens.

De folgjende binne de wichtichste query-talen dêr't ik haw brûkt en wurke mei.

SPARQL

Wiki:
SPARQL (rekursive akronym от Ingelsk SPARQL Protokol en RDF Query Language) - data query taal, fertsjintwurdige troch it model RDF, lykas ek protokol om dizze oanfragen oer te stjoeren en dêrop te reagearjen. SPARQL is in oanbefelling W3C Consortium en ien fan 'e technologyen semantysk web.

Mar yn werklikheid is it in fraachtaal foar logyske unêre en binêre predikaten. Jo binne gewoan betingst oantsjutte wat is fêst yn in Booleaanske ekspresje en wat net (heul ferienfâldige).

De RDF (Resource Description Framework)-basis sels, dêr't SPARQL-fragen oer wurde útfierd, is in trijefâldich object, predicate, subject - en de query selekteart de fereaske trijelingen neffens de opjûne beheiningen yn 'e geast: fyn in X sa dat p_55(X, q_33) wier is - wêr't, fansels, p_55 in soarte fan relaasje is mei ID 55, en q_33 in foarwerp mei ID 33 (hjir en it hiele ferhaal, wer allerhanne details weilitten).

Foarbyld fan data presintaasje:

Notysjes fan gegevenswittenskippers: in personaliseare resinsje fan talen foar gegevensfraach
Foto's en foarbylden mei lannen hjir fan hjir.

Basic Query Foarbyld

Notysjes fan gegevenswittenskippers: in personaliseare resinsje fan talen foar gegevensfraach

Yn feite wolle wy de wearde fan 'e ?lânfariabele sa fine dat foar it predikaat
member_of, it is wier dat member_of(?country,q458) en q458 de ID fan de Europeeske Uny is.

In foarbyld fan in echte SPARQL-query binnen de pythonmotor:

Notysjes fan gegevenswittenskippers: in personaliseare resinsje fan talen foar gegevensfraach

Typysk moast ik SPARQL lêze ynstee fan it te skriuwen - yn dy situaasje soe it wierskynlik in nuttige feardigens wêze om de taal op syn minst op in basisnivo te begripen om krekt te begripen hoe't gegevens wurde ophelle. 

D'r is in soad materiaal om online te studearjen: hjir bygelyks dit и dit. Ik google meastentiids spesifike ûntwerpen en foarbylden en dat is foar no genôch.

Logyske query-talen

Jo kinne mear lêze oer it ûnderwerp yn myn artikel hjir. En hjir sille wy allinich koart ûndersykje wêrom logyske talen goed geskikt binne foar it skriuwen fan fragen. Yn essinsje is RDF gewoan in set logyske útspraken fan 'e foarm p (X) en h (X, Y), en in logyske query hat de folgjende foarm:

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

Hjir prate wy oer it meitsjen fan in nije predikaatútfier/1 (/1 betsjut unary), op betingst dat foar X it wier is dat lân(X) - dat wol sizze, X is in lân en ek lid_fan(X,"EU ").

Dat is, yn dit gefal wurde sawol de gegevens as de regels op deselde manier presintearre, wêrtroch wy problemen maklik en goed kinne modellearje.

Wêr hawwe jo moete yn 'e yndustry?: in hiel grut projekt mei in bedriuw dat fragen skriuwt yn sa'n taal, en ek oer it aktuele projekt yn 'e kearn fan it systeem - it soe lykje dat dit in frij eksoatysk ding is, mar soms bart it.

In foarbyld fan in koadefragmint yn in logyske taal dy't wikidata ferwurket:

Notysjes fan gegevenswittenskippers: in personaliseare resinsje fan talen foar gegevensfraach

Materiaal: Ik jou hjir in pear keppelings nei de moderne logyske programmeartaal Answer Set Programming - ik advisearje it te studearjen:

Notysjes fan gegevenswittenskippers: in personaliseare resinsje fan talen foar gegevensfraach

Boarne: www.habr.com

Add a comment