Notes del científic de dades: una revisió personalitzada dels llenguatges de consulta de dades

Notes del científic de dades: una revisió personalitzada dels llenguatges de consulta de dades
Us explico per experiència personal què va ser útil on i quan. És una visió general i una tesi, de manera que quedi clar què i on pots excavar més, però aquí tinc una experiència personal exclusivament subjectiva, potser tot és completament diferent per a tu.

Per què és important conèixer i poder utilitzar els llenguatges de consulta? En el seu nucli, Data Science té diverses etapes importants de treball, i la primera i la més important (sense ella, sens dubte res funcionarà!) és obtenir o extreure dades. Molt sovint, les dades es troben en algun lloc d'alguna forma i s'han de "recuperar" des d'allà. 

Els idiomes de consulta us permeten extreure aquestes dades! I avui us parlaré d'aquells llenguatges de consulta que m'han estat útils i us explicaré i us mostraré on i com exactament: per què cal estudiar.

Hi haurà tres blocs principals de tipus de consulta de dades, que parlarem en aquest article:

  • Els llenguatges de consulta "estàndard" són el que s'entén habitualment quan es parla d'un llenguatge de consulta, com l'àlgebra relacional o SQL.
  • Llenguatges de consulta de scripts: per exemple, Python things pandas, numpy o shell scripting.
  • Llenguatges de consulta per a gràfics de coneixement i bases de dades de gràfics.

Tot el que s'escriu aquí és només una experiència personal, el que va ser útil, amb una descripció de situacions i "per què era necessari": tothom pot provar com es poden presentar situacions similars i intentar preparar-se per endavant entenent aquests idiomes. abans has d'aplicar-te (urgència) a un projecte o fins i tot arribar a un projecte on es necessiten.

Llenguatges de consulta "estàndard".

Els llenguatges de consulta estàndard són precisament en el sentit que normalment pensem en ells quan parlem de consultes.

Àlgebra relacional

Per què és necessària avui l'àlgebra relacional? Per entendre bé per què els llenguatges de consulta s'estructuren d'una determinada manera i utilitzar-los de manera conscient, cal entendre el nucli subjacent.

Què és l'àlgebra relacional?

La definició formal és la següent: l'àlgebra relacional és un sistema tancat d'operacions sobre relacions en un model de dades relacional. Per dir-ho una mica més humà, es tracta d'un sistema d'operacions sobre taules de manera que el resultat és sempre una taula.

Veure totes les operacions relacionals a això article d'Habr: aquí descrivim per què cal saber i on és útil.

Per què?

Començar a entendre de què tracten els llenguatges de consulta i quines operacions hi ha darrere d'expressions en llenguatges de consulta específics sovint proporciona una comprensió més profunda de què funciona i com funciona en els llenguatges de consulta.

Notes del científic de dades: una revisió personalitzada dels llenguatges de consulta de dades
Agafat de això articles. Un exemple d'operació: join, que uneix taules.

Materials per a l'estudi:

Bon curs d'iniciació de Stanford. En general, hi ha molts materials sobre àlgebra i teoria relacionals: Coursera, Udacity. També hi ha una gran quantitat de material en línia, inclòs el bo cursos acadèmics. El meu consell personal: cal entendre molt bé l'àlgebra relacional: aquesta és la base dels conceptes bàsics.

SQL

Notes del científic de dades: una revisió personalitzada dels llenguatges de consulta de dades
Agafat de això articles

SQL és essencialment una implementació de l'àlgebra relacional; amb una advertència important, SQL és declaratiu! És a dir, quan s'escriu una consulta en el llenguatge de l'àlgebra relacional, en realitat dius com calcular, però amb SQL especifiqueu què voleu extreure i, aleshores, el SGBD ja genera expressions (eficaces) en el llenguatge de l'àlgebra relacional (el seu l'equivalència se'ns coneix com Teorema de Codd).

Notes del científic de dades: una revisió personalitzada dels llenguatges de consulta de dades
Agafat de això articles

Per què?

