用python SDV生成合成数据
在本文中,我们将学习如何借助 python SDV 库生成合成数据。 每个应用程序都需要数据来测试端到端功能或测试性能。有时批量生成数据并不容易,有时我们感兴趣的数据无法向公众提供。为了解决这些问题,我们需要一些工具来帮助我们根据提供的结构或特定格式生成数据。 SDV 是一个帮助我们生成合成数据的 python 库。它以一些表、多个表或一些时间序列数据作为输入来理解数据的格式和结构,并生成具有相同
在本文中,我们将学习如何借助 python SDV 库生成合成数据。
每个应用程序都需要数据来测试端到端功能或测试性能。有时批量生成数据并不容易,有时我们感兴趣的数据无法向公众提供。为了解决这些问题,我们需要一些工具来帮助我们根据提供的结构或特定格式生成数据。
SDV 是一个帮助我们生成合成数据的 python 库。它以一些表、多个表或一些时间序列数据作为输入来理解数据的格式和结构,并生成具有相同结构和格式的新合成数据。在内部,SDV 使用多种概率图形建模和基于深度学习的技术。它支持多种数据类型,具有一些内置约束,它允许我们创建一些自定义约束,基于这些约束我们可以生成我们想要的数据。
作为该演示的一部分,我们将读取一个简单的 CSV 文件作为输入,SDV 库将使用该文件来理解数据的结构和格式,并将生成具有多种约束和格式的输出合成数据。
在本文中,我添加了一个核心代码片段,完整代码参考GITHUB
先决条件
- 蟒蛇
安装pandas和SDV包
pip install pandas
pip install sdv
输入CSV文件
生成合成数据的步骤
- 导入所有需要的python库
import pandas as pd
from sdv.tabular import TVAE
from sdv.constraints import CustomConstraint
from sdv.constraints import ColumnFormula
import random
from random import choice
import string
from string import ascii_uppercase
import warnings
warnings.filterwarnings("ignore")
- 使用 pandas 读取输入 CSV 文件并将其作为 SDV 库输入提供
data = pd.read_csv('data/samples.csv')
model = TVAE()
model.fit(data)
new_data = model.sample(num_rows=10)
-
让我们尝试定义我们的规则,以根据上述 CSV 中的列生成合成数据。
-
电子邮件 - 名字、姓氏和gmail.com的组合。 SDV 库不提供任何默认函数来归档它,因此我们必须将其编写为自定义代码的一部分。这将是 ColumnFormulas 的一部分。
def generate_email(data):
data['Email'] = data['First name'] + "." + data['Last name'] + '@gmail.com'
return data['Email']
email_constraints = ColumnFormula(
column='Email',
formula=generate_email,
handling_strategy='transform')
constraints.append(email_constraints)
- 任意字符串 - 当我们没有公共字符串数据时,这很有用。 SDV 库支持一些基本的列来生成任意值,但是如果我们想完全匿名化不支持的列,那么我们需要编写我们的自定义代码。在这里,我们可以提供多个列,如下所示。
def generate_arbitary_string_series(data):
data=''.join(random.choices(string.ascii_letters, k=len(str(data))))
return data
def generate_arbitary_string(column_data):
return column_data.apply(generate_arbitary_string_series)
arbitary_string_constraints = CustomConstraint(
columns=['First name', 'Last name'],
transform=generate_arbitary_string)
constraints.append(arbitary_string_constraints)
- 任意整数 - 当我们没有公共整数数据或生成任何动态随机数时,这很有用。
def generate_arbitary_number_series(data):
data=random.randint(0, 100)
return data
def generate_arbitary_number(column_data):
return column_data.apply(generate_arbitary_number_series)
arbitary_number_constraints = CustomConstraint(
columns=['Age'],
transform=generate_arbitary_number)
constraints.append(arbitary_number_constraints)
- Multiply by number - 这是一个自定义函数,将数字乘以 1000。我们可以根据我们的逻辑编写任何函数。
def multiply_with_1000(column_data):
return column_data * 1000
multiply_constraint = CustomConstraint(
columns=['Salary'],
transform=multiply_with_1000)
constraints.append(multiply_constraint)
-
如果我们不想要任何自定义逻辑或者只想从现有值生成数据,那么我们不需要编写任何代码。 SDV 库会自动处理它。
-
如果我们想要任何不同的值,那么我们可以提供该列作为主键。
-
作为这个演示的一部分,我们只创建了 15 行,但如果需要,我们可以通过仅更改参数来生成许多行。
model = TVAE(primary_key='ID', constraints=constraints)
model.fit(data)
synthetic_data_clients = model.sample(15)
print(synthetic_data_clients)
输出 CSV 文件
更多推荐
所有评论(0)