Recherche de site Web

Un guide d'analyse de données en Python avec DuckDB


Apprenez à effectuer une analyse de données en Python à l'aide de DuckDB.

Êtes-vous un développeur familier avec SQL et Python ? Si tel est le cas, vous souhaiterez peut-être commencer à utiliser DuckDB, une base de données OLAP en cours, pour l'analyse des données.

SQL est le langage d'interrogation des bases de données et constitue le langage le plus important de votre boîte à outils de données. Ainsi, lorsque vous passez à Python, vous regardez probablement des pandas : lire des données provenant de diverses sources dans un dataframe et les analyser.

Mais ne serait-il pas agréable d'interroger les dataframes pandas ainsi que les sources de données telles que les fichiers CSV et Parquet à l'aide de SQL. DuckDB vous permet de faire exactement cela et bien plus encore. Dans ce didacticiel, nous apprendrons comment utiliser DuckDB en Python pour analyser des données. Commençons !

Configuration de l'environnement

Pour commencer, créez et activez un environnement virtuel :

$ python3 -m venv v1
$ source v1/bin/activate

Installez ensuite duckdb :

$ pip3 install duckdb

Parce que nous générons également des exemples de données avec lesquelles travailler, nous aurons également besoin de NumPy et Pandas :

$ pip3 install numpy pandas

Interroger des données avec DuckDB

Une fois l'installation rapide terminée, nous pouvons passer à l'analyse des données.

Remarque : Il est courant d'utiliser des connexions lors de l'interaction avec des bases de données. Vous pouvez utiliser duckdb.connect() pour travailler à la fois avec des bases de données en mémoire et avec le stockage persistant.

  • Utiliser duckdb.connect() pour vous connecter à une base de données en mémoire qui existe uniquement pendant la session. Cela convient à une analyse rapide, en particulier lorsque vous n'avez pas besoin de stocker les résultats à long terme.
  • Pour conserver les données entre les sessions et les requêtes, transmettez un chemin de fichier à la fonction connect() comme ceci : duckdb.connect('my_database.db').

Mais nous interrogerons les fichiers CSV et n’avons pas vraiment besoin d’un objet de connexion. C'était donc juste une note pour vous donner une idée lorsque vous interrogez des bases de données.

Génération d'exemples de fichiers CSV

▶️ Vous pouvez retrouver le code de ce tutoriel sur GitHub.

Nous allons créer un ensemble de données de ventes simulées, composé de quelques fichiers CSV, qui incluent les détails du produit, les prix, les quantités vendues et les régions dans lesquelles les ventes ont eu lieu. Exécutez generate_csv.py dans votre dossier de projet pour générer deux fichiers CSV : sales_data.csv et product_details.csv.

Lorsque vous travaillez avec des fichiers CSV dans DuckDB, vous pouvez lire le fichier dans une relation : duckdb.read_csv('your_file.csv') puis l'interroger. Ou vous pouvez travailler directement avec des fichiers et les interroger comme ceci :

import duckdb

duckdb.sql("SELECT * FROM 'sales_data.csv' LIMIT 5").df()

Vous pouvez enregistrer les résultats de la requête en utilisant df() comme indiqué dans l'exemple.

Exécutons maintenant quelques requêtes SQL (réellement utiles) pour analyser les données dans les fichiers CSV.

Exemple de requête 1 : calculer les ventes totales par région

Pour comprendre quelle région a généré le plus de revenus, nous pouvons calculer les ventes totales par région. Vous pouvez calculer les ventes totales en multipliant le prix de chaque produit par la quantité vendue et en le additionnant pour chaque région.

# Calculate total sales (Price * Quantity_Sold) per region
query = """
SELECT Region, SUM(Price * Quantity_Sold) as Total_Sales
FROM 'sales_data.csv'
GROUP BY Region
ORDER BY Total_Sales DESC
"""
total_sales = duckdb.sql(query).df()

print("Total sales per region:")
print(total_sales)

Cette requête renvoie :

Total sales per region:
  Region      Total_Sales
0   East	454590.49
1  South	426352.72
2   West	236804.52
3  North	161048.07

Exemple de requête 2 : trouver les 5 produits les plus vendus

