Hướng dẫn python rolling sum - trăn cuộn tổng

Để 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

  • 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() 

2. Hàm .expanding()

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()

3. Hàm .ewm()

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àm việc với Time Series trong Pandas - 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()

3. Hàm .ewm()

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()

3. Hàm .ewm()

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()

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

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()

3. Hàm .ewm()

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

Làm việc với Time Series trong PandasWindow đượ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

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

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

Indexing Và Slicing

>>> 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]

Resampling và Rolling

Plotting với Pandas DataFramesdate_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')

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. 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.

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ó.

>>> 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

Kết quả :

Indexing Và Slicing

Resampling và Rolling

>>>  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

Plotting với Pandas DataFrames

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..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:

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
0

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ó.

Kết quả :

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.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:.rolling() cho mục đích này:

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
1

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:

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
2

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

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
3

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():

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
4

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ó.