Explorer et visualiser les donnéesExplore and visualize the data

S’APPLIQUE À : ouiSQL Server nonAzure SQL Database nonAzure Synapse Analytics (SQL DW) nonParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Cet article fait partie d’un tutoriel, Analytique Python en base de données pour développeur SQL.This article is part of a tutorial, In-database Python analytics for SQL developers.

Dans cette étape, vous explorez les exemples de données et générez des tracés.In this step, you explore the sample data and generate some plots. Plus tard, vous allez apprendre à sérialiser des objets de graphiques dans Python, puis à désérialiser ces objets et à créer des tracés.Later, you learn how to serialize graphics objects in Python, and then deserialize those objects and make plots.

Examiner les donnéesReview the data

Tout d’abord, prenez une minute pour parcourir le schéma de données, car nous avons apporté des modifications pour faciliter l’utilisation des données relatives aux taxis de New York.First, take a minute to browse the data schema, as we've made some changes to make it easier to use the NYC Taxi data

  • Dans le jeu de données d’origine, les identificateurs de taxis et les enregistrements de trajets ont été fournis dans des fichiers distincts.The original dataset used separate files for the taxi identifiers and trip records. Nous avons joint les deux jeux de données d’origine sur les colonnes medallion, hack_license, et pickup_datetime.We've joined the two original datasets on the columns medallion, hack_license, and pickup_datetime.
  • Le jeu de données d’origine est réparti sur de nombreux fichiers et était assez volumineux.The original dataset spanned many files and was quite large. Les enregistrements ont aussi été échantillonnés pour obtenir seulement 1 % du nombre d’enregistrements d’origine.We've downsampled to get just 1% of the original number of records. La table de données actuelle contient 1 703 957 lignes et 23 colonnes.The current data table has 1,703,957 rows and 23 columns.

Identificateurs de taxisTaxi identifiers

La colonne medallion représente le numéro identifiant unique du taxi.The medallion column represents the taxi's unique ID number.

La colonne hack_license contient le numéro de licence du conducteur du taxi (anonyme).The hack_license column contains the taxi driver's license number (anonymized).

Enregistrements de trajets et de prixTrip and fare records

Chaque enregistrement de trajet comprend les lieux de prise en charge et de dépose, ainsi que la durée et la distance du trajet.Each trip record includes the pickup and drop-off location and time, and the trip distance.

Chaque enregistrement de prix inclut des informations telles que le type de paiement, le montant total du paiement et le montant du pourboire.Each fare record includes payment information such as the payment type, total amount of payment, and the tip amount.

Les trois dernières colonnes peuvent être utilisées pour différentes tâches d’apprentissage automatique.The last three columns can be used for various machine learning tasks. La colonne tip_amount contient des valeurs numériques continues et peut être utilisée comme colonne étiquette pour l’analyse de régression.The tip_amount column contains continuous numeric values and can be used as the label column for regression analysis. La colonne tipped contient seulement des valeurs oui/non. Elle sert à la classification binaire.The tipped column has only yes/no values and is used for binary classification. La colonne tip_class a plusieurs étiquettes de classes , et peut donc être utilisée comme étiquette pour les tâches de classification multiclasse.The tip_class column has multiple class labels and therefore can be used as the label for multi-class classification tasks.

Les valeurs utilisées pour les colonnes d’étiquettes sont basées sur la colonne tip_amount, à l’aide de ces règles d’entreprise :The values used for the label columns are all based on the tip_amount column, using these business rules:

  • La colonne d’étiquette tipped a les valeurs possibles 0 et 1Label column tipped has possible values 0 and 1

    Si tip_amount > 0, tipped = 1 ; sinon tipped = 0If tip_amount > 0, tipped = 1; otherwise tipped = 0

  • La colonne d’étiquette tip_class a les valeurs de classe possibles 0 à 4Label column tip_class has possible class values 0-4

    Classe 0 : tip_amount = 0 $Class 0: tip_amount = $0

    Classe 1 : tip_amount > 0 $ et tip_amount < = 5 $Class 1: tip_amount > $0 and tip_amount <= $5

    Classe 2 : tip_amount > 5 $ et tip_amount < = 10 $Class 2: tip_amount > $5 and tip_amount <= $10

    Classe 3 : tip_amount > 10 $ et tip_amount < = 20 $Class 3: tip_amount > $10 and tip_amount <= $20

    Classe 4 : tip_amount > 20 $Class 4: tip_amount > $20

Créer des tracés à l’aide de Python en T-SQLCreate plots using Python in T-SQL

Le développement d’une solution de science des données comprend généralement l’exploration et la visualisation des données.Developing a data science solution usually includes intensive data exploration and data visualization. La visualisation étant un outil tellement puissant pour comprendre la distribution des données et des valeurs hors norme, Python fournit de nombreux packages de visualisation de données.Because visualization is such a powerful tool for understanding the distribution of the data and outliers, Python provides many packages for visualizing data. Le module matplotlib est l’une des bibliothèques les plus populaires pour la visualisation. Il comprend de nombreuses fonctions permettant de créer des histogrammes, des nuages de points, des diagrammes à surfaces et d’autres graphiques d’exploration de données.The matplotlib module is one of the more popular libraries for visualization, and includes many functions for creating histograms, scatter plots, box plots, and other data exploration graphs.

