Dela via


Analysera data med Apache Spark och Python

I den här artikeln får du lära dig hur du utför undersökande dataanalys med hjälp av Azure Open Datasets och Apache Spark. Den här artikeln analyserar datamängden för Taxi i New York City. Data är tillgängliga via Azure Open Datasets. Den här delmängden av datamängden innehåller information om gula taxiresor: information om varje resa, start- och sluttid och platser, kostnaden och andra intressanta attribut.

Den här artikeln innehåller följande avsnitt:

  • Ladda ned och förbereda data
  • Analysera data
  • Visualisera data

Förutsättningar

Ladda ned och förbereda data

Börja genom att ladda ned datamängden New York City (NYC) Taxi och förbereda data.

  1. Skapa en notebook-fil med hjälp av PySpark. Anvisningar finns i Skapa en notebook-fil.

    Kommentar

    På grund av PySpark-kerneln behöver du inte skapa några kontexter explicit. Spark-kontexten skapas automatiskt åt dig när du kör den första kodcellen.

  2. I den här artikeln använder du flera olika bibliotek för att visualisera datamängden. Om du vill göra den här analysen importerar du följande bibliotek:

    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    
  3. Eftersom rådata är i Parquet-format kan du använda Spark-kontexten för att hämta filen till minnet som en DataFrame direkt. Använd API:et Öppna datauppsättningar för att hämta data och skapa en Spark DataFrame. Om du vill härleda datatyperna och schemat använder du Spark DataFrame-schemat för läsegenskaper .

    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. När data har lästs utför du en inledande filtrering för att rensa datamängden. Du kan ta bort onödiga kolumner och lägga till kolumner som extraherar viktig information. Dessutom kan du filtrera bort avvikelser i datauppsättningen.

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

Analysera data

Som dataanalytiker har du ett brett utbud av verktyg som hjälper dig att extrahera insikter från data. I den här delen av artikeln får du lära dig mer om några användbara verktyg som är tillgängliga i Microsoft Fabric-notebook-filer. I den här analysen vill du förstå de faktorer som ger högre taxitips för den valda perioden.

Apache Spark SQL Magic

Börja med att utföra undersökande dataanalys med hjälp av Apache Spark SQL och magiska kommandon med Microsoft Fabric Notebook. När du har frågan visualiserar du resultatet med hjälp av den inbyggda chart options funktionen.

  1. I notebook-filen skapar du en ny cell och kopierar följande kod. Med den här frågan kan du förstå hur de genomsnittliga tipsbeloppen ändras under den period du väljer. Den här frågan hjälper dig också att identifiera andra användbara insikter, inklusive minsta/högsta tipsbelopp per dag och genomsnittligt prisbelopp.

    %%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. När frågan har körts kan du visualisera resultatet genom att växla till diagramvyn. Det här exemplet skapar ett linjediagram genom att ange fältet day_of_month som nyckel och avgTipAmount som värde. När du har valt väljer du Använd för att uppdatera diagrammet.

Visualisera data

Förutom de inbyggda diagramalternativen för notebook-filer kan du använda populära bibliotek med öppen källkod för att skapa egna visualiseringar. I följande exempel använder du Seaborn och Matplotlib, som ofta används av Python-bibliotek för datavisualisering.

  1. Om du vill göra utvecklingen enklare och billigare minskar du datamängden. Använd den inbyggda Apache Spark-samplingsfunktionen. Dessutom kräver både Seaborn och Matplotlib en Pandas DataFrame- eller NumPy-matris. Om du vill hämta en Pandas DataFrame använder du toPandas() kommandot för att konvertera 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. Du kan förstå fördelningen av tips i datamängden. Använd Matplotlib för att skapa ett histogram som visar fördelningen av tipsmängd och antal. Baserat på fördelningen kan du se att tipsen är skeva mot belopp som är mindre än eller lika med 10 USD.

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

    Skärmbild av histogram som visar tipsmängdsfördelningen.

  3. Försök sedan att förstå relationen mellan tipsen för en viss resa och veckodagen. Använd Seaborn för att skapa ett låddiagram som sammanfattar trenderna för varje dag i veckan.

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

    Diagram som visar fördelningen av tips per dag.

  4. En annan hypotes kan vara att det finns ett positivt samband mellan antalet passagerare och den totala mängden taxitips. Kontrollera den här relationen genom att köra följande kod för att generera ett låddiagram som illustrerar fördelningen av tips för varje antal passagerare.

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

    Diagram som visar ett lådrhårsdiagram med tipsmängd efter antal passagerare.

  5. Utforska slutligen relationen mellan prisbeloppet och dricksbeloppet. Baserat på resultaten kan du se att det finns flera observationer där personer inte tipsar. Det finns dock ett positivt samband mellan det totala priset och dricksbeloppen.

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

    Skärmbild av punktdiagram med tipsmängd.