Appunti del Data Scientist: panoramica personale sui linguaggi di interrogazione dei dati

Appunti del Data Scientist: panoramica personale sui linguaggi di interrogazione dei dati
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 questo 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.

Appunti del Data Scientist: panoramica personale sui linguaggi di interrogazione dei dati
Estratto da questo articoli. Un esempio di operazione: join, che unisce tabelle.

Materiali per lo studio:

Un buon corso introduttivo da Stanford. In generale, ci sono molte risorse sulla teoria dell'algebra relazionale - Coursera, Udacity. Ci sono anche un'enorme quantità di materiali online, compresi ottimi corsi accademici. Il mio consiglio personale: è fondamentale comprendere molto bene l'algebra relazionale - è alla base di tutto.

SQL

Appunti del Data Scientist: panoramica personale sui linguaggi di interrogazione dei dati
Estratto da questo 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 teorema di Codd).

Appunti del Data Scientist: panoramica personale sui linguaggi di interrogazione dei dati
Estratto da questo 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, questo.

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 articolo 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ù qui 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.

Appunti del Data Scientist: panoramica personale sui linguaggi di interrogazione dei dati

  • 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_name

Ma 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 non è un problema trovare materiali per lo studio. Ci sono un'enorme quantità di tutorial su pandas, pySpark e corsi su Spark (e anche su DS). 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. un sacco.

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 questo 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 questa).

Appunti del Data Scientist: panoramica personale sui linguaggi di interrogazione dei dati
Preso da qui. 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, questo.

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.

Appunti del Data Scientist: panoramica personale sui linguaggi di interrogazione dei dati
www.wikidata.org/wiki/Q42

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.

Appunti del Data Scientist: panoramica personale sui linguaggi di interrogazione dei dati
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 dati wiki, 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 (acronimo ricorsivo da eng. SPARQL Protocol and RDF Query Language) — linguaggio di query per dati, presentati secondo il modello RDF, così come protocollo per la trasmissione di queste query e delle relative risposte. SPARQL è una raccomandazione del W3C ed è una delle tecnologie del web semantico..

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:

Appunti del Data Scientist: panoramica personale sui linguaggi di interrogazione dei dati
Immagini e esempio con i paesi qui da qui.

Esempio di query base

Appunti del Data Scientist: panoramica personale sui linguaggi di interrogazione dei dati

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:

Appunti del Data Scientist: panoramica personale sui linguaggi di interrogazione dei dati

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 questo e questo. 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. 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:

Appunti del Data Scientist: panoramica personale sui linguaggi di interrogazione dei dati

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

Appunti del Data Scientist: panoramica personale sui linguaggi di interrogazione dei dati

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster