Mimesis: идеальное решение для генерации данных

a3b14a7f79097a3cc70ee120bfd91ca3.png

Сбор данных имеет решающее значение для каждого проекта, связанного с машинным обучением. Однако не всегда искомые данные существуют или общедоступны. Во многих случаях получение данных является дорогостоящим или затрудненным из-за внешних условий. Кроме того, правила конфиденциальности влияют на способы использования или распространения набора данных. По всем этим причинам использование синтетических данных является хорошей альтернативой, поскольку с их помощью можно удовлетворить те же потребности без особых усилий.

В этой статье мы рассмотрим один из лучших пакетов для генерации синтетических данных.

Что такое Mimesis?

Mimesis (/mɪˈmiːsɪs) — это высокопроизводительный генератор синтетических данных различных типов, включая личную информацию, даты, адреса и многое другое. Данная библиотека предназначена для генерации реалистичных и точных данных для использования в средах тестирования и разработки. Ее также можно использовать для анонимизации и аугментации данных.

Почему Mimesis?

  • Предлагает простой дизайн и понятную документацию для упрощения генерации данных.

  • Может генерировать данные на 34 языках, включая русский.

  • Самый быстрый генератор данных среди решений на Python.

  • Предоставляет данные, специфичные для определенных регионов.

  • Не требует никаких модулей, кроме стандартной библиотеки Python.

Установка

Чтобы установить mimesis, просто используйте pip:

pip install mimesis

У Mimesis нет жестких зависимостей, но чтобы добавить поддержку часовых поясов для некоторых методов провайдера Datetime, необходимо установить pytz.

С чего начать?

Процесс использования Mimesis включает импорт необходимого провайдера, локали и перечислений (если требуется). Затем создается экземпляр провайдера и вызывается нужный метод с соответствующими параметрами.

from mimesis import Person
from mimesis.locales import Locale
from mimesis.enums import Gender
person = Person(Locale.EN)

person.full_name(gender=Gender.FEMALE)
# Output: 'Antonetta Garrison'

person.full_name(gender=Gender.MALE)
# Output: 'Jordon Hall'

Что сделал приведенный выше код?

  1. Импорт провайдера Person из mimesis. Экземпляр этого класса будет служить провайдером персональных данных.

  2. Импорт объекта Locale, который используется в качестве параметра для провайдеров данных, зависящих от местности. В данном случае (Locale.EN) — English (United States).

  3. Импорт Gender из mimesis.enum модуля, который используется в качестве параметра для full_name()

  4. Генерация случайного женское полного имени.

  5. Генерация случайного мужского полного имени.

Класс Generic

Если требуются данные на каком-либо одном языке, то предпочтительнее использовать класс Gender, предоставляющий доступ ко всем провайдерам класса через один объект, а не через несколько отдельных провайдеров класса. Использование Gender позволяет избавиться от нескольких лишних строк кода.

from mimesis import Generic
from mimesis.locales import Locale
generic = Generic(locale=Locale.EN)

generic.person.username()
# Output: 'sherley3354'

generic.datetime.date()
# Output: '14-05-2007'

Подробнее про локали

При создании провайдеров можно указать локаль, и они будут возвращать данные, соответствующие языку или стране, связанной с этой локалью:

from mimesis import Address  #импорт провайдера 
from mimesis.locales import Locale #импорт объекта Locale

de = Address(locale=Locale.DE) #немецкий
ru = Address(locale=Locale.RU) #русский

de.region()
# Output: 'Brandenburg'

ru.federal_subject()
# Output: 'Алтайский край'

de.address()
# Output: 'Mainzer Landstraße 912'

ru.address()
# Output: 'ул. Пехотная 125'

В настоящее время Mimesis включает поддержку 34 различных языков:

from mimesis import Locale, Person

for locale in Locale:
    persona = Person(locale)
    print(f"{persona.locale}: {persona.full_name()}")

# Output:     
# cs: Kolombín Sviták
# da: Tønnes Just
# de: Hubert Schuster
# de-at: Leni Dylus
# de-ch: Urs Zenklusen
# el: Κώστας Μήτζου
# en: Floria Potts
# en-au: Elvina Medina
# en-ca: Lucas Padilla
# en-gb: Shanelle Harvey
# es: Marcos Izquierdo
# es-mx: Camila Hernández
# et: Urvo Smirnov
# fa: نیشا شیرازی
# fi: Ulla Koponen
# fr: Lou-Anne Groleau
# hu: Dusánka Cziffra
# is: Arndór Siguroddsdóttir
# it: Arrigo Altavilla
# ja: 未来 又吉
# kk: Адырбай Қамалова
# ko: 세영 동방
# nl: Saar Grevinck
# nl-be: Nine Pauwels
# no: Anved Andresen
# pl: Michał Borowski
# pt: Parcidio Fernandes
# pt-br: Loela Carmo
# ru: Ава Булгакова
# sk: Emil Nagy
# sv: Offe Hussein
# tr: Zümrüt Kutlay
# uk: Ія Баленко
# zh: 煜桐 通

Data Providers

Mimesis поддерживает более двадцати различных провайдеров данных, которые могут предоставлять данные, связанные с едой, людьми, компьютерным оборудованием, транспортом, адресами и многим другим.

