Tìm hiểu Pandas (Bài 4): Các vấn đề liên quan đến mất mát dữ liệu, xử lý chuỗi thời gian và mô hình hoá dữ liệu

I. Các vấn đề liên quan đến mất mát dữ liệu

a. Missing data

Khi xủ lý đến dữ liệu, ta khó tránh khỏi việc dữ liệu thô (raw) luôn nằm ngoài các phạm vi ta mong muốn, từ việc crawl dữ liệu không ổn, hay việc input không đúng, ví dụ ta mong muốn column ‘age‘ luôn là con số dương và có khi phải nhỏ hơn … 200, ‘sex‘ chỉ nằm trong các category (male. female, other), v…v… Nếu ta xử lý dữ liệu không tốt, sẽ ảnh hưởng nhiều đến việc phân tích, thống kê hay mô hình hoá dữ liệu. Nhưng có lẽ vấn đề đáng sợ nhất là ta phải đối mặt với việc thiếu dữ liệu hay mất dữ liệu. NaN, Nat, Nil, NullN/A… everywhere. Đáng sợ không phải là việc ta không xử lý đc nó theo kiểu … drop hết, mà là ta sẽ xử lý như thế nào đối với những bài toán khác nhau.

Khi ta thao tác với Pandas hay Numpy, khi hiển thị dữ liệu ta sẽ thấy vô số từ NaN xuất hiện. Với dữ liệu ngày tháng thì sẽ là NaT, còn lại thì NaN sẽ hiển thị. Ví dụ:

b. Giải quyết vấn đề

Ta có thể dùng hàm fillna(), để thiết lập các giá trị mặc định.

Ví dụ: fillna(50)

Nếu dữ liệu NaN không hợp lệ, ta mong muốn loại bỏ những dữ liệu đó khi tính toán t có thể dùng dropna().

Ví dụ:

Ngoài ra ta hoàn có thể nội suy ra các giá trị NaN thông qua quyến tính, các hàm bậc 2, … với hàm interpolate().

Ví dụ:

Ngoài ra có thể tham khảo thêm các phương thức:

Việc sử dụng như thế nào hoàn toàn phụ thuộc vào việc bài toán của ta sẽ tính toán những dữ liệu đó như thế nào, vài trò của những dữ liệu NaN trong công việc tính toán dữ liệu đó không, để t có thể dùng những hàm đó một cách thích hợp.

II. Xử lý chuỗi thời gian

a. Import dữ liệu

Thông thường khi import dữ liệu kiểu thời gian, ta thường thao tác với kiểu dữ liệu cơ bản từ thư viện chuẩn của python là class datetime nhưng dữ liệu được import sẽ xuất hiện dưới kiểu str, ta nên convert sang kiểu datetime để có thể đánh chỉ mục cho từng cột.

Vậy dữ liệu cột ‘TradeDate‘ đã ở dạng <class ‘pandas._libs.tslibs.timestamps.Timestamp’>

b. Đối tượng DateOffset và TimeDelta

DateOffset  là một đối tượng đại diện cho việc thay đổi hoặc thêm phần bù cho chuỗi thời gian.  mảng một chiều giống như mảng Numpy, nhưng nó bao gồm thêm một bảng đánh label. Series có thể được khởi tạo thông qua NumPy, kiểu Dict hoặc các dữ liệu vô hướng bình thường

Note: đối tượng datetime.datetime thì khác hoàn toàn so với pd.Timestamp. Kiểu dữ liệu cơ bản thường không hiệu quả, so với pd.Timestamp làm việc trực tiếp với kiểu numpy.datetime64. Và đối tượng DateOffset thì làm việc trực tiếp với đới tượng pd.Timestamp, nên đối tượng datetime.datetime sẽ được tự động ép kiểu sang  pd.Timestamp

c. Các phương thức quan trọng

Đôi khi ta muốn dịch chuyển các ngày trong tuần (Nếu các ngày xuất hiện như một chuỗi thời gian nối tiếp) về trước hoặc về sau, thậm chí với các ngày làm việc bình thường (business day):

Các phép biến đổi

Ta có thể sử dụng hàm asfreq cho các phép biến đổi như sau. Ví dụ để nhận được chuỗi ngày tương ứng với các ngày cuối cùng của tháng, t sử dụng phép biến đổi như sau:

Lấy mẫu dữ liệu

Hàm TimeSeries.resample cho phép chúng ta tóm tắt, tổng hợp dữ liệu chi tiết hơn dựa trên khoảng thời gian lấy mẫu và hàm lấy mẫu.

Downsampling là một thuật ngữ bắt nguồn từ xử lý tín hiệu số và đề cập đến quá trình giảm tốc độ lấy mẫu của tín hiệu. Trong trường hợp dữ liệu, chúng tôi sử dụng nó để giảm lượng dữ liệu mà chúng tôi muốn xử lý. Quá trình ngược lại là Upampling.

Ví dụ:

Sau đó ta thay đổi:

Định danh

Để chỉ định chi tiết cho phần bù khoảng thời gian, ta đưa ra khái niệm về các định danh được sử dụng trong Pandas:

  • B, BM: Đại diện cho ngày làm việc (business day)và tháng làm việc (business month)
  • D, W, M, Q, A: Đại diện cho ngày (Day), tuần (Week), tháng (Month), quý (Quater), năm (Year)
  • H, T, S, L, U: Đại diện cho giờ (hour), phút (minutes), giây (second), milli giây (milli second), micro giây (microsecond)

Khái niệm và kiểu dữ liệu

Ngoài ra vẫn có thể tạo Panel từ Dict của các DataFrame hay từ chính các DataFrame

Khi xử lý đến chuỗi thời gian, ta thường chỉ chú ý đến “thời điểm và khoảng thời gian”. Và trong pandas đại diện cho “thời điểm” là kiểu Timestamp, tương đương với nó là kiểu datetime của python. Còn lại, đại diện cho “khoảng thời gian” ta có kiểu Period, và chỉ có duy nhất trên Pandas.

III. Vẽ đồ thị với matplotlib

Cả Series với Dataframe đều có rất nhiều phương thức để mô hình hoá đồ thị. Ta sẽ dùng thư viện matplotlib để biểu diễn một cách trực quan các điểm trên mặt phẳng toạ độ. Để sử dụng thư viện, ta cần import:

Giả sử ta muốn biểu diễn hai hàm số f(x) và g(x) với :

  • f(x) = cos(x) + sin (x)
  • g(x) = cos (x) – sin (x)

IV. Kết luận

Vậy trong phần này ta đã hoàn thành phần các phần quan trọng là xử lý với việc mất mát dữ liệu khi thao tác với Pandas, đồng thời thực hiện mô hình hoá dữ liệu trên mặt phẳng đồ thị với thư viện matplotlib. Việc thao tác để làm mượt hoá dữ liệu, hay có thể nói một cách khác là ta đã biến dữ liệu thô thành một loại dữ liệu có cáu trúc hoàn chỉnh để phục vụ cho các phase sau, như làm input cho dữ liệu để Học Máy (Machine Learning), hoặc Khai Phá Dữ Liệu (Data Minding) đồng thời cũng biết cách biểu diễn dữ liệu một cách trực quan qua đồ thị.

Add a Comment

Your email address will not be published.