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

画像






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







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







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


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







一般的な情報



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







いや コード 役職
1 cs



チェコ語
2 da



デンマーク語
3 de



ドイツ人
4 de-at



オーストリアのドイツ語
5 de-ch



スイスドイツ語
6 en



英語
7 en-au



オーストラリア英語
8 en-ca



カナダ英語
9 en-gb



イギリス英語
10 es



スペイン語
11 es-mx



メキシコのスペイン語
12 fa



ペルシャ語(ペルシア語)
13 fi



フィンランド語
14 fr



フランス語
15 hu



ハンガリー語
16 is



アイスランド語
17 it



イタリア人
18 ja



日本語
19 ko



韓国人
20 nl



オランダ人
21 nl-be



ベルギーのオランダ語
22 no



ノルウェー語
23 pl



ポーランド語
24 pt



ポルトガル語
25 pt-br



ブラジルポルトガル語
26 ru



ロシア語
27 sv



スウェーデン語
28 tr



トルコ語
29日 uk



ウクライナ語
30 zh



中国語


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







上記のリストに加えて、 builtins



サブパッケージからインポートできる国固有のデータもbuiltins



されています。







いや プロバイダー 方法
1 USASpecProvider tracking_number()、ssn()、パーソナリティ()
2 JapanSpecProvider full_to_half()、half_to_full()
2 RussiaSpecProvider patronymic()、passport_series()、passport_number()、snils()
2 BrazilSpecProvider cpf()、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







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








All Articles