使用faker進(jìn)行生成模擬(mock))數(shù)據(jù)
當(dāng)我們要進(jìn)行一些數(shù)據(jù)可視化的制作時(shí),數(shù)據(jù)是必備的,但當(dāng)我們手頭沒(méi)有真實(shí)數(shù)據(jù)又沒(méi)有時(shí)間和精力去kaggle或其他網(wǎng)站收集數(shù)據(jù)時(shí),且數(shù)據(jù)真實(shí)性不是特別需要時(shí),我們可以使用faker庫(kù)來(lái)進(jìn)行數(shù)據(jù)的mock操作。
這就不需要爬蟲去爬取真實(shí)數(shù)據(jù),也不需要使用別人制作的API接口了!
一、Faker庫(kù)安裝
使用命令:
pip install Faker
進(jìn)行安裝
二、Faker庫(kù)基本介紹
在使用Faker庫(kù)之前需要有兩部操作來(lái)導(dǎo)入和實(shí)例化。
1、導(dǎo)入Faker庫(kù)
from faker import Faker
2、實(shí)例化Faker對(duì)象
fake = Faker()
3、基本函數(shù)介紹
以下是Faker庫(kù)的一些常用功能和語(yǔ)法:
- 生成隨機(jī)姓名:
faker.name()
- 生成隨機(jī)地址:
faker.address()
- 生成隨機(jī)電子郵件地址:
faker.email()
- 生成隨機(jī)手機(jī)號(hào)碼:
faker.phone_number()
- 生成隨機(jī)日期:
faker.date()
- 生成隨機(jī)時(shí)間:
faker.time()
- 生成隨機(jī)文本塊:
faker.text()
Faker庫(kù)還提供了很多其他的功能,比如生成隨機(jī)公司名稱、隨機(jī)顏色、隨機(jī)銀行卡號(hào)等等。你可以參考Faker庫(kù)的官方文檔來(lái)進(jìn)行更深入的學(xué)習(xí)和使用。
https://faker.readthedocs.io/en/master/
三、案例1:Faker庫(kù)生成核酸數(shù)據(jù)
一般我們使用Faker生成數(shù)據(jù),使用pandas、csv或openpyxl等操作excel或csv的庫(kù)將生成的數(shù)據(jù)寫入。
根據(jù)場(chǎng)景,我們可以使用random_element來(lái)結(jié)合實(shí)際去進(jìn)行生成。
fake.random_element(elements=('文化社區(qū)', '中心社區(qū)', '楓橋社區(qū)', '花園社區(qū)','棉織社區(qū)','站前社區(qū)'))
這里我在網(wǎng)上找了本溪市的街道名和社區(qū)名進(jìn)行隨機(jī)生成。
from faker import Faker
from openpyxl import Workbook
# 創(chuàng)建實(shí)例
fake = Faker(locale='zh_CN')
# 定義表頭
headers = ['序號(hào)', '市', '區(qū)', '街道', '社區(qū)', '采集地點(diǎn)', '采集管號(hào)', '身份證號(hào)', '姓名', '性別', '電話', '住址',
'年齡', '類別', '備注', '采集時(shí)間', '采集人姓名', '采集人電話', '標(biāo)本類型', '接收實(shí)驗(yàn)室', '檢測(cè)時(shí)間', '人員關(guān)系', '箱號(hào)']
# 生成數(shù)據(jù)并寫入Excel
wb = Workbook()
ws = wb.active
ws.append(headers)
for i in range(1, 3000):
row_data = [
i,
'本溪市',
fake.random_element(elements=('平山區(qū)', '溪湖區(qū)', '明山區(qū)', '南芬區(qū)')),
fake.random_element(elements=('南地街道','工人街道','平山街道','東明街道','崔東街道','北臺(tái)街道','河西街道','北地街道','石橋子街道','橋頭街道','金山街道','高峪街道','東興街道','新明街道','牛心臺(tái)街道','臥龍街道','火連寨街道')),
fake.random_element(elements=('文化社區(qū)', '中心社區(qū)', '楓橋社區(qū)', '花園社區(qū)','棉織社區(qū)','站前社區(qū)')),
fake.building_number(),
fake.random_int(min=100000000, max=999999999),
fake.ssn(),
fake.name(),
fake.random_element(elements=('男', '女')),
fake.phone_number(),
fake.address(),
fake.random_int(min=1, max=100),
fake.random_element(elements=('類別1', '類別2', '類別3')),
'NULL',
fake.date_time_this_year(),
fake.name(),
fake.phone_number(),
fake.random_element(elements=('鼻拭子', '咽拭子', '唾液樣本')),
'本溪市核酸檢測(cè)基地實(shí)驗(yàn)室',
fake.date_time_this_year(),
'本人',
fake.random_int(min=1, max=10)
]
ws.append(row_data)
# 保存文件
wb.save('data.xlsx')
結(jié)果如下:
生成的數(shù)據(jù),如有身份證號(hào)碼的雷同或手機(jī)號(hào)的雷同,純屬巧合!
生成這些數(shù)據(jù)可以應(yīng)用在醫(yī)療系統(tǒng)的建設(shè)時(shí)充當(dāng)mock數(shù)據(jù)。
四、案例2:生成不重復(fù)的人名和地名
有一些需求要求我們生成的數(shù)據(jù)不包含重復(fù)值
我們可以配合pandas庫(kù)來(lái)進(jìn)行生成和去重。
from faker import Faker
import pandas as pd
fake = Faker(['zh_CN', 'en_US'])
# 生成第一列數(shù)據(jù)
country1_cities = {fake.city_name() + '市' for i in range(2000)}
column1 = list(country1_cities) + [fake.state()]*2000
print(len(column1))
# 生成第二列數(shù)據(jù)
names = {fake.name() for j in range(4000)}
column2 = list(names)
print(len(column2))
# 計(jì)算每列數(shù)據(jù)的長(zhǎng)度
len1 = len(column1)
len2 = len(column2)
# 如果列的長(zhǎng)度不一致,則新建一個(gè)DataFrame來(lái)保證列的長(zhǎng)度一致
if len1 != len2:
max_len = max(len1, len2)
dummy_df = pd.DataFrame()
if len1 < max_len:
dummy_df['國(guó)家或地區(qū)'] = ['']*(max_len - len1)
column1.extend(dummy_df['國(guó)家或地區(qū)'].tolist())
elif len2 < max_len:
dummy_df['人名'] = ['']*(max_len - len2)
column2.extend(dummy_df['人名'].tolist())
# 將數(shù)據(jù)轉(zhuǎn)化為DataFrame
df = pd.concat([pd.DataFrame(column1, columns=['國(guó)家或地區(qū)']), pd.DataFrame(column2, columns=['人名'])], axis=1)
# 保存到csv文件中
df.to_csv('地名與人名不重復(fù).csv', index=False)
但要注意,人名不重復(fù)很簡(jiǎn)單,可以生成中文人名和英文名。但地名不重復(fù)是有一定難度的,所以地名的生成在數(shù)量上是有限制的。
五、案例3:生成有時(shí)間期限的低保數(shù)據(jù)
我們還會(huì)遇到一些需要記錄時(shí)間期限的場(chǎng)景,如健身卡會(huì)員期限等。
生成時(shí)間時(shí)我們可以設(shè)置開(kāi)始時(shí)間和結(jié)束時(shí)間,如:
fake.date_between(start_date='-5y', end_date='today').strftime('%Y/%m/%d'),
這里我們?cè)O(shè)置開(kāi)始時(shí)間是在前五年之內(nèi)的,結(jié)束時(shí)間設(shè)置為今天。那么Faker就會(huì)隨機(jī)生成在這五年之內(nèi)的隨機(jī)日期。
from faker import Faker
from openpyxl import Workbook
# 創(chuàng)建faker對(duì)象
fake = Faker('zh_CN')
# 創(chuàng)建工作表
wb = Workbook()
ws = wb.active
# 編寫列頭
headers = [ "序號(hào)", "年度", "單位隸屬",'姓名','身份證號(hào)','保障開(kāi)始時(shí)間','保障結(jié)束時(shí)間','救助情況','所屬縣區(qū)','所屬鄉(xiāng)鎮(zhèn)街道','所屬社區(qū)村','類型','備注'
]
ws.append(headers)
# 生成并寫入200個(gè)數(shù)據(jù)條目
for i in range(3000):
row = [
fake.random_int(min=1, max=100),
'2023',
'本溪市',
fake.name(), # 姓名
fake.ssn(), # 身份證號(hào)
fake.date_between(start_date='-5y', end_date='today').strftime('%Y/%m/%d'),
fake.date_between(start_date='today', end_date='+5y').strftime('%Y/%m/%d'),
fake.random_int(min=200, max=500),
'本溪滿族自治縣',
'沙尖子鎮(zhèn)',
fake.random_element(elements=('北溝村委會(huì)', '大華街道', '東明街道', '北臺(tái)街道')),
fake.random_element(elements=('農(nóng)村低保', '城市低保', '殘疾人兩項(xiàng)補(bǔ)助')),
fake.random_element(elements=('因病', '因殘',)),
]
ws.append(row)
# 保存工作簿
wb.save("低保數(shù)據(jù).xlsx")
生成結(jié)果:
六、案例4:生成電力數(shù)據(jù)
關(guān)于數(shù)值類型的數(shù)據(jù)我們可以使用
fake.random_int(min=10000000000,max=99999999999)
來(lái)定義區(qū)間和類型,此外關(guān)于地址和公司名也可以隨機(jī)生成
fake.address()
fake.company()
案例代碼如下:
from faker import Faker
from openpyxl import Workbook
# 創(chuàng)建faker對(duì)象
fake = Faker('zh_CN')
# 創(chuàng)建工作表
wb = Workbook()
ws = wb.active
# 編寫列頭
headers = ['戶號(hào)','戶名','表號(hào)','地址','手機(jī)號(hào)','身份證號(hào)','用電量202001', '用電量202002', '用電量202003', '用電量202004', '用電量202005', '用電量202006', '用電量202007', '用電量202008', '用電量202009', '用電量202010', '用電量202011', '用電量202012', '用電量202101', '用電量202102', '用電量202103', '用電量202104', '用電量202105', '用電量202106', '用電量202107', '用電量202108', '用電量202109', '用電量202110', '用電量202111', '用電量202112', '余額','單位']
ws.append(headers)
# 生成并寫入200個(gè)數(shù)據(jù)條目
for i in range(3000):
row = [
fake.random_int(min=10000000000,max=99999999999),
fake.name(),
fake.random_int(min=100000000000000000,max=999999999999999999),
fake.address(),
fake.phone_number(),
fake.ssn(),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.random_int(min=1, max=400),
fake.company(), # 單位名稱
]
ws.append(row)
# 保存工作簿
wb.save("國(guó)網(wǎng)電力.xlsx")
七、案例5:生成房產(chǎn)登記數(shù)據(jù)
我們可以在生成數(shù)據(jù)時(shí),利用字符串拼接的方式進(jìn)行生成
如下列代碼,我們使用循環(huán),并隨機(jī)生成j
j = random.randint(20000, 50000)
....
'本房權(quán)證平山區(qū)字第'+ str(j)+ '號(hào)' , # 權(quán)證號(hào)
完整代碼如下
import random
import faker
import openpyxl
# 創(chuàng)建一個(gè) Faker 對(duì)象
fake = faker.Faker('zh_CN')
# 創(chuàng)建一個(gè) Excel 文件和工作表
wb = openpyxl.Workbook()
ws = wb.active
# 創(chuàng)建表頭
ws.append(['編號(hào)', '區(qū)劃', '權(quán)證號(hào)', '姓名', '證件類型', '身份證號(hào)', '地址', '建筑面積', '辦結(jié)時(shí)間'])
# 生成數(shù)據(jù)并寫入 Excel 表格
for i in range(3000):
j = random.randint(20000, 50000)
ws.append([
i + 1, # 編號(hào)
fake.random_element(elements=('平山區(qū)', '溪湖區(qū)', '明山區(qū)', '南芬區(qū)')), # 區(qū)劃
'本房權(quán)證平山區(qū)字第'+ str(j)+ '號(hào)' , # 權(quán)證號(hào)
fake.name(), # 姓名
'居民身份證', # 證件類型
fake.ssn(min_age=18, max_age=70), # 身份證號(hào)
fake.address(), # 地址
round(fake.pyfloat( positive=True, min_value=50, max_value=200), 2), # 建筑面積
fake.date_between(start_date='-5y', end_date='today').strftime('%Y/%m/%d') # 辦結(jié)時(shí)間
])
# 保存 Excel 文件
wb.save('房產(chǎn)登記數(shù)據(jù).xlsx')
結(jié)果如下:
八、總結(jié)
Faker精簡(jiǎn)應(yīng)用可以幫助程序員快速生成測(cè)試數(shù)據(jù)。通過(guò)導(dǎo)入Faker庫(kù),并選擇需要生成的隨機(jī)數(shù)據(jù)類型,程序員可以輕松地創(chuàng)建測(cè)試數(shù)據(jù),從而減少手動(dòng)創(chuàng)建測(cè)試數(shù)據(jù)的工作量。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-671568.html
以上內(nèi)容就是我的全部分享啦!祝你有個(gè)美好的一天!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-671568.html
到了這里,關(guān)于python使用Faker庫(kù)進(jìn)行生成模擬mock數(shù)據(jù)(基本使用+五個(gè)小案例)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!