pip install faker

สร้างข้อมูลปลอม (Mockup Data) ด้วย Python และ Faker ชื่อไทย เบอร์ไทย ก็ทำได้ หลายคนที่เคยทำโหลดเทสน่าจะผ่านตามาบ้าง ส่วนตัวผมชอบ lib นี้เพราะสะดวก ไม่ต้องไปเขียนฟังชั่นใช้เอง..


เราสามารถสร้างข้อมูลปลอม หรือที่เราคุ้นเคยเรียกกันว่า Mockup Data เพื่อเอาไปใช้ประโยชน์ได้ในหลายๆ สถานการณ์ ลองคิดดูว่าคุณเคยเจอสถานการณ์แบบด้านล่างนี้บ้างไหม


  • สร้าง database เสร็จแล้ว แต่ไม่รู้จะเอาข้อมูลที่ไหนมาใส่เพื่อลองโปรแกรมที่ต่อกับ database นั้น
  • ทดสอบการบีบอัดข้อมูลของ storage แต่ถ้าใส่ข้อมูลซ้ำๆ จะทำให้จำลองเวลาใช้งานจริงไม่ได้
  • ทำ Stress test storage โดยการใส่ random ข้อมูลไปเยอะๆ แต่ข้อมูลต้องถูกต้องตาม format ที่กำหนด
  • อยาก anonymize ข้อมูลที่เอามาจาก Production แต่ไม่อยากได้ XXX เต็มไปหมด
  • หรือแม้กระทั่ง สร้างข้อมูลปลอมเพื่อใช้ในการทำ automate test เพื่อ validate script หรือ function ที่เราเขียนขึ้นมา


