脚本要求
- 需要造手机号或者设备号的数据(加密md5或sha256),也可两者合并(用下划线隔开)
- 需要造历史月份字段数据,可自定义或者区域随机,也可不带;
- 需要带目标字段(枚举:0 or 1),也可不带;
应用的库包含:
import pandas as pd
import hashlib
import random
import os
from time import strftime,localtime,mktime
1. 先定义好造数据类型
def table_title(title,online):
if title=="all":
columns = ["imei","phone","历史月份", "结果值"]
elif title=="imei":
columns = ["imei","历史月份", "结果值"]
elif title=="phone":
columns = ["phone","历史月份", "结果值"]
online_columns=columns[:-2]
table_title=columns if online==0 else online_columns
return table_title
定义不同场景下的字段,如果不需要带辅助参数,调用时online传非0即删除后面两位字段;
2. 定义加密方式的函数
def md5(data_md5):
data_md5=hashlib.md5(data_md5.encode(encoding='UTF-8')).hexdigest()
return data_md5
def sha256(data_sha256):
data_sha256 = hashlib.sha256(data_sha256.encode(encoding='UTF-8')).hexdigest()
return data_sha256
md5和sha256分别定义一个函数,结合使用
3. 逻辑处理:结合生成样本进行数据处理
def data_list(total,title,encrypt,online,month_b,month_a,label_type,test_c=0):
result_list=[]
#定手机号和设备号的开头数据
num_phone,num_imei=188,98
#定随机手机号和设备号的限制区间
num_a,num_b=10000000+test_c,99999999
num_a2,num_b2=10000000000+test_c,99999999999
#对区域内月份取值以及枚举的目标值定义
def month_handle(month_a):
month_a=month_b-1 if month_a==None else month_a
month=month_bug(str(month_a),str(month_b))
label =random.randint(0,1) if label_type==None else label_type
return month,label
#total次数为需要生成的样本数量
for i in range(total):
num_data=str(random.randint(num_a, num_b))
num_data2=str(random.randint(num_a2, num_b2))
#生成所有字段都需要的情况
if title=="all":
phone=md5(str(num_phone) + num_data) if encrypt=="md5" else sha256(str(num_phone) + num_data)
imei =md5(str(num_imei) + num_data2) if encrypt=="md5" else sha256(str(num_imei) + num_data2)
if online==0:
month,label=month_handle(month_a)
result_list.append([imei,phone,month,label])
else:
result_list.append([imei,phone])
#生成imei需要的情况
elif title=="imei":
imei =md5(str(num_imei)+ num_data2) if encrypt=="md5" else sha256(str(num_imei) + num_data2)
if online==0:
month,label=month_handle(month_a)
result_list.append([imei,month,label])
else:
result_list.append([imei])
#生成phone需要的情况
elif title=="phone":
phone=md5(str(num_phone) + num_data) if encrypt=="md5" else sha256(str(num_phone)+ num_data)
if online==0:
month,label=month_handle(month_a)
result_list.append(["_"+phone,month,label])
else:
result_list.append(["_"+phone])
return result_list
4. 逻辑处理:对生成的总样本数量控制
def zhu_start(total,title,encrypt,online,month_b,month_a=None,label_type=None,size_m=100):
#定好需要生成文件的标题
columns = table_title(title,online)
time=strftime("%mm%dd%Hh%Mm%Ss",localtime())
#fuhao是给两者连接的分割符,division是切割作用,分批次生成总样本条数
fuhao,division="_",1000
size_kb=(1024*size_m)-(division/10)
month_aa="" if month_a==None else str(month_a)+"-"
#file_name是生成的文件名称,只是纯粹用于好区分
file_name=str(total)+fuhao+title+fuhao+encrypt+fuhao+str(month_aa)+str(month_b)+fuhao+time
def pd_data(division,test_c=0):
result_list = data_list(total,title,encrypt,month_a=month_a,month_b=month_b,online=online,label_type=label_type)
dt = pd.DataFrame(result_list,columns=columns)
dt.to_csv(file_name+".csv",mode="a",index=0, encoding="gb2312")
return os.path.getsize(file_name+".csv")
#小于分割数量的总条数情况,一次性让其生成
if total <= division:
file_size=pd_data(total,0)
print("1、生成样本条数:"+str(total)+"\n2、生成文件大小:"+str(round(file_size/1024,4))+"kb")
#大于分割数量的总条数情况,分批次生成
else:
#此处对余数做了个处理,避免非分割数整数情况导致余数的量未生成
test_a,test_b=int(total/division),total%division
test_a=test_a+1 if test_b != 0 else test_a
for i in range(test_a):
fale_header=True if i==0 else None
test_c=i*division
division=test_b if i==test_a-1 else division
file_size=pd_data(division,test_c)
#对生成的文件大小做个限制,防止手误生成超大数据,默认不超过100兆
if (file_size)/1024 > size_kb:
print("1、生成样本条数:"+str((test_a-1)*division+test_b)+"\n2、生成文件大小:"+str(round(file_size/1024,4))+"kb")
exit()
print("1、生成样本条数:"+str((test_a-1)*division+test_b)+"\n2、生成文件大小:"+str(round(file_size/1024,4))+"kb")
4. 历史月份的处理(bug修复)
def month_bug(month_a,month_b):
start_a,start_b=month_a[:-2],month_a[-2:]
end_a,end_b=month_b[:-2],month_b[-2:]
a1=(int(start_a),int(start_b),1,0,0,0,0,0,0)
a2=(int(end_a),int(end_b),31,23,59,59,0,0,0)
t=random.randint(mktime(a1),mktime(a2))
return strftime("%Y%m",localtime(t))
在后面使用的时候,发现自定义月份区域时跨年会出现数据生产错误;因为月份是12月进一年的,后面加了这块逻辑;对传入的参数用randint方法进行随机取值,解决这个问题;
5. main实例
参数解释如下(*号必填):
#total*:需要生成的样本数量,已默认限制文件生成不大于100M;如想大于可结合size_m使用
#title*:all为四类字段都包含,可设置单独imei或者phone
#encrypt*:加密类型,可设置md5或者sha256
#online*:可设置0(离线)或者1(在线)
#mothe_a:历史月份起始日期 + month_b*历史月份结束日期(随机期间月份);如统一月份month_a不填或者为None
#label_type:可根据要求生成0或者1,不填默认自动随机
#size_m:如想生成大于100M,举例生成101兆,添加size_m=101(单位兆),totale设置无穷大即可
if __name__ == '__main__':
zhu_start(total=100,title="phone",encrypt="md5",online=1,month_a=202105,month_b=202105,label_type=None)