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 pacote de preparação de dados do SDK do Azure Machine Learning.In this tutorial, you learn how to prepare data for regression modeling by using the data prep package from the Azure Machine Learning SDK. Você executa várias transformações para filtrar e combinar dois conjuntos diferentes de dados de táxi de NYC.You run various transformations to filter and combine two different NYC taxi data sets.

Este tutorial é a primeira parte de uma série composta por duas partes.This tutorial is part one of a two-part tutorial series. Depois de concluir a série de tutoriais, você pode prever o custo de uma viagem 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 de 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:In this tutorial, you:

  • Configure um ambiente Python e importe pacotes.Set up a Python environment and import packages.
  • Carregue dois conjuntos de valores com nomes de campo diferentes.Load two datasets with different field names.
  • Limpar dados para remover anomalias.Cleanse data to remove anomalies.
  • Transforme dados usando transformações inteligentes para criar novos recursos.Transform data by using intelligent transforms to create new features.
  • Salve o objeto Dataflow para usar em um modelo de regressão.Save your dataflow object to use in a regression model.

Pré-requisitosPrerequisites

  • Conclua o tutorial: Comece a criar seu primeiro experimento de ml para:Complete the Tutorial: Get started creating your first ML experiment to:

    • Criar uma área de trabalhoCreate a workspace
    • Criar um servidor de notebook de nuvemCreate a cloud notebook server
    • Iniciar o painel do bloco de anotações do JupyterLaunch the Jupyter notebook dashboard
  • Depois de iniciar o painel do notebook Jupyter, abra o bloco de anotações tutoriais/regression-part1-data-Prep. ipynb .After you launch the Jupyter notebook dashboard, open the tutorials/regression-part1-data-prep.ipynb notebook.

Este tutorial também está disponível no GitHub se você quiser usá-lo em seu próprio ambiente local.This tutorial is also available on GitHub if you wish to use it on your own local environment. Verifique se você instalou o azureml-dataprep pacote do SDK do Azure Machine Learning.Make sure you have installed the azureml-dataprep package from the Azure Machine Learning SDK.

Configurar seu ambiente de desenvolvimentoSet up your development environment

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

  • Instalar o SDKInstall the SDK
  • Importação de pacotes PythonImport Python packages

Instalar e importar pacotesInstall and import packages

Use o seguinte 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[pandas]>=1.1.0,<1.2.0"

Importe o pacote.Import the package.

import azureml.dataprep as dprep

Importante

Certifique-se de instalar a versão mais recente do pacote azureml. dataprep.Ensure you install the latest azureml.dataprep package version. Este tutorial não funcionará com o número de versão inferior ao 1.1.0This tutorial will not work with version number lower than 1.1.0

Carregar dadosLoad data

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

from IPython.display import display

green_path = "https://dprepdata.blob.core.windows.net/demo/green-small/*"
yellow_path = "https://dprepdata.blob.core.windows.net/demo/yellow-small/*"

# (optional) Download and view a subset of the data: https://dprepdata.blob.core.windows.net/demo/green-small/green_tripdata_2013-08.csv

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 Dataflow objeto é 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 da adição de uma operação a Dataflow um é sempre um Dataflow novo objeto.The result of adding an operation to a Dataflow is always a new Dataflow object.

Limpar dadosCleanse data

Agora, você preenche algumas variáveis com transformações de atalho para aplicar a todos os fluxos de fluxo de os.Now you populate some variables with shortcut transforms to apply to all dataflows. A drop_if_all_null variável é usada para excluir registros onde todos os campos são nulos.The drop_if_all_null variable is used to delete records where all fields are null. A useful_columns variável contém uma matriz de descrições de coluna que são mantidas em cada Dataflow.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 de táxis verdes para colocá-los em uma forma válida que pode ser combinada com os dados de 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 replace_na()funções drop_nulls(), e keep_columns() usando as variáveis de transformação de atalho que você criou.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 dataframe para corresponder aos nomes useful_columns na variável.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))
display(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 custocost
00 22 2013-08-01 08:14:372013-08-01 08:14:37 2013-08-01 09:09:062013-08-01 09:09:06 NN 00 00 00 00 11 ,00.00 21.2521.25
11 22 2013-08-01 09:00 13:2013-08-01 09:13:00 2013-08-01 38: UTC+11:002013-08-01 11:38:00 NN 00 00 00 00 22 ,00.00 74.574.5
22 22 2013-08-01 09:00 48:2013-08-01 09:48:00 2013-08-01 09:00 49:2013-08-01 09:49:00 NN 00 00 00 00 11 ,00.00 11
33 22 2013-08-01 10:38:352013-08-01 10:38:35 2013-08-01 10:38:512013-08-01 10:38:51 NN 00 00 00 00 11 ,00.00 3.253.25
44 22 2013-08-01 11:51:452013-08-01 11:51:45 2013-08-01 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 de táxi amarelo.Run the same transformation steps on the yellow taxi data. Essas funções garantem que os dados nulos sejam removidos do conjunto de dados, o que ajudará a aumentar a precisão do modelo de aprendizado de máquina.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))
display(yellow_df.head(5))

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

combined_df = green_df.append_rows([yellow_df])

Converter tipos e filtroConvert types and filter

Examine a recolha e entrega coordena as estatísticas de resumo para ver como os dados são distribuídos.Examine the pickup and drop-off coordinates summary statistics to see how the data is distributed. Primeiro, defina um TypeConverter objeto para alterar os campos de latitude e longitude para o tipo decimal.First, define a TypeConverter object to change the latitude and longitude fields to decimal type. Em seguida, chame keep_columns() a função para restringir a saída somente aos campos de latitude e longitude e, em seguida get_profile() , chame a função.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 Dataflow para apenas mostrar os campos lat/long, o que torna mais fácil avaliar as coordenadas ausente 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 Mín.Min Máx.Max ContagemCount Contagem de em faltaMissing Count Não tem em falta contagemNot Missing Count Percentagem em faltaPercent missing Contagem de errosError Count Contagem de vaziaEmpty count 0,1% Quantile0.1% Quantile 1% Quantile1% Quantile 5% Quantile5% Quantile 25% Quantile25% Quantile 50% Quantile50% Quantile 75% Quantile75% Quantile 95% Quantile95% Quantile 99% Quantile99% Quantile 99,9% Quantile99.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 de estatísticas de resumo, você vê que há coordenadas e coordenadas ausentes que não estão na cidade de Nova York (isso é determinado pela 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). Filtrar coordenadas de locais que estão fora da borda da cidade.Filter out coordinates for locations that are outside the city border. Encadear os comandos de filtro de filter() coluna dentro da função e definir os limites mínimo e máximo para cada campo.Chain the column filter commands within the filter() function and define the minimum and maximum bounds for each field. Em seguida, get_profile() chame a função 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 Mín.Min Máx.Max ContagemCount Contagem de em faltaMissing Count Não tem em falta contagemNot Missing Count Percentagem em faltaPercent missing Contagem de errosError Count Contagem de vaziaEmpty count 0,1% Quantile0.1% Quantile 1% Quantile1% Quantile 5% Quantile5% Quantile 25% Quantile25% Quantile 50% Quantile50% Quantile 75% Quantile75% Quantile 95% Quantile95% Quantile 99% Quantile99% Quantile 99,9% Quantile99.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 mudar o nome de colunasSplit and rename columns

Examinar o perfil de dados para o store_forward coluna.Look at the data profile for the store_forward column. Esse campo é um sinalizador booliano que Y ocorre quando o táxi não tem uma conexão com o servidor após a viagem e, portanto, precisou armazenar os dados de viagem na memória e, posteriormente, encaminhá-los ao 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 Mín.Min Máx.Max ContagemCount Contagem de em faltaMissing Count Não tem em falta contagemNot Missing Count Percentagem em faltaPercent missing Contagem de errosError Count Contagem de vaziaEmpty count 0,1% Quantile0.1% Quantile 1% Quantile1% Quantile 5% Quantile5% Quantile 25% Quantile25% Quantile 50% Quantile50% Quantile 75% Quantile75% Quantile 95% Quantile95% Quantile 99% Quantile99% Quantile 99,9% Quantile99.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 store_forward na coluna mostra que os dados estão inconsistentes e que 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 replace() funções fill_nulls() e 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 replace função distance no campo.Execute the replace function on the distance field. A função reformata valores de distância que são rotulados incorretamente como .00e preenche quaisquer nulos com zeros.The function reformats distance values that are incorrectly labeled as .00, and fills any nulls with zeros. Converter o distance campo para um formato numérico.Convert the distance field to numerical format. Esses pontos de dados incorretos são provavelmente anomalias no sistema de coleta de dados no táxi de táxi.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 recebimento e chegada nas respectivas colunas Date e time.Split the pickup and dropoff datetime values into the respective date and time columns. Use a split_column_by_example() função para fazer a divisão.Use the split_column_by_example() function to make the split. Nesse caso, o parâmetro opcional example split_column_by_example() da função é 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 custocost
00 22 2013-08-01 17: 22:002013-08-01 17:22:00 2013-08-012013-08-01 17: 22:0017:22:00 2013-08-01 17: 22:002013-08-01 17:22:00 2013-08-012013-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 2013-08-01 17:24:002013-08-01 17:24:00 2013-08-012013-08-01 17:24:0017:24:00 2013-08-01 17:25:002013-08-01 17:25:00 2013-08-012013-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 2013-08-06 06:51:192013-08-06 06:51:19 2013-08-062013-08-06 06:51:1906:51:19 2013-08-06 06:51:362013-08-06 06:51:36 2013-08-062013-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 2013-08-06 13:26:342013-08-06 13:26:34 2013-08-062013-08-06 13:26:3413:26:34 2013-08-06 13:26:572013-08-06 13:26:57 2013-08-062013-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 2013-08-06 13:27:532013-08-06 13:27:53 2013-08-062013-08-06 13:27:5313:27:53 2013-08-06 13:28:082013-08-06 13:28:08 2013-08-062013-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 split_column_by_example() função 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 get_profile() função 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 o recebimento e a data de chegada mais no dia da semana, no dia do mês e nos valores de 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 dia do valor da semana, use a derive_column_by_example() função.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 definem os dados de entrada e a saída preferida.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 preferida.The function automatically determines your preferred transformation. Para as colunas de tempo de retirada e chegada, divida a hora em hora, minuto e segundo usando a split_column_by_example() função 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 drop_columns() função para excluir os campos originais, já que os recursos gerados recentemente são preferidos.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.

