Xử lý hàng loạt 22GB dữ liệu giao dịch với gấu trúc

Mar 21 2022
Cách bạn sử dụng các tài nguyên tính toán hạn chế và làm việc với các bộ dữ liệu lớn
Các bộ dữ liệu lớn là một thách thức để làm việc với. Chúng thậm chí còn khó khăn hơn nếu bạn không có đủ các nguồn lực cần thiết.
Ảnh của Luke Chesser trên Unsplash

Các bộ dữ liệu lớn là một thách thức để làm việc với. Chúng thậm chí còn khó khăn hơn nếu bạn không có đủ các nguồn lực cần thiết. Hầu hết chúng ta không có quyền truy cập vào một cụm phân tán, giá đỡ GPU hoặc hơn 8GB RAM. Điều này không có nghĩa là chúng ta không thể làm bẩn một số dữ liệu lớn. Chúng ta chỉ cần giải quyết từng mảnh một. Đó là, lặp lại toàn bộ tập dữ liệu làm việc với các tập con tại một thời điểm.

Dataset

Chúng tôi sẽ chỉ cho bạn cách bạn có thể làm điều này với một tập dữ liệu giao dịch lớn (tạo ngẫu nhiên). Tập dữ liệu chứa hơn 260 triệu giao dịch cho 75.000 khách hàng. Các giao dịch được thực hiện từ năm 2010 đến năm 2020. Mỗi giao dịch được phân loại thành một trong 12 loại chi tiêu (ví dụ: Cửa hàng tạp hóa). Bạn có thể xem thêm chi tiết trong Hình 1 và bạn tìm thấy tập dữ liệu đầy đủ trên Kaggle . Bạn cũng có thể tìm sổ ghi chép cho hướng dẫn này trên GitHub .

Hình 1: tổng quan về tập dữ liệu giao dịch (Nguồn: Kaggle) (CC0: Public Domain)

Chúng tôi sẽ xem cách bạn có thể sử dụng xử lý hàng loạt để tạo các tổng hợp khác nhau của dữ liệu này. Cụ thể, chúng tôi sẽ tính toán:

  • Tổng số giao dịch
  • Tổng chi tiêu hàng năm
  • Chi tiêu trung bình hàng tháng cho giải trí vào năm 2020

Xử lý hàng loạt

Chúng tôi sẽ sử dụng một số gói Python tiêu chuẩn. Chúng tôi có NumPy và Pandas để thao tác dữ liệu và matplotlib cho một số hình dung đơn giản. Đảm bảo rằng bạn đã cài đặt những thứ này.

Để bắt đầu, hãy thử tải toàn bộ tập dữ liệu với Pandas. Sau một thời gian, chúng tôi nhận được thông báo lỗi trong hình 2. Chỉ với 8GB RAM, không thể tải toàn bộ tập dữ liệu vào bộ nhớ.

Hình 2: thông báo lỗi

Để giải quyết vấn đề này, chúng ta có thể tải một tập hợp con của tập dữ liệu. Để làm điều này, chúng ta có thể sử dụng các tham số bỏ qua và nrows trong hàm read_csv . Dưới đây, chúng tôi đã đặt giá trị của các tham số thành 1000 và 2000 một cách trân trọng. Điều này có nghĩa là chúng tôi sẽ bỏ qua 1000 hàng đầu tiên của CSV và tải 2000 hàng tiếp theo. Chúng ta cũng sẽ cần chuyển tên cột dưới dạng tham số (dòng 8). Điều này là do chúng tôi đã bỏ qua hàng tên đầu tiên trong CSV.

Chúng tôi có thể sử dụng các tham số này để lặp qua tập dữ liệu của mình. Để làm điều này, chúng tôi đã tạo hàm get_rows bên dưới. Điều này có thể sử dụng để trả về một tập hợp con của tập dữ liệu của chúng tôi. Mỗi tập hợp con sẽ chứa số hàng được xác định bởi tham số bước . Tham số count rất đa dạng để trả về các tập con khác nhau ở mỗi bước. Để hiểu cách chúng tôi có thể sử dụng hàm này, chúng tôi sẽ đếm tổng số giao dịch trong tập dữ liệu.

Đếm số lượng giao dịch

Chúng tôi sử dụng hàm get_rows trong vòng lặp while. Vào cuối mỗi lần lặp của vòng lặp, chúng tôi sẽ cập nhật số đếm (dòng 19). Điều này có nghĩa là chúng tôi sẽ tải một tập hợp con mới của tập dữ liệu (dòng 13). Chúng tôi đặt số bước sao cho 5 triệu hàng được trả về mỗi lần (dòng 1). Tuy nhiên, số hàng trong tập dữ liệu không phải là hệ số của 5 triệu. Điều này có nghĩa là đối với lần lặp cuối cùng, ít hơn 5 triệu hàng được trả về. Chúng ta có thể sử dụng điều này để kết thúc vòng lặp while (dòng 22–23).

