Analyser data med Apache Spark og Python
Viktig
Microsoft Fabric er i forhåndsversjon.
I denne opplæringen lærer du hvordan du utfører utforskende dataanalyser ved hjelp av Azure Open Datasets og Apache Spark.
Spesielt analyserer vi New York City (NYC) Taxi-datasettet . Dataene er tilgjengelige via Azure Open Datasets. Dette delsettet av datasettet inneholder informasjon om gule taxiturer: informasjon om hver reise, start- og sluttidspunkt og plasseringer, kostnaden og andre interessante attributter.
Forutsetninger
Viktig
Microsoft Fabric er i forhåndsversjon.
Last ned og klargjør dataene
Opprett en notatblokk ved hjelp av PySpark. Hvis du vil ha instruksjoner, kan du se Opprette en notatblokk.
Obs!
På grunn av PySpark-kjernen trenger du ikke å opprette noen kontekster eksplisitt. Spark-konteksten opprettes automatisk for deg når du kjører den første kodecellen.
I denne opplæringen skal vi bruke flere forskjellige biblioteker for å hjelpe oss med å visualisere datasettet. Hvis du vil gjøre denne analysen, importerer du følgende biblioteker:
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd
Siden rådataene er i Parquet-format, kan du bruke Spark-konteksten til å hente filen inn i minnet som en DataFrame direkte. Opprett en Spark DataFrame ved å hente dataene via Open Datasets-API-en. Her bruker vi Spark DataFrame-skjemaet på leseegenskaper for å utlede datatyper og skjema.
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)
Når dataene er lest, bør vi utføre noen første filtrering for å rense datasettet. Vi kan fjerne unødvendige kolonner og legge til kolonner som trekker ut viktig informasjon. I tillegg filtrerer vi ut avvik i datasettet.
# 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")
Analyser data
Som dataanalytiker har du et bredt spekter av verktøy tilgjengelig for å hjelpe deg med å trekke ut innsikt fra dataene. I denne delen av opplæringen skal vi gå gjennom noen nyttige verktøy som er tilgjengelige i Microsoft Fabric-notatblokker. I denne analysen ønsker vi å forstå faktorene som gir høyere taxitips for vår valgte periode.
Apache Spark SQL Magic
Først utfører vi utforskende dataanalyser av Apache Spark SQL og magiske kommandoer med Microsoft Fabric-notatblokken. Når vi har spørringen, visualiserer vi resultatene ved hjelp av den innebygde chart options
funksjonaliteten.
Opprett en ny celle i notatblokken, og kopier følgende kode. Ved å bruke denne spørringen ønsker vi å forstå hvordan gjennomsnittlig tipsbeløp har endret seg i løpet av perioden vi har valgt. Denne spørringen vil også hjelpe oss med å identifisere andre nyttige innsikter, inkludert minimums-/maksimumstipsbeløpet per dag og gjennomsnittlig prisbeløp.
%%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
Når spørringen er ferdig, kan vi visualisere resultatene ved å bytte til diagramvisningen. Dette eksemplet oppretter et linjediagram ved å
day_of_month
angi feltet som nøkkel ogavgTipAmount
verdi. Når du har gjort valgene, velger du Bruk for å oppdatere diagrammet.
Visualiser data
I tillegg til de innebygde diagramalternativene for notatblokker, kan du bruke populære biblioteker med åpen kildekode til å opprette dine egne visualiseringer. I eksemplene nedenfor bruker vi Seaborn og Matplotlib. Dette er ofte brukte Python-biblioteker for datavisualisering.
For å gjøre utviklingen enklere og billigere, vil vi redusere datasettet. Vi bruker den innebygde samplingsfunksjonen i Apache Spark. I tillegg krever både Seaborn og Matplotlib en Pandas DataFrame eller NumPy-matrise. Hvis du vil hente en Pandas DataFrame, bruker
toPandas()
du kommandoen til å konvertere 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()
Vi ønsker å forstå distribusjonen av tips i datasettet vårt. Vi bruker Matplotlib til å opprette et histogram som viser fordelingen av tipsmengde og antall. Basert på fordelingen kan vi se at tips er skjevt mot mengder mindre enn eller lik $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()
Deretter ønsker vi å forstå forholdet mellom tipsene for en gitt tur og ukedagen. Bruk Seaborn til å lage et boksplott som oppsummerer trendene for hver dag i uken.
# 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()
En annen hypotese av oss kan være at det er en positiv sammenheng mellom antall passasjerer og det totale taxitipsbeløpet. Hvis du vil bekrefte denne relasjonen, kjører du følgende kode for å generere et boksplott som illustrerer fordelingen av tips for hvert passasjerantall.
# 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()
Sist ønsker vi å forstå forholdet mellom prisbeløpet og tipsbeløpet. Basert på resultatene kan vi se at det finnes flere observasjoner der folk ikke tipser. Men vi ser også en positiv sammenheng mellom den totale prisen og tipsbeløpene.
# 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()
Neste trinn
- Finn ut hvordan du bruker Pandas API på Apache Spark: Pandas API på Apache Spark
- Behandle Python-biblioteker: Administrasjon av Python-bibliotek