การลดขนาดโดยการสุ่มตัวอย่างอนุกรมเวลา/ข้อมูลสเปกตรัม [Python: SciPy]

2019 3 年月日 26

นี่เป็นวิธีการเมื่อคุณต้องการลดข้อมูลอนุกรมเวลา/สเปกตรัมใน DataFrame ใน Python

ด้วย "pandas.DataFrame.resample" คุณต้องตั้งเวลาเช่น D (รายวัน) หรือ W (รายสัปดาห์) เป็นอาร์กิวเมนต์สามารถใช้วิธีการต่อไปนี้เมื่อคุณต้องการลดข้อมูลอนุกรมเวลาหรือข้อมูลสเปกตรัมที่ไม่มีคอลัมน์วันที่/เวลา

อนุกรมเวลา/ข้อมูลสเปกตรัมคืออะไร?

ข้อมูลอนุกรมเวลา/สเปกตรัมถูกสังเกตตามช่วงเวลาปกติตามแกนที่กำหนดใช้ชุดข้อมูลตัวอย่าง ได้แก่ การเปลี่ยนแปลงของราคาหุ้นและสเปกตรัมการดูดกลืนแสง

ตัวอย่างข้อมูลอนุกรมเวลา ตัวอย่างข้อมูลสเปกตรัม
・การเปลี่ยนแปลงของอุณหภูมิและปริมาณน้ำฝน
・การเปลี่ยนแปลงของสภาพการจราจร
・ยอดขายรายวัน
・การเปลี่ยนแปลงของราคาหุ้น
・แนวโน้มราคา Bitcoin
・ข้อมูลเสียง
・สเปกตรัมการดูดซับของสารประกอบ (IR, UV)
・สเปกตรัมจากเทห์ฟากฟ้า

แม้ว่าแต่ละประเภทจะแตกต่างกัน แต่ก็มีลักษณะที่คล้ายคลึงกันดังต่อไปนี้เป็นข้อมูล

  1. จุดที่ติดกับจุดวัดมีค่าใกล้เคียง
  2. ระยะยาว (ช่วงกว้าง) มีสัญญาณรบกวน

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

การสุ่มตัวอย่างซ้ำของข้อมูลอนุกรมเวลา/สเปกตรัม

เมื่อสร้างแบบจำลองการคาดการณ์ตามข้อมูลอนุกรมเวลา/สเปกตรัม การใช้ข้อมูลจากจุดวัดทั้งหมดจะส่งผลให้มีคุณลักษณะมากมายมหาศาลสิ่งนี้นำไปสู่การ overfitting ดังนั้นการลดมิติด้วยการลดตัวอย่างจึงมีประสิทธิผลในการปรับปรุงประสิทธิภาพการทำงานทั่วไป

สิ่งที่จะใช้: SciPy (scipy.signal)

ซอฟต์แวร์โอเพ่นซอร์สสำหรับคณิตศาสตร์ วิทยาศาสตร์ และวิศวกรรมศาสตร์ระบบนิเวศของเครื่อง (กลุ่มของห้องสมุดคอมพิวเตอร์ทางวิทยาศาสตร์ขั้นสูง)

NumPy สามารถดำเนินการเชิงตัวเลขขั้นสูงได้มากกว่าค่าคงที่ทางกายภาพ เมทริกซ์แบบกระจาย การแจกแจงความน่าจะเป็น การรวมตัวเลข การประมวลผลสัญญาณ การเพิ่มประสิทธิภาพ สถิติ ฯลฯ

scipy.signal เป็นโมดูลสำหรับการประมวลผลรูปคลื่นใน scipy

  • scipy.signal.decimate

นำเข้า numpy เป็น np จากสัญญาณนำเข้า scipy # สร้างฐานข้อมูลรูปคลื่น 40 รายการ x = np.linspace(0, 10, 40, endpoint=False) y = np.cos(-x**2/6) # ข้อมูลตัวอย่างลดลงเหลือ 20 จุด x_down = np.linspace(0, 10, 20, endpoint=False) y_down = Signal.decimate(y, 2) # Downsample ด้วยปัจจัย 2 # พล็อตผลลัพธ์บนกราฟ %matplotlib inline plt.plot(x, y, ' .-', label='data') plt.plot(x_down, y_down, 'rs-', label='down-sampled', alpha=1) plt.legend () plt.show()
การสุ่มตัวอย่างด้วย scipy.signal.decimate
การสุ่มตัวอย่างด้วย scipy.signal.decimate

