Tutorial

Humanise the Number in Python with "Humanize"

By Arnon Puitrakul - 13 มีนาคม 2023

Humanise the Number in Python with "Humanize"

เมื่อหลายวันก่อน เรานั่งเขียนงานอยู่ชิ้นนึง แล้วเราต้องการ จัดการตัวเลข และ พวกเวลาหลาย ๆ อย่าง เพื่อให้เราอ่านแล้วเข้าใจ และ อ่านได้ง่าย เช่นพวกตัวเลข เราอยากจะได้ตัวเลขที่ใส่ Comma มา เช่น 1,000 เราอยากได้แบบนี้ แต่ถ้าเรา Print จาก Python มาตรง ๆ มันจะได้ 1000 แทน ทำเองก็เสียเวลาจนไปเจอ Library ตัวนึงที่ชื่อว่า Humanize วันนี้เลยจะเอามาเขียนให้อ่านกันว่า มันทำอะไรได้บ้าง

Number

สำหรับการ Format ตัวเลข มันทำได้เยอะมาก ๆ แต่เราจะหยิบอันที่เราใช้งาน และ เราคิดว่า เออ มันทำให้เราทำงานได้ง่ายขึ้นมาเล่นให้ดูกันดีกว่า

> import humanize
> humanize.intcomma(1_000)

'1,000'

เริ่มอยาก Feature ที่เราอยากได้มาใช้งานเลยคือ การใส่ Comma ให้กับตัวเลข มันใช้ Function ที่ชื่อว่า intcomma() เราแค่ใส่ตัวเลขเข้าไป แล้วมันจะแปลงออกมาเป็น String ที่ใส่ Comma ให้กับชุดตัวเลขเราเรียบร้อยแล้ว จากเดิมที่เราต้องเขียน Script ยากมาก ๆ ก็มีคนทำมาให้เราเสร็จเลย

> humanize.intword (2_000)

'2.0 thousand'

นอกจากนั้น เวลาเราแสดงผลตัวเลขเยอะ ๆ เช่นหลักล้าน หรือมากกว่านั้น ถึงเราจะใส่ Comma แล้วก็เถอะ มันก็ยังอ่านยากอยู่ดี ทำให้ Function intword() เข้ามาช่วยเราเยอะมาก ๆ เพราะมันจะแปลงให้มันมีข้อความที่ทำให้อ่านได้ง่ายขึ้น ตัวอย่างด้านบน เราใส่ไป 2000 มันก็แปลงออกมาเป็น 2.0 พัน อ่านง่ายกว่าเดิมเยอะมาก ๆ แต่เอ๊ะ อ่านแปลก ๆ นะ 2.0 พัน

> humanize.intword (2_000, '%d')

'2 thousand'

เราสามารถใช้ Number Format เป็นอีก Argument ใส่เข้าไปได้ เช่น เราใส่ %d ก็คือ Integer ใช่มั้ยฮะ มันก็เลยออกมาเป็น 2 พัน เฉย ๆ หรือจริง ๆ ถ้าเราทำให้ดีนะ เราสามารถเช็คได้เลยนะว่า มันมีจุดตามท้ายมั้ย แล้วถ้าไม่มี เราก็ใช้เป็น 2 พัน แต่ถ้ามันมีเช่น 2100 เราก็ให้มันออกมาเป็น 2.1 พันอะไรแบบนั้นก็ได้นะ เช็คเอาไม่ยากเท่าไหร่

> humanize.scientific(312400000000000000, 3)

'3.124 x 10¹⁷'

ด้วยความที่เราเขียนโปรแกรมสำหรับทำงานทางวิทยาศาสตร์ ทำงานกับตัวเลขขนาดใหญ่มาก ๆ ทำให้ การแสดงผลเป็น Scientific Notation ทำให้เราทำงานได้ง่ายขึ้นเยอะ แต่ถ้าให้เรามานั่งเขียนเองมันก็ได้แหละ แค่มันเสียเวลาเท่านั้นแหละ ใน Humanize เขาทำมาให้เราเรียกใช้งานผ่าน Function scientific() ได้ตรง ๆ เลย

