Thứ ba, 14/03/2017 | 00:00 GMT+7

Hướng dẫn về image hóa chuỗi thời gian với Python 3

Phân tích chuỗi thời gian thuộc một nhánh của Thống kê liên quan đến việc nghiên cứu các dữ liệu có thứ tự, thường là theo thời gian. Khi được áp dụng phù hợp, phân tích chuỗi thời gian có thể tiết lộ các xu hướng bất ngờ, extract các số liệu thống kê hữu ích và thậm chí dự báo các xu hướng trong tương lai. Vì những lý do này, nó được áp dụng trên nhiều lĩnh vực bao gồm kinh tế, dự báo thời tiết và lập kế hoạch năng lực, ...

Trong hướng dẫn này, ta sẽ giới thiệu một số kỹ thuật phổ biến được sử dụng trong phân tích chuỗi thời gian và đi qua các bước lặp lại cần thiết để thao tác, trực quan hóa dữ liệu chuỗi thời gian.

Yêu cầu

Hướng dẫn này sẽ trình bày cách thực hiện phân tích chuỗi thời gian trên máy tính local hoặc server từ xa. Làm việc với các tập dữ liệu lớn có thể tốn nhiều bộ nhớ, vì vậy trong cả hai trường hợp, máy tính cần ít nhất 2GB bộ nhớ để thực hiện một số phép tính trong hướng dẫn này.

Đối với hướng dẫn này, ta sẽ sử dụng Jupyter Notebook để làm việc với dữ liệu. Nếu bạn chưa có, bạn nên làm theo hướng dẫn của ta để cài đặt và cài đặt Jupyter Notebook cho Python 3 .

Bước 1 - Cài đặt gói

Ta sẽ tận dụng pandas thư viện, trong đó cung cấp rất nhiều tính linh hoạt khi thao tác dữ liệu, và statsmodels thư viện, cho phép ta thực hiện tính toán thống kê trong Python. Được sử dụng cùng nhau, hai thư viện này mở rộng Python để cung cấp chức năng lớn hơn và tăng đáng kể bộ công cụ phân tích của ta .

Giống như với các gói Python khác, ta có thể cài đặt pandasstatsmodels bằng pip . Đầu tiên, hãy chuyển sang môi trường lập trình local hoặc môi trường lập trình dựa trên server :

  • cd environments
  • . my_env/bin/activate

Từ đây, hãy tạo một folder mới cho dự án của ta . Ta sẽ gọi nó là thời timeseries và sau đó chuyển vào folder . Nếu bạn gọi dự án bằng một tên khác, hãy đảm bảo thay thế tên của bạn cho các timeseries thời gian trong suốt hướng dẫn

  • mkdir timeseries
  • cd timeseries

Bây giờ ta có thể cài đặt pandas , statsmodels và gói dữ liệu biểu đồ matplotlib . Các phụ thuộc của chúng cũng sẽ được cài đặt:

  • pip install pandas statsmodels matplotlib

Đến đây, bây giờ ta đã cài đặt để bắt đầu làm việc với pandasstatsmodels .

Bước 2 - Tải dữ liệu chuỗi thời gian

Để bắt đầu làm việc với dữ liệu của ta , ta sẽ khởi động Jupyter Notebook:

  • jupyter notebook

Để tạo file sổ tay mới, hãy chọn Mới > Python 3 từ trình đơn kéo xuống trên cùng bên phải:

Tạo sổ ghi chép Python 3 mới

Thao tác này sẽ mở một sổ ghi chép cho phép ta tải các thư viện cần thiết (lưu ý các phím tắt tiêu chuẩn được sử dụng để tham chiếu pandas , matplotlib và các statsmodels ). Ở đầu sổ ghi chép của ta , ta nên viết như sau:

import pandas as pd import statsmodels.api as sm import matplotlib.pyplot as plt 

Sau mỗi khối mã trong hướng dẫn này, bạn nên gõ ALT + ENTER để chạy mã và chuyển sang khối mã mới trong sổ ghi chép của bạn .

Thuận tiện, statsmodels đi kèm với tập dữ liệu tích hợp, vì vậy ta có thể tải tập dữ liệu chuỗi thời gian thẳng vào bộ nhớ.

Ta sẽ làm việc với tập dữ liệu có tên “CO2 trong khí quyển từ các mẫu không khí liên tục tại Đài quan sát Mauna Loa, Hawaii, USA ,” thu thập các mẫu CO2 từ tháng 3 năm 1958 đến tháng 12 năm 2001. Ta có thể đưa ra dữ liệu này như sau:

data = sm.datasets.co2.load_pandas() co2 = data.data 

Hãy kiểm tra 5 dòng đầu tiên của dữ liệu chuỗi thời gian của ta trông như thế nào:

print(co2.head(5)) 
Output
co2 1958-03-29 316.1 1958-04-05 317.3 1958-04-12 317.6 1958-04-19 317.5 1958-04-26 316.4

Với các gói của ta được nhập và tập dữ liệu CO2 đã sẵn sàng, ta có thể chuyển sang lập index dữ liệu của bạn .

Bước 3 - Lập index với Dữ liệu chuỗi thời gian

Bạn có thể nhận thấy rằng ngày đã được đặt làm index của DataFrame pandas của ta . Khi làm việc với dữ liệu chuỗi thời gian trong Python, ta nên đảm bảo ngày tháng được sử dụng làm index , vì vậy hãy đảm bảo luôn kiểm tra điều đó, điều này ta có thể thực hiện bằng cách chạy như sau:

co2.index 
Output
DatetimeIndex(['1958-03-29', '1958-04-05', '1958-04-12', '1958-04-19', '1958-04-26', '1958-05-03', '1958-05-10', '1958-05-17', '1958-05-24', '1958-05-31', ... '2001-10-27', '2001-11-03', '2001-11-10', '2001-11-17', '2001-11-24', '2001-12-01', '2001-12-08', '2001-12-15', '2001-12-22', '2001-12-29'], dtype='datetime64[ns]', length=2284, freq='W-SAT')

Trường dtype=datetime[ns] xác nhận index của ta được tạo từ các đối tượng đóng dấu ngày tháng, trong khi length=2284freq='W-SAT' cho ta biết rằng ta có 2.284 dấu ngày hàng tuần bắt đầu từ các ngày thứ Bảy.

Dữ liệu hàng tuần có thể khó xử lý, vì vậy ta hãy sử dụng số liệu trung bình hàng tháng của chuỗi thời gian. Điều này có thể đạt được bằng cách sử dụng chức năng resample thuận tiện, cho phép ta group chuỗi thời gian thành các group (1 tháng), áp dụng một hàm trên mỗi group (giá trị trung bình) và kết hợp kết quả (một hàng cho mỗi group ).

y = co2['co2'].resample('MS').mean() 

Ở đây, thuật ngữ MS nghĩa là ta group dữ liệu theo group theo tháng và đảm bảo ta đang sử dụng ngày bắt đầu của mỗi tháng làm dấu thời gian:

y.head(5) 
Output
1958-03-01 316.100 1958-04-01 317.200 1958-05-01 317.120 1958-06-01 315.800 1958-07-01 315.625 Freq: MS, Name: co2, dtype: float64

Một tính năng thú vị của pandas là khả năng xử lý các chỉ số dấu ngày tháng, cho phép ta chia nhỏ dữ liệu của bạn một cách nhanh chóng. Ví dụ: ta có thể chia nhỏ tập dữ liệu của bạn để chỉ truy xuất các điểm dữ liệu sau năm 1990 :

y['1990':] 
Output
1990-01-01 353.650 1990-02-01 354.650 ... 2001-11-01 369.375 2001-12-01 371.020 Freq: MS, Name: co2, dtype: float64

Hoặc, ta có thể chia nhỏ tập dữ liệu của bạn để chỉ truy xuất các điểm dữ liệu từ tháng 10 1995 đến tháng 10 1996 :

y['1995-10-01':'1996-10-01'] 
Output
1995-10-01 357.850 1995-11-01 359.475 1995-12-01 360.700 1996-01-01 362.025 1996-02-01 363.175 1996-03-01 364.060 1996-04-01 364.700 1996-05-01 365.325 1996-06-01 364.880 1996-07-01 363.475 1996-08-01 361.320 1996-09-01 359.400 1996-10-01 359.625 Freq: MS, Name: co2, dtype: float64

Với dữ liệu của ta được lập index thích hợp để làm việc với dữ liệu tạm thời, ta có thể chuyển sang xử lý các giá trị có thể bị thiếu.

Bước 4 - Xử lý các giá trị bị thiếu trong dữ liệu chuỗi thời gian

Dữ liệu thế giới thực có xu hướng lộn xộn. Như ta có thể thấy từ biểu đồ, không có gì lạ khi dữ liệu chuỗi thời gian chứa các giá trị bị thiếu. Cách đơn giản nhất để kiểm tra những điều đó là bằng cách vẽ trực tiếp dữ liệu hoặc bằng cách sử dụng lệnh bên dưới sẽ hiển thị dữ liệu bị thiếu trong ouput:

y.isnull().sum() 
Output
5

Kết quả này cho ta biết rằng có 5 tháng bị thiếu giá trị trong chuỗi thời gian của ta .

Nói chung, ta nên "điền vào" các giá trị còn thiếu nếu chúng không quá nhiều để ta không có khoảng trống trong dữ liệu. Ta có thể thực hiện điều này ở pandas bằng lệnh fillna() . Để đơn giản hơn, ta có thể điền vào các giá trị còn thiếu với giá trị không rỗng gần nhất trong chuỗi thời gian của bạn , mặc dù điều quan trọng cần lưu ý là giá trị trung bình cuộn đôi khi sẽ thích hợp hơn.

y = y.fillna(y.bfill()) 

