Condividi tramite


Analizzare i dati con Apache Spark

In questa esercitazione si apprenderà come eseguire l'analisi esplorativa dei dati usando Set di dati aperti di Azure e Apache Spark. È quindi possibile visualizzare i risultati in un notebook di Synapse Studio in Azure Synapse Analytics.

In particolare, verrà analizzato il set di dati New York City (NYC) Taxi . I dati sono disponibili tramite set di dati aperti di Azure. Questo subset del set di dati contiene informazioni sulle corse in taxi: informazioni su ogni corsa, l'ora di partenza e di arrivo, i percorsi, i costi e altri attributi interessanti.

Prima di iniziare

Creare un pool di Apache Spark seguendo l'esercitazione Creare un pool di Apache Spark.

Scaricare e preparare i dati

  1. Creare un notebook usando il kernel PySpark. Per istruzioni, vedere Creare un notebook.

    Annotazioni

    A causa del kernel PySpark, non è necessario creare contesti in modo esplicito. Il contesto Spark viene creato automaticamente quando si esegue la prima cella di codice.

  2. In questa esercitazione si useranno diverse librerie per visualizzare il set di dati. Per eseguire questa analisi, importare le librerie seguenti:

    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    
  3. Poiché i dati non elaborati sono in formato Parquet, è possibile usare il contesto di Spark per caricare direttamente il file in memoria come DataFrame. Creare un dataframe Spark recuperando i dati tramite l'API Open Datasets. In questo caso si usa lo schema del dataframe Spark sulle proprietà di lettura per dedurre i tipi di dati e lo schema.

    from azureml.opendatasets import NycTlcYellow
    
    from datetime import datetime
    from dateutil import parser
    
    end_date = parser.parse('2018-05-08 00:00:00')
    start_date = parser.parse('2018-05-01 00:00:00')
    
    nyc_tlc = NycTlcYellow(start_date=start_date, end_date=end_date)
    df = spark.createDataFrame(nyc_tlc.to_pandas_dataframe())
    
    
  4. Dopo aver letto i dati, è necessario eseguire alcuni filtri iniziali per pulire il set di dati. È possibile rimuovere colonne non necessarie e aggiungere colonne che estraggono informazioni importanti. Verranno inoltre filtrate le anomalie all'interno del set di dati.

    # Filter the dataset 
    from pyspark.sql.functions import *
    
    filtered_df = df.select('vendorID', 'passengerCount', 'tripDistance','paymentType', 'fareAmount', 'tipAmount'\
                                    , date_format('tpepPickupDateTime', 'hh').alias('hour_of_day')\
                                    , dayofweek('tpepPickupDateTime').alias('day_of_week')\
                                    , dayofmonth(col('tpepPickupDateTime')).alias('day_of_month'))\
                                .filter((df.passengerCount > 0)\
                                    & (df.tipAmount >= 0)\
                                    & (df.fareAmount >= 1) & (df.fareAmount <= 250)\
                                    & (df.tripDistance > 0) & (df.tripDistance <= 200))
    
    filtered_df.createOrReplaceTempView("taxi_dataset")
    

Analisi dei dati

Gli analisti dei dati hanno a disposizione un'ampia gamma di strumenti che consentono di estrarre informazioni dettagliate dai dati. In questa parte dell'esercitazione verranno illustrati alcuni strumenti utili disponibili nei notebook di Azure Synapse Analytics. In questa analisi, vogliamo analizzare i fattori che portano a mance più alte per i taxi nel periodo selezionato.

Apache Spark SQL Magia

Prima di tutto, si eseguirà l'analisi esplorativa dei dati tramite Apache Spark SQL e i magic commands con il notebook di Azure Synapse. Dopo aver creato la query, i risultati verranno visualizzati usando la funzionalità predefinita chart options .

  1. Nel notebook creare una nuova cella e copiare il codice seguente. Utilizzando questa query, vogliamo comprendere come gli importi medi della mancia sono cambiati nel periodo che abbiamo selezionato. Questa query ci aiuterà a identificare altre informazioni utili, tra cui l'importo minimo/massimo della mancia quotidiana e dell'importo medio della tariffa.

    %%sql
    SELECT 
        day_of_month
        , MIN(tipAmount) AS minTipAmount
        , MAX(tipAmount) AS maxTipAmount
        , AVG(tipAmount) AS avgTipAmount
        , AVG(fareAmount) as fareAmount
    FROM taxi_dataset 
    GROUP BY day_of_month
    ORDER BY day_of_month ASC
    
  2. Al termine dell'esecuzione della query, è possibile visualizzare i risultati passando alla visualizzazione grafica. In questo esempio viene creato un grafico a linee specificando il campo day_of_monthcome chiave e avgTipAmount come valore. Dopo aver effettuato le selezioni, selezionare Applica per aggiornare il grafico.

