Python : créer des données factices
Que votre besoin soit pour du test, de l’illustration ou de la présentation, vous avez régulièrement besoin de données factices mais cohérentes.
Communément, c’est des données de type nom/prénom. D’autres fois, ce sera des adresses. Puis des adresses email…
C’est toujours un peu pénible. Autant pour un nom/prénom, on va utiliser le même, mais quand on en a besoin de plusieurs, on se heurte à la limite de notre imagination. Et ne parlons pas des données comme les adresses.
Heureusement, il y a un excellent outil en Python pour nous aider : Faker.
Installation
Faker est disponible sur les repos publics et s’installe donc de la manière classique :
pip install Faker
Usage de base
Faker propose un module qui contient, en gros, une classe dont l’instance sera un générateur de fakes.
On commence donc par créer un objet de type faker.Faker
from faker import Faker fake = Faker()
Et nous pouvons maintenant utiliser cet objet pour générer des données. Faker possède pour cela des méthodes spécifiques.
fake.name() Out[3]: 'Alexander Choi' fake.address() Out[4]: '8337 David Ramp\nChristinemouth, ME 84436'
Bim, c’est tout…
Évidemment, si vous lui demandez plusieurs données, Faker les produira de manière « aléatoire » :
for _ in range(10): print(fake.name()) Leah Lawrence Lisa Thomas James Jones Emily Martinez Robin Lawrence Andrew Hill Alexandra Smith Frank Garcia Eric Cruz Mary Russell
Ainsi, on peut facilement générer une liste avec les comprehension lists :
[fake.name() for _ in range(10)] Out[4]: ['Karen Acosta', 'Cody Kennedy', 'Stacy Marsh', 'Derek Love', 'Corey Shelton', 'Leslie Nelson', 'Steven Carr', 'Thomas Parker', 'Richard Haynes', 'Brad Crane']
Des sources de données avec des providers
Faker permet de générer des données grâce à des providers, c’est à dire des composants dédiés à un type de données. Il y a un certain nombre de providers standards. Ceux-ci couvrent déjà les cas les plus communs comme les noms, adresses mais aussi des titres d’emplois, des données réseau (adresses mail, adresses IP…), des informations géographiques, des informations bancaires…
Faker est ouvert aux providers issus de la communauté. Ceci permet (et vous permet) d’étendre l’outil pour générer des données qui n’étaient initialement pas prévues par la lib.
Les providers sont des objets qui seront chargés au sein de Faker et leurs méthodes seront transposées à l’objet fake. Ainsi, le provider faker.providers.person fournit un ensemble de méthodes parmi lesquelles :
fake.first_name() Out[7]: 'Alan' fake.first_name_female() Out[8]: 'Ashley' fake.first_name_male() Out[9]: 'Brandon' fake.last_name() Out[10]: 'Johnson' fake.name() Out[11]: 'Lisa Bates' fake.prefix() Out[12]: 'Mx.'
Il ne s’agit ici que de quelques exemples, je vous invite à aller voir la documentation qui est évidemment plus exhaustive.
La localisation
Jusqu’ici, la lib a l’air cool mais les données ne nous sont pas bien pratiques… En effet, les noms sont à consonance anglophone et les adresses ne correspondent pas à des adresses françaises. C’est quelque chose que nous pouvons bien entendu configurer par la prise en charge de la localisation.
Par défaut, Faker est en « en_US ». Pour une autre localisation, il faut créer l’objet en fournissant en argument la locale.
fake = Faker('fr_FR') fake.name() Out[14]: 'David Maréchal' fake.address() Out[15]: '31, rue Maurice Turpin\n94762 Sainte Gérard-la-Forêt'
Vous voyez que nous avons des données qui, à défaut d’être réelles, sont cohérentes.
Ainsi, vous pouvez créer des profiles différents en fonction de vos besoins. Si vous avez besoin de gérer plusieurs langues de manière séparées, vous créerez autant d’objets. Depuis la version 3, Faker vous permet également de préciser plusieurs locales. Dans ce cas, le paramètre doit être une liste de chaines de caractères.
fake = Faker(['fr_FR', 'it_IT', 'ja_JP']) for _ in range(8): print(fake.name()) Fabia Mazzeo-Juvara Eraldo Stoppani Annetta Spinelli Cristina Conti Rémy Lombard Emma Carocci Marc Moulin 高橋 零
Un peu d’adaptation
Faker est très pratique pour créer facilement des données factices. Mais pour des cas complexes, il sera nécessaire de créer nos propres générateurs. Prenons l’exemple d’une famille cohérente : un homme, une femme et un enfant. Ils doivent, par exemple, avoir le même nom.
Nous devrons donc créer une fonction pour produire cette information et plus globalement, obtenir la données selon notre besoin.
def get_family() -> tuple: fake = Faker('fr-FR') family_name = fake.last_name() father_first_name = fake.first_name_male() mother_first_name = fake.first_name_female() kid_first_name = fake.first_name() return (kid_first_name, family_name), (father_first_name, family_name), \ (mother_first_name, family_name)
Cette fonction crée un N-uplet contenant le nom de l’enfant, celui du père puis de la mère, avec le même nom de famille.
Ce n’est pas un exemple que je prends au hasard, c’est une fonction que j’utilise pour générer les données de test ou d’anonymisation pour mes scripts de gestion des infos scolaires où l’information est l’enfant et ses deux parents. Évidemment, si vous voulez ajouter du réalisme, il faudrait ajouter de l’aléatoire pour des parents n’ayant pas le même nom, des familles mono-parentales, des parents du même sexe…
Un usage en ligne de commande
Petite cerise sur le gâteau, Faker est également disponible en ligne de commande. Il y a évidemment plusieurs options de lancement.
$ faker address 12847 Aaron Crest Apt. 295 Helenside, NV 04996 $ faker -r=3 -s=";" name Rebecca Zamora; Stephen Andersen; Bernard Miller;
Cette option est assez utile si vous avez besoin de générer des données factices en dehors d’un code Python.
En conclusion
Faker permet de générer facilement des données factices, aléatoires mais cohérentes. Avec un peu d’adaptation, on a même un générateur de données plus complexes (comme des familles). Pour un des, c’est une lib à avoir dans sa boite à outils. Et si vous utilisez un autre langage, il est possible qu’il y ai quelque chose d’équivalent.
Si vous avez aimé ce post, n’hésitez pas à laisser un commentaire ci-dessous ou sur la page Facebook 😉
À propos de... Darko Stankovski
iT guy, photographe et papa 3.0, je vous fais partager mon expérience et découvertes dans ces domaines. Vous pouvez me suivre sur les liens ci-dessous.