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