Analizzare i dati con Apache Spark e Python

Importante

Microsoft Fabric è attualmente in ANTEPRIMA. Queste informazioni si riferiscono a un prodotto di versione preliminare che può essere modificato sostanzialmente prima che venga rilasciato. Microsoft non garantisce alcuna garanzia, espressa o implicita, rispetto alle informazioni fornite qui.

In questa esercitazione si apprenderà come eseguire l'analisi esplorativa dei dati usando Azure Open Datasets e Apache Spark.

In particolare, si analizzerà il set di dati taxi di New York City (NYC). I dati sono disponibili tramite set di dati aperti di Azure. Questo subset del set di dati contiene informazioni sulle corse in taxi giallo: informazioni su ogni viaggio, l'ora e l'ora di fine e le posizioni, il costo e altri attributi interessanti.

Prerequisiti

Importante

Microsoft Fabric è attualmente in ANTEPRIMA. Queste informazioni si riferiscono a un prodotto di versione preliminare che può essere modificato sostanzialmente prima che venga rilasciato. Microsoft non garantisce alcuna garanzia, espressa o implicita, rispetto alle informazioni fornite qui.

Scaricare e preparare i dati

  1. Creare un notebook usando 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.

  2. 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
    
  3. Poiché i dati non elaborati sono in formato Parquet, è possibile usare il contesto Spark per eseguire il pull del file in memoria come dataframe direttamente. Creare un dataframe Spark recuperando i dati tramite l'API Open Datasets. In questo caso viene usato lo schema di Spark DataFrame nelle proprietà di lettura per dedurre i tipi di dati e lo schema.

    from azureml.opendatasets import NycTlcYellow
    
    end_date = parser.parse('2018-06-06')
    start_date = parser.parse('2018-05-01')
    nyc_tlc = NycTlcYellow(start_date=start_date, end_date=end_date)
    nyc_tlc_pd = nyc_tlc.to_pandas_dataframe()
    
    df = spark.createDataFrame(nyc_tlc_pd)
    
  4. Dopo la lettura dei dati, si vuole eseguire un filtro iniziale 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

Come analista dei dati, è disponibile 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 Microsoft Fabric. In questa analisi vogliamo comprendere i fattori che producono suggerimenti più elevati sui taxi per il nostro periodo selezionato.

Apache Spark SQL Magic

In primo luogo, si eseguirà l'analisi esplorativa dei dati da Apache Spark SQL e i comandi magic con il notebook di Microsoft Fabric. Dopo aver eseguito la query, verranno visualizzati i risultati usando la funzionalità predefinita chart options .

  1. Nel notebook creare una nuova cella e copiare il codice seguente. Usando questa query, si vuole comprendere come sono stati modificati gli importi medi della punta nel periodo selezionato. Questa query consente inoltre di identificare altre informazioni utili, tra cui l'importo minimo/massimo della punta 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
    
  2. 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 e avgTipAmount come valore. Dopo aver effettuato le selezioni, selezionare Applica per aggiornare il grafico.

Visualizzare i dati

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

  1. Per semplificare lo sviluppo e meno costoso, il set di dati verrà ridotto. Verrà usata la funzionalità di campionamento di Apache Spark predefinita. Inoltre, sia Seaborn che Matplotlib richiedono una matrice Pandas DataFrame o NumPy. Per ottenere un dataframe Pandas, usare il comando per convertire il toPandas() 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. Verrà usato Matplotlib per creare un istogramma che mostra la distribuzione di quantità e conteggio della punta. In base alla distribuzione, è possibile notare che i suggerimenti sono ssimgliati verso importi inferiori 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()
    

    Screenshot dell'istogramma dei suggerimenti.

  3. Successivamente, vogliamo comprendere la relazione tra i suggerimenti per un determinato viaggio e il giorno della settimana. Usare Seaborn per creare un tracciato di caselle 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()
    
    

    Grafico che mostra la distribuzione dei suggerimenti al giorno.

  4. Un'altra ipotesi dei nostri potrebbe essere che c'è una relazione positiva tra il numero di passeggeri e l'importo totale della punta del taxi. Per verificare questa relazione, eseguire il codice seguente per generare un tracciato di caselle che illustra la distribuzione di suggerimenti per ogni conteggio dei 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 tracciato del whisker box.

  5. Infine, vogliamo comprendere la relazione tra l'importo della tariffa e l'importo della punta. In base ai risultati, possiamo notare che ci sono diverse osservazioni in cui le persone non puntano. Tuttavia, vediamo anche una relazione positiva tra le tariffe complessive e gli importi della punta.

    # 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()
    

    Screenshot del grafico a dispersione della quantità di suggerimento.

Passaggi successivi