介绍:
全面的测试对于数据驱动的应用程序至关重要,但它通常依赖于拥有正确的数据集,而这些数据集可能并不总是可用。无论您是开发 Web 应用程序、机器学习模型还是后端系统,真实且结构化的数据对于正确验证和确保稳健的性能至关重要。由于隐私问题、许可限制或仅仅是相关数据的不可用,获取真实世界数据可能会受到限制。这就是合成数据变得有价值的地方。
在本博客中,我们将探讨如何使用Python为不同场景生成合成数据,包括:
我们将利用 faker 和 pandas 库为这些用例创建真实的数据集。
示例 1:为客户和订单创建综合数据(一对多关系)
在许多应用中,数据存储在具有外键关系的多个表中。让我们为客户及其订单生成综合数据。一个客户可以下多个订单,代表一对多的关系。
生成客户表
Customers 表包含基本信息,例如 CustomerID、姓名和电子邮件地址。
import pandas as pd from faker import Faker import random fake = Faker() def generate_customers(num_customers): customers = [] for _ in range(num_customers): customer_id = fake.uuid4() name = fake.name() email = fake.email() customers.append({'CustomerID': customer_id, 'CustomerName': name, 'Email': email}) return pd.DataFrame(customers) customers_df = generate_customers(10)
此代码使用 Faker 生成 10 个随机客户,以创建真实的姓名和电子邮件地址。
生成订单表
现在,我们生成 Orders 表,其中每个订单通过 CustomerID 与客户关联。
def generate_orders(customers_df, num_orders): orders = [] for _ in range(num_orders): order_id = fake.uuid4() customer_id = random.choice(customers_df['CustomerID'].tolist()) product = fake.random_element(elements=('Laptop', 'Phone', 'Tablet', 'Headphones')) price = round(random.uniform(100, 2000), 2) orders.append({'OrderID': order_id, 'CustomerID': customer_id, 'Product': product, 'Price': price}) return pd.DataFrame(orders) orders_df = generate_orders(customers_df, 30)
在本例中,Orders 表使用 CustomerID 将每个订单链接到客户。每个客户可以下多个订单,形成一对多的关系。
示例 2:生成部门和员工的层次结构数据
层次结构数据通常用于部门有多名员工的组织环境中。让我们模拟一个具有部门的组织,每个部门都有多名员工。
生成部门表
Departments 表包含每个部门唯一的 DepartmentID、名称和经理。
def generate_departments(num_departments): departments = [] for _ in range(num_departments): department_id = fake.uuid4() department_name = fake.company_suffix() manager = fake.name() departments.append({'DepartmentID': department_id, 'DepartmentName': department_name, 'Manager': manager}) return pd.DataFrame(departments) departments_df = generate_departments(10)
生成员工表
接下来,我们生成Employees表,其中每个员工通过DepartmentID与一个部门相关联。
def generate_employees(departments_df, num_employees): employees = [] for _ in range(num_employees): employee_id = fake.uuid4() employee_name = fake.name() email = fake.email() department_id = random.choice(departments_df['DepartmentID'].tolist()) salary = round(random.uniform(40000, 120000), 2) employees.append({ 'EmployeeID': employee_id, 'EmployeeName': employee_name, 'Email': email, 'DepartmentID': department_id, 'Salary': salary }) return pd.DataFrame(employees) employees_df = generate_employees(departments_df, 100)
这种层次结构通过DepartmentID将每个员工与一个部门联系起来,形成父子关系。
示例 3:模拟课程注册的多对多关系
在某些场景中,存在多对多关系,其中一个实体与许多其他实体相关。让我们用注册多个课程的学生来模拟这一点,其中每个课程都有多个学生。
生成课程表
def generate_courses(num_courses): courses = [] for _ in range(num_courses): course_id = fake.uuid4() course_name = fake.bs().title() instructor = fake.name() courses.append({'CourseID': course_id, 'CourseName': course_name, 'Instructor': instructor}) return pd.DataFrame(courses) courses_df = generate_courses(20)
生成学生表
def generate_students(num_students): students = [] for _ in range(num_students): student_id = fake.uuid4() student_name = fake.name() email = fake.email() students.append({'StudentID': student_id, 'StudentName': student_name, 'Email': email}) return pd.DataFrame(students) students_df = generate_students(50) print(students_df)
生成课程报名表
CourseEnrollments 表捕获学生和课程之间的多对多关系。
def generate_course_enrollments(students_df, courses_df, num_enrollments): enrollments = [] for _ in range(num_enrollments): enrollment_id = fake.uuid4() student_id = random.choice(students_df['StudentID'].tolist()) course_id = random.choice(courses_df['CourseID'].tolist()) enrollment_date = fake.date_this_year() enrollments.append({ 'EnrollmentID': enrollment_id, 'StudentID': student_id, 'CourseID': course_id, 'EnrollmentDate': enrollment_date }) return pd.DataFrame(enrollments) enrollments_df = generate_course_enrollments(students_df, courses_df, 200)
在此示例中,我们创建一个链接表来表示学生和课程之间的多对多关系。
结论:
使用 Python 以及 Faker 和 Pandas 等库,您可以生成真实且多样化的合成数据集,以满足各种测试需求。在此博客中,我们介绍了:
这些示例为生成适合您需求的合成数据奠定了基础。进一步的增强功能,例如创建更复杂的关系、为特定数据库定制数据或扩展数据集以进行性能测试,可以将合成数据生成提升到一个新的水平。
这些示例为生成合成数据提供了坚实的基础。然而,可以进行进一步的增强以增加复杂性和特异性,例如:
如果您喜欢这篇文章,请与您的朋友和同事分享。您可以在 LinkedIn 上与我联系,讨论任何进一步的想法。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3