Udostępnij za pomocą


Szybki start: struktury danych i obiekty korzystające z języka Python z uczeniem maszynowym SQL

Dotyczy: SQL Server 2017 (14.x) i nowsze wersje usługi Azure SQL Managed Instance

W tym przewodniku Szybki start dowiesz się, jak używać struktur danych i typów danych podczas korzystania z języka Python w usługach SQL Server Machine Learning Services, usługach Azure SQL Managed Instance Machine Learning Services lub w klastrach danych big data programu SQL Server. Dowiesz się więcej o przenoszeniu danych między językiem Python i programem SQL Server oraz o typowych problemach, które mogą wystąpić.

Uczenie maszynowe SQL opiera się na pakiecie pandas języka Python, który doskonale nadaje się do pracy z danymi tabelarycznymi. Nie można jednak przekazać wartości skalarnej w Pythonie do bazy danych i oczekiwać, że po prostu będzie działać. W tym przewodniku Szybki start zapoznasz się z kilkoma podstawowymi definicjami struktury danych, aby przygotować się do dodatkowych problemów, które można napotkać podczas przekazywania danych tabelarycznych między językiem Python i bazą danych.

Pojęcia, które należy znać z góry, obejmują:

  • Ramka danych to tabela z wieloma kolumnami.
  • Pojedyncza kolumna ramki danych jest obiektem przypominającym listę nazywanym serią.
  • Pojedyncza wartość ramki danych jest nazywana komórką i jest uzyskiwana przez indeks.

Jak uwidocznić pojedynczy wynik obliczenia jako ramkę danych, jeśli ramka data.frame wymaga struktury tabelarycznej? Jedną z odpowiedzi jest reprezentowanie pojedynczej wartości skalarnej jako serii, która jest łatwo konwertowana na ramkę danych.

Uwaga / Notatka

Podczas zwracania dat język Python w języku SQL używa daty DATETIME z ograniczonym zakresem dat 1753-01-01(-53690) do 9999-12-31(2958463).

Wymagania wstępne

Aby uruchomić szybki start, potrzebne są następujące prerekwizyty.

Wartość skalarna jako seria

W tym przykładzie wykonuje proste działania matematyczne i przekształca skalar na serię.

  1. Seria wymaga indeksu, który można przypisać ręcznie, jak pokazano tutaj lub programowo.

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

    Ponieważ seria nie została przekonwertowana na ramkę data.frame, wartości są zwracane w oknie Komunikaty, ale widać, że wyniki są w bardziej tabelarycznym formacie.

    Results

    STDOUT message(s) from external script: 
    0.5
    simple math example 1    0.5
    dtype: float64
    
  2. Aby zwiększyć długość serii, możesz dodać nowe wartości przy użyciu tablicy.

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

    Jeśli nie określisz indeksu, zostanie wygenerowany indeks zawierający wartości zaczynające się od 0 i kończący się długością tablicy.

    Results

    STDOUT message(s) from external script:
    0    0.5
    1    2.0
    dtype: float64
    
  3. Jeśli zwiększysz liczbę wartości indeksu , ale nie dodasz nowych wartości danych , wartości danych będą powtarzane w celu wypełnienia serii.

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

    Results

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

Konwertowanie serii na ramkę danych

Po przekonwertowaniu wyników matematycznych skalarnych na strukturę tabelarycznej nadal trzeba je przekonwertować na format, który może obsłużyć uczenie maszynowe SQL.

  1. Aby przekonwertować serię na element data.frame, wywołaj metodę pandas DataFrame .

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

    Poniżej przedstawiono wynik. Nawet jeśli używasz indeksu do pobierania określonych wartości z elementu data.frame, wartości indeksu nie są częścią danych wyjściowych.

    Results

    ResultValue
    0,5
    2

Wyprowadź wartości do obiektu data.frame

Teraz wyświetlisz określone wartości z dwóch serii wyników matematycznych w ramce data.frame. Pierwszy zawiera indeks wartości sekwencyjnych generowanych przez język Python. Drugi używa dowolnego indeksu wartości ciągu.

  1. Poniższy przykład pobiera wartość z serii przy użyciu indeksu całkowitego.

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

    Results

    ResultValue
    2.0

    Pamiętaj, że indeks generowany automatycznie zaczyna się od 0. Spróbuj użyć wartości indeksu poza zakresem i zobacz, co się stanie.

  2. Teraz pobierz pojedynczą wartość z innej ramki danych przy użyciu indeksu ciągu.

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

    Results

    ResultValue
    0,5

    Jeśli spróbujesz użyć indeksu liczbowego, aby uzyskać wartość z tej serii, wystąpi błąd.

Dalsze kroki

Aby dowiedzieć się więcej na temat pisania zaawansowanych funkcji języka Python przy użyciu uczenia maszynowego SQL, wykonaj czynności opisane w tym przewodniku Szybki start: