Partilhar via


Analisar os dados com o Apache Spark

Neste tutorial, irá aprender a realizar análises de dados exploratórias com o Azure Open Datasets e o Apache Spark. Em seguida, pode visualizar os resultados num bloco de notas Synapse Studio no Azure Synapse Analytics.

Em particular, vamos analisar o conjunto de dados de Táxis de Nova Iorque (NYC ). Os dados estão disponíveis através do Azure Open Datasets. Este subconjunto do conjunto de dados contém informações sobre viagens de táxi amarelas: informações sobre cada viagem, a hora de início e de fim e as localizações, o custo e outros atributos interessantes.

Antes de começar

Crie um Conjunto do Apache Spark ao seguir o tutorial Criar um conjunto do Apache Spark.

Transferir e preparar os dados

  1. Crie um bloco de notas com o kernel do PySpark. Para obter instruções, consulte Criar um bloco de notas.

    Nota

    Devido ao kernel do PySpark, não precisa de criar nenhum contexto explicitamente. O contexto do Spark é criado automaticamente quando executa a primeira célula de código.

  2. Neste tutorial, vamos utilizar várias bibliotecas diferentes para nos ajudar a visualizar o conjunto de dados. Para fazer esta análise, importe as seguintes bibliotecas:

    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    
  3. Uma vez que os dados não processados estão num formato Parquet, pode utilizar o contexto do Spark para extrair o ficheiro para a memória como um DataFrame diretamente. Crie um DataFrame do Spark ao obter os dados através da API Abrir Conjuntos de Dados. Aqui, utilizamos o esquema do DataFrame do Spark em propriedades de leitura para inferir os tipos de dados e o esquema.

    from azureml.opendatasets import NycTlcYellow
    
    from datetime import datetime
    from dateutil import parser
    
    end_date = parser.parse('2018-05-08 00:00:00')
    start_date = parser.parse('2018-05-01 00:00:00')
    
    nyc_tlc = NycTlcYellow(start_date=start_date, end_date=end_date)
    df = spark.createDataFrame(nyc_tlc.to_pandas_dataframe())
    
    
  4. Após a leitura dos dados, vamos querer fazer alguma filtragem inicial para limpar o conjunto de dados. Podemos remover colunas desnecessárias e adicionar colunas que extraem informações importantes. Além disso, vamos filtrar anomalias no conjunto de dados.

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

Analisar dados

Enquanto analista de dados, tem uma vasta gama de ferramentas disponíveis para o ajudar a extrair informações dos dados. Nesta parte do tutorial, vamos analisar algumas ferramentas úteis disponíveis nos blocos de notas do Azure Synapse Analytics. Nesta análise, queremos compreender os fatores que produzem sugestões de táxi mais elevadas para o nosso período selecionado.

Apache Spark SQL Magic

Primeiro, vamos realizar análises de dados exploratórias através do SQL do Apache Spark e comandos mágicos com o bloco de notas Azure Synapse. Depois de termos a nossa consulta, vamos visualizar os resultados com a capacidade incorporada chart options .

  1. No seu bloco de notas, crie uma nova célula e copie o seguinte código. Ao utilizar esta consulta, queremos compreender como as quantidades médias de sugestões foram alteradas ao longo do período que selecionámos. Esta consulta também nos ajudará a identificar outras informações úteis, incluindo o valor mínimo/máximo da gorjeta por dia e o valor médio da tarifa.

    %%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. Depois de a nossa consulta terminar de ser executada, podemos visualizar os resultados ao mudar para a vista de gráfico. Este exemplo cria um gráfico de linhas ao especificar o day_of_month campo como a chave e avgTipAmount como o valor. Depois de efetuar as seleções, selecione Aplicar para atualizar o gráfico.

Visualizar os dados

Além das opções de gráficos de blocos de notas incorporadas, pode utilizar bibliotecas open source populares para criar as suas próprias visualizações. Nos exemplos seguintes, vamos utilizar Seaborn e Matplotlib. Estas são bibliotecas Python frequentemente utilizadas para visualização de dados.

Nota

Por predefinição, todos os conjuntos do Apache Spark no Azure Synapse Analytics contêm um conjunto de bibliotecas frequentemente utilizadas e predefinidas. Pode ver a lista completa de bibliotecas na documentação do Azure Synapse runtime. Além disso, para disponibilizar código criado localmente ou de terceiros às suas aplicações, pode instalar uma biblioteca num dos seus conjuntos do Spark.

  1. Para tornar o desenvolvimento mais fácil e menos dispendioso, vamos reduzir a utilização do conjunto de dados. Vamos utilizar a capacidade de amostragem incorporada do Apache Spark. Além disso, tanto o Seaborn como o Matplotlib necessitam de uma matriz Pandas DataFrame ou NumPy. Para obter um DataFrame do Pandas, utilize o toPandas() comando para converter o 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. Queremos compreender a distribuição de sugestões no nosso conjunto de dados. Vamos utilizar o Matplotlib para criar um histograma que mostra a distribuição da quantidade e contagem de pontas. Com base na distribuição, podemos ver que as sugestões são desviadas para valores inferiores ou iguais 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()
    

    Histograma de sugestões.

  3. Em seguida, queremos compreender a relação entre as sugestões para uma determinada viagem e o dia da semana. Utilize a Seaborn para criar um gráfico de caixa que resume as tendências de cada dia da semana.

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

    Gráfico que mostra a distribuição de sugestões por dia.

  4. Outra hipótese nossa pode ser que há uma relação positiva entre o número de passageiros e a quantidade total de gorjetas de táxi. Para verificar esta relação, execute o seguinte código para gerar um gráfico de caixa que ilustra a distribuição de sugestões para cada contagem de passageiros.

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

    Gráfico que mostra um gráfico de bigode de caixa.

  5. Por último, queremos compreender a relação entre o montante da tarifa e o montante da gorjeta. Com base nos resultados, podemos ver que existem várias observações em que as pessoas não dão gorjeta. No entanto, também vemos uma relação positiva entre os montantes gerais da tarifa e da gorjeta.

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

    Gráfico de dispersão da quantidade de ponta.

Encerrar a instância do Spark

Depois de concluir a execução da aplicação, encerre o bloco de notas para libertar os recursos. Feche o separador ou selecione Terminar Sessão no painel de estado na parte inferior do bloco de notas.

Ver também

Passos seguintes