Đối với mỗi lần lặp, chúng tôi tính toán độ dài của tập hợp con và thêm nó vào tổng số giao dịch (dòng 16). Cuối cùng, chúng tôi xuất ra rằng có 261,969,720 giao dịch. Với sự hiểu biết tốt về cách chúng tôi có thể xử lý tập dữ liệu của mình theo lô, chúng tôi có thể chuyển sang các tập hợp phức tạp hơn.

Tổng chi tiêu hàng năm

Đối với tổng hợp này, chúng tôi muốn tổng hợp tất cả số tiền giao dịch cho mỗi năm. Chúng ta có thể làm theo một quy trình tương tự như trước đây. Mong rằng bây giờ, đối với mỗi lần lặp, chúng tôi muốn cập nhật tổng số cho mỗi năm trong tập dữ liệu của mình. Chúng tôi bắt đầu bằng cách tạo một chuỗi gấu trúc trong đó chỉ số là năm và giá trị là tổng số tiền chi tiêu (dòng 2). Chúng tôi bắt đầu với tổng chi tiêu là 0 cho mỗi năm.

Đối với mỗi lần lặp lại, chúng tôi tính tổng số tiền chi tiêu theo năm (dòng 10). Kết quả là một chuỗi khác, exp , có cùng chỉ số với total_exp . Điều này cho phép chúng tôi lặp lại mỗi năm và cập nhật tổng số (dòng 13–15).

Chúng tôi hình dung tổng hợp này bằng cách sử dụng mã bên dưới. Bạn có thể thấy kết quả trong Hình 3. Ngoại trừ năm 2020, tổng chi tiêu đang tăng đều đặn hàng năm. Đối với tổng hợp này, tất cả các tính toán được thực hiện trong vòng lặp while. Như chúng ta sẽ thấy trong phần tổng hợp tiếp theo, điều này không phải lúc nào cũng đúng.

Hình 3: tổng chi tiêu hàng năm từ 2010 đến 2020

Chi tiêu trung bình hàng tháng cho giải trí vào năm 2020

Đối với nhiều tổng hợp, chúng tôi sẽ không chỉ thêm vào tổng số tiền. Đối với tổng hợp này, trước tiên chúng ta cần tính tổng số tiền chi tiêu cho hoạt động giải trí của mỗi khách hàng mỗi tháng. Sau đó, cho mỗi tháng, chúng tôi có thể tính giá trị trung bình trên tất cả các khách hàng. Để bắt đầu, chúng tôi tạo một khung dữ liệu gấu trúc trống (dòng 2).

Đối với mỗi lần lặp lại, sau đó chúng tôi lọc ra các giao dịch để chỉ những giao dịch dành cho giải trí vào năm 2020 còn lại (dòng 10). Sau đó, chúng tôi tính tổng số tiền theo khách hàng và tháng (dòng 11) và thêm bảng này vào total_exp (dòng 14). Sau khi làm điều này, một khách hàng và tháng có thể được lặp lại. Điều này là do không phải tất cả các giao dịch của khách hàng sẽ nhất thiết phải được ghi lại trong một lần lặp lại. Đây là lý do tại sao chúng tôi tổng hợp lại bảng (dòng 17).

Cuối cùng, chúng tôi sẽ có một bảng với tổng số hàng tháng cho tất cả các khách hàng. Bước cuối cùng là tính số tiền trung bình cho mỗi tháng (dòng 26). Bạn có thể thấy các mức trung bình này trong Hình 4. Ở đây, mức trung bình ổn định và sau đó tăng vào tháng 10, 11 và 12.

Hình 4: chi tiêu trung bình cho giải trí năm 2020

Không có gì ngoài thời gian

Vì vậy, ngay cả với nguồn lực hạn chế, chúng tôi vẫn phải phân tích tập dữ liệu lớn này. Vấn đề lớn nhất là lượng thời gian cần thiết để chạy mỗi tập hợp. Trên máy của tôi, mỗi lần tổng hợp mất khoảng 50 phút! Điều quan trọng là cố gắng tăng tốc mọi thứ càng nhiều càng tốt.

Phần chiếm nhiều thời gian nhất là nơi các hàng được tải bằng hàm get_rows . Ở đây chúng tôi đang tải dữ liệu từ CSV trên ổ cứng vào bộ nhớ / RAM. Vì vậy, thay vì sử dụng nhiều vòng lặp while, bạn nên cố gắng thực hiện nhiều tổng hợp trong cùng một vòng lặp. Bằng cách này, chúng ta sẽ chỉ cần đọc dữ liệu từ đĩa một lần.

Tôi hy vọng bạn thấy bài viết này hữu ích! Nếu bạn muốn xem thêm bạn có thể ủng hộ tôi bằng cách trở thành một trong những thành viên được giới thiệu của tôi . Bạn sẽ có quyền truy cập vào tất cả các bài viết trên Phương tiện và tôi sẽ nhận được một phần phí của bạn.

Người giới thiệu

C O'Sullivan, Giao dịch được mô phỏng, CC0: Miền công cộng https://www.kaggle.com/datasets/conorsully1/simulated-transactions

© Copyright 2021 - 2023 | vngogo.com | All Rights Reserved