Triết lý thiết kế của Great Tables
(posit-dev.github.io)- Great Tables là một gói tạo bảng nhằm giữ quy trình phân tích dữ liệu trong mã Python, đồng thời hồi sinh năng lực biểu đạt tinh xảo của bảng in giữa thế kỷ 20
- Bảng không chỉ là một lưới hàng-cột đơn giản, mà là một hình thức trình bày thông tin giúp dễ tìm và so sánh giá trị thông qua thứ tự cột, nhãn và đường phân cách
- Từ bảng đất sét Sumer cổ đại đến Manual of Tabular Presentation, bảng đã phát triển đồng thời về mật độ thông tin và hình thức, nhưng các bảng tính thời kỳ đầu thiếu năng lực biểu đạt so với sự tiện lợi trong tính toán
- Great Tables chia bảng thành 6 thành phần và tách riêng cấu trúc, định dạng và tạo kiểu bằng các API họ
tab_*,fmt_*,opt_*() - Gói này tập trung vào việc nâng chất lượng xuất bản và trình bày của bảng tóm tắt tĩnh dùng trong bài báo, sách và báo cáo hơn là khám phá tương tác dữ liệu lớn
Vấn đề tiến thoái lưỡng nan trong tạo bảng mà Great Tables muốn giải quyết
- Bảng quan trọng ở bước cuối khi trình bày thông tin, tương tự như biểu đồ; thiết kế bảng hiệu quả đòi hỏi nhiều sự tinh tế và sắc thái hơn người ta tưởng
- Ngày nay, người làm dữ liệu thường phải thỏa hiệp giữa hai lựa chọn
- Sao chép dữ liệu sang công cụ như Excel rồi dựng lại bảng
- Hiển thị nguyên một bảng chưa được trau chuốt
- Great Tables là gói muốn giải quyết thế lưỡng nan này bằng giao diện dựa trên mã Python
- Mục tiêu là xử lý từ thu thập dữ liệu, phân tích đến tạo bảng tóm tắt ngay trong Python, đồng thời vẫn tạo được bảng có sức biểu đạt cao
Định nghĩa cơ bản của bảng và các yếu tố dễ đọc
- Bảng có thể được tóm gọn bằng hai quy tắc cơ bản
- Dữ liệu được biểu diễn bằng cột và hàng
- Dữ liệu chủ yếu được biểu diễn bằng văn bản
- Bảng ví dụ đặt con người theo hàng, còn các thuộc tính như tên, địa chỉ, thành phố, mã bưu chính, ngày sinh, chiều cao và cân nặng theo cột
- Cách bố trí này giúp dễ tìm từng giá trị riêng lẻ hoặc so sánh qua lại giữa hàng và cột
- Đường kẻ ngang giữa các hàng không phải điều kiện bắt buộc, nhưng đóng vai trò bổ trợ để phân biệt trực quan từng hàng
- Thứ tự cột cũng ảnh hưởng trực tiếp đến khả năng đọc
- Nếu cột
Namenằm ở ngoài cùng bên phải, chủ thể của từng bản ghi không hiện ra ngay, khiến người đọc dễ bối rối hơn - Nhãn cột cho biết mỗi cột chứa loại dữ liệu nào, và trong đa số trường hợp giúp giảm việc phải suy đoán
- Nếu cột
Lịch sử bảng thời cổ đại
- Bảng bắt nguồn từ lưới ô vuông, một dạng vật chứa có thể chứa thông tin
- Trên vách hang Lascaux và Niaux ở Pháp còn lại các biểu diễn dạng lưới từ khoảng 25.000 năm trước
- Vào thế kỷ 2 TCN, Hipparchus dùng vĩ độ và kinh độ để biểu thị vị trí thiên thể và vị trí trên mặt đất; khoảng năm 150 SCN, Geographia của Ptolemy có bao gồm phương pháp lập bản đồ dựa trên lưới
- Centuriation của La Mã là một hệ thống đo đạc đất đai tạo thành lưới ô vuông thông qua đường sá, kênh đào và đất canh tác
- Sau khi nông nghiệp lan rộng khoảng 10.000 năm trước, nhu cầu ghi chép và quản lý các giao dịch kinh tế liên quan đến nông nghiệp, gia súc và phân công lao động tăng lên
Cấu trúc bảng của Sumer và Mesopotamia
- Các thành phố Mesopotamia vào thiên niên kỷ 4 TCN giao thương với các vương quốc xa xôi và cần lưu giữ hồ sơ; những bảng đất sét được tìm thấy ở Uruk còn lưu lại các bảng sơ khai nhưng tinh vi
- Bảng đất sét Uruk khoảng năm 3200–3000 TCN ghi lại lượng lúa mạch và mạch nha được giao để sản xuất bia
- Cấu trúc được đọc từ phải sang trái
- Mỗi ô chứa chữ tượng ý biểu thị từ ngữ/khái niệm và chữ số biểu thị số lượng
- Khoảng hai hàng tương ứng với một người
- Hai cột bên phải chứa lượng mạch nha và lúa mạch
- Cột thứ ba chứa tổng phụ theo từng người, còn cột ngoài cùng bên trái hiển thị tổng cộng
- Hàng dưới cùng có tên viên chức phụ trách, hoạt động giống như phần chân bảng
- Khoảng một nghìn năm sau, bảng đất sét của đền Enlil ở Nippur ghi nguồn thu và chi tiêu hằng tháng cho 50 nhân sự của đền
- Có thể thấy một lưới đều đặn hơn
- Có tiêu đề cột dưới dạng tên tháng và tiêu đề hàng dưới dạng tên cá nhân/nghề nghiệp
- Bao gồm các ô trống không có thông tin, giá trị số, tổng phụ theo đơn vị 6 tháng, tổng cộng và chú thích giải thích
- Về sau, chất liệu của bảng chuyển từ đất sét sang bảng sáp, giấy cói rồi giấy, đồng thời kỹ thuật viết và thiết kế bảng cũng thay đổi theo
Đỉnh cao của thiết kế bảng giữa thế kỷ 20
- Giữa thế kỷ 20 được xem là giai đoạn thiết kế bảng đặc biệt mạnh
- Các công nghệ tạo tài liệu như in offset, máy đánh chữ và varitype đã phát triển đủ để dàn trang các thành phần bảng một cách chính xác
- Dù có giới hạn về không gian trang, vẫn tồn tại nhiều giải pháp để đặt bảng vừa trong một trang hoặc chia bảng qua nhiều trang
- Khi kỹ thuật in ấn nâng cao kết hợp với tri thức thiết kế bảng, người ta có thể tạo ra những bảng đẹp
- Manual of Tabular Presentation của Cục Điều tra Dân số Hoa Kỳ là công trình bàn chi tiết về thiết kế lý tưởng cho các bảng có mật độ thông tin cao
- Đặt tên và mô tả nghiêm ngặt nhiều phần của bảng
- Đưa ra khuyến nghị mạnh mẽ về những điều nên và không nên làm trong nhiều tình huống lập bảng
- Cho thấy bảng vừa có thể đẹp mắt vừa chứa được nhiều thông tin
- Great Tables vay mượn nhiều nguyên tắc thiết kế bảng từ tài liệu này, và xuất phát từ tiền đề rằng các nguyên tắc đó đến nay vẫn còn hiệu lực
Sự thụt lùi và giới hạn sau bảng tính
- Khi công nghệ điện toán trở nên dễ tiếp cận hơn vào thập niên 1970–1980, con người có thể tạo bảng ở dạng điện tử và dạng in
- Việc phổ biến các bảng có thể tính toán có thể được xem là bắt đầu cùng VisiCalc vào năm 1979
- VisiCalc có thể tính giá trị nhanh chóng, nhưng khả năng biểu đạt để tạo bảng trình bày còn hạn chế
- Không thể áp dụng kiểu đường viền phục vụ trình bày cho các ô trong lưới
- Không thể định dạng giá trị
- Cũng không thể in bảng
- Trong 10–15 năm sau đó, bảng trong bảng tính trở nên đẹp hơn
- Đầu thập niên 1990, Excel có thể kẻ viền cho bảng
- Hỗ trợ typography tốt hơn
- Chức năng định dạng giá trị cũng đầy đủ hơn
- Tuy vậy, bảng Excel trong 30 năm gần đây vẫn được đánh giá là khó đạt đến mức của Manual of Tabular Presentation
- Khi phân tích dữ liệu cũng diễn ra bên ngoài Excel, ba kịch bản kém hiệu quả xuất hiện
- Xử lý cả phân tích và tạo bảng trong Python, nhưng chất lượng bảng thấp
- Xử lý cả phân tích và tạo bảng trong Excel, nhưng độ linh hoạt phân tích thấp
- Phân tích trong Python rồi sao chép sang Excel để tạo bảng, nhưng không tái lập được
Mô hình bảng của Great Tables
- Great Tables là một gói Python muốn kết hợp vẻ thanh lịch của bảng giữa thế kỷ 20 với sức mạnh của giao diện mã
- Bảng được biểu diễn như tổ hợp của 6 thành phần độc lập
- Table Header: không gian đặt tiêu đề và phụ đề để mô tả ngắn gọn nội dung bảng
- Column Labels: định nghĩa nội dung của từng cột; spanner là tiêu đề đặt phía trên một nhóm nhiều cột
- Stub Head: vị trí phía trên bên trái, nơi có thể đặt nhiều kiểu nhãn khác nhau
- Row Stub: khu vực dành cho thông tin hàng và nhãn nhóm hàng
- Table Body: khu vực chứa các ô và là nơi dữ liệu nằm
- Table Footer: không gian chứa thông tin bổ sung liên quan đến nội dung bảng
- Great Tables được dùng theo cách tạo phần thân bảng bằng mã, rồi lặp lại việc thêm styling, định dạng và các thành phần khác
- Mã ví dụ bắt đầu từ
GT(simple_table, rowname_col="Name"), rồi thêm tiêu đề, stub head, column spanner, source note, định dạng ngày/số nguyên và các tùy chọn kiểu dáng - Trong bảng ví dụ, row stub màu xanh phân tách nhãn hàng với phần thân bảng
- Vì mỗi người là một quan sát riêng biệt, chủ thể của hàng được nhấn mạnh
- Tiêu đề mô tả nội dung có trong bảng
- Các spanner
LocationvàPersonal Characteristicsgom các cột thành những nhóm có ý nghĩa - Việc dùng nhất quán đường kẻ xanh và nền ô tạo ra diện mạo chuyên nghiệp
- Các phương thức thêm thành phần bảng bắt đầu bằng
tab_- Ví dụ:
tab_header()tạo Table Header
- Ví dụ:
Định dạng và nanoplots
- Chỉ cấu trúc hóa bảng thôi là chưa đủ; mỗi lĩnh vực có yêu cầu hiển thị giá trị khác nhau
- Ngay cả một con số cũng có thể được hiển thị theo nhiều cách tùy theo chuẩn mực và kỳ vọng của cộng đồng
- Nếu tính cả ngày, giờ và tiền tệ, phạm vi định dạng còn rộng hơn
- Giá trị thô
134,000có thể được biểu diễn khác nhau tùy yêu cầufmt_scientific(): ký hiệu khoa học1.34 × 10^5fmt_number(): số theo locale Đức134.000,00fmt_integer(): số nguyên rút gọn134K
- Khi giá trị cần được truyền tải bằng hình ảnh hoặc biểu đồ, vấn đề định dạng càng lớn hơn
- Nếu một nhà phân tích y tế cần truyền đạt xu hướng cải thiện hoặc xấu đi trong kết quả xét nghiệm của bệnh nhân, việc đọc chuỗi số trên toàn bộ hàng có thể làm chậm quá trình diễn giải
fmt_nanoplot()cung cấp trực quan hóa xu hướng nhỏ ngay trong bảng thông qua nanoplots- Khi di chuột lên các điểm dữ liệu, có thể xem giá trị của từng ngày
- Nanoplots hướng tới sự cân bằng giữa khả năng diễn giải trực quan nhanh của biểu đồ và tính gọn nhẹ của bảng
- Các phương thức định dạng của Great Tables bắt đầu bằng
fmt_- Ví dụ:
fmt_date(),fmt_integer(),fmt_nanoplot()
- Ví dụ:
- Gói này cố gắng cung cấp nhiều phương thức định dạng và tùy chọn hữu ích để phù hợp với nhu cầu của nhiều người dùng
Tập trung vào bảng tóm tắt tĩnh cho xuất bản và trình bày
- Trong nhiều cách tương tác với bảng, Great Tables tập trung vào hiển thị phục vụ xuất bản và trình bày
- Trong phân tích cơ sở dữ liệu, cách hiển thị bảng đơn giản để khám phá và lọc hàng trăm, hàng nghìn hoặc nhiều bản ghi hơn có thể phù hợp
- Xuất bản kết quả là một công việc khác, nơi cấu trúc hóa, định dạng và tạo kiểu là trọng tâm
- Một cách hiển thị bảng đẹp cần đáp ứng các điều sau
- Giúp thông tin dễ tiêu hóa hơn
- Cung cấp ngữ cảnh bổ sung ở nơi cần thiết
- Tuân theo phong cách của tài liệu hoặc tổ chức
- Các trường hợp sử dụng mục tiêu là kiểu trình bày dữ liệu thường thấy trong bài báo tạp chí, sách và báo cáo
- Great Tables xem bảng tóm tắt tĩnh là một lĩnh vực đáng được tập trung riêng, và muốn giúp việc cung cấp bảng tốt hơn cho độc giả trở nên dễ dàng hơn bằng các phương thức
opt_*() - Tiêu chí thành công của gói là chất lượng của các bảng có thể tạo ra, và nhóm dự định tiếp tục cải thiện API
- Cộng đồng có thể đóng góp phản hồi qua Discord Server
1 bình luận
Các ý kiến trên Hacker News
Sẽ rất hay nếu có thêm nhiều dự án giải thích triết lý và mục tiêu của mình theo cách này
Tôi đã làm một thư viện bảng khác cho Jupyter tên là Buckaroo, nhưng cách tiếp cận thì khác
Buckaroo nhắm tới việc giúp người dùng làm việc theo kiểu tương tác, nhanh chóng thử nhiều định dạng và hàm hậu xử lý khác nhau để rút ra các insight quan trọng từ bảng
Khi làm phân tích dữ liệu khám phá cơ bản, ta thường phải gõ đi gõ lại cùng một lệnh, nên tôi cho rằng những lệnh và insight đó nên nằm ngay trong bảng
Great Tables có vẻ thiên về việc định dạng thủ công các bảng để trình bày
https://github.com/paddymul/buckaroo
https://youtu.be/GPl6_9n31NE
print()của Jupyter vàdisplay()của IPython có hạn chế là đầu ra tĩnh, chết cứng, cảm giác giống debug bằngprintfngày xưa, và tôi hiểu Buckaroo được tạo ra để giải quyết chuyện đóTôi tò mò anh/chị nhìn nhận thế nào về phím tắt và cách thao tác của Visidata
Trước đây tôi từng dùng Visidata, và luôn thắc mắc tại sao rốt cuộc nó không thể được đưa vào Jupyter để khám phá dataframe
Tôi đồng ý rằng Great Tables có vẻ là một nỗ lực khác nhằm chính thức hóa ngữ pháp bảng; xét tới sức mạnh của dạng bảng và sự lan rộng của khái niệm dataframe thông qua các hệ sinh thái R/pandas/Arrow/polars, cách tiếp cận như vậy là đáng hoan nghênh
Tuy nhiên, theo tôi biết thuật ngữ này vốn được dùng lần đầu trong ngôn ngữ thống kê S vào thập niên 90
[1] https://towardsdatascience.com/preventing-the-death-of-the-d...
Nếu chừa một chút khoảng trắng bên dưới và dùng chữ đậm, có lẽ vẫn tạo được phân cấp thị giác mà không gây nhiễu
Nền của nhãn hàng quá tối, cộng với độ đậm của chữ khiến khó đọc; màu xanh lam thật nhạt có lẽ sẽ tốt hơn
Tôi cũng không thích việc để nhãn nhóm hàng “Name” ở dạng in nghiêng
Nhãn cột cấp trên nằm lơ lửng ở giữa khiến bảng khó lướt đọc hơn; tôi nghĩ căn trái sẽ tốt hơn nhiều
Cuối cùng, tôi cũng thật sự không thích font chữ, dù có thể là do trình duyệt
Tôi đã làm một mockup với vài thay đổi, và theo tôi đây là bảng dễ đọc hơn nhiều
https://i.imgur.com/iMMf5vo.png
Cuốn này bàn về đúng những điều vừa nêu, như khả năng dễ đọc và các yếu tố cản trở thông điệp hay điểm cốt lõi của dữ liệu
Nếu bạn từng thấy sparkline, Tufte cũng là người đặt ra thuật ngữ đó
Mỗi lần review UI, tôi lại lật cuốn này để xem liệu mình có bỏ sót điều gì không; mở bất kỳ trang nào ra đọc cũng thấy thú vị
Hơn nữa còn có một bài luận dài về vì sao PowerPoint tệ
[1] https://www.edwardtufte.com/tufte/books_be
[2] https://en.wikipedia.org/wiki/Sparkline
Nếu căn trái phía trên một cột nào đó, tiêu đề ấy thường trông như cấp cao nhất trong hệ phân cấp thông tin của bảng theo một cách không đúng sự thật hoặc không chủ ý
Trong bản chỉnh sửa kiểu hiện đại chủ nghĩa ở trên, tiêu đề nói “names, addresses, characteristics” nhưng cách căn lại có vẻ như loại trừ phần tên, khiến tôi thấy khó chịu ngay
Ngược lại, sổ tay điều tra dân số căn giữa gần như mọi nhãn trong ô tương ứng; ngay cả khi không làm vậy thì phần lớn cũng là do thụt lề
Ngoài ra, nó đặt độ rộng cột theo dữ liệu chứ không theo nhãn, và không ngần ngại điều chỉnh thụt lề cũng như cách gạch nối
Kết quả là bảng vừa đặc theo chiều ngang vừa dễ hiểu một cách trực quan
Nghĩ thêm thì bản thân tiêu đề cũng không hay
Tiêu đề và chú thích cần truyền tải bối cảnh, phạm vi, mục đích; nếu không làm được thì có thể bỏ hẳn vì lỗi biên tập là không tự biện minh được cho sự tồn tại của mình
Tiêu đề hiện tại có thể đổi thành “Table 1” mà không mất thông tin hay tính khái quát
Với một bài viết muốn thảo luận và tái cấu trúc cách trình bày bảng từ các nguyên lý đầu tiên, điều này hơi đáng thất vọng
Vì tiêu đề bảng là một lớp quan trọng trong catalog thông tin, không ngạc nhiên khi sổ tay điều tra dân số dành hẳn một chương cho cấu trúc tiêu đề
Dù văn phong hơi đặc thù theo miền ứng dụng và cổ điển, nó vẫn rất đáng xem
Phần nhấn màu xanh giờ cũng trùng với tiêu đề nên bỏ hết, và việc phân biệt “personal characteristics” với “location” cũng không giúp ích có ý nghĩa cho việc tổ chức thông tin, nên tốt hơn là loại bỏ
Lịch sử gần đây hơn có việc tạo ra bảng CALS: https://en.wikipedia.org/wiki/CALS_Table_Model
Datalogics https://en.wikipedia.org/wiki/Datalogics đã tham gia sâu vào ý tưởng bảng CALS
Nhân viên Datalogics đã tham gia ủy ban ISO tạo ra SGML, và đào tạo SGML cho nhiều người, bao gồm cả nhân viên Bộ Quốc phòng Mỹ và các nhà thầu liên quan đến công tác tài liệu hóa
Họ từng tham gia nhóm làm trình soạn thảo tài liệu dựa trên SGML, trong đó một chức năng là định dạng phần tử theo ngữ cảnh SGML của phần tử đó
Việc này có trước khi XSLT và các họ công nghệ liên quan xuất hiện
Những người xuất thân từ Datalogics đã giúp Microsoft hiểu XML. Kiểu như: “Không, bạn không thể tùy ý đổi chữ hoa/thường trong thẻ phần tử XML”
Người dùng TeX cũng có những suy nghĩ khá tinh tế về định dạng bảng
Một nhánh bên lạ là, tôi từng được biết rằng nếu in toàn bộ tài liệu của một mẫu tiêm kích thời đó, nó sẽ nặng hơn chính chiếc máy bay và đủ để lấp đầy một cụm tủ hồ sơ cỡ sân bóng đá
Và dù ngày nay nhiều người không thích XML, từ góc nhìn của những người đến từ thế giới SGML thì XML là một ân phước lớn
Tôi nhớ là ngay cả phiên bản đầu cũng đã có hỗ trợ định dạng hạn chế
Theo http://www.bricklin.com/history/refcard3.htm, lệnh
/Fcó thể chỉ định căn chỉnh và đặt định dạng số, ví dụ như đô-la và xuTài liệu này dựa trên phiên bản 1.35, nhưng tôi nghĩ bản phát hành đầu tiên ít nhất cũng hỗ trợ hiển thị đô-la và xu
Ví dụ nếu chi phí là $1500, $130, $110, $210, thì văn bản ở ba hàng cuối trông như có kích thước bằng 4/5 văn bản ở hàng đầu
Nhưng cộng cả ba lại cũng chỉ bằng 1/3 số tiền ở trên cùng
Mọi người nhìn số chữ số của con số bằng mắt, và điều này gần giống log10
Vì vấn đề này xảy ra quá thường xuyên, tôi bắt đầu luôn thêm biểu đồ thanh trong ô vào các bảng tính liên quan đến tài chính
Nếu không, cuộc họp sẽ đi chệch hướng vì tranh cãi về những mục hoàn toàn nhỏ nhặt so với khoản chi lớn nhất tính theo giá trị tuyệt đối
Thực tế từng có chuyện chúng tôi tốn nhiều cuộc họp để bàn về khoản $15/tháng cho thu thập log máy chủ đám mây, trên một VM chạy database engine có riêng phí license hằng tháng đã là $15K
Tôi quản lý nó cùng Rich Iannone
Rich là lập trình viên phần mềm duy nhất tôi biết mà khi được nhờ giải thích triết lý của package, sẽ kể cho bạn nghe 5.000 năm lịch sử hiển thị bảng
Thật đáng ngạc nhiên là cách biểu diễn bảng dữ liệu ngày càng tệ đi lại bị bỏ mặc lâu đến vậy
Những bảng hiện đại giữa thế kỷ 20 được nêu trong bài thật sự trông như các ví dụ sáng chói
Nó khiến tôi muốn quay lại phân tích dữ liệu bằng Python, và tôi cũng nghĩ ra vài cải tiến, mở rộng API muốn làm
Nó rất tốt để tạo bảng HTML, nhưng phần xuất PDF và DOCX thì kém trau chuốt hơn một chút
Gần đây có vẻ hướng phát triển đã chuyển sang đưa bản Python lên ngang tầm bản R, nên tôi hơi lo tốc độ phát triển của R đã chậm lại
Dù vậy, dùng ngôn ngữ nào thì cũng đáng xem thử
Ngoài SAS, công cụ chính là một ngôn ngữ cũ tên Table Producing Language, viết tắt là TPL
Dù có nguồn gốc từ tận thập niên 1970, một khi hiểu cú pháp thì TPL linh hoạt, biểu đạt tốt và hiệu quả đến khó tin
Các nhà thiết kế Great Tables nên xem qua TPL
Nó xử lý được mọi thứ Great Tables đang hướng tới, và có thể còn có thêm vài chiêu nữa
https://www.ojp.gov/pdffiles1/Digitization/68013NCJRS.pdf
Dù sao cũng cảm ơn vì đã tạo ra Great Tables
Nó sẽ giúp cải thiện đáng kể chất lượng tạo bảng trong Python
Những người đăng bài lên Show HN nên nhìn vào mà học
Một nhánh bên thú vị là các mô hình AI học từ spreadsheet cần “bảng tốt” như tên cột, header để hiểu ngữ cảnh
Fortap là một ví dụ như vậy: https://arxiv.org/abs/2109.07323