A transformação dos dados dessa maneira para criar novos recursos baseados em tempo melhorará a precisão do modelo de aprendizado de máquina.Transforming the data in this way to create new time-based features will improve machine learning model accuracy. Por exemplo, a geração de um novo recurso para o dia da semana ajudará a estabelecer uma relação entre o dia da semana e o preço de táxi, que geralmente é mais caro 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 custocost
00 22 2013-08-01 17: 22:002013-08-01 17:22:00 Quinta-feiraThursday 1717 2222 0000 2013-08-01 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 2013-08-01 17:24:002013-08-01 17:24:00 Quinta-feiraThursday 1717 2424 0000 2013-08-01 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 2013-08-06 06:51:192013-08-06 06:51:19 Terça-feiraTuesday 0606 5151 1919 2013-08-06 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 2013-08-06 13:26:342013-08-06 13:26:34 Terça-feiraTuesday 1313 2626 3434 2013-08-06 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 2013-08-06 13:27:532013-08-06 13:27:53 Terça-feiraTuesday 1313 2727 5353 2013-08-06 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 retirada e chegada produzidos a partir das 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. Descarte as pickup_datetime colunas dropoff_datetime e porque elas não são mais necessárias (recursos de tempo granular, como hora, minuto e segundo, são mais úteis para o treinamento do 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"])

Utilize a funcionalidade de inferência de tipo para verificar automaticamente o tipo de dados de cada campo e exibir os resultados de inferência de tipos.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 do type_infer é a seguinte.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 da inferência parecem corretos com base nos dados.The inference results look correct based on the data. Agora, aplique as conversões de tipo ao Dataflow.Now apply the type conversions to the dataflow.

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

Antes de empacotar o Dataflow, execute dois filtros finais no conjunto de dados.Before you package the dataflow, run two final filters on the data set. Para eliminar pontos de dados capturados incorretamente, filtre o Dataflow nos registros em cost que distance os valores de variável e sejam 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 melhorará significativamente a precisão do modelo de aprendizado de máquina, pois os pontos de dados com um custo ou distância zero representam as principais exceções que lançam 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 Dataflow totalmente transformado e preparado para usar em um modelo de aprendizado de máquina.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 conforme 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")
final_df.save(file_path)

Limpar recursosClean up resources

Para continuar com a parte dois do tutorial, você precisa 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 para a parte dois, exclua o arquivo dflows. dprep no diretório atual.If you don't plan to continue to part two, delete the dflows.dprep file in your current directory. Exclua esse arquivo se você estiver executando a execução localmente ou em Azure notebooks.Delete this file whether you're running the execution locally or in Azure Notebooks.

Passos SeguintesNext steps

Na primeira parte deste tutorial,:In part one of this tutorial, you:

  • Configure seu ambiente de desenvolvimento.Set up your development environment.
  • Conjuntos de dados carregados e limpos.Loaded and cleansed data sets.
  • Transformações inteligentes usadas para prever sua lógica com base em um exemplo.Used smart transforms to predict your logic based on an example.
  • Conjuntos de valores mesclados e empacotados para o treinamento do Machine Learning.Merged and packaged datasets for machine learning training.

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