Với các giá trị bị thiếu được điền vào, ta có thể kiểm tra xem có tồn tại bất kỳ giá trị null nào không đảm bảo rằng hoạt động của ta hoạt động:

y.isnull().sum() 
Output
0

Sau khi thực hiện các thao tác này, ta thấy rằng ta đã điền thành công tất cả các giá trị còn thiếu trong chuỗi thời gian của bạn .

Bước 5 - Trực quan hóa dữ liệu chuỗi thời gian

Khi làm việc với dữ liệu chuỗi thời gian, rất nhiều thứ có thể được tiết lộ thông qua hình dung nó. Một số điều cần lưu ý là:

  • tính thời vụ : dữ liệu có hiển thị mô hình tuần hoàn rõ ràng không?
  • xu hướng : dữ liệu tuân theo độ dốc lên hoặc xuống nhất quán?
  • nhiễu : có bất kỳ điểm ngoại lệ hoặc thiếu giá trị nào không phù hợp với phần còn lại của dữ liệu không?

Ta có thể sử dụng shell bọc pandas xung quanh API matplotlib để hiển thị một phần của tập dữ liệu của ta :

y.plot(figsize=(15, 6)) plt.show() 

Hình 1

Một số mẫu có thể phân biệt xuất hiện khi ta vẽ biểu đồ dữ liệu. Chuỗi thời gian có mô hình thời vụ rõ ràng, cũng như xu hướng tăng tổng thể. Ta cũng có thể trực quan hóa dữ liệu của bạn bằng phương pháp gọi là phân rã chuỗi thời gian. Đúng như tên gọi của nó, phân rã chuỗi thời gian cho phép ta phân tách chuỗi thời gian của bạn thành ba thành phần riêng biệt: xu hướng, tính thời vụ và nhiễu.

May mắn là statsmodels mang lại lợi seasonal_decompose chức năng để thực hiện phân hủy theo mùa ra khỏi hộp. Nếu bạn muốn tìm hiểu thêm, bạn có thể tìm thấy tài liệu tham khảo về cách triển khai ban đầu của nó trong bài báo sau, “ STL: Quy trình phân hủy theo xu hướng theo mùa dựa trên hoàng thổ .”

Tập lệnh dưới đây cho biết cách thực hiện phân rã theo mùa theo chuỗi thời gian trong Python. Theo mặc định, seasonal_decompose trả về một con số có kích thước tương đối nhỏ, vì vậy hai dòng đầu tiên của đoạn mã này đảm bảo con số kết quả đủ lớn để ta dễ hình dung.

from pylab import rcParams rcParams['figure.figsize'] = 11, 9  decomposition = sm.tsa.seasonal_decompose(y, model='additive') fig = decomposition.plot() plt.show() 

Thời gian Biểu thị theo mùa-Xu hướng phân hủy Hình 2

Sử dụng phân tích chuỗi thời gian giúp dễ dàng xác định nhanh chóng giá trị trung bình hoặc biến thể đang thay đổi trong dữ liệu. Biểu đồ trên cho thấy rõ ràng xu hướng đi lên của dữ liệu của ta , cùng với tính thời vụ hàng năm của nó. Chúng được dùng để hiểu cấu trúc của chuỗi thời gian của ta . Trực giác đằng sau sự phân rã chuỗi thời gian rất quan trọng, vì nhiều phương pháp dự báo xây dựng dựa trên khái niệm phân rã có cấu trúc này để đưa ra dự báo.

Kết luận

Nếu bạn đã làm theo hướng dẫn này, bây giờ bạn đã có kinh nghiệm trực quan hóa và thao tác dữ liệu chuỗi thời gian trong Python.

Để cải thiện hơn nữa bộ kỹ năng của bạn , bạn có thể tải trong một bộ dữ liệu khác và lặp lại tất cả các bước trong hướng dẫn này. Ví dụ: bạn có thể cần đọc file CSV bằng thư viện pandas hoặc sử dụng tập dữ liệu sunspots được tải sẵn với thư viện statsmodels : data = sm.datasets.sunspots.load_pandas().data .


Tags:

Các tin liên quan

Cách viết comment bằng Python 3
2017-03-03
Cách xác định hàm trong Python 3
2017-02-28
Phân tích và trực quan hóa dữ liệu với pandas và notebook Jupyter bằng Python 3
2017-02-23
Cách vẽ biểu đồ tần suất từ bằng matplotlib với Python 3
2017-02-17
Cách cài đặt gói pandas và làm việc với cấu trúc dữ liệu trong Python 3
2017-02-10
Cách cài đặt gói pandas và làm việc với cấu trúc dữ liệu trong Python 3
2017-02-10
Cách cài đặt gói pandas và làm việc với cấu trúc dữ liệu trong Python 3
2017-02-10
Cách viết module trong Python 3
2017-02-03
Cách cài đặt Python 3 và thiết lập môi trường lập trình trên server Ubuntu 16.04
2017-02-01
Cách khai báo module trong Python 3
2017-02-01