> humanize.metric(2120, 'B')
'2.12 kB'

และสุดท้าย อันนี้คือแบบ เออ เขียนเองมันก็ไม่ยากนะ แต่เหนื่อยเช็ค อันนี้มาจากเรื่องจริงเลยคือ เราเขียนโปรแกรมที่ทำงานเกี่ยวกับพวก Bioinformatics เรายุ่งกับขนาดของ DNA อะไรพวกนั้น เช่น 2,000 Bases (เราจะย่อเป็น B) ตัวเลขที่เข้ามา มันมีตั้งแต่หลักพัน ยัน พันล้าน เลย ถ้าเรามานั่งเช็คทุก Prefix มันก็ทำได้แหละ แต่ ทำไมเราต้องมานั่งเขียนเองวะ ไม่เอาเวลาไป Focus กับ Logic ของมันมากกว่าอะไรแบบนั้น จนไปเจอ Function metric แหละ โอ้ววววว ใช้ค่ะ

สิ่งที่ metric() ทำคือ มันจะแปลงหน่วยให้เราตาม Prefix บนระบบ Matric ที่เรารู้จักกันเช่นพวก Kilo (k) และ Mega (M) อะไรพวกนั้น สิ่งที่เราจะต้องใส่เข้าไปคือ จำนวนตัวเลขของเรา พร้อมกับหน่วย เช่นในตัวอย่างด้านบน เราใส่เป็น B หรือ Bases พอเรายัดตัวเลข 2120 มันเลยออกมาเป็น 2.12 kB ไปเลย แน่นอนว่า เราเอามาใช้กับอะไรก็ได้ที่เราต้องการจะอ้างอิงด้วย Prefix ในระบบ Metric ได้หมดเลย ทั้งพวกขนาดไฟล์ และ อื่น ๆ ได้หมดเลย

อย่างที่บอกว่าในหมวดของตัวเลข มันทำได้เยอะกว่านี้อีก แต่อันนี้เป็น 4 Functions ที่เราใช้งานบ่อย ๆ ในงานที่เราทำเลย เป็นตัวที่ เออ มันก็เขียนเองได้แหละ แต่ขี้เกียจ เสียเวลาอะ ใช้ Library แหละ ง่ายดี

File Size

อีกอันที่เราไปเปิด Documentation มาแล้วก็เอ๊ะ มันเอามาทำไมวะ แต่เอาเถอะสะดวกดีคือ File Size หรือการจัดการพวกขนาดไฟล์ คิดถึงเวลาเราทำงานปกติ เราก็จะได้ขนาดไฟล์มาเป็น Byte ใช่มะ ใช้ os.path.getsize() ใน Python แล้วเราอาจจะต้องการแปลงให้มันอยู่ในรูปแบบที่อ่านง่าย เราก็อาจจะใช้ humanize.metric() ได้เลย แต่อันนี้คือ ไม่ ๆ เขามี Function เฉพาะกับขนาดไฟล์ให้เราเลย

> humanize.naturalsize(2000)
'2.0 kB'

Function ที่เอามาให้เราทำงานกับขนาดของไฟล์คือ humanize.naturalsize() สิ่งที่เจ๋งขึ้น ที่เราเห็นได้ชัดคือ เราไม่ต้องใส่หน่วย เพราะมันจะ Assume เลยว่า เลขที่เราใส่เข้ามา เราให้หน่วยเป็น Byte มาให้เราเลย ดังนั้น เมื่อเราใส่ 2,000 เข้าไป มันจะคิดว่าเป็น 2,000 Bytes เลยกลายเป็น 2.0 kB ให้เราทันที

> humanize.naturalsize(2000, True)
'2.0 KiB'

หรือ ถ้าเราต้องการแสดงผลเป็น Binary Prefix มันก็มีมาให้เราเหมือนกัน เออ นี่แหละ ทำไมถึงใช้ metrics() เฉย ๆ มันไม่ได้ เพราะแบบนี้เลย หรือเรายังสามารถแปลงเป็นพวก GNU style ได้เลย มันทำได้หมด ติดใจจริงอะไรจริง

