Início Rápido: Estruturas de dados e objetos usando o Python com o machine learning do SQL

Aplica-se a: SQL Server 2017 (14.x) e versões posteriores Instância Gerenciada de SQL do Azure

Neste início rápido, você aprenderá a usar estruturas e tipos de dados ao usar Python nos Serviços de Machine Learning do SQL Server, nos Serviços de Machine Learning da Instância Gerenciada de SQL do Azure ou nos Clusters de Big Data do SQL Server. Você aprenderá como mover dados entre o Python e o SQL Server e os problemas comuns que podem ocorrer.

O machine learning do SQL se baseia no pacote Pandas do Python, que é ótimo para trabalhar usando dados tabulares. No entanto, você não pode passar um escalar do Python para o seu banco de dados e esperar que ele simplesmente funcione. Neste início rápido, você examinará algumas definições básicas de estrutura de dados, a fim de se preparar para problemas adicionais que pode enfrentar ao passar dados tabulares entre o Python e o banco de dados.

Os conceitos que se deve conhecer de antemão incluem:

  • Uma estrutura de dados é uma tabela com várias colunas.
  • Uma coluna única de uma estrutura de dados é um objeto semelhante a uma lista, chamado série.
  • Um valor único de uma estrutura de dados é chamado de célula e é acessado pelo índice.

Como você faria para expor o único resultado de um cálculo como uma estrutura de dados, se uma variável data.frame exigisse uma estrutura de tabela? Uma resposta possível é representar o valor escalar único como uma série, que pode ser convertida facilmente em uma estrutura de dados.

Observação

Ao retornar datas, o Python no SQL usa DATETIME, que tem um intervalo de datas restrito de 1753-01-01(-53690) a 9999-12-31 (2958463).

Pré-requisitos

Para executar este início rápido, você precisará dos pré-requisitos a seguir.

Valor escalar como uma série

Este exemplo usa um pouco de matemática simples e converte um escalar em uma série.

  1. Uma série requer um índice, que pode ser atribuído manualmente por você, conforme mostrado aqui, bem como programaticamente.

    EXECUTE sp_execute_external_script @language = N'Python'
        , @script = N'
    a = 1
    b = 2
    c = a/b
    print(c)
    s = pandas.Series(c, index =["simple math example 1"])
    print(s)
    '
    

    Já que a série não foi convertida em uma data.frame, os valores são retornados na janela mensagens, mas você pode ver que os resultados estão em um formato mais tabular.

    Resultados

    STDOUT message(s) from external script: 
    0.5
    simple math example 1    0.5
    dtype: float64
    
  2. Para aumentar o tamanho da série, você pode adicionar novos valores usando uma matriz.

    EXECUTE sp_execute_external_script @language = N'Python'
        , @script = N'
    a = 1
    b = 2
    c = a/b
    d = a*b
    s = pandas.Series([c,d])
    print(s)
    '
    

    Caso você não especifique um índice, um será gerado, com valores começando com 0 e terminando com o tamanho da matriz.

    Resultados

    STDOUT message(s) from external script:
    0    0.5
    1    2.0
    dtype: float64
    
  3. Se você aumentar o número de valores de índice mas não adicionar novos valores de dados, os valores de dados serão repetidos para preencher a série.

    EXECUTE sp_execute_external_script @language = N'Python'
        , @script = N'
    a = 1
    b = 2
    c = a/b
    s = pandas.Series(c, index =["simple math example 1", "simple math example 2"])
    print(s)
    '
    

    Resultados

    STDOUT message(s) from external script:
    0.5
    simple math example 1    0.5
    simple math example 2    0.5
    dtype: float64
    

Converter série em estrutura de dados

Depois de converter os resultados de matemática escalar em uma estrutura de tabela, você ainda precisa convertê-los em um formato que o machine learning do SQL possa manipular.

  1. Para converter uma série em um data.frame, chame o método DataFrame do Pandas.

    EXECUTE sp_execute_external_script @language = N'Python'
        , @script = N'
    import pandas as pd
    a = 1
    b = 2
    c = a/b
    d = a*b
    s = pandas.Series([c,d])
    print(s)
    df = pd.DataFrame(s)
    OutputDataSet = df
    '
    WITH RESULT SETS((ResultValue FLOAT))
    

    O resultado é mostrado abaixo. Mesmo que você use o índice para obter valores específicos do data.frame, os valores de índice não fazem parte da saída.

    Resultados

    ResultValue
    0.5
    2

Valores de saída em data.frame

Agora, você produzirá valores específicos de duas séries de resultados matemáticos em um data.frame. A primeira tem um índice de valores sequenciais gerados pelo Python. A segunda usa um índice arbitrário de valores de cadeia de caracteres.

  1. O exemplo a seguir obtém um valor da série usando um índice de número inteiro.

    EXECUTE sp_execute_external_script @language = N'Python'
        , @script = N'
    import pandas as pd
    a = 1
    b = 2
    c = a/b
    d = a*b
    s = pandas.Series([c,d])
    print(s)
    df = pd.DataFrame(s, index=[1])
    OutputDataSet = df
    '
    WITH RESULT SETS((ResultValue FLOAT))
    

    Resultados

    ResultValue
    2,0

    Lembre-se de que o índice gerado automaticamente começa em 0. Tente usar um valor de índice fora do intervalo e veja o que acontece.

  2. Agora, obtenha um único valor da outra estrutura de dados usando um índice de cadeia de caracteres.

    EXECUTE sp_execute_external_script @language = N'Python'
        , @script = N'
    import pandas as pd
    a = 1
    b = 2
    c = a/b
    s = pandas.Series(c, index =["simple math example 1", "simple math example 2"])
    print(s)
    df = pd.DataFrame(s, index=["simple math example 1"])
    OutputDataSet = df
    '
    WITH RESULT SETS((ResultValue FLOAT))
    

    Resultados

    ResultValue
    0.5

    Se você tentar usar um índice numérico para obter um valor dessa série, obterá um erro.

Próximas etapas

Para saber mais sobre como escrever funções avançadas do Python com o machine learning do SQL, siga este início rápido: