Tutorial: Preparar dados para modelagem de regressãoTutorial: Prepare data for regression modeling

Neste tutorial, você aprenderá a preparar dados para a modelagem de regressão usando o SDK de Preparação de Dados do Azure Machine Learning para Python.In this tutorial, you learn how to prepare data for regression modeling by using the Azure Machine Learning Data Prep SDK for Python. Você executará várias transformações para filtrar e combinar dois conjuntos diferentes de dados de táxi em Nova York.You run various transformations to filter and combine two different NYC taxi data sets.

Este tutorial é parte uma de uma série de tutoriais de duas partes.This tutorial is part one of a two-part tutorial series. Depois de concluir a série de tutoriais, você poderá prever o custo de uma corrida de táxi treinando um modelo em recursos de dados.After you complete the tutorial series, you can predict the cost of a taxi trip by training a model on data features. Esses recursos incluem o dia e a hora da retirada, o número de passageiros e o local de retirada.These features include the pickup day and time, the number of passengers, and the pickup location.

Neste tutorial, você irá:In this tutorial, you:

  • Configurar um ambiente Python e importar pacotes.Set up a Python environment and import packages.
  • Carregar dois conjuntos de dados com nomes de campos diferentes.Load two datasets with different field names.
  • Limpar dados para remover anomalias.Cleanse data to remove anomalies.
  • Transformar dados usando transformações inteligentes para criar recursos.Transform data by using intelligent transforms to create new features.
  • Salvar o objeto de fluxo de dados a ser usado em um modelo de regressão.Save your dataflow object to use in a regression model.

Pré-requisitosPrerequisites

Vá para Configurar seu ambiente de desenvolvimento para ler as etapas do notebook ou use as instruções abaixo para obter o notebook e executá-lo em Azure Notebooks ou seu próprio servidor de notebook.Skip to Set up your development environment to read through the notebook steps, or use the instructions below to get the notebook and run it on Azure Notebooks or your own notebook server. Para executar o notebook, você precisará de:To run the notebook you will need:

  • Um servidor de notebook do Python 3.6 com o seguinte instalado:A Python 3.6 notebook server with the following installed:
    • O SDK de Preparação de Dados do Azure Machine Learning para PythonThe Azure Machine Learning Data Prep SDK for Python
  • O notebook do tutorialThe tutorial notebook

Obtenha todos esses pré-requisitos de qualquer uma das seções a seguir.Get all these prerequisites from either of the sections below.

Usar o Azure Notebooks: notebooks gratuitos do Jupyter na nuvemUse Azure Notebooks: Free Jupyter notebooks in the cloud

É fácil começar a usar o Azure Notebooks!It's easy to get started with Azure Notebooks! O SDK de Preparação de Dados do Azure Machine Learning já está instalado e configurado para você no Azure Notebooks.The Azure Machine Learning Data Prep SDK is already installed and configured for you on Azure Notebooks. A instalação e as atualizações futuras são gerenciadas automaticamente por meio dos serviços do Azure.The installation and future updates are automatically managed via Azure services.

Após concluir as etapas abaixo, execute o notebook tutorials/regression-part1-data-prep.ipynb em seu projeto de Introdução.After you complete the steps below, run the tutorials/regression-part1-data-prep.ipynb notebook in your Getting Started project.

  1. Conclua o Início rápido do portal do Azure Machine Learning para criar um workspace e iniciar os Azure Notebooks.Complete the Azure Machine Learning portal quickstart to create a workspace and launch Azure Notebooks. Fique à vontade ignorar a seção Usar o notebook se desejar.Feel free to skip the Use the notebook section if you wish.
  2. Se você já tiver concluído o início rápido, entre novamente no Azure Notebooks e abra o projeto Introdução.If you've already completed the quickstart, sign back into Azure Notebooks and open the Getting Started project.
  3. Lembre-se de iniciar o projeto se o status estiver interrompido.Remember to start the project if its status is stopped. Iniciar o projetoStart the project

Use seu próprio servidor do Jupyter NotebookUse your own Jupyter notebook server

Use estas etapas para criar um servidor de notebook local do Jupyter no seu computador.Use these steps to create a local Jupyter Notebook server on your computer. Após concluir as etapas, execute o notebook tutorials/regression-part1-data-prep.ipynb.After you complete the steps, run the tutorials/regression-part1-data-prep.ipynb notebook.

  1. Conclua as etapas de instalação no [Início Rápido do Python do Azure Machine Learning](setup-create-workspace.md#python) para criar um ambiente do Miniconda.Complete the installation steps in [Azure Machine Learning Python quickstart](setup-create-workspace.md#python) to create a Miniconda environment. Fique à vontade ignorar a seção Criar um workspace se você desejar, mas você precisará dela para a parte 2 desta série de tutoriais.Feel free to skip the Create a workspace section if you wish, but you will need it for part 2 of this tutorial series.

  2. Instale o SDK de Preparação de Dados em seu ambiente usando pip install azureml-dataprep.Install the Data Prep SDK in your environment using pip install azureml-dataprep.

  3. Clone o repositório do GitHub.Clone the GitHub repository.

    git clone https://github.com/Azure/MachineLearningNotebooks.git
    
  4. Inicie o servidor de notebook do seu diretório clonado.Start the notebook server from your cloned directory.

    jupyter notebook
    

Configurar seu ambiente de desenvolvimentoSet up your development environment

Toda a configuração para o seu trabalho de desenvolvimento pode ser realizada em um bloco de anotações do Python.All the setup for your development work can be accomplished in a Python notebook. A configuração inclui as seguintes ações:Setup includes the following actions:

  • Instalar o SDKInstall the SDK
  • Importar pacotes do PythonImport Python packages

Instalar e importar pacotesInstall and import packages

Use o comando a seguir para instalar os pacotes necessários se você ainda não os tiver.Use the following to install necessary packages if you don't already have them.

pip install azureml-dataprep==1.0.17

Importe o SDK.Import the SDK.

import azureml.dataprep as dprep

Importante

Instale a versão 1.0.17.Ensure you install version 1.0.17. Este tutorial não funcionará com a versão mais recente 1.1.0This tutorial will not work with the newest version 1.1.0

Carregar dadosLoad data

Baixe dois conjuntos de dados diferentes de táxi em Nova York em objetos de fluxo de dados.Download two different NYC taxi data sets into dataflow objects. Os conjuntos de dados têm campos um pouco diferentes.The datasets have slightly different fields. O método auto_read_file() reconhece automaticamente o tipo de arquivo de entrada.The auto_read_file() method automatically recognizes the input file type.

from IPython.display import display
dataset_root = "https://dprepdata.blob.core.windows.net/demo"

green_path = "/".join([dataset_root, "green-small/*"])
yellow_path = "/".join([dataset_root, "yellow-small/*"])

green_df_raw = dprep.read_csv(path=green_path, header=dprep.PromoteHeadersMode.GROUPED)
# auto_read_file automatically identifies and parses the file type, which is useful when you don't know the file type.
yellow_df_raw = dprep.auto_read_file(path=yellow_path)

display(green_df_raw.head(5))
display(yellow_df_raw.head(5))

Um objeto Dataflow é semelhante a um dataframe e representa uma série de operações imutáveis avaliadas lentamente nos dados.A Dataflow object is similar to a dataframe, and represents a series of lazily-evaluated, immutable operations on data. As operações podem ser adicionadas invocando os diferentes métodos de transformação e filtragem disponíveis.Operations can be added by invoking the different transformation and filtering methods available. O resultado de adicionar uma operação a um Dataflow sempre é um novo objeto Dataflow.The result of adding an operation to a Dataflow is always a new Dataflow object.

Limpar dadosCleanse data

Agora você pode preencher algumas variáveis com transformações de atalho a serem aplicadas a todos os fluxos de dados.Now you populate some variables with shortcut transforms to apply to all dataflows. A variável drop_if_all_null é usada para excluir registros nos quais todos os campos são nulos.The drop_if_all_null variable is used to delete records where all fields are null. A variável useful_columns contém uma matriz de descrições de coluna que são mantidas em cada fluxo de dados.The useful_columns variable holds an array of column descriptions that are kept in each dataflow.

all_columns = dprep.ColumnSelector(term=".*", use_regex=True)
drop_if_all_null = [all_columns, dprep.ColumnRelationship(dprep.ColumnRelationship.ALL)]
useful_columns = [
    "cost", "distance", "dropoff_datetime", "dropoff_latitude", "dropoff_longitude",
    "passengers", "pickup_datetime", "pickup_latitude", "pickup_longitude", "store_forward", "vendor"
]

Primeiro, você trabalha com os dados dos táxis verdes e os coloca em uma forma válida que possa ser combinada com os dados dos táxis amarelos.You first work with the green taxi data to get it into a valid shape that can be combined with the yellow taxi data. Chame as funções replace_na(), drop_nulls() e keep_columns() usando as variáveis de transformação de atalho criadas.Call the replace_na(), drop_nulls(), and keep_columns() functions by using the shortcut transform variables you created. Além disso, renomeie todas as colunas no quadro de dados para corresponder aos nomes na variável useful_columns.Additionally, rename all the columns in the dataframe to match the names in the useful_columns variable.

green_df = (green_df_raw
    .replace_na(columns=all_columns)
    .drop_nulls(*drop_if_all_null)
    .rename_columns(column_pairs={
        "VendorID": "vendor",
        "lpep_pickup_datetime": "pickup_datetime",
        "Lpep_dropoff_datetime": "dropoff_datetime",
        "lpep_dropoff_datetime": "dropoff_datetime",
        "Store_and_fwd_flag": "store_forward",
        "store_and_fwd_flag": "store_forward",
        "Pickup_longitude": "pickup_longitude",
        "Pickup_latitude": "pickup_latitude",
        "Dropoff_longitude": "dropoff_longitude",
        "Dropoff_latitude": "dropoff_latitude",
        "Passenger_count": "passengers",
        "Fare_amount": "cost",
        "Trip_distance": "distance"
     })
    .keep_columns(columns=useful_columns))
green_df.head(5)
fornecedorvendor pickup_datetimepickup_datetime dropoff_datetimedropoff_datetime store_forwardstore_forward pickup_longitudepickup_longitude pickup_latitudepickup_latitude dropoff_longitudedropoff_longitude dropoff_latitudedropoff_latitude passageirospassengers distânciadistance costcost
00 22 01-08-2013 08:14:372013-08-01 08:14:37 01-08-2013 09:09:062013-08-01 09:09:06 NN 00 00 00 00 11 .00.00 21.2521.25
11 22 01-08-2013 09:13:002013-08-01 09:13:00 01-08-2013 11:38:002013-08-01 11:38:00 NN 00 00 00 00 22 .00.00 74,574.5
22 22 01-08-2013 09:48:002013-08-01 09:48:00 01-08-2013 09:49:002013-08-01 09:49:00 NN 00 00 00 00 11 .00.00 11
33 22 01-08-2013 10:38:352013-08-01 10:38:35 01-08-2013 10:38:512013-08-01 10:38:51 NN 00 00 00 00 11 .00.00 3.253.25
44 22 01-08-2013 11:51:452013-08-01 11:51:45 01-08-2013 12:03:522013-08-01 12:03:52 NN 00 00 00 00 11 .00.00 8.58.5

Execute as mesmas etapas de transformação nos dados dos táxis amarelos.Run the same transformation steps on the yellow taxi data. Essas funções garantem que dados nulos sejam removidos do conjunto de dados, o que ajudará a aumentar a precisão de modelos de machine learning.These functions ensure that null data is removed from the data set, which will help increase machine learning model accuracy.

yellow_df = (yellow_df_raw
    .replace_na(columns=all_columns)
    .drop_nulls(*drop_if_all_null)
    .rename_columns(column_pairs={
        "vendor_name": "vendor",
        "VendorID": "vendor",
        "vendor_id": "vendor",
        "Trip_Pickup_DateTime": "pickup_datetime",
        "tpep_pickup_datetime": "pickup_datetime",
        "Trip_Dropoff_DateTime": "dropoff_datetime",
        "tpep_dropoff_datetime": "dropoff_datetime",
        "store_and_forward": "store_forward",
        "store_and_fwd_flag": "store_forward",
        "Start_Lon": "pickup_longitude",
        "Start_Lat": "pickup_latitude",
        "End_Lon": "dropoff_longitude",
        "End_Lat": "dropoff_latitude",
        "Passenger_Count": "passengers",
        "passenger_count": "passengers",
        "Fare_Amt": "cost",
        "fare_amount": "cost",
        "Trip_Distance": "distance",
        "trip_distance": "distance"
    })
    .keep_columns(columns=useful_columns))
yellow_df.head(5)

Chame a função append_rows() nos dados dos táxis verdes para acrescentar os dados dos táxis amarelos.Call the append_rows() function on the green taxi data to append the yellow taxi data. Um quadro de dados combinado é criado.A new combined dataframe is created.

combined_df = green_df.append_rows([yellow_df])

Converter tipos e filtrarConvert types and filter

Examine as estatísticas de resumo das coordenadas de partida e chegada para ver como os dados estão distribuídos.Examine the pickup and drop-off coordinates summary statistics to see how the data is distributed. Primeiro, defina um objeto TypeConverter para alterar os campos de latitude e longitude para tipo decimal.First, define a TypeConverter object to change the latitude and longitude fields to decimal type. Em seguida, chame a função keep_columns() para restringir a saída para apenas os campos de latitude e longitude e, em seguida, chame a função get_profile().Next, call the keep_columns() function to restrict output to only the latitude and longitude fields, and then call the get_profile() function. Essas chamadas de função criam uma exibição condensada do fluxo de dados para mostrar apenas os campos lat/long, o que torna mais fácil avaliar coordenadas ausentes ou fora do escopo.These function calls create a condensed view of the dataflow to just show the lat/long fields, which makes it easier to evaluate missing or out-of-scope coordinates.

decimal_type = dprep.TypeConverter(data_type=dprep.FieldType.DECIMAL)
combined_df = combined_df.set_column_types(type_conversions={
    "pickup_longitude": decimal_type,
    "pickup_latitude": decimal_type,
    "dropoff_longitude": decimal_type,
    "dropoff_latitude": decimal_type
})
combined_df.keep_columns(columns=[
    "pickup_longitude", "pickup_latitude",
    "dropoff_longitude", "dropoff_latitude"
]).get_profile()
TypeType MinMin maxMax ContagemCount Contagem faltandoMissing Count Sem contagem faltandoNot Missing Count Percentual faltandoPercent missing Contagem de errosError Count Contagem vaziaEmpty count 0,1% quantil0.1% Quantile 1% quantil1% Quantile 5% quantil5% Quantile 25% quantil25% Quantile 50% quantil50% Quantile 75% quantil75% Quantile 95% quantil95% Quantile 99% quantil99% Quantile 99,9% quantil99.9% Quantile Desvio padrãoStandard Deviation MédiaMean
pickup_longitudepickup_longitude FieldType.DECIMALFieldType.DECIMAL -115,179337-115.179337 0,0000000.000000 7722,07722.0 0,00.0 7722,07722.0 0,00.0 0,00.0 0,00.0 -88,114046-88.114046 -73,961840-73.961840 -73,961964-73.961964 -73,947693-73.947693 -73,922097-73.922097 -73,846670-73.846670 0,0000000.000000 0,0000000.000000 0,0000000.000000 18,79267218.792672 -68,833579-68.833579
pickup_latitudepickup_latitude FieldType.DECIMALFieldType.DECIMAL 0,0000000.000000 40,91912140.919121 7722,07722.0 0,00.0 7722,07722.0 0,00.0 0,00.0 0,00.0 0,0000000.000000 40,68288940.682889 40,67554140.675541 40,72107540.721075 40,75615940.756159 40,80390940.803909 40,84940640.849406 40,87068140.870681 40,89124440.891244 10,34596710.345967 37,93674237.936742
dropoff_longitudedropoff_longitude FieldType.DECIMALFieldType.DECIMAL -115,179337-115.179337 0,0000000.000000 7722,07722.0 0,00.0 7722,07722.0 0,00.0 0,00.0 0,00.0 -87,699611-87.699611 -73,984734-73.984734 -73,985777-73.985777 -73,956250-73.956250 -73,928948-73.928948 -73,866208-73.866208 0,0000000.000000 0,0000000.000000 0,0000000.000000 18,69652618.696526 -68,896978-68.896978
dropoff_latitudedropoff_latitude FieldType.DECIMALFieldType.DECIMAL 0,0000000.000000 41,00893441.008934 7722,07722.0 0,00.0 7722,07722.0 0,00.0 0,00.0 0,00.0 0,0000000.000000 40,66276340.662763 40,65485140.654851 40,71782140.717821 40,75653440.756534 40,78468840.784688 40,85243740.852437 40,87928940.879289 40,93729140.937291 10,29078010.290780 37,96377437.963774

Na saída das estatísticas de resumo, você verá que há coordenadas faltando e coordenadas que não estão na Cidade de Nova York (isso é determinado com base na análise subjetiva).From the summary statistics output, you see there are missing coordinates and coordinates that aren't in New York City (this is determined from subjective analysis). Filtre as coordenadas pelos locais que estão fora dos limites da cidade.Filter out coordinates for locations that are outside the city border. Encadeie os comandos no filtro de coluna na função filter() e defina os limites mínimo e máximo de cada campo.Chain the column filter commands within the filter() function and define the minimum and maximum bounds for each field. Em seguida, chame a função get_profile() novamente para verificar a transformação.Then call the get_profile() function again to verify the transformation.

latlong_filtered_df = (combined_df
    .drop_nulls(
        columns=["pickup_longitude", "pickup_latitude", "dropoff_longitude", "dropoff_latitude"],
        column_relationship=dprep.ColumnRelationship(dprep.ColumnRelationship.ANY)
    )
    .filter(dprep.f_and(
        dprep.col("pickup_longitude") <= -73.72,
        dprep.col("pickup_longitude") >= -74.09,
        dprep.col("pickup_latitude") <= 40.88,
        dprep.col("pickup_latitude") >= 40.53,
        dprep.col("dropoff_longitude") <= -73.72,
        dprep.col("dropoff_longitude") >= -74.09,
        dprep.col("dropoff_latitude") <= 40.88,
        dprep.col("dropoff_latitude") >= 40.53
    )))
latlong_filtered_df.keep_columns(columns=[
    "pickup_longitude", "pickup_latitude",
    "dropoff_longitude", "dropoff_latitude"
]).get_profile()
TypeType MinMin maxMax ContagemCount Contagem faltandoMissing Count Sem contagem faltandoNot Missing Count Percentual faltandoPercent missing Contagem de errosError Count Contagem vaziaEmpty count 0,1% quantil0.1% Quantile 1% quantil1% Quantile 5% quantil5% Quantile 25% quantil25% Quantile 50% quantil50% Quantile 75% quantil75% Quantile 95% quantil95% Quantile 99% quantil99% Quantile 99,9% quantil99.9% Quantile Desvio padrãoStandard Deviation MédiaMean
pickup_longitudepickup_longitude FieldType.DECIMALFieldType.DECIMAL -74,078156-74.078156 -73,736481-73.736481 7059,07059.0 0,00.0 7059,07059.0 0,00.0 0,00.0 0,00.0 -74,076314-74.076314 -73,962542-73.962542 -73,962893-73.962893 -73,948975-73.948975 -73,927856-73.927856 -73,866662-73.866662 -73,830438-73.830438 -73,823160-73.823160 -73,769750-73.769750 0,0487110.048711 -73,913865-73.913865
pickup_latitudepickup_latitude FieldType.DECIMALFieldType.DECIMAL 40,57548540.575485 40,87985240.879852 7059,07059.0 0,00.0 7059,07059.0 0,00.0 0,00.0 0,00.0 40,63288440.632884 40,71310540.713105 40,71160040.711600 40,72140340.721403 40,75814240.758142 40,80514540.805145 40,84885540.848855 40,86756740.867567 40,87769040.877690 0,0483480.048348 40,76522640.765226
dropoff_longitudedropoff_longitude FieldType.DECIMALFieldType.DECIMAL -74,085747-74.085747 -73,720871-73.720871 7059,07059.0 0,00.0 7059,07059.0 0,00.0 0,00.0 0,00.0 -74,078828-74.078828 -73,985650-73.985650 -73,985813-73.985813 -73,959041-73.959041 -73,936681-73.936681 -73,884846-73.884846 -73,815507-73.815507 -73,776697-73.776697 -73,733471-73.733471 0,0559610.055961 -73,920718-73.920718
dropoff_latitudedropoff_latitude FieldType.DECIMALFieldType.DECIMAL 40,58353040.583530 40,87973440.879734 7059,07059.0 0,00.0 7059,07059.0 0,00.0 0,00.0 0,00.0 40,59774140.597741 40,69537640.695376 40,69511540.695115 40,72754940.727549 40,75816040.758160 40,78837840.788378 40,85037240.850372 40,86796840.867968 40,87858640.878586 0,0504620.050462 40,75948740.759487

Dividir e renomear colunasSplit and rename columns

Examine o perfil de dados da coluna store_forward.Look at the data profile for the store_forward column. Este campo é um sinalizador booliano que é Y quando o táxi não tem uma conexão com o servidor após a viagem de táxi e, portanto, precisa armazenar os dados da viagem na memória e então encaminhá-los para o servidor quando conectado.This field is a boolean flag that is Y when the taxi did not have a connection to the server after the trip, and thus had to store the trip data in memory, and later forward it to the server when connected.

latlong_filtered_df.keep_columns(columns='store_forward').get_profile()
TypeType MinMin maxMax ContagemCount Contagem faltandoMissing Count Sem contagem faltandoNot Missing Count Percentual faltandoPercent missing Contagem de errosError Count Contagem vaziaEmpty count 0,1% quantil0.1% Quantile 1% quantil1% Quantile 5% quantil5% Quantile 25% quantil25% Quantile 50% quantil50% Quantile 75% quantil75% Quantile 95% quantil95% Quantile 99% quantil99% Quantile 99,9% quantil99.9% Quantile Desvio padrãoStandard Deviation MédiaMean
store_forwardstore_forward FieldType.STRINGFieldType.STRING NN SY 7059,07059.0 99,099.0 6960,06960.0 0,0140250.014025 0,00.0 0,00.0

Observe que a saída do perfil de dados na coluna store_forward mostra que os dados estão inconsistentes e há valores ausentes ou nulos.Notice that the data profile output in the store_forward column shows that the data is inconsistent and there are missing or null values. Use as funções replace() e fill_nulls() para substituir esses valores pela cadeia de caracteres "N":Use the replace() and fill_nulls() functions to replace these values with the string "N":

replaced_stfor_vals_df = latlong_filtered_df.replace(columns="store_forward", find="0", replace_with="N").fill_nulls("store_forward", "N")

Execute a função replace no campo distance.Execute the replace function on the distance field. A função reformata os valores de distância rotulados incorretamente como .00 e preenche os nulos com zeros.The function reformats distance values that are incorrectly labeled as .00, and fills any nulls with zeros. Converta o campo distance em formato numérico.Convert the distance field to numerical format. Esses pontos de dados incorretos provavelmente são anomalias no sistema de coleta de dados nos táxis.These incorrect data points are likely anomalies in the data collection system on the taxi cabs.

replaced_distance_vals_df = replaced_stfor_vals_df.replace(columns="distance", find=".00", replace_with=0).fill_nulls("distance", 0)
replaced_distance_vals_df = replaced_distance_vals_df.to_number(["distance"])

Divida os valores de data e hora de saída e chegada nas respectivas colunas de data e hora.Split the pickup and dropoff datetime values into the respective date and time columns. Use a função split_column_by_example() para fazer a divisão.Use the split_column_by_example() function to make the split. Nesse caso, o parâmetro opcional example da função split_column_by_example() é omitido.In this case, the optional example parameter of the split_column_by_example() function is omitted. Portanto, a função determina automaticamente onde dividir com base nos dados.Therefore, the function automatically determines where to split based on the data.

time_split_df = (replaced_distance_vals_df
    .split_column_by_example(source_column="pickup_datetime")
    .split_column_by_example(source_column="dropoff_datetime"))
time_split_df.head(5)
fornecedorvendor pickup_datetimepickup_datetime pickup_datetime_1pickup_datetime_1 pickup_datetime_2pickup_datetime_2 dropoff_datetimedropoff_datetime dropoff_datetime_1dropoff_datetime_1 dropoff_datetime_2dropoff_datetime_2 store_forwardstore_forward pickup_longitudepickup_longitude pickup_latitudepickup_latitude dropoff_longitudedropoff_longitude dropoff_latitudedropoff_latitude passageirospassengers distânciadistance costcost
00 22 01-08-2013 17:22:002013-08-01 17:22:00 01-08-20132013-08-01 17:22:0017:22:00 01-08-2013 17:22:002013-08-01 17:22:00 01-08-20132013-08-01 17:22:0017:22:00 NN -73,937767-73.937767 40,75848040.758480 -73,937767-73.937767 40,75848040.758480 11 0,00.0 2.52.5
11 22 01-08-2013 17:24:002013-08-01 17:24:00 01-08-20132013-08-01 17:24:0017:24:00 01-08-2013 17:25:002013-08-01 17:25:00 01-08-20132013-08-01 17:25:0017:25:00 NN -73,937927-73.937927 40,75784340.757843 -73,937927-73.937927 40,75784340.757843 11 0,00.0 2.52.5
22 22 06-08-2013 06:51:192013-08-06 06:51:19 06-08-20132013-08-06 06:51:1906:51:19 06-08-2013 06:51:362013-08-06 06:51:36 06-08-20132013-08-06 06:51:3606:51:36 NN -73,937721-73.937721 40,75840440.758404 -73,937721-73.937721 40,75836940.758369 11 0,00.0 3.33.3
33 22 06-08-2013 13:26:342013-08-06 13:26:34 06-08-20132013-08-06 13:26:3413:26:34 06-08-2013 13:26:572013-08-06 13:26:57 06-08-20132013-08-06 13:26:5713:26:57 NN -73,937691-73.937691 40,75841940.758419 -73,937790-73.937790 40,75835840.758358 11 0,00.0 3.33.3
44 22 06-08-2013 13:27:532013-08-06 13:27:53 06-08-20132013-08-06 13:27:5313:27:53 06-08-2013 13:28:082013-08-06 13:28:08 06-08-20132013-08-06 13:28:0813:28:08 NN -73,937805-73.937805 40,75839640.758396 -73,937775-73.937775 40,75845040.758450 11 0,00.0 3.33.3

Renomeie as colunas geradas pela função split_column_by_example() para usar nomes significativos.Rename the columns generated by the split_column_by_example() function to use meaningful names.

renamed_col_df = (time_split_df
    .rename_columns(column_pairs={
        "pickup_datetime_1": "pickup_date",
        "pickup_datetime_2": "pickup_time",
        "dropoff_datetime_1": "dropoff_date",
        "dropoff_datetime_2": "dropoff_time"
    }))
renamed_col_df.head(5)

Chame a função get_profile() para ver as estatísticas de resumo completas após todas as etapas de limpeza.Call the get_profile() function to see the full summary statistics after all cleansing steps.

renamed_col_df.get_profile()

Transformar dadosTransform data

Divida ainda mais a data de saída e chegada em valores de dia da semana, dia do mês e mês.Split the pickup and dropoff date further into the day of the week, day of the month, and month values. Para obter o valor de dia da semana, use a função derive_column_by_example().To get the day of the week value, use the derive_column_by_example() function. A função usa um parâmetro de matriz de objetos de exemplo que define os dados de entrada e a saída desejada.The function takes an array parameter of example objects that define the input data, and the preferred output. A função determina automaticamente sua transformação preferencial.The function automatically determines your preferred transformation. Para as colunas de horário de saída e chegada, divida o horário em hora, minuto e segundo usando a função split_column_by_example() sem nenhum parâmetro de exemplo.For the pickup and dropoff time columns, split the time into the hour, minute, and second by using the split_column_by_example() function with no example parameter.

Depois de gerar os novos recursos, use a função drop_columns() para excluir os campos originais, pois os recursos recém-gerados são preferenciais.After you generate the new features, use the drop_columns() function to delete the original fields as the newly generated features are preferred. Renomeie o restante dos campos para usar descrições significativas.Rename the rest of the fields to use meaningful descriptions.

Transformar os dados dessa maneira para criar novos recursos baseados em tempo melhorará a precisão dos modelos de machine learning.Transforming the data in this way to create new time-based features will improve machine learning model accuracy. Por exemplo, gerar um novo recurso para o dia da semana o ajudará a estabelecer uma relação entre o dia da semana e o preço das tarifas de táxi, que geralmente são mais caras em determinados dias da semana devido à alta demanda.For example, generating a new feature for the weekday will help establish a relationship between the day of the week and the taxi fare price, which is often more expensive on certain days of the week due to high demand.

transformed_features_df = (renamed_col_df
    .derive_column_by_example(
        source_columns="pickup_date",
        new_column_name="pickup_weekday",
        example_data=[("2009-01-04", "Sunday"), ("2013-08-22", "Thursday")]
    )
    .derive_column_by_example(
        source_columns="dropoff_date",
        new_column_name="dropoff_weekday",
        example_data=[("2013-08-22", "Thursday"), ("2013-11-03", "Sunday")]
    )

    .split_column_by_example(source_column="pickup_time")
    .split_column_by_example(source_column="dropoff_time")
    # The following two calls to split_column_by_example reference the column names generated from the previous two calls.
    .split_column_by_example(source_column="pickup_time_1")
    .split_column_by_example(source_column="dropoff_time_1")
    .drop_columns(columns=[
        "pickup_date", "pickup_time", "dropoff_date", "dropoff_time",
        "pickup_date_1", "dropoff_date_1", "pickup_time_1", "dropoff_time_1"
    ])

    .rename_columns(column_pairs={
        "pickup_date_2": "pickup_month",
        "pickup_date_3": "pickup_monthday",
        "pickup_time_1_1": "pickup_hour",
        "pickup_time_1_2": "pickup_minute",
        "pickup_time_2": "pickup_second",
        "dropoff_date_2": "dropoff_month",
        "dropoff_date_3": "dropoff_monthday",
        "dropoff_time_1_1": "dropoff_hour",
        "dropoff_time_1_2": "dropoff_minute",
        "dropoff_time_2": "dropoff_second"
    }))

transformed_features_df.head(5)
fornecedorvendor pickup_datetimepickup_datetime pickup_weekdaypickup_weekday pickup_hourpickup_hour pickup_minutepickup_minute pickup_secondpickup_second dropoff_datetimedropoff_datetime dropoff_weekdaydropoff_weekday dropoff_hourdropoff_hour dropoff_minutedropoff_minute dropoff_seconddropoff_second store_forwardstore_forward pickup_longitudepickup_longitude pickup_latitudepickup_latitude dropoff_longitudedropoff_longitude dropoff_latitudedropoff_latitude passageirospassengers distânciadistance costcost
00 22 01-08-2013 17:22:002013-08-01 17:22:00 Quinta-feiraThursday 1717 2222 0000 01-08-2013 17:22:002013-08-01 17:22:00 Quinta-feiraThursday 1717 2222 0000 NN -73,937767-73.937767 40,75848040.758480 -73,937767-73.937767 40,75848040.758480 11 0,00.0 2.52.5
11 22 01-08-2013 17:24:002013-08-01 17:24:00 Quinta-feiraThursday 1717 2424 0000 01-08-2013 17:25:002013-08-01 17:25:00 Quinta-feiraThursday 1717 2525 0000 NN -73,937927-73.937927 40,75784340.757843 -73,937927-73.937927 40,75784340.757843 11 0,00.0 2.52.5
22 22 06-08-2013 06:51:192013-08-06 06:51:19 Terça-feiraTuesday 0606 5151 1919 06-08-2013 06:51:362013-08-06 06:51:36 Terça-feiraTuesday 0606 5151 3636 NN -73,937721-73.937721 40,75840440.758404 -73,937721-73.937721 40,75836940.758369 11 0,00.0 3.33.3
33 22 06-08-2013 13:26:342013-08-06 13:26:34 Terça-feiraTuesday 1313 2626 3434 06-08-2013 13:26:572013-08-06 13:26:57 Terça-feiraTuesday 1313 2626 5757 NN -73,937691-73.937691 40,75841940.758419 -73,937790-73.937790 40,75835840.758358 11 0,00.0 3.33.3
44 22 06-08-2013 13:27:532013-08-06 13:27:53 Terça-feiraTuesday 1313 2727 5353 06-08-2013 13:28:082013-08-06 13:28:08 Terça-feiraTuesday 1313 2828 0808 NN -73,937805-73.937805 40,75839640.758396 -73,937775-73.937775 40,75845040.758450 11 0,00.0 3.33.3

Observe que os dados mostram que os componentes de data e hora de saída e chegada produzidos pelas transformações derivadas estão corretos.Notice that the data shows that the pickup and dropoff date and time components produced from the derived transformations are correct. Remova as colunas pickup_datetime e dropoff_datetime porque elas são não mais necessárias (recursos de tempo granulares, como hora, minuto e segundo, são mais úteis para treinamento de modelo).Drop the pickup_datetime and dropoff_datetime columns because they're no longer needed (granular time features like hour, minute and second are more useful for model training).

processed_df = transformed_features_df.drop_columns(columns=["pickup_datetime", "dropoff_datetime"])

Use a funcionalidade de inferência de tipo para verificar automaticamente o tipo de dados de cada campo e exibir os resultados de inferência.Use the type inference functionality to automatically check the data type of each field, and display the inference results.

type_infer = processed_df.builders.set_column_types()
type_infer.learn()
type_infer

A saída resultante de type_infer é como segue.The resulting output of type_infer is as follows.

Column types conversion candidates:
'pickup_weekday': [FieldType.STRING],
'pickup_hour': [FieldType.DECIMAL],
'pickup_minute': [FieldType.DECIMAL],
'pickup_second': [FieldType.DECIMAL],
'dropoff_hour': [FieldType.DECIMAL],
'dropoff_minute': [FieldType.DECIMAL],
'dropoff_second': [FieldType.DECIMAL],
'store_forward': [FieldType.STRING],
'pickup_longitude': [FieldType.DECIMAL],
'dropoff_longitude': [FieldType.DECIMAL],
'passengers': [FieldType.DECIMAL],
'distance': [FieldType.DECIMAL],
'vendor': [FieldType.STRING],
'dropoff_weekday': [FieldType.STRING],
'pickup_latitude': [FieldType.DECIMAL],
'dropoff_latitude': [FieldType.DECIMAL],
'cost': [FieldType.DECIMAL]

Os resultados de inferência parecem estar corretos com base nos dados.The inference results look correct based on the data. Agora, aplique as conversões de tipo ao fluxo de dados.Now apply the type conversions to the dataflow.

type_converted_df = type_infer.to_dataflow()
type_converted_df.get_profile()

Antes de compactar o fluxo de dados, execute os dois filtros finais no conjunto de dados.Before you package the dataflow, run two final filters on the data set. Para eliminar os pontos de dados capturados incorretamente, filtre o fluxo de dados pelos registros em que os valores das variáveis cost e distance são maiores que zero.To eliminate incorrectly captured data points, filter the dataflow on records where both the cost and distance variable values are greater than zero. Esta etapa vai aprimorar significativamente a precisão do modelo de machine learning porque pontos de dados com um custo ou distância zero representam os principais desvios que prejudicam a precisão da previsão.This step will significantly improve machine learning model accuracy, because data points with a zero cost or distance represent major outliers that throw off prediction accuracy.

final_df = type_converted_df.filter(dprep.col("distance") > 0)
final_df = final_df.filter(dprep.col("cost") > 0)

Agora você tem um objeto de fluxo de dados totalmente transformado e preparado para ser usado em um modelo de machine learning.You now have a fully transformed and prepared dataflow object to use in a machine learning model. O SDK inclui a funcionalidade de serialização de objeto, que é usada como mostrado no código a seguir.The SDK includes object serialization functionality, which is used as shown in the following code.

import os

file_path = os.path.join(os.getcwd(), "dflows.dprep")
package = dprep.Package([final_df])
package.save(file_path)

Limpar recursosClean up resources

Para continuar com a segunda parte do tutorial, você precisará do arquivo dflows.dprep no diretório atual.To continue with part two of the tutorial, you need the dflows.dprep file in the current directory.

Se você não planeja continuar com a parte dois, exclua o arquivo dflows.dprep do diretório atual.If you don't plan to continue to part two, delete the dflows.dprep file in your current directory. Exclua este arquivo se você estiver executando a execução localmente ou no Azure Notebooks.Delete this file whether you're running the execution locally or in Azure Notebooks.

Próximas etapasNext steps

Na primeira parte deste tutorial, você acabou de:In part one of this tutorial, you:

  • Configurar seu ambiente de desenvolvimento.Set up your development environment.
  • Carregar e limpar conjuntos de dados.Loaded and cleansed data sets.
  • Usar transformações inteligentes para prever a lógica com base em um exemplo.Used smart transforms to predict your logic based on an example.
  • Mesclou e empacotou conjuntos de dados para treinamento de aprendizado de máquina.Merged and packaged datasets for machine learning training.

Você está pronto para usar os dados de treinamento na segunda parte do tutorial:You're ready to use the training data in part two of the tutorial: