概要
ダミーDBを作成する際、とあるDBテーブルのレコードと類似したレコードを大量に入れたい、という状況になりました。
そこで、Pythonで大量にダミーデータを作成するコードを作成。
サンプルコード
以下、サンプルコードです。
100-500文字ランダムに日本語が入るカラムcomment
があるので、generate_random_text
という関数を定義しています。また、sample_code
は1
から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
は、ループ変数i
をmax_value
で割った余りに1を加えて、value
を計算します。これにより、value
は1
からmax_value
(ここでは50000
)までの範囲で循環的に変化します。