」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 faker 和 pandas Python 庫建立用於測試的綜合數據

使用 faker 和 pandas Python 庫建立用於測試的綜合數據

發佈於2024-11-07
瀏覽:467

介绍:
全面的测试对于数据驱动的应用程序至关重要,但它通常依赖于拥有正确的数据集,而这些数据集可能并不总是可用。无论您是开发 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如有侵犯,請聯絡study_golang@163 .com刪除
最新教學 更多>
  • 使用 HTML、CSS 和 JavaScript 建立簡單的密碼管理器
    使用 HTML、CSS 和 JavaScript 建立簡單的密碼管理器
    您是否厭倦了使用弱密碼或忘記登入憑證?在本教程中,我們將使用 HTML、CSS 和 JavaScript 建立一個簡單的密碼管理器。此密碼管理器將允許您安全地儲存您的登入憑證並在需要時檢索它們。 代碼:這裡
    程式設計 發佈於2024-11-07
  • 為什麼在向 Spring MVC 控制器發送 JSON 請求時收到 406(不可接受)錯誤?
    為什麼在向 Spring MVC 控制器發送 JSON 請求時收到 406(不可接受)錯誤?
    Spring JSON 請求返回406(不可接受)當嘗試向Spring MVC 控制器發送JSON 請求時,一些用戶遇到“ 406 不可接受」錯誤。此問題源自於請求的內容類型(“application/json”)與控制器的回應能力不符。 在 Spring MVC 中,控制器方法以「@Respons...
    程式設計 發佈於2024-11-07
  • 如何在 Chrome DevTools 中輕鬆識別和監控表單元素事件?
    如何在 Chrome DevTools 中輕鬆識別和監控表單元素事件?
    了解元素互動觸發的事件要在可自訂表單元素上正確識別和處理事件,必須了解互動時觸發的特定事件。 Chrome DevTools 提供了一個強大的工具,monitorEvents,來協助完成此過程。 使用monitorEvents()檢查目標元素: 右鍵單擊該元素並選擇“Inspect”或在DevToo...
    程式設計 發佈於2024-11-07
  • 不到一分鐘即可完成帶有身份驗證和用戶面板的 Laravel + React 項目
    不到一分鐘即可完成帶有身份驗證和用戶面板的 Laravel + React 項目
    我最近在X 上發布了一個視頻,其中我在不到一分鐘的時間內設置了一個帶有身份驗證和用戶個人資料頁面的Laravel React專案!我認為為任何喜歡遵循詳細指南的人分享書面版本會很有幫助。 在本指南中,我將向您展示如何使用React 前端和內建身份驗證快速設定新的Laravel 項目,所有這些都使用...
    程式設計 發佈於2024-11-07
  • Django 請求生命週期解釋
    Django 請求生命週期解釋
    In the world of web development, understanding the request life cycle is crucial for optimizing performance, debugging issues, and building robust app...
    程式設計 發佈於2024-11-07
  • 使用 OpenVINO 和 Postgres 建立快速且有效率的語意搜尋系統
    使用 OpenVINO 和 Postgres 建立快速且有效率的語意搜尋系統
    照片由 real-napster 在 Pixabay上拍摄 在我最近的一个项目中,我必须构建一个语义搜索系统,该系统可以高性能扩展并为报告搜索提供实时响应。我们在 AWS RDS 上使用 PostgreSQL 和 pgvector,并搭配 AWS Lambda 来实现这一目标。面临的挑战是允许用户...
    程式設計 發佈於2024-11-07
  • 如何消除 Matplotlib 大數字刻度標籤中的相對偏移?
    如何消除 Matplotlib 大數字刻度標籤中的相對偏移?
    刪除Matplotlib 軸中的相對偏移在Matplotlib 中針對大量數字進行繪圖可能會導致軸的刻度標籤出現相對偏移。為了說明這一點,請考慮以下繪圖:plot([1000, 1001, 1002], [1, 2, 3])這會在橫座標軸上產生刻度,如下圖所示:0.0 0.5 1.0...
    程式設計 發佈於2024-11-07
  • 為什麼 Python 正規表示式中有時會缺少 \'r\' 前綴?
    為什麼 Python 正規表示式中有時會缺少 \'r\' 前綴?
    Python 正規表示式:「r」前綴之謎在Python 正規表示式領域,神秘的「r」前綴經常引發人們對其必要性的質疑。為了闡明這個主題,讓我們深入研究一個令人費解的場景:丟失“r”的奇怪案例示例1 提出了一個令人費解的觀察結果:import re print(re.sub('\s ', ' ', '...
    程式設計 發佈於2024-11-07
  • 如何在沒有資料庫的情況下根據第一個下拉選擇自動更新下拉選項?
    如何在沒有資料庫的情況下根據第一個下拉選擇自動更新下拉選項?
    如何在不使用資料庫的情況下根據第一個下拉清單中的選擇自動更新第二個下拉清單中的選項您有兩個下拉列表,其中選項不是從資料庫中檢索的。第一個下拉清單允許使用者選擇一個類別。第二個下拉清單中的選項取決於第一個下拉清單中的選擇。 例如,如果使用者在第一個下拉清單中選擇First 選項,第二個下拉清單應顯示選...
    程式設計 發佈於2024-11-07
  • C 中的頭文件
    C 中的頭文件
    什麼是頭文件 C 中的頭文件是帶有「.h」副檔名的文件,其中包含函數、巨集、常數的聲明,有時還包含可以在多個原始檔之間共享的資料類型。 預處理器指令 預處理器指令是程式中的一行,它不是程式語句,而是實際上預處理器的命令。 例如:- #包括 #定義 在此指令中,#...
    程式設計 發佈於2024-11-07
  • 如何解決 Python 中的意外縮排錯誤:逐步指南
    如何解決 Python 中的意外縮排錯誤:逐步指南
    Python 中意外的縮排:解決指南縮排錯誤是 Python 程式設計師常見的挫折感。當一行程式碼的縮排多於或少於預期時,就會出現「意外縮排」錯誤,導致程式碼結構不正確。解決這個問題的方法如下:瞭解縮排規則Python利用縮排來區分程式碼區塊。每個子區塊(例如迴圈和條件語句)必須以一定數量的空格開頭...
    程式設計 發佈於2024-11-07
  • Python 的 Enter 和 Exit 魔術方法是什麼以及如何在上下文管理器中使用它們?
    Python 的 Enter 和 Exit 魔術方法是什麼以及如何在上下文管理器中使用它們?
    理解Python的神奇方法:enter與exitThe enter 和exit 方法是用於處理上下文管理器協定的特殊Python 函數。此協定支援在 with 語句中方便地使用對象,確保正確的初始化和清理。 當將with 語句與定義了enter 和exit 的物件一起使用時方法,它委託以下行為:_...
    程式設計 發佈於2024-11-07
  • 關於 UUID 您需要了解的一切。
    關於 UUID 您需要了解的一切。
    A 通用唯一标识符 (UUID) 是计算机系统中用于唯一标识信息的 128 位标签。 UUID 被设计为在空间和时间上都是唯一的,允许它们在没有中央权威的情况下独立生成,从而最大限度地减少重复的风险。 UUID 有多种用途,包括: 识别数据库中的记录。 标记分布式系统中的对象。 在唯一性至关重要的应...
    程式設計 發佈於2024-11-07
  • Java集合框架
    Java集合框架
    问什么是 Java Collection Framework? Ans Java Collection 框架是一个功能强大的内置库,提供了一组最常用数据结构和算法的优化实现。它广泛用于构建 Java 应用程序和解决实际软件开发问题挑战。 Java集合框架有何优势? Ans Java Collecti...
    程式設計 發佈於2024-11-07
  • 在 React 中為功能元件渲染 Props
    在 React 中為功能元件渲染 Props
    在 React 中,Render Props 是一種使用 function prop 在元件之間共享邏輯的技術。不使用子項或組合,而是將函數作為 prop 傳遞以動態呈現內容。這種方法適用於功能組件和鉤子。 以下是如何使用功能元件實作 Render Props 的範例: 例子 im...
    程式設計 發佈於2024-11-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3