
Kỹ thuật tính năng chuỗi thời gian với Python Itertools
Tìm hiểu cách sử dụng itertools của Python để xây dựng các tính năng chuỗi thời gian hiệu quả và có thể mở rộng.
-->
Kỹ thuật tính năng chuỗi thời gian với Python Itertools - KDnuggets
-->
Blog
Bài viết hàng đầu
Giới thiệu
chủ đề
trí tuệ nhân tạo
Lời khuyên nghề nghiệp
Thị giác máy tính
Kỹ thuật dữ liệu
Khoa học dữ liệu
Mô hình ngôn ngữ
Học máy
MLOps
NLP
Lập trình
Python
SQL
Bộ dữ liệu
Sự kiện
Tài nguyên
Bảng cheat
Khuyến nghị
Tóm tắt công nghệ
Quảng cáo
Tham gia bản tin
Kỹ thuật tính năng chuỗi thời gian với Python Itertools
Tìm hiểu cách sử dụng itertools của Python để xây dựng các tính năng chuỗi thời gian hiệu quả và có thể mở rộng.
Bởi Bala Priya C, KDnuggets Biên tập viên đóng góp & Chuyên gia nội dung kỹ thuật vào ngày 14 tháng 5 năm 2026 trên tạp chí Khoa học dữ liệu
-->
#Giới thiệu
Kỹ thuật tính năng chuỗi thời gian không tuân theo các quy tắc giống như dữ liệu dạng bảng. Các quan sát không độc lập, thứ tự hàng không ngẫu nhiên và các tính năng hữu ích nhất hiếm khi là các bài đọc riêng lẻ. Bạn sẽ phải xác định các mẫu theo thời gian như tốc độ thay đổi, so sánh độ trễ, độ lệch so với đường cơ sở luân phiên, v.v.
Về bản chất, độ trễ xây dựng, cửa sổ trượt và nhóm giữa các độ phân giải đều là các vấn đề cốt lõi của việc lặp lại theo trình tự được sắp xếp. Mô-đun itertools của Python rất phù hợp cho loại công việc này. Nó không thay thế các khái niệm trừu tượng về gấu trúc cấp cao như .rolling(), nhưng nó cung cấp cho bạn các khối xây dựng cấp thấp hơn để xây dựng chính xác các tính năng bạn cần, với toàn quyền kiểm soát logic.
Trong bài viết này, bạn sẽ xây dựng bảy loại tính năng chuỗi thời gian bằng cách sử dụng itertools. Bạn cũng sẽ áp dụng từng cái cho một tập dữ liệu mẫu.
Bạn có thể lấy mã trên GitHub.
# Tạo tập dữ liệu mẫu
Trước khi bắt đầu xây dựng các tính năng, hãy tạo một tập dữ liệu cảm biến mẫu để sử dụng trong suốt bài viết.
nhập numpy dưới dạng np
nhập gấu trúc dưới dạng pd
nhập itertools
np.random.seed(42)
tiết = 168 # một tuần đọc hàng giờ
chỉ mục = pd.date_range(start="2024-03-01", Period= Periods, freq="h")
giờ = np.arange(thời gian)
# Nhiệt độ (°C): chu kỳ hàng ngày + trôi dần + tiếng ồn
temp_base = 3,5
temp_daily = 1,2 * np.sin(2 * np.pi * giờ / 24)
temp_drift = 0,003 * giờ
temp_noise = np.random.normal(0, 0,3, dấu chấm)
nhiệt độ = temp_base + temp_daily + temp_drift + temp_noise
# Độ ẩm (%): tỉ lệ nghịch với nhiệt độ + tiếng ồn
độ ẩm = 78 - 2,1 * (nhiệt độ - temp_base) + np.random.normal(0, 1.2, chu kỳ)
# Công suất tiêu thụ (kW): cao điểm trong giờ làm việc, cao hơn vào các ngày trong tuần
ngày_of_week = chỉ mục.dayofweek
business_hours = ((index.hour >= 8) & (index.hour = 5, 0,6, 1,0)
sức mạnh = (
42,0
+ 18,0 * giờ làm việc * yếu tố cuối tuần
+ np.random.normal(0, 2.1, dấu chấm)
)
df = pd.DataFrame({
"nhiệt độ_c": np.round(nhiệt độ, 3),
"độ ẩm_pct": np.round(độ ẩm, 2),
"power_kw": np.round(power, 2),
}, chỉ mục=chỉ mục)
df.index.name = "dấu thời gian"
print(df.head(8))
print(f"\nHình dạng: {df.shape}")
Đầu ra:
nhiệt độ_c độ ẩm_pct công suất_kw
dấu thời gian
2024-03-01 00:00:00 3.649 77.39 40.27
2024-03-01 01:00:00 3.772 76.52 41.33
2024-03-01 02:00:00 4.300 75.25 42.87
2024-03-01 03:00:00 4.814 74.26 40.82
2024-03-01 04:00:00 4.481 75.85 40.27
2024-03-01 05:00:00 4.604 76.09 42.51
2024-03-01 06:00:00 5.192 74.78 42.51
2024-03-01 07:00:00 4.910 76.03 40.94
Hình dạng: (168, 3)
Hiện tại chúng tôi có 168 kết quả đọc hàng giờ trên ba kênh cảm biến. Bây giờ hãy xây dựng các tính năng.
# 1. Tạo tính năng Lag với islice
Đặc điểm độ trễ là đặc điểm chuỗi thời gian cơ bản nhất: giá trị của một biến tại một số bước cố định trong quá khứ. Ví dụ: mỗi giá trị từ 1 bước trước, 6 bước trước hoặc 24 bước trước có thể nắm bắt các mẫu riêng biệt như biến động ngắn hạn, hành vi lặp lại trong khoảng thời gian và xu hướng hoặc tính thời vụ dài hạn hơn.
Hãy xây dựng các tính năng độ trễ cho tập dữ liệu mẫu của chúng tôi bằng cách sử dụng islice:
cảm biến_readings = df["nhiệt độ_c"].tolist()
lag_offsets = [1, 6, 12, 24]
lag_features = {}
về độ trễ trong lag_offsets:
lag = list(itertools.islice(sensor_readings, 0, len(sensor_readings) - lag))
# Đệm phần đầu bằng Không để duy trì căn chỉnh chỉ mục
lag_features[f"temp_lag_{lag}h"] = [Không] * lag + lag
lag_df = pd.DataFrame(lag_features, index=df.index)
lag_df["nhiệt độ_c"] = df["nhiệt độ_c"]
print(lag_df.iloc[24:30])
Đầu ra:
temp_lag_1h temp_lag_6h temp_lag_12h temp_lag_24h \
dấu thời gian
2024-03-02 00:00:00 2.831 2.082 3.609 3.649
2024-03-02 01:00:00 3.409 1.974 2.654 3.772
2024-03-02 02:00:00 3.919 2.960 2.425 4.300
2024-03-02 03:00:00 3.833 2.647 2.528 4.814
2024-03-02 04:00:00 4.542 2.986 2.205 4.481
2024-03-02 05:00:00 4.443 2.831 2.486 4.604
nhiệt độ_c
dấu thời gian
2024-03-02 00:00:00 3.409
2024-03-02 01:00:00 3.919
2024-03-02 02:00:00 3.833
2024-03-02 03:00:00 4.542
2024-03-02 04:00:00 4.443
2024-03-02 05:00:00 4.659
islice(sensor_readings, 0, len - lag) trích xuất chuỗi được dịch ngược theo các bước trễ mà không tạo bản sao của danh sách đầy đủ. Phần đệm Không có ở phía trước giữ cho mọi tính năng trễ được căn chỉnh với chỉ mục gốc. Điều này quan trọng khi sau này bạn bỏ NaN để đào tạo mô hình.
#2. Xây dựng tính năng Rolling Window bằng islice và tích lũy
Một giá trị độ trễ duy nhất cho bạn biết cảm biến đã đọc được gì tại một thời điểm trong quá khứ. Số liệu thống kê luân phiên cho bạn biết cảm biến đã hoạt động như thế nào trong một khoảng thời gian, điều này thường hữu ích hơn nhiều.
số đọc = df["nhiệt độ_c"].tolist()
window_size = 6#Cửa sổ cuốn 6 tiếng
cán_features = []
cho i trong phạm vi(len(đọc)):
nếu tôi
Đầu ra:
lăn_mean_6h lăn_std_6h lăn_min_6h \
dấu thời gian
2024-03-01 06:00:00 4.2700 0.4256 3.649
2024-03-01 07:00:00 4.5272 0.4386 3.772
2024-03-01 08:00:00 4.7168 0.2929 4.300
2024-03-01 09:00:00 4.7372 0.2662 4.422
2024-03-01 10:00:00 4.6912 0.2728 4.422
2024-03-01 11:00:00 4.6095 0.3769 3.991
nhiệt độ lăn_max_6h
Nguồn tin: KDnuggets — Tác giả: Bala Priya C. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.