SGBD relacionals: Oracle, Postgres, SQL Server, etc. encara estan pràcticament a tot arreu i hi ha una probabilitat increïblement alta que hàgiu d'interactuar amb ells, la qual cosa significa que haureu de llegir SQL (que és molt probable) o escriure'l ( tampoc és improbable).

Què llegir i estudiar

Segons els mateixos enllaços anteriors (sobre l'àlgebra relacional), hi ha una quantitat increïble de material, per exemple, aquest.

Per cert, què és NoSQL?

"Val la pena subratllar una vegada més que el terme "NoSQL" té un origen absolutament espontani i no té cap definició generalment acceptada ni institució científica al darrere". Corresponent article a Habr.

De fet, la gent es va adonar que no es necessita un model relacional complet per resoldre molts problemes, especialment per a aquells on, per exemple, el rendiment és crític i dominen certes consultes senzilles amb agregació, on és fonamental calcular mètriques ràpidament i escriure-les al base de dades, i la majoria de les característiques són relacionals, van resultar no només innecessàries, sinó també perjudicials; per què normalitzar alguna cosa si ens farà malbé el més important (per a alguna tasca específica): la productivitat?

A més, sovint es necessiten esquemes flexibles en lloc dels esquemes matemàtics fixos del model relacional clàssic, i això simplifica increïblement el desenvolupament d'aplicacions quan és fonamental desplegar el sistema i començar a treballar ràpidament, processant els resultats, o l'esquema i els tipus de dades emmagatzemades. no són tan importants.

Per exemple, estem creant un sistema expert i volem emmagatzemar informació d'un domini específic juntament amb alguna metainformació (potser no coneixem tots els camps i simplement emmagatzemem JSON per a cada registre), això ens ofereix un entorn molt flexible per ampliar les dades. model i iteració ràpida, així que en aquest cas, NoSQL serà fins i tot preferible i més llegible. Entrada d'exemple (d'un dels meus projectes on NoSQL estava just on es necessitava).

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

Podeu llegir més aquí sobre NoSQL.

Què estudiar?

Aquí, més aviat, només cal analitzar a fons la vostra tasca, quines propietats té i quins sistemes NoSQL hi ha disponibles que s'ajustin a aquesta descripció, i després començar a estudiar aquest sistema.

Llenguatges de consulta d'scripts

Al principi, sembla, què hi té a veure Python en general: és un llenguatge de programació i no es tracta en absolut de consultes.

Notes del científic de dades: una revisió personalitzada dels llenguatges de consulta de dades

  • Pandas és, literalment, una navalla de l'exèrcit suís de la ciència de dades; hi passa una gran quantitat de transformació de dades, agregació, etc.
  • Numpy: càlculs vectorials, matrius i àlgebra lineal.
  • Scipy: hi ha moltes matemàtiques en aquest paquet, especialment estadístiques.
  • Laboratori Jupyter: una gran quantitat d'anàlisi de dades exploratòria encaixa bé en els ordinadors portàtils, és útil saber-ho.
  • Sol·licituds: treball amb la xarxa.
  • Pyspark és molt popular entre els enginyers de dades, molt probablement haureu d'interaccionar amb aquest o Spark, simplement per la seva popularitat.
  • *Seleni: molt útil per recopilar dades de llocs i recursos, de vegades simplement no hi ha cap altra manera d'obtenir les dades.

El meu principal consell: aprèn Python!

pandes

Prenem com a exemple el codi següent:

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

Essencialment, veiem que el codi s'adapta al patró SQL clàssic.

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

Però la part important és que aquest codi forma part de l'script i del pipeline; de ​​fet, estem incorporant consultes al pipeline de Python. En aquesta situació, el llenguatge de consulta ens arriba de biblioteques com Pandas o pySpark.

En general, a pySpark veiem un tipus similar de transformació de dades mitjançant un llenguatge de consulta amb l'esperit de:

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

On i què llegir

En el mateix Python en general no és un problema trobar materials per estudiar. Hi ha un gran nombre de tutorials en línia pandes, pySpark i cursos sobre Espurna (i també per si mateix DS). En general, el contingut aquí és fantàstic per buscar a Google i, per descomptat, si hagués de triar un paquet per centrar-me, seria els pandes. Pel que fa a la combinació de materials DS+Python també molt.

Shell com a llenguatge de consulta

Uns quants projectes de processament i anàlisi de dades amb els quals he treballat són, de fet, scripts d'intèrpret d'ordres que criden codi en Python, Java i els mateixos comandaments de l'intèrpret d'ordres. Per tant, en general, podeu considerar pipelines a bash/zsh/etc com una mena de consulta d'alt nivell (per descomptat, podeu introduir-hi bucles, però això no és típic per al codi DS en llenguatges de shell), donem un exemple senzill: necessitava fer un mapeig QID de wikidata i enllaços complets als wikis en rus i anglès, per això vaig escriure una sol·licitud senzilla de les ordres del bash i per a la sortida vaig escriure un script senzill en Python, que vaig escriure reunir així:

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

on

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

Aquesta va ser, de fet, tota la canalització que va crear el mapeig requerit; com veiem, tot funcionava en mode de flux:

  • pv ruta del fitxer: proporciona una barra de progrés basada en la mida del fitxer i passa el seu contingut en endavant
  • unpigz -c va llegir part de l'arxiu i el va donar a jq
  • jq amb la clau - stream va produir immediatament el resultat i el va passar al postprocessador (igual que amb el primer exemple) a Python
  • internament, el postprocessador era una màquina d'estats simple que formatava la sortida 

En total, una canalització complexa que treballa en mode flux sobre dades grans (0.5 TB), sense recursos significatius i feta a partir d'una canalització senzilla i un parell d'eines.

Un altre consell important: poder treballar bé i eficaçment al terminal i escriure bash/zsh/etc.

On serà útil? Sí, gairebé a tot arreu, de nou, hi ha MOLTS materials per estudiar a Internet. En concret, aquí això el meu article anterior.

Escriptura R

Un cop més, el lector pot exclamar: bé, aquest és tot un llenguatge de programació! I, per descomptat, tindrà raó. Tanmateix, normalment em vaig trobar amb R en un context que, de fet, era molt semblant a un llenguatge de consulta.

R és un entorn i un llenguatge de computació estadística per a la computació estàtica i la visualització (segons aquesta).

Notes del científic de dades: una revisió personalitzada dels llenguatges de consulta de dades
presa per tant. Per cert, el recomano, bon material.

Per què un científic de dades necessita saber R? Almenys, perquè hi ha una gran capa de persones que no són informàtics que analitzen dades a R. El vaig trobar als llocs següents:

  • Sector farmacèutic.
  • Biòlegs.
  • Sector financer.
  • Persones amb una formació purament matemàtica que s'ocupen d'estadístiques.
  • Models estadístics especialitzats i models d'aprenentatge automàtic (que sovint només es poden trobar a la versió de l'autor com a paquet R).

Per què és realment un llenguatge de consulta? En la forma en què es troba sovint, en realitat és una sol·licitud per crear un model, que inclou la lectura de dades i la correcció de paràmetres de consulta (model), així com la visualització de dades en paquets com ara ggplot2; aquesta també és una forma d'escriure consultes. .

Exemples de consultes per a la visualització

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

En general, moltes idees de R s'han migrat a paquets Python com ara pandas, numpy o scipy, com ara marcs de dades i vectorització de dades, de manera que, en general, moltes coses de R us semblaran familiars i convenients.

Hi ha moltes fonts per estudiar, per exemple, aquest.

Gràfics de coneixement

Aquí tinc una experiència una mica inusual, perquè sovint he de treballar amb gràfics de coneixement i llenguatges de consulta per a gràfics. Per tant, repassem breument els conceptes bàsics, ja que aquesta part és una mica més exòtica.

A les bases de dades relacionals clàssiques tenim un esquema fix, però aquí l'esquema és flexible, cada predicat és en realitat una "columna" i encara més.

Imagineu que estàveu modelant una persona i volia descriure coses clau, per exemple, prenem una persona específica, Douglas Adams, i utilitzem aquesta descripció com a base.

Notes del científic de dades: una revisió personalitzada dels llenguatges de consulta de dades
www.wikidata.org/wiki/Q42

Si féssim servir una base de dades relacional, hauríem de crear una taula o taules enormes amb un gran nombre de columnes, la majoria de les quals serien NULL o s'omplirien amb algun valor fals predeterminat, per exemple, és poc probable que molts de nosaltres tinguem un entrada a la biblioteca nacional de Corea; per descomptat, podríem posar-los en taules separades, però finalment això seria un intent de modelar un circuit lògic flexible amb predicats utilitzant un de relacional fix.

Notes del científic de dades: una revisió personalitzada dels llenguatges de consulta de dades
Imagineu, doncs, que totes les dades s'emmagatzemen com a gràfic o com a expressions booleanes binàries i unàries.

On et pots trobar amb això? En primer lloc, treballar amb wiki de dades, i amb qualsevol base de dades de gràfics o dades connectades.

A continuació es mostren els principals idiomes de consulta que he utilitzat i amb què he treballat.

SPARQL

wiki:
SPARQL (acrònim recursiu d' Eng Protocol SPARQL i llenguatge de consulta RDF) - llenguatge de consulta de dades, representat pel model RDFI protocol transmetre aquestes peticions i donar-hi resposta. SPARQL és una recomanació Consorci W3C i una de les tecnologies web semàntica.

Però en realitat és un llenguatge de consulta per a predicats unaris i binaris lògics. Simplement esteu especificant condicionalment què està fixat en una expressió booleana i què no (molt simplificat).

La pròpia base RDF (Resource Description Framework), sobre la qual s'executen les consultes SPARQL, és una triple object, predicate, subject - i la consulta selecciona els triples requerits segons les restriccions especificades en l'esperit: trobeu una X tal que p_55(X, q_33) sigui certa - on, per descomptat, p_55 és algun tipus de relació amb l'ID 55, i q_33 és una objecte amb ID 33 (aquí i tota la història, de nou ometent tota mena de detalls).

Exemple de presentació de dades:

Notes del científic de dades: una revisió personalitzada dels llenguatges de consulta de dades
Imatges i exemples amb països aquí per tant.

Exemple de consulta bàsica

Notes del científic de dades: una revisió personalitzada dels llenguatges de consulta de dades

De fet, volem trobar el valor de la variable ?country tal que per al predicat
member_of, és cert que member_of(?country,q458) i q458 és l'identificador de la Unió Europea.

Un exemple d'una consulta SPARQL real dins del motor Python:

Notes del científic de dades: una revisió personalitzada dels llenguatges de consulta de dades

Normalment, he hagut de llegir SPARQL en lloc d'escriure'l; en aquesta situació, probablement seria una habilitat útil entendre l'idioma almenys a un nivell bàsic per entendre exactament com es recuperen les dades. 

Hi ha molt material per estudiar en línia: per exemple, aquí aquest и aquest. Normalment busco a Google dissenys i exemples específics i de moment n'hi ha prou.

Llenguatges lògics de consulta

Podeu llegir més sobre el tema al meu article aquí. I aquí, només examinarem breument per què els llenguatges lògics són adequats per escriure consultes. Essencialment, RDF és només un conjunt de declaracions lògiques de la forma p(X) i h(X,Y), i una consulta lògica té la forma següent:

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

Aquí estem parlant de crear un nou predicat output/1 (/1 significa unari), sempre que per a X sigui cert que country(X) - és a dir, X és un país i també member_of(X,"EU ").

És a dir, en aquest cas, tant les dades com les regles es presenten de la mateixa manera, la qual cosa ens permet modelar problemes molt fàcilment i bé.

On et vas conèixer en el sector?: tot un gran projecte amb una empresa que escriu consultes en aquest idioma, així com sobre el projecte actual al nucli del sistema; sembla que això és una cosa força exòtica, però de vegades passa.

Un exemple de fragment de codi en un llenguatge lògic que processa wikidata:

Notes del científic de dades: una revisió personalitzada dels llenguatges de consulta de dades

Materials: donaré aquí un parell d'enllaços al llenguatge de programació lògic modern Answer Set Programming; us recomano que l'estudieu:

Notes del científic de dades: una revisió personalitzada dels llenguatges de consulta de dades

Font: www.habr.com

Afegeix comentari