Greenplum for Data Science Blog Series Parte 1: Big Data Analysis con SQL e Python

Mar 20 2023
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.

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:

  1. 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
  2. Dai la priorità a cosa costruire dopo con i product manager.
  3. Collaborare con i data engineer per identificare e preparare i dati per l'analisi.
  4. Esplora i dati e crea modelli di macchine per soddisfare le esigenze degli utenti, in genere codificando in Python, R o SQL.
  5. Integrazione con gli ingegneri del software per distribuire modelli come servizi che devono essere utilizzati dalle applicazioni o direttamente dagli utenti.
  6. 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à

  1. Installa i pacchetti:
  2. !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:

  1. Innanzitutto, converti la datecolonna nel formato Anno-Mese utilizzando la to_charfunzione SQL.
  2. Quindi, raggruppa in base al formato datee calcola le frequenze utilizzandoCOUNT(*)
  3. Ordina i risultati finali in base al file date.
  4. %%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 .