【造數】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

參考資料:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM