Intégration de DuckDB & Python: un guide d’analyse

Image par auteur
Duckdb est une base de données analytique rapide et en cours conçue pour l’analyse des données modernes. Il s’exécute directement à partir de votre script Python, ce qui signifie qu’il n’y a pas de serveur distinct nécessaire, et il excelle dans des requêtes complexes grâce à son stockage en colonnes et à son exécution vectorisée.
Comme comprendre comment gérer les données devient plus important, je veux aujourd’hui vous montrer comment créer un flux de travail Python avec DuckDB et explorer ses caractéristiques clés.
Plongeons-nous!
Qu’est-ce que DuckDB?
DuckDB est une base de données OLAP en cours d’ouverture gratuite et en cours de processus conçue pour des analyses locales rapides. Contrairement aux bases de données traditionnelles qui s’exécutent en tant que services externes, DuckDB s’exécute dans votre application, sans serveur requis. En tant que système OLAP, DuckDB stocke les données dans les colonnes (pas des lignes comme les systèmes OLTP), ce qui le rend très efficace pour les requêtes analytiques telles que les jointures, les agrégations et les groupements.
Considérez DuckDB comme une version légère optimisée par analytique de SQLite, apportant la simplicité des bases de données locales ainsi que la puissance de l’entreposage de données moderne. Et cela nous amène à la question naturelle suivante …
Quelles sont les principales caractéristiques de DuckDB?
Requêtes analytiques fascinantes flamboyantes
DuckDB offre des performances impressionnantes pour les charges de travail OLAP, surprenant souvent les utilisateurs familiers avec les bases de données traditionnelles comme PostgreSQL. Contrairement aux systèmes OLAP conventionnels qui peuvent être lents en raison du traitement de grands volumes de données, DuckDB exploite un moteur d’exécution en colonnes en colonnes. Cette conception optimise l’utilisation du cache du processeur et accélère considérablement les performances de la requête analytique.
Support SQL natif + intégration linguistique sans couture
DuckDB offre une prise en charge complète des requêtes SQL complexes et expose les API dans plusieurs langues, y compris Java, C et C ++. Son intégration serrée avec Python et R le rend idéal pour l’analyse des données interactives. Vous pouvez rédiger des requêtes directement dans votre environnement préféré, avec des améliorations de syntaxe SQL supplémentaires (par exemple, exclure, remplacer et tout) pour simplifier l’écriture de requête.
Et la meilleure partie est que DuckDB est complètement autonome, sans dépendances externes ni maux de tête de configuration.
Gratuit et open source
DuckDB est entièrement open-source et activement entretenu par une communauté croissante de contributeurs. Cela garantit un développement rapide des fonctionnalités et des corrections de bogues. Et oui, c’est gratuit. Bien que les futures changements de licence soient toujours une possibilité, pour l’instant, vous obtenez un puissant moteur d’analyse à zéro coût.
Maintenant que nous connaissons ses principales fonctionnalités, commençons avec!
Partage avec DuckDB
Le processus d’installation de DuckDB dépend légèrement de votre environnement, mais dans l’ensemble, il est rapide et simple. Étant donné que DuckDB est un moteur de base de données intégré sans exigences de serveur ni dépendances externes, la configuration ne prend généralement que quelques lignes de code. Vous pouvez trouver le guide d’installation complet dans la documentation officielle de DuckDB.
Condition préalable
Avant de plonger, assurez-vous d’avoir ce qui suit:
- Python 3.13 ou installé ultérieur
- Une compréhension de base de la SQL et de l’analyse des données dans Python
Vous pouvez facilement installer DuckDB dans votre environnement en exécutant la commande suivante:
Travailler avec DuckDB à Python
Une fois que vous avez installé DuckDB, il est assez simple de commencer. Vous importez simplement DuckDB dans votre environnement, puis vous connectez à une base de données existante ou créez-en une nouvelle si nécessaire.
Par exemple:
import duckdb
connection = duckdb.connect()
Si aucun fichier de base de données n’est fourni au connect()
Méthode, DuckDB créera une nouvelle base de données en mémoire par défaut. Cela dit, la façon la plus simple de commencer à exécuter des requêtes SQL est d’utiliser le sql()
méthode directement.
# Source: Basic API usage - https://duckdb.org/docs/api/python/overview.html
import duckdb
duckdb.sql('SELECT 42').show()
L’exécution de cette commande initialise une instance Global In-Memory DuckDB dans le module Python et renvoie une relation, une représentation symbolique de la requête.
Surtout, la requête elle-même n’est pas exécutée tant que vous ne demandez pas explicitement le résultat, comme indiqué ci-dessous:
# Source: Execute SQL - https://duckdb.org/docs/guides/python/execute_sql.html
results = duckdb.sql('SELECT 42').fetchall()
print(results)
"""
((42,))
"""
Travaillons maintenant avec de vraies données. DuckDB prend en charge une large gamme de formats de fichiers, y compris CSV, JSON et Parquet, et les charger est simple.
Vous pouvez voir à quel point il est simple dans l’exemple ci-dessous:
# Source: Python API - https://duckdb.org/docs/api/python/overview.html
import duckdb
duckdb.read_csv('example.csv') # read a CSV file into a Relation
duckdb.read_parquet('example.parquet')# read a Parquet file into a Relation
duckdb.read_json('example.json') # read a JSON file into a Relation
duckdb.sql('SELECT * FROM "example.csv"') # directly query a CSV file
Travailler avec des sources de données externes dans DuckDB
L’une des fonctionnalités exceptionnelles de DuckDB est sa capacité à interroger directement les fichiers de données externes, sans avoir besoin de les importer dans une base de données ou de charger des ensembles de données entiers dans la mémoire. Contrairement aux bases de données traditionnelles qui nécessitent que les données soient ingérées en premier, DuckDB prend en charge un modèle d’exécution « zéro copie », ce qui lui permet de lire uniquement les données requises pour une requête donnée.
Cette approche apporte plusieurs avantages clés:
- Utilisation minimale de la mémoire: seules les parties pertinentes du fichier sont lues dans la mémoire.
- Pas de frais généraux d’importation / d’exportation: interrogez vos données en place – pas besoin de les déplacer ou de les dupliquer.
- Flows de travail rationalisés: interrogez facilement sur plusieurs fichiers et formats à l’aide d’une seule instruction SQL.
Pour illustrer l’utilisation de DuckDB, nous utiliserons un fichier CSV simple que vous pouvez obtenir à partir de ce qui suit Lien de kaggle .
Pour interroger les données, nous pouvons facilement définir une requête simple qui souligne notre chemin de fichier.
# Query data directly from a CSV file
result = duckdb.query(f"SELECT * FROM '{source}'").fetchall()
print(result)
Maintenant, nous pouvons facilement gérer les données à l’aide de la logique de type SQL directement avec DuckDB.
Filtrage des lignes
Pour vous concentrer sur des sous-ensembles spécifiques de données, utilisez la clause où DuckDB. Il filtre les lignes basées sur des conditions utilisant des opérateurs de comparaison (>, <, =, <>, etc.) et des opérateurs logiques (et, ou non) pour des expressions plus complexes.
# Select only students with a score above 80
result = duckdb.query(f"SELECT * FROM '{source}' WHERE total_passengers > 500").fetchall()
result
Tri des résultats
Utilisez la clause Ordre by pour trier les résultats par une ou plusieurs colonnes. Il est par défaut en ascendant (ASC), mais vous pouvez spécifier descendant (DESC). Pour trier par plusieurs colonnes, séparez-les avec des virgules.
#Sort months by number of passengers
sorted_result = duckdb.query(f"SELECT * FROM '{source}' ORDER BY total_passengers DESC ").fetchall()
print("nMonths sorted by total traffic:")
print(sorted_result)
Ajout de colonnes calculées
Créez de nouvelles colonnes dans votre requête en utilisant les expressions et le mot-clé AS. Utilisez des opérateurs arithmétiques ou des fonctions intégrées pour transformer les données – ces colonnes apparaissent dans les résultats mais n’affectent pas le fichier d’origine.
# Add 10 bonus points to each score
bonus_result = duckdb.query(f"""
SELECT
month,
total_passengers,
total_passengers/1000 AS traffic_in_thousands
FROM '{source}'
""").fetchall()
print("nScores with 10 bonus points:")
print(bonus_result)
En utilisant des expressions de cas
Pour des transformations plus complexes, SQL fournit l’expression de cas. Cela fonctionne de manière similaire aux instructions IF-Else dans les langages de programmation, vous permettant d’appliquer une logique conditionnelle dans vos requêtes.
segmented_result = duckdb.query(f"""
SELECT
month,
total_passengers,
CASE
WHEN total_passengers >= 100 THEN 'HIGH'
WHEN total_passengers >= 50 THEN 'MEDIUM'
ELSE 'LOW'
END AS affluency
FROM '{source}'
""").fetchall()
print("nMonth by affluency of passangers")
print(segmented_result)
Conclusion
DuckDB est une base de données OLAP haute performance conçue pour les professionnels des données qui ont besoin d’explorer et d’analyser efficacement les grands ensembles de données. Son moteur SQL en cours d’exécution des requêtes analytiques complexes directement dans votre environnement – aucun serveur distinct n’est requis. Avec un support transparent pour Python, R, Java, C ++, et plus encore, DuckDB s’intègre naturellement dans votre flux de travail existant, quelle que soit votre langue préférée.
Vous pouvez aller vérifier le code complet sur le suivant le référentiel GitHub.
Josep Ferrer est un ingénieur en analyse de Barcelone. Il a obtenu son diplôme en génie physique et travaille actuellement dans le domaine de la science des données appliquée à la mobilité humaine. Il est un créateur de contenu à temps partiel axé sur la science et la technologie des données. Josep écrit sur tout ce qui concerne l’IA, couvrant l’application de l’explosion en cours sur le terrain.