Đọc nhiều tệp csv vào các khung dữ liệu riêng biệt python

Bài đăng trên blog này giải thích cách đọc một hoặc nhiều tệp CSV vào Khung dữ liệu Dask bằng read_csv. Nó sẽ thảo luận về các tùy chọn khác nhau để đọc tệp CSV và mẫu thiết kế mã nào sẽ mang lại cho bạn hiệu suất tốt nhất

Đây là cách bài đăng này được tổ chức

  • Đọc một tệp CSV nhỏ
  • Đọc một tệp CSV lớn
  • Đọc nhiều tệp CSV
  • Đọc tệp từ trong kho lưu trữ dữ liệu từ xa như S3
  • Hạn chế của tệp CSV
  • Các định dạng tệp thay thế thường hoạt động tốt hơn CSV

Rất nhiều bộ dữ liệu được lưu trữ với định dạng tệp CSV, vì vậy điều quan trọng là bạn phải hiểu chi tiết về API read_csv của Dask

Dask read_csv. tập tin nhỏ duy nhất

Dask giúp dễ dàng đọc một tệp nhỏ vào Khung dữ liệu Dask. Giả sử bạn có một con chó. tệp csv với nội dung sau

//first_name,age
fido,3
may mắn,4
gus,8//]]

Dưới đây là cách đọc tệp CSV vào Khung dữ liệu Dask

//nhập dask. khung dữ liệu dưới dạng dd

đf = đ. read_csv["con chó. csv"]//]]>

Bạn có thể kiểm tra nội dung của Dask DataFrame bằng phương thức compute[]

đf. tính toán[]//]]>

Điều này khá giống với cú pháp đọc tệp CSV vào DataFrames của gấu trúc

// nhập gấu trúc dưới dạng pd

df = pd. read_csv["con chó. csv"]//]]>

API Dask DataFrame được thiết kế có chủ ý để trông giống như API gấu trúc

Đối với một tệp nhỏ, Dask có thể quá mức cần thiết và bạn có thể chỉ cần sử dụng gấu trúc. Dask bắt đầu đạt được lợi thế cạnh tranh khi xử lý các tệp CSV lớn. Nguyên tắc chung để làm việc với gấu trúc là có ít nhất gấp 5 lần kích thước tập dữ liệu của bạn dưới dạng RAM khả dụng. Sử dụng Dask bất cứ khi nào bạn vượt quá giới hạn này. Ví dụ: khi làm việc trên máy RAM 16 GB, hãy cân nhắc chuyển sang Dask khi tập dữ liệu của bạn vượt quá kích thước 3 GB

Dask read_csv. tập tin lớn duy nhất

Dask DataFrames bao gồm nhiều phân vùng, mỗi phân vùng là một DataFrame gấu trúc. Dask cố tình chia nhỏ dữ liệu thành nhiều DataFrames của gấu trúc để các thao tác có thể được thực hiện song song trên nhiều lát dữ liệu

Hãy đọc trong 5. Tệp 19 GB [5.190 MB] vào Khung dữ liệu Dask. Tệp này được lưu trữ trong bộ chứa S3 công khai tại s3. //coiled-datasets/h2o/G1_1e8_1e2_0_0/csv/G1_1e8_1e2_0_0. csv nếu bạn muốn tự tải xuống. Xem kho dữ liệu cuộn để biết thêm thông tin về cách truy cập bộ dữ liệu mẫu

//đf = đ. read_csv["dữ liệu/G1_1e8_1e2_0_0. csv"]//]]>

Chúng ta có thể chạy ddf. partitions để xem dữ liệu được chia thành bao nhiêu phân vùng

//ddf. phân vùng # 82//]]>

Bạn có thể tùy chỉnh số lượng phân vùng mà DataFrame sẽ chứa bằng cách đặt tham số kích thước khối khi gọi read_csv

Dask read_csv. kích thước khối

Số lượng phân vùng phụ thuộc vào giá trị của đối số kích thước khối. Nếu bạn không cung cấp giá trị cho từ khóa kích thước khối, giá trị này sẽ được đặt thành “mặc định” và kích thước khối được tính toán dựa trên bộ nhớ khả dụng và số lượng lõi trên máy, kích thước khối tối đa là 64 MB. Trong ví dụ trên, Dask tự động chia tệp dữ liệu 5.190 MB thành các khối ~64 MB khi chạy trên Macbook Air với 8 GB RAM và 4 lõi

Chúng tôi cũng có thể đặt tham số kích thước khối theo cách thủ công khi đọc tệp CSV để làm cho các phân vùng lớn hơn hoặc nhỏ hơn

Hãy đọc tệp dữ liệu này với kích thước khối là 16 MB

//đf = đ. read_csv["dữ liệu/G1_1e8_1e2_0_0. csv", kích thước khối = "16MB"]

đf. phân vùng # 325//]]>

Dask DataFrame bao gồm 325 phân vùng khi kích thước khối là 16 MB. Số lượng phân vùng tăng lên khi kích thước khối giảm

Hãy đọc trong tệp dữ liệu này với kích thước khối 128 MB

//đf = đ. read_csv["dữ liệu/G1_1e8_1e2_0_0. csv", kích thước khối = "128MB"]

đf. phân vùng # 41//]]>

Dask DataFrame có 41 phân vùng khi kích thước khối được đặt thành 128 MB. Có ít phân vùng hơn khi kích thước khối tăng lên

Hãy cùng xem cách Dask phỏng đoán các loại dữ liệu của từng cột khi tệp CSV được đọc

Nguyên tắc chung khi làm việc với Dask DataFrames là giữ cho các phân vùng của bạn có kích thước dưới 100MB

Dask read_csv. suy ra dtypes

CSV là định dạng tệp dựa trên văn bản và không chứa thông tin siêu dữ liệu về các loại hoặc cột dữ liệu. Khi đọc tệp CSV, Dask cần suy ra các loại dữ liệu cột nếu chúng không được người dùng đặt rõ ràng

Hãy xem xét các kiểu dữ liệu mà Dask đã suy ra cho DataFrame của chúng ta

//ddf. dtypes

id1     đối tượng
id2   đối tượng
id3     đối tượng
id4      int64
id5 . đối tượng//]]>
id6      int64
v1       int64
v2       int64
v3     float64
dtype: object//]]>

Dask suy ra dtypes dựa trên một mẫu dữ liệu. Nó không xem xét mọi hàng trong tập dữ liệu để suy ra các kiểu dữ liệu vì điều đó sẽ cực kỳ chậm đối với các tập dữ liệu lớn

Bạn có thể tăng số lượng hàng được lấy mẫu bằng cách đặt tham số sample_rows

//đf = đ. read_csv["dữ liệu/G1_1e8_1e2_0_0. csv", sample_rows=5000]//]]>

Đối với tập dữ liệu này, việc tăng số lượng hàng được lấy mẫu không làm thay đổi các kiểu được suy luận

//ddf. dtypes

id1     đối tượng
id2   đối tượng
id3     đối tượng
id4      int64
id5 . đối tượng//]]>
id6      int64
v1       int64
v2       int64
v3     float64
dtype: object//]]>

Suy luận các loại dữ liệu dựa trên một mẫu của các hàng dễ bị lỗi. Dask có thể suy ra các dtypes không chính xác dựa trên một mẫu của các hàng, điều này sẽ gây ra lỗi tính toán xuôi dòng. Bạn có thể tránh suy luận dtype bằng cách chỉ định rõ ràng các dtypes khi đọc tệp CSV

Dask read_csv. chỉ định thủ công dtypes

Hãy đặt thủ công các cột id1, id2 và id3 thành các chuỗi, hiệu quả hơn các cột loại đối tượng, như được mô tả trong video này

//ddf = dd. read_csv[
   "data/G1_1e8_1e2_0_0. csv",
   dtype={
       "id1". "string[pyarrow]",
       "id2". "string[pyarrow]",
       "id3". "string[pyarrow]",
   },
]

đf. dtypes

id1     chuỗi
id2   chuỗi
id3     chuỗi
id4      int64
id5 . đối tượng//]]>
id6      int64
v1       int64
v2       int64
v3     float64
dtype: object//]]>

Dask sẽ suy ra các loại cho các cột mà bạn không chỉ định thủ công

Xem bài đăng trên blog này để tìm hiểu thêm về Dask dtypes

Nếu bạn chỉ định kiểu dữ liệu cho tất cả các cột, thì Dask sẽ không thực hiện bất kỳ suy luận kiểu dữ liệu nào và bạn sẽ tránh được các lỗi tiềm ẩn hoặc tình trạng chậm hiệu suất

