0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Python】DBテーブルのレコードと類似したダミーレコードを大量に生成する方法

Posted at

概要

ダミーDBを作成する際、とあるDBテーブルのレコードと類似したレコードを大量に入れたい、という状況になりました。
そこで、Pythonで大量にダミーデータを作成するコードを作成。

サンプルコード

以下、サンプルコードです。
100-500文字ランダムに日本語が入るカラムcommentがあるので、generate_random_textという関数を定義しています。また、sample_code1から5の数値が入るカラム、idは一意のものとします。

結果は、CSVファイルで出力されます。DBeaverとかだと、インポート機能がGUIで使えるのでダミーDBがすぐ出来上がります。

import os
import pandas as pd
import random
from datetime import datetime


def generate_random_text(min_length, max_length):
    # ランダムな長さのテキストを生成
    length = random.randint(min_length, max_length)
    text = ''.join(random.choice('あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん、。!?') for _ in range(length))
    return text

# 元のデータ
original_data = {
    "id": 0,
    "request_no": "test_12345678",
    "sample_code": 3,
    "comment": "テストテストテストテストテストテストテストテストテストテストテストテストテストテスト",
    "create_date": "2023-10-05 09:18:17",
    "update_date": "2023-10-05 09:18:17",
}

# 1,000,000件の似たレコードを生成
num_records = 1000000
generated_records = []

for i in range(num_records):
    new_record = original_data.copy()
    new_record["id"] = original_data["id"] + i + 1
    new_record["request_no"] = f"test_{random.randint(10000000, 99999999)}"
    new_record["sample_code"] = random.randint(1, 5)
    new_record["comment"] = generate_random_text(100, 500) 
    current_datetime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    new_record["create_date"] = current_datetime
    new_record["update_date"] = current_datetime
    
    generated_records.append(new_record)

# DataFrameに変換
df = pd.DataFrame(generated_records)

# 結果をCSVファイルに書き込む
output_file_name = "dummy_data.csv"
output_file_path = os.path.join('dummy_data', output_file_name)
df.to_csv(output_file_path, index=False)

print(f"{output_file_name} の作成が完了しました。")

似たようなファイルが大量にある場合は、同じディレクトリ(dummy_generation_tool)に全ておいた上で、以下のコマンドを実行すると一括生成してくれて便利です。上述のPrintで進捗結果も出力されます。

find dummy_generation_tool -type f -name "*.py" -exec python {} \;

その他:アレンジ

例えば、request_noを、ランダムではなく1から順番に採番したいときは、以下のようにすればOKです。
08dとすることで8桁の幅で表示するようゼロパディングできます。

new_record["request_no"] = f"test_{i+1:08d}"

また、以下のように上限を決めてMAXまでいったら1に折り返す、としたい場合はmax_valueで以下のように指定してあげれば、50000まで採番され、その後折り返しが始まります。

num_records = 1000000
generated_records = []
max_value = 50000

for i in range(num_records):
    value = (i % max_value) + 1
    new_record = original_data.copy()    
    new_record["request_no"] = f"test_{value:08d}"

value = (i % max_value) + 1は、ループ変数imax_valueで割った余りに1を加えて、valueを計算します。これにより、value1からmax_value(ここでは50000)までの範囲で循環的に変化します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?