Note del data scientist: una revisione personalizzata dei linguaggi di query dei dati

Note del data scientist: una revisione personalizzata dei linguaggi di query dei dati
Ti dico per esperienza personale cosa è stato utile dove e quando. È una panoramica e una tesi, in modo che sia chiaro cosa e dove puoi scavare ulteriormente - ma qui ho un'esperienza personale esclusivamente soggettiva, forse per te tutto è completamente diverso.

Perché è importante conoscere ed essere in grado di utilizzare i linguaggi di query? Fondamentalmente, la scienza dei dati ha diverse fasi di lavoro importanti, e la prima e più importante (senza di essa, certamente nulla funzionerà!) è l'ottenimento o l'estrazione dei dati. Molto spesso, i dati si trovano da qualche parte in qualche forma e devono essere “recuperati” da lì. 

I linguaggi di query ti consentono di estrarre proprio questi dati! E oggi ti parlerò di quei linguaggi di query che mi sono stati utili e ti dirò e ti mostrerò dove e come esattamente - perché è necessario studiare.

Ci saranno tre blocchi principali di tipi di query di dati, di cui parleremo in questo articolo:

  • I linguaggi di query "standard" sono ciò che comunemente si intende quando si parla di un linguaggio di query, come l'algebra relazionale o SQL.
  • Linguaggi di query di scripting: ad esempio, Python Things Pandas, numpy o scripting di shell.
  • Linguaggi di query per grafici della conoscenza e database di grafici.

Tutto ciò che è scritto qui è solo un'esperienza personale, ciò che è stato utile, con una descrizione delle situazioni e "perché era necessario" - tutti possono provare come situazioni simili possono capitarti e provare a prepararsi in anticipo comprendendo queste lingue ​​prima di dover presentare domanda (urgentemente) per un progetto o addirittura arrivare a un progetto dove sono necessari.

Linguaggi di interrogazione "standard".

I linguaggi di query standard sono esattamente nel senso in cui di solito li pensiamo quando parliamo di query.

Algebra relazionale

Perché oggi è necessaria l’algebra relazionale? Per comprendere bene il motivo per cui i linguaggi di query sono strutturati in un certo modo e utilizzarli consapevolmente, è necessario comprendere il nucleo alla base di essi.

Cos'è l'algebra relazionale?

La definizione formale è la seguente: l'algebra relazionale è un sistema chiuso di operazioni sulle relazioni in un modello di dati relazionali. Per dirla in modo un po' più umano, si tratta di un sistema di operazioni su tabelle tale per cui il risultato è sempre una tabella.

Visualizza tutte le operazioni relazionali in questo articolo di Habr: qui descriviamo perché devi saperlo e dove può essere utile.

Perché?

Iniziare a capire cosa sono i linguaggi di query e quali operazioni si trovano dietro le espressioni in linguaggi di query specifici spesso fornisce una comprensione più profonda di cosa funziona nei linguaggi di query e come.

Note del data scientist: una revisione personalizzata dei linguaggi di query dei dati
Preso da questo articoli. Un esempio di operazione: join, che unisce le tabelle.

Materiali per lo studio:

Buon corso introduttivo da Stanford. In generale, ci sono molti materiali sull'algebra e sulla teoria relazionale: Coursera, Udacity. C'è anche un'enorme quantità di materiale online, anche buono corsi accademici. Il mio consiglio personale: devi capire molto bene l'algebra relazionale: questa è la base delle nozioni di base.

SQL

Note del data scientist: una revisione personalizzata dei linguaggi di query dei dati
Preso da questo articolo.

