Analýza dat pomocí Apache Sparku a Pythonu
V tomto kurzu se dozvíte, jak provádět průzkumnou analýzu dat pomocí Azure Open Datasets a Apache Sparku.
Konkrétně budeme analyzovat datovou sadu Taxi v New Yorku (NYC). Data jsou k dispozici prostřednictvím Azure Open Datasets. Tato podmnožina datové sady obsahuje informace o žlutých jízdách taxíkem: informace o každé jízdě, počátečním a koncovém čase a umístění, nákladech a dalších zajímavých atributech.
Požadavky
Získejte předplatné Microsoft Fabric. Nebo si zaregistrujte bezplatnou zkušební verzi Microsoft Fabricu.
Přihlaste se k Microsoft Fabric.
Pomocí přepínače prostředí na levé straně domovské stránky přepněte na prostředí Synapse Datová Věda.
Stažení a příprava dat
Vytvořte poznámkový blok pomocí PySparku. Pokyny najdete v tématu Vytvoření poznámkového bloku.
Poznámka:
Kvůli jádru PySpark nemusíte explicitně vytvářet žádné kontexty. Kontext Sparku se automaticky vytvoří za vás při spuštění první buňky kódu.
V tomto kurzu použijeme několik různých knihoven, které nám pomůžou vizualizovat datovou sadu. Pokud chcete tuto analýzu provést, naimportujte následující knihovny:
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd
Vzhledem k tomu, že nezpracovaná data jsou ve formátu Parquet, můžete použít kontext Sparku k přímému načtení souboru do paměti jako datového rámce. Vytvořte datový rámec Sparku načtením dat prostřednictvím rozhraní API Open Datasets. V této části použijeme schéma datového rámce Sparku při čtení vlastností k odvození datových typů a schématu.
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)
Po přečtení dat budeme chtít provést počáteční filtrování, abychom datovou sadu vyčistili. Nepotřebné sloupce můžeme odebrat a přidat sloupce, které extrahují důležité informace. Kromě toho vyfiltrujeme anomálie v datové sadě.
# 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")
Analýza dat
Jako datový analytik máte k dispozici širokou škálu nástrojů, které vám pomůžou extrahovat přehledy z dat. V této části kurzu si projdeme několik užitečných nástrojů dostupných v poznámkových blocích Microsoft Fabric. V této analýze chceme pochopit faktory, které poskytují vyšší tipy taxi pro vybrané období.
Apache Spark SQL Magic
Nejprve provedeme průzkumnou analýzu dat pomocí Apache Spark SQL a příkazů magic s poznámkovým blokem Microsoft Fabric. Jakmile budeme mít náš dotaz, vizualizujeme výsledky pomocí integrované chart options
funkce.
V poznámkovém bloku vytvořte novou buňku a zkopírujte následující kód. Pomocí tohoto dotazu chceme pochopit, jak se průměrné částky tipu v průběhu vybraného období změnily. Tento dotaz nám také pomůže identifikovat další užitečné přehledy, včetně minimální/maximální částky tipu za den a průměrného tarifu.
%%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
Po dokončení dotazu můžeme výsledky vizualizovat přepnutím do zobrazení grafu. Tento příklad vytvoří spojnicový graf zadáním
day_of_month
pole jako klíče aavgTipAmount
hodnoty. Po provedení výběru vyberte Použít a aktualizujte graf.
Vizualizace dat
Kromě předdefinovaných možností vytváření grafů v poznámkových blocích můžete k vytváření vlastních vizualizací použít oblíbené opensourcové knihovny. V následujících příkladech použijeme Seaborn a Matplotlib. Běžně se používají knihovny Pythonu pro vizualizaci dat.
Abychom usnadnili a snížili náklady na vývoj, převzorkujeme datovou sadu. Použijeme integrovanou funkci vzorkování Apache Sparku. Kromě toho vyžaduje Knihovna Seaborn i Matplotlib datový rámec Pandas nebo pole NumPy. K získání datového rámce Pandas použijte
toPandas()
příkaz k převodu datového rámce.# 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()
Chceme porozumět distribuci tipů v naší datové sadě. Pomocí knihovny Matplotlib vytvoříme histogram, který ukazuje rozdělení počtu a počtu tipů. Na základě distribuce vidíme, že tipy se zkosí směrem k částekm nižším nebo rovnou 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()
Dále chceme porozumět vztahu mezi tipy pro danou cestu a dnem v týdnu. Pomocí Seabornu vytvořte krabicový graf, který shrnuje trendy pro každý den v týdnu.
# 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()
Další hypotézou naší hypotézy může být, že existuje kladný vztah mezi počtem cestujících a celkovou částkou tipu taxislužby. Pokud chcete ověřit tuto relaci, spusťte následující kód a vygenerujte krabicový graf, který znázorňuje rozdělení tipů pro každý počet cestujících.
# 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()
Nakonec chceme porozumět vztahu mezi částkou jízdného a částkou tipu. Na základě výsledků vidíme, že existuje několik pozorování, kde lidé ne tipují. Vidíme ale také pozitivní vztah mezi celkovým množstvím jízdného a tipem.
# 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()
Související obsah
- Naučte se používat rozhraní Pandas API v Apache Sparku: Rozhraní API Pandas v Apache Sparku
- In-line instalace Pythonu
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro