”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 faker 和 pandas Python 库创建用于测试的综合数据

使用 faker 和 pandas Python 库创建用于测试的综合数据

发布于2024-11-07
浏览:320

介绍:
全面的测试对于数据驱动的应用程序至关重要,但它通常依赖于拥有正确的数据集,而这些数据集可能并不总是可用。无论您是开发 Web 应用程序、机器学习模型还是后端系统,真实且结构化的数据对于正确验证和确保稳健的性能至关重要。由于隐私问题、许可限制或仅仅是相关数据的不可用,获取真实世界数据可能会受到限制。这就是合成数据变得有价值的地方。

在本博客中,我们将探讨如何使用Python为不同场景生成合成数据,包括:

  1. 相关表:表示一对多关系。
  2. 分层数据:常用于组织结构。
  3. 复杂关系:如招生系统中的多对多关系。

我们将利用 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)

Using faker and pandas Python Libraries to Create Synthetic Data for Testing

此代码使用 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)

Using faker and pandas Python Libraries to Create Synthetic Data for Testing

在本例中,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)

Using faker and pandas Python Libraries to Create Synthetic Data for Testing

生成员工表

接下来,我们生成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)

Using faker and pandas Python Libraries to Create Synthetic Data for Testing

这种层次结构通过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)

Using faker and pandas Python Libraries to Create Synthetic Data for Testing

生成学生表

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)

Using faker and pandas Python Libraries to Create Synthetic Data for Testing

生成课程报名表

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)

Using faker and pandas Python Libraries to Create Synthetic Data for Testing

在此示例中,我们创建一个链接表来表示学生和课程之间的多对多关系。


结论:
使用 Python 以及 Faker 和 Pandas 等库,您可以生成真实且多样化的合成数据集,以满足各种测试需求。在此博客中,我们介绍了:

  1. 相关表:展示客户和订单之间的一对多关系。
  2. 分层数据:说明部门和员工之间的父子关系。
  3. 复杂关系:模拟学生和课程之间的多对多关系。

这些示例为生成适合您需求的合成数据奠定了基础。进一步的增强功能,例如创建更复杂的关系、为特定数据库定制数据或扩展数据集以进行性能测试,可以将合成数据生成提升到一个新的水平。

这些示例为生成合成数据提供了坚实的基础。然而,可以进行进一步的增强以增加复杂性和特异性,例如:

  1. 数据库特定数据:为不同数据库系统定制数据生成(例如,SQL 与 NoSQL)。
  2. 更复杂的关系:创建额外的相互依赖关系,例如时间关系、多级层次结构或唯一约束。
  3. 扩展数据:生成更大的数据集以进行性能测试或压力测试,确保系统能够大规模处理现实世界的条件。 通过生成根据您的需求定制的合成数据,您可以模拟开发、测试和优化应用程序的实际条件,而无需依赖敏感或难以获取的数据集。

如果您喜欢这篇文章,请与您的朋友和同事分享。您可以在 LinkedIn 上与我联系,讨论任何进一步的想法。


