Генерація фіктивних даних з Elizabeth


Elizabeth — це бібліотека для мови програмування Python, яка допомагає генерувати фіктивні дані. Один з найпростіших прикладів використання бібліотеки — це заповнення баз даних для додатків на Flask або Django. На даний момент бібліотека підтримує 16 мовних стандартів і 18 класів-провайдерів, що надають різного роду дані.
Можливість генерувати фіктивні, але в той же час валідні дані буває дуже корисна при розробці програм, які передбачають роботу з базою даних. Ручне заповнення бази даних представляється досить складним та виснажливим процесом, але по-справжньому все ускладнюється в той момент, коли потрібно згенерувати не 10-15 користувачів, а 100-150 тисяч. У цій статті я постараюся звернути вашу увагу на інструмент, який значно спрощує процес початкового завантаження бази даних на етапі тестування.
Загальна інформація
У поданій нижче таблиці наведені класи-провайдери.





















Provider Опис 1 Address Адресні дані (назви вулиць, номери будинків, індекси тощо) 2 Business Дані для бізнесу (компанії, типи компаній, копірайти і т. п.) 3 Code Коди (ISBN, EAN, IMEI і т. п.) 4 ClothingSizes Розміри одягу (міжнародні, європейський, американські тощо) 5 Datetime Час (день тижня, місяць, рік, день народження тощо) 6 Development Розробка (версія, мова програмування, стек і т. п.) 7 File Файли (розширення, типи файлів і т. п.) 8 Food Їжа (овочі, фрукти, одиниці вимірювання і т. п.) 9 Personal Персональні дані (ім'я, прізвище, вік, email і т. п.) 10 Text Текстові дані (пропозиція, заголовок, текст і т. п.) 11 Transport Транспорт (модель вантажного автомобіля тощо) 12 Network Мережа (IPv4, IPv6, MAC address тощо) 13 Science Наукові дані (хімічний елемент, формул тощо) 14 Internet Інтернет (facebook, twitter, vk тощо) 15 Hardware Залізо (resolution, cpu, graphics etc.)* 16 Numbers Числові дані (floats, простих, digit etc.)* 17 Path Шляхи (коренева директорія, робоча директорія тощо) 18 Generic Все в одному (коли використовується тільки одна локаль)
На момент написання цієї статті (20.12.2016) бібліотека підтримує 16 мовних стандартів, які перераховані у таблиці, що наведена нижче:


















ISO Код Заголовок Самоназва 1
da
Датська Dansk 2
de
Німецька Deutsch 3
en
Англійська English 4
es
Іспанська Español 5
fa
Перська فارسی 6
fi
Фінська Suomi 7
fr
Французький Français 8
is
Ісландська Íslenska 9
it
Італійська Italiano 10
nl
Нідерландська Nederlands 11
no
Норвезька Norsk 12
pl
Польський Polski 13
pt
Португальська Português 14
pt-br
Бразильський Португальський Português Brasileiro 15
uk
Українська Українська 16
sv
Шведський Svenska
Установка
Установка
Elizabeth
проводиться як звичайно, тобто за допомогою пакетного менеджера
pip
:
➜ ~ pip install elizabeth

Генерація
Спочатку я планував показати генерацію даних на прикладі невеликого Flask-додатки (блогу), але вирішив відмовитися від цієї ідеї, бо не всі знайомі з Flask. З цієї причини я буду показувати все на чистому Python. У разі, якщо ви захочете перенести все в свій проект, то вам потрібно всього лише визначити статичний метод в тілі вашої моделі і викликати його в той момент, коли потрібно виконати початкову завантаження БД.
Наприклад так:
>>> users = Користувачі() # Створити екземпляр класу-моделі.
>>> users._bootstrap(count=40000) # Згенерувати 40к записів.

Приклади
Хотілося б підкреслити, що я буду приводити в прикладах тільки базові можливості бібліотеки та, в основному, обійдуся кількома класами-провайдерами, бо їх там дуже багато, щоб розповідати про всіх. Якщо ви зацікавитесь, то можете знайти посилання на проект і документацію в самому кінці статті та самостійно вивчити все.
Бібліотека влаштована досить просто і все, що вам необхідно для того, щоб почати працювати з даними — це створити екземпляр класу-провайдера, як показано в прикладі нижче.
from elizabeth import Personal

user = Personal('is')

for _ in range(0, 9):
print(user.full_name(gender='male'))

Karl Brynjúlfsson
Rögnvald Eiðsson
Vésteinn Ríkharðsson
Friðleifur Granason
Fjarki Arngarðsson
Hafsteinn Þrymsson
Sívar Kakalason
Grímnir Unason
Gýmir Þórðsson

Приклади
Код нижче створить 50к email адрес.
>>> user = Personal('ru')
>>> emails = [user.email(gender='female') for _ in range(0, 50000)]

Висновок (скорочений):
[
lvana6108@gmail.com', 'demetrice3816@live.com', 
'alayna7278@yahoo.com', 'maida5494@outlook.com', ...
]

Згенерувати ім'я, день народження і групу крові:
from elizabeth import Generic

g = Generic('pl') # згідно стандарту ISO 639-1, pl - це код Польщі.

for _ in range(0, 5):
name = g.personal.full_name()
birthday = g.datetime.birthday(readable=True)
blood = g.personal.blood_type()
print(name, '-', birthday, '/', blood)

Ibolya Smolik - Listopad 11, 1997 / B−
Lonisława Podsiadło - Styczeń 20, 1989 / AB+
Loritta Boguski - Październik 11, 1990 / A−
Laurentyna Kowalczyk - Lipiec 16, 1993 / B−
Gelazyna Wawrzyniak - Październik 12, 2000 / B

Можете генерувати і користувачів різної статі:
from import random choice

user = Personal (en)

for _ in range(0, 20):
title = user.title(type_='academic')
name = user.full_name(choice(['female', 'male']))
print('{0}, {1}'.format(name, title))

Sid Powell, M. Des
Vanita Christensen, M. D.
Vania Grant, Доктор Філософії
Chester Valenzuela, MSc
Georgeann Sanders, D. Ed.
Dong Clay, Доктор Філософії
Lala Vang, Доктор Філософії
Alden Nieves, M. A.
Deloise Erickson, B. A.
Willow Cox, M. D.
Belia Lowery, Prof.
Shirley Thompson, M. Des
Tracey Dickson, PhD
Alexis Newton, D. Ed.
Leland Gay, D. Ed.
Noel Joseph, MMath
Oda Ryan, B. A.
Alan Sharp, B. A.
Bernardina Solomon, Prof.
Paul Caldwell, M. D.

Згенерувати фіктивних власників картки Visa:
user = Personal (en)

def get_card(sex='female'):
owner = {
'owner': user.full_name(sex),
'exp_date': user.credit_card_expiration_date(maximum=21),
'number': user.credit_card_number(card_type='visa')
}
return owner

for _ in range(0, 10):
print(get_card())

{'exp_date': '02/20', 'owner': 'Laverna Morrison', 'card_number': '4920 3598 2121 3328'}
{'exp_date': '11/19', 'owner': 'Melany Martinez', 'card_number': '4980 9423 5464 1201'}
{'exp_date': '01/19', 'owner': 'Cleora Mcfarland', 'card_number': '4085 8037 5801 9703'}
{'exp_date': '06/21', 'owner': 'Masako Nielsen', 'card_number': '4987 3977 4806 4598'}
{'exp_date': '02/18', 'owner': 'Ji Reid', 'card_number': '4371 5151 1188 6594'}
{'exp_date': '12/19', 'owner': 'Machelle Huff', 'card_number': '4053 2310 5641 6849'}
{'exp_date': '05/19', 'owner': 'Violette Hurst', 'card_number': '4333 5939 9634 8805'}
{'exp_date': '07/16', 'owner': 'Shenika Moreno', 'card_number': '4509 3525 9097 4027'}
{'exp_date': '09/20', 'owner': 'Gianna Thompson', 'card_number': '4637 4384 3001 5237'}
{'exp_date': '05/19', 'owner': 'Pa Mccoy', 'card_number': '4290 9075 7914 2028'}

Згенерувати модель вантажного автомобіля (якщо сайт орієнтований на вантажоперевезення або на іншу діяльність, пов'язану з транспортом):
>>> trans = Transport()

>>> for _ in range(0, 5):
print(trans.truck())

Seddon-2537 IM
Karrier-7799 UN
Minerva-5567 YC
Hyundai-2808 XR
LIAZ-7174 RM

Ну або можна вказати маску моделі:
>>> for _ in range(0, 5):
print(trans.truck(model_mask="##@")) # ## - числа, @ - літери

Henschel-16G
Bean-44D
Unic-82S
Ford-05Q
Kalmar-58C

А ось так можна згенерувати текст:
>>> text = Text('ru')
>>> print(text.text(quantity=5)) # quantity - показник кількості пропозицій.

'Мова включає в себе засоби породження паралельних легковагих процесів і їх взаємодії через обмін асинхронними повідомленнями у відповідності з моделлю акторів. Python підтримує декілька парадигм програмування, в тому числі структурний, об'єктно-орієнтоване, функціональне, імперативне і аспектно-орієнтоване. Наприклад, визначення функції, яка використовує співставлення зі зразком, для вибору одного з варіантів обчислення або вилучення елемента даних складовою структури, нагадує рівняння. Зіставлення зі зразком поширене навіть на бітові рядки, що спрощує реалізацію телекомунікаційних протоколів. Haskell — стандартизований чистий функціональний мова програмування загального призначення.'

Отримати алфавіт поточної локалі можна так:
>>> text = Text('fa')
>>> print(text.alphabet())

['ا', 'ب', 'پ', 'ت', 'ث', 'ج', 'چ', 'ح', 'خ', 'د', 'ذ', 'ر', 'ز', 'ژ', 'س', 'ش', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ', 'ف', 'ق', 'ک', 'گ', 'ل', 'م', 'ن', '.', 'ніші', 'ی']

Можна отримати список слів:
>>> text = Text('pt-br')
>>> print(text.words(quantity=50))

['poder', 'de', 'maior', 'só', 'cima', 'Singularidades', 'mudou', 'ficará', 'năo', 'vossas', 'prata', 'chorar', 'c', 'Equilíbrio', 'drogas', 'paul', 'simplesmente', 'querido', 'vendo', 'material', 'apartamento', 'postar', 'básico', 'com', 'papá', 'cor', 'símbolo', 'ocupado', 'armas', 'vidro', 'roda', 'droga', 'serve', 'menina', 'cor', 'semente', 'solução', 'controle', 'desapareceu', 'livros', 'voltar', 'melhores', 'Menos', 'quantas', 'pensar', 'estas', 'jogar', 'personagem', 'personagem', 'cabelo']

Можна згенерувати назва вулиці:
>>> address = Address('ru')
>>> street = address.address()

'вул. Хабаровська 651'

Або отримати суб'єкт РФ:
>>> subject = address.state()
>>> print(subject)

'Кіровська область'

Згенерувати координати:
>>> for _ in range(15):
print(address.coordinates())

{'latitude': -28.362892454682246, 'longitude': 11.512065821275826}
{'latitude': 88.6508382607752, 'longitude': 106.65769171105143}
{'latitude': 37.83559264558106, 'longitude': 152.45098344872065}
{'latitude': -13.876545618251413, 'longitude': -52.192814272082956}
{'latitude': 66.24928144869963, 'longitude': -128.7755343668871}
{'latitude': 38.294693362179856, 'longitude': -179.1208031527886}
{'latitude': -52.987692529476554, 'longitude': -59.705094559802475}
{'latitude': -33.69813204096576, 'longitude': 72.54315315052486}
{'latitude': 83.91496334322997, 'longitude': 105.58095303015153}
{'latitude': -83.45909366537177, 'longitude': -13.56788050796456}
{'latitude': 20.41176475353275, 'longitude': 151.7257568261699}
{'latitude': 63.52570687889795, 'longitude': 158.04375817974056}
{'latitude': -78.51081206017261, 'longitude': 47.50148838136573}
{'latitude': -81.94335735575271, 'longitude': -84.44100935967519}
{'latitude': -80.30372095039073, 'longitude': 21.819487429596222}

насправді можливостей дуже багато і тому паморочиться голова, коли намагаєшся придумати щось конкретне, але якщо ви придумали, то поділіться зі мною.
Github: lk-geimfari/elizabeth
Read the Docs: elizabeth
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.