工程師開發完成后,常常需要制造大批量的偽數據,來測試數據中台的開發效果。利用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/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_date
,end_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
參考資料:
- 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