Dans cette section, vous allez apprendre à travailler avec des tracés à l’aide de procédures stockées.In this section, you learn how to work with plots using stored procedures. Au lieu d’ouvrir l’image sur le serveur, vous stockez l’objet Python plot en tant que données varbinary, puis vous l’écrivez dans un fichier qui peut être partagé ou affiché ailleurs.Rather than open the image on the server, you store the Python object plot as varbinary data, and then write that to a file that can be shared or viewed elsewhere.

Créer un tracé en tant que données varbinaryCreate a plot as varbinary data

La procédure stockée renvoie un objet figure Python sérialisé sous la forme d’un flux de données varbinary.The stored procedure returns a serialized Python figure object as a stream of varbinary data. Vous ne pouvez pas afficher les données binaires directement, mais vous pouvez utiliser le code Python sur le client pour désérialiser et afficher les figures, puis enregistrer le fichier image sur un ordinateur client.You cannot view the binary data directly, but you can use Python code on the client to deserialize and view the figures, and then save the image file on a client computer.

  1. Créez la procédure stockée PyPlotMatplotlib, si le script PowerShell ne l’a pas encore fait.Create the stored procedure PyPlotMatplotlib, if the PowerShell script did not already do so.

    • La variable @query définit le texte de requête SELECT tipped FROM nyctaxi_sample, qui est transmis au bloc de code Python comme argument de la variable d’entrée du script, @input_data_1.The variable @query defines the query text SELECT tipped FROM nyctaxi_sample, which is passed to the Python code block as the argument to the script input variable, @input_data_1.
    • Le script Python est assez simple : les objets matplotlib figure sont utilisés pour créer l’histogramme et le nuage de points. Ces objets sont ensuite sérialisés à l’aide de la bibliothèque pickle.The Python script is fairly simple: matplotlib figure objects are used to make the histogram and scatter plot, and these objects are then serialized using the pickle library.
    • L’objet graphique Python est sérialisé en DataFrame pandas pour la sortie.The Python graphics object is serialized to a pandas DataFrame for output.
    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. À présent, exécutez la procédure stockée sans argument pour générer un tracé à partir des données codées en dur en tant que requête d’entrée.Now run the stored procedure with no arguments to generate a plot from the data hard-coded as the input query.

    EXEC [dbo].[PyPlotMatplotlib]
    
  3. Les résultats doivent se présenter comme suit :The results should be something like this:

    plot
    0xFFD8FFE000104A4649...
    0xFFD8FFE000104A4649...
    0xFFD8FFE000104A4649...
    0xFFD8FFE000104A4649...
    
  4. À partir d’un client Python, vous pouvez maintenant vous connecter à l’instance SQL Server qui a généré les objets de tracé binaire et afficher les tracés.From a Python client, you can now connect to the SQL Server instance that generated the binary plot objects, and view the plots.

    Pour ce faire, exécutez le code Python suivant, en remplaçant le nom du serveur, le nom de la base de données et les informations d’identification comme il convient.To do this, run the following Python code, replacing the server name, database name, and credentials as appropriate. Assurez-vous que la version Python est la même sur le client et sur le serveur.Make sure the Python version is the same on the client and the server. Assurez-vous également que les versions des bibliothèques Python sur votre client (telles que matplotlib) sont identiques ou supérieure à celles des bibliothèques installées sur le serveur.Also make sure that the Python libraries on your client (such as matplotlib) are the same or higher version relative to the libraries installed on the server.

    Avec l’authentification SQL Server :Using SQL Server authentication:

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

    Avec l’authentification Windows :Using Windows authentication:

    %matplotlib notebook
    import pyodbc
    import pickle
    import os
    cnxn = pyodbc.connect('DRIVER=SQL Server;SERVER={SERVER_NAME};DATABASE={DB_NAME};Trusted_Connection=True;')
    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. Si la connexion réussit, un message semblable à celui-ci doit s’afficher :If the connection is successful, you should see a message like the following:

    Les tracés sont enregistrés dans le répertoire : xxxxThe plots are saved in directory: xxxx

  6. Le fichier de sortie est créé dans le répertoire de travail Python.The output file is created in the Python working directory. Pour afficher le tracé, localisez le répertoire de travail Python, puis ouvrez le fichier.To view the plot, locate the Python working directory, and open the file. L’illustration suivante montre un tracé enregistré sur l’ordinateur client.The following image shows a plot saved on the client computer.

    Montant du pourboire/Montant de la courseTip amount vs Fare amount

Étape suivanteNext step

Créer des caractéristiques de données à l’aide de T-SQLCreate data features using T-SQL

Étape précédentePrevious step

Télécharger le jeu de données des taxis de New YorkDownload the NYC Taxi data set