Sdílet prostřednictvím


Kurz Pythonu: Zkoumání a vizualizace dat

Platí pro: SQL Server 2017 (14.x) a novější verze Azure SQL Managed Instance

Ve druhé části této pětidílné série kurzů prozkoumáte ukázková data a vygenerujete několik grafů. Později se dozvíte, jak serializovat grafické objekty v Pythonu a pak tyto objekty deserializovat a vykreslit.

V tomto článku:

  • Kontrola ukázkových dat
  • Vytváření grafů pomocí Pythonu v T-SQL

V první části jste nainstalovali požadavky a obnovili ukázkovou databázi.

Ve třetí části se naučíte vytvářet funkce z nezpracovaných dat pomocí funkce Transact-SQL. Potom tuto funkci zavoláte z uložené procedury a vytvoříte tabulku obsahující hodnoty funkcí.

Ve čtvrté části načtete moduly a zavoláte potřebné funkce k vytvoření a trénování modelu pomocí uložené procedury SQL Serveru.

V 5. části se dozvíte, jak zprovoznit modely, které jste natrénovali a uložili ve čtvrté části.

Kontrola dat

Nejprve chvíli trvá procházení datového schématu, protože jsme provedli určité změny, abychom usnadnili používání dat taxislužby NYC.

  • Původní datová sada používala samostatné soubory pro identifikátory taxislužby a záznamy jízdy. Spojili jsme dvě původní datové sady se sloupci medallion, hack_license a pickup_datetime.
  • Původní datová sada překlenovala mnoho souborů a byla poměrně velká. Zmenšili jsme vzorkování na pouhé 1% původního počtu záznamů. Aktuální tabulka dat obsahuje 1 703 957 řádků a 23 sloupců.

Identifikátory taxislužby

Sloupec medallion představuje jedinečné IDENTIFIKAČNÍ číslo taxi.

Sloupec hack_license obsahuje číslo řidičského průkazu taxislužby (anonymizované).

Záznamy cest a jízdného

Každý záznam cesty zahrnuje vyzvednutí a odkládací místo a čas a vzdálenost jízdy.

Každý záznam o platbě zahrnuje platební údaje, jako je typ platby, celková částka platby a částka tipu.

Poslední tři sloupce je možné použít pro různé úlohy strojového učení. Sloupec tip_amount obsahuje souvislé číselné hodnoty a lze ho použít jako sloupec popisku pro regresní analýzu. Tipovaný sloupec obsahuje pouze hodnoty ano/ne a používá se pro binární klasifikaci. Sloupec tip_class má více popisků tříd , a proto je možné ho použít jako popisek pro úlohy klasifikace s více třídami.

Hodnoty použité pro sloupce popisků jsou založené na tip_amount sloupci pomocí těchto obchodních pravidel:

  • Sloupec tipped popisku má možné hodnoty 0 a 1.

    Pokud tip_amount> 0, tipped = 1; jinak tipped = 0

  • Sloupec tip_class popisku má možné hodnoty třídy 0–4.

    Třída 0: tip_amount = $0

    Třída 1: tip_amount> $0 a tip_amount<= $5

    Třída 2: tip_amount> $5 a tip_amount<= $10

    Třída 3: tip_amount> $10 a tip_amount<= $20

    Třída 4: tip_amount> $20

Vytváření grafů pomocí Pythonu v T-SQL

Vývoj řešení pro datové vědy obvykle zahrnuje intenzivní zkoumání dat a vizualizaci dat. Vzhledem k tomu, že vizualizace je takový výkonný nástroj pro pochopení distribuce dat a odlehlých hodnot, Poskytuje Python mnoho balíčků pro vizualizaci dat. Modul matplotlib je jednou z nejoblíbenějších knihoven pro vizualizaci a obsahuje mnoho funkcí pro vytváření histogramů, bodových grafů, krabicových grafů a dalších grafů pro zkoumání dat.

V této části se dozvíte, jak pracovat s grafy pomocí uložených procedur. Místo otevření obrázku na serveru uložíte objekt plot Pythonu jako varbinární data a pak ho zapíšete do souboru, který lze sdílet nebo zobrazit jinde.

Vytvořit graf jako varbinary data

Uložená procedura vrátí serializovaný objekt Pythonu figure jako datový proud varbinárních dat. Binární data nelze zobrazit přímo, ale kód Pythonu na klientovi můžete použít k deserializaci a zobrazení obrázků a pak soubor obrázku uložit do klientského počítače.

  1. Vytvořte uloženou proceduru PyPlotMatplotlib.

    V následujícím skriptu:

    • Proměnná @query definuje text SELECT tipped FROM nyctaxi_sampledotazu, který se předá bloku kódu Pythonu jako argument vstupní proměnné skriptu. @input_data_1
    • Skript Pythonu je poměrně jednoduchý: objekty matplotlibfigure se používají k vytvoření histogramu a bodového grafu a tyto objekty se pak serializují pomocí pickle knihovny.
    • Grafický objekt Pythonu je serializován do datového rámce pandas pro výstup.
    DROP PROCEDURE IF EXISTS PyPlotMatplotlib;
    GO
    
    CREATE PROCEDURE [dbo].[PyPlotMatplotlib]
    AS
    BEGIN
        SET NOCOUNT ON;
        DECLARE @query nvarchar(max) =
        N'SELECT cast(tipped as int) as tipped, tip_amount, fare_amount FROM [dbo].[nyctaxi_sample]'
        EXECUTE sp_execute_external_script
        @language = N'Python',
        @script = N'
    import matplotlib
    matplotlib.use("Agg")
    import matplotlib.pyplot as plt
    import pandas as pd
    import pickle
    
    fig_handle = plt.figure()
    plt.hist(InputDataSet.tipped)
    plt.xlabel("Tipped")
    plt.ylabel("Counts")
    plt.title("Histogram, Tipped")
    plot0 = pd.DataFrame(data =[pickle.dumps(fig_handle)], columns =["plot"])
    plt.clf()
    
    plt.hist(InputDataSet.tip_amount)
    plt.xlabel("Tip amount ($)")
    plt.ylabel("Counts")
    plt.title("Histogram, Tip amount")
    plot1 = pd.DataFrame(data =[pickle.dumps(fig_handle)], columns =["plot"])
    plt.clf()
    
    plt.hist(InputDataSet.fare_amount)
    plt.xlabel("Fare amount ($)")
    plt.ylabel("Counts")
    plt.title("Histogram, Fare amount")
    plot2 = pd.DataFrame(data =[pickle.dumps(fig_handle)], columns =["plot"])
    plt.clf()
    
    plt.scatter( InputDataSet.fare_amount, InputDataSet.tip_amount)
    plt.xlabel("Fare Amount ($)")
    plt.ylabel("Tip Amount ($)")
    plt.title("Tip amount by Fare amount")
    plot3 = pd.DataFrame(data =[pickle.dumps(fig_handle)], columns =["plot"])
    plt.clf()
    
    OutputDataSet = plot0.append(plot1, ignore_index=True).append(plot2, ignore_index=True).append(plot3, ignore_index=True)
    ',
    @input_data_1 = @query
    WITH RESULT SETS ((plot varbinary(max)))
    END
    GO
    
  2. Teď spusťte uloženou proceduru bez argumentů a vygenerujte graf z dat pevně zakódovaných jako vstupní dotaz.

    EXEC [dbo].[PyPlotMatplotlib]
    
  3. Výsledky by měly vypadat přibližně takto:

    plot
    0xFFD8FFE000104A4649...
     0xFFD8FFE000104A4649...
     0xFFD8FFE000104A4649...
     0xFFD8FFE000104A4649...
    
  4. Z klienta Pythonu se teď můžete připojit k instanci SQL Serveru, která vygenerovala objekty binárního grafu, a zobrazit grafy.

    Uděláte to tak, že spustíte následující kód Pythonu, podle potřeby nahradíte název serveru, název databáze a přihlašovací údaje (pro ověřování systému Windows nahraďte UID parametry a PWD parametry Trusted_Connection=True). Ujistěte se, že je verze Pythonu stejná na klientovi a serveru. Také se ujistěte, že knihovny Pythonu na vašem klientovi (například matplotlib) jsou stejné nebo vyšší verze vzhledem k knihovnám nainstalovaným na serveru. Pokud chcete zobrazit seznam nainstalovaných balíčků a jejich verzí, přečtěte si téma Získání informací o balíčku Pythonu.

    %matplotlib notebook
    import pyodbc
    import pickle
    import os
    cnxn = pyodbc.connect('DRIVER=SQL Server;SERVER={SERVER_NAME};DATABASE={DB_NAME};UID={USER_NAME};PWD={PASSWORD}')
    cursor = cnxn.cursor()
    cursor.execute("EXECUTE [dbo].[PyPlotMatplotlib]")
    tables = cursor.fetchall()
    for i in range(0, len(tables)):
        fig = pickle.loads(tables[i][0])
        fig.savefig(str(i)+'.png')
    print("The plots are saved in directory: ",os.getcwd())
    
  5. Pokud je připojení úspěšné, měla by se zobrazit zpráva podobná této:

    Grafy jsou uloženy v adresáři: xxxx

  6. Výstupní soubor se vytvoří v pracovním adresáři Pythonu. Pokud chcete zobrazit graf, vyhledejte pracovní adresář Pythonu a otevřete soubor. Následující obrázek znázorňuje graf uložený v klientském počítači.

    Částka spropitného vs částka jízdného

Další kroky

V tomto článku:

  • Kontrola ukázkových dat
  • Vytváření grafů pomocí Pythonu v T-SQL