Delen via


Python-zelfstudie: Gegevens verkennen en visualiseren

Van toepassing op: SQL Server 2017 (14.x) en latere versies van Azure SQL Managed Instance

In deel twee van deze vijfdelige reeks zelfstudies verkent u de voorbeeldgegevens en genereert u enkele plots. Later leert u hoe u grafische objecten in Python serialiseert en deze objecten vervolgens deserialiseert en plots maakt.

In dit artikel gaat u het volgende doen:

  • De voorbeeldgegevens controleren
  • Plots maken met behulp van Python in T-SQL

In deel 1 hebt u de vereisten geïnstalleerd en de voorbeelddatabase hersteld.

In deel drie leert u hoe u functies maakt op basis van onbewerkte gegevens met behulp van een Transact-SQL-functie. Vervolgens roept u die functie aan vanuit een opgeslagen procedure om een tabel te maken die de functiewaarden bevat.

In deel vier laadt u de modules en roept u de benodigde functies aan om het model te maken en te trainen met behulp van een opgeslagen SQL Server-procedure.

In deel vijf leert u hoe u de modellen kunt operationeel maken die u hebt getraind en opgeslagen in deel vier.

De gegevens controleren

Neem eerst even de tijd om door het gegevensschema te bladeren, omdat we enkele wijzigingen hebben aangebracht om het gebruik van de NYC Taxi-gegevens gemakkelijker te maken

  • De oorspronkelijke gegevensset heeft afzonderlijke bestanden gebruikt voor de taxi-id's en ritrecords. We hebben de twee oorspronkelijke gegevenssets samengevoegd op de kolommen medallion, hack_license en pickup_datetime.
  • De oorspronkelijke gegevensset spaneerde veel bestanden en was vrij groot. We hebben het aantal records teruggebracht tot slechts 1% van het oorspronkelijke aantal. De huidige gegevenstabel heeft 1.703.957 rijen en 23 kolommen.

Taxi-identificatoren

De medaillonkolom vertegenwoordigt het unieke ID-nummer van de taxi.

De kolom hack_license bevat het rijbewijsnummer van de taxichauffeur (geanonimiseerd).

Rit- en tariefrecords

Elke reisrecord omvat de locatie en tijd voor ophalen en afzetten, en de reisafstand.

Elke tariefrecord bevat betalingsgegevens, zoals het betalingstype, het totale bedrag van de betaling en het fooibedrag.

De laatste drie kolommen kunnen worden gebruikt voor verschillende machine learning-taken. De kolom tip_amount bevat doorlopende numerieke waarden en kan worden gebruikt als labelkolom voor regressieanalyse. De getipte kolom heeft alleen ja/nee-waarden en wordt gebruikt voor binaire classificatie. De kolom tip_class heeft meerdere klasselabels en kan daarom worden gebruikt als label voor classificatietaken met meerdere klassen.

De waarden die worden gebruikt voor de labelkolommen zijn allemaal gebaseerd op de tip_amount kolom, met behulp van deze bedrijfsregels:

  • Labelkolom tipped heeft mogelijke waarden 0 en 1

    Als tip_amount> 0, tipped = 1; anders tipped = 0

  • Labelkolom tip_class heeft mogelijke klassewaarden 0-4

    Klasse 0: tip_amount = $ 0

    Klasse 1: tip_amount> $0 en tip_amount<= $5

    Klasse 2: tip_amount> $5 en tip_amount<= $10

    Klasse 3: tip_amount> $ 10 en tip_amount<= $ 20

    Klasse 4: tip_amount> $ 20

Plots maken met behulp van Python in T-SQL

Het ontwikkelen van een data science-oplossing omvat meestal intensieve gegevensverkenning en gegevensvisualisatie. Omdat visualisatie zo'n krachtig hulpmiddel is voor het begrijpen van de distributie van de gegevens en uitbijters, biedt Python veel pakketten voor het visualiseren van gegevens. De matplotlib-module is een van de populairste bibliotheken voor visualisatie en bevat veel functies voor het maken van histogrammen, spreidingsdiagrammen, boxplots en andere grafieken voor gegevensverkenning.

In deze sectie leert u hoe u met plots kunt werken met behulp van opgeslagen procedures. In plaats van de afbeelding op de server te openen, slaat u het Python-object plot op als varbinaire gegevens en schrijft u dit vervolgens naar een bestand dat elders kan worden gedeeld of bekeken.

Een plot maken als varbinaire gegevens

De opgeslagen procedure retourneert een geserialiseerd Python-object figure als een stroom varbinaire gegevens. U kunt de binaire gegevens niet rechtstreeks weergeven, maar u kunt Python-code op de client gebruiken om deserialiseren en de afbeeldingen weer te geven en vervolgens het afbeeldingsbestand op een clientcomputer op te slaan.

  1. Maak de opgeslagen procedure PyPlotMatplotlib.

    In het volgende script:

    • De variabele @query definieert de querytekstSELECT tipped FROM nyctaxi_sample, die wordt doorgegeven aan het Python-codeblok als argument voor de scriptinvoervariabele. @input_data_1
    • Het Python-script is vrij eenvoudig: matplotlib-objectenfigure worden gebruikt om het histogram en het spreidingsplot te maken. Deze objecten worden vervolgens geserialiseerd met behulp van de pickle bibliotheek.
    • Het Python-grafische object wordt geserialiseerd naar een Pandas DataFrame voor uitvoer.
    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. Voer nu de opgeslagen procedure uit zonder argumenten om een plot te genereren op basis van de gegevens die in code zijn vastgelegd als invoerquery.

    EXEC [dbo].[PyPlotMatplotlib]
    
  3. De resultaten moeten er ongeveer als volgt uitzien:

    plot
    0xFFD8FFE000104A4649...
     0xFFD8FFE000104A4649...
     0xFFD8FFE000104A4649...
     0xFFD8FFE000104A4649...
    
  4. Vanuit een Python-client kunt u nu verbinding maken met het SQL Server-exemplaar dat de binaire plotobjecten heeft gegenereerd en de plots bekijken.

    Voer hiervoor de volgende Python-code uit, waarbij u de servernaam, databasenaam en referenties indien nodig vervangt (voor Windows-verificatie vervangt u de UID en PWD parameters door Trusted_Connection=True). Zorg ervoor dat de Python-versie hetzelfde is op de client en de server. Zorg er ook voor dat de Python-bibliotheken op uw client (zoals matplotlib) dezelfde of hogere versie zijn ten opzichte van de bibliotheken die op de server zijn geïnstalleerd. Zie Python-pakketgegevens ophalen om een lijst met geïnstalleerde pakketten en hun versies weer te geven.

    %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. Als de verbinding is geslaagd, ziet u een bericht als volgt:

    De plots worden opgeslagen in map: xxxx

  6. Het uitvoerbestand wordt gemaakt in de Python-werkmap. Als u de plot wilt weergeven, zoekt u de Python-werkmap en opent u het bestand. In de volgende afbeelding ziet u een plot die is opgeslagen op de clientcomputer.

    Tipbedrag vs Ritbedrag

Volgende stappen

In dit artikel gaat u als volgt te werk:

  • Ik heb de voorbeeldgegevens gecontroleerd.
  • Plots gemaakt met behulp van Python in T-SQL