Analýza dat pomocí Apache Sparku a Pythonu
Důležité
Microsoft Fabric je v současné době ve verzi PREVIEW. Tyto informace se týkají předběžného vydání produktu, který může být před vydáním podstatně změněn. Společnost Microsoft neposkytuje na zde uvedené informace žádné záruky, ať už vyjádřené nebo předpokládané.
V tomto kurzu se naučíte provádět průzkumné analýzy dat pomocí Azure Open Datasets a Apache Sparku.
Konkrétně budeme analyzovat datovou sadu New York City (NYC) Taxi . Data jsou k dispozici prostřednictvím služby Azure Open Datasets. Tato podmnožina datové sady obsahuje informace o žlutých jízdách taxi: informace o každé cestě, počátečním a koncovém čase a umístění, nákladech a dalších zajímavých atributech.
Požadavky
Důležité
Microsoft Fabric je v současné době ve verzi PREVIEW. Tyto informace se týkají předběžného vydání produktu, který může být před vydáním podstatně změněn. Společnost Microsoft neposkytuje na zde uvedené informace žádné záruky, ať už vyjádřené nebo předpokládané.
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ří 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 s vizualizací datové sady. Chcete-li provést tuto analýzu, 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í OPEN Datasets API. Zde použijeme schéma datového rámce Sparku pro vlastnosti čtení 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 datovou sadu nejprve vyfiltrovat. Můžeme odebrat nepotřebné sloupce a přidat sloupce, které extrahují důležité informace. Kromě toho v datové sadě vyfiltrujeme anomálie.
# 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 porozumět faktorům, které poskytují vyšší tipy taxi pro vybrané období.
Apache Spark SQL Magic
Nejprve provedeme průzkumnou analýzu dat pomocí Sql Apache Sparku a magických příkazů pomocí poznámkového bloku Microsoft Fabric. Po zadání dotazu 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 za vybrané období změnily průměrné částky spropitné. 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é ceny jízdného.
%%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 vizualizovat výsledky přepnutím do zobrazení grafu. Tento příklad vytvoří spojnicový graf zadáním
day_of_month
pole jako klíče aavgTipAmount
jako hodnoty. Po výběru vyberte Použít a aktualizujte graf.
Vizualizace dat
Kromě předdefinovaných možností vytváření grafů poznámkových bloků 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. Tyto knihovny Pythonu se běžně používají pro vizualizaci dat.
Aby byl vývoj jednodušší a levnější, převzorkujeme datovou sadu dolů. Použijeme integrovanou funkci vzorkování Apache Sparku. Kromě toho Seaborn i Matplotlib vyžadují datový rámec Pandas nebo pole NumPy. Pokud chcete získat datový rámec 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ě. Použijeme Matplotlib k vytvoření histogramu, který bude zobrazovat rozdělení množství tipu a počtu. Na základě rozdělení vidíme, že spropitné jsou zkosené směrem k částem menším nebo rovenm 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 můžete vytvořit 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ší naší hypotézou může být, že existuje pozitivní vztah mezi počtem cestujících a celkovou částkou taxi tipu. Pokud chcete ověřit tuto relaci, spusťte následující kód, který vygeneruje krabicový graf, který znázorňuje rozdělení hrotů pro jednotlivé počty 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í, u kterých lidé nedají tip. Vidíme ale také kladný vztah mezi celkovým tarifem a částkami spropitného.
# 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()
Další kroky
- Naučte se používat rozhraní Pandas API v Apache Sparku: Rozhraní Pandas API v Apache Sparku
- Správa knihoven Pythonu: Správa knihoven Pythonu