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

Appunti del Data Scientist: panoramica personale sui linguaggi di query dei dati
Condivido dalla mia esperienza personale ciò che è stato utile, dove e quando. In modo riassuntivo e per punti, affinché risulti chiaro cosa e dove approfondire — ma qui si tratta esclusivamente della mia esperienza soggettiva, per voi potrebbe essere tutto molto diverso.

Perché è importante conoscere e saper utilizzare i linguaggi di query? Fondamentalmente, ci sono diversi passaggi chiave nel lavoro di Data Science e il primo e più importante (senza il quale non funzionerà nulla!) è l'acquisizione o l'estrazione dei dati. Nella maggior parte dei casi, i dati si trovano in qualche forma da qualche parte e devono essere "estratti". 

I linguaggi di query sono progettati proprio per estrarre questi dati! Oggi parlerò dei linguaggi di query che mi sono stati utili e mostrerò dove e come precisamente — a cosa serva l'apprendimento di essi.

Ci saranno tre principali categorie di tipi di query ai dati che esamineremo in questo articolo:

  • "Linguaggi di query standard" — ciò di cui normalmente si parla quando si menzionano i linguaggi di query, come l'algebra relazionale o SQL.
  • Linguaggi di query basati su script: ad esempio, le funzionalità di Python come pandas, numpy o shell scripting.
  • Linguaggi di query per grafi conoscitivi e database a grafo.

Tutto quanto scritto qui è semplicemente esperienza personale, ciò che è stato utile, con la descrizione delle situazioni e "perché è stato necessario" — ognuno può adattare tale esperienza navigando le situazioni che potrebbero presentarsi e cercando di prepararsi in anticipo, studiando questi linguaggi prima di doverli utilizzare (con urgenza) in un progetto o trovarsi in un progetto dove sono necessari.

"Linguaggi di query standard"

I linguaggi di query standard sono considerati tali proprio perché sono quelli a cui normalmente 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 per utilizzarli consapevolmente, è fondamentale comprendere il nucleo su cui si basano.

Che cos'è l'algebra relazionale?

La definizione formale è questa: l'algebra relazionale è un sistema chiuso di operazioni sulle relazioni nel modello relazionale dei dati. In termini più comprensibili, è un sistema di operazioni sulle tabelle, tale che il risultato è sempre anch'esso una tabella.

Vedi tutte le operazioni relazionali in questo articolo di Habr — qui descriviamo perché è importante sapere e dove può essere utile.

Perché?

Inizi a capire su cosa si basano i linguaggi di interrogazione e quali operazioni stanno dietro le espressioni di specifici linguaggi di interrogazione — spesso fornisce una comprensione più profonda di cosa e come funzionano i linguaggi di interrogazione.

Appunti del Data Scientist: panoramica personale sui linguaggi di query dei dati
Tratto da questo un articolo. Esempio di operazione: join, che unisce tabelle.

Materiali per lo studio:

Un buon corso introduttivo da Stanford. In generale, ci sono moltissimi materiali sull'algebra relazionale e teoria — Coursera, Udacity. Ci sono anche un'enorme quantità di materiali online, tra cui buoni corsi accademici. Il mio consiglio personale: è fondamentale comprendere molto bene l'algebra relazionale — è la base di tutto.

SQL

Appunti del Data Scientist: panoramica personale sui linguaggi di query dei dati
Tratto da questo articoli.

SQL è essenzialmente un'implementazione dell'algebra relazionale — con una importante precisazione, SQL è dichiarativo! Cioè, scrivendo una query nel linguaggio dell'algebra relazionale, in realtà indichi come deve essere calcolato — mentre con SQL specifichi cosa desideri estrarre, e poi il DBMS genera già espressioni (efficienti) nel linguaggio dell'algebra relazionale (la loro equivalenza è nota grazie alla teorema di Codd).

Appunti del Data Scientist: panoramica personale sui linguaggi di query dei dati
Tratto da questo articoli.

Perché?

I RDBMS: Oracle, Postgres, SQL Server, ecc. — sono ancora praticamente ovunque e c'è un'enorme possibilità che tu debba interagirci, il che significa che dovrai sia leggere SQL (il che è molto probabile), sia scrivere in esso (anche questo è abbastanza probabile).

Cosa leggere e studiare

Negli stessi link sopra (sull'algebra relazionale), c'è un'incredibile quantità di materiale, per 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.» L'articolo corrispondente su Habr. È essenzialmente vero che le persone hanno capito che il modello relazionale completo non è necessario per risolvere molti problemi, specialmente per quelli dove, ad esempio, le prestazioni sono fondamentali e dominano determinate semplici interrogazioni con aggregazione — è critico calcolare rapidamente le metriche e scriverle nel database, mentre la maggior parte delle funzionalità relazionali si è rivelata non necessaria e, anzi, dannosa — perché normalizzare qualcosa se questo compromettere l'aspetto più importante per noi (per un determinato compito) — le prestazioni?

In sostanza, le persone hanno capito che il modello relazionale completo non è necessario per risolvere molti problemi, specialmente per quelli in cui, ad esempio, è fondamentale la performance e dominano determinate semplici interrogazioni con aggregazione — è critico calcolare rapidamente le metriche e scriverle nel database, e la maggior parte delle funzionalità relazionali si è rivelata non solo non necessaria, ma anche dannosa — perché normalizzare qualcosa se questo rovinerebbe la cosa più importante per noi (per un determinato compito) — la performance?

Spesso è necessario avere schemi flessibili invece di schemi matematici fissi del classico modello relazionale — e questo semplifica incredibilmente lo sviluppo delle applicazioni, quando è critico implementare il sistema e iniziare a lavorare rapidamente, elaborando 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 determinato dominio insieme a alcune meta-informazioni — potremmo non conoscere tutti i campi e banalmente 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à anche preferibile e più leggibile. Ecco un esempio di record (da un mio progetto, dove NoSQL era esattamente 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 sul NoSQL.

Cosa studiare?

In questo caso è piuttosto necessario analizzare bene il proprio compito, quali sono le sue proprietà e quali sistemi NoSQL corrispondono a tale descrizione — e poi dedicarsi allo studio di quel sistema.

Lingue di scripting per le query

In principio, sembra strano associare Python — è un linguaggio di programmazione, non ha niente a che vedere con le query.

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

  • Pandas è proprio il coltellino svizzero della Data Science, un'enorme quantità di trasformazioni di dati, aggregazioni, ecc. avviene in esso.
  • Numpy — calcoli vettoriali, matrici e algebra lineare si trovano qui.
  • Scipy — c'è molta matematica in questo pacchetto, specialmente la statistica.
  • Jupyter lab — molte analisi esplorative dei dati si integrano bene nei notebook — è utile saperlo.
  • Requests — lavoro con la rete.
  • Pyspark — molto popolare tra gli ingegneri dei dati, probabilmente dovrai interagire con questo o con Spark, proprio per la loro popolarità.
  • *Selenium — è molto utile per la raccolta di dati da siti web e risorse, a volte non riesci proprio a ottenere i dati in altro modo.

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 classico modello SQL.

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 la parte importante è che questo codice fa parte di uno script e di un pipeline, infatti stiamo integrando le query nel pipeline Python. In questa situazione il linguaggio di query ci arriva da librerie come Pandas o pySpark.

In generale, 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

Sull'intero Python in generale non è un problema trovare materiale per lo studio. In rete ci sono moltissimi tutorial su pandas, pySpark e corsi su Spark (e anche su DS). In generale qui i materiali si trovano facilmente su Google e se dovessi scegliere un pacchetto su cui concentrarmi, sarebbe sicuramente pandas. Ci sono anche moltissimi materiali.

Shell come linguaggio di query

Numerosi progetti per il trattamento e l'analisi dei dati, con cui ho lavorato, sono sostanzialmente script shell che invocano codice in Python, in Java e le stesse comandi shell. Pertanto, in generale, si possono considerare i pipeline in bash/zsh/etc. come una sorta di query ad alto livello (si possono anche inserire cicli, ma non è tipico per il codice DS nei linguaggi shell), facciamo un semplice esempio: dovevo creare una mappatura QID di Wikidata e il link completo a Wikipedia in russo e inglese, per questo ho scritto una semplice query di comandi in bash e per l'output ho realizzato un semplice script in Python, che ho unito in questo modo:

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, sostanzialmente, l'intero pipeline che creava la mappatura necessaria, come vediamo tutto funzionava in modalità streaming:

  • pv filepath — fornisce una barra di avanzamento basata sulla dimensione del file e passa il contenuto successivamente
  • unpigz -c leggeva parte dell'archivio e passava jq
  • jq con l'opzione — stream restituiva immediatamente il risultato e lo passava al post-processore (proprio come nel primo esempio) in Python
  • all'interno del post-processore — è una semplice macchina a stati, che formattava l'output 

In totale, un pipeline complesso che funziona in modalità flusso su grandi dati (0,5 TB), senza risorse significative ed è realizzato con un semplice pipeline e un paio di strumenti.

Un altro consiglio importante: saper lavorare bene ed efficacemente nel terminale e scrivere in bash/zsh/etc.

Dove può essere utile? Praticamente ovunque — ci sono MOLTI materiali di studio disponibili in rete. In particolare, ecco questo il mio articolo precedente.

R scripting

Ancora una volta, il lettore potrebbe esclamare: beh, questo è un vero e proprio linguaggio di programmazione! E ha assolutamente ragione. Tuttavia, di solito mi sono trovato a incontrare R sempre in contesti in cui, di fatto, assomigliava molto a un linguaggio di query.

R è un ambiente per il calcolo statistico e un linguaggio per il calcolo e la visualizzazione statistica (secondo questo).

Appunti del Data Scientist: panoramica personale sui linguaggi di query dei dati
Prelevato da qui. A proposito, lo consiglio, è un buon materiale.

Perché è necessario che un data scientist conosca R? Almeno perché esiste un enorme settore di persone non IT che si occupano di analisi dei dati utilizzando R. L'ho incontrato nelle seguenti aree:

  • Settore farmaceutico.
  • Biologi.
  • Settore finanziario.
  • Persone con un'istruzione puramente matematica che si occupano di statistica.
  • Modelli statistici specializzati e modelli di machine learning (che spesso si possono trovare solo nella versione autoriale sotto forma di pacchetto R).

Perché è di fatto un linguaggio di query? Nella forma in cui si incontra più spesso — è in effetti una richiesta per creare un modello, compresa la lettura dei dati e la definizione dei parametri della richiesta (modello), e anche la visualizzazione dei dati in pacchetti come ggplot2 — è anch'essa 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 molte cose in R vi sembreranno familiari e comode.

Ci sono molte fonti per lo studio, ad esempio, questo.

Grafi di conoscenza (Knowledge graph)

Qui ho un'esperienza un po' insolita, perché devo spesso lavorare con grafi di conoscenza e linguaggi di query per grafi. Quindi daremo solo una breve occhiata alle basi, poiché questa parte è un po' più esotica.

Nelle tradizionali banche dati relazionali abbiamo uno schema fisso: qui lo schema è flessibile, ogni predicato è praticamente una «colonna» e anche di più.

Immaginate di dover modellare una persona e volete descrivere cose chiave; per esempio, prendiamo come base una persona specifica, Douglas Adams, e utilizziamo questa descrizione.

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

Se avessimo usato una banca dati relazionale, avremmo dovuto creare una grande tabella o tabelle con un numero enorme di colonne, gran parte delle quali sarebbe stata NULL o riempita con un valore False predefinito; ad esempio, è improbabile che molti di noi abbiano una registrazione nella biblioteca nazionale coreana. Certo, potremmo separarle in tabelle, ma sarebbe stata comunque un tentativo di modellare uno schema logico flessibile con predicati, utilizzando una struttura relazionale fissa.

Appunti del Data Scientist: panoramica personale sui linguaggi di query dei dati
Quindi immaginate che tutti i dati siano conservati come un grafo o come espressioni logiche binarie e unarie.

Dove puoi incontrarlo? In primo luogo, lavorando con dati wiki, e con qualsiasi tipo di banche dati grafiche o dati relazionali.

Di seguito i principali linguaggi di query che ho dovuto applicare e con cui ho lavorato.

SPARQL

Wiki:
SPARQL (acronimo ricorsivo di inglese. SPARQL Protocol and RDF Query Language) — linguaggio di query per i dati, presentati secondo il modello RDF, e inoltre per l'invio di queste query e delle risposte ad esse. SPARQL è una raccomandazione per la trasmissione di queste query e delle relative risposte. SPARQL è una raccomandazione del consorzio W3C ed è una delle tecnologie del web semantico..

In realtà è un linguaggio di query per predicati logici unari e binari. Si definisce semplicemente ciò che è fisso nell'espressione logica e ciò che non lo è (in modo molto semplificato).

La banca dati RDF (Resource Description Framework), sulla quale vengono eseguite le query SPARQL, è una tripla oggetto, predicato, soggetto — e la query seleziona le triplette desiderate secondo specifiche limitazioni, nel senso che troviamo un certo X tale che p_55(X, q_33) è vero — dove, naturalmente, p_55 è una certa relazione con id 55 e q_33 è un oggetto con id 33 (questo è tutto, trascurando ulteriori dettagli).

Esempio di rappresentazione dei dati:

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

Esempio di query di base

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

In realtà vogliamo trovare il valore della variabile ?country, tale che per il predicato
member_of, è vero che member_of(?country,q458), dove q458 è l'ID dell'Unione Europea.

Esempio di query SPARQL reale all'interno del motore python:

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

In genere, mi è capitato di leggere SPARQL piuttosto che scriverlo: in tale situazione, probabilmente sarà utile comprendere la lingua almeno a un livello di base, per capire come vengono effettivamente estratti i dati. 

Online ci sono molti materiali per l'apprendimento: ad esempio, ecco questo e questo. Di solito cerco su Google costrutti e esempi specifici e finora è sufficiente.

Lingue di query logiche

Per ulteriori dettagli sull'argomento, puoi leggere il mio articolo qui. Qui, tratteremo brevemente perché le lingue logiche si prestano bene alla 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 il seguente formato:

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

Qui stiamo parlando della creazione di un nuovo predicato output/1 ( /1 significa che è un predicato unario), a patto che per X sia vero che country(X) — ovvero, X è un paese e anche member_of(X,“EU”).

Questo significa che sia i dati sia le regole in questo caso sono rappresentati in modo sostanzialmente identico, il che consente di modellare i problemi in modo molto semplice e accurato.

Dove si sono incontrati nell'industria: un grande progetto con un'azienda che scrive query in tale lingua, e anche nel progetto attuale nel core del sistema — sembrerebbe una cosa piuttosto esotica, tuttavia a volte si verifica.

Esempio di un frammento di codice in un linguaggio logico che elabora wikidata:

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

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

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

Fonte: habr.com

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