Condivido la mia esperienza personale su cosa, dove e quando è stato utile. Una panoramica e dei punti salienti, per capire chiaramente cosa e dove approfondire ulteriormente — ma qui parlo esclusivamente della mia esperienza soggettiva, per voi potrebbe essere tutto diverso.
Perché è importante conoscere e saper interagire con i linguaggi di query? In Data Science ci sono diversi passaggi cruciali nel lavoro e il primo e più importante (senza di esso, nulla funzionerà!) è l'ottenimento o l'estrazione dei dati. Spesso i dati sono conservati in qualche forma e devono essere "estratti" da lì.
I linguaggi di query ci permettono proprio di estrarre questi dati! E oggi parlerò di quei linguaggi di query che mi sono stati utili, mostrando dove e come precisamente — perché è importante per lo studio.
Ci saranno tre principali tipi di query ai dati che analizzeremo in questo articolo:
- Linguaggi di query "standard", cioè ciò che di solito si intende quando si parla di linguaggio di query, come l'algebra relazionale o SQL.
- Linguaggi di query di scripting: ad esempio, gli strumenti Python come pandas, numpy o shell scripting.
- Linguaggi di query per grafi di conoscenza e basi di dati grafiche.
Tutto ciò che è scritto qui è semplicemente un'esperienza personale, utile, con una descrizione delle situazioni e "perché era necessario" — ognuno può riflettere su quanto queste situazioni possano presentarsi e cercare di prepararsi in anticipo, comprendendo questi linguaggi prima di doverli utilizzare (in modo urgente) in un progetto o di trovarsi in un progetto in cui sono richiesti.
Lingue di query 'standard'
Le lingue di query standard in questo contesto sono quelle a cui generalmente pensiamo quando parliamo di query.
Algebra relazionale
Perché oggi è necessaria l'algebra relazionale? Per avere una buona comprensione del motivo per cui i linguaggi di query sono strutturati in un certo modo e usarli consapevolmente, è necessario comprendere il nucleo sottostante.
Che cos'è l'algebra relazionale?
Una definizione formale è la seguente: l'algebra relazionale è un sistema chiuso di operazioni sulle relazioni nel modello di dati relazionale. In termini più accessibili, è un sistema di operazioni sulle tabelle, tale che il risultato è sempre anch'esso una tabella.
Vedi tutte le operazioni relazionali in nell'articolo di Habr - qui descriviamo perché è importante conoscere e dove è utile.
Perché?
Inizi a comprendere come si costruiscono i linguaggi di query e quali operazioni sono alla base delle espressioni dei singoli linguaggi di query - spesso offre una comprensione più profonda di cosa e come funziona nei linguaggi di query.

Estratto da articoli. Un esempio di operazione: join, che unisce tabelle.
Materiali per lo studio:
. In generale, ci sono molte risorse sulla teoria dell'algebra relazionale - Coursera, Udacity. Ci sono anche un'enorme quantità di materiali online, compresi ottimi . Il mio consiglio personale: è fondamentale comprendere molto bene l'algebra relazionale - è alla base di tutto.
SQL

Estratto da dell'articolo.
SQL è, essenzialmente, un'implementazione dell'algebra relazionale - con una importante precisazione, SQL è dichiarativo! Cioè, scrivendo una query nel linguaggio dell'algebra relazionale, stai di fatto dicendo come deve essere calcolato - mentre con SQL specifici cosa vuoi estrarre, e poi il DBMS genera già espressioni (efficienti) nel linguaggio dell'algebra relazionale (la loro equivalenza è nota come ).

Estratto da dell'articolo.
Perché?
I database relazionali: Oracle, Postgres, SQL Server, ecc. sono ancora praticamente ovunque e c'è un'alta probabilità che tu debba interagirci, il che significa che dovrai leggere SQL (è molto probabile) o scriverlo (anche questo non è improbabile).
Cosa leggere e studiare
Nei link sopra (sulla algebra relazionale), c'è un'incredibile quantità di materiale, ad esempio, .
A proposito, cos'è NoSQL?
"Vale la pena sottolineare ancora una volta che il termine 'NoSQL' ha un'origine assolutamente spontanea e non ha una definizione riconosciuta o un'istituzione scientifica alle spalle." Riguardante su Habr.
Essenzialmente, le persone hanno capito che un modello relazionale completo non è necessario per risolvere molti problemi, soprattutto quelli in cui, ad esempio, la performance è fondamentale e dominano determinate query semplici con aggregazione: è critico calcolare rapidamente le metriche e scriverle nel database, e molte funzionalità relazionali si sono rivelate non solo superflue, ma anche dannose: perché normalizzare qualcosa se questo rovina ciò che è più importante per noi (per un compito specifico) — la performance?
Spesso sono necessarie schemi flessibili invece di schemi matematici fissi del classico modello relazionale — e questo semplifica incredibilmente lo sviluppo delle applicazioni, quando è cruciale implementare rapidamente un sistema e iniziare a lavorare con i risultati — oppure lo schema e i tipi di dati memorizzati non sono così importanti.
Ad esempio, stiamo creando un sistema esperto e vogliamo memorizzare informazioni su un dominio specifico insieme ad alcune meta-informazioni — possiamo anche non sapere tutti i campi e semplicemente memorizzare JSON per ogni record — questo ci offre un ambiente molto flessibile per espandere il modello di dati e iterare rapidamente — quindi in questo caso, NoSQL sarà persino preferibile e più leggibile. Esempio di un record (da uno dei miei progetti, dove NoSQL era proprio dove serviva).
{"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}
Puoi leggere di più su NoSQL.
Cosa studiare?
Qui è importante analizzare bene la propria attività, quali sono le sue caratteristiche e quali sistemi NoSQL si adattano a questa descrizione — e poi occuparsi di studiare quel sistema.
Linguaggi di query scriptati
All'inizio, sembra strano il coinvolgimento di Python — è un linguaggio di programmazione, non riguarda affatto le query.

- Pandas è davvero un coltellino svizzero per il Data Science, è qui che avviene la maggior parte delle trasformazioni e aggregazioni dei dati.
- Numpy è per i calcoli vettoriali, matrici e algebra lineare.
- Scipy contiene molte funzioni matematiche, specialmente per le statistiche.
- Jupyter lab è ottimo per analisi esplorativa dei dati e si presta bene ai notebook — è utile saperlo usare.
- Requests si occupa di networking.
- Pyspark è molto popolare tra gli ingegneri dei dati, probabilmente dovrai lavorare con questo o con Spark, data la loro diffusione.
- *Selenium è molto utile per la raccolta di dati da siti web e risorse; a volte, non c'è altro modo per ottenere i dati.
Il mio consiglio principale: impara Python!
Pandas
Prendiamo come esempio il seguente codice:
import pandas as pd
df = pd.read_csv(“data/dataset.csv”)
# Calcola e rinomina le aggregazioni
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 sostanza, vediamo che il codice si inserisce in un modello SQL classico.
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_nameMa una parte importante è che questo codice fa parte di uno script e di un pipeline, in effetti stiamo integrando le query nel pipeline di Python. In questa situazione, il linguaggio delle query ci arriva da librerie come Pandas o pySpark.
Nel complesso in pySpark vediamo un tipo simile di trasformazione dei dati attraverso un linguaggio di query nel senso di:
df.filter(df.trip_type = “return”)
.groupby(“day”)
.agg({duration: 'mean'})
.sort()Dove e cosa leggere
Per quanto riguarda Python in generale trovare materiali per lo studio. Ci sono un'enorme quantità di tutorial su , e corsi su (e anche su ). In generale, i materiali qui si trovano magnificamente su Google e se dovessi scegliere un pacchetto su cui concentrarmi, sarebbe sicuramente pandas. Anche per il legame DS+Python ci sono molte informazioni. .
Shell come linguaggio di query
Ci sono diversi progetti di elaborazione e analisi dei dati con cui ho lavorato — fondamentalmente, si tratta di script shell che eseguono codice in Python, in Java e le stesse comandi shell. Pertanto, in generale, possiamo considerare le pipeline in bash/zsh/etc. come una sorta di query di alto livello (certo, si possono inserire anche cicli, ma non è tipico per il codice DS in linguaggi shell). Facciamo un semplice esempio: dovevo mappare QID di Wikidata con i collegamenti completi per le versioni russa e inglese di Wikipedia, per questo ho scritto una semplice query di comandi in bash e ho creato un semplice script in Python per l'output, assemblandoli così:
pv “data/latest-all.json.gz” |
unpigz -c |
jq --stream $JQ_QUERY |
python3 scripts/post_process.py "output.csv"
dove
JQ_QUERY = 'select((.[0][1] == "sitelinks" and (.[0][2]=="enwiki" or .[0][2] =="ruwiki") and .[0][3] =="title") or .[0][1] == "id")' Questo era, in sostanza, l'intera pipeline che creava il mapping necessario, come vediamo tutto funzionava in modalità streaming:
- pv filepath — fornisce una barra di progresso in base alle dimensioni del file e trasmette il suo contenuto avanti
- unpigz -c leggeva una parte dell'archivio e la passava a jq
- jq con l'opzione — stream restituiva immediatamente il risultato e lo passava al post-processore (allo stesso modo del primo esempio) in Python
- all'interno del post-processore — c'era una semplice macchina a stati che formattava l'output
In sintesi, un pipeline complesso che funziona in modalità stream su grandi volumi di dati (0.5TB), senza richiedere risorse significative, realizzato con un pipeline semplice e un paio di strumenti.
Un altro consiglio importante: imparate a lavorare bene ed efficacemente nel terminale e a scrivere in bash/zsh/etc.
Dove è utile? Praticamente ovunque — ci sono MOLTISSIMI materiali disponibili in rete. In particolare, ecco il mio articolo precedente.
R scripting
Il lettore potrebbe esclamare — ma questo è un intero linguaggio di programmazione! E certamente avrebbe ragione. Tuttavia, di solito ho sempre incontrato R in un contesto in cui, sostanzialmente, era molto simile a un linguaggio di query.
R è un ambiente per calcoli statistici e un linguaggio per calcoli e visualizzazioni statistiche (secondo ).

Preso . Tra l'altro, lo consiglio, è un buon materiale.
Perché un data scientist dovrebbe conoscere R? Almeno perché c'è un vasto gruppo di persone al di fuori dell'IT che si occupano di analisi dei dati con R. L'ho incontrato nei seguenti ambiti:
- Settore farmaceutico.
- Biologi.
- Settore finanziario.
- Persone con una formazione puramente matematica che si occupano di statistica.
- Modelli statistici specializzati e modelli di machine learning (che spesso si possono trovare solo nella versione autore in forma di pacchetto R).
Perché è effettivamente un linguaggio di query? Nella forma in cui si presenta spesso, è effettivamente una richiesta di creazione di un modello, che include la lettura dei dati e la definizione dei parametri della richiesta (del modello), così come la visualizzazione dei dati in pacchetti come ggplot2 — questo è anch'esso una forma di scrittura di query.
Esempio di query per la visualizzazione
ggplot(data = beav,
aes(x = id, y = temp,
group = activ, color = activ)) +
geom_line() +
geom_point() +
scale_color_manual(values = c("red", "blue"))In generale, molte idee da R sono state trasferite in pacchetti Python, come pandas, numpy o scipy, come data frame e vettorizzazione dei dati — quindi, in generale, molte cose in R vi sembreranno familiari e comode.
Ci sono molte fonti da cui studiare, ad esempio, .
Grafi della conoscenza (Knowledge graph)
Qui ho un'esperienza un po' insolita, perché mi capita spesso di lavorare con grafi di conoscenza e linguaggi di query per grafi. Quindi, daremo solo una veloce panoramica delle basi, poiché questa parte è un po' più esotica.
Nelle tradizionali banche dati relazionali abbiamo uno schema fisso; qui invece lo schema è flessibile, ogni predicato è praticamente una "colonna" e anche di più.
Immaginate di voler modellare una persona e descrivere le cose chiave; prendiamo come esempio una persona specifica, Douglas Adams, e utilizziamo questa descrizione come base.

Se avessimo usato un database relazionale, avremmo dovuto creare una grande tabella o tabelle con un'enorme quantità di colonne, la maggior parte delle quali sarebbe stata NULL o compilata con un valore false predefinito; ad esempio, è improbabile che molti di noi abbiano una registrazione nella biblioteca nazionale coreana. Certo, potremmo spostarle in tabelle separate, ma alla fine sarebbe un tentativo di modellare uno schema logico flessibile con predicati utilizzando un database relazionale fisso.

Immaginate che tutti i dati siano memorizzati sotto forma di grafo o di espressioni logiche binarie e unarie.
Dove potete incontrare tutto ciò? In primo luogo, lavorando con , così come con qualsiasi database a grafo o dati relazionali.
Di seguito sono riportati i principali linguaggi di query che ho applicato e con cui ho lavorato.
SPARQL
Wiki:
SPARQL ( da SPARQL Protocol and RDF Query Language) — , presentati secondo il modello , così come per la trasmissione di queste query e delle relative risposte. SPARQL è una raccomandazione ed è una delle tecnologie .
In realtà, si tratta di un linguaggio di query per predicati logici unari e binari. Si specifica convenzionalmente ciò che è fissato nell'espressione logica e ciò che non lo è (molto semplificato).
Il database RDF (Resource Description Framework), su cui vengono eseguite le query SPARQL, è costituito da una tripla oggetto, predicato, soggetto. — e la query seleziona le coppie desiderate in base ai criteri specificati, come: trovare un X tale che p_55(X, q_33) sia vero — dove, ovviamente, p_55 è una certa relazione con ID 55, e q_33 è l'oggetto con ID 33 (tutto qui, saltando dettagli vari).
Esempio di rappresentazione dei dati:

Immagini e esempio con i paesi qui .
Esempio di query base

In realtà vogliamo trovare il valore della variabile ?country, tale che per il predicato
member_of, sia vero che member_of(?country,q458), dove q458 è l'ID dell'Unione Europea.
Esempio di una reale query SPARQL all'interno del motore Python:

Di solito, mi è capitato di leggere SPARQL, piuttosto che scriverlo — in questa situazione, è probabilmente utile comprendere la lingua almeno a un livello base, per capire come vengono estratti i dati.
Online ci sono molti materiali per l'apprendimento: per esempio, ecco e . Di solito cerco su Google strutture specifiche ed esempi e per ora è sufficiente.
Linguaggi di query logici
Puoi leggere di più sull'argomento nel mio articolo . Qui, tratteremo brevemente perché i linguaggi logici siano adatti per la scrittura di query. In sostanza, RDF è semplicemente un insieme di affermazioni logiche del tipo p(X) e h(X,Y), mentre una query logica ha la seguente forma:
output(X) :- country(X), member_of(X, "EU").
Qui stiamo parlando della creazione di un nuovo predicato output/1 (/1 indica che è un predicato unario), a condizione che per X valga che country(X) — cioè, X è un paese e anche member_of(X, "EU").
In questo caso, sia i dati che le regole sono rappresentati in modo identico, il che consente di modellare i problemi in modo molto semplice ed efficace.
Dove si è incontrato nell'industria: un grande progetto con un'azienda che scrive query in questo linguaggio, oltre al progetto attuale nel nucleo del sistema — a prima vista, sembra una cosa piuttosto esotica, ma a volte si incontra.
Esempio di frammento di codice in un linguaggio logico che elabora wikidata:

Materiali: qui riporterò un paio di link sul moderno linguaggio di programmazione logico Answer Set Programming — consiglio di studiare proprio questo:
Fonte: habr.com
