腳本要求
- 需要造手機(jī)號或者設(shè)備號的數(shù)據(jù)(加密md5或sha256)缤苫,也可兩者合并(用下劃線隔開)
- 需要造歷史月份字段數(shù)據(jù)豹绪,可自定義或者區(qū)域隨機(jī),也可不帶镇防;
- 需要帶目標(biāo)字段(枚舉:0 or 1),也可不帶纽门;
應(yīng)用的庫包含:
import pandas as pd
import hashlib
import random
import os
from time import strftime,localtime,mktime
1. 先定義好造數(shù)據(jù)類型
def table_title(title,online):
if title=="all":
columns = ["imei","phone","歷史月份", "結(jié)果值"]
elif title=="imei":
columns = ["imei","歷史月份", "結(jié)果值"]
elif title=="phone":
columns = ["phone","歷史月份", "結(jié)果值"]
online_columns=columns[:-2]
table_title=columns if online==0 else online_columns
return table_title
定義不同場景下的字段,如果不需要帶輔助參數(shù)营罢,調(diào)用時online傳非0即刪除后面兩位字段;
2. 定義加密方式的函數(shù)
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分別定義一個函數(shù)饼齿,結(jié)合使用
3. 邏輯處理:結(jié)合生成樣本進(jìn)行數(shù)據(jù)處理
def data_list(total,title,encrypt,online,month_b,month_a,label_type,test_c=0):
result_list=[]
#定手機(jī)號和設(shè)備號的開頭數(shù)據(jù)
num_phone,num_imei=188,98
#定隨機(jī)手機(jī)號和設(shè)備號的限制區(qū)間
num_a,num_b=10000000+test_c,99999999
num_a2,num_b2=10000000000+test_c,99999999999
#對區(qū)域內(nèi)月份取值以及枚舉的目標(biāo)值定義
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次數(shù)為需要生成的樣本數(shù)量
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. 邏輯處理:對生成的總樣本數(shù)量控制
def zhu_start(total,title,encrypt,online,month_b,month_a=None,label_type=None,size_m=100):
#定好需要生成文件的標(biāo)題
columns = table_title(title,online)
time=strftime("%mm%dd%Hh%Mm%Ss",localtime())
#fuhao是給兩者連接的分割符饲漾,division是切割作用,分批次生成總樣本條數(shù)
fuhao,division="_",1000
size_kb=(1024*size_m)-(division/10)
month_aa="" if month_a==None else str(month_a)+"-"
#file_name是生成的文件名稱缕溉,只是純粹用于好區(qū)分
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")
#小于分割數(shù)量的總條數(shù)情況考传,一次性讓其生成
if total <= division:
file_size=pd_data(total,0)
print("1、生成樣本條數(shù):"+str(total)+"\n2证鸥、生成文件大辛爬恪:"+str(round(file_size/1024,4))+"kb")
#大于分割數(shù)量的總條數(shù)情況,分批次生成
else:
#此處對余數(shù)做了個處理枉层,避免非分割數(shù)整數(shù)情況導(dǎo)致余數(shù)的量未生成
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)
#對生成的文件大小做個限制泉褐,防止手誤生成超大數(shù)據(jù),默認(rèn)不超過100兆
if (file_size)/1024 > size_kb:
print("1鸟蜡、生成樣本條數(shù):"+str((test_a-1)*division+test_b)+"\n2膜赃、生成文件大小:"+str(round(file_size/1024,4))+"kb")
exit()
print("1揉忘、生成樣本條數(shù):"+str((test_a-1)*division+test_b)+"\n2跳座、生成文件大卸祟酢:"+str(round(file_size/1024,4))+"kb")
4. 歷史月份的處理(bug修復(fù))
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))
在后面使用的時候,發(fā)現(xiàn)自定義月份區(qū)域時跨年會出現(xiàn)數(shù)據(jù)生產(chǎn)錯誤疲眷;因為月份是12月進(jìn)一年的禾蚕,后面加了這塊邏輯;對傳入的參數(shù)用randint方法進(jìn)行隨機(jī)取值狂丝,解決這個問題换淆;
5. main實例
參數(shù)解釋如下(*號必填):
#total*:需要生成的樣本數(shù)量,已默認(rèn)限制文件生成不大于100M美侦;如想大于可結(jié)合size_m使用
#title*:all為四類字段都包含产舞,可設(shè)置單獨imei或者phone
#encrypt*:加密類型,可設(shè)置md5或者sha256
#online*:可設(shè)置0(離線)或者1(在線)
#mothe_a:歷史月份起始日期 + month_b*歷史月份結(jié)束日期(隨機(jī)期間月份)菠剩;如統(tǒng)一月份month_a不填或者為None
#label_type:可根據(jù)要求生成0或者1易猫,不填默認(rèn)自動隨機(jī)
#size_m:如想生成大于100M,舉例生成101兆具壮,添加size_m=101(單位兆)准颓,totale設(shè)置無窮大即可
if __name__ == '__main__':
zhu_start(total=100,title="phone",encrypt="md5",online=1,month_a=202105,month_b=202105,label_type=None)