scipy.signal.decimate ทำการ anti-aliasing และ downsampling (การ anti-aliasing เป็นกระบวนการที่ขจัดความผิดเพี้ยนที่เกิดขึ้นเมื่อสุ่มตัวอย่างข้อมูลอย่างต่อเนื่องในช่วงเวลาปกติ)มีการสุ่มตัวอย่างใหม่ในรูปแบบที่ใกล้เคียงกับรูปแบบที่มีจุดข้อมูลลดลงตามที่เป็นอยู่

ดูเพิ่มเติม:https://docs.scipy.org/doc/scipy-1.2.1/reference/generated/scipy.signal.decimate.html

  • scipy.signal.resample

# สร้างฐาน 40 จุด ข้อมูลรูปคลื่น x = np.linspace(0, 10, 40, endpoint=False) y = np.cos(-x**2/6) # จากข้อมูล คูณด้วย 2.5 การสุ่มตัวอย่างเพิ่มขึ้นเป็น 100 จุด x_up = np.linspace(0, 10, 100, endpoint=False) y_up = Signal.resample(y, 100) # ลดสุ่มตัวอย่างลงครึ่งหนึ่งของข้อมูล x_down = np.linspace( 20, 0, 10, endpoint=False) y_down = signal.resample(y, 20) # พล็อตผลลัพธ์บนกราฟ นำเข้า matplotlib.pyplot เป็น 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. พล็อต (x_down, y_down, 'rs-', label='down-sampled', alpha=0.3) plt.legend() plt.show()
ข้อมูลรูปคลื่นที่ประมวลผลด้วย scipy.signal.resample
ข้อมูลรูปคลื่นที่ประมวลผลด้วย scipy.signal.resample

scipy.signal.resample ตั้งอยู่บนสมมติฐานที่ว่าสัญญาณเป็นระยะเนื่องจากการสุ่มใหม่โดยใช้การแปลงฟูริเยร์หากระยะเวลาไม่เป็นที่พอใจ เช่น ส่วนปลายในข้อมูลข้างต้น ค่าจะเบี่ยงเบนอย่างมาก

นอกจากนี้ scipy.signal.resample ยังสุ่มตัวอย่างได้อีกด้วย
เส้นสีน้ำเงินคือจุดข้อมูลดั้งเดิม สีเขียวคือพล็อตหลังจากการสุ่มตัวอย่าง และสีแดงคือหลังจากการสุ่มตัวอย่าง

 

การแข่งขันวิเคราะห์คำพูด kaggleนอกจากนี้ยังมีตัวอย่างการใช้งานสำหรับการอ้างอิง

ดูเพิ่มเติม:https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.signal.resample.html

การประยุกต์ใช้กับ DataFrame

ดำเนินการในกรอบข้อมูลที่มีแถวสำหรับแต่ละจุดการวัดและคอลัมน์สำหรับแต่ละตัวอย่าง

นำเข้าแพนด้าเป็น pd # สร้างข้อมูลเพื่อจัดเก็บใน dataframe y1 = np.cos(-x**2/6)*1/2 y2 = np.cos(x)*1/3 df1 = pd.DataFrame({ ' y':y, 'y1':y1, 'y2':y2}) # การสุ่มตัวอย่างดาวน์ df1_down = signal.decimate(df1, 2, axis=0) df1_down = pd.DataFrame(df1_down, columns=['y_down' ,' y1_down','y2_down'], index=np.linspace(0, 10, 20, endpoint=False)) # แสดง & พล็อต downsampled data print(df1.head(10)) print(df1_down.head (10)) df1 .plot(ชนิด='เส้น', เครื่องหมาย='.') df1_down.plot(ชนิด='เส้น', เครื่องหมาย='.')
df1.head(10) df1_down.head(10)
 df1.head(10) df1_down.head(10)
จุดข้อมูลก่อนและหลังการสุ่มตัวอย่าง
ก่อนสุ่มตัวอย่าง หลังสุ่มตัวอย่าง

แม้ว่าจะสุ่มตัวอย่างจากจุดเดิม 40 จุดเป็น 1 จุด ซึ่งเป็น 2/20 รูปคลื่นก็ยังคงมีความแม่นยำดี และดูเหมือนว่าจะมีการสูญเสียข้อมูลเพียงเล็กน้อยแม้ว่าจะใช้เป็นค่าคุณลักษณะก็ตาม

ตัวอย่างของ data frame ที่มีแถวสำหรับแต่ละตัวอย่างและคอลัมน์สำหรับแต่ละจุดการวัด
เมื่อแถวเป็นตัวอย่างและคอลัมน์เป็นจุดวัด

ในกรณีของ data frame (ที่เรียกว่า orderly data) ซึ่งแต่ละแถวคือตัวอย่างและคอลัมน์คือแต่ละจุดการวัด อาร์กิวเมนต์axis=1ถ้าเป็นเช่นนั้นตกลง