Mimesisを使用したダミーデータの生成:パートI

画像

Mimesisは、さまざまな目的でダミーデータを生成するのに役立つPythonプログラミング言語のライブラリです。 このライブラリは、標準のPython言語ライブラリに含まれているツールを使用して記述されているため、サードパーティの依存関係はありません。 現時点では、ライブラリは30の言語標準(ロシア語を含む)と、あらゆる種類のデータを提供する20を超えるクラスのプロバイダーをサポートしています。


架空の、同時に有効なデータを生成する機能は、データベースを操作するアプリケーションを開発するときに非常に役立ちます。 データベースへの手動入力は、非常に時間がかかり、少なくとも3つの段階で実行されるプロセスのようです-これ:


  1. 必要な情報を収集します。
  2. 収集されたデータの後処理。
  3. データジェネレーターのプログラミング。

この難しいタスクは、10〜15人のユーザーではなく、10〜15万人のユーザー(またはその他の種類のデータ)を生成する必要があるとき、本当に複雑です。 この記事と後続の2つの記事では、テストデータの生成、データベースのロード、および一般的なテストのプロセスを大幅に簡素化するツールに注目するようにします。


一般的な情報


サポートされている言語標準:


いやコード役職
1csチェコ語
2daデンマーク語
3deドイツ人
4de-atオーストリアのドイツ語
5de-chスイスドイツ語
6en英語
7en-auオーストラリア英語
8en-caカナダ英語
9en-gbイギリス英語
10esスペイン語
11es-mxメキシコのスペイン語
12faペルシャ語(ペルシア語)
13fiフィンランド語
14frフランス語
15huハンガリー語
16isアイスランド語
17itイタリア人
18ja日本語
19ko韓国人
20nlオランダ人
21nl-beベルギーのオランダ語
22noノルウェー語
23plポーランド語
24ptポルトガル語
25pt-brブラジルポルトガル語
26ruロシア語
27svスウェーデン語
28trトルコ語
29日ukウクライナ語
30zh中国語

サポートされているプロバイダークラスのリストは常に拡大しています。 サポートされているすべてのデータプロバイダーがここにリストされています


上記のリストに加えて、 builtinsサブパッケージからインポートできる国固有のデータもbuiltinsされています。


いやプロバイダー方法
1USASpecProvidertracking_number()、ssn()、パーソナリティ()
2JapanSpecProviderfull_to_half()、half_to_full()
2RussiaSpecProviderpatronymic()、passport_series()、passport_number()、snils()
2BrazilSpecProvidercpf()、cnpj()

設置


Mimesisインストールは通常どおり、つまりpipパッケージマネージャーを使用して実行されます。 ライブラリの最新の最新バージョンをインストールするには、次のコマンドを実行します。


 ➜ ~ pip install mimesis 

何らかの理由でpipを使用してパッケージをインストールできない場合は、次のように手動でインストールしてみてください。


 (venv) ➜ git clone https://github.com/lk-geimfari/mimesis.git (venv) ➜ cd mimesis/ (venv) ➜ python3 setup.py install #  (venv) ➜ make install 

ライブラリはPython 3.5 +のみ動作することに注意してください 。 開発者はPython 2.7サポートを追加する予定はありません。


世代


最初は、Flaskの小さなWebアプリケーションの例を使用してデータ生成を表示することを計画していましたが、Flaskに慣れているわけではなく、誰もが修正を望んでいないという理由で、このアイデアを放棄することにしました。 したがって、すべてを純粋なPythonで表示します。 FlaskまたはDjangoでプロジェクトにすべてを転送する場合は、現在のモデルに関連付けられているすべての操作を実行する静的メソッドを定義し、例に示すようにデータベースをブートストラップする必要があるときに呼び出すだけです。以下。


Flaskのモデル( Flask-SQLAlchemy )は次のようになります。


 class Patient(db.Model): id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(120), unique=True) phone_number = db.Column(db.String(25)) full_name = db.Column(db.String(100)) weight = db.Column(db.String(64)) height = db.Column(db.String(64)) blood_type = db.Column(db.String(64)) def __init__(self, **kwargs): super(Patient, self).__init__(**kwargs) @staticmethod def _bootstrap(count=2000, locale='en'): from mimesis.providers import Personal person = Personal(locale) for _ in range(count): patient = Patient( email=person.email(), phone_number=person.telephone(), full_name=person.full_name(gender='female'), weight=person.weight(), height=person.height(), blood_type=person.blood_type() ) db.session.add(patient) try: db.session.commit() except Exception: db.session.rollback() 

シェルモードに移動します。


 (venv) ➜ python3 manage.py shell 

そして、データベースと実験モデルが利用可能であることを確認した後、データを生成します。


 >>> db <SQLAlchemy engine='sqlite:///db.sqlite'> >>> Patient <class 'app.models.Patient'> >>> Patient()._bootstrap(count=4000, locale='ru') #  4    . 

はじめに


例では、ライブラリの基本的な機能のみを提供し、基本的には、最も一般的なプロバイダークラスのいくつかでうまくいくことに注意したいと思います。 記事が図書館への関心を喚起する場合、記事の最後に役立つリンクを見つけて、すべてを自分で調べることができます。


ライブラリは非常に単純に構成されており、データの操作を開始するために必要なのは、プロバイダークラスのインスタンスを作成することだけです。 Webアプリケーションで最も一般的なデータは、ユーザーなどのユーザーの個人データです。 このようなデータを生成するために、以下に示すように、ロケールコードを文字列として受け取る特別なプロバイダークラスPersonal()があります。


 >>> from mimesis import Personal #   -     . >>> person = Personal('is') #    . >>> for _ in range(0, 3): ... person.full_name(gender='male') `Karl Brynjúlfsson` `Rögnvald Eiðsson` `Vésteinn Ríkharðsson` 

ほとんどすべてのWebアプリケーションでは、登録時に電子メールアドレスが必要です。 ライブラリは、もちろん、電子メールアドレスを生成する機能をサポートします。これは、以下に示すように、 Personal()クラスのemail()メソッドを使用して行われます。


 # : >>> person.email(gender='female') >>> 'lvana6108@gmail.com' # : >>> person.email(gender='male') 'john2454@yandex.com' 

上記の方法では、アプリケーションが単一のプロバイダークラスではなく複数のプロバイダークラスを使用する場合、コードをわずかに汚染する可能性がある小さな問題があります。 そのような場合、 Generic()オブジェクトを使用する必要があります。これにより、以下に示すように、単一のオブジェクトからすべてのプロバイダーにアクセスできます。


 >>> from mimesis import Generic >>> #   ISO 639-1, pl -   . >>> g = Generic('pl') >>> g.personal.full_name() 'Lonisława Podsiadło' >>> g.datetime.birthday(readable=True) 'Listopad 11, 1997' >>> g.personal.blood_type() 'A−' 

データを結合すると、十分なスペースが得られます。 たとえば、Visaカード(またはMasterCard、Maestro)の架空の所有者(女性)を作成できます。


 >>> 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, 3): ... 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'} 

上記のように、ライブラリはあらゆる場合のデータを含む20以上のクラスのプロバイダーをサポートします(そうでない場合は、この恐ろしい誤解を修正してPRを待っています)。 たとえば、輸送または輸送に関連する他のアクティビティに焦点を当てたアプリケーションを開発していて、輸送モデルを生成する必要がある場合、輸送データを含むTransport() provider class Transport()を使用して簡単にこれを行うことができます。


 >>> from mimesis import Transport >>> trans = Transport() >>> for _ in range(0, 5): ... trans.truck() 'Seddon-2537 IM' 'Karrier-7799 UN' 'Minerva-5567 YC' 'Hyundai-2808 XR' 'LIAZ-7174 RM' 

または、トランスポートモデルのマスクを指定できます。


 >>> for _ in range(0, 5): ... trans.truck(model_mask="##@") # # - , @ -  

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

多くの場合、Webアプリケーションをテストする場合(ブログのテストが主な例です)、テキストデータ( など)を生成する必要があり 。 テスト中にテキストを手動で操作するのは長く退屈で、MimesisはText()プロバイダークラスのおかげでこれを回避します。


 >>> from mimesis import Text >>> text = Text('ru') >>> text.text(quantity=3) # quantity -   . '                    . Python    ,    , -, ,   -. ,  ,     ,             ,  .' 

ランダムな単語のリストを取得できます。


 >>> text = Text('pt-br') >>> text.words(quantity=5) ['poder', 'de', 'maior', 'só', 'cima'] 

ストリート名を生成:


 >>> from mimesis import Address >>> address = Address('ru') >>> address.address() '.  651' 

サブジェクト/州/県の名前は、選択した言語標準が属する奇妙なものです。 この場合、それはロシア連邦の主題です:


 >>> address.state() ' ' 

座標を生成します:


 >>> address.coordinates() {'latitude': -28.362892454682246, 'longitude': 11.512065821275826} 

ライブラリには、キリル言語をローマ字化するツールもあります(執筆時点では、ロシア語とウクライナ語のみがサポートされています)。


 >>> from mimesis.decorators import romanized >>> @romanized('ru') ... def name_ru(): ... return ' ' ... >>> @romanized('uk') >>> def name_uk(): ... return 'іі ' ... >>> name_ru() 'Veronika Denisova' >>> name_uk() 'Emіlіja Akulenko' 

実際、多くの機会があり、データがより高く価値があるように見えるコンテキストで、非常に多くのより明白な例を思いつくことができます。 読者からのそのような例を待っています。 プロジェクトでライブラリを使用して成功した経験についてお読みいただければ幸いです。


便利なリンク:


ここでは、記事の2番目の部分を見つけることができます。
ここでは、この記事の拡張版と、さまざまなトピックに関する他の多くの興味深い記事を読むことができます。


githublk-geimfari / mimesis
ドキュメントを読む: mimesis


ご清聴ありがとうございました!



Source: https://habr.com/ru/post/J318120/


All Articles