本文目录导读:

我来介绍几种生成模拟数据的方法,使用不同的脚本语言:
Python - Faker库(最常用)
# 安装: pip install faker
from faker import Faker
import pandas as pd
import random
from datetime import datetime, timedelta
fake = Faker('zh_CN') # 中文数据
# 生成用户数据
def generate_users(n=100):
users = []
for _ in range(n):
user = {
'id': fake.uuid4(),
'name': fake.name(),
'email': fake.email(),
'phone': fake.phone_number(),
'address': fake.address(),
'created_at': fake.date_time_this_year()
}
users.append(user)
return pd.DataFrame(users)
# 生成订单数据
def generate_orders(user_ids, n=500):
orders = []
products = ['手机', '电脑', '衣服', '书籍', '食品', '家电']
for _ in range(n):
order = {
'order_id': fake.uuid4(),
'user_id': random.choice(user_ids),
'product': random.choice(products),
'amount': round(random.uniform(10, 5000), 2),
'status': random.choice(['pending', 'paid', 'shipped', 'completed']),
'created_at': fake.date_time_between('-30d', 'now')
}
orders.append(order)
return pd.DataFrame(orders)
# 使用示例
users_df = generate_users(100)
orders_df = generate_orders(users_df['id'].tolist(), 500)
# 保存为CSV
users_df.to_csv('users.csv', index=False)
orders_df.to_csv('orders.csv', index=False)
Python - 纯随机数据生成
import random
import json
import csv
from datetime import datetime, timedelta
def generate_random_data():
# 生成销售数据
with open('sales_data.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['date', 'region', 'product', 'sales', 'quantity'])
regions = ['North', 'South', 'East', 'West']
products = ['A', 'B', 'C', 'D']
for _ in range(1000):
date = datetime.now() - timedelta(days=random.randint(0, 365))
region = random.choice(regions)
product = random.choice(products)
sales = round(random.uniform(100, 10000), 2)
quantity = random.randint(1, 100)
writer.writerow([date.strftime('%Y-%m-%d'), region, product, sales, quantity])
# 生成JSON格式数据
data = []
for i in range(100):
record = {
'id': i,
'name': f'User_{i}',
'age': random.randint(18, 80),
'score': round(random.uniform(0, 100), 2),
'active': random.choice([True, False]),
'tags': random.sample(['premium', 'vip', 'normal', 'trial'], random.randint(1, 3))
}
data.append(record)
with open('users.json', 'w') as f:
json.dump(data, f, indent=2)
generate_random_data()
Node.js - 使用Faker或Chance
// 安装: npm install @faker-js/faker
const { faker } = require('@faker-js/faker');
// 生成用户数据
function generateUsers(count = 100) {
const users = [];
for (let i = 0; i < count; i++) {
users.push({
id: faker.string.uuid(),
name: faker.person.fullName(),
email: faker.internet.email(),
username: faker.internet.username(),
password: faker.internet.password(),
avatar: faker.image.avatar(),
createdAt: faker.date.past()
});
}
return users;
}
// 生成交易数据
function generateTransactions(count = 500) {
const transactions = [];
for (let i = 0; i < count; i++) {
transactions.push({
id: faker.string.uuid(),
userId: faker.string.uuid(),
amount: faker.finance.amount(),
currency: faker.finance.currencyCode(),
type: faker.helpers.arrayElement(['credit', 'debit']),
description: faker.finance.transactionDescription(),
date: faker.date.recent()
});
}
return transactions;
}
// 导出为JSON
const fs = require('fs');
fs.writeFileSync('mock-data.json', JSON.stringify({
users: generateUsers(100),
transactions: generateTransactions(500)
}, null, 2));
SQL - 直接生成SQL数据
-- MySQL生成模拟数据
DELIMITER $$
CREATE PROCEDURE generate_data()
BEGIN
DECLARE i INT DEFAULT 1;
-- 创建临时表
CREATE TEMPORARY TABLE IF NOT EXISTS temp_data (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100),
created_at DATETIME
);
-- 循环插入数据
WHILE i <= 100 DO
INSERT INTO temp_data (name, email, created_at)
VALUES (
CONCAT('User_', i),
CONCAT('user', i, '@example.com'),
NOW() - INTERVAL FLOOR(RAND()*365) DAY
);
SET i = i + 1;
END WHILE;
SELECT * FROM temp_data;
DROP TEMPORARY TABLE temp_data;
END$$
DELIMITER ;
-- 调用函数生成数据
CALL generate_data();
Bash脚本快速生成
#!/bin/bash
# 生成CSV数据
generate_csv() {
echo "id,name,age,email"
for i in $(seq 1 100); do
name="User_$i"
age=$((RANDOM % 80 + 18))
email="user$i@example.com"
echo "$i,$name,$age,$email"
done
}
# 生成JSON数据
generate_json() {
echo "["
for i in $(seq 1 100); do
if [ $i -gt 1 ]; then echo ","; fi
echo "{\"id\": $i, \"name\": \"User_$i\", \"age\": $((RANDOM % 80 + 18))}"
done
echo "]"
}
# 使用
generate_csv > mock_data.csv
generate_json > mock_data.json
真实场景模拟示例
# 模拟时间序列数据
import numpy as np
import pandas as pd
from datetime import datetime, timedelta
def generate_time_series():
# 生成一年的传感器数据
dates = pd.date_range('2024-01-01', '2024-12-31', freq='H')
# 带有季节性和趋势的数据
t = np.arange(len(dates))
seasonal = np.sin(2 * np.pi * t / (365 * 24)) * 10
trend = t * 0.01
noise = np.random.normal(0, 2, len(dates))
temperature = 25 + seasonal + trend + noise
humidity = 60 + seasonal * 0.5 + np.random.normal(0, 5, len(dates))
df = pd.DataFrame({
'timestamp': dates,
'temperature': temperature,
'humidity': humidity,
'sensor_id': np.random.choice([1, 2, 3, 4], len(dates))
})
df.to_csv('sensor_data.csv', index=False)
# 生成电商数据
def generate_ecommerce_data():
customers = 1000
products = 100
orders = 10000
# 创建用户
users = pd.DataFrame({
'user_id': range(customers),
'age': np.random.randint(18, 80, customers),
'gender': np.random.choice(['M', 'F'], customers),
'country': np.random.choice(['CN', 'US', 'UK', 'JP', 'DE'], customers)
})
# 创建产品
product_df = pd.DataFrame({
'product_id': range(products),
'price': np.random.uniform(10, 1000, products),
'category': np.random.choice(['electronics', 'clothing', 'books', 'food'], products)
})
# 生成订单
orders_df = pd.DataFrame({
'order_id': range(orders),
'user_id': np.random.choice(users['user_id'], orders),
'product_id': np.random.choice(product_df['product_id'], orders),
'quantity': np.random.randint(1, 10, orders),
'order_date': pd.date_range('2024-01-01', periods=orders, freq='H')
})
# 计算总金额
orders_df = orders_df.merge(product_df, on='product_id')
orders_df['total_amount'] = orders_df['price'] * orders_df['quantity']
return users, product_df, orders_df
# 使用
users, products, orders = generate_ecommerce_data()
users.to_csv('customers.csv', index=False)
products.to_csv('products.csv', index=False)
orders.to_csv('orders.csv', index=False)
使用建议
- 选择工具:根据项目需求选择Python、Node.js或Pure SQL
- 数据量:使用循环或批量生成,注意内存使用
- 数据真实性:使用Faker等库生成接近真实的数据
- 格式输出:支持CSV、JSON、SQL等多种格式
- 周期性:可以加入日期范围生成时间序列数据
这些方法可以根据你的具体需求调整,生成适合测试和开发使用的模拟数据。