Greenplum for Data Science Blog Series Parte 1: Big Data Analysis con SQL e Python
Questo articolo è la prima parte della serie di blog "Greenplum for End-to-End Data Science & ML", che illustra come utilizzare le funzioni integrate di analisi in-database di Greenplum per affrontare i progetti di data science dalla sperimentazione all'implementazione su vasta scala.
La crescita, la sfida e l'opportunità dei dati
Siamo nell'era digitale e tutto ciò che facciamo con i nostri smartphone, tablet, computer e persino elettrodomestici produce un'enorme quantità e varietà di dati. Anche se questo può sembrare eccitante, raccogliere dati per avere più dati non è un esercizio significativo o produttivo. Dobbiamo capire quali obiettivi degli utenti o risultati aziendali potrebbero trarre vantaggio da questi dati e investire il tempo e gli sforzi per estrarre valore dai dati. Ed è qui che entrano in gioco i data scientist.
Come potrebbero essere d'aiuto i data scientist
Tra tutti i campi relativi ai dati, la scienza dei dati è un campo di studio che sfrutta i dati e la modellazione quantitativa per creare risultati significativi per gli utenti. Il data scientist si impegna in un'ampia gamma di attività in questo contesto, incluse ma non limitate a quanto segue:
- Collaborare con i designer per creare empatia con gli utenti per comprendere le loro esigenze ed esplorare come potremmo utilizzare dati e algoritmi per deliziarli
- Dai la priorità a cosa costruire dopo con i product manager.
- Collaborare con i data engineer per identificare e preparare i dati per l'analisi.
- Esplora i dati e crea modelli di macchine per soddisfare le esigenze degli utenti, in genere codificando in Python, R o SQL.
- Integrazione con gli ingegneri del software per distribuire modelli come servizi che devono essere utilizzati dalle applicazioni o direttamente dagli utenti.
- Ripeti iterativamente (1)-(5) per ottenere un valore di guida continuo per gli utenti
Le attività sopra elencate includono aspetti relativi al modo in cui lavorano i data scientist (ad esempio, incentrato sull'utente, snello, agile) e anche gli strumenti e le tecnologie necessari per essere più produttivi. Concentriamo questa serie di blog tecnici sul componente degli strumenti principalmente correlato a (4) nell'elenco precedente.
Nello specifico, esploriamo scenari in cui il data scientist esplora i dati e crea modelli di machine learning con un enorme set di dati. In questo contesto, il data scientist può incontrare particolari sfide tecniche, tra cui le seguenti:
- Pipeline di data science lenta con grandi volumi di dati
- Raggiungere i limiti massimi della memoria e dell'elaborazione nei tradizionali runtime Python/R
- Funzionalità analitiche limitate nelle piattaforme che abilitano il Big Data Computing
Perché Greenplum?
L'esportazione di dati da un database e l'importazione in un server o in un ambiente desktop con strumenti comunemente utilizzati per la scienza dei dati (ad es. Python, R) non è un flusso di lavoro ideale per l'analisi dei big data. Come descritto sopra, i data scientist potrebbero aver bisogno di aiuto con i limiti di memoria e scalabilità di questi strumenti e con i colli di bottiglia restrittivi associati al trasferimento di grandi quantità di dati tra piattaforme diverse.
È qui che sfruttare lo strumento giusto diventa una decisione importante per il data scientist. In questo post, ci concentriamo su Greenplum , un motore PostgreSQL per l'elaborazione massicciamente parallela che fornisce strumenti integrati per data scientist per l'esplorazione di dati su larga scala e l'addestramento di modelli. Questi strumenti ed estensioni includono:
- Apache MADlib per l'apprendimento automatico
- Estensioni del linguaggio procedurale per parallelizzare massicciamente Python e R
- PostGIS per l'analisi geospaziale e GPText per la ricerca e l'elaborazione del testo
- Interoperabilità con strumenti di dashboard come Tableau, PowerBI...
Parte 1: configurazione e connettività
- Installa i pacchetti:
!pip install ipython-sql pandas numpy sqlalchemy plotly-express sql_magic pgspecial
import pandas as pd
import numpy as np
import os
import sys
import plotly_express as px
# For DB Connection
from sqlalchemy import create_engine
import psycopg2
import pandas.io.sql as psql
import sql_magic
- Installazione sul client:
!pip install ipython-sql
% load_ext _ sql
% sql postgresql://<user>:<password>@<IP_address>:<port>/<database_name>
%% sql
SELECT version ();
In questa serie di blog, è stato selezionato per l'uso un set di dati Daily Financial News for stocks di Kaggle con licenza CC0: Public Domain . Useremo Greenplum e seguiremo il ciclo di data science (Data Exploration — Data Preparation — Data Modeling — Model Evaluation — Model Deployment) per addestrare un modello di PNL per elaborare l'Analisi Sentimentale per le notizie.
Il set di dati contiene titoli Raw di Benzinga.com e dei suoi partner. La sua dimensione è aumentata fino a circa quattro milioni di righe , che è un set di dati piuttosto esteso per la manipolazione, e ha sette colonne :
- docid — numero intero: indice univoco
- titolo — testo: titolo di Riga
- contenuto — testo: equivalente al titolo
- url — testo: collegamento relativo a News
- editore — testo: editore di notizie
- data — data: data di pubblicazione
- stock — testo: simbolo del ticker di borsa relativo alle notizie
Parte 3: Preparazione dei dati
Il set di dati viene salvato nella tabella source_financial_news. Diamo un'occhiata a una riga di questa tabella:
%%sql
SELECT * FROM source_financial_news LIMIT 1;
%%sql
SELECT count(*) FROM source_financial_news;
Dato che le vecchie notizie non verranno utilizzate frequentemente, creiamo una tabella ds_demo.financial_newspartizionata in datecui siamo interessati solo alle notizie pubblicate dopo il 2010.
L'impostazione della chiave distribuita sull'indice univoco docid consente ai dati di essere distribuiti equamente tra diversi segmenti.
Inoltre, l'impostazione dell'archiviazione su orientata alla colonna e appendoptimized su True migliora le prestazioni analitiche complessive.
%%sql
DROP TABLE IF EXISTS ds_demo.financial_news;
CREATE TABLE ds_demo.financial_news
(
LIKE source_financial_news
)
WITH (appendoptimized=true, orientation=column)
DISTRIBUTED BY(docid)
PARTITION BY RANGE (date)
(
START (date '2010-01-01') INCLUSIVE
END (date '2024-01-01') EXCLUSIVE
EVERY (INTERVAL '1 month'),
DEFAULT PARTITION old_news
);
-- Insert data from the source table into a newly created partitioned table
INSERT INTO ds_demo.financial_news SELECT * FROM source_financial_news;
%sql \d+ ds_demo.financial_news
Controlla che il nostro tavolo sia distribuito uniformemente
Ora che la nostra nuova tabella è stata creata, controlliamo la sua distribuzione calcolando la deviazione standard del numero di righe per segmento.
%%sql
-- Standard deviation to check table distribution
SELECT STDDEV(count)
FROM (
SELECT gp_segment_id, COUNT(*)
FROM ds_demo.financial_news
GROUP BY 1
) table_distribution ;
Partizioni per scansionare solo i dati necessari
Con Partizioni, non è necessario eseguire la scansione delle partizioni precedenti per rispondere alla domanda seguente.
%%sql
-- Show the execution plan "EXPLAIN" and check scanned partitions
EXPLAIN SELECT COUNT(*)
FROM ds_demo.financial_news
WHERE date >= '2020-01-01'::date
Parte 4: Analisi esplorativa dei dati con SQL e MADlib
Dopo aver preparato la nostra ds_demo.financial_newstabella, utilizzeremo SQL ( sqlmagicper risultati interattivi con il database Greenplum) e MADlib , una libreria open source basata su SQL per analisi scalabili all'interno del database .
Fornisce implementazioni parallele ai dati di metodi matematici, statistici, grafici e di machine learning per dati strutturati e non strutturati.
1. Un'altra panoramica delle prime due righe della tabella
%%sql
SELECT * FROM ds_demo.financial_news LIMIT 2 ;
- Assicurati che l'
MADlibestensione sia abilitata!
%sql SELECT madlib.version();
%%sql
DROP TABLE IF EXISTS ds_demo.financial_news_summary;
SELECT * FROM madlib.summary(
'ds_demo.financial_news', 'ds_demo.financial_news_summary'
);
%%sql
SELECT
target_column, distinct_values, missing_values, blank_values,
min, max, mean, median, variance, most_frequent_values
FROM ds_demo.financial_news_summary;
Per vedere l'evoluzione del numero di notizie nel corso dei mesi:
- Innanzitutto, converti la
datecolonna nel formato Anno-Mese utilizzando lato_charfunzione SQL. - Quindi, raggruppa in base al formato
datee calcola le frequenze utilizzandoCOUNT(*) - Ordina i risultati finali in base al file
date.
%%read_sql df_news_per_date
SELECT
to_char(date,'YYYY-MM') as date,
COUNT(*)
FROM ds_demo.financial_news
WHERE date IS NOT NULL
GROUP BY 1
ORDER BY 1
DESC;
px.line(df_news_per_date,
x = 'date',
y = 'count',
title='Evolution of number of Stock Market News over time')
%%read_sql df_histogram
WITH drb_stats AS (
SELECT min(length(title)) AS min,
max(length(title)) AS max
FROM ds_demo.financial_news
),
histogram AS (
SELECT width_bucket(length(title), min, max, 10) AS bucket,
int4range(MIN(length(title)), MAX(length(title)), '[]') AS range,
COUNT(*) AS freq
FROM ds_demo.financial_news, drb_stats
GROUP BY bucket
ORDER BY bucket
)
SELECT bucket, range, freq,
repeat('■',
( freq::FLOAT
/ MAX(freq) OVER()
* 30
)::INT
) AS bar
FROM histogram
ORDER BY bucket ASC
;
fig = px.histogram(y = df_histogram.freq,
x = df_histogram.range.astype(str),
nbins=10,
title = 'News titles length histogram')
fig.update_layout(yaxis_title="Frequencies", xaxis_title = 'Bucket (range)')
fig.show()
Usa MADlib summaryi risultati per visualizzare le azioni più frequenti.
%%read_sql df_stock_frequencies
SELECT most_frequent_values, mfv_frequencies
FROM ds_demo.financial_news_summary
WHERE target_column = 'stock';
px.bar(y = df_stock_frequencies.most_frequent_values.values[0],
x = df_stock_frequencies.mfv_frequencies.values[0],
color = df_stock_frequencies.most_frequent_values.values[0],
labels={'x':'News frequency', 'y': 'Stock'},text_auto='.2s',
title="10 Most Frequent Stocks")
Troviamo gli editori più dominanti nel nostro set di dati:
%%read_sql df_publisher_frequencies
SELECT most_frequent_values, mfv_frequencies
FROM ds_demo.financial_news_summary
WHERE target_column = 'publisher';
px.bar(y = df_publisher_frequencies.most_frequent_values.values[0],
x = df_publisher_frequencies.mfv_frequencies.values[0],
color = df_publisher_frequencies.most_frequent_values.values[0],
labels={'x':'News frequency', 'y': 'Publisher'},text_auto='.2s',
title="Top 10 - Frequent News sources")
%%read_sql df_url_domain
SELECT
split_part(REGEXP_REPLACE(url, '^(https?://)?(www\.)?', ''), '/', 1) AS source_url,
count(*) as frequency
FROM (SELECT
CASE WHEN url IS NOT NULL THEN url ELSE 'Other' END
AS url
FROM ds_demo.financial_news
) t
GROUP BY 1
ORDER BY 2 ASC;
fig = px.pie(df_url_domain,
names = 'source_url', values = 'frequency',
width=800, height=600,
title='Source websites of Stock Market News')
fig.update_traces(textposition='inside', textinfo='percent+label')
fig.show()
Per concludere, gli analisti e gli scienziati dei dati possono liberare le prestazioni di Greenplum e le capacità di elaborazione massicciamente parallele per elaborare ed esplorare grandi set di dati utilizzando funzioni di analisi integrate combinando SQL e Apache MADlib e visualizzando i risultati utilizzando Python .
In un blog successivo, scopriremo come Greenplum abilita Advanced Text Analytics & Text Search elaborando grandi quantità di dati testuali utilizzando la sua soluzione GPText (Greenplum Text) .
Grazie per aver letto! Qualsiasi commento o suggerimento è benvenuto! Dai un'occhiata agli altri articoli di Greenplum qui .

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































