Xử lý dữ liệu lớn bằng Python

Với các bộ dữ liệu ngày càng tăng về kích thước, việc sử dụng Pandas tối ưu ngày càng trở nên khó khăn hơn. Trong blog này, tôi sẽ chia sẻ bốn chiến lược về cách xử lý các tập dữ liệu lớn khi sử dụng Pandas

Mọi nhà khoa học dữ liệu đều biết rằng tiền xử lý dữ liệu và kỹ thuật tính năng là điều tối quan trọng đối với một dự án khoa học dữ liệu thành công. Tuy nhiên, các bước này thường tốn nhiều thời gian và khiến bạn phải đợi quá trình tính toán kết thúc, khiến bạn không thể tạo ra mô hình tuyệt vời đó. Trong bài đăng này, chúng tôi sẽ xem xét một số thủ thuật nhằm tăng tốc quy trình xử lý dữ liệu gấu trúc của bạn bằng cách cho phép Pandas sử dụng máy của bạn theo cách tối ưu

Pandas là một thư viện Python mạnh mẽ, linh hoạt và dễ sử dụng để thao tác cấu trúc dữ liệu. Đối với nhiều nhà khoa học dữ liệu như tôi, nó đã trở thành công cụ cần thiết khi khám phá và xử lý trước dữ liệu, cũng như để thiết kế các tính năng dự đoán tốt nhất. Mặc dù Pandas vẫn đang cải thiện nhanh chóng, nhưng chúng tôi thấy người dùng Pandas quay trở lại các công cụ thay thế như Spark do bộ dữ liệu trở nên quá lớn để vừa với bộ nhớ RAM. Thật không may khi bạn phải học và sử dụng một công cụ khác, chỉ vì bạn có quá nhiều dữ liệu. Do đó, tôi đã xem xét bốn chiến lược để xử lý các tập dữ liệu quá lớn đó, tất cả mà không cần rời khỏi sự thoải mái của Pandas

  • Lấy mẫu
  • chia nhỏ
  • Tối ưu hóa Pandas dtypes
  • Song song hóa Pandas với Dask

Lấy mẫu

Tùy chọn đơn giản nhất là lấy mẫu tập dữ liệu của bạn. Cách tiếp cận này có thể đặc biệt hiệu quả trong giai đoạn khám phá. dữ liệu trông như thế nào? . Thường thì một mẫu ngẫu nhiên gồm 10% của tập dữ liệu lớn như vậy sẽ chứa rất nhiều thông tin. Điều đó đặt ra câu hỏi đầu tiên, bạn có thực sự cần xử lý toàn bộ tập dữ liệu của mình để đào tạo một mô hình phù hợp không?

chia nhỏ

Nếu cần xử lý tất cả dữ liệu, bạn có thể chọn chia dữ liệu thành một số phần [bản thân dữ liệu này phù hợp với bộ nhớ] và thực hiện làm sạch dữ liệu cũng như kỹ thuật tính năng trên từng phần riêng lẻ. Ngoài ra, tùy thuộc vào loại mô hình bạn muốn sử dụng, bạn có hai tùy chọn

    • Nếu mô hình bạn chọn cho phép khớp một phần, bạn có thể huấn luyện mô hình dần dần trên dữ liệu của từng đoạn;
    • Đào tạo một mô hình trên từng đoạn riêng lẻ. Sau đó, để ghi dữ liệu mới chưa nhìn thấy, hãy đưa ra dự đoán với từng mô hình và lấy phiếu bầu trung bình hoặc đa số làm dự đoán cuối cùng

Tối ưu hóa các loại dữ liệu

Khi tải dữ liệu từ tệp, Pandas sẽ tự động nhập các kiểu dữ liệu. Tất nhiên là rất tiện lợi, tuy nhiên thường thì những kiểu dữ liệu này không tối ưu và chiếm nhiều bộ nhớ hơn mức cần thiết. Chúng tôi sẽ xem xét ba kiểu dữ liệu phổ biến nhất được sử dụng bởi Pandas - int, float và object - và chỉ ra cách giảm dấu ấn bộ nhớ của chúng trong khi xem một ví dụ

Theo mặc định, Pandas đặt dtype của số nguyên thành int64, kiểu dữ liệu này chiếm 8 byte và có thể biểu thị các số nguyên khổng lồ, từ -9223372036854775808 đến 9223372036854775807. Tuy nhiên, nhiều lần, các số nguyên đại diện cho các thực thể đếm được, chẳng hạn như số lượng ô tô hoặc số lượng khách truy cập mỗi ngày. Những loại số đó có thể dễ dàng được biểu diễn trong dtype nhỏ hơn bốn lần int16. Nếu dữ liệu của bạn nằm trong phạm vi -32768 đến 32767, hãy chuyển đổi chúng thành int16 để giảm 75% bộ nhớ. Trong trường hợp dữ liệu của bạn là dương và dưới 65535, hãy chọn biến thể không dấu, uint16

Theo cách tương tự, lớp float bao gồm float16float32 và float64, trong đó lớp float là mặc định của Pandas. Float64 có thể biểu thị cả số rất nhỏ và số lớn với độ chính xác cao, phù hợp để tính toán chính xác. Tuy nhiên, bạn thường thấy mình đang làm việc với dữ liệu vốn đã ồn ào, chẳng hạn như dữ liệu cảm biến hoặc dữ liệu có độ chính xác hạn chế, chẳng hạn như tiền tệ. Một lần nữa, các kiểu dữ liệu nhỏ hơn float32hoặc float16 sẽ phục vụ nhiều mục đích của trường hợp sử dụng và sẽ giảm dấu ấn bộ nhớ của bạn tương ứng là 50%, 75%

Một cách khác để giảm đáng kể kích thước của Khung dữ liệu Pandas của bạn là chuyển đổi các cột của đối tượng dtype thành int160. Thay vì có các bản sao của cùng một chuỗi ở nhiều vị trí trong khung dữ liệu của bạn, gấu trúc sẽ có một bản sao duy nhất từ ​​​​mỗi chuỗi và sẽ sử dụng các con trỏ dưới mui xe đề cập đến các chuỗi này. Tuy nhiên, lưu ý rằng nếu mỗi hàng có một chuỗi khác nhau, phương pháp này sẽ không hoạt động

Trong sổ ghi chép bên dưới, tôi chứng minh việc giảm dấu ấn bộ nhớ khung dữ liệu từ 88. 4%, chỉ bằng cách thay đổi kiểu dữ liệu

Khung dữ liệu Dask

Một cách khác để xử lý các khung dữ liệu lớn là khai thác thực tế là máy của chúng tôi có nhiều hơn một lõi. Với mục đích này, chúng tôi sử dụng Dask, một dự án python nguồn mở song song với Numpy và Pandas. Dưới vỏ bọc, một Khung dữ liệu Dask bao gồm nhiều khung dữ liệu Pandas được thao tác song song. Vì hầu hết API Pandas đã được triển khai, Dask có giao diện rất giống nhau, giúp tất cả những ai biết về Pandas đều dễ dàng sử dụng

Dưới mui xe, một Khung dữ liệu Dask bao gồm nhiều Khung dữ liệu gấu trúc

Một câu hỏi đặt ra là, làm cách nào để dữ liệu không vừa với bộ nhớ khi sử dụng Pandas lại vừa với bộ nhớ khi sử dụng Dask. Câu trả lời nằm ở chỗ các hoạt động và khung dữ liệu Dask rất lười biếng. Điều này có nghĩa là, các hoạt động không được thực hiện ngay lập tức, mà là xây dựng một biểu đồ nhiệm vụ. Chúng ta có thể hiểu biểu đồ này là công thức để tính toán kết quả. Khi gọi phương thức int161, trình lập lịch tác vụ Dask tích hợp sẽ phối hợp tải một phần và thao tác dữ liệu trong khi sử dụng tất cả các lõi. Ngay sau khi tất cả các kết quả trung gian được tính toán, Dask sẽ kết hợp chúng và trả về kết quả cuối cùng

Nó có phải là nghệ thuật không?

Không đi sâu vào chi tiết nữa, hãy xem xét ví dụ bên dưới, trong đó tôi sẽ thực hiện một số xử lý dữ liệu trên bộ dữ liệu New York Yellow Taxi năm 2015. Nó bao gồm 12 int162 tệp, mỗi tệp có dung lượng khoảng 2GB. Để có sự so sánh công bằng, tôi cũng đã thực hiện các bước xử lý tương tự trong Pandas. Vì bộ dữ liệu đầy đủ không vừa với bộ nhớ, máy tính xách tay của tôi đã sử dụng nhiều không gian trao đổi và nén bộ nhớ để làm cho nó hoạt động

Trong sổ ghi chép ở trên, chúng tôi đã thực hiện một số tác vụ thao tác dữ liệu trên một tập dữ liệu khá lớn bằng cả Pandas và Dask. Chúng ta có thể thấy rằng tổng thời gian chạy của Pandas lên tới 19 phút, trong khi với Dask chỉ mất 10 phút, khiến nó nhanh hơn gần gấp đôi. Ngoài ra, như đã hứa, cú pháp và các chức năng được Dask sử dụng gần như khớp với Pandas, khiến cho việc viết quy trình làm việc Dask của bạn về cơ bản trở nên đơn giản nếu bạn biết Pandas của mình

Phần kết luận

Trong bài đăng này, tôi đã chỉ ra rằng không phải tất cả đều bị mất khi tập dữ liệu của bạn quá lớn và bạn khăng khăng sử dụng Pandas. Tùy thuộc vào mục tiêu của mình, bạn có thể khắc phục các vấn đề về trí nhớ bằng cách áp dụng một trong các chiến lược được mô tả. Đối với mục đích khám phá, tốt nhất bạn nên lấy mẫu dữ liệu của mình. Trong trường hợp bạn cần xử lý tất cả dữ liệu của mình, hãy thử lặp lại dữ liệu hoặc tối ưu hóa các kiểu dữ liệu của bạn. Bộ dữ liệu của bạn vẫn còn quá lớn và bạn cảm thấy mệt mỏi với việc uống cà phê mỗi khi tính toán của mình đang chạy, vậy thì hãy truy cập Dask để song song hóa Pandas

Python có thể xử lý 1 tỷ hàng không?

Giới thiệu về Vaex. Vaex là một thư viện python là khung dữ liệu ngoài lõi, có thể xử lý tới 1 tỷ hàng mỗi giây . 1 tỷ hàng. Vâng, bạn đã đọc đúng, điều đó cũng vậy, trong một giây.

Làm cách nào để đọc dữ liệu lớn trong python?

Để đọc các tệp văn bản lớn trong Python, chúng ta có thể sử dụng đối tượng tệp làm trình vòng lặp để lặp qua tệp và thực hiện tác vụ được yêu cầu . Vì trình vòng lặp chỉ lặp lại trên toàn bộ tệp và không yêu cầu bất kỳ cấu trúc dữ liệu bổ sung nào để lưu trữ dữ liệu, nên bộ nhớ tiêu thụ tương đối ít hơn.

Pandas có thể xử lý dữ liệu lớn không?

Pandas sử dụng tính toán trong bộ nhớ, điều này lý tưởng cho các bộ dữ liệu có kích thước vừa và nhỏ. Tuy nhiên, Khả năng xử lý tập dữ liệu lớn của Panda bị hạn chế do lỗi hết bộ nhớ .

Chủ Đề