You are on page 1of 26

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH

TRƯỜNG ĐẠI HỌC KINH TẾ - LUẬT

BÁO CÁO
Môn học: KỸ THUẬT LẬP TRÌNH
Tên đề tài: Thư viện Polars
Giảng viên hướng dẫn: TRƯƠNG HOÀI PHAN
TRẦN DUY THANH

Nhóm: Masterchef

ST Họ và tên MSSV Đóng góp


T

1 Nguyễn Quỳnh Anh K224161805 100%

2 Nguyễn Thị Hương Giang K224161810 100%

3 Lê Minh Nguyên K224161829 100%

4 Lê Hoàng Yến K224161846 100%

Thành phố Hồ Chí Minh, ngày 19 tháng 04 năm 2023

1
2
LỜI MỞ ĐẦU
Trong cuộc sống hiện đại, dữ liệu đã trở thành một yếu tố quan trọng và không thể
thiếu trong nhiều lĩnh vực khác nhau, từ kinh doanh đến y tế, giáo dục và nghiên cứu
khoa học. Từ các doanh nghiệp đến các cơ quan chính phủ và các tổ chức phi chính phủ,
tất cả đều sử dụng dữ liệu để đưa ra quyết định và định hướng cho hoạt động của mình.
Trong kinh doanh, dữ liệu giúp các doanh nghiệp hiểu rõ hơn về khách hàng của
họ, định hướng cho các chiến lược tiếp thị và tìm ra các cơ hội kinh doanh mới. Trong y
tế, dữ liệu giúp các chuyên gia y tế nghiên cứu các bệnh lý và tìm ra các xu hướng mới
trong các bệnh tật. Trong giáo dục, dữ liệu giúp đưa ra quyết định về việc đầu tư vào các
khoản chi phí và cải thiện chất lượng giáo dục.
Nhưng để đem lại các hiệu quả trên, dữ liệu thu thập được cần phải được lọc, phân
tích và liên kết một cách chính xác, rõ ràng. Và thư viện Polars trong Python là một lựa
chọn tuyệt vời để thực hiện việc này.
Trong báo cáo này, chúng ta sẽ tìm hiểu sâu hơn về thư viện Polars và các tính
năng mạnh mẽ của nó trong phân tích dữ liệu. Báo cáo bao gồm các nội dung chính như
giới thiệu, phân tích các tính năng cơ bản của thư viện cũng như một vài cấu trúc hàm xử
lý dữ liệu cơ bản của Polars.
Qua bài báo cáo này, chúng ta sẽ hiểu rõ hơn về cách sử dụng Polars để thực hiện
công việc phân tích dữ liệu một cách dễ dàng và hiệu quả, từ đó đưa ra các quyết định và
định hướng tốt nhất từ những dữ liệu mình có.

3
MỤC LỤC
I. Giới thiệu chung................................................................................................................................4
1. Giới thiệu về Polars.......................................................................................................................4
2. Polars và các thư viện tương tự....................................................................................................4
2.1. Pandas.....................................................................................................................................5
2.2. Dask.........................................................................................................................................6
2.3. Spark.......................................................................................................................................6
3. Cài đặt và sử dụng.........................................................................................................................7
II. Cấu trúc dữ liệu trong Polars:..........................................................................................................7
1. Series...............................................................................................................................................7
1.1. Khái niệm................................................................................................................................7
1.2. Thao tác...................................................................................................................................7
1.2.1. Khởi tạo...............................................................................................................................7
1.2.2. Truy xuất.............................................................................................................................9
1.2.3. Sắp xếp..............................................................................................................................12
1.2.4. Tính toán số học................................................................................................................13
2. DataFrame....................................................................................................................................13
2.1. Khái niệm..............................................................................................................................13
2.2. Thao tác.................................................................................................................................14
2.2.1. Khởi tạo.............................................................................................................................14
2.2.2. Truy xuất dữ liệu:.............................................................................................................15
2.2.3. Sắp xếp dữ liệu:.sort()......................................................................................................19
2.2.4. Nhóm dữ liệu: .groupby().................................................................................................19
2.2.5. Lưu/Xuất dữ liệu...............................................................................................................20
III. Lazy API.......................................................................................................................................20
1. Sử dụng lazy API.............................................................................................................................21
1.1. Từ File........................................................................................................................................21
1.2. Từ DataFrame...........................................................................................................................21
2. Lấy thông tin dữ liệu trong lazy API..............................................................................................21
2.1. Nhập kiểm tra trong lazy API....................................................................................................22
2.2. Xử lý với các thao tác không có sẵn trên lazy API....................................................................22
3. Thực hiện truy vấn..........................................................................................................................23
IV. Kết luận........................................................................................................................................24
TÀI LIỆU THAM KHẢO.......................................................................................................................25

4
I. Giới thiệu chung
1. Giới thiệu về Polars
Polars là một thư viện xử lý dữ liệu mã nguồn mở được viết bằng ngôn ngữ Rust-
một ngôn ngữ lập trình được tối ưu cho hiệu suất cao. Điều này giúp cho Polars có thể xử
lý các tập dữ liệu lớn với tốc độ nhanh và tiêu thụ ít tài nguyên hơn so với các thư viện
khác. Ngoài Rust, Polars cũng hỗ trợ nhiều ngôn ngữ lập trình khác như Python và
NodeJS.
Polars được xây dựng trên nền tảng Arrow2, một phiên bản an toàn và hiệu quả
của Apache Arrow, cho phép sử dụng tài nguyên và xử lý dữ liệu một cách hiệu quả. Vì
thế, Polars có thể tích hợp hoàn hảo với các công cụ khác trong hệ sinh thái Arrow.
Polars chính thức ra mắt vào tháng 3 năm 2020 và được phát triển bởi Xomnia -
công ty Data & AI hàng đầu tại Hà Lan.
2. Polars và các thư viện tương tự 
Polars là thư viện giúp tính toán và phân tích dữ liệu, thực hiện các thao tác với dữ liệu
trong khoa học dữ liệu. Polars trở nên chiếm ưu thế nhờ vào tốc độ, tính hiệu quả của bộ
nhớ và việc sử dụng được đơn giản hóa. Sau đây là một vài ưu thế của Polars:
 Tốc độ: Polars được thiết kế có tốc độ nhanh kể cả khi phải xử lý với những dữ
liệu lớn có dung lượng lên đến 50 GB vì nó được xây dựng với tính năng hiệu quả
của bộ nhớ 

5
Hình 1.So sánh thời gian đọc giữa Pandas và Polars
 Dễ sử dụng: API trong Polars có tính trực quan, dễ hiểu và đơn giản. Ngoài ra nó
cũng tương thích với thư viện Pandas, giúp dễ dàng để chuyển đổi giữa hai thư
viện.
 Sự linh hoạt: Thư viện Polars hỗ trợ nhiều định dạng dữ liệu như: CSV, Excel,
Parquet, Arrow,... và các kiểu dữ liệu như: số thực, số nguyên, chuỗi,…
 Hiệu quả bộ nhớ: Polars được thiết kế để sử dụng bộ nhớ tối thiểu điều này cho
phép Polars xử lý các tệp dữ liệu lớn mà không bị hết bộ nhớ.
 Ngoài ra trong Polars còn hỗ trợ cả eager và lazy execution giúp nó phù hợp để
thực thi trên môi trường phân tán cũng như tối ưu hóa và tăng tốc độ các truy vấn.
2.1. Pandas 
Pandas là một thư viện Python cần thiết cho khoa học dữ liệu. Nhưng nhược điểm
lớn nhất của nó là có thể hoạt động chậm trên các tập dữ liệu lớn. Polars là giải pháp thay
thế Pandas được thiết kế để xử lý dữ liệu nhanh hơn. Polars là một thư viện có phần
tương tự với Pandas nhưng ưu điểm của nó là nhanh hơn rất nhiều so với Pandas khi thực
hiện các thao tác khác nhau với Dataframe. 
Polars có hai API khác nhau: eager API và lazy API. Việc thực hiện eager API
tương tự như Pandas nghĩa là đoạn code sẽ chạy trực tiếp và kết quả của nó được trả về
ngay lập tức. Nhưng đối với lazy API thì nó sẽ không chạy được cho đến khi cần kết quả
bởi vì nó tránh chạy code không cần thiết nên đôi khi việc thực thi lazy API sẽ hiệu quả
hơn eager API. 

6
POLARS PANDAS

Chỉ mục  Không sử dụng chỉ mục (index) và Mỗi hàng sẽ có một chỉ mục 
mỗi hàng được lập theo vị trí số
nguyên trong bảng 
 giúp công việc trở nên đơn
giản hơn, rõ ràng hơn và ít
xảy ra lỗi  

Biểu thị Mảng Apache Arrow Mảng Numpy 


dữ liệu  phân tích cột trong bộ nhớ
trong bộ làm tăng thời gian tải dữ
nhớ  liệu, giảm mức sử dụng bộ
nhớ và tính toán nhanh hơn  
Hỗ trợ Sử dụng ngôn ngữ lập trình là Rust Phải dùng bổ sung đến thư viện
các hoạt nên khai thác mạnh việc xử lý đồng Dask để hỗ trợ những hoạt động
động song thời và chạy các hoạt động song song song do có một số hoạt động đa
song song  luồng nhưng thư viện lại là đơn
luồng 

Kiểm tra  Polars có “lazy evaluation” và Pandas chỉ có “eager evaluation” 


“eager evaluation”   đoạn code được kiểm tra ngay
 “ azy evaluation” mạnh vì sau khi chạy code
thực hiện tối ưu hóa truy
vấn, tăng tốc độ truy vấn và
giảm bộ nhớ 

Dữ liệu bị Dữ liệu bị thiếu tương ứng với giá Tùy thuộc vào kiểu dữ liệu của cột
mất  trị null cho tất cả các loại dữ liệu  các giá trị bị thiếu được biểu thị là
1. việc xử lý dữ liệu bị thiếu trở giá trị NaN hoặc None
nên đơn giản và nhất quán trên  hầu hết các phân tích đều có
tất cả các loại dữ liệu thêm kiểm tra null, làm ảnh
hưởng đến hiệu suất.

2.2. Dask 
Dask là một thư viện tính toán song song phổ biến và cung cấp khả năng xử lý dữ
liệu mở rộng. Dask được thiết kế để hoạt động với các tập dữ liệu rất lớn để vừa với bộ
nhớ. Dask cũng cung cấp nhiều chức năng để thao tác dữ liệu, bao gồm lọc, nhóm, tổng
hợp. Tuy nhiên, Dask có thể khó sử dụng hơn các thư viện khác và nó có thể yêu cầu các
kỹ năng lập trình nâng cao hơn thì mới có thể tận dụng hết khả năng của nó.
2.3. Spark 

7
Apache Spark là một framework tính toán phân tán phổ biến cung cấp khả năng xử
lý dữ liệu mạnh mẽ. Nó được thiết kế để hoạt động với các tập dữ liệu lớn được phân
phối trên nhiều máy. Spark cung cấp nhiều chức năng để thao tác với nhiều dữ liệu, bao
gồm lọc, nhóm và tổng hợp. Tuy nhiên, Spark có thể phức tạp hơn để thiết lập và sử dụng
so với các thư viện khác và có thể yêu cầu kiến thức chuyên môn để tận dụng tối đa khả
năng của nó.
Tóm lại, Polars là một thư viện thao tác dữ liệu mạnh mẽ cung cấp khả năng xử lý
dữ liệu nhanh và tiết kiệm bộ nhớ. Nó cung cấp nhiều chức năng để làm sạch, lọc, nhóm
và tổng hợp dữ liệu, khiến nó trở thành lựa chọn phổ biến của các nhà khoa học và nhà
phân tích dữ liệu. Mặc dù có sẵn các thư viện khác cung cấp chức năng tương tự, nhưng
Polars nổi bật nhờ hiệu suất nhanh và hỗ trợ mạnh mẽ cho quá trình xử lý song song. 
3. Cài đặt và sử dụng
Cài đặt với pip: pip install polars
Cài đặt với conda: conda install polars
Sử dụng: import polars as pl
II. Cấu trúc dữ liệu trong Polars:
1. Series
1.1. Khái niệm
Series là một loại đối tượng tương tự mảng một chiều nhưng được diễn tả theo
chiều dọc, có khả năng lưu trữ bất kỳ loại dữ liệu nào như số nguyên, số thập phân, chuỗi
hay các đối tượng trong Python.
Nó là một cột của DataFrame và được xem như là một cấu trúc dữ liệu gồm hai
mảng, trong đó một mảng lưu trữ các chỉ mục (index) và một mảng lưu trữ các giá trị
tương ứng.

Hình 2. Series
1.2. Thao tác
1.1.

8
1.2.1. Khởi tạo

Kết quả:
Lưu ý: dtype mặc định của Polars là Int64
 Tạo series từ dict

Kết quả:
 Tạo series từ series trong pandas

9
Kết quả:
 Thêm một series mới vào một series: .append()

Kết quả:
1.2.2. Truy xuất
 Truy xuất giá trị dựa vào index

Kết quả:
 Chỉ ra index phần tử có giá trị lớn nhất/nhỏ nhất: .arg_max()/.arg_min()

10
Kết quả:
 Phần tử có giá trị lớn nhất/nhỏ nhất: .max()/.min()

Kết quả:
 Giá trị trung bình của series: .mean()

Kết quả:
 Giá trị trung vị của series: .median()

Kết quả:
 Tổng các giá trị: .sum()

Kết quả:
 Tạo bảng thống kê: .describe()

11
Kết quả:
 Giá trị đầu/cuối của series: .head()/.tail()

Kết quả:
 Giá trị yếu vị (giá trị xuất hiện nhiều lần nhất): .mode()

Kết quả:
 Cập nhật giá trị theo index

12
Kết quả:
1.2.3. Sắp xếp
 Sắp xếp giá trị theo thứ tự: .sort()

Kết quả:
 Sắp xếp index theo thứ tự giá trị tăng dần: .arg_sort()

13
Kết quả:
1.2.4. Tính toán số học

Kết quả:

2. DataFrame
2.1. Khái niệm
DataFrame là một cấu trúc dữ liệu kết hợp nhiều series. Vì vậy, giống như series,
DataFrame có thể chứa bất kỳ loại dữ liệu nào. Trong DataFrame, dữ liệu được tổ chức
hai chiều với các cột (là các series) và các hàng. Các cột và hàng trong DataFrame sẽ có
các nhãn (label) tương ứng.
Với các tính năng, thao tác linh hoạt, DataFrame là một trong những cấu trúc dữ
liệu quan trọng trong phân tích dữ liệu và khoa học dữ liệu.

14
Hình 3. DataFrame là tập hợp của nhiều series
2.2. Thao tác
2.2.1.Khởi tạo
 Tạo DataFrame từ dictionary

Kết quả:
 Tạo DataFrame từ list data

15
Kết quả:
Schema: là một parameter dùng để thiết lập thông tin cấu trúc, có thể được khai
báo theo các cách sau:
 Dưới dạng một dict {name:type} hoặc một danh sách các cặp (name, type).
Nếu không điền type (None), type sẽ được mặc định là Int64.
 Dưới dạng một danh sách các tên cột. Trong trường hợp này, type cũng sẽ
được mặc định là Int64.
 Nếu bạn cung cấp một danh sách tên cột mà không giống với tên các cột
trong dữ liệu cơ sở, các tên cột sẽ được cập nhật theo trong schema. Số
lượng tên cột được thiết lập trong schema phải phù hợp với số cột trong dữ
liệu cơ sở.

 Đọc dữ liệu từ file CSV thành DataFrame: .read_csv()

Kết quả:

Ngoài CSV, Polars có thể tạo DataFrame từ nhiều file có định dạng khác bao gồm
Excel, Arrow, ORC, Avro,…
2.2.2.Truy xuất dữ liệu:
Trước tiên tạo một DataFrame đơn giản dùng để làm dữ liệu cho các thao tác phía
dưới

16
Kết quả:
 Truy xuất dữ liệu theo dòng: .filter()
Hàm này nhận vào một biểu thức điều kiện và trả về một DataFrame mới
chỉ chứa các dòng thỏa điều kiện đó

Kết quả:
Chúng ta có thể đưa ra nhiều điều kiện bằng toán tử &

17
Kết quả:
 Truy xuất dữ liệu theo cột: .select()
Dữ liệu có thể được truy xuất theo:
 Tên cột

Kết quả:
 Danh sách các tên cột 

Kết quả:
 Các điều kiện ở tên cột

18
Kết quả:
 Dtype của các cột

Kết quả:
 Truy xuất dữ liệu theo dòng và cột 
Chúng ta có thể kết hợp hai hàmphương .filter() và .select() để chọn cả
hàng và cột 

19
Kết quả:
2.
2.1.
2.2.
2.2.3. Sắp xếp dữ liệu:.sort()
Cú pháp: DataFrame.sort(by_column: Union[str, List[str]], reverse: bool = False)
Trong đó:
 by_column: Tên của cột hoặc danh sách các tên cột dữ liệu được sắp xếp.
Nếu truyền vào danh sách các tên cột thì việc sắp xếp sẽ được ưu tiên theo
thứ tự các tên cột có ở đầu danh sách.
 reverse: Giá trị boolean quyết định việc sắp xếp theo chiều giảm dần hay
tăng dần. Mặc định là False.

Kết quả:

20
2.2.4.Nhóm dữ liệu: .groupby()

Groupby nhóm các hàng theo các cột cụ thể. Từ đó, ta có thể dễ dàng tính toán
thống kê dữ liệu.

Kết quả:
2.2.5.Lưu/Xuất dữ liệu
Chuyển dữ liệu từ DataFrame thành file CSV: .write_csv()

Kết quả:

21
Ngoài CSV, Polars còn có thể xuất file ra nhiều định dạng khác bao gồm JSON,
Feather/ IPC, Parquet, Excel,… với cú pháp tương tự.
III. Lazy API
Lazy API là chìa khóa để Polars trở thành một thư viện phân tích dữ liệu mạnh mẽ,
tuy không có tính toán phân tán, nhưng các truy vấn sẽ được tối ưu hóa để thực hiện ít
công việc hơn. Lazy API cho phép người dùng tối ưu hóa truy vấn trước khi chạy và đặc
biệt với các bộ dữ liệu lớn việc sử dụng lazy API trở nên vô cùng hiệu quả 
1. Sử dụng lazy API
1.1. Từ File 
Sử dụng lazy API ngay từ một tệp vì trình tối ưu hóa truy vấn có thể giúp giảm
lượng dữ liệu được đọc từ tệp.
Truy vấn với .scan_csv()
 Tải dữ liệu từ tệp CSV
 Chuyển đổi cột name thành chữ hoa
 Áp dụng bộ lọc cho cột age

Hàm .scan() có sẵn cho một số loại tệp bao gồm CSV , Parquet , IPC và JSON 
1.2. Từ DataFrame
Gọi .lazy() trong DataFrame đã được tạo sẵn trong bộ nhớ, bằng cách này sẽ
chuyển từ DataFrame thành LazyFrame.

Kết quả :

22
2. Lấy thông tin dữ liệu trong lazy API 
Hàm này trả về một đối tượng Schema, chứa thông tin về các cột của DataFrame,
bao gồm tên, kiểu dữ liệu và giá trị mặc định (nếu có).

Kết quả:
2.1. Nhập kiểm tra trong lazy API 
Một ưu điểm của lazy API là Polars sẽ kiểm tra việc lấy thông tin trước khi bất kỳ
dữ liệu nào được xử lý. Kiểm tra này xảy ra khi bạn thực hiện “ lazy” truy vấn 
Hàm .round() được thực hiện ở cột số nguyên có tên là “bar”