SQL è essenzialmente un'implementazione dell'algebra relazionale: con un avvertimento importante, SQL è dichiarativo! Cioè, quando scrivi una query nel linguaggio dell'algebra relazionale, in realtà dici come calcolare, ma con SQL specifichi cosa vuoi estrarre, e quindi il DBMS genera già espressioni (efficaci) nel linguaggio dell'algebra relazionale (la loro l'equivalenza ci è nota come Il teorema di Codd).

Note del data scientist: una revisione personalizzata dei linguaggi di query dei dati
Preso da questo articolo.

Perché?

DBMS relazionali: Oracle, Postgres, SQL Server, ecc. sono ancora praticamente ovunque e c'è un'incredibile probabilità che tu debba interagire con loro, il che significa che dovrai leggere SQL (il che è molto probabile) o scriverlo ( neanche improbabile).

Cosa leggere e studiare

Secondo gli stessi link sopra (sull'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 dietro alcuna definizione o istituzione scientifica generalmente accettata.” Corrispondente articolo su Habr.

In effetti, le persone si sono rese conto che un modello relazionale completo non è necessario per risolvere molti problemi, soprattutto per quelli in cui, ad esempio, le prestazioni sono critiche e dominano alcune semplici query con aggregazione - dove è fondamentale calcolare rapidamente le metriche e scriverle nel database. database e la maggior parte delle funzionalità relazionali si sono rivelate non solo inutili, ma anche dannose: perché normalizzare qualcosa se rovina la cosa più importante per noi (per qualche compito specifico): la produttività?

Inoltre, spesso sono necessari schemi flessibili al posto degli schemi matematici fissi del modello relazionale classico - e questo semplifica incredibilmente lo sviluppo delle applicazioni quando è fondamentale implementare il sistema e iniziare a lavorare rapidamente, elaborando i risultati - o lo schema e i tipi di dati archiviati non sono così importanti.

Ad esempio, stiamo creando un sistema esperto e desideriamo archiviare informazioni su un dominio specifico insieme ad alcune meta informazioni - potremmo non conoscere tutti i campi e archiviare semplicemente JSON per ogni record - questo ci offre un ambiente molto flessibile per espandere i dati modello e iterazione rapida, quindi in questo caso NoSQL sarà ancora preferibile e più leggibile. Voce di esempio (da uno dei miei progetti in cui NoSQL era proprio dove era necessario).

{"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, piuttosto, devi solo analizzare a fondo il tuo compito, quali proprietà ha e quali sistemi NoSQL sono disponibili che si adattano a questa descrizione, quindi iniziare a studiare questo sistema.

Linguaggi di query di scripting

All'inizio, a quanto pare, cosa c'entra Python in generale: è un linguaggio di programmazione e non riguarda affatto le query.

Note del data scientist: una revisione personalizzata dei linguaggi di query dei dati

  • Pandas è letteralmente un coltellino svizzero della scienza dei dati; al suo interno avviene un'enorme quantità di trasformazioni, aggregazioni, ecc.
  • Numpy: calcoli vettoriali, matrici e algebra lineare lì.
  • Scipy: c'è molta matematica in questo pacchetto, soprattutto statistiche.
  • Laboratorio Jupyter: molte analisi esplorative dei dati si adattano bene ai laptop: utile da sapere.
  • Richieste: lavorare con la rete.
  • Pyspark è molto popolare tra gli ingegneri dei dati, molto probabilmente dovrai interagire con questo o con Spark, semplicemente a causa della loro popolarità.
  • *Selenio: molto utile per raccogliere dati da siti e risorse, a volte semplicemente 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”)
# 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'}))

In sostanza, vediamo che il codice si adatta al classico modello SQL.

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

Ma la parte importante è che questo codice fa parte dello script e della pipeline; infatti, stiamo incorporando query nella 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 nello spirito di:

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

Dove e cosa leggere

Su Python stesso in generale nessun problema trovare materiali da studiare. Ci sono un numero enorme di tutorial online panda, pySpark e corsi su Scintilla (e anche da solo DS). Nel complesso, il contenuto qui è ottimo per cercare su Google e, se dovessi scegliere un pacchetto su cui concentrarmi, sarebbero i panda, ovviamente. Anche per quanto riguarda la combinazione di materiali DS+Python molto.

Shell come linguaggio di query

Molti progetti di elaborazione e analisi dei dati con cui ho lavorato sono, in effetti, script di shell che chiamano codice in Python, Java e gli stessi comandi di shell. Pertanto, in generale, puoi considerare le pipeline in bash/zsh/etc come una sorta di query di alto livello (puoi, ovviamente, inserire dei loop lì dentro, ma questo non è tipico per il codice DS nei linguaggi shell), diamo un semplice esempio: avevo bisogno di fare una mappatura QID di wikidata e collegamenti completi ai wiki russo e inglese, per questo ho scritto una semplice richiesta dai comandi nella bash e per l'output ho scritto un semplice script in Python, che ho mettere insieme 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")' 

Questa è stata infatti l'intera pipeline che ha creato la mappatura richiesta; come vediamo tutto ha funzionato in modalità stream:

  • pv filepath: fornisce una barra di avanzamento in base alla dimensione del file e ne trasmette il contenuto
  • unpigz -c ha letto parte dell'archivio e lo ha dato a jq
  • jq con la chiave - stream ha immediatamente prodotto il risultato e lo ha passato al postprocessore (come nel primo esempio) in Python
  • internamente, il postprocessore era una semplice macchina a stati che formattava l'output 

In totale, una pipeline complessa che lavora in modalità flusso su dati di grandi dimensioni (0.5 TB), senza risorse significative e composta da una pipeline semplice e un paio di strumenti.

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

Dove sarà utile? Sì, quasi ovunque: ancora una volta, ci sono MOLTI materiali da studiare su Internet. In particolare, qui questo il mio articolo precedente.

scripting R

Ancora una volta, il lettore potrebbe esclamare: beh, questo è un intero linguaggio di programmazione! E ovviamente avrà ragione. Tuttavia, di solito incontravo R in un contesto che, in effetti, era molto simile a un linguaggio di query.

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

Note del data scientist: una revisione personalizzata dei linguaggi di query dei dati
recuperato quindi. Comunque lo consiglio, buon materiale.

Perché uno scienziato dei dati ha bisogno di conoscere R? Almeno perché c'è un enorme strato di persone non IT che analizzano i dati in R. L'ho trovato nei seguenti posti:

  • Settore farmaceutico.
  • Biologi.
  • Settore finanziario.
  • Persone con una formazione prettamente matematica che si occupano di statistica.
  • Modelli statistici specializzati e modelli di machine learning (che spesso si trovano solo nella versione dell'autore come pacchetto R).

Perché è in realtà un linguaggio di query? Nella forma in cui si trova spesso, in realtà è una richiesta per creare un modello, inclusa la lettura dei dati e la correzione dei parametri di query (modello), nonché la visualizzazione dei dati in pacchetti come ggplot2 - questa è anche una forma di scrittura di query .

Query di esempio 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 di R sono migrate in pacchetti Python come panda, numpy o scipy, come dataframe e vettorizzazione dei dati, quindi in generale molte cose in R ti sembreranno familiari e convenienti.

Ci sono molte fonti da studiare, ad esempio, questo.

Grafici della conoscenza

Qui ho un'esperienza un po' insolita, perché molto spesso devo lavorare con i grafici della conoscenza e i linguaggi di query per i grafici. Pertanto, esaminiamo brevemente le nozioni di base, poiché questa parte è un po’ più esotica.

Nei database relazionali classici abbiamo uno schema fisso, qui invece lo schema è flessibile, ogni predicato è in realtà una “colonna” e anche di più.

Immagina di modellare una persona e di voler descrivere le cose chiave, ad esempio, prendiamo una persona specifica, Douglas Adams, e utilizziamo questa descrizione come base.

Note del data scientist: una revisione personalizzata dei linguaggi di query dei dati
www.wikidata.org/wiki/Q42

Se utilizzassimo un database relazionale, dovremmo creare una o più tabelle enormi con un numero enorme di colonne, la maggior parte delle quali sarebbero NULL o riempite con un valore False predefinito, ad esempio, è improbabile che molti di noi abbiano un nella biblioteca nazionale coreana - ovviamente potremmo metterli in tabelle separate, ma questo sarebbe in definitiva un tentativo di modellare un circuito logico flessibile con predicati utilizzando uno relazionale fisso.

Note del data scientist: una revisione personalizzata dei linguaggi di query dei dati
Quindi immagina che tutti i dati siano archiviati come grafico o come espressioni booleane binarie e unarie.

Dove puoi incontrare questo? Innanzitutto, lavorare con wiki dei datie con eventuali database grafici o dati connessi.

Di seguito sono riportati i principali linguaggi di query che ho utilizzato e con cui ho lavorato.

SPARQL

wiki:
SPARQL (acronimo ricorsivo от Ing. Protocollo SPARQL e linguaggio di interrogazione RDF) - linguaggio di interrogazione dei dati, rappresentato dal modello RDFe protocollo trasmettere tali richieste e rispondere alle stesse. SPARQL è una raccomandazione Consorzio W3C e una delle tecnologie web semantico.

Ma in realtà è un linguaggio di interrogazione per predicati logici unari e binari. Stai semplicemente specificando in modo condizionale cosa è fisso in un'espressione booleana e cosa no (molto semplificato).

La stessa base RDF (Resource Description Framework), su cui vengono eseguite le query SPARQL, è tripla object, predicate, subject - e la query seleziona le triple richieste in base alle restrizioni specificate nello spirito: trova una X tale che p_55(X, q_33) sia vero - dove, ovviamente, p_55 è una sorta di relazione con ID 55 e q_33 è un oggetto con ID 33 (qui tutta la storia, ancora una volta omettendo ogni tipo di dettaglio).

Esempio di presentazione dei dati:

Note del data scientist: una revisione personalizzata dei linguaggi di query dei dati
Immagini ed esempi con i paesi qui quindi.

Esempio di query di base

Note del data scientist: una revisione personalizzata dei linguaggi di query dei dati

Vogliamo infatti trovare il valore della variabile ?paese come quello del predicato
member_of, è vero che member_of(?country,q458) e q458 è l'ID dell'Unione Europea.

Un esempio di una vera query SPARQL all'interno del motore Python:

Note del data scientist: una revisione personalizzata dei linguaggi di query dei dati

In genere, ho dovuto leggere SPARQL anziché scriverlo: in quella situazione, sarebbe probabilmente utile comprendere il linguaggio almeno a livello base per capire esattamente come vengono recuperati i dati. 

C'è tanto materiale da studiare online: ad esempio qui questo и questo. Di solito cerco su Google progetti ed esempi specifici e per ora è sufficiente.

Linguaggi di interrogazione logica

Puoi leggere di più sull’argomento nel mio articolo qui. E qui esamineremo solo brevemente perché i linguaggi logici sono adatti per scrivere query. Essenzialmente, RDF è semplicemente un insieme di istruzioni logiche della forma p(X) e h(X,Y), e una query logica ha la seguente forma:

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

Qui stiamo parlando di creare un nuovo predicato output/1 (/1 significa unario), a condizione che per X sia vero che paese(X) - cioè X è un paese e anche membro_di(X,"UE ").

Cioè, in questo caso, sia i dati che le regole sono presentati nello stesso modo, il che rende possibile modellare i problemi molto facilmente e bene.

Dove vi siete incontrati nel settore?: un intero progetto di grandi dimensioni con un'azienda che scrive query in un linguaggio simile, così come sul progetto attuale nel cuore del sistema - sembrerebbe che questa sia una cosa piuttosto esotica, ma a volte succede.

Un esempio di un frammento di codice in un linguaggio logico che elabora wikidata:

Note del data scientist: una revisione personalizzata dei linguaggi di query dei dati

Materiali: fornirò qui un paio di collegamenti al moderno linguaggio di programmazione logica Answer Set Programming: consiglio di studiarlo:

Note del data scientist: una revisione personalizzata dei linguaggi di query dei dati

Fonte: habr.com

Aggiungi un commento