【造数】Python批量生成测试数据

工程师开发完成后,常常需要制造大批量的伪数据,来测试数据中台的开发效果。利用Excel来造数,小批量的数据还是可以的,想了解Excel造数的朋友,可以看我之前的文章《造数常用的Excel表达式》,遇到大批量数据时,利用Python来造数会更高效。下面简单介绍一下具体的造数思路。

整体思路

确定有多少字段,样本内容,再给每个字段下填充数据用列表形式保存,在利用DataFrame通过字典的方式创建二维表,最后导出一张csv表格。

整体代码

# -*- coding: utf-8 -*-
import pandas as pd
from faker import Faker
import random
import numpy as np

fake = Faker("zh_CN") # 初始化,可生成中文数据

#设置字段
#index = []
for i in range(1,12):
	exec('x'+str(i)+'=[]')

#设置样本
prod_cd = ['W00028','W00021','W00022']
prod_nm = ['微信支付','银联扫码支付','转账']
channel = ['APP','网银','短信']
year = ['2019','2020','2021']

#循环生成数据20行,具体多少行可以根据需求修改
for i in range(20):
	date = random.choice(year)+fake.date()[4:]

	x1.append('1'+str(fake.random_number(digits=8))) # 随机数字,参数digits设置生成的数字位数
	x2.append(fake.name())
	x3.append(fake.ssn()) # 身份证
	x4.append(random.choice('男女'))
	x5.append(random.randint(18,25))
	x6.append(fake.job())
	x7.append(random.randint(0,1000000))
	x8.append(random.choice(prod_cd))
	x9.append(random.choice(prod_nm))
	x10.append(random.choice(channel))
	x11.append(date)

#创建数据表
datas = pd.DataFrame({
	'user_id':x1,
	'name':x2,
	'ID_card':x3,
	'gender':x4,
	'age':x5,
	'job':x6,
	'salary':x7,
	'product_id':x8,
	'product':x9,
	'channel':x10,
	'prt_dt':x11
	})

#DataFrame类的to_csv()方法输出数据内容,不保存行索引和列名
datas.to_csv(r'C:\Users\ASUS2021\Desktop\customer.csv',encoding='utf-8',index=False,header=None)

运行结果

利用Python创建伪数据,主要用到的库是faker库。剩余涉及到的知识点:DataFrame类的to_csv()方法

其中还有比较陌生的几个函数:

  • exec('x'+str(i)+'=[]')exec函数可以动态运行代码段。
  • fake.random_number(digits=8)生成随机数字,参数digits设置生成的数字位数。

可能会踩的坑

用Excel双击打开csv,乱码

导出的UTF-8的csv文件,直接用Excel打开可能会出现乱码,这里要解释一下,出现乱码是由于excel默认是gb2312编码或其他形式,需要将其转为utf-8编码形式。

解决办法很简单, 将csv格式文件,用notepad++打开,然后另存为UTF-8格式的csv文件,再用Excel打开,则乱码问题解决。但是调整单元格间距会使分隔符变化,导致下次打开Excel出现问题。解决方法为复制内容到新的Excel中再保存。

Excel打开csv,身份证号,变科学计数法

直接双击打开csv文件,身份证号码默认变成科学计数法,而且这一过程是不可逆的,即使你将单元格格式改为文本,身份证号码也不是原来的那串数字了。

解决办法:

  1. 新建一个空白Excel文档,【数据】-【从文本/CSV】选择csv文件路径,导入csv文件
  2. 单击右下角的【转换数据】,加载进入到Power Query编辑器界面。
  3. 右键【更改类型】-【文本】
  4. 最后点击主页上的【关闭并上载】,就可以在Excel看到我们的csv数据了。

image

image

image

image

补充知识点

常用的几个faker库的方法

随机生成名字,地址,邮编,城市,省份等

from faker import Faker
fake = Faker(locale='zh_CN')

print(fake.address()) # 地址
print(fake.name()) # 名字
print(fake.password(special_chars=False)) # 密码
print(fake.ssn()) # 身份证
print(fake.email()) # 邮箱
print(fake.phone_number()) # 手机号码
print(fake.simple_profile()) # 个人信息

faker库的其他方法

伪装IP地址

ipv4():随机IP4地址
ipv6():随机IP6地址
mac_address():随机MAC地址
tld():网址域名后缀
uri():随机URI地址
uri_extension():网址文件后缀
uri_page():网址文件(不包含后缀)
uri_path():网址文件路径(不包含文件名)
url():随机URL地址
user_name():随机用户名
isbn10():随机ISBN(10位)
isbn13():随机ISBN(13位)

伪造自动评论