สรุป

Humanize เป็น Library บน Python ที่ทำให้เราสามารถแปลงตัวเลขออกมาให้อยู่ในรูปที่คนเราอ่านแล้วเข้าใจได้ง่าย โดยที่เขาเตรียมทุกอย่างมาให้เราหมดแล้ว เราแค่เรียก Function เขาขึ้นมา ทำให้เรามีเวลาไปทำอย่างอื่นขึ้นเยอะ แต่จริง ๆ มันทำงานกับพวกเรื่องของเวลาได้ด้วยนะ แต่เราแนะนำว่า ถ้าจะเล่นพวกเวลา ลองไปดู Pendulum เราเคยเขียนไว้ละ มันมี Function สำหรับ ทำให้เวลามันอยู่ในรูปที่คนอ่านได้ง่ายอยู่เหมือนที่ Humanize ทำได้เลย แต่มันมี DataType กับพวก Support Function เตรียมมาให้เราทำงานได้ง่ายกว่าเยอะ ก็ลองไปเล่นกันได้

Read Next...

จัดการข้อมูลบน Pandas ยังไงให้เร็ว 1000x ด้วย Vectorisation

จัดการข้อมูลบน Pandas ยังไงให้เร็ว 1000x ด้วย Vectorisation

เวลาเราทำงานกับข้อมูลอย่าง Pandas DataFrame หนึ่งในงานที่เราเขียนลงไปให้มันทำคือ การ Apply Function เข้าไป ถ้าข้อมูลมีขนาดเล็ก มันไม่มีปัญหาเท่าไหร่ แต่ถ้าข้อมูลของเราใหญ่ มันอีกเรื่องเลย ถ้าเราจะเขียนให้เร็วที่สุด เราจะทำได้โดยวิธีใดบ้าง วันนี้เรามาดูกัน...

ปั่นความเร็ว Python Script เกือบ 700 เท่าด้วย JIT บน Numba

ปั่นความเร็ว Python Script เกือบ 700 เท่าด้วย JIT บน Numba

Python เป็นภาษาที่เราใช้งานกันเยอะมาก ๆ เพราะความยืดหยุ่นของมัน แต่ปัญหาของมันก็เกิดจากข้อดีของมันนี่แหละ ทำให้เมื่อเราต้องการ Performance แต่ถ้าเราจะบอกว่า เราสามารถทำได้ดีทั้งคู่เลยละ จะเป็นยังไง เราขอแนะนำ Numba ที่ใช้งาน JIT บอกเลยว่า เร็วขึ้นแบบ 700 เท่าตอนที่ทดลองกันเลย...

Humanise the Number in Python with "Humanize"

Humanise the Number in Python with "Humanize"

หลายวันก่อน เราทำงานแล้วเราต้องการทำงานกับตัวเลขเพื่อให้มันอ่านได้ง่ายขึ้น จะมานั่งเขียนเองก็เสียเวลา เลยไปนั่งหา Library มาใช้ จนไปเจอ Humanize วันนี้เลยจะเอามาเล่าให้อ่านกันว่า มันทำอะไรได้ แล้วมันล่นเวลาการทำงานของเราได้ยังไง...

ทำไม 0.3 + 0.6 ถึงได้ 0.8999999 กับปัญหา Floating Point Approximation

ทำไม 0.3 + 0.6 ถึงได้ 0.8999999 กับปัญหา Floating Point Approximation

การทำงานกับตัวเลขทศนิยมบนคอมพิวเตอร์มันมีความลับซ่อนอยู่ เราอาจจะเคยเจอเคสที่ เอา 0.3 + 0.6 แล้วมันได้ 0.899 ซ้ำไปเรื่อย ๆ ไม่ได้ 0.9 เพราะคอมพิวเตอร์ไม่ได้มองระบบทศนิยมเหมือนกับคนนั่นเอง บางตัวมันไม่สามารถเก็บได้ เลยจำเป็นจะต้องประมาณเอา เราเลยเรียกว่า Floating Point Approximation...