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 !