Dask read_csv. nhiều tập tin

Dask có thể đọc dữ liệu từ một tệp duy nhất, nhưng Dask đọc nhiều tệp song song thậm chí còn nhanh hơn

Hãy viết ra 5 lớn. Tệp CSV 19 GB từ các ví dụ trước đó dưới dạng nhiều tệp CSV để chúng tôi có thể xem cách đọc nhiều tệp CSV vào Khung dữ liệu Dask. Bắt đầu bằng cách viết ra một tệp CSV dưới dạng nhiều tệp CSV

//ddf = dd. read_csv["dữ liệu/G1_1e8_1e2_0_0. csv"]
ddf. phân vùng # 82
ddf. to_csv["data/csvs"]//]]>

Thao tác này sẽ ghi ra 82 tệp, mỗi tệp cho một phân vùng. Các tập tin sẽ được xuất ra như sau

//data/csvs/
 000. phần
 001. phần
 002. phần//]]>

Hãy đọc 82 tệp CSV này vào Khung dữ liệu Dask

//đf = đ. read_csv["dữ liệu/csvs/*. một phần"]//]]>

Việc đọc nhiều tệp vào DataFrame của gấu trúc phải được thực hiện tuần tự và yêu cầu nhiều mã hơn như được mô tả trong bài đăng trên blog này. Đây là cú pháp gấu trúc

//nhập toàn cục
nhập gấu trúc dưới dạng pd

all_files = toàn cầu. toàn cầu [". /dữ liệu/csvs/*. phần"]

df = pd. concat[[pd. read_csv[f] cho f trong all_files]]//]]>

Parallel I/O là điểm mạnh rất lớn của Dask so với pandas. pandas được thiết kế cho các thao tác đọc/ghi với các tệp đơn lẻ. gấu trúc không mở rộng tốt với nhiều tệp. Dask được thiết kế để thực hiện I/O song song và hiệu quả hơn gấu trúc cho các hoạt động với nhiều tệp

Các đối số kích thước khối và dtype tương tự mà chúng ta đã thảo luận trước đó để đọc một tệp cũng được áp dụng khi đọc nhiều tệp

Trình đọc Dask cũng giúp dễ dàng đọc dữ liệu được lưu trữ trong kho lưu trữ dữ liệu đối tượng từ xa, như AWS S3

Dask read_csv. phân tích các tệp từ xa với máy tính cục bộ

Bạn có thể dễ dàng đọc tệp CSV được lưu trữ trong S3 vào máy cục bộ của mình. Đây là cách đọc tệp S3 công khai

//đf = đ. read_csv["s3. //coiled-datasets/timeseries/20-years/csv/0000. phần"]

đf. đầu[]//]]>

Thông thường, bạn không nên phân tích dữ liệu từ xa trên máy chủ cục bộ của mình vì tốc độ tải xuống dữ liệu cục bộ chậm. Việc xử lý dữ liệu đám mây với sức mạnh điện toán đám mây sẽ tự nhiên hơn. Các tệp được lưu trữ trong đám mây AWS S3 phải được xử lý bằng các phiên bản điện toán được cung cấp bởi đám mây AWS ec2

Hãy xem một thư mục S3 có rất nhiều dữ liệu. Thư mục coiled-datasets/timeseries/20-years/csv/ S3 có 1.095 tệp và yêu cầu 100 GB bộ nhớ khi tải vào DataFrame. Hãy thử chạy một tính toán trên toàn bộ tập dữ liệu và xem nó có hoạt động không

//đf = đ. read_csv["s3. //coiled-datasets/timeseries/20-years/csv/*. phần"]

đf. mô tả[]. tính toán[]//]]>

Tôi để tính toán này chạy trong 30 phút trước khi hủy truy vấn. Chạy cục bộ này quá chậm

Hãy xem cách đọc trong tập dữ liệu CSV lớn này tới một cụm Dask chứa nhiều nút tính toán, để chúng tôi có thể thực hiện truy vấn này nhanh hơn

Dask read_csv. đọc các tập tin từ xa trong môi trường cụm

Hãy tạo một cụm 5 nút với Cuộn và thử chạy cùng một tính toán với sức mạnh tính toán cao hơn

//nhập cuộn
nhập dask. được phân phối