Kết quả:  
Hàm .round() chỉ hợp lệ cho các cột có dtype là float64. Gọi .round() ở cột số
nguyên có nghĩa là thao tác sẽ gây ra lỗi SchemaError. Nếu mà thực hiện truy vấn này ở
chế độ “eager”, lỗi sẽ chỉ được tìm thấy khi dữ liệu đã được xử lý trong tất cả các bước
trước đó.
Ngược lại khi thực hiện với chế độ “lazy”, Polars sẽ kiểm tra bất kỳ lỗi
SchemaError nào trước bước tốn nhiều thời gian để xử lý dữ liệu trong quy trình.
2.2. Xử lý với các thao tác không có sẵn trên lazy API 
Khi quy trình có một hoạt động không có sẵn trong lazy API thì thực hiện như sau:
 Tạo một DataFrame đơn giản
 Chuyển đổi DataFrame thành Lazy Frame với .lazy()
 Sử dụng .with_columns()
 Thực hiện truy vấn .collect() để được DataFrame
 Sử dụng .pivot() trên DataFrame
 Chuyển đổi trở lại chế độ “lazy”
 Sử dụng .filter()
 Kết thúc truy vấn với .collect() để được một DataFrame

23
Kết quả:

3. Thực hiện truy vấn 


Dữ liệu mẫu ban đầu từ file CSV: 

Để thực hiện truy vấn trên tập dữ liệu đầy đủ bằng cách gọi hàm .collect() trên
truy vấn

24
Kết quả:
Với hàm .collect() mặc định, Polars xử lý tất cả dữ liệu thành một đợt. Điều này có
nghĩa là tất cả dữ liệu phải vừa với bộ nhớ khả dụng tại điểm sử dụng bộ nhớ cao nhất
trong truy vấn.
IV. Kết luận
Trong bài báo cáo này, chúng ta đã được tìm hiểu về thư viện Polars trong Python,
một công cụ hữu ích giúp xử lý dữ liệu một cách nhanh chóng và hiệu quả. Chúng ta đã
đi sâu vào các tính năng cơ bản của thư viện và tìm hiểu cách sử dụng chúng qua các ví
dụ cụ thể để thực hiện các thao tác phân tích dữ liệu phổ biến.
Như vậy, chúng ta có thể thấy rằng Polars là một công cụ mạnh mẽ để xử lý dữ
liệu trong Python, với khả năng hỗ trợ các tính năng phức tạp như phân tích đa luồng, xử
lý dữ liệu theo cột và hàng, trộn dữ liệu từ nhiều nguồn khác nhau, và nhiều hơn nữa.
Với sự tiện lợi và hiệu quả của Polars, chúng ta có thể dễ dàng và nhanh chóng
phân tích dữ liệu một cách đáng tin cậy, giúp giải quyết các vấn đề phức tạp trong các dự
án dữ liệu của chúng ta. Từ đó, Polars đóng góp đáng kể vào quá trình phát triển và
nghiên cứu khoa học dữ liệu.

25
TÀI LIỆU THAM KHẢO

Hiếu, N. V. (2023, March 11). Polars - Xử lý dữ liệu dạng bảng nhanh hơn với Polars.

Blog.luyencode.net. https://blog.luyencode.net/xu-ly-du-lieu-dang-bang-voi-polars/

Introduction - Polars - User Guide. (n.d.). Pola-Rs.github.io. Retrieved April 24, 2023, from

https://pola-rs.github.io/polars-book/user-guide/

Lee, W.-M. (2022, July 15). Understanding Lazy Evaluation in Polars - Towards Data Science.

Medium; Towards Data Science. https://towardsdatascience.com/understanding-lazy-

evaluation-in-polars-b85ccb864d0c

McKinney, W. (2017, September 21). Apache Arrow and the “10 Things I Hate About pandas”

- Wes McKinney. Wesmckinney.com. https://wesmckinney.com/blog/apache-arrow-

pandas-internals/

Monigatti, L. (2023, January 19). Pandas vs. Polars: A Syntax and Speed Comparison. Medium.

https://towardsdatascience.com/pandas-vs-polars-a-syntax-and-speed-comparison-

5aa54e27497e

panData. (2023, March 3). Discover the Power of Polars Library for Fast and Efficient Data

Manipulation in Python. Medium. https://python.plainenglish.io/discovering-polars-

library-1d63c1eefb44

Polars, lightning-fast DataFrame library. (n.d.). Www.pola.rs. Retrieved April 24, 2023, from

https://www.pola.rs/

Using the Polars DataFrame Library. (n.d.). Www.codemag.com. Retrieved April 24, 2023,

from https://www.codemag.com/Article/2212051/Using-the-Polars-DataFrame-Library

26

You might also like