版本声明 本文转载于:https://dev.to/rahulbhave/using-faker-and-pandas-python-libraries-to-create-synthetic-data-for-testing-4gn4?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 掌握图像分割:传统技术如何在数字时代仍然大放异彩
    掌握图像分割:传统技术如何在数字时代仍然大放异彩
    介绍 图像分割是计算机视觉中最基本的过程之一,它允许系统分解和分析图像内的各个区域。无论您是在处理对象识别、医学成像还是自动驾驶,分割都可以将图像分解为有意义的部分。 尽管深度学习模型在这项任务中越来越受欢迎,但数字图像处理中的传统技术仍然强大且实用。本文回顾的方法包括阈值处理、边...
    编程 发布于2024-11-08
  • 掌握 Angular Table 中可调整大小的列:开发人员分步指南
    掌握 Angular Table 中可调整大小的列:开发人员分步指南
    如何在 Angular 表中创建可调整大小的列:分步指南 Angular Material 表提供了一种时尚的数据显示方式。然而,用户通常需要额外的功能,例如调整表列大小以更好地控制数据显示的能力。在本指南中,我们将逐步介绍使用自定义指令在 Angular 表中创建可调整大小的列的...
    编程 发布于2024-11-08
  • 如何按子值升序对多维 PHP 数组进行排序?
    如何按子值升序对多维 PHP 数组进行排序?
    PHP:按子值对多维数组进行排序此问题旨在根据“mid”子值对多维 PHP 数组进行排序。为了实现这一点,响应者建议使用 usort 函数,它允许基于比较的排序。代码如下:function cmp($a, $b) { return $a["mid"] - $b[&...
    编程 发布于2024-11-08
  • 如何在 Django 中创建一个简单的调度程序
    如何在 Django 中创建一个简单的调度程序
    如果您需要每 X 分钟/秒等运行一个函数来进行一些清理,触发一些操作,您可以在线程模块和 django 自定义 cli 的帮助下执行一个简单的调度程序命令。 假设我想每 5 秒调用一个函数以在外部 API 上发布一些内容。 在您的 django 应用程序中创建一个名为 management 的文件夹...
    编程 发布于2024-11-08
  • 引导实用程序
    引导实用程序
    Bootstrap 实用程序是一组功能强大的类,可以让您的网站样式设置更轻松、更快捷,而无需编写自定义 CSS。让我们深入了解基础知识! 什么是 Bootstrap 实用程序? Bootstrap 实用程序是预定义的 CSS 类,您可以将它们直接应用于 HTML 元素以控制其外观或行为。这些实用程序...
    编程 发布于2024-11-07
  • 修复下拉菜单/工具提示等隐藏的溢出
    修复下拉菜单/工具提示等隐藏的溢出
    您是否曾尝试为您的按钮创建一个下拉列表,然后选择但随后被溢出隐藏阻止? 然后你该怎么做,然后你使用javascript将元素扔到DOM的根目录,然后根据触发元素矩形定位元素,每次布局更改时重新计算,发生滚动和调整窗口大小,不是很有效的。 首先我想说的是它还没有完全支持,但是现在有一个polyfill...
    编程 发布于2024-11-07
  • 如何使用中间件方法有效处理 Gin Web 应用程序中的错误?
    如何使用中间件方法有效处理 Gin Web 应用程序中的错误?
    增强 Gin 中的错误处理Gin 的自定义错误处理涉及使用中间件来处理错误响应。这允许错误逻辑与正常流程逻辑分离。错误处理中间件type appError struct { Code int Message string } func JSONAppErrorReporter(...
    编程 发布于2024-11-07
  • 如何使用 Python 和 Medium API 将文章发布到 Medium
    如何使用 Python 和 Medium API 将文章发布到 Medium
    介绍 作为使用 Obsidian 撰写文章的人,我经常发现自己在发布到 Medium 时需要手动复制和格式化我的内容。此过程可能非常耗时且重复,尤其是在处理 Markdown 文件时。为了简化我的工作流程,我决定开发一个 Python 脚本,自动将 Markdown 文件直接发布到...
    编程 发布于2024-11-07
  • 如何使用 Unicode 字符引用来表示 CSS 类名称中的百分比?
    如何使用 Unicode 字符引用来表示 CSS 类名称中的百分比?
    .container.\31 25\25在CSS中是什么意思?在CSS中,标识符可以包含特殊字符,例如反斜杠 ()。反斜杠字符在 CSS 中具有不同的用途,具体取决于上下文。转义字符在字符串中,反斜杠后跟换行符将被忽略。在字符串之外,反斜杠后跟换行符代表其自身。转义特殊字符反斜杠可用于转义特殊 CS...
    编程 发布于2024-11-07
  • 工作跟踪应用程序
    工作跟踪应用程序
    使用 MERN Stack 构建工作跟踪应用程序 在当今竞争激烈的就业市场中,在求职过程中保持井然有序可能具有挑战性。手动管理申请、面试和后续跟进很容易变得不堪重负。为了解决这个问题,我决定使用 MERN 堆栈构建一个作业跟踪应用程序。这个项目是一次有益的经历,使我能够将我的技术技...
    编程 发布于2024-11-07
  • C++ 中的“long”保证至少有 32 位吗?
    C++ 中的“long”保证至少有 32 位吗?
    long 保证有 32 位吗?尽管基于 C 标准的常见假设,但问题是 long 是否保证有至少 32 位。标准将基本整数类型分类为:sizeof(char) ≤ sizeof(short int) ≤ sizeof(int) ≤ sizeof(long int)然而,许多人认为基于此层次结构,lon...
    编程 发布于2024-11-07
  • 加权图类
    加权图类
    The WeightedGraph class extends AbstractGraph. The preceding chapter designed the Graph interface, the AbstractGraph class, and the UnweightedGraph cl...
    编程 发布于2024-11-07
  • 从新手到忍者:为开发人员释放 Git 的力量
    从新手到忍者:为开发人员释放 Git 的力量
    Git 是每个开发者工具包中不可或缺的工具。它不仅可以帮助您有效管理代码库,还可以与团队成员无缝协作。然而,开发人员常常忽视 Git 提供的一些强大的功能和工作流程。在本博客中,我们将探讨基本的 Git 提示和技巧,以帮助开发人员简化工作流程、更有效地管理分支、轻松解决冲突以及集成 GitHub A...
    编程 发布于2024-11-07
  • 通用选择器在现代浏览器中仍然是性能杀手吗?
    通用选择器在现代浏览器中仍然是性能杀手吗?
    通用选择器对性能的影响通用选择器 (*) 将 CSS 样式应用于文档中的所有元素。虽然它曾经被认为对性能有害,但现代浏览器的进步已经减轻了它的影响。等效规则通用选择器规则 (* { margin: 0; padding : 0; }) 在功能上等同于更具体的规则 (body, h1, p { mar...
    编程 发布于2024-11-07
  • Effect-TS 中的压缩选项:实用指南
    Effect-TS 中的压缩选项:实用指南
    Effect-TS 中的压缩选项:实用指南 在函数式编程中,以安全且可预测的方式组合多个可选值(表示为选项)是一项常见任务。 Effect-TS 提供了多种将选项“压缩”在一起的方法,允许您组合它们的值或根据特定规则选择一个。在本文中,我们将探讨压缩选项的三个关键函数:O.zipR...
    编程 发布于2024-11-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3