
使用 Faker 生成合成数据集
作者 | Ideogram 提供图片
在本文中,您将学习到:
- 如何使用 Python 中的 Faker 库生成各种类型的合成数据。
- 创建单个数据记录和完整数据集的方法,以及如何将它们导出为不同的格式。
- 如何模拟现实世界中的数据缺陷(例如,缺失值、重复项)以用于测试目的,尤其是在 ETL 管道中。
引言
“数据是新的石油(或黄金)”这句经常被过度使用的短语在许多情况下确实有些道理,在这些情况下,获取足够的高质量数据来 undertaking 有洞察力的分析或构建有效的机器学习模型成为一种挑战。因此,合成数据生成是一种应对这一挑战的常用方法。得益于像 Faker 这样的 Python 库,生成合成数据以用于引导现有数据集、测试甚至匿名化敏感信息变得前所未有的容易。
本文介绍了用于生成合成数据集的 Faker 库。通过一个简单的实践教程,我们将探讨如何一次性生成单个记录或数据实例、完整数据集,以及如何将它们导出为不同的格式。代码演练采用双重视角
- 学习:我们将对几种可以生成的数据类型有一个基本的了解,以及如何准备好它们以供进一步处理,这得益于 Pandas 等流行的数据密集型库
- 测试:手头有一些生成的数据后,我们将提供一些关于如何在简化的 ETL(提取、转换、加载)管道的上下文中测试数据问题的提示,该管道摄取合成生成的事务数据。
不要感到不知所措:我们将采取一种温和的方法,以非常入门且相当直观的视角展示 Faker 的基本功能。
分步数据生成
1. 安装和导入 Faker
如果您是第一次使用 Faker,则需要按以下方式安装它
1 |
pip install Faker |
现在我们将导入必要的库和模块
1 2 3 |
from faker import Faker import pandas as pd import random |
2. 创建您自己的“Faker”
首先要做的是创建一个 Faker
类的实例,它能够生成不同类型的“假”数据——我个人更喜欢使用“合成”而不是“假”这个词,因此我将继续沿用它。我们还将为随机数生成器设置一个固定的种子:这是合成数据生成背后的基石元素。设置种子有助于使代码具有可重现性,并在必要时有效地进行调试。
1 2 |
fake = Faker() Faker.seed(42) |
3. 编写数据生成函数
接下来是代码中最关键的部分:生成合成的、类似真实世界的数据实例的函数。具体来说,我们将生成包含基本个人和社会人口统计学属性的银行客户记录。
1 2 3 4 5 6 7 8 9 10 11 12 |
def generate_user_for_learning(): """此函数生成类似真实世界的银行客户数据。""" return { "id": fake.uuid4(), "name": fake.name(), "email": fake.email() if random.random() > 0.1 else None, "phone": fake.phone_number(), "birthdate": fake.date_of_birth(minimum_age=16, maximum_age=85), "country": random.choice(["US", "UK", "India", "Germany", None]), "income": round(fake.pyfloat(left_digits=5, right_digits=2, positive=True), 2) if random.random() > 0.05 else -1000.00 } |
这可能信息量很大,所以让我们逐行进一步分析代码
- 该函数生成并返回一个代表银行客户的 Python 字典:字典键包含属性名,字典值包含当然是值。
"id"
属性包含一个使用uuid4()
函数生成的唯一用户标识符(UUID)。"name"
属性包含一个随机生成的客户姓名,借助name()
函数实现。- 同样,
"email"
属性包含一个随机生成的电子邮件地址,但在此情况下,电子邮件生成函数email()
有 10% 的几率不被使用,从而模拟了约 10% 的数据可能包含此属性的缺失值的几率。这是模拟真实世界数据缺陷的一种有趣方式。请注意,此处生成随机电子邮件地址的进程与前一个包含客户姓名的属性的进程是独立的,因此如果您希望客户姓名和电子邮件相关联,您可能需要使用一种替代的、可能不是随机的方法来根据客户姓名创建电子邮件地址。 - 如我们所见,其余属性的值也是通过使用专用的 Faker 函数生成的,从而在生成多种类型的数据方面提供了极大的灵活性,甚至支持定制级别,例如上面为出生日期属性指定的年龄范围。
choice()
函数用于在有限数量的选项内生成分类属性值。 "income"
属性值被生成为一个指定范围内的浮点值,四舍五入到小数点后两位。此外,有 5% 的几率将其设置为 -1000,这表示无效或缺失值:同样,这是一种模拟真实世界数据缺陷或错误的方法。
只需一行代码,我们就可以通过迭代调用此方法来创建任意数量的客户实例,并将它们存储在 Pandas DataFrame
对象中。
4. 调用函数创建数据
我们为 100 位客户这样做
1 2 |
users_df = pd.DataFrame([generate_user_for_learning() for _ in range(100)]) users_df.head() |
前几个数据实例应如下所示

用例:ETL 管道测试
假设另一个场景,我们有兴趣 **测试一个摄取银行交易数据的 ETL 管道**。以下代码生成一些简化的客户实例,这些实例的属性比前一个示例少,再加上一个包含与这些客户相关的银行交易的新数据集。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
def generate_user_for_testing(): return { "id": fake.uuid4(), "name": fake.name(), } def generate_transaction_for_user(user_id): return { "transaction_id": fake.uuid4() if random.random() > 0.02 else "DUPLICATE_ID", "user_id": user_id, "amount": round(random.uniform(-50, 5000), 2), "currency": random.choice(["USD", "EUR", "GBP", "BTC"]), "timestamp": fake.date_time_this_year().isoformat() } users_test = [generate_user_for_testing() for _ in range(50)] transactions_test = [generate_transaction_for_user(user["id"]) for user in users_test for _ in range(random.randint(1, 5))] df_users = pd.DataFrame(users_test) df_transactions = pd.DataFrame(transactions_test) print("Sample Transactions:") df_transactions.head() |
请注意,交易数据生成的设计是为了使 2% 的交易被标记为重复,并且还接受一些负值作为交易,以模拟收入和支付。
让我们看一些生成的交易

在这种情况下,尤其是在将交易收集到 ETL 管道中时,用于测试数据质量的关注领域可能包括
- 孤立的交易,即可能的交易,其
user_id
属性未与客户数据集中的任何用户 ID 相关联 - 重复的交易 ID
- 无效的货币代码
总结
本文介绍了 Python 的 Faker 库,并概述了其生成合成数据集的能力:这在数据稀缺的情况下是现实世界场景中的常见需求,以便能够进行分析、测试和在充足的逼真数据上训练机器学习模型。
暂无评论。