工程师开发完成后,常常需要制造大批量的伪数据,来测试数据中台的开发效果。利用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文件,身份证号码默认变成科学计数法,而且这一过程是不可逆的,即使你将单元格格式改为文本,身份证号码也不是原来的那串数字了。
解决办法:
- 新建一个空白Excel文档,【数据】-【从文本/CSV】选择csv文件路径,导入csv文件
- 单击右下角的【转换数据】,加载进入到Power Query编辑器界面。
- 右键【更改类型】-【文本】
- 最后点击主页上的【关闭并上载】,就可以在Excel看到我们的csv数据了。
补充知识点
常用的几个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/Falselanguage_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():随机生成MD5null_boolean():NULL/True/Falsepassword():随机生成密码,可选参数:length:密码长度;special_chars:是否能使用特殊字符;digits:是否包含数字;upper_case:是否包含大写字母;lower_case:是否包含小写字母sha1():随机SHA1sha256():随机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_date,end_datedate_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():用法同datesfuture_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
参考资料:
- exec相关可以看官方文档:https://docs.python.org/3/library/functions.html#exec
- 使用faker库生成随机数据:https://blog.csdn.net/adorable_/article/details/111997189
- Excel打开csv后身份证号码处理:https://zhuanlan.zhihu.com/p/388582211