Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Tính EWM điều chỉnh và không điều chỉnh trong DataFrame Python

Giả sử bạn cần tính Exponential Weighted Moving average (EWM) với tham số điều chỉnh adjust=True (mặc định) và adjust=False.

Giải pháp

  • Tạo DataFrame (có thể chứa giá trị NaN).
  • Tính EWM điều chỉnh: df.ewm(com=0.5).mean().
  • Tính EWM không điều chỉnh: df.ewm(com=0.5, adjust=False).mean().

Tham số com (center of mass): Xác định trọng số giảm theo cấp số nhân. com=0.5 tương đương alpha = 1/(1+com) = 2/3.

Mã ví dụ

import numpy as np
import pandas as pd

df = pd.DataFrame({
    'Id': [1, 2, 3, np.nan, 5],
    'Age': [12, 13, 12, 14, 15]
})

print("DataFrame gốc:\n", df)
print("\nAdjusted EWM (adjust=True):\n", df.ewm(com=0.5).mean())
print("\nNon-adjusted EWM (adjust=False):\n", df.ewm(com=0.5, adjust=False).mean())

Kết quả

DataFrame gốc:
     Id   Age
0  1.0   12
1  2.0   13
2  3.0   12
3  NaN   14
4  5.0   15

Adjusted EWM (adjust=True):
          Id        Age
0  1.000000  12.000000
1  1.750000  12.750000
2  2.615385  12.230769
3  2.615385  13.425000
4  4.670213  14.479339

Non-adjusted EWM (adjust=False):
          Id        Age
0  1.000000  12.000000
1  1.666667  12.666667
2  2.555556  12.222222
3  2.555556  13.407407
4  4.650794  14.469136

Sự khác biệt:

  • adjust=True (mặc định): Khử bias bằng cách chia cho (1 - alpha^t). Kết quả chính xác hơn ở các bước đầu.
  • adjust=False: Tính đệ quy đơn giản: y_t = alpha * x_t + (1-alpha) * y_{t-1}. Nhanh hơn nhưng bị bias ở đầu chuỗi.

Lưu ý: Giá trị NaN trong cột Id bị bỏ qua khi tính EWM (không lan truyền).