Visualizza i dati

Oltre alle opzioni di creazione di grafici dei notebook predefiniti, è possibile usare le librerie open source più diffuse per creare visualizzazioni personalizzate. Negli esempi seguenti si useranno Seaborn e Matplotlib. Queste librerie Python vengono comunemente usate per la visualizzazione dei dati.

Annotazioni

Per impostazione predefinita, ogni pool di Apache Spark in Azure Synapse Analytics contiene un set di librerie comunemente usate e predefinite. È possibile visualizzare l'elenco completo delle librerie nella documentazione del runtime di Azure Synapse . Inoltre, per rendere disponibile codice di terze parti o creato in locale per le applicazioni, è possibile installare una libreria in uno dei pool di Spark.

  1. Per semplificare e ridurre i costi di sviluppo, il set di dati verrà ridotto. Si userà la funzionalità di campionamento di Apache Spark predefinita. Inoltre, sia Seaborn che Matplotlib richiedono una matrice DataFrame Pandas o NumPy. Per ottenere un DataFrame Pandas, usare il comando toPandas() per convertire il DataFrame.

    # To make development easier, faster, and less expensive, downsample for now
    sampled_taxi_df = filtered_df.sample(True, 0.001, seed=1234)
    
    # The charting package needs a Pandas DataFrame or NumPy array to do the conversion
    sampled_taxi_pd_df = sampled_taxi_df.toPandas()
    
  2. Si vuole comprendere la distribuzione dei suggerimenti nel set di dati. Si utilizzerà Matplotlib per creare un istogramma che mostra la distribuzione dell'importo e del numero delle mance. In base alla distribuzione, possiamo vedere che le mance sono sbilanciate verso importi minori o uguali a 10 $.

    # Look at a histogram of tips by count by using Matplotlib
    
    ax1 = sampled_taxi_pd_df['tipAmount'].plot(kind='hist', bins=25, facecolor='lightblue')
    ax1.set_title('Tip amount distribution')
    ax1.set_xlabel('Tip Amount ($)')
    ax1.set_ylabel('Counts')
    plt.suptitle('')
    plt.show()
    

    Istogramma di suggerimenti.

  3. Successivamente, vogliamo comprendere la relazione tra i suggerimenti per un determinato viaggio e il giorno della settimana. Usare Seaborn per creare un diagramma a scatola che riepiloghi le tendenze per ogni giorno della settimana.

    # View the distribution of tips by day of week using Seaborn
    ax = sns.boxplot(x="day_of_week", y="tipAmount",data=sampled_taxi_pd_df, showfliers = False)
    ax.set_title('Tip amount distribution per day')
    ax.set_xlabel('Day of Week')
    ax.set_ylabel('Tip Amount ($)')
    plt.show()
    
    

    Grafico che mostra la distribuzione dei suggerimenti al giorno.

  4. Un'altra nostra ipotesi potrebbe essere che esiste una relazione positiva tra il numero di passeggeri e l'importo totale delle mance dei taxi. Per verificare questa relazione, eseguire il codice seguente per generare un box plot che illustri la distribuzione delle mance per ciascun numero di passeggeri.

    # How many passengers tipped by various amounts 
    ax2 = sampled_taxi_pd_df.boxplot(column=['tipAmount'], by=['passengerCount'])
    ax2.set_title('Tip amount by Passenger count')
    ax2.set_xlabel('Passenger count')
    ax2.set_ylabel('Tip Amount ($)')
    ax2.set_ylim(0,30)
    plt.suptitle('')
    plt.show()
    

    Grafico che mostra un diagramma a scatola e baffi.

  5. Infine, vogliamo comprendere la relazione tra l'importo della tariffa e l'importo della mancia. In base ai risultati, possiamo vedere che ci sono diverse situazioni in cui le persone non danno la mancia. Tuttavia, vediamo anche una relazione positiva tra l'importo complessivo della tariffa e la mancia.

    # Look at the relationship between fare and tip amounts
    
    ax = sampled_taxi_pd_df.plot(kind='scatter', x= 'fareAmount', y = 'tipAmount', c='blue', alpha = 0.10, s=2.5*(sampled_taxi_pd_df['passengerCount']))
    ax.set_title('Tip amount by Fare amount')
    ax.set_xlabel('Fare Amount ($)')
    ax.set_ylabel('Tip Amount ($)')
    plt.axis([-2, 80, -2, 20])
    plt.suptitle('')
    plt.show()
    

    Diagramma di dispersione dell'importo della mancia.

Spegnere l'istanza di Spark

Al termine dell'esecuzione dell'applicazione, spegni il notebook per rilasciare le risorse. Chiudere la scheda o selezionare Termina sessione nel pannello di stato nella parte inferiore del notebook.

Vedere anche

Passaggi successivi