เนื่องด้วยมีความจำเป็นต้องทดสอบงานที่เกี่ยวข้องกับข้อมูลส่วนบุคคลที่เป็นคนไทย เลยลองหาดูว่ามีวิธีอะไรง่ายๆ ไหม​? แล้วก็มาเจอกับ package ที่ชื่อว่า faker (https://github.com/joke2k/faker) ซึ่งสามารถ Mockup Data ได้หลากหลาย ไม่ว่าจะเป็น ชื่อ ที่อยู่ เบอร์โทรศัพท์ ทะเบียนรถ วันเดือนปี เลขที่บัตรประชาชน และอื่นๆ อีกมากมาย

ที่สำคัญ มัน Mockup เป็นภาษาไทย และรูปแบบไทยได้

ดูรายละเอียดส่วนที่ Mockup เป็นรูปแบบไทยได้จาก https://faker.readthedocs.io/en/master/locales/th_TH.html

การใช้งาน FAKER

ก่อนอื่นเราต้อง install package กันก่อน

$ pip install Faker


แล้วใน Python ก็ import package และสร้าง object โดยกำหนด Locale เป็นประเทศไทยด้วย

from faker import Faker
fake = Faker('th_TH')

ทีนี้เราก็มาเริ่มสร้าง Mockup Data ได้เลย ด้านล่างเป็นตัวอย่างที่น่าสนใจของข้อมูลที่สามารถ Mockup ได้ พร้อมชื่อฟังก์ชั่น


ข้อมูล — Function — ตัวอย่าง

ที่อยู่ — fake.address() — ‘487/6 ถ.หนักแน่น ต.หนองปลาหมอใต้ จ.ตรัง 22190’

ถนน — fake.street_name() — ‘ถ.ทองสินธุ์’ ‘ถนนทองเนื้อดี’ ‘ถนนไทยสุชาต’

ตำบล — fake.tambon() — ‘เขาปูนเหนือ’ ‘โนนแดง’ ‘เนินขาม’ ‘ห้วยนาง’ ‘บางโรง’

อำเภอ — fake.amphoe() — ‘สามโคก’ ‘พรเจริญ’ ‘เวียงป่าเป้า’ ‘ภูเขียว’ ‘นาแก’

จังหวัด — fake.province() — ‘สิงห์บุรี’ ‘สงขลา’ ‘ปราจีนบุรี’ ‘นครนายก’ ‘พิษณุโลก’

ประเทศ — fake.country() — ‘ออสเตรเลีย’ ‘สโลวีเนีย’ ‘บอสเนียและเฮอร์เซโกวีนา’

ทะเบียนรถ — fake.license_plate() — ‘ยณฌ 8’ ‘หว 759’ ‘ชงง 1’ ‘ฌห 9’ ‘ฎมส 5’

ชื่อนิติบุคคล — fake.company() — ‘ชมรมทองสินธุ์’ ‘บริษัท ทองเนื้อดีการค้า จำกัด’

เลขประจำตัวผู้เสียภาษี — fake.vat_id() — ‘2–4314–54007–77–2’

ชื่อเต็ม — fake.name() — ‘พิชญ์สินี ทองสินธุ์’ ‘กิ่งแก้ว ทองเนื้อดี’ ‘ยศพนต์ ไทยสุชาต’

ชื่อ — fake.first_name() — ‘ราณี’ ‘พิชญ์สินี’ ‘สิริรัตน์’ ‘พุทธ’ ‘กิ่งแก้ว’

นามสกุล — fake.last_name() — ‘เมืองสุข’ ‘บุญส่ง’ ‘ทองสินธุ์’ ‘แต้กุล’

เลขประจำตัวประชาชน — fake.msisdn() — ‘6048764759382’ ‘1948924115781’

วันเดือนปี — fake.date() — ‘20 มี.ค. 2539’ ‘15 ส.ค. 2541’ ‘3 ต.ค. 2515’

อาชีพ — fake.job() — ‘ผู้กำกับภาพยนตร์’ ‘นักออกแบบ’ ‘นักบินอวกาศ’ ‘นักกีฬา’

เบอร์โทรศัพท์ — fake.phone_number() — ‘0860487647’ ‘0 4382 4219’


ดูรายละเอียดส่วนที่ Mockup เป็นรูปแบบไทยได้จาก https://faker.readthedocs.io/en/master/locales/th_TH.html




จุดสังเกตจากการใช้ Faker

ชื่อ

เจอปัญหาว่า ถ้าใช้ fake.name() บางครั้งจะได้คำนำหน้าชื่อมาด้วย ถ้าอยากได้แค่ชื่อกับนามสกุล ก็ต้องเอามารวมกันเอง

fake.first_name() + ' ' + fake.last_name()


วันเดือนปี

เราสามารถกำหนด format ที่เราต้องการได้ สมมุติว่าอยากได้ format เป็น “YYYY-MM-DD”

fake.date(pattern="%Y-%m-%d", end_datetime=None)


Hash512

Faker มี function Mockup Hash Data คือ fake.sha256() แต่ก็มีแค่นี้ ไม่มี Hash512 เลยใช้วิธีเอามาต่อกันไปเลย

fake.sha256() + fake.sha256()


การนำ Faker ไปใช้งาน

สุดท้ายเวลาที่เราจะใช้ เราก็มักจะเอาไปใส่ใน Dataframe ไปเลย เพื่อความสะดวกในการนำไปใช้ต่อ ส่วนนี้เราก็ใช้ for loop สร้าง list of dict แล้วยัดใส่ Dataframe ได้เลย

ตัวอย่างข้างล่างคือ Mockup 100 rows

import pandas as pd
from faker import Faker
fake = Faker('th_TH')
mockup_df100 = pd.DataFrame([{"ID":fake.msisdn(),
    "Name":fake.first_name()+' '+fake.last_name(),
    "Birthdate":fake.date(pattern="%Y-%m-%d", end_datetime=None),
    "Mobile":fake.phone_number()} for _ in range(100)])

หรือจะทำเป็น function เพื่อให้เรียกใช้ นอกจากจะช่วยให้สร้างข้อมูลแยกหลายๆ Dataframe ได้ง่ายแล้ว ยังกำหนดจำนวน row ที่ต้องการได้ flexible อีกด้วย


ตัวอย่างข้างล่างคือ แปลง code ข้างบนเป็น function

import pandas as pd
from faker import Faker
def mockupdata(row):
  fake = Faker('th_TH')
  df = pd.DataFrame([{"ID":fake.msisdn(),
    "Name":fake.first_name()+' '+fake.last_name(),
    "Birthdate":fake.date(pattern="%Y-%m-%d", end_datetime=None),
    "Mobile":fake.phone_number()} for _ in range(row)])
  return df
mockup_df100 = mockupdata(100)


ป.ล. ถ้าไม่ได้สนใจจะ Mockup ข้อมูลภาษาไทย จริงๆ แล้ว Faker สามารถ Mockup ข้อมูลได้หลากหลายกว่านี้มาก ข้อมูลบางอย่างสามารถ mockup ได้เป็น set เลยไม่ต้องมาสร้างทีละอัน เช่น credit_card (fake.credit_card_full()) หรือ user profile (fake.profile()) ที่มาเป็น dictionary ให้เลย


ดูรายละเอียดเพิ่มเติมเกี่ยวกับข้อมูลที่ Faker สร้าง Mockup ทั้งหมดได้ที่ https://faker.readthedocs.io/en/master/providers.html

0
36