Giảm kích thước bằng cách lấy mẫu lại chuỗi thời gian/dữ liệu quang phổ [Python: SciPy]

Ngày 2019 tháng 3 năm 26

Đây là một phương pháp khi bạn muốn làm mỏng dữ liệu chuỗi thời gian/phổ trong DataFrame bằng Python.

Với "pandas.DataFrame.resample", bạn phải đặt thời gian như D (hàng ngày) hoặc W (hàng tuần) làm đối số.Phương pháp sau đây có thể được sử dụng khi bạn muốn làm mỏng dữ liệu chuỗi thời gian hoặc dữ liệu phổ không có cột ngày/giờ.

Chuỗi thời gian/dữ liệu quang phổ là gì?

Chuỗi thời gian/dữ liệu quang phổ được quan sát theo các khoảng thời gian đều đặn dọc theo một trục nhất định.Chuỗi dữ liệu áp dụng.Ví dụ bao gồm những thay đổi về giá cổ phiếu và quang phổ hấp thụ.

Ví dụ về dữ liệu chuỗi thời gian Ví dụ về dữ liệu quang phổ
・Chuyển đổi nhiệt độ và lượng mưa
・Thay đổi điều kiện giao thông
・Doanh số hàng ngày
・Thay đổi giá cổ phiếu
・Xu hướng giá Bitcoin
・Dữ liệu thoại
・Phổ hấp thụ của các hợp chất (IR, UV)
・Quang phổ từ các thiên thể

Mặc dù mỗi cách phân loại là khác nhau nhưng chúng có những đặc điểm giống nhau sau đây là dữ liệu.

  1. Các điểm liền kề với điểm đo có giá trị gần nhau
  2. Dài hạn (phạm vi rộng) chứa tiếng ồn

参照: https://kotobank.jp/word/%E6%99%82%E7%B3%BB%E5%88%97%E3%83%87%E3%83%BC%E3%82%BF-1329677 https://datachemeng.com/preprocessspectratimeseriesdata/

Lấy mẫu lại chuỗi thời gian/dữ liệu quang phổ

Khi tạo mô hình dự đoán dựa trên chuỗi thời gian/dữ liệu quang phổ, việc sử dụng dữ liệu từ tất cả các điểm đo sẽ dẫn đến một số lượng lớn các tính năng.Điều này dẫn đến việc trang bị quá mức, do đó, việc giảm kích thước bằng cách lấy mẫu xuống có hiệu quả để cải thiện hiệu suất tổng quát hóa.

Sử dụng gì: SciPy (scipy.signal)

Phần mềm nguồn mở cho toán học, khoa học và kỹ thuậthệ sinh thái phần mềm (một loạt các thư viện máy tính khoa học tiên tiến).

NumPy có thể thực hiện các phép toán số nâng cao hơn hằng số vật lý, ma trận thưa thớt, phân phối xác suất, tích hợp số, xử lý tín hiệu, tối ưu hóa, thống kê, v.v.

scipy.signal là một mô-đun để xử lý dạng sóng trong scipy.

  • scipy.signal.decimate

nhập numpy dưới dạng np từ tín hiệu nhập scipy # tạo cơ sở dữ liệu dạng sóng 40 x = np.linspace(0, 10, 40, endpoint=False) y = np.cos(-x**2/6) # Lấy mẫu dữ liệu xuống 20 điểm x_down = np.linspace(0, 10, 20, endpoint=False) y_down = signal.decimate(y, 2) # Lấy mẫu xuống theo hệ số 2 # Vẽ kết quả trên đồ thị %matplotlib inline plt.plot(x, y, ' .-', label='data') plt.plot(x_down, y_down, 'rs-', label='down-sampled', alpha=1) plt.legend () plt.show()
Lấy mẫu xuống với scipy.signal.decimate
Lấy mẫu xuống với scipy.signal.decimate

scipy.signal.decimate thực hiện khử răng cưa và lấy mẫu xuống (khử răng cưa là quy trình loại bỏ biến dạng xảy ra khi lấy mẫu dữ liệu liên tục theo các khoảng thời gian đều đặn).Nó được lấy mẫu lại ở dạng gần với dạng có điểm dữ liệu bị giảm.

Tham khảo:https://docs.scipy.org/doc/scipy-1.2.1/reference/generated/scipy.signal.decimate.html

  • scipy.signal.resample

# Tạo dữ liệu dạng sóng 40 điểm cơ sở x = np.linspace(0, 10, 40, endpoint=False) y = np.cos(-x**2/6) # Dựa trên dữ liệu, nhân với 2.5 Lấy mẫu lên 100 điểm x_up = np.linspace(0, 10, 100, endpoint=False) y_up = signal.resample(y, 100) # Lấy mẫu xuống một nửa dữ liệu x_down = np.linspace( 20, 0, 10, endpoint=False) y_down = signal.resample(y, 20) # Vẽ kết quả trên biểu đồ import matplotlib.pyplot as plt %matplotlib inline plt.plot(x, y, '.-', label= 'data') plt.plot(x_up, y_up, 'go-', label='up-sampled', alpha=20) plt.legend() plt.show() plt.plot(x, y, '.- ', label='data') plt. cốt truyện(x_down, y_down, 'rs-', label='down-sampled', alpha=0.3) plt.legend() plt.show()
Dữ liệu dạng sóng được xử lý bằng scipy.signal.resample
Dữ liệu dạng sóng được xử lý bằng scipy.signal.resample

scipy.signal.resample dựa trên giả định rằng tín hiệu là tuần hoàn do lấy mẫu lại bằng cách sử dụng biến đổi Fourier.Nếu tính tuần hoàn không được thỏa mãn, chẳng hạn như phần đầu cuối trong dữ liệu trên, giá trị sẽ sai lệch rất nhiều.

Nhân tiện, scipy.signal.resample cũng có thể lấy mẫu lên.
Đường màu xanh lam là điểm dữ liệu ban đầu, màu xanh lá cây là biểu đồ sau khi lấy mẫu lên và màu đỏ là sau khi lấy mẫu xuống.

 

cuộc thi phân tích giọng nói kaggleNgoài ra còn có một ví dụ sử dụng để tham khảo.

Tham khảo:https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.signal.resample.html

Ứng dụng vào DataFrame

Được thực hiện trên một khung dữ liệu với các hàng cho từng điểm đo và các cột cho từng mẫu.

nhập gấu trúc dưới dạng pd # tạo dữ liệu để lưu trữ trong khung dữ liệu y1 = np.cos(-x**2/6)*1/2 y2 = np.cos(x)*1/3 df1 = pd.DataFrame({ ' y':y, 'y1':y1, 'y2':y2}) # Lấy mẫu xuống df1_down = signal.decimate(df1, 2, axis=0) df1_down = pd.DataFrame(df1_down, column=['y_down' ,' y1_down','y2_down'], index=np.linspace(0, 10, 20, endpoint=False)) # Hiển thị & vẽ biểu đồ dữ liệu đã lấy mẫu xuống print(df1.head(10)) print(df1_down.head (10)) df1 .plot(kind='line', marker='.') df1_down.plot(kind='line', marker='.')
df1.head(10) df1_down.head(10)
 df1.head(10) df1_down.head(10)
Điểm dữ liệu trước và sau khi lấy mẫu xuống
Trước khi lấy mẫu xuống Sau khi lấy mẫu xuống

Ngay cả sau khi lấy mẫu xuống từ 40 điểm ban đầu xuống 1 điểm, tức là 2/20, dạng sóng vẫn được duy trì với độ chính xác tốt và có vẻ như ít bị mất thông tin ngay cả khi nó được sử dụng làm giá trị tính năng.

Ví dụ về khung dữ liệu với các hàng cho từng mẫu và các cột cho từng điểm đo
Khi hàng là mẫu và cột là điểm đo

Trong trường hợp khung dữ liệu (được gọi là dữ liệu có thứ tự) trong đó các hàng là mỗi mẫu và các cột là mỗi điểm đo, đối sốaxis=1Nếu vậy, OK.