Skip to content

Comment traiter les données JSON avec Polars : Un guide rapide

Updated on

Rêvez-vous de traiter des données JSON comme un pro ? Bienvenue à bord ! Aujourd'hui, nous allons explorer Polars, une bibliothèque de DataFrame surpuissante en Python et Rust, en mettant l'accent sur la manipulation des données JSON. Avec ses performances ultrarapides et ses méthodes faciles à utiliser, vous comprendrez pourquoi Polars devient rapidement le choix privilégié des data scientists du monde entier.

Conversion d'une colonne de chaînes JSON en dictionnaire dans Polars

Il arrive souvent que vous vous retrouviez avec un DataFrame dont une colonne contient des chaînes JSON. Supposons que vous souhaitiez filtrer ce DataFrame en fonction de clés spécifiques ou de valeurs dans ces chaînes JSON. La meilleure façon de le faire serait de convertir les chaînes JSON en dictionnaires. Cependant, Polars n'opère pas avec des dictionnaires génériques. Il utilise plutôt un concept appelé « struct », où chaque clé de dictionnaire est associée au nom d'un champ de la struct, et la valeur correspondante du dictionnaire devient la valeur de ce champ.

Voici le truc, cependant. La création d'une série de type struct présente deux contraintes principales :

  1. Toutes les structs doivent avoir les mêmes noms de champ.
  2. Les noms de champ doivent être listés dans le même ordre.

Mais ne vous inquiétez pas ! Polars fournit une fonction appelée json_path_match qui extrait des valeurs en fonction de la syntaxe JSONPath. Avec cela, vous pouvez vérifier si une clé existe et récupérer sa valeur. Voici comment vous pouvez le faire :

import polars as pl
 
json_list = [
    """{"name": "Maria", "position": "developer", "office": "Seattle"}""",
    """{"name": "Josh", "position": "analyst", "termination_date": "2020-01-01"}""",
    """{"name": "Jorge", "position": "architect", "office": "", "manager_st_dt": "2020-01-01"}""",
]
 
df = pl.DataFrame(
    {
        "tags": json_list,
    }
).with_row_count("id", 1)
 
df = df.with_columns([
    pl.col('tags').str.json_path_match(r"$.name").alias('name'),
    pl.col('tags').str.json_path_match(r"$.office").alias('location'),
    pl.col('tags').str.json_path_match(r"$.manager_st_dt").alias('date de début du manager'),
])

Dans l'exemple ci-dessus, nous avons créé un DataFrame avec une colonne nommée 'tags' contenant des chaînes JSON. Nous utilisons ensuite la fonction json_path_match pour extraire des valeurs spécifiques. Ces valeurs sont ensuite attribuées à de nouvelles colonnes ('name', 'location', 'date de début du manager') de notre DataFrame.

Remarquez que si une clé n'est pas trouvée, json_path_match renverra null. Nous pouvons utiliser ce fait pour filtrer notre DataFrame en fonction de la présence d'une certaine clé.

df = df.filter(pl.col('tags').str.json_path_match(r"$.manager_st_dt").is_not_null())

Dans la ligne de code ci-dessus, nous filtrons notre DataFrame pour inclure uniquement les lignes où la clé 'manager_st_dt' est présente dans la chaîne JSON.

Lecture de grands fichiers JSON en tant que DataFrame dans Polars

Lorsque vous travaillez avec de grands fichiers JSON, vous pouvez rencontrer l'erreur suivante : "RuntimeError: BindingsError: "ComputeError(Owned("InvalidEOF"))". Il peut y avoir plusieurs raisons à cette erreur, mais une cause courante est que Polars essaie d'inférer le schéma à partir des 1000 premières lignes de votre fichier JSON, puis rencontre un schéma différent plus loin dans le fichier. Cela est généralement dû à certaines entrées ayant des clés supplémentaires qui n'étaient pas présentes dans les 1000 premières lignes.

Pour gérer de telles situations, nous pouvons indiquer à Polars d'utiliser un schéma spécifique lors de la lecture du fichier, ou nous pouvons forcer Polars à analyser l'intégralité du fichier pour en déduire le schéma. Cette dernière option peut prendre plus de temps, notamment pour les gros fichiers, mais elle évite l'erreur "InvalidEOF".

df = pl.read_json("fichier_gros.json", infer_schema_length=None)

En définissant infer_schema_length sur None, Polars est contraint de parcourir l'intégralité du fichier tout en déduisant le schéma. Cette opération peut prendre plus de temps, mais elle garantit que Polars reconnaît précisément le schéma de l'ensemble du fichier, éliminant ainsi les risques d'erreurs.

Grâce à ces techniques, vous pouvez traiter efficacement des tâches de traitement de données JSON dans Polars, de la transformation de chaînes JSON à la gestion de gros fichiers JSON. Polars ouvre vraiment de nouvelles possibilités pour le traitement efficace des données.

Visualisez votre DataFrame Polars avec PyGWalker

PyGWalker (opens in a new tab) est une bibliothèque Python open source qui vous permet de créer facilement des visualisations de données à partir de votre DataFrame Polars.

PyGWalker pour la visualisation de données (opens in a new tab)

Plus besoin d'effectuer des traitements compliqués avec du code Python, il vous suffit d'importer vos données et de faire glisser-déposer les variables pour créer toutes sortes de visualisations de données ! Voici une vidéo de démonstration rapide sur l'opération :


Voici comment utiliser PyGWalker dans votre notebook Jupyter :

pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)

Vous pouvez également l'essayer dans des Notebook Kaggle / Google Colab :

Exécuter PyGWalker dans un notebook Kaggle (opens in a new tab)Exécuter PyGWalker dans Google Colab (opens in a new tab)Donnez un ⭐️ à PyGWalker sur GitHub (opens in a new tab)
Exécuter PyGWalker dans le notebook Kaggle (opens in a new tab)Exécuter PyGWalker dans Google Colab (opens in a new tab)Exécuter PyGWalker dans Google Colab (opens in a new tab)

PyGWalker repose sur le soutien de notre communauté Open Source. N'oubliez pas de consulter PyGWalker GitHub (opens in a new tab) et de nous donner une étoile !

Foire aux questions

Voici quelques questions fréquemment posées concernant la manipulation des données JSON dans Polars :

Q: Pourquoi dois-je convertir les chaînes JSON en dictionnaires dans Polars ?
R: Polars ne fonctionne pas directement avec des dictionnaires Python. Au lieu de cela, il utilise le concept de « structs ». La conversion des chaînes JSON en structs vous permet d'effectuer des opérations basées sur des clés ou des valeurs spécifiques à l'intérieur de ces chaînes JSON.

Q: Que fait le paramètre 'infer_schema_length' dans la fonction 'read_json' ?
R: Le paramètre 'infer_schema_length' définit combien de lignes Polars doit analyser depuis le début de votre fichier JSON pour en déduire son schéma. S'il est défini sur None, Polars analysera l'intégralité du fichier, garantissant une meilleure compréhension du schéma au prix de temps de chargement plus longs.

Q: Que se passe-t-il si une clé n'est pas trouvée lors de l'utilisation de la fonction 'json_path_match' ?
R: Si la fonction 'json_path_match' ne trouve pas une clé, elle renvoie null. Ce comportement peut être utilisé pour filtrer les données en fonction de la présence ou de l'absence de clés spécifiques.