and Python 3
Cộng đồng Python hiện đang trải qua quá trình chuyển đổi kéo dài từ loạt trình thông dịch Python 2 sang loạt Python 3 Cho đến khi Python 3.0 xuất hiện, tất cả mã Python đều tương thích ngược Cộng đồng quyết định rằng để đưa ngôn ngữ chuyển tiếp, một số thay đổi không tương thích ngược là cần thiết
Tôi đang viết cuốn sách này với Python 2.7 làm nền tảng, vì phần lớn cộng đồng Python khoa học vẫn chưa chuyển sang Python 3 Tin vui là, với một vài ngoại lệ, bạn sẽ không gặp khó khăn gì khi theo dõi cuốn sách nếu bạn tình cờ đang sử dụng Python 3.2
Khi được hỏi về môi trường phát triển tiêu chuẩn của tôi, tôi hầu như luôn nói “IPython cộng hưởng việc trình soạn thảo văn bản” Tôi thường viết một chương trình và lặp đi lặp lại việc kiểm tra và gỡ lỗi từng phần của chương trình đó trong IPython Cũng rất hữu ích khi có thể xử lý dữ liệu một cách tương tác và xác minh trực quan rằng một tập hợp thao tác dữ liệu cụ thể đang thực hiện đúng Các thư viện như pandas và NumPy được thiết kế để dễ sử dụng trong shell
Tuy nhiên, một số vẫn thích làm việc trong IDE thay vì trình soạn thảo văn bản Chúng cung cấp nhiều tính năng “mã thông minh” tốt như hoàn thành hoặc nhanh chóng lấy tài liệu liên quan đến các chức năng và lớp Dưới đây là một số thứ mà bạn có thể khám phá:
• Python Tools for Visual Studio (for Windows users)
CỘNG ĐỒNG VÀ HỘI NGHỊ
Ngoài việc tìm kiếm trên Internet, danh sách gửi thư khoa học Python nhìn chung rất hữu ích và đáp ứng các câu hỏi Một số cái cần xem xét là:
• pydata: danh sách Google Group dành cho các câu hỏi liên quan đến Python để phân tích dữ liệu và pandas
• pystatsmodels: dành cho các mô hình thống kê hoặc các câu hỏi liên quan đến pandas
• numpy-discussion: dành cho các câu hỏi liên quan đến NumPy
• scipy-user: dành cho các câu hỏi chung về SciPy hoặc khoa học Python
Tôi đã cố tình không đăng URL của những trang này phòng trường hợp chúng thay đổi Chúng có thể được định vị dễ dàng thông qua tìm kiếm trên Internet
Mỗi năm có nhiều hội nghị được tổ chức trên toàn thế giới dành cho các lập trình viên Python PyCon và EuroPython lần lượt là hai hội nghị Python chung chính ở Hoa Kỳ và Châu Âu SciPy và EuroSciPy là các hội nghị Python theo định hướng khoa học, nơi bạn có thể sẽ tìm thấy nhiều “những con chim lông vũ” nếu bạn quan tâm nhiều hơn đến việc sử dụng Python để phân tích dữ liệu sau khi đọc cuốn sách này ĐIỀU HƯỚNG CỦA CUỐN SÁCH
Nếu bạn chưa từng lập trình Python trước đây, bạn có thể thực sự muốn bắt đầu từ end của cuốn sách, nơi tôi đã đưa ra một hướng dẫn cô đọng về cú pháp Python, các tính năng ngôn ngữ và các cấu trúc dữ liệu tích hợp như bộ dữ liệu, danh sách và lệnh Những điều này được coi là kiến thức tiên quyết cho phần còn lại của cuốn sách
Cuốn sách bắt đầu bằng việc giới thiệu cho bạn môi trường IPython Tiếp theo, tôi giới thiệu ngắn gọn về các tính năng chính của NumPy, để lại cách sử dụng NumPy nâng cao hơn cho một chương khác ở cuối cuốn sách Sau đó, tôi giới thiệu về pandas và dành phần còn lại của cuốn sách cho các chủ đề phân tích dữ liệu áp dụng pandas, NumPy và matplotlib (để trực quan hóa) Tôi đã cấu trúc tài liệu theo cách tăng dần nhất có thể, mặc dù đôi khi có một số điểm đan xen nhỏ giữa các chương
Các tệp dữ liệu và tài liệu liên quan cho mỗi chương được lưu trữ dưới dạng http://github.com/pydata/pydata-book Tôi khuyến khích bạn tải xuống dữ liệu và sử dụng nó để sao chép các ví dụ về mã của cuốn sách và thử nghiệm các công cụ được trình bày trong mỗi chương Tôi sẽ vui vẻ chấp nhận những đóng góp, tập lệnh, sổ ghi chép IPython hoặc bất kỳ tài liệu nào khác mà bạn muốn đóng góp vào kho sách để mọi người cùng thưởng thức
Hầu hết các ví dụ về mã trong sách đều được hiển thị với đầu vào và đầu ra giống như được thực thi trong shell IPython
In [5]: code Out[5]: output Đôi khi, để rõ ràng, nhiều ví dụ về mã sẽ được hiển thị cạnh nhau Chúng nên được đọc từ trái sang phải và thực hiện riêng biệt
Dữ liệu dùng cho các ví dụ
Bộ dữ liệu cho các ví dụ trong mỗi chương được lưu trữ trong kho lưu trữ trên GitHub: http://github.com/pydata/pydata-book Bạn có thể tải xuống dữ liệu này bằng cách sử dụng chương trình dòng lệnh kiểm soát sửa đổi git hoặc bằng cách tải xuống tệp zip của kho lưu trữ từ trang web
Tôi đã cố gắng hết sức để đảm bảo rằng nó chứa mọi thứ cần thiết để mô tả lại các ví dụ, nhưng tôi có thể đã mắc một số lỗi hoặc thiếu sót Nếu được xin vui lòng gửi email cho tôi: wesmckinn@gmail.com
Cộng đồng Python đã áp dụng một số quy ước đặt tên cho các mô-đun thường được sử dụng: import numpy as np import pandas as pd import matplotlib.pyplot as plt Điều này có nghĩa là khi bạn nhìn thấy np.arange, đây là một tài liệu tham khảo cho chức năng arrange trong NumPy Điều này được thực hiện vì việc nhập mọi thứ (from numpy import *) từ một gói lớn như NumPy
Tôi sẽ sử dụng một số thuật ngữ phổ biến cho cả lập trình và khoa học dữ liệu mà bạn có thể không quen Vì vậy, đây là một số định nghĩa ngắn gọn:
TẢI DỮ LIỆU, LƯU TRỮ VÀ ĐỊNH DẠNG TẬP TIN
Các công cụ trong quyển sách này sẽ ít sử dụng nếu bạn không thể dễ dàng nhập và xuất dữ liệu trong Python Tôi sẽ tập trung vào đầu vào và đầu ra với các đối tượng pandas, mặc dù tất nhiên có rất nhiều công cụ trong các thư viện khác hỗ trợ quá trinh này Ví dụ, NumPy có tính năng tải và lưu trữ dữ liệu nhị phân ở mức độ thấp nhưng cực kỳ nhanh, bao gồm hỗ trợ mảng ánh xạ bộ nhớ Xem chương 12 để biết thêm về những điều đó Đầu vào và ra thường rơi vào một số danh mục chính: đọc tệp văn bản và những cái khác hiệu quả hơn như các định dạng trên đĩa, tải dữ liệu từ cơ sở dữ liệu và tương tác với các nguồn mạng như API web ĐỌC VÀ GHI DỮ LIỆU Ở ĐỊNH DẠNG VĂN BẢN
Python đã trở thành ngôn ngữ được yêu thích cho việc trộn văn bản và tệp, do cú pháp của nó đơn giản để kết nối với các tệp, cấu trúc dữ liệu trực quan và các tính năng tiện lợi như đóng gói và giải nén bộ dữ liệu pandas có một số hàm để đọc dữ liệu dạng bảng dưới dạng đối tượng DataFrame Bảng 6-1 có tóm tắt tất cả về chúng, tuy nhiên read_csv và read_table có thể là những thứ bạn sẽ sử dụng nhiều nhất
Bảng 6-1: Phân tích các cú pháp trong pandas
Hàm Mô tả read_csv Tải dữ liệu được phân tách từ một một tệp hoặc đối tượng giống như tệp
Sử dụng dấu phẩy làm dấu phân cách mặc định read_table Tải dữ liệu được phân tách từ một một tệp hoặc đối tượng giống như tệp
Sử dụng tab (‘\t’) làm dấu phân cách mặc định read_fwf Đọc dữ liệu ở định dạng cột có chiều rộng cố định (nghĩa là không có dấu phân cách) read_clipboard Phiên bản của read_table đọc dữ liệu từ clipboard Hữu ích cho việc chuyển đổi bảng từ các trang web
Tôi sẽ cung cấp cái nhìn tổng quan về cơ chế của các hàm này, các hàm này nhằm mục đích chuyển đổi dữ liệu văn bản thành một DataFrame Các tùy chọn của những hàm này thuộc một số loại sau:
• Lập chỉ mục: có thể xử lý một hoặc nhiều cột như DataFrame được trả về và có nên lấy tên cột từ tệp, người dùng hay không
• Suy luận kiểu và chuyển đổi dữ liệu: điều này bao gồm các chuyển đổi giá trị do người dùng xác định và danh sách tùy chỉnh các điểm đánh dấu giá trị bị thiếu
• Phân tích ngày giờ: bao gồm khả năng kết hợp, bao gồm kết hợp thông tin ngày và giờ trải rộng trên nhiều cột thành một cột duy nhất trong kết quả
• Lặp lại: hỗ trợ lặp lại các đoạn tệp rất lớn
• Các vấn đề dữ liệu không sạch: bỏ qua các hàng hoặc chân trang, nhận xét hoặc những thứ nhỏ nhặt khác như dữ liệu số có hàng nghìn được phân tách bằng dấu phẩy
Suy luận kiểu là một trong những tính năng quan trọng hơn các hàm này; điều đó có nghĩa là bạn không cần phải chỉ định cột nào là số, số nguyên, boolean (kiểu dữ liệu có 2 giá trị True, False) hoặc chuỗi Tuy nhiên, việc xử lý ngày tháng và các loại tùy chỉnh khác đòi hỏi nhiều nỗ lực hơn một chút Hãy bắt đầu với một tệp băn bản (CSV) nhỏ được phân tách bằng dấu phẩy:
Vì đây được phân tách bởi dấu phẩy, nên chúng ta có thể dùng hàm read_csv để đọc nó dưới dạng một DataFrame:
Chúng ta cũng có thể sử dụng read_table và chỉ định dấu phân cách: Ở đây, tôi đã sử dụng lệnh Unix cat shell để in nội dung thô của tệp ra màn hình Nếu bạn đang dùng Windows, bạn có thể sử dụng type thay vì cat để đạt được hiệu quả tương tự
Một tập tin không phải lúc nào cũng có hàng tiêu đề Hãy xem tệp này: Để đọc nội dung này, bạn có một vài lựa chọn Bạn có thể cho phép pandas gán tên cột mặc định hoặc bạn có thể tự mình chỉ định tên:
Giả sử bạn muốn cột message là chỉ mục của DataFrame được trả về Bạn có thể cho biết bạn muốn cột ở chỉ mục số 4 hoặc được đặt tên là ‘message’ bằng cách sử dụng đối số index_col:
Trong trường hợp bạn muốn tạo chỉ mục phân cấp từ nhiều cột, chỉ cần chuyển một danh sách số hoặc tên cột:
Trong một số trường hợp, một bảng có thể không có dấu phân cách cố định, sử dụng khoảng trắng hoặc một số kiểu khác để phân tách các trường Trong những trường hợp này, bạn có thể chuyển một biểu thức chính quy làm dấu phân cách cho read_table Hãy xem một tệp văn bản trông như thế này:
Trong khi bạn có thể thực hiện một số thao tác thủ công, thì trong trường hợp này các trường được phân tách bằng một khoảng trắng khác nhau Điều này có thể được biểu diễn bằng biểu thức chính quy \s+, vì vậy chúng ta có:
Bởi vì có ít tên cột hơn số hàng dữ liệu nên read_table suy luận rằng cột đầu tiên phải là chỉ mục của DataFrame trong trường hợp này
Các hàm phân tích cú pháp có nhiều đối số bổ sung để giúp bạn xử lý nhiều định dạng tệp ngoại lệ khác nhau xảy ra (xem bảng 6-2) Ví dụ, bạn có thể bỏ qua hàng đầu tiên, thứ ba và bốn của tệp bằng skiprows:
SẮP XẾP DỮ LIỆU: LÀM SẠCH, CHUYỂN ĐỔI, HỢP NHẤT, ĐỊNH HÌNH LẠI
Phần lớn công việc lập trình trong phân tích và mô hình hóa dữ liệu được dành cho việc chuẩn bị dữ liệu: tải, làm sạch, chuyển đổi và sắp xếp lại Đôi khi cách mà dữ liệu được lưu trữ trong tệp hoặc cơ sở dữ liệu không phải là cách bạn cần cho ứng dụng xử lý dữ liệu Nhiều người chọn ad hoc thực hiện xử lý dữ liệu đặc biệt từ dạng này sang dạng khác bằng cách sử dụng chương trình có mục đích chung, như Python, Perl, R hoặc Java hoặc các công cụ xử lý văn bản UNIX như sed hoặc awk May mắn thay, pandas cùng với thư viện chuẩn Python cung cấp cho bạn một bộ thuật toán và thao tác cốt lõi ở cấp độ cao, linh hoạt và hiệu suất cao để cho phép bạn sắp xếp dữ liệu vào đúng dạng mà không gặp nhiều khó khăn
Nếu bạn nhận ra một loại thao tác dữ liệu không có trong cuốn sách này hoặc ở nơi nào khác trong thư viện pandas, vui lòng đề xuất nó trên danh sách gửi thư hoặc trang GitHub Thật vậy, phần lớn việc thiết kế và triển khai pandas đều được thúc đẩy bởi nhu cầu ứng dụng trong thế giới thực
KẾT HỢP VÀ HỢP NHẤT CÁC TẬP DỮ LIỆU
Dữ liệu chứa trong các đối tượng pandas có thể được kết hợp với nhau theo một số cách có sẵn:
• pandas.merge kết nối các hàng trong DataFrames dựa trên một hoặc nhiều key Điều này sẽ quen thuộc với người dùng SQL hoặc các cơ sở dữ liệu quan hệ khác vì nó thực hiện các hoạt động nối cơ sở dữ liệu
• pandas.concat dán hoặc xếp các đối tượng lại với nhau dọc theo một trục
• combine_first cho phép ghép các dữ liệu chồng chéo lại với nhau để điền vào các giá trị còn thiếu trong một đối tượng với các giá trị từ một đối tượng khác
Tôi sẽ giải quyết từng vấn đề này và đưa ra một số ví dụ Chúng sẽ được sử dụng làm ví dụ xuyên suốt phần còn lại của cuốn sách
Hợp nhất DataFrame kiểu cơ sở dữ liệu
Các thao tác hợp nhất hoặc nối, kết hợp các tập dữ liệu bằng cách liên kết các hàng sử dụng một hoặc nhiều key Các hoạt động này là trung tâm của cơ sở dữ liệu quan hệ Hàm hợp nhất trong pandas là điểm bắt đầu chính để sử dụng các thuật toán này trên dữ liệu của bạn
Hãy bắt đầu với một ví dụ đơn giản:
35 Đây là ví dụ về tình huống hợp nhất nhiều-một; dữ liệu trong df1 có nhiều hàng được gắn nhãn a và b, trong khi df2 chỉ có một hàng cho mỗi giá trị trong cột key Gọi merge với các đối tượng này, chúng ta được:
Lưu ý rằng tôi không chỉ định cột nào sẽ tham gia Nếu không được chỉ định, merge sẽ sử dụng tên cột chồng chéo làm những key Tuy nhiên, đó là một cách thực hành tốt để xác định rõ ràng:
Nếu tên cột khác nhau trong mỗi đối tượng, bạn có thể chỉ định chúng một cách riêng biệt:
Bạn có thể nhận thấy rằng giá trị 'c' và 'd' cũng như dữ liệu liên quan bị thiếu trong kết quả Theo mặc định, việc hợp nhất sẽ thực hiện phép nối 'bên trong'; các key trong kết quả là giao điểm Các tùy chọn khả thi khác là 'trái', 'phải' và 'bên ngoài' Phép nối ngoài lấy sự kết hợp của các key, kết hợp tác dụng của việc áp dụng cả phép nối trái và phép nối phải:
Sự hợp nhất nhiều-nhiều có hành vi được xác định rõ ràng mặc dù không nhất thiết phải trực quan Đây là một ví dụ:
Các phép nối nhiều-nhiều tạo thành sản phẩm Cartesian của các hàng Vì có 3 hàng 'b' ở DataFrame bên trái và 2 hàng ở bên phải nên có 6 hàng 'b' trong kết quả Phương thức nối chỉ ảnh hưởng đến các key value riêng biệt xuất hiện trong kết quả: Để hợp nhất với nhiều key, hãy chuyển danh sách tên cột:
37 Để xác định tổ hợp key nào sẽ xuất hiện trong kết quả tùy thuộc vào việc lựa chọn phương pháp hợp nhất, hãy coi nhiều key như tạo thành một mảng các bộ dữ liệu được sử dụng làm một key nối duy nhất (mặc dù nó không thực sự được triển khai theo cách đó)
Khi nối các cột trên cột, các chỉ mục trên các đối tượng DataFrame đã truyền sẽ bị loại bỏ
Vấn đề cuối cùng cần xem xét trong hoạt động hợp nhất là việc xử lý các tên cột chồng chéo Mặc dù bạn có thể giải quyết phần chồng chéo theo cách thủ công (xem phần sau về đổi tên nhãn trục), việc hợp nhất có tùy chọn hậu tố để chỉ định các chuỗi để nối vào các tên chồng chéo trong các đối tượng DataFrame bên trái và bên phải:
Xem Bảng 7-1 để biết tham chiếu đối số khi hợp nhất Tham gia chỉ mục là chủ đề của phần tiếp theo
Bảng 7-1 hợp nhất các đối số hàm
Hàm Mô tả left DataFrame được hợp nhất bên trái right DataFrame được hợp nhất bên phải how Một trong 'bên trong', 'bên ngoài', 'trái' hoặc 'phải' 'bên trong' theo mặc định on Tên cột để tham gia Phải được tìm thấy trong cả hai đối tượng
DataFrame Nếu không được chỉ định và không có key nào khác được cung cấp, sẽ sử dụng giao điểm của các tên cột ở bên trái và bên phải làm key
38 left_on Các cột trong DataFrame bên trái để sử dụng làm các key right_on Tương tự như left_on cho DataFrame trái left_index Sử dụng chỉ mục hàng ở bên trái làm key của nó (hoặc các key, nếu là