Skip to content

Latest commit

 

History

History
256 lines (182 loc) · 8.81 KB

4181.md

File metadata and controls

256 lines (182 loc) · 8.81 KB

使用 Faker 在 Python 中生成简单的合成数据

www.kdnuggets.com/2021/11/easy-synthetic-data-python-faker.html

评论图像

图片来源:geralt 在 Pixabay

真实数据,从现实世界中获取,是数据科学的黄金标准,这也许显而易见。当然,诀窍是能够找到项目所需的真实数据。有时你会很幸运,所需的数据就在你的指尖上,形式和数量都正好符合需求。


我们的前三个课程推荐

1. Google 网络安全证书 - 快速进入网络安全职业生涯。

2. Google 数据分析专业证书 - 提升你的数据分析技能

3. Google IT 支持专业证书 - 支持你的组织的 IT


然而,现实世界的数据通常不足以满足项目需求。在这种情况下,合成数据可以用来替代真实数据,或用来增加数据集的规模。虽然制造数据的方法很多,有些方法远比其他方法复杂,但仍有许多相对简单的选项可供选择,Faker 是其中之一。

从 Faker 的 文档

Faker 是一个生成虚假数据的 Python 包。无论你需要启动数据库、创建漂亮的 XML 文档、填充持久层以进行压力测试,还是匿名化从生产服务中获取的数据,Faker 都适合你。

可以通过 pip 安装 Faker:

pip install faker

导入并实例化 Faker 的过程如下:

from faker import Faker
fake = Faker()

基本的 Faker 使用方法

Faker 使用起来非常简单。首先,让我们看一些例子。

首先,让我们生成一个虚假的名字。

print(fake.name())
Deborah Brooks

那么其他几种数据类型怎么样?

# generate an address
print(fake.address())

# generate a phone number
print(fake.phone_number())

# generate a date
print(fake.date())

# generate a social security number
print(fake.ssn())

# generate some text
print(fake.text())
123 Danielle Forges Suite 506
Stevenborough, RI 36008

968-491-2711

1974-05-27

651-27-9994

Weight where while method. Rock final environmental gas provide. Remember continue sure. Create resource determine fine. Else red across participant. People must interesting spend some us.

Faker 优化

如果你对特定地区的数据感兴趣呢?例如,我是否对生成在墨西哥发现的西班牙名字感兴趣?

fake = Faker(['es_MX'])
for i in range(10):
    print(fake.name())
Diana Lovato
Ing. Ariadna Palacios
Salvador de la Fuente
Margarita Naranjo
Alvaro Prado Melgar
Tomás Menchaca
Conchita Francisca Velázquez Zedillo
Ivonne Ana Luisa Bueno
Ramiro Raquel Vélez Urbina
Porfirio Esther Irizarry Varela

通过使用 Faker 的权重调整功能,可以进一步优化生成的输出:

Faker 构造函数接受一个与性能相关的参数,称为use_weighting。它指定是否尝试使值的频率与现实世界的频率匹配(例如,英文名字 Gary 的出现频率会比名字 Lorimer 高得多)。如果use_weightingFalse,则所有项目被选中的概率相等,且选择过程会更快。默认值为True

让我们看看一些美国英语示例是如何工作的:

fake = Faker(['en_US'], use_weighting=True)
for i in range(20):
    print(fake.name())
Mary Mckinney
Margaret Small
Dominic Carter
Elizabeth Gibson
Kelsey Garcia
Chelsea Bradford
Robert West
Timothy Howe
Gary Turner
Cynthia Strong
Joshua Henry
Amanda Jenkins
Jacqueline Daniels
Catherine Jones
Desiree Hodge
Shannon Mason DVM
Marcia West
Dustin Parrish
Christopher Rodriguez
Brett Webb

将此与类似输出使用加权的情况进行比较:

fake = Faker(['en_US'], use_weighting=False)
for i in range(20):
    print(fake.name())
Mr. Benjamin Horton
Miss Maria Hardin
Tina Good DDS
Dr. Terry Barr MD
Meredith Mason
Roberta Velasquez
Mr. Tim Woods V
Marilyn Conway
Mr. Dwayne Leblanc III
Dr. Dan Krause IV
Mia Newman DVM
Thomas Small
Joseph Holmes
Dr. Tanner Zhang
Alan Dixon
Miss Rebecca Davila DVM
Joseph Becker MD
Dr. Erin Pugh PhD
Mr. Ernest Juarez
Ross Thompson

请注意,例如,生成的“样本”中医生的比例不成比例。

更全面的示例

假设我们想为一家国际公司生成多个虚假的客户数据记录,我们想模拟真实世界中的命名分布,并希望将这些数据保存到 CSV 文件中,以便在数据科学任务中稍后使用。为了清理数据,我们还将用逗号替换生成的地址中的换行符,并完全删除生成文本中的换行符。

这里有一段代码摘录可以做到这一点,展示了 Faker 在几行代码中的强大功能。

from faker import Faker
import pandas as pd

fake = Faker(['en_US', 'en_UK', 'it_IT', 'de_DE', 'fr_FR'], use_weighting=True)

customers = {}

for i in range(0, 10000):
    customers[i]={}
    customers[i]['id'] = i+1
    customers[i]['name'] = fake.name()
    customers[i]['address'] = fake.address().replace('\n', ', ')
    customers[i]['phone_number'] = fake.phone_number()
    customers[i]['dob'] = fake.date()
    customers[i]['note'] = fake.text().replace('\n', ' ')

df = pd.DataFrame(customers).T
print(df)

df.to_csv('customer_data.csv', index=False)
         id                   name  ...         dob                                               note
0         1        Burkhardt Junck  ...  1982-08-11  Across important glass stop. Score include rel...
1         2          Ilja Weihmann  ...  1975-03-24  Iusto velit aspernatur nemo. Aliquid ipsum ita...
2         3          Agnolo Tafuri  ...  1990-10-03  Aspernatur fugit voluptatibus. Cumque accusant...
3         4   Sig. Lamberto Cutuli  ...  1973-01-15  Maiores temporibus beatae. Ipsam non autem ist...
4         5          Marcus Turner  ...  2005-12-17  Témoin âge élever loi.\nFatiguer auteur autori...
...     ...                    ...  ...         ...                                                ...
9995   9996  Miss Alexandra Waters  ...  1985-01-20  Commodi omnis assumenda sit ratione non. Commo...
9996   9997         Natasha Harris  ...  2003-10-26  Voluptatibus dolore a aspernatur facere. Aliqu...
9997   9998           Adrien Marin  ...  1983-05-29  Et unde iure. Reiciendis doloribus dignissimos...
9998   9999        Nermin Heydrich  ...  2005-03-29  Plan moitié charge note convenir.\nSang précip...
9999  10000           Samuel Allen  ...  2011-09-29  Total gun economy adult as nor. Age late gas p...

[10000 rows x 6 columns]

我们还拥有一个 customer_data.csv 文件,包含我们所有的数据,以便进一步处理和根据需要使用。

图片

生成的客户数据 CSV 文件截图

上述特定类型的数据生成器——如姓名、地址、电话等——被称为提供者。了解如何通过启用 Faker 生成特定类型的数据来扩展其功能,使用标准提供者社区提供者

查看 Faker 的GitHub 仓库文档以获取更多功能,并立即创建自己的数据集。

相关

  • 使用 Python 创建具有异常签名的合成时间序列

  • 教 AI 用合成数据分类时间序列模式

  • 3 种数据采集、标注和增强工具

更多相关话题