Analizzare dati con Apache Spark
In questa esercitazione si apprenderà come eseguire l'analisi esplorativa dei dati usando Azure Open Datasets e Apache Spark. È quindi possibile visualizzare i risultati in un notebook 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 sottoinsieme del set di dati contiene informazioni sulle corse in taxi giallo: informazioni su ogni corsa, ora di inizio e fine e località, sui costi e su altri attributi interessanti.
Prima di iniziare
Creare un pool di Apache Spark seguendo le istruzioni di questa esercitazione.
Scaricare e preparare i dati
Creare un notebook usando il kernel PySpark. Per le istruzioni, vedere Creare un notebook.
Nota
Dato che è stato usato il kernel PySpark, non è necessario creare contesti in modo esplicito. Il contesto Spark viene creata automaticamente quando si esegue la prima cella di codice.
In questa esercitazione verranno usate 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
Poiché i dati non elaborati sono in formato Parquet, è possibile usare il contesto Spark per eseguire direttamente il pull del file in memoria come dataframe. Creare un dataframe Spark recuperando i dati tramite l'API Open Datasets. In questo caso viene usato lo schema del dataframe Spark nelle 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) filtered_df = spark.createDataFrame(nyc_tlc.to_pandas_dataframe())
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. Inoltre, verranno 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")
Analizzare i 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 si vogliono comprendere i fattori che producono suggerimenti per i taxi più elevati per il periodo selezionato.
Apache Spark SQL Magic
In primo luogo, si eseguirà l'analisi esplorativa dei dati tramite Apache Spark SQL e i comandi magic con il notebook Azure Synapse. Dopo aver ottenuto la query, i risultati verranno visualizzati usando la funzionalità predefinita chart options
.
Nel notebook creare una nuova cella e copiare il codice seguente. Usando questa query, si vuole comprendere in che modo gli importi medi delle mance sono cambiati nel periodo selezionato. Questa query consentirà anche di identificare altre informazioni utili, tra cui l'importo minimo/massimo della mancia al giorno e l'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
Al termine dell'esecuzione della query, è possibile visualizzare i risultati passando alla visualizzazione grafico. In questo esempio viene creato un grafico a linee specificando il
day_of_month
campo come chiave eavgTipAmount
come valore. Dopo aver effettuato le selezioni, selezionare Applica per aggiornare il grafico.
Visualizzare 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.
Nota
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 Azure Synapse runtime. Inoltre, per rendere disponibile codice di terze parti o compilato localmente per le applicazioni, è possibile installare una libreria in uno dei pool di Spark.
Per semplificare e ridurre i costi di sviluppo, il set di dati verrà ridotto. Si userà la funzionalità di campionamento Apache Spark predefinita. Seaborn e Matplotlib richiedono anche un dataframe Pandas o una matrice NumPy. Per ottenere un dataframe Pandas, usare il
toPandas()
comando 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()
Si vuole comprendere la distribuzione dei suggerimenti nel set di dati. Si userà Matplotlib per creare un istogramma che mostra la distribuzione dell'importo della mancia e del conteggio. In base alla distribuzione, è possibile notare che i suggerimenti sono asimmetrici 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()
Successivamente, vogliamo comprendere la relazione tra i suggerimenti per un determinato viaggio e il giorno della settimana. Usare Seaborn per creare un tracciato box che riepiloga 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()
Un'altra ipotesi del nostro potrebbe essere che esiste una relazione positiva tra il numero di passeggeri e l'importo totale della mancia di taxi. Per verificare questa relazione, eseguire il codice seguente per generare un tracciato box che illustra la distribuzione dei suggerimenti per ogni 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()
Infine, si vuole comprendere la relazione tra l'importo della tariffa e l'importo della mancia. In base ai risultati, è possibile notare che ci sono diverse osservazioni in cui le persone non puntano. Tuttavia, vediamo anche una relazione positiva tra la tariffa complessiva e gli importi delle mance.
# 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()
Arrestare l'istanza di Spark
Al termine dell'esecuzione dell'applicazione, arrestare il notebook per rilasciare le risorse. Chiudere la scheda o selezionare Termina sessione nel pannello di stato nella parte inferiore del notebook.
Vedere anche
- Panoramica: Apache Spark in Azure Synapse Analytics
- Creare un modello di Machine Learning con Apache SparkML