怎么用脚本生成模拟数据

wen 实用脚本 5

本文目录导读:

怎么用脚本生成模拟数据

  1. Python - Faker库(最常用)
  2. Python - 纯随机数据生成
  3. Node.js - 使用Faker或Chance
  4. SQL - 直接生成SQL数据
  5. Bash脚本快速生成
  6. 真实场景模拟示例
  7. 使用建议

我来介绍几种生成模拟数据的方法,使用不同的脚本语言:

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)

使用建议

  1. 选择工具:根据项目需求选择Python、Node.js或Pure SQL
  2. 数据量:使用循环或批量生成,注意内存使用
  3. 数据真实性:使用Faker等库生成接近真实的数据
  4. 格式输出:支持CSV、JSON、SQL等多种格式
  5. 周期性:可以加入日期范围生成时间序列数据

这些方法可以根据你的具体需求调整,生成适合测试和开发使用的模拟数据。

抱歉,评论功能暂时关闭!