Pengurangan dimensi dengan mengambil sampel ulang deret waktu/data spektral [Python: SciPy]

2019 3 年 月 日 26

Ini adalah metode ketika Anda ingin menipiskan data deret waktu/spektrum dalam DataFrame dengan Python.

Dengan "pandas.DataFrame.resample", Anda harus menyetel waktu seperti D (harian) atau W (mingguan) sebagai argumen.Metode berikut dapat digunakan saat Anda ingin menipiskan data deret waktu atau data spektrum yang tidak memiliki kolom tanggal/waktu.

Apa itu deret waktu/data spektral?

Data deret waktu/spektral diamati secara berkala di sepanjang sumbu tertentu.Seri data berlaku.Contohnya termasuk perubahan harga saham dan spektrum serapan.

Contoh data deret waktu Contoh data spektral
・Transisi suhu dan curah hujan
・Perubahan kondisi lalu lintas
・Penjualan harian
・Perubahan harga saham
・Tren harga Bitcoin
・Data suara
・Spektra serapan senyawa (IR, UV)
・Spektra dari benda langit

Meskipun setiap klasifikasi berbeda, mereka memiliki karakteristik yang sama sebagai data.

  1. Titik yang berdekatan dengan titik pengukuran memiliki nilai yang dekat
  2. Jangka panjang (jangkauan luas) mengandung kebisingan

参照: 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/

Pengambilan sampel ulang data deret waktu/spektral

Saat membuat model prediksi berdasarkan data deret waktu/spektral, menggunakan data dari semua titik pengukuran menghasilkan sejumlah besar fitur.Hal ini menyebabkan overfitting, sehingga pengurangan dimensi dengan downsampling efektif untuk meningkatkan kinerja generalisasi.

Apa yang harus digunakan: SciPy (scipy.signal)

Perangkat lunak sumber terbuka untuk matematika, sains, dan teknikekosistem ware (bermacam-macam perpustakaan komputasi ilmiah tingkat lanjut).

NumPy dapat melakukan operasi numerik yang lebih maju daripada konstanta fisik, matriks jarang, distribusi probabilitas, integrasi numerik, pemrosesan sinyal, pengoptimalan, statistik, dll.

scipy.signal adalah modul untuk pemrosesan bentuk gelombang di scipy.

  • scipy.signal.menghancurkan

import numpy as np from scipy import signal # buat 40 waveform data base x = np.linspace(0, 10, 40, endpoint=False) y = np.cos(-x**2/6) # Downsample data to 20 points x_down = np.linspace(0, 10, 20, endpoint=False) y_down = signal.decimate(y, 2) # Downsample dengan faktor 2 # Hasil plot pada grafik %matplotlib inline plt.plot(x, y, ' .-', label='data') plt.plot(x_down, y_down, 'rs-', label='down-sampled', alpha=1) plt.legend () plt.show()
Downsampling dengan scipy.signal.decimate
Downsampling dengan scipy.signal.decimate

scipy.signal.decimate melakukan anti-aliasing dan downsampling (anti-aliasing adalah proses yang menghilangkan distorsi yang terjadi saat mengambil sampel data kontinu secara berkala).Itu disampel ulang dalam bentuk yang dekat dengan bentuk dengan titik data tereduksi sebagaimana adanya.

Lihat juga:https://docs.scipy.org/doc/scipy-1.2.1/reference/generated/scipy.signal.decimate.html

  • scipy.signal.sampel ulang

# Buat data bentuk gelombang basis 40 titik x = np.linspace(0, 10, 40, endpoint=False) y = np.cos(-x**2/6) # Berdasarkan data, kalikan dengan 2.5 Upsampling menjadi 100 titik x_up = np.linspace(0, 10, 100, endpoint=False) y_up = signal.resample(y, 100) # Downsampling ke setengah data x_down = np.linspace( 20, 0, 10, endpoint=False) y_down = signal.resample(y, 20) # Plot hasilnya pada grafik 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. plot(x_down, y_down, 'rs-', label='down-sampled', alpha=0.3) plt.legend() plt.show()
Data bentuk gelombang diproses dengan scipy.signal.resample
Data bentuk gelombang diproses dengan scipy.signal.resample

scipy.signal.resample didasarkan pada asumsi bahwa sinyal periodik karena resampling menggunakan transformasi Fourier.Jika periodisitas tidak terpenuhi, seperti bagian terminal pada data di atas, nilainya akan sangat menyimpang.

Omong-omong, scipy.signal.resample juga bisa up-sampling.
Garis biru adalah titik data asli, hijau adalah plot setelah upsampling, dan merah setelah downsampling.

 

Kompetisi analisis ucapan KaggleAda juga contoh penggunaan untuk referensi.

Lihat juga:https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.signal.resample.html

Aplikasi untuk DataFrame

Dilakukan pada bingkai data dengan baris untuk setiap titik pengukuran dan kolom untuk setiap sampel.

impor panda sebagai pd # buat data untuk disimpan dalam bingkai data y1 = np.cos(-x**2/6)*1/2 y2 = np.cos(x)*1/3 df1 = pd.DataFrame({ ' y':y, 'y1':y1, 'y2':y2}) # Downsampling df1_down = signal.decimate(df1, 2, axis=0) df1_down = pd.DataFrame(df1_down, kolom=['y_down' ,' y1_down','y2_down'], index=np.linspace(0, 10, 20, endpoint=False)) # Menampilkan & memplot downsampled data print(df1.head(10)) print(df1_down.head (10)) df1 .plot(jenis='garis', marker='.') df1_turun.plot(jenis='garis', marker='.')
df1.head(10) df1_down.head(10)
 df1.head(10) df1_down.head(10)
Poin data sebelum dan sesudah downsampling
Sebelum downsampling Setelah downsampling

Bahkan setelah downsampling dari semula 40 poin menjadi 1 poin, yaitu 2/20, bentuk gelombang dipertahankan dengan akurasi yang baik, dan tampaknya ada sedikit kehilangan informasi meskipun digunakan sebagai nilai fitur.

Contoh bingkai data dengan baris untuk setiap sampel dan kolom untuk setiap titik pengukuran
Ketika baris adalah sampel dan kolom adalah titik pengukuran

Dalam kasus bingkai data (disebut data teratur) di mana baris adalah setiap sampel dan kolom adalah setiap titik pengukuran, argumennyaaxis=1Jika demikian, oke.