Существует два типа провайдеров:

  • Локально-зависимые провайдеры (эти провайдеры предлагают данные, характерные для конкретного населенного пункта/страны).

  • Локально-независимые провайдеры (эти провайдеры предлагают данные, которые являются универсальными и применимы для всех стран).

Вот пример провайдера, зависящего от локали:

from mimesis import Person
from mimesis.locales import Locale

person = Person(locale=Locale.EN)

person.name()
# Output: 'John'

*Если не указать локаль, то по дефолту будет использоваться Locale.EN.

Локально-независимые провайдеры не требуют указания локали:

from mimesis import Code

code = Code()

code.imei()
# Output: '353918052107063'

Для генерации данных, характерных для определенных стран, есть built-in провайдеры с локально специфичными данными в специальном подпакете mimesis.builtins

from mimesis.builtins import USASpecProvider
from mimesis.builtins import BrazilSpecProvider
from mimesis.builtins import RussiaSpecProvider
from mimesis.enums import Gender

us = USASpecProvider()
print(f"ssn:{us.ssn()}") # ssn - номер социального страхования в США
# Output: ssn:561-67-8858 


br = BrazilSpecProvider()
print(f"CPF:{br.cpf()}") # cpf - индивидуальный номер налогоплательщика в Бразилии
# Output: CPF:194.331.779-83


ru = RussiaSpecProvider()
print(f"Отчество:{ru.patronymic(gender=Gender.FEMALE)}")
# Output: Отчество: Владимировна

Генерация структурированных данных 

Field и Schema

Для генерации данных по схеме необходимо создать экземпляр объекта Field, который принимает любую строку, представляющую имя провайдера данных. После этого описать схему в лямбда-функции (или любом другом вызываемом объекте), передать ее объекту Schema и вызвать метод create().

from mimesis import Field, Fieldset, Schema
from mimesis.enums import Gender, TimestampFormat
from mimesis.locales import Locale

field = Field(locale=Locale.EN)
fieldset = Fieldset(locale=Locale.EN)

schema = Schema(
    schema=lambda: {
        "pk": field("increment"),
        "uid": field("uuid"),
        "name": field("text.word"),
        "version": field("version", pre_release=True),
        "timestamp": field("timestamp", fmt=TimestampFormat.POSIX),
        "owner": {
            "email": field("person.email", domains=["mimesis.name"]),
            "token": field("token_hex"),
            "creator": field("full_name", gender=Gender.FEMALE),
        },
        "apps": fieldset(
            "text.word", i=5, key=lambda name: {"name": name, "id": field("uuid")}
        ),
    },
    iterations=2,
)
schema.create()

Schema представляет собой итератор, поэтому по ней можно перебираться, например так:

from mimesis import Schema, Field
from mimesis.locales import Locale

field = Field(Locale.DE)

schema = Schema(
    schema=lambda: {
        "pk": field("increment"),
        "name": field("full_name"),
        "email": field("email", domains=["example.org"]),
    },
    iterations=100,
)


for obj in schema:
    print(obj)

Fieldset и Pandas

Основное различие между Field и Fieldset заключается в том, что Fieldset генерирует набор (на самом деле list) значений для данного поля, в то время как Field генерирует одно значение.

С помощью Fieldset можно создавать pandas датафреймы:

import pandas as pd
from mimesis import Fieldset
from mimesis.locales import Locale

fs = Fieldset(locale=Locale.EN, i=5)

df = pd.DataFrame.from_dict({
    "ID": fs("increment"),
    "Name": fs("person.full_name"),
    "Email": fs("email"),
    "Phone": fs("telephone", mask="+1 (###) #5#-7#9#"),
})

print(df)

Output:

ID             Name                          Email              Phone
1     Jamal Woodard              ford1925@live.com  +1 (202) 752-7396
2       Loma Farley               seq1926@live.com  +1 (762) 655-7893
3  Kiersten Barrera      relationship1991@duck.com  +1 (588) 956-7099
4   Jesus Frederick  troubleshooting1901@gmail.com  +1 (514) 255-7091
5   Blondell Bolton       strongly2081@example.com  +1 (327) 952-7799

Export

Данные могут быть экспортированы в форматах JSON, CSV, OBJ:

from mimesis.enums import TimestampFormat
from mimesis.locales import Locale
from mimesis.keys import maybe
from mimesis.schema import Field, Schema

field = Field(locale=Locale.EN)
schema = Schema(
    schema=lambda: {
        "pk": field("increment"),
        "name": field("text.word", key=maybe("N/A", probability=0.2)),
        "version": field("version"),
        "timestamp": field("timestamp", TimestampFormat.RFC_3339),
    },
    iterations=1000
)
schema.to_csv(file_path='data.csv')
schema.to_json(file_path='data.json')
schema.to_pickle(file_path='data.obj')

Заключение

Использование Mimesis — это эффективный способ генерации синтетических наборов данных. Данная статья — это лишь знакомство с данной библиотекой. Для более глубокого понимания советую ознакомиться с официальной документацией.

Также оставляю несколько ссылок с информацией об основных генераторах данных:

Спасибо за внимание!

© Habrahabr.ru