Ensuite, nous souhaitons identifier les 5 produits les plus vendus par quantité vendue. Cela peut nous donner un aperçu des produits les plus performants dans toutes les régions.

# Find the top 5 best-selling products by quantity
query = """
SELECT Product_Name, SUM(Quantity_Sold) as Total_Quantity
FROM 'sales_data.csv'
GROUP BY Product_Name
ORDER BY Total_Quantity DESC
LIMIT 5
"""
top_products = duckdb.sql(query).df()

print("Top 5 best-selling products:")
print(top_products)

Cela donne le top 5 des produits les plus vendus :

Top 5 best-selling products:
  Product_Name  Total_Quantity
0   Product_42        	99.0
1   Product_97        	98.0
2   Product_90        	96.0
3   Product_27        	94.0
4   Product_54        	94.0

Exemple de requête 3 : calculer le prix moyen par région

Nous pouvons également calculer le prix moyen des produits vendus dans chaque région pour identifier les éventuelles différences de prix entre les régions.

# Calculate the average price of products by region
query = """
SELECT Region, AVG(Price) as Average_Price
FROM 'sales_data.csv'
GROUP BY Region
"""
avg_price_region = duckdb.sql(query).df()

print("Average price per region:")
print(avg_price_region)

Cette requête calcule le prix moyen des produits vendus dans chaque région et renvoie les résultats regroupés par région :

Average price per region:
  Region      Average_Price
0  North 	263.119167
1   East 	288.035625
2   West 	200.139000
3  South 	254.894722

Exemple de requête 4 : quantité totale vendue par région

Pour analyser plus en profondeur les données, nous pouvons calculer la quantité totale de produits vendus dans chaque région. Cela nous aide à voir quelles régions ont le plus d’activité de vente en termes de volume.

# Calculate total quantity sold by region
query = """
SELECT Region, SUM(Quantity_Sold) as Total_Quantity
FROM 'sales_data.csv'
GROUP BY Region
ORDER BY Total_Quantity DESC
"""
total_quantity_region = duckdb.sql(query).df()

print("Total quantity sold per region:")
print(total_quantity_region)

Cette requête calcule la quantité totale vendue par région et trie le résultat par ordre décroissant, indiquant quelle région a vendu le plus de produits :

Total quantity sold per region:
  Region  Total_Quantity
0  South      	1714.0
1   East      	1577.0
2   West      	1023.0
3  North       	588.0

Exemple de requête 4 : rejoindre des CSV

DuckDB offre plusieurs fonctionnalités avancées qui le rendent polyvalent pour l'analyse des données. Par exemple, vous pouvez facilement joindre plusieurs fichiers CSV pour des requêtes plus complexes, ou interroger des ensembles de données plus volumineux stockés sur disque sans les charger entièrement en mémoire.

Cette requête SQL JOIN combine deux fichiers CSV, sales_data.csv et product_details.csv, en faisant correspondre les lignes basées sur une colonne commune : Product_ID.

query = """
SELECT s.Product_Name, s.Region, s.Price, p.Manufacturer
FROM 'sales_data.csv' s
JOIN 'product_details.csv' p
ON s.Product_ID = p.Product_ID
"""
joined_data = duckdb.sql(query).df()

print(joined_data.head())

Cela devrait produire :

     Product_Name  Region   Price   Manufacturer
0	Product_1  North  283.08  Manufacturer_4
1	Product_2   East  325.94  Manufacturer_3
2	Product_3   West   39.54  Manufacturer_2
3	Product_4  South  248.82  Manufacturer_4
4	Product_5   East  453.62  Manufacturer_5

Conclusion

Dans ce didacticiel, nous avons vu comment utiliser DuckDB pour l'analyse de données avec Python.

Nous avons travaillé avec des fichiers CSV. Mais vous pouvez travailler avec des fichiers parquet, JSON et des bases de données relationnelles de la même manière. Alors oui, DuckDB est un outil utile pour analyser de grands ensembles de données en Python et constitue un ajout très utile à votre boîte à outils d'analyse de données Python.

Je suggère d'utiliser DuckDB dans votre prochain projet d'analyse de données. Bon codage !