paragraph():随机生成一个段落
paragraphs():随机生成多个段落,通过参数nb来控制段落数,返回数组
sentence():随机生成一句话
sentences():随机生成多句话,与段落类似
text():随机生成一篇文章
word():随机生成词语
words():随机生成多个词语,用法与段落,句子,类似
binary():随机生成二进制编码
boolean():True/False
language_code():随机生成两位语言编码
locale():随机生成语言/国际 信息

伪装个人信息

msisdn():移动台国际用户识别码,即移动用户的ISDN号码
phone_number():随机生成手机号
phonenumber_prefix():随机生成手机号段
profile():随机生成档案信息
simple_profile():随机生成简单档案信息
first_name():随机姓
first_name_female():女性名
first_name_male():男性名
first_romanized_name():罗马名
last_name():姓
last_name_female():女
last_name_male():男
last_romanized_name():罗马姓氏
name():随机生成姓名
name_female():男性姓名
name_male():女性姓名
romanized_name():罗马名
msisdn():移动台国际用户识别码,即移动用户的ISDN号码
phone_number():随机生成手机号
phonenumber_prefix():随机生成手机号段
profile():随机生成档案信息
simple_profile():随机生成简单档案信息
email() :随机生成电邮地址
ascii_company_email():随机ASCII公司邮箱名
ascii_email():随机ASCII邮箱
ascii_free_email():随机ASCII免费邮箱
ascii_safe_email():随机ASCII安全邮箱
company_email():随机公司邮箱
domain_name():生成域名
domain_word():域词(即,不包含后缀)
free_email():免费邮箱
free_email_domain():免费邮箱域名
safe_email():安全邮箱
ssn() :生成身份证号

生成浏览器信息

chrome():生成Chrome的浏览器user_agent信息
firefox():生成FireFox的浏览器user_agent信息
internet_explorer():生成IE的浏览器user_agent信息
opera():生成Opera的浏览器user_agent信息
safari():生成Safari的浏览器user_agent信息
linux_platform_token():Linux信息

账户加密伪装

md5():随机生成MD5
null_boolean():NULL/True/False
password():随机生成密码,可选参数:length:密码长度;special_chars:是否能使用特殊字符;digits:是否包含数字;upper_case:是否包含大写字母;lower_case:是否包含小写字母
sha1():随机SHA1
sha256():随机SHA256

地理位置伪装

country():国家
province():省份
city_suffix():市,县
district():区
street_address():街道地址
street_name():街道名
street_suffix():街、路
country_code():国家编码
postcode():邮编
geo_coordinate():地理坐标
longitude():经度
latitude():纬度
am_pm():AM/PM

数字随机

numerify():生成三位随机数
random_digit():生成0~9随机数
random_digit_not_null():生成1~9的随机数
random_element():生成随机字母
random_int():随机数字,默认0~9999,可通过min,max参数修改
random_letter():随机字母
random_number():随机数字,参数digits设置生成的数字位数

颜色随机

color_name():随机颜色名
hex_color():随机HEX颜色
rgb_color():随机RGB颜色
safe_color_name():随机安全色名
safe_hex_color():随机安全HEX颜色

公司信息伪装

bs():随机公司服务名
company():随机公司名(长)
company_prefix():随机公司名(短)
company_suffix():公司性质
credit_card_expire():随机信用卡到期日
credit_card_full():生成完整信用卡信息
credit_card_number():信用卡号
credit_card_provider():信用卡类型
credit_card_security_code():信用卡安全码
currency_code():货币编码

时间

century():随机世纪
date():随机日期
date_between():随机生成指定范围内日期,参数:start_dateend_date
date_between_dates():随机生成指定范围内日期,用法同上
date_object():随机生成从1970-1-1到指定日期的随机日期。
date_this_month():随机生成当前月的某一日
date_this_year():随机生成今年的某一日
date_time():随机生成指定时间(1970年1月1日至今)
date_time_ad():生成公元1年到现在的随机时间
date_time_between():用法同dates
future_date():未来日期
future_datetime():未来时间
month():随机月份
month_name():随机月份(英文)
past_date():随机生成已经过去的日期
past_datetime():随机生成已经过去的时间
time():随机24小时时间
timedelta():随机获取时间差
time_object():随机24小时时间,time对象
time_series():随机TimeSeries对象
timezone():随机时区
unix_time():随机Unix时间
year():随机年份

扩展名伪装

file_extension():随机文件扩展名
file_name():随机文件名(包含扩展名,不包含路径)
file_path():随机文件路径(包含文件名,扩展名)
mime_type():随机mime Type

参考资料:

posted @   中了毒蛇粉的猫  阅读(609)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示