Краткое руководство. Использование структур данных и объектов при работе с Python и машинным обучением SQL

Применимо к: SQL Server 2017 (14.x) и более поздних Управляемый экземпляр SQL Azure

В этом кратком руководстве вы узнаете, как использовать структуры и типы данных при применении Python в Службах машинного обучения SQL Server, Службах машинного обучения управляемого экземпляра Azure SQL или Кластерах больших данных. Вы узнаете о том, как перемещать данные между Python и SQL Server, и о типичных проблемах, возникающих при этом.

В машинном обучении SQL в качестве основы используется пакет Python pandas, который отлично подходит для работы с табличными данными. Однако нельзя просто передать скалярное значение из Python в вашу базу данных и ждать, что это просто сработает. В этом кратком руководстве вы вспомните некоторые базовые определения типов данных, чтобы подготовиться к решению дополнительных проблем, с которыми вы можете столкнуться при передаче табличных данных между Python и базой данных.

Основные понятия, которые необходимо знать:

  • Кадр данных — это таблица с несколькими столбцами.
  • Кадр данных с одним столбцом — объект в виде списка, называемый рядом.
  • Одно значение кадра данных называется ячейкой, доступ к ней осуществляется по индексу.

Как можно предоставить единственный результат вычисления в виде кадра данных, если для объекта data.frame требуется табличная структура? Одним из ответов является представление одного скалярного значения в виде ряда, который легко преобразовать в кадр данных.

Примечание

При возврате дат Python в SQL использует тип DATETIME, который имеет ограниченный диапазон дат от 1753-01-01 (-53690) до 9999-12-31 (2958463).

Предварительные требования

Для работы с этим кратким руководством необходимо следующее.

Скалярное значение в виде ряда

В этом примере выполняется некоторые простые математические операции и преобразуется скаляр в ряд.

  1. Для ряда требуется индекс, который можно назначить вручную, как показано здесь, или программным способом.

    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)
    '
    

    Поскольку ряд не был преобразован в объект data.frame, значения возвращаются в окне сообщения, но можно увидеть, что результаты больше напоминают табличный формат.

    Результаты

    STDOUT message(s) from external script: 
    0.5
    simple math example 1    0.5
    dtype: float64
    
  2. Чтобы увеличить длину ряда, можно добавить новые значения с использованием массива.

    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)
    '
    

    Если индекс не указан, создается индекс со значениями, начиная с 0 и заканчивая длиной массива.

    Результаты

    STDOUT message(s) from external script:
    0    0.5
    1    2.0
    dtype: float64
    
  3. Если увеличить число индексных значений, но не добавить новые данные, значения данных будут повторяться для заполнения ряда.

    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)
    '
    

    Результаты

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

Преобразование рядя в кадр данных

После преобразования скалярных математических результатов в табличную структуру все еще необходимо преобразовать их в формат, который может обрабатывать машинное обучение SQL.

  1. Чтобы преобразовать ряд в объект data.frame, вызовите метод DataFrame библиотеки 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))
    

    Результат показан ниже. Даже если вы используете индекс для получения конкретных значений из data.frame, значения индекса не являются частью выходных данных.

    Результаты

    ResultValue
    0,5
    2

Вывод данных в data.frame

Теперь мы выведем определенные значения из двух рядов математических результатов в объект data.frame. Первый имеет индекс с последовательными значениями, созданными Python. Во втором используется произвольный индекс строковых значений.

  1. В следующем примере возвращается значение из ряда с помощью целочисленного индекса.

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

    Результаты

    ResultValue
    2.0

    Помните, что автоматически созданный индекс начинается с 0. Попробуйте использовать значение индекса вне допустимого диапазона и посмотрите, что произойдет.

  2. Теперь получим одно значение из другого кадра данных, используя строковый индекс.

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

    Результаты

    ResultValue
    0,5

    При попытке использовать числовой индекс для получения значения из этого ряда появляется сообщение об ошибке.

Дальнейшие действия

Дополнительные сведения о написании расширенных функций Python с использованием машинного обучения SQL см. в этом кратком руководстве: