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.

Vous aimerez aussi...

Laisser un commentaire