Hướng dẫn dùng df rolling python

Để làm việc trên dữ liệu số, Pandas cung cấp một số biến thể như trolling, expanding và exponentially theo cấp số nhân cho thống kê window. Trong số này có tổng, trung bình, trung vị, phương sai, hiệp phương sai, tương quan, v.v.

Nội dung chính Show

  • 1. Hàm .rolling() 
  • 2. Hàm .expanding()
  • 3. Hàm .ewm()
  • Làm việc với Time Series trong Pandas
  • Tạo một DataFrames với Time-Series Labels
  • Indexing Và Slicing
  • Resampling và Rolling
  • Plotting với Pandas DataFrames

Bây giờ chúng ta sẽ tìm hiểu cách áp dụng từng thứ này trên các đối tượng DataFrame.

1. Hàm .rolling() 

Hàm này có thể được áp dụng trên một loạt dữ liệu. Chỉ định đối số window = n và áp dụng hàm thống kê thích hợp trên nó.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print df.rolling(window=3).mean()

Kết quả :

A           B           C           D
2000-01-01        NaN         NaN         NaN         NaN
2000-01-02        NaN         NaN         NaN         NaN
2000-01-03   0.434553   -0.667940   -1.051718   -0.826452
2000-01-04   0.628267   -0.047040   -0.287467   -0.161110
2000-01-05   0.398233    0.003517    0.099126   -0.405565
2000-01-06   0.641798    0.656184   -0.322728    0.428015
2000-01-07   0.188403    0.010913   -0.708645    0.160932
2000-01-08   0.188043   -0.253039   -0.818125   -0.108485
2000-01-09   0.682819   -0.606846   -0.178411   -0.404127
2000-01-10   0.688583    0.127786    0.513832   -1.067156

Lưu ý - Vì kích thước window là 3, đối với hai phần tử đầu tiên có giá trị rỗng và từ phần ba giá trị sẽ là giá trị trung bình của n, n-1 và n-2 phần tử. Vì vậy, ta cũng có thể áp dụng các hàm khác nhau như đã đề cập ở trên.

2. Hàm .expanding()

Hàm này có thể được áp dụng trên một loạt dữ liệu. Chỉ định đối số min_periods = n và áp dụng hàm thống kê thích hợp trên nó.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print df.expanding(min_periods=3).mean()

Kết quả :

A           B           C           D
2000-01-01        NaN         NaN         NaN         NaN
2000-01-02        NaN         NaN         NaN         NaN
2000-01-03   0.434553   -0.667940   -1.051718   -0.826452
2000-01-04   0.743328   -0.198015   -0.852462   -0.262547
2000-01-05   0.614776   -0.205649   -0.583641   -0.303254
2000-01-06   0.538175   -0.005878   -0.687223   -0.199219
2000-01-07   0.505503   -0.108475   -0.790826   -0.081056
2000-01-08   0.454751   -0.223420   -0.671572   -0.230215
2000-01-09   0.586390   -0.206201   -0.517619   -0.267521
2000-01-10   0.560427   -0.037597   -0.399429   -0.376886

3. Hàm .ewm()

ewm được áp dụng trên một loạt dữ liệu. Chỉ định bất kỳ đối số com, span, halflife nào và áp dụng hàm thống kê thích hợp lên trên nó. Nó chỉ định các trọng số theo cấp số nhân.

import pandas as pd
import numpy as np
 
df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print df.ewm(com=0.5).mean()

Kết quả :

A           B           C           D
2000-01-01   1.088512   -0.650942   -2.547450   -0.566858
2000-01-02   0.865131   -0.453626   -1.137961    0.058747
2000-01-03  -0.132245   -0.807671   -0.308308   -1.491002
2000-01-04   1.084036    0.555444   -0.272119    0.480111
2000-01-05   0.425682    0.025511    0.239162   -0.153290
2000-01-06   0.245094    0.671373   -0.725025    0.163310
2000-01-07   0.288030   -0.259337   -1.183515    0.473191
2000-01-08   0.162317   -0.771884   -0.285564   -0.692001
2000-01-09   1.147156   -0.302900    0.380851   -0.607976
2000-01-10   0.600216    0.885614    0.569808   -1.110113

Các hàm Window được sử dụng chủ yếu để tìm các xu hướng bên trong dữ liệu bằng đồ thị bằng cách làm mịn đường cong. Nếu dữ liệu hàng ngày có nhiều biến động và có sẵn nhiều điểm dữ liệu, thì lấy mẫu và vẽ biểu đồ là một hàm và áp dụng tính toán window và vẽ biểu đồ trên kết quả là một hàm khác. Bằng những phương pháp này, ta có thể làm mịn đường cong hoặc xu hướng.

Làm việc với Time Series trong Pandas

Pandas thật sự vượt trội trong việc xử lý với Time Series. Mặc dù chức năng này một phần dựa trên datetimes và timedeltas của NumPy, nhưng Pandas cung cấp tính linh hoạt hơn nhiều.

Nội dung chính

  • Làm việc với Time Series trong Pandas
  • Tạo một DataFrames với Time-Series Labels
  • Indexing Và Slicing
  • Resampling và Rolling
  • Plotting với Pandas DataFrames

Tạo một DataFrames với Time-Series Labels

Trong phần này, bạn sẽ tạo Pandas DataFrame bằng cách sử dụng dữ liệu nhiệt độ mỗi giờ trong một ngày (đơn vị: độ C).

>>> temp_c = [24.0, 24.1, 24.8, 24.4, 24.0, 24.4, 24.8, 25.0,
...           26.0, 26.8, 27.3, 27.1, 28.2, 29.1, 29.4, 28.1,
...           28.0, 27.9, 27.5, 27.4, 26.9, 26.0, 25.2, 24.7]

Và bây giờ bạn có biến temp_c, là danh sách các giá trị nhiệt độ trong một ngày.

Bước tiếp theo là tạo một chuỗi ngày và giờ. Pandas cung cấp một hàm rất tiện lợi, đó là date_range() để thực hiện việc này:

>>> dt = pd.date_range(start='2021-07-18 00:00:00.0', periods=24, freq='H')
>>> dt
DatetimeIndex(['2021-07-18 00:00:00', '2021-07-18 01:00:00',
               '2021-07-18 02:00:00', '2021-07-18 03:00:00',
               '2021-07-18 04:00:00', '2021-07-18 05:00:00',
               '2021-07-18 06:00:00', '2021-07-18 07:00:00',
               '2021-07-18 08:00:00', '2021-07-18 09:00:00',
               '2021-07-18 10:00:00', '2021-07-18 11:00:00',
               '2021-07-18 12:00:00', '2021-07-18 13:00:00',
               '2021-07-18 14:00:00', '2021-07-18 15:00:00',
               '2021-07-18 16:00:00', '2021-07-18 17:00:00',
               '2021-07-18 18:00:00', '2021-07-18 19:00:00',
               '2021-07-18 20:00:00', '2021-07-18 21:00:00',
               '2021-07-18 22:00:00', '2021-07-18 23:00:00'],
              dtype='datetime64[ns]', freq='H')

date_range() chấp nhận các đối số mà bạn sử dụng để chỉ định thời gian bắt đầu hoặc kết thúc, số khoảng thời gian, tần suất, time-zone, v.v.

Bây giờ bạn đã có các giá trị nhiệt độ và thời gian tương ứng, bạn có thể tạo DataFrame như sau:

>>> temp = pd.DataFrame(data={'temp_c': temp_c}, index=dt)
>>> temp
                      temp_c
2021-07-18 00:00:00    24.0
2021-07-18 01:00:00    24.1
2021-07-18 02:00:00    24.8
2021-07-18 03:00:00    24.4
2021-07-18 04:00:00    24.0
2021-07-18 05:00:00    24.4
2021-07-18 06:00:00    24.8
2021-07-18 07:00:00    25.0
2021-07-18 08:00:00    26.0
2021-07-18 09:00:00    26.8
2021-07-18 10:00:00    27.3
2021-07-18 11:00:00    27.1
2021-07-18 12:00:00    28.2
2021-07-18 13:00:00    29.1
2021-07-18 14:00:00    29.4
2021-07-18 15:00:00    28.1
2021-07-18 16:00:00    28.0
2021-07-18 17:00:00    27.9
2021-07-18 18:00:00    27.5
2021-07-18 19:00:00    27.4
2021-07-18 20:00:00    26.9
2021-07-18 21:00:00    26.0
2021-07-18 22:00:00    25.2
2021-07-18 23:00:00    24.7

Và đây là kết quả sau khi bạn đã tạo DataFrame với time-series và date-time.

Indexing Và Slicing

Khi bạn có Pandas DataFrame với dữ liệu time-series, bạn có thể áp dụng phương pháp slicing để chỉ lấy một phần thông tin một cách thuận tiện:

>>>  temp['2021-07-18 06':'2021-07-18 18']
                      temp_c
2021-07-18 06:00:00    24.8
2021-07-18 07:00:00    25.0
2021-07-18 08:00:00    26.0
2021-07-18 09:00:00    26.8
2021-07-18 10:00:00    27.3
2021-07-18 11:00:00    27.1
2021-07-18 12:00:00    28.2
2021-07-18 13:00:00    29.1
2021-07-18 14:00:00    29.4
2021-07-18 15:00:00    28.1
2021-07-18 16:00:00    28.0
2021-07-18 17:00:00    27.9
2021-07-18 18:00:00    27.5

Trong ví dụ trên, mình đã trích xuất nhiệt độ từ 6 giờ sáng đến đến 6 giờ tối. Mặc dù mình chỉ cung cấp dữ liệu dưới dạng string, nhưng Pandas có thể hiểu được rằng các row labels của mình là các giá trị ngày và giờ và phân tích chúng.

Resampling và Rolling

Ví dụ ở trên đã cho chúng ta thấy cách kết hợp các date-time row labels và sử dụng phương pháp slicing để lấy thông tin bạn cần từ dữ liệu time-series. Điều này chỉ là khởi đầu. Và có những thứ còn tốt hơn.

Nếu bạn muốn chia một ngày thành từng khoảng thời gian và nhận được nhiệt độ trung bình cho mỗi khoảng thời gian, thì bạn chỉ cần thực hiện một thao tác duy nhất. Pandas cung cấp phương thức .resample() để thực hiện việc đó, và bạn có thể kết hợp phương thức này với các phương thức khác như .mean() để lấy dữ liệu mà bạn đang cần:

>>> temp.resample(rule='4h').mean()
                     temp_c
2021-07-18 00:00:00  24.325
2021-07-18 04:00:00  24.550
2021-07-18 08:00:00  26.800
2021-07-18 12:00:00  28.700
2021-07-18 16:00:00  27.700
2021-07-18 20:00:00  25.700

Bây giờ chúng ta có một Pandas DataFrame mới với 6 rows. Mỗi row tương ứng với một khoảng thời gian là bốn giờ. Ví dụ: giá trị 24.325 giá trị nhiệt độ trung bình của bốn giờ đầu tiên của DataFrame temp, và giá trị là giá trị nhiệt độ trung bình của bốn cuối cùng trong ngày là 25.700.

Ngoại trừ hàm .mean(), bạn có thể sử dụng .min() hoặc .max() để lấy nhiệt độ thấp nhất và cao nhất trong mỗi khoảng thời gian. Bạn cũng có thể sử dụng .sum() để lấy tổng giá trị dữ liệu, mặc dù thông tin này có thể không hữu ích khi bạn đang làm việc với nhiệt độ.

Ở một số trường hợp, bạn có thể cần thực hiện một số rolling-window analysis. Điều này liên quan đến việc tính toán, thống kê cho một số hàng liền kề được chỉ định, tạo nên window of data của bạn. Bạn có thể "roll" window bằng cách chọn một tập hợp các hàng liền kề khác nhau để thực hiện các phép toán của mình.

Pandas cung cấp phương pháp .rolling() cho mục đích này:

>>> temp.rolling(window=4).mean()
                     temp_c
2021-07-18 00:00:00     NaN
2021-07-18 01:00:00     NaN
2021-07-18 02:00:00     NaN
2021-07-18 03:00:00  24.325
2021-07-18 04:00:00  24.325
2021-07-18 05:00:00  24.400
2021-07-18 06:00:00  24.400
2021-07-18 07:00:00  24.550
2021-07-18 08:00:00  25.050
2021-07-18 09:00:00  25.650
2021-07-18 10:00:00  26.275
2021-07-18 11:00:00  26.800
2021-07-18 12:00:00  27.350
2021-07-18 13:00:00  27.925
2021-07-18 14:00:00  28.450
2021-07-18 15:00:00  28.700
2021-07-18 16:00:00  28.650
2021-07-18 17:00:00  28.350
2021-07-18 18:00:00  27.875
2021-07-18 19:00:00  27.700
2021-07-18 20:00:00  27.425
2021-07-18 21:00:00  26.950
2021-07-18 22:00:00  26.375
2021-07-18 23:00:00  25.700

Với ví dụ trên ta có DataFrame với nhiệt độ trung bình mỗi 4 giờ cho mỗi khung window. Tham số window chỉ định kích thước di chuyển của window.

Ở trong ví dụ, giá trị thứ 4 (24.325) là nhiệt độ được tính trung bình của các giờ (00:00:00, 01:00:00, 02:00:00, 03:00:00). Giá trị thứ 5 là nhiệt độ trung bình cho các giờ (01:00:00, 02:00:00, 03:00:00, 04:00:00). Và cứ thế, nhiệt độ trung bình sẽ được tính toán đến hàng cuối cùng. Với 3 hàng đầu tiên sẽ không có giá trị vì thiêu dữ liệu để tính toán.

Plotting với Pandas DataFrames

Với Pandas, bạn có thể visualize data hoặc tạo các plot dựa trên DataFrames.

Nếu bạn muốn làm việc với plots, thì trước tiên bạn cần import matplotlib.pyplot:

>>> import matplotlib.pyplot as plt

Và giờ bạn có thể sử dụng pandas.DataFrame.plot() để tạo và plt.show() để hiển thị nó.

>>> temp.plot()
>>> plt.show()

Bạn cũng có thể áp dụng .plot.line() và nhận được kết quả tương tự. Cả .plot() và .plot.line() đều có nhiều tham số tùy chọn mà bạn có thể sử dụng để chỉ định giao diện plot của mình.

Bạn có thể lưu hình ảnh plot bằng cách sử dụng phương thức .getfigure() và .savefig():

>>> temp.plot().get_figure().savefig('tempSG.png')

Hành trình làm quen với Pandas đến đây là kết thúc! Hi vọng bạn sẽ yêu thích nó.