在本文中,我们将学习如何借助 python SDV 库生成合成数据。

每个应用程序都需要数据来测试端到端功能或测试性能。有时批量生成数据并不容易,有时我们感兴趣的数据无法向公众提供。为了解决这些问题,我们需要一些工具来帮助我们根据提供的结构或特定格式生成数据。

SDV 是一个帮助我们生成合成数据的 python 库。它以一些表、多个表或一些时间序列数据作为输入来理解数据的格式和结构,并生成具有相同结构和格式的新合成数据。在内部,SDV 使用多种概率图形建模和基于深度学习的技术。它支持多种数据类型,具有一些内置约束,它允许我们创建一些自定义约束,基于这些约束我们可以生成我们想要的数据。

作为该演示的一部分,我们将读取一个简单的 CSV 文件作为输入,SDV 库将使用该文件来理解数据的结构和格式,并将生成具有多种约束和格式的输出合成数据。

在本文中,我添加了一个核心代码片段,完整代码参考GITHUB

先决条件

  • 蟒蛇

安装pandas和SDV包

pip install pandas
pip install sdv

输入CSV文件

csv.png

生成合成数据的步骤

  • 导入所有需要的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 文件

csv-output.png

点击阅读全文
Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