cụm = cuộn. Cụm [tên = "quyền hạn", n_workers = 5]

khách hàng = dask. phân phối. Khách hàng [cụm]

đf = đ. read_csv["s3. //coiled-datasets/timeseries/20-years/csv/*. phần"]

đf. mô tả[]. tính toán[]//]]>

Tính toán này chạy trong 5 phút và 10 giây. Chạy tính toán này trên một cụm chắc chắn nhanh hơn chạy trên máy chủ cục bộ. Sẽ mất rất nhiều thời gian để truy vấn kết thúc trên localhost

Lưu trữ dữ liệu ở định dạng tệp khác có thể khiến truy vấn chạy nhanh hơn

Hạn chế của định dạng tệp CSV

Các tệp CSV thường được sử dụng vì chúng có thể đọc được bằng con người, nhưng chúng thường không phải là định dạng tệp tốt nhất để phân tích dữ liệu

Tôi đã nói chuyện tại PyData Global về 5 lý do Parquet tốt hơn CSV để phân tích dữ liệu

Dưới đây là năm lý do

  • Các tệp sàn gỗ không yêu cầu suy luận lược đồ / đặc tả lược đồ thủ công
  • Các tệp sàn gỗ dễ nén hơn
  • Bản chất dạng cột của các tệp Parquet cho phép cắt bớt cột, thường mang lại hiệu suất truy vấn lớn hơn
  • Siêu dữ liệu nhóm hàng trong tệp Parquet cho phép lọc đẩy xuống vị ngữ
  • Tập tin sàn gỗ là bất biến

Xem bài đăng trên blog này về ưu điểm của tệp Sàn gỗ để biết thêm chi tiết

Ngoài ra, tệp CSV cho phép bạn lưu dữ liệu lộn xộn trong tệp, không giống như các định dạng tệp khác. CSV cho phép bạn lưu dữ liệu chuỗi trong cột số nguyên, trong khi Parquet sẽ báo lỗi nếu bạn cố lưu dữ liệu chuỗi trong cột số nguyên

Phần kết luận

Rất nhiều dữ liệu được lưu trữ trong tệp CSV và bạn sẽ thường muốn đọc dữ liệu đó vào Dask DataFrames để thực hiện các truy vấn phân tích

Blog này đã cho bạn thấy rằng thật dễ dàng để tải một tệp CSV hoặc nhiều tệp CSV vào Khung dữ liệu Dask. Bạn cũng đã học cách đặt dtypes và tùy chỉnh số lượng phân vùng trong DataFrame bằng cách đặt tham số kích thước khối

Các tệp CSV thường không có hiệu suất như định dạng tệp nhị phân, cột như Parquet. Bất cứ khi nào có thể, hãy cân nhắc chuyển đổi các tệp CSV thành Sàn gỗ, như được mô tả trong bài đăng trên blog này. Hầu hết các truy vấn phân tích chạy nhanh hơn trên hồ Parquet

Làm cách nào để đọc nhiều tệp CSV thành DataFrames riêng biệt trong Python?

Bạn có thể làm điều này bằng cách đọc từng tệp CSV vào DataFrame và nối thêm hoặc nối các DataFrame để tạo một DataFrame duy nhất có dữ liệu từ tất cả các tệp . Ở đây, tôi sẽ sử dụng read_csv[] để đọc tệp CSV và hàm concat[] để nối các DataFrame lại với nhau để tạo một DataFrame lớn.

Làm cách nào để hợp nhất nhiều tệp CSV vào một Khung dữ liệu gấu trúc?

Cách kết hợp nhiều tệp CSV bằng Python để phân tích .
Nhập tệp vào DataFrames của gấu trúc. .
Thiết lập thư mục làm việc. .
Kết hợp nhiều tệp với cấu trúc bảng tương tự bằng gấu trúc. Khung dữ liệu. nối thêm [].
Kết hợp nhiều tệp với cấu trúc bảng tương tự bằng gấu trúc. concat[]

Làm cách nào để đọc tất cả các tệp CSV trong một thư mục trong gấu trúc Python?

nhập khẩu toàn cầu
nhập hệ điều hành
nhập gấu trúc dưới dạng pd
all_files = toàn cầu. toàn cầu ["động vật/*. csv"]
df = pd. concat[[pd. read_csv[f] cho f trong all_files]